# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/test/test_package.gni")

static_library("shell_interpreter") {
  public = [
    "src/expressions.h",
    "src/instructions.h",
    "src/interpreter.h",
    "src/nodes.h",
    "src/schema.h",
    "src/types.h",
  ]

  sources = [
    "src/expressions.cc",
    "src/instructions.cc",
    "src/interpreter.cc",
    "src/nodes.cc",
    "src/schema.cc",
    "src/scope.cc",
    "src/thread.cc",
    "src/types.cc",
    "src/value.cc",
  ]

  deps = [ "//sdk/lib/syslog/cpp" ]
}

static_library("shell_server_lib") {
  public = [ "src/server.h" ]
  sources = [ "src/server.cc" ]
  public_deps = [
    ":shell_interpreter",
    "//sdk/lib/fdio",
    "//sdk/lib/svc",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/syslog/cpp",
    "//src/developer/shell/common",
    "//src/developer/shell/fidl/fuchsia.shell:shell_llcpp",
    "//zircon/system/ulib/async-default",
    "//zircon/system/ulib/async-loop",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fidl-async:fidl-async-cpp",
  ]
}

executable("bin") {
  output_name = "shell_server"

  sources = [ "src/server_main.cc" ]

  deps = [
    ":shell_interpreter",
    ":shell_server_lib",
    "//sdk/lib/syslog/cpp",
  ]
}

package("shell_server") {
  deps = [ ":bin" ]
  binaries = [
    {
      name = "shell_server"
      dest = "shell_server"
    },
  ]

  meta = [
    {
      path = rebase_path("../meta/shell_server.cmx")
      dest = "shell_server.cmx"
    },
  ]
}

executable("shell_interpreter_test_bin") {
  testonly = true
  sources = [ "test/interpreter_unit_tests.cc" ]

  deps = [
    ":shell_interpreter",
    "//sdk/lib/syslog/cpp",
    "//src/lib/fxl/test:gtest_main",
    "//third_party/googletest:gmock",
    "//third_party/googletest:gtest",
  ]
}

executable("shell_server_test_bin") {
  testonly = true
  sources = [
    "test/addition.cc",
    "test/assignment.cc",
    "test/emit_result.cc",
    "test/interpreter.cc",
    "test/interpreter_test.cc",
    "test/load.cc",
  ]

  deps = [
    ":shell_server",
    "//sdk/lib/fdio",
    "//sdk/lib/sys/cpp",
    "//src/developer/shell/common",
    "//src/lib/fxl/test:gtest_main",
    "//third_party/googletest:gmock",
    "//third_party/googletest:gtest",
    "//zircon/system/ulib/async-default",
    "//zircon/system/ulib/async-loop",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fidl-async:fidl-async-cpp",
  ]
}

test_package("shell-interpreter-tests") {
  deps = [
    ":shell_interpreter_test_bin",
    ":shell_server_test_bin",
  ]
  tests = [
    {
      name = "shell_interpreter_test_bin"
      environments = basic_envs
    },
    {
      name = "shell_server_test_bin"
      environments = basic_envs
    },
  ]
}

group("tests") {
  testonly = true

  deps = [ ":shell-interpreter-tests" ]
}
