# 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_binary.gni")
import("//build/go/go_library.gni")
import("//build/go/toolchain.gni")
import("//build/host.gni")
import("//build/testing/golden_test.gni")
import("//tools/fidl/fidlc/testdata/info.gni")
import("//tools/fidl/lib/fidlgentest/fidlgentest_go_test.gni")

if (is_host) {
  go_library("gopkg") {
    name = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_go/..."
    deps = [ "//tools/fidl/lib/fidlgen" ]
    sources = [
      "codegen/bits.tmpl",
      "codegen/codegen.go",
      "codegen/enum.tmpl",
      "codegen/ir.go",
      "codegen/ir_test.go",
      "codegen/library.tmpl",
      "codegen/protocol.tmpl",
      "codegen/struct.tmpl",
      "codegen/table.tmpl",
      "codegen/union.tmpl",
      "main.go",
    ]
  }

  go_binary("fidlgen_go") {
    gopackage = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_go"

    sdk_category = "partner"
    deps = [ ":gopkg" ]
  }

  fidlgentest_go_test("fidlgen_go_lib_tests") {
    gopackages = [ "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_go/codegen" ]
    deps = [ ":gopkg" ]
  }

  golden_test("fidlgen_go_golden_tests") {
    goldens_dir = "goldens"
    reformat_goldens_bin = "//prebuilt/third_party/go/$host_platform/bin/gofmt"
    deps = []
    entries = []
    foreach(info, fidl_testdata_info) {
      if (info.denylist + [ "fidlgen_go" ] - [ "fidlgen_go" ] ==
          info.denylist) {
        deps += [ "${info.target}_go_generate($go_toolchain)" ]
        entries += [
          {
            golden = "${info.name}.go.golden"
            generated = "${info.fidl_gen_dir}/${info.target_name}/${info.library}.fidl/impl.go"
          },
        ]
      }
    }
  }
}

install_host_tools("host") {
  deps = [ ":fidlgen_go" ]
  outputs = [ "fidlgen_go" ]
}

group("goldens") {
  testonly = true

  deps = []
  foreach(info, fidl_testdata_info) {
    if (info.build_denylist + [ "fidlgen_go" ] - [ "fidlgen_go" ] ==
        info.build_denylist) {
      deps += [ info.target ]
    }
  }
}

group("tests") {
  testonly = true
  deps = [
    ":fidlgen_go_golden_tests($host_toolchain)",
    ":fidlgen_go_lib_tests($host_toolchain)",
    ":goldens($go_toolchain)",
  ]
}
