# Copyright 2023 The Tint 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.

################################################################################
# File generated by 'tools/src/cmd/gen' using the template:
#   tools/src/cmd/gen/build/BUILD.gn.tmpl
#
# To regenerate run: './tools/run gen'
#
#                       Do not modify this file directly
################################################################################

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

import("${tint_src_dir}/tint.gni")

if (tint_build_unittests || tint_build_benchmarks) {
  import("//testing/test.gni")
}
if (tint_build_unittests) {
  test("test_cmd") {
    testonly = true
    output_name = "tint_unittests"
    sources = [ "main_test.cc" ]
    deps = [
      "${tint_src_dir}:gmock_and_gtest",
      "${tint_src_dir}/api",
      "${tint_src_dir}/cmd/common:unittests",
      "${tint_src_dir}/lang/core:unittests",
      "${tint_src_dir}/lang/core/constant:unittests",
      "${tint_src_dir}/lang/core/intrinsic:unittests",
      "${tint_src_dir}/lang/core/ir:unittests",
      "${tint_src_dir}/lang/core/ir/transform:unittests",
      "${tint_src_dir}/lang/core/type:unittests",
      "${tint_src_dir}/lang/spirv/ir:unittests",
      "${tint_src_dir}/lang/wgsl:unittests",
      "${tint_src_dir}/lang/wgsl/ast:unittests",
      "${tint_src_dir}/lang/wgsl/helpers:unittests",
      "${tint_src_dir}/lang/wgsl/program:unittests",
      "${tint_src_dir}/lang/wgsl/reader/lower:unittests",
      "${tint_src_dir}/lang/wgsl/resolver:unittests",
      "${tint_src_dir}/lang/wgsl/sem:unittests",
      "${tint_src_dir}/lang/wgsl/writer/ir_to_program:unittests",
      "${tint_src_dir}/lang/wgsl/writer/raise:unittests",
      "${tint_src_dir}/utils/cli:unittests",
      "${tint_src_dir}/utils/command:unittests",
      "${tint_src_dir}/utils/containers:unittests",
      "${tint_src_dir}/utils/diagnostic:unittests",
      "${tint_src_dir}/utils/file:unittests",
      "${tint_src_dir}/utils/ice",
      "${tint_src_dir}/utils/ice:unittests",
      "${tint_src_dir}/utils/macros",
      "${tint_src_dir}/utils/macros:unittests",
      "${tint_src_dir}/utils/math:unittests",
      "${tint_src_dir}/utils/memory:unittests",
      "${tint_src_dir}/utils/reflection:unittests",
      "${tint_src_dir}/utils/result:unittests",
      "${tint_src_dir}/utils/rtti:unittests",
      "${tint_src_dir}/utils/strconv:unittests",
      "${tint_src_dir}/utils/symbol:unittests",
      "${tint_src_dir}/utils/text:unittests",
      "${tint_src_dir}/utils/traits:unittests",
    ]

    if (tint_build_glsl_writer) {
      deps += [ "${tint_src_dir}/lang/glsl/writer/ast_printer:unittests" ]
    }

    if (tint_build_glsl_writer && tint_build_wgsl_reader &&
        tint_build_wgsl_writer) {
      deps += [ "${tint_src_dir}/lang/glsl/writer/ast_raise:unittests" ]
    }

    if (tint_build_hlsl_writer) {
      deps += [ "${tint_src_dir}/lang/hlsl/writer/ast_printer:unittests" ]
    }

    if (tint_build_hlsl_writer && tint_build_wgsl_reader &&
        tint_build_wgsl_writer) {
      deps += [ "${tint_src_dir}/lang/hlsl/writer/ast_raise:unittests" ]
    }

    if (tint_build_msl_writer) {
      deps += [
        "${tint_src_dir}/lang/msl/writer/ast_printer:unittests",
        "${tint_src_dir}/lang/msl/writer/common:unittests",
        "${tint_src_dir}/lang/msl/writer/printer:unittests",
      ]
    }

    if (tint_build_msl_writer && tint_build_wgsl_reader &&
        tint_build_wgsl_writer) {
      deps += [ "${tint_src_dir}/lang/msl/writer/ast_raise:unittests" ]
    }

    if (tint_build_spv_reader && tint_build_wgsl_reader &&
        tint_build_wgsl_writer) {
      deps += [ "${tint_src_dir}/lang/spirv/reader/ast_lower:unittests" ]
    }

    if (tint_build_spv_reader && tint_build_wgsl_writer) {
      deps += [ "${tint_src_dir}/lang/spirv/reader/ast_parser:unittests" ]
    }

    if (tint_build_spv_writer) {
      deps += [
        "${tint_src_dir}/lang/spirv/writer:unittests",
        "${tint_src_dir}/lang/spirv/writer/ast_printer:unittests",
        "${tint_src_dir}/lang/spirv/writer/common:unittests",
        "${tint_src_dir}/lang/spirv/writer/raise:unittests",
      ]
    }

    if (tint_build_spv_writer && tint_build_wgsl_reader &&
        tint_build_wgsl_writer) {
      deps += [ "${tint_src_dir}/lang/spirv/writer/ast_raise:unittests" ]
    }

    if (tint_build_wgsl_reader) {
      deps += [
        "${tint_src_dir}/lang/wgsl/inspector:unittests",
        "${tint_src_dir}/lang/wgsl/reader/parser:unittests",
        "${tint_src_dir}/lang/wgsl/reader/program_to_ir:unittests",
      ]
    }

    if (tint_build_wgsl_reader && tint_build_wgsl_writer) {
      deps += [ "${tint_src_dir}/lang/wgsl/ast/transform:unittests" ]
    }

    if (tint_build_wgsl_writer) {
      deps += [ "${tint_src_dir}/lang/wgsl/writer/ast_printer:unittests" ]
    }
    configs += [ "${tint_src_dir}:tint_unittests_config" ]

    if (build_with_chromium) {
      configs -= [ "//build/config/compiler:chromium_code" ]
      configs += [ "//build/config/compiler:no_chromium_code" ]
    }
  }
}
