# Copyright 2018 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/package.gni")

group("tests") {
  testonly = true
  public_deps = [
    ":apptests",
    ":unittests",
  ]
}

source_set("testing_deps") {
  testonly = true
  sources = [
    "error_reporting_test.cc",
    "error_reporting_test.h",
    "gfx_test.h",
    "mocks.cc",
    "mocks.h",
    "session_test.cc",
    "session_test.h",
    "vk_session_test.cc",
    "vk_session_test.h",
  ]
  public_deps = [
    ":util",
    "//garnet/lib/ui/gfx",
    "//garnet/lib/ui/scenic/tests:testing_deps",
    "//garnet/lib/ui/scenic/util",
    "//garnet/public/lib/escher",
    "//garnet/public/lib/escher/test:gtest_escher",
    "//garnet/public/lib/fostr/fidl/fuchsia.ui.scenic",
    "//garnet/public/lib/gtest",
    "//garnet/public/lib/ui/input/cpp",
    "//garnet/public/lib/ui/scenic/cpp",
  ]
}

source_set("util") {
  testonly = true
  sources = [
    "util.cc",
    "util.h",
  ]
  public_deps = [
    "//garnet/lib/ui/scenic/util",
    "//garnet/public/lib/fsl",
    "//garnet/public/lib/fxl",
    "//garnet/public/lib/gtest",
  ]
}

executable("unittests") {
  output_name = "gfx_unittests"

  testonly = true
  sources = [
    "escher_vulkan_smoke_test.cc",
    "event_timestamper_unittest.cc",
    "hardware_layer_assignment_unittest.cc",
    "hittest_global_unittest.cc",
    "hittest_unittest.cc",
    "image_pipe_unittest.cc",
    "import_unittest.cc",
    "memory_unittest.cc",
    "node_unittest.cc",
    "object_linker_unittest.cc",
    "pose_buffer_unit_test.cc",
    "resource_linker_unittest.cc",
    "run_all_unittests.cc",
    "session_unittest.cc",
    "shape_unittest.cc",
    "size_change_hint_unittest.cc",
    "snapshotter_unittest.cc",
    "stereo_camera_unittest.cc",
    "view_unittest.cc",
  ]
  deps = [
    ":testing_deps",
    "//garnet/lib/ui/gfx:object_linker",
  ]
  include_dirs = [
    "//garnet/public/lib/escher",
    "//third_party/glm",
  ]
}

executable("apptests") {
  output_name = "gfx_apptests"

  testonly = true
  sources = [
    "gfx_apptest.cc",
  ]
  deps = [
    ":testing_deps",
  ]
}

executable("mock_pose_buffer_provider_cc") {
  output_name = "mock_pose_buffer_provider"

  sources = [
    "mock_pose_buffer_provider.cc",
    "mock_pose_buffer_provider.h",
  ]

  deps = [
    "//garnet/public/fidl/fuchsia.ui.gfx",
    "//garnet/public/lib/component/cpp",
    "//garnet/public/lib/fidl/cpp",
    "//zircon/public/lib/async-default",
    "//zircon/public/lib/async-loop-cpp",
  ]
}

package("mock_pose_buffer_provider") {
  meta = [
    {
      path = "meta/mock_pose_buffer_provider.cmx"
      dest = "mock_pose_buffer_provider.cmx"
    },
  ]

  deps = [
    ":mock_pose_buffer_provider_cc",
  ]

  binary = "mock_pose_buffer_provider"
}
