# Copyright 2019 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")
import("//build/test/test_package.gni")
import("//build/testing/environments.gni")
import("//src/graphics/lib/magma/gnbuild/magma.gni")
import("//src/lib/vulkan/layers.gni")
import("//src/ui/lib/escher/build_args.gni")
import("//src/ui/lib/escher/shaders/shaders.gni")

# Runtime is the set of package dependencies typically desired for the
# construction of a product that includes scenic, and is included in
# many such products.
group("runtime") {
  deps = [
    ":scenic",
    "//garnet/bin/sysmem_connector",
    "//src/graphics/bin/vulkan_loader",
    "//src/sys/activity",
    "//src/ui/bin/ime:ime_service",
    "//src/ui/bin/root_presenter",
    "//src/ui/bin/root_presenter:configs",
  ]
}

group("scenic") {
  public_deps = [ ":scenic_pkg" ]
}

group("tests") {
  testonly = true

  public_deps = [
    ":fuzzers",
    ":scenic_tests",
    "lib/gfx/tests",
    "lib/gfx/tests:mock_pose_buffer_provider",
    "lib/gfx/tests/rotated_square_test",
    "lib/scenic/util/tests:tests",
    "lib/utils:tests",

    # These are included in //src/ui/bin:tests, but I don't see that included anywhere.
    # If these tests fail, then other Scenic tests are likely to fail, so we want to guarantee that
    # they are always run whenever Scenic tests are.
    "//src/ui/bin/hardware_display_controller_provider:tests",
  ]
}

group("fuzzers") {
  testonly = true
  public_deps = [
    "lib/input/tests/fuzzers",
    "lib/scheduling/tests/fuzzers",
  ]
}

test_package("scenic_tests") {
  deps = [
    "lib/display/tests",
    "lib/flatland/buffers/tests",
    "lib/flatland/engine/tests",
    "lib/flatland/engine/tests/pixeltests",
    "lib/flatland/renderer/tests",
    "lib/flatland/tests",
    "lib/gfx/tests",
    "lib/gfx/util/tests",
    "lib/input/tests",
    "lib/scenic/tests",
    "lib/scheduling/tests",
  ]

  tests = [
    {
      name = "display_unittests"
    },
    {
      name = "flatland_unittests"
    },
    {
      log_settings = {
        max_severity = "ERROR"
      }
      name = "flatland_buffers_unittests"
    },
    {
      log_settings = {
        max_severity = "ERROR"
      }

      # Ensures that only devices that have access
      # to display controller image capture features
      # can run this test suite.
      name = "flatland_engine_pixeltests"
      environments = [
        astro_env,
        sherlock_env,
      ]
    },
    {
      log_settings = {
        max_severity = "ERROR"
      }
      name = "flatland_engine_unittests"
    },
    {
      name = "flatland_renderer_unittests"
      environments = basic_envs + magma_libvulkan_hardware_envs
    },
    {
      name = "gfx_apptests"
    },
    {
      name = "gfx_pixeltests"
      environments = [ aemu_env ] + magma_libvulkan_hardware_envs
    },
    {
      name = "gfx_swapchain_tests"
      environments = [ aemu_env ] + magma_libvulkan_hardware_envs
    },
    {
      name = "gfx_unittests"
      environments = basic_envs + magma_libvulkan_hardware_envs
    },
    {
      name = "gfx_util_unittests"
    },
    {
      name = "gfx_viewstate_apptests"
      environments = [ aemu_env ] + magma_libvulkan_hardware_envs
    },
    {
      name = "input_unittests"
    },
    {
      name = "scenic_unittests"
    },
    {
      name = "scheduling_unittests"
    },
  ]

  public_deps = vulkan_validation_layers.public_deps
  loadable_modules = vulkan_validation_layers.loadable_modules
  resources = vulkan_validation_layers.resources

  if (escher_use_runtime_glsl) {
    resources += escher_shaders_resources
  } else {
    resources += escher_shaders_spirv_resources
  }
}

declare_args() {
  # Include the vulkan validation layers in scenic.
  scenic_enable_vulkan_validation = is_debug
}

# For migration purposes only.  To be moved to src/ui/scenic/bin:scenic
package("scenic_pkg") {
  package_name = "scenic"

  deps = [ "bin" ]

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

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

  resources = []

  if (escher_use_runtime_glsl) {
    resources += escher_shaders_resources
  } else {
    resources += escher_shaders_spirv_resources
  }

  # If configured, include the vulkan validation layers.
  if (scenic_enable_vulkan_validation) {
    loadable_modules = vulkan_validation_layers.loadable_modules
    public_deps = vulkan_validation_layers.public_deps
    resources += vulkan_validation_layers.resources
  }
}
