# Copyright 2014 The Chromium 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("//testing/test.gni")
import("//v8/gni/v8.gni")

# This is depended upon from the browser DLL on Windows, where V8 is not used,
# but features are enabled. This cannot depend on V8.
component("gin_features") {
  sources = [
    "gin_features.cc",
    "gin_features_export.h",
    "public/gin_features.h",
  ]

  defines = [ "GIN_FEATURES_IMPLEMENTATION" ]

  deps = [
    "//base",
  ]

  assert_no_deps = [ "//v8" ]
}

component("gin") {
  sources = [
    "arguments.cc",
    "arguments.h",
    "array_buffer.cc",
    "array_buffer.h",
    "context_holder.cc",
    "converter.cc",
    "converter.h",
    "data_object_builder.cc",
    "data_object_builder.h",
    "debug_impl.cc",
    "debug_impl.h",
    "dictionary.cc",
    "dictionary.h",
    "function_template.cc",
    "function_template.h",
    "gin_export.h",
    "handle.h",
    "interceptor.cc",
    "interceptor.h",
    "isolate_holder.cc",
    "modules/console.cc",
    "modules/console.h",
    "modules/file_module_provider.cc",
    "modules/file_module_provider.h",
    "modules/module_registry.cc",
    "modules/module_registry.h",
    "modules/module_registry_observer.h",
    "modules/module_runner_delegate.cc",
    "modules/module_runner_delegate.h",
    "modules/timer.cc",
    "modules/timer.h",
    "object_template_builder.cc",
    "object_template_builder.h",
    "per_context_data.cc",
    "per_context_data.h",
    "per_isolate_data.cc",
    "per_isolate_data.h",
    "public/context_holder.h",
    "public/debug.h",
    "public/gin_embedders.h",
    "public/isolate_holder.h",
    "public/v8_idle_task_runner.h",
    "public/v8_platform.h",
    "public/wrapper_info.h",
    "run_microtasks_observer.cc",
    "run_microtasks_observer.h",
    "runner.cc",
    "runner.h",
    "shell_runner.cc",
    "shell_runner.h",
    "try_catch.cc",
    "try_catch.h",
    "v8_initializer.cc",
    "v8_initializer.h",
    "v8_isolate_memory_dump_provider.cc",
    "v8_isolate_memory_dump_provider.h",
    "v8_platform.cc",
    "wrappable.cc",
    "wrappable.h",
    "wrapper_info.cc",
  ]

  if (v8_use_external_startup_data) {
    data = [
      "$root_out_dir/natives_blob.bin",
      "$root_out_dir/snapshot_blob.bin",
    ]
  }

  defines = [ "GIN_IMPLEMENTATION" ]

  public_deps = [
    "//base",
    "//v8",
  ]
  deps = [
    ":gin_features",
    "//base/third_party/dynamic_annotations",
    "//crypto",
  ]

  if (is_mac) {
    libs = [ "CoreFoundation.framework" ]
  }

  configs += [ "//v8:external_startup_data" ]
}

executable("gin_shell") {
  sources = [
    "shell/gin_main.cc",
  ]

  deps = [
    ":gin",
    "//base",
    "//base:i18n",
    "//build/config/sanitizers:deps",
    "//build/win:default_exe_manifest",
    "//v8",
  ]

  configs += [ "//v8:external_startup_data" ]
}

source_set("gin_test") {
  testonly = true
  sources = [
    "test/file.cc",
    "test/file.h",
    "test/file_runner.cc",
    "test/file_runner.h",
    "test/gc.cc",
    "test/gc.h",
    "test/gtest.cc",
    "test/gtest.h",
    "test/v8_test.cc",
    "test/v8_test.h",
  ]
  data = [
    "test/expect.js",
  ]

  public_deps = [
    ":gin",
    "//testing/gtest",
  ]
  deps = [
    "//base/test:test_support",
    "//v8",
  ]

  configs += [ "//v8:external_startup_data" ]
}

test("gin_unittests") {
  sources = [
    "arguments_unittest.cc",
    "converter_unittest.cc",
    "data_object_builder_unittest.cc",
    "interceptor_unittest.cc",
    "modules/module_registry_unittest.cc",
    "modules/timer_unittest.cc",
    "per_context_data_unittest.cc",
    "shell/gin_shell_unittest.cc",
    "shell_runner_unittest.cc",
    "test/run_all_unittests.cc",
    "test/run_js_tests.cc",
    "v8_isolate_memory_dump_provider_unittest.cc",
    "v8_platform_unittest.cc",
    "wrappable_unittest.cc",
  ]

  deps = [
    ":gin_shell",
    ":gin_test",
    "//base/test:test_support",
    "//v8",
  ]

  configs += [ "//v8:external_startup_data" ]

  data = [
    "modules/module_registry_unittests.js",
    "shell/hello_world.js",
    "test/file_unittests.js",
    "test/gtest_unittests.js",
    "../OWNERS",
  ]

  data_deps = [
    ":gin_shell",
  ]
}
