# 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/host.gni")
import("//build/sdk/sdk_host_tool.gni")
import("//build/testing/golden_test.gni")
import("//tools/fidl/fidlc/testdata/info.gni")

if (is_host) {
  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" ]
  }

  dartfmt_command = rebase_path("${dart_sdk}/bin/dartfmt")

  golden_test("fidlgen_dart_golden_tests") {
    goldens_dir = "goldens"
    reformat_goldens_command = dartfmt_command
    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"
          },
        ]
      }
    }
  }
}

install_host_tools("host") {
  deps = [ ":fidlgen_dart" ]
  outputs = [ "fidlgen_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)",
  ]
}
