# Copyright 2020 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/dart/test.gni")
import("//sdk/ctf/build/internal/ctf_element.gni")
import("//sdk/ctf/build/internal/ctf_version.gni")
import("//sdk/ctf/build/internal/write_ctf_file.gni")

template("ctf_dart_test") {
  invoker_deps = []
  if (defined(invoker.deps)) {
    invoker_deps += invoker.deps
  }
  if (defined(invoker.non_dart_deps)) {
    invoker_deps += invoker.non_dart_deps
  }

  if (invoker_deps != [] && cts_version == "") {
    verify_target = target_name + "_verify_deps"
  }
  write_file_target = target_name + "_ctf_file"

  if (defined(verify_target)) {
    ctf_element(verify_target) {
      deps_to_verify = invoker_deps
      invoker_label =
          get_label_info(":${invoker.target_name}", "label_no_toolchain")
    }
  }

  write_ctf_file(write_file_target) {
  }

  dart_test(target_name) {
    forward_variables_from(invoker, "*")
    if (!defined(non_dart_deps)) {
      non_dart_deps = []
    }

    if (defined(verify_target)) {
      non_dart_deps += [ ":$verify_target" ]
    }
    non_dart_deps += [ ":$write_file_target" ]
  }
}
