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

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

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