# 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")

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" ]

      # TODO(https://fxbug.dev/42168969): Update schema to
      # "http://json-schema.org/draft-07/schema#" and remove this line.
      use_valico = false
    }

    roundtrip_test_deps += [ ":$validate_target" ]
  }

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

## BAZEL2GN SENTINEL - DO NOT EDIT BELOW THIS LINE ##
#
#  ________  _________  ________  ________
# |\   ____\|\___   ___\\   __  \|\   __  \
# \ \  \___|\|___ \  \_\ \  \|\  \ \  \|\  \
#  \ \_____  \   \ \  \ \ \  \\\  \ \   ____\
#   \|____|\  \   \ \  \ \ \  \\\  \ \  \___|
#     ____\_\  \   \ \__\ \ \_______\ \__\
#    |\_________\   \|__|  \|_______|\|__|
#    \|_________|
#
#
# AUTO-GENERATED - DO NOT EDIT
#
# The targets below are auto-generated based on the targets defined in the
# BUILD.bazel file from the same directory. If you made changes to targets in
# Bazel, instead of editing this file manually, run:
#
#   > fx bazel2gn
#
# Please do NOT edit this file directly. Instead, edit the BUILD.bazel file and
# rerun bazel2gn.

import("//build/tools/bazel2gn/bazel_migration.gni")

# A self-verification target for generated content in this file.
if (is_host) {
  verify_bazel2gn("verify_bazel2gn") {
  }
}

if (is_host) {
  go_library("fidlgen") {
    sources = [
      "formatter.go",
      "generator.go",
      "identifiers.go",
      "names.go",
      "reserved_names.go",
      "strings.go",
      "struct.go",
      "templates.go",
      "types.go",
      "write_file_if_changed.go",
    ]
    importpath = "go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen"
  }
}
if (is_host) {
  go_test("fidlgen_lib_test") {
    sources = [
      "identifiers_test.go",
      "names_test.go",
      "strings_test.go",
      "struct_test.go",
      "types_test.go",
    ]
    embed = [ ":fidlgen" ]
    deps = [
      "//third_party/golibs:github.com/google/go-cmp/cmp",
      "//third_party/golibs:github.com/google/go-cmp/cmp/cmpopts",
    ]
  }
}
