# Copyright 2018 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("//third_party/closure_compiler/compile_js.gni")

# Describes a list of js_library targets that will each have an html file
# written listing all its (flattened) js dependencies, for loading as a test.
#
# A companion group target with a "_type_check" suffix is also generated with
# this template. This depends on a list of js_type_check(..) targets -- one for
# each test -- that will type check the test js file and its dependency subtree.
#
# Must be declared after the js_library targets it depends on.
#
# Note js_type_check(..) is a no-op unless `closure_compile` is set in gn args.
#
# Variables:
#   deps:
#     List of js_library targets to depend on
#
#   mocks:
#     An optional list of .js files to load before any other scripts
#
# Example:
#   js_unit_tests("folder_tests") {
#     deps = [
#       ":foo_unittest",
#       ":bar_unittest",
#       ":baz_unittest",
#     ]
#     mocks = [ "my_mocks.js" ]
#   }
#   group("closure_compile") {
#     # ...
#     ":folder_tests_type_check".
#   }
#   test("browser_tests") {
#     # ...
#     data_deps += [ "//folder:folder_tests" ]
#   }

template("js_unit_tests") {
  html_gen_target_name = target_name + "_html_gen"
  action_foreach(html_gen_target_name) {
    script_path = "//third_party/closure_compiler"
    script = "$script_path/js_unit_test.py"
    forward_variables_from(invoker,
                           [
                             "deps",
                             "mocks",
                           ])
    testonly = true
    sources = []
    foreach(dep, deps) {
      sources += get_target_outputs(dep)
    }

    outputs = [
      "$target_gen_dir/{{source_name_part}}.html",
    ]
    args = [ "--output" ] + rebase_path(outputs, root_build_dir)
    args += [ "--input" ] + [ "{{source}}" ]

    # js_unit_test.py needs to walk .js_library dependency files relative to the
    # gen_dir, but we'd like to reference the corresponding .js source files
    # in the source dir, not the gen dir. Pass a prefix to remap --input args.
    args += [
      "--include_prefix",
      rebase_path("//", "{{root_gen_dir}}", "//"),
    ]

    if (defined(mocks)) {
      args += [ "--mocks" ] + rebase_path(mocks, root_build_dir)
      data = mocks
    }
  }
  type_check_deps = []
  foreach(dep, invoker.deps) {
    type_check_target_name = target_name + "_" + dep + "_type_check"
    type_check_deps += [ ":$type_check_target_name" ]
    js_type_check(type_check_target_name) {
      testonly = true
      forward_variables_from(invoker, [ "closure_flags" ])
      deps = [
        dep,
      ]
    }
  }
  type_check_group_name = target_name + "_type_check"
  group(type_check_group_name) {
    testonly = true
    deps = type_check_deps
  }
  group(target_name) {
    data = get_target_outputs(":$html_gen_target_name")
    testonly = true
    deps = [
      ":$html_gen_target_name",
    ]
  }
}

# Simple wrapper around js_library to describe a unit test.
template("js_unittest") {
  js_library(target_name) {
    testonly = true

    # Forward everything that js_library forwards except testonly (omitting that
    # causes gn to emit "Assignment had no effect" if it's added redundantly).
    forward_variables_from(invoker,
                           [
                             "deps",
                             "externs_list",
                             "extra_deps",
                             "extra_sources",
                             "sources",
                             "visibility",
                           ])
  }
}
