# 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 = [
    "backend/generator.go",
    "backend/ir/ir.go",
    "backend/templates/bits.tmpl.go",
    "backend/templates/const.tmpl.go",
    "backend/templates/enum.tmpl.go",
    "backend/templates/interface.tmpl.go",
    "backend/templates/library.tmpl.go",
    "backend/templates/struct.tmpl.go",
    "backend/templates/table.tmpl.go",
    "backend/templates/union.tmpl.go",
    "fidlgen_dart.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)",
  ]
}
