# Copyright 2021 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/config/clang/clang.gni")
import("//build/go/go_binary.gni")
import("//build/go/go_library.gni")
import("//build/host.gni")
import("//build/testing/golden_test.gni")
import("//tools/fidl/fidlc/testdata/info.gni")

go_library("gopkg") {
  name = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_cpp/..."
  deps = [
    "//tools/fidl/lib/fidlgen",
    "//tools/fidl/lib/fidlgen_cpp",
  ]
  sources = [
    "codegen/codegen.go",
    "codegen/file_header.tmpl.go",
    "codegen/file_source.tmpl.go",
    "codegen/fragment_const.tmpl.go",
    "codegen/fragment_type_alias.tmpl.go",
    "main.go",
  ]
}

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

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

clang_format = rebase_path("${clang_prefix}/clang-format", "", root_build_dir)
reformat_command = "'${clang_format}' --style=google"

golden_test("fidlgen_cpp_golden_tests") {
  goldens_dir = "goldens"
  reformat_goldens_command = reformat_command
  deps = []
  entries = []
  foreach(info, fidl_testdata_info) {
    if (info.denylist + [ "fidlgen_cpp" ] - [ "fidlgen_cpp" ] ==
        info.denylist) {
      deps += [ "${info.target}_cpp_generate($fidl_toolchain)" ]
      gen_dir = "${info.fidl_gen_dir}/${info.target_name}/cpp"
      include_path = string_replace(info.library, ".", "/") + "/cpp"
      entries += [
        {
          golden = "${info.name}.h.golden"
          generated = "$gen_dir/$include_path/fidl_v2.h"
        },
        {
          golden = "${info.name}.cc.golden"
          generated = "$gen_dir/$include_path/fidl_v2.cc"
        },
      ]
    }
  }
}

group("goldens") {
  testonly = true

  denylist_key = "device_build_denylist"
  if (is_host) {
    denylist_key = "host_build_denylist"
  }

  deps = []
  foreach(info, fidl_testdata_info) {
    if (info[denylist_key] + [ "fidlgen_cpp" ] - [ "fidlgen_cpp" ] ==
        info[denylist_key]) {
      deps += [ "${info.target}_cpp" ]
    }
  }
}

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