# 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/config.gni")
import("//build/fidl/fidl.gni")
import("//build/package.gni")
import("//build/test.gni")
import("//build/test/test_package.gni")

group("tests") {
  testonly = true
  deps = [
    ":touch-input-test",
    ":touch-input-test-display_rotation",

    # The deps below are necessary on minimal product configs.
    "//src/graphics/bin/vulkan_loader",

    # TODO(fxbug.dev/24643): remove
    "//src/chromium:web_engine",
    "//src/ui/bin/ime:ime_service",
    "//src/ui/bin/root_presenter",
    "//src/ui/scenic",
    "//src/ui/tests/integration_input_tests/touch/cpp-gfx-client",
    "//src/ui/tests/integration_input_tests/touch/one-chromium",
    "//src/ui/tests/integration_input_tests/touch/one-flutter",
  ]
}

test_package("touch-input-test") {
  deps = [
    ":touch-input-test-bin",
    "//src/ui/bin/root_presenter",
    "//src/ui/bin/root_presenter:bin",
  ]

  tests = [
    {
      name = "touch-input-test"
      environments = [ nuc_env ]
    },
  ]

  # Add root presenter to the test package so they share the same /config/data which is necessary
  # for injecting the display rotation into root presenter
  meta = [
    {
      path = rebase_path("//src/ui/bin/root_presenter/meta/root_presenter.cmx")
      dest = "root_presenter.cmx"
    },
  ]

  binaries = [
    {
      name = "root_presenter"
    },
  ]

  data_deps = [
    "//src/ui/scenic",
    "//src/ui/tests/integration_input_tests/touch/one-chromium",
    "//src/ui/tests/integration_input_tests/touch/one-flutter",
  ]
}

config_data("touch-input-test-display_rotation") {
  for_pkg = "touch-input-test"

  sources = [ "data/display_rotation" ]
  outputs = [ "display_rotation" ]
}

test("touch-input-test-bin") {
  sources = [ "touch-input-test.cc" ]
  output_name = "touch-input-test"
  deps = [
    ":fuchsia.test.ui",
    "//garnet/public/lib/fostr/fidl/fuchsia.ui.gfx",
    "//garnet/public/lib/fostr/fidl/fuchsia.ui.input",
    "//garnet/public/lib/gtest",
    "//sdk/fidl/fuchsia.accessibility.semantics",
    "//sdk/fidl/fuchsia.fonts",
    "//sdk/fidl/fuchsia.hardware.display",
    "//sdk/fidl/fuchsia.memorypressure",
    "//sdk/fidl/fuchsia.netstack",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/fidl/fuchsia.ui.app",
    "//sdk/fidl/fuchsia.ui.input",
    "//sdk/fidl/fuchsia.ui.pointerinjector",
    "//sdk/fidl/fuchsia.ui.policy",
    "//sdk/fidl/fuchsia.ui.scenic",
    "//sdk/fidl/fuchsia.vulkan.loader",
    "//sdk/fidl/fuchsia.web",
    "//sdk/lib/fdio",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/sys/cpp/testing:integration",
    "//sdk/lib/ui/scenic/cpp",
    "//src/lib/fxl",
    "//src/lib/fxl/test:gtest_main",
    "//third_party/googletest:gtest",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/zx",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/trace",
    "//zircon/system/ulib/trace-provider:trace-provider-so",
  ]
}

fidl("fuchsia.test.ui") {
  sdk_category = "internal"
  sources = [ "response_listener.test.fidl" ]
  public_deps = [ "//zircon/vdso/zx" ]
}
