# 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/config/clang/clang.gni")
import("//build/fidl/toolchain.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")

if (is_host) {
  go_library("gopkg") {
    name = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_hlcpp/..."
    deps = [
      "//tools/fidl/lib/fidlgen",
      "//tools/fidl/lib/fidlgen_cpp",
    ]
    sources = [
      "codegen/codegen.go",
      "codegen/header.tmpl.go",
      "codegen/implementation.tmpl.go",
      "codegen/natural_types_bits.tmpl.go",
      "codegen/natural_types_const.tmpl.go",
      "codegen/natural_types_enum.tmpl.go",
      "codegen/natural_types_protocol.tmpl.go",
      "codegen/natural_types_struct.tmpl.go",
      "codegen/natural_types_table.tmpl.go",
      "codegen/natural_types_union.tmpl.go",
      "codegen/proxies_and_stubs_protocol.tmpl.go",
      "codegen/proxies_and_stubs_service.tmpl.go",
      "codegen/test_base.tmpl.go",
      "main.go",
    ]
  }

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

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

  # TODO(fxbug.dev/45483): Remove once all SDK customers are using HLCPP backend
  # directly.
  go_binary("fidlgen") {
    gopackage = "go.fuchsia.dev/fuchsia/tools/fidl/fidlgen_hlcpp"

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

  golden_test("fidlgen_hlcpp_golden_tests") {
    goldens_dir = "goldens/bindings"
    reformat_goldens_bin =
        rebase_path("${clang_prefix}/clang-format", "", root_build_dir)
    reformat_goldens_args = [ "--style=google" ]
    deps = []
    entries = []
    foreach(info, fidl_testdata_info) {
      if (info.denylist + [ "fidlgen_hlcpp" ] - [ "fidlgen_hlcpp" ] ==
          info.denylist) {
        deps += [ "${info.target}_hlcpp_generate($fidl_toolchain)" ]
        gen_dir = "${info.fidl_gen_dir}/${info.target_name}/hlcpp"
        include_path = string_replace(info.library, ".", "/") + "/cpp"
        entries += [
          {
            golden = "${info.name}.h.golden"
            generated = "$gen_dir/$include_path/fidl.h"
          },
          {
            golden = "${info.name}.cc.golden"
            generated = "$gen_dir/$include_path/fidl.cc"
          },
          {
            golden = "${info.name}_test_base.h.golden"
            generated = "$gen_dir/$include_path/fidl_test_base.h"
          },
        ]
      }
    }
  }

  golden_test("fidlgen_hlcpp_natural_types_golden_tests") {
    goldens_dir = "goldens/natural_types"
    reformat_goldens_bin =
        rebase_path("${clang_prefix}/clang-format", "", root_build_dir)
    reformat_goldens_args = [ "--style=google" ]
    deps = []
    entries = []
    foreach(info, fidl_testdata_info) {
      if (info.denylist + [ "fidlgen_hlcpp" ] - [ "fidlgen_hlcpp" ] ==
          info.denylist) {
        deps += [ "${info.target}_cpp_natural_types_generate($fidl_toolchain)" ]
        gen_dir = "${info.fidl_gen_dir}/${info.target_name}/cpp_natural_types"
        include_path = string_replace(info.library, ".", "/") + "/cpp"
        entries += [
          {
            golden = "${info.name}.h.golden"
            generated = "$gen_dir/$include_path/natural_types.h"
          },
          {
            golden = "${info.name}.cc.golden"
            generated = "$gen_dir/$include_path/natural_types.cc"
          },
        ]
      }
    }
  }
}

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

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_hlcpp" ] - [ "fidlgen_hlcpp" ] ==
        info[denylist_key]) {
      deps += [
        "${info.target}_cpp_natural_types",
        "${info.target}_hlcpp",
      ]
    }
  }
}

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