# 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/go/go_library.gni")
import("//build/go/go_test.gni")
import("//build/json/validate_json.gni")
import("//tools/fidl/fidlc/testdata/info.gni")

go_library("fidlgen") {
  sources = [
    "formatter.go",
    "generator.go",
    "identifiers.go",
    "identifiers_test.go",
    "names.go",
    "names.go",
    "names_test.go",
    "reserved_names.go",
    "strings.go",
    "strings_test.go",
    "struct.go",
    "struct_test.go",
    "templates.go",
    "types.go",
    "types_test.go",
    "write_file_if_changed.go",
  ]
}

if (is_host) {
  go_test("fidlgen_lib_test") {
    library = ":fidlgen"
    deps = [ "//third_party/golibs:github.com/google/go-cmp" ]
  }
}

group("tests") {
  testonly = true
  deps = [
    ":fidlgen_lib_test($host_toolchain)",
    ":roundtrip_tests($default_toolchain)",
  ]
}

# These tests perform a round-trip of the IR: valid JSON IR is read into its go
# representation by the library utilities, unmarshaled back to JSON, and then
# validated again as IR. This ensures that the library - and thus all backends
# that depend on it - have an accurate representation of the IR.
if (current_toolchain == default_toolchain) {
  roundtrip_test_deps = []

  foreach(info, fidl_testdata_info) {
    roundtrip_target = "roundtrip.${info.name}"
    validate_target = "validate.${info.name}"

    output_json = "$target_gen_dir/${info.name}.json"
    compiled_action(roundtrip_target) {
      testonly = true
      visibility = [ ":$validate_target" ]

      input_json = "${info.fidl_gen_dir}/${info.target_name}.fidl.json"
      inputs = [ input_json ]
      outputs = [ output_json ]

      tool = "testing:roundtripper"

      args = [
        "-in",
        rebase_path(input_json, root_build_dir),
        "-out",
        rebase_path(output_json, root_build_dir),
      ]

      deps = [ "${info.target}($fidl_toolchain)" ]
    }

    validate_json(validate_target) {
      testonly = true
      visibility = [ ":*" ]
      data = output_json
      schema = "//tools/fidl/fidlc/schema.json"
      deps = [ ":$roundtrip_target" ]
    }

    roundtrip_test_deps += [ ":$validate_target" ]
  }

  group("roundtrip_tests") {
    testonly = true
    deps = roundtrip_test_deps
  }
}
