# Copyright 2019 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/test.gni")
import("//tools/fidl/fidlc/testdata/info.gni")

# The generation depends only on the source, so do it only once.
if (current_toolchain == default_toolchain) {
  action("gen-examples") {
    visibility = [ ":examples" ]
    outputs = [ "$target_gen_dir/examples.cc" ]
    script = "gen-examples.sh"
    sources = [
      "testdata/badformat.fidl.noformat",
      "testdata/goodformat.test.fidl",
    ]
    foreach(info, fidl_testdata_info) {
      # Only use the standalone libraries since they have predictable filenames.
      if (get_label_info(info.target, "dir") == "//tools/fidl/fidlc/testdata") {
        sources += [ "//tools/fidl/fidlc/testdata/${info.name}.test.fidl" ]
      }
    }
    args = rebase_path(outputs, root_build_dir) +
           rebase_path(sources, root_build_dir)
  }
} else {
  test("fidl-compiler") {
    if (is_fuchsia) {
      configs += [ "//build/unification/config:zircon-migrated" ]
    }
    if (is_fuchsia) {
      fdio_config = [ "//build/config/fuchsia:fdio_config" ]
      if (configs + fdio_config - fdio_config != configs) {
        configs -= fdio_config
      }
    }
    sources = [
      "alias_tests.cc",
      "array_tests.cc",
      "attributes_tests.cc",
      "bits_tests.cc",
      "c_generator_tests.cc",
      "canonical_names_tests.cc",
      "coded_types_generator_tests.cc",
      "consts_tests.cc",
      "declaration_order_tests.cc",
      "direct_dependencies_tests.cc",
      "enums_tests.cc",
      "errors_tests.cc",
      "flat_ast_tests.cc",
      "flexible_tests.cc",
      "formatter_tests.cc",
      "handle_tests.cc",
      "json_diagnostics_tests.cc",
      "json_findings_tests.cc",
      "lint_findings_tests.cc",
      "lint_tests.cc",
      "new_formatter_tests.cc",
      "new_syntax_converter_tests.cc",
      "new_syntax_tests.cc",
      "ordinals_tests.cc",
      "parsing_tests.cc",
      "protocol_tests.cc",
      "recoverable_compilation_tests.cc",
      "recoverable_parsing_tests.cc",
      "recursion_detector_tests.cc",
      "reporter_tests.cc",
      "resource_tests.cc",
      "resourceness_tests.cc",
      "service_tests.cc",
      "span_tests.cc",
      "strictness_tests.cc",
      "structs_tests.cc",
      "table_tests.cc",
      "test_library.cc",
      "types_tests.cc",
      "typeshape_tests.cc",
      "union_tests.cc",
      "using_tests.cc",
      "utils_tests.cc",
      "virtual_source_tests.cc",
      "visitor_unittests.cc",
    ]
    deps = [
      ":examples",
      "//third_party/boringssl",
      "//tools/fidl/fidlc:fidl",
      "//zircon/public/lib/zxtest",
    ]
  }

  source_set("examples") {
    gen_label = ":gen-examples($default_toolchain)"
    gen_dir = get_label_info(gen_label, "target_gen_dir")
    include_dirs = [ "." ]
    sources = [ "$gen_dir/examples.cc" ]
    deps = [ gen_label ]
  }
}
