# Copyright 2015 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("//v8/gni/v8.gni")
import("//v8/snapshot_toolchain.gni")

# Variables:
#   test_type: One of 'webui', 'unit' or 'extension' indicating what
#       environment the test runs under.
#   sources: List of javascript test source files.
#   deps_js: Javascript file with closure library dependencies.  Only needed
#       if the test fixtures use closureModuleDeps.
#   gen_include_files: List of javascript files used in GEN_INCLUDE calls
#       in the tests and therefore considered input to the C++ generation step.
#   extra_js_files: List of javascript files needed by the test at runtime,
#       typically listed in the extraLibraries member of the test fixture.
#   defines
#   deps
#   visibility
template("js2gtest") {
  assert(
      defined(invoker.test_type) &&
      (invoker.test_type == "webui" || invoker.test_type == "unit" ||
       invoker.test_type == "extension" || invoker.test_type == "mojo_webui" ||
       invoker.test_type == "mojo_lite_webui"))
  action_name = target_name + "_action"
  source_set_name = target_name

  # The mapping from sources to the copied version.
  copied_source_pattern = "$root_out_dir/test_data/{{source_root_relative_dir}}/{{source_file_part}}"

  gen_source_pattern = "{{source_gen_dir}}/{{source_name_part}}-gen.cc"

  action_foreach(action_name) {
    testonly = true
    visibility = [ ":$source_set_name" ]
    script = "//tools/gypv8sh.py"

    sources = invoker.sources

    v8_shell_path = get_label_info("//v8:v8_shell($v8_snapshot_toolchain)",
                                   "root_out_dir") + "/v8_shell"
    if (host_os == "win") {
      v8_shell_path += ".exe"
    }

    input_js = [
      "//chrome/third_party/mock4js/mock4js.js",
      "//chrome/test/data/webui/test_api.js",
      "//chrome/test/base/js2gtest.js",
    ]
    inputs = [ v8_shell_path ] + input_js
    if (defined(invoker.deps_js)) {
      inputs += [ invoker.deps_js ]
    }
    if (defined(invoker.gen_include_files)) {
      inputs += invoker.gen_include_files
    }

    # Outputs. The script will copy the source files to the output directory,
    # which then must be treated as runtime data. The generated .cc file isn't
    # data, it will be compiled in a step below.
    outputs = [
      copied_source_pattern,
      gen_source_pattern,
    ]
    data = process_file_template(sources, [ copied_source_pattern ])

    args = []
    if (defined(invoker.deps_js)) {
      args += [
        "--deps_js",
        rebase_path(invoker.deps_js, root_build_dir),
      ]
    }
    args += [
      # Need "./" for script to find binary (cur dir is not on path).
      "./" + rebase_path(v8_shell_path, root_build_dir),
    ]
    args += rebase_path(input_js, root_build_dir) + [ invoker.test_type ]
    if (v8_use_external_startup_data) {
      args += [ "--external=y" ]
    } else {
      args += [ "--external=n" ]
    }
    args += [
      "{{source}}",
      "{{source_root_relative_dir}}/{{source_file_part}}",
      gen_source_pattern,
      rebase_path(copied_source_pattern, root_build_dir),
    ]

    deps = [
      "//v8:v8_shell($v8_snapshot_toolchain)",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }

  if (defined(invoker.extra_js_files)) {
    copy_target_name = target_name + "_copy"
    copy(copy_target_name) {
      visibility = [ ":$source_set_name" ]
      sources = invoker.extra_js_files
      outputs = [
        copied_source_pattern,
      ]
    }
  }

  source_set(source_set_name) {
    testonly = true
    forward_variables_from(invoker,
                           [
                             "defines",
                             "visibility",
                           ])
    sources = get_target_outputs(":$action_name")

    # This empty public header is intentional to remove unnecessary build
    # dependency.
    public = []

    deps = [
      ":$action_name",

      # The generator implicitly makes includes from these targets.
      "//chrome/test:test_support",
      "//testing/gmock",
      "//testing/gtest",
      "//url",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    if (defined(invoker.gen_include_files)) {
      data = invoker.gen_include_files
    }
    if (defined(invoker.extra_js_files)) {
      data_deps = [
        ":$copy_target_name",
      ]
    }
  }
}
