# Copyright 2013 The Flutter 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/fuchsia/sdk.gni")
import("//flutter/common/config.gni")
import("//flutter/shell/gpu/gpu.gni")
import("//flutter/testing/testing.gni")

# Template to generate a dart embedder resource.cc file.
# Required invoker inputs:
#   String output (name of output file)
#   List inputs (list of input files to be included)
#   String table_name (name of symbol for resource table)
#   String root_prefix (base directory of resources)
# Optional invoker inputs:
#   String input_directory (directory of resources that are recursively added)
#   List deps
#   List datadeps
template("dart_embedder_resources") {
  action(target_name) {
    script = "//third_party/dart/runtime/tools/create_resources.py"
    deps = []
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    datadeps = []
    if (defined(invoker.datadeps)) {
      datadeps = invoker.datadeps
    }

    output = invoker.output
    outputs = [
      output,
    ]

    inputs = [ script ] + invoker.inputs

    root_prefix = rebase_path(invoker.root_prefix)

    args = [
      "--output",
      rebase_path(output),
      "--outer_namespace",
      "flutter",
      "--inner_namespace",
      "runtime",
      "--table_name",
      invoker.table_name,
      "--root_prefix",
      root_prefix,
    ]
    if (defined(invoker.input_directory)) {
      args += [
        "--client_root",
        rebase_path(invoker.input_directory),
      ]
    }
    args += rebase_path(invoker.inputs)
  }
}

source_set_maybe_fuchsia_legacy("common") {
  sources = [
    "animator.cc",
    "animator.h",
    "canvas_spy.cc",
    "canvas_spy.h",
    "engine.cc",
    "engine.h",
    "isolate_configuration.cc",
    "isolate_configuration.h",
    "persistent_cache.cc",
    "persistent_cache.h",
    "pipeline.cc",
    "pipeline.h",
    "platform_view.cc",
    "platform_view.h",
    "pointer_data_dispatcher.cc",
    "pointer_data_dispatcher.h",
    "rasterizer.cc",
    "rasterizer.h",
    "run_configuration.cc",
    "run_configuration.h",
    "shell.cc",
    "shell.h",
    "shell_io_manager.cc",
    "shell_io_manager.h",
    "skia_event_tracer_impl.cc",
    "skia_event_tracer_impl.h",
    "switches.cc",
    "switches.h",
    "thread_host.cc",
    "thread_host.h",
    "vsync_waiter.cc",
    "vsync_waiter.h",
    "vsync_waiter_fallback.cc",
    "vsync_waiter_fallback.h",
  ]

  public_configs = [ "//flutter:config" ]

  public_deps = [
    "//flutter/shell/version",
    "//flutter/third_party/tonic",
    "//flutter/third_party/txt",
    "//third_party/rapidjson",
  ]

  deps = [
    "//flutter/assets",
    "//flutter/common",
    "//flutter/fml",
    "//flutter/shell/profiling",
    "//third_party/dart/runtime:dart_api",
    "//third_party/skia",
  ]

  deps_legacy_and_next = [
    "//flutter/flow:flow",
    "//flutter/lib/ui:ui",
    "//flutter/runtime:runtime",
  ]
}

template("shell_host_executable") {
  common_dep = ":common"
  if (defined(invoker.fuchsia_legacy)) {
    if (invoker.fuchsia_legacy) {
      common_dep += "_fuchsia_legacy"
    }
  }

  executable(target_name) {
    testonly = true

    deps = []

    ldflags = []

    forward_variables_from(invoker, "*")

    deps += [
      "//flutter/lib/snapshot",
      "//flutter/runtime:libdart",
      common_dep,
    ]

    public_configs = [ "//flutter:export_dynamic_symbols" ]
  }
}

if (enable_unittests) {
  declare_args() {
    test_enable_vulkan = is_fuchsia
    test_enable_gl = !is_fuchsia
    test_enable_software = true
    test_enable_metal = false
  }

  shell_gpu_configuration("shell_unittests_gpu_configuration") {
    enable_software = test_enable_software
    enable_vulkan = test_enable_vulkan
    enable_gl = test_enable_gl
    enable_metal = test_enable_metal
  }

  test_fixtures("shell_unittests_fixtures") {
    dart_main = "fixtures/shell_test.dart"

    fixtures = [ "fixtures/shelltest_screenshot.png" ]
  }

  shell_host_executable("shell_benchmarks") {
    sources = [
      "shell_benchmarks.cc",
    ]

    deps = [
      ":shell_unittests_fixtures",
      "//flutter/benchmarking",
      "//flutter/testing:dart",
      "//flutter/testing:testing_lib",
    ]
  }

  source_set_maybe_fuchsia_legacy("shell_test_fixture_sources") {
    testonly = true

    sources = [
      "shell_test.cc",
      "shell_test.h",
      "shell_test_external_view_embedder.cc",
      "shell_test_external_view_embedder.h",
      "shell_test_platform_view.cc",
      "shell_test_platform_view.h",
      "vsync_waiters_test.cc",
      "vsync_waiters_test.h",
    ]

    public_deps = [
      "//flutter/fml/dart",
      "//flutter/testing",
    ]

    deps = [
      "//flutter/assets",
      "//flutter/common",
      "//third_party/rapidjson",
      "//third_party/skia",
    ]

    defines = []

    # SwiftShader only supports x86/x64_64
    if (target_cpu == "x86" || target_cpu == "x64") {
      if (test_enable_gl) {
        sources += [
          "shell_test_platform_view_gl.cc",
          "shell_test_platform_view_gl.h",
        ]

        public_deps += [ "//flutter/testing:opengl" ]

        defines += [ "SHELL_ENABLE_GL" ]
      }
    }

    if (test_enable_vulkan) {
      sources += [
        "shell_test_platform_view_vulkan.cc",
        "shell_test_platform_view_vulkan.h",
      ]

      public_deps += [
        "//flutter/testing:vulkan",
        "//flutter/vulkan",
      ]

      defines += [ "SHELL_ENABLE_VULKAN" ]
    }

    public_deps_legacy_and_next = [
      "//flutter/shell/common:common",
      "//flutter/flow:flow",
      "//flutter/runtime:runtime",
    ]

    deps_legacy_and_next = [
      ":shell_unittests_gpu_configuration",
      "//flutter/lib/ui:ui",
      "//flutter/testing:dart",
      "//flutter/testing:fixture_test",
    ]
  }

  source_set_maybe_fuchsia_legacy("shell_unittests_common") {
    testonly = true

    sources = [
      "animator_unittests.cc",
      "canvas_spy_unittests.cc",
      "input_events_unittests.cc",
      "persistent_cache_unittests.cc",
      "pipeline_unittests.cc",
      "shell_unittests.cc",
    ]

    deps = [
      "//flutter/assets",
      "//flutter/shell/version",
    ]

    public_deps_legacy_and_next = [ ":shell_test_fixture_sources" ]
  }

  if (is_fuchsia) {
    shell_host_executable("shell_unittests") {
      deps = [
        ":shell_unittests_common_fuchsia_legacy",
        ":shell_unittests_fixtures",
      ]

      fuchsia_legacy = true
    }

    shell_host_executable("shell_unittests_next") {
      deps = [
        ":shell_unittests_common",
        ":shell_unittests_fixtures",
      ]
    }
  } else {
    shell_host_executable("shell_unittests") {
      deps = [
        ":shell_unittests_common",
        ":shell_unittests_fixtures",
      ]
    }
  }
}
