# Copyright 2022 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.

# Note: This file is intentionally not used by any other BUILD.gn in Dawn.
# Instead, Chromium depends directly on this file to build the WebGPU CTS.
# Scripts called from this file assume Dawn is checked out inside Chromium.

group("webgpu-cts") {
  public_deps = [
    ":compile_src",
    ":copy_resources",
    ":verify_gen_ts_dep_list",
  ]
}

list_from_ts_sources_txt = read_file("ts_sources.txt", "list lines")

ts_source_inputs = [ "../../webgpu-cts/tsconfig.json" ]
foreach(file, list_from_ts_sources_txt) {
  ts_source_inputs += [ "../../webgpu-cts/$file" ]
}

js_outputs = []
foreach(ts_file, list_from_ts_sources_txt) {
  js_file = string_replace(ts_file, ".ts", ".js")
  js_node_file = string_replace(js_file, "src/", "src-node/")

  js_outputs += [ "$target_gen_dir/../../webgpu-cts/$js_file" ]

  if (js_node_file != "src-node/common/runtime/wpt.js" &&
      js_node_file != "src-node/common/runtime/standalone.js" &&
      js_node_file != "src-node/common/runtime/helper/test_worker.js" &&
      js_node_file !=
      "src-node/webgpu/web_platform/worker/worker_launcher.js") {
    js_outputs += [ "$target_gen_dir/../../webgpu-cts/$js_node_file" ]
  }
}

action("compile_src") {
  script = "scripts/compile_src.py"

  inputs = [
             "//third_party/node/node_modules/typescript/lib/tsc.js",
             "//third_party/node/node.py",
             "scripts/tsc_ignore_errors.py",
           ] + ts_source_inputs

  outputs = js_outputs
  data = js_outputs

  args = [ rebase_path("$target_gen_dir/../../webgpu-cts", root_build_dir) ]
}

list_from_resource_files_txt = read_file("resource_files.txt", "list lines")
resource_file_inputs = []
foreach(file, list_from_resource_files_txt) {
  resource_file_inputs += [ "$file" ]
}

copy("copy_resources") {
  sources = []
  data = []
  foreach(resource_file, resource_file_inputs) {
    sources += [ "../../webgpu-cts/src/resources/$resource_file" ]

    # Copy into resources/, instead of src/resources/, because compile_src
    # wipes src/ before running.
    data += [ "$target_gen_dir/../../webgpu-cts/resources/$resource_file" ]
  }

  outputs =
      [ "$target_gen_dir/../../webgpu-cts/resources/{{source_file_part}}" ]
}

action("verify_gen_ts_dep_list") {
  script = "scripts/gen_ts_dep_lists.py"
  inputs = [
    # TODO(kainino): Make sure this gets retriggered when the CTS dep changes.
    "resource_files.txt",
    "ts_sources.txt",
  ]
  outputs = [ "$target_out_dir/run_$target_name.stamp" ]
  args = [
    "--check",
    "--stamp",
    rebase_path(outputs[0], root_build_dir),
  ]
}
