# Copyright 2018 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/dart/dart_library.gni")
import("//build/go/go_binary.gni")
import("//build/go/go_library.gni")
import("//build/go/toolchain.gni")
import("//build/host.gni")
import("//build/sdk/sdk_host_tool.gni")
import("//build/testing/golden_test.gni")
import("//zircon/tools/fidl/testdata/info.gni")

go_library("fidlgen_dart_lib") {
  name = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_dart/..."

  deps = [ "//tools/fidl/lib/fidlgen" ]
  sources = [
    "codegen/bits.tmpl.go",
    "codegen/const.tmpl.go",
    "codegen/enum.tmpl.go",
    "codegen/generator.go",
    "codegen/interface.tmpl.go",
    "codegen/ir.go",
    "codegen/library.tmpl.go",
    "codegen/struct.tmpl.go",
    "codegen/table.tmpl.go",
    "codegen/union.tmpl.go",
    "main.go",
  ]
}

go_binary("fidlgen_dart") {
  gopackage = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_dart/"
  deps = [ ":fidlgen_dart_lib" ]
}

sdk_host_tool("fidlgen_dart_sdk") {
  category = "partner"
  output_name = "fidlgen_dart"
  deps = [ ":fidlgen_dart" ]
}

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

golden_test("fidlgen_dart_golden_tests") {
  goldens_dir = "goldens"
  deps = []
  entries = []
  foreach(info, fidl_testdata_info) {
    if (info.denylist + [ "fidlgen_dart" ] - [ "fidlgen_dart" ] ==
        info.denylist) {
      deps += [ "${info.target}_dart_generate($dart_toolchain)" ]
      dart_gen_dir =
          get_label_info("${info.target}($dart_toolchain)", "target_gen_dir")
      entries += [
        {
          golden = "${info.name}_async.dart.golden"
          generated =
              "${dart_gen_dir}/${info.library}_package/lib/fidl_async.dart"
        },
        {
          golden = "${info.name}_test.dart.golden"
          generated =
              "${dart_gen_dir}/${info.library}_package/lib/fidl_test.dart"
        },
      ]
    }
  }
}

group("goldens") {
  testonly = true

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

group("tests") {
  # TODO(ianloic): put fidlgen_dart non-host test targets here
  testonly = true
  deps = [
    ":fidlgen_dart_golden_tests($host_toolchain)",
    ":goldens($dart_toolchain)",
  ]
}
