# 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")

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" ]
}

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

# 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" ]
}

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

golden_test("fidlgen_hlcpp_golden_tests") {
  goldens_dir = "goldens/bindings"
  reformat_goldens_command = reformat_command
  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_command = reformat_command
  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"
        },
      ]
    }
  }
}

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)",
  ]
}
