# Copyright 2022 The Dawn Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

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

import("../../../scripts/dawn_overrides_with_defaults.gni")

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 = "${dawn_root}/webgpu-cts/scripts/compile_src.py"

  inputs = [
             "//third_party/node/node_modules/typescript/lib/tsc.js",
             "//third_party/node/node.py",
             "${dawn_root}/webgpu-cts/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 = "${dawn_root}/webgpu-cts/scripts/gen_ts_dep_lists.py"
  inputs = [
    "../../../DEPS",
    "resource_files.txt",
    "ts_sources.txt",
  ]
  outputs = [ "$target_out_dir/run_$target_name.stamp" ]
  args = [
    "--check",
    "--stamp",
    rebase_path(outputs[0], root_build_dir),
  ]
}
