# Copyright 2016 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("//third_party/vulkan_loader_and_validation_layers/layers/layers.gni")

group("ui") {
  testonly = true
  deps = [
    ":ime_service",
    ":ime_service_tests",
    ":root_presenter",
    ":scenic",
    ":scenic_tests",
    ":set_renderer_params",
    "benchmarks",
    "gltf_export",
    "ime",
    "input",
    "input_reader",
    "present_view",
    "presentation_mode",
    "print_input",
    "root_presenter",
    "scenic",
    "screencap",
    "set_renderer_params_HACK",
    "sketchy",
    "snapshot",
    "tests",
    "text",
  ]
}

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

test_package("scenic_tests") {
  deps = [
    "input/tests",
    "input_reader/tests",
    "presentation_mode/tests",
    "root_presenter/tests",
    "//garnet/lib/ui/gfx/tests",
    "//garnet/lib/ui/gfx/util/tests",
    "//garnet/lib/ui/input/tests",
    "//garnet/lib/ui/scenic/tests",
    "//garnet/public/lib/ui/geometry/cpp:tests",
  ]

  tests = [
    {
      name = "gfx_apptests"
      environments = basic_envs
    },
    {
      name = "gfx_pixeltests"
      environments = [ nuc_env ]
    },
    {
      name = "gfx_viewstate_apptests"
      environments = [ nuc_env ]
    },
    {
      name = "gfx_unittests"
      environments = basic_envs
    },
    {
      name = "gfx_util_unittests"
      environments = basic_envs
    },
    {
      name = "geometry_util_unittests"
      environments = basic_envs
    },
    {
      name = "input_apptests"
      environments = basic_envs
    },
    {
      name = "input_reader_unittests"
      environments = basic_envs
    },
    {
      name = "input_unittests"
      environments = basic_envs
    },
    {
      name = "input_tool_unittests"
      environments = basic_envs
    },
    {
      name = "presentation_mode_unittests"
      environments = basic_envs
    },
    {
      name = "root_presenter_unittests"
      environments = basic_envs
    },
    {
      name = "scenic_unittests"
      environments = basic_envs
    },
  ]

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

package("root_presenter") {
  deps = [
    "root_presenter",
  ]

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

  resources = [
    {
      path = rebase_path("root_presenter/resources/cursor32.png")
      dest = "cursor32.png"
    },
  ]

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

package("ime_service") {
  deps = [
    "ime",
  ]

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

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

test_package("ime_service_tests") {
  deps = [
    "ime",
    "//garnet/bin/ui/text/test_suite:test_suite",
  ]

  tests = [
    {
      name = "ime_service_bin_test"
      dest = "ime_service_unittests"
      environments = basic_envs
    },
  ]
}

package("scenic") {
  deps = [
    "scenic",
  ]

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

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

  resources = [
    {
      path = "//src/ui/lib/escher/shaders/model_renderer/default_position.vert"
      dest = "shaders/model_renderer/default_position.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/model_renderer/main.frag"
      dest = "shaders/model_renderer/main.frag"
    },
    {
      path = "//src/ui/lib/escher/shaders/model_renderer/main.vert"
      dest = "shaders/model_renderer/main.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/model_renderer/shadow_map_generation.frag"
      dest = "shaders/model_renderer/shadow_map_generation.frag"
    },
    {
      path =
          "//src/ui/lib/escher/shaders/model_renderer/shadow_map_lighting.frag"
      dest = "shaders/model_renderer/shadow_map_lighting.frag"
    },
    {
      path = "//src/ui/lib/escher/shaders/model_renderer/wobble_position.vert"
      dest = "shaders/model_renderer/wobble_position.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/common/use.glsl"
      dest = "shaders/paper/common/use.glsl"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/frag/main_ambient_light.frag"
      dest = "shaders/paper/frag/main_ambient_light.frag"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/frag/main_point_light.frag"
      dest = "shaders/paper/frag/main_point_light.frag"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/vert/compute_model_space_position.vert"
      dest = "shaders/paper/vert/compute_model_space_position.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/vert/compute_world_space_position.vert"
      dest = "shaders/paper/vert/compute_world_space_position.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/vert/main_shadow_volume_extrude.vert"
      dest = "shaders/paper/vert/main_shadow_volume_extrude.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/vert/vertex_attributes.vert"
      dest = "shaders/paper/vert/vertex_attributes.vert"
    },
  ]

  # 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
  }
}

# Component shell tools can be run as shell command or as components via a
# component URI. The following list contains the names of such components that
# follow the pattern:
# name/meta/name.cmx contains the component manifest
# name is the name of a subdirectory that builds the output binary `name`
component_shell_tools = [
  "gltf_export",
  "present_view",
  "screencap",
  "snapshot",
]
foreach(tool, component_shell_tools) {
  package(tool) {
    meta = [
      {
        path = rebase_path("$tool/meta/$tool.cmx")
        dest = "$tool.cmx"
      },
    ]

    deps = [
      tool,
    ]

    binaries = [
      {
        name = tool
        shell = true
      },
    ]
  }
}

package("set_renderer_params") {
  deps = [
    "set_renderer_params_HACK:set_renderer_params",
  ]

  binaries = [
    {
      name = "set_renderer_params"
      shell = true
    },
  ]

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

# Non-component tools contains the names of shell command tools that do not
# have any CMX.
non_component_tools = [
  "input",
  "print_input",
]

foreach(tool, non_component_tools) {
  package(tool) {
    deps = [
      tool,
    ]
    binaries = [
      {
        name = tool
        shell = true
      },
    ]
  }
}
