# 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.

# Do not use - depend directly on //src/lib/json_parser instead.
# This is a transitional target and will be removed soon.
# Bug: 36759

group("json") {
  public_deps = [ ":json_parser" ]
}

source_set("json_parser") {
  sources = [
    "json_parser.cc",
    "json_parser.h",
    "pretty_print.h",
    "rapidjson_validation.cc",
    "rapidjson_validation.h",
  ]

  public_deps = [
    "//sdk/lib/fit",
    "//src/lib/fxl",
    "//third_party/rapidjson",
    "//zircon/public/lib/zxc",
    "//zircon/system/ulib/fbl",
  ]
}

executable("json_parser_unittests_bin") {
  testonly = true

  output_name = "json_parser_unittests"

  sources = [
    "json_parser_unittest.cc",
    "rapidjson_validation_unittest.cc",
  ]

  deps = [
    ":json_parser",
    "//src/lib/files",
    "//src/lib/fxl",
    "//src/lib/fxl/test:gtest_main",
    "//third_party/rapidjson",
  ]

  configs += [
    # TODO(fxbug.dev/58162): delete the below and fix compiler warnings
    "//build/config:Wno-conversion",
  ]
}

if (is_fuchsia) {
  import("//build/components.gni")
  import("//build/testing/environments.gni")

  fuchsia_unittest_package("json_parser_unittests") {
    manifest = "meta/json_parser_unittests.cmx"
    deps = [ ":json_parser_unittests_bin" ]
    test_specs = {
      environments = [ emu_env ]
    }
  }
}

group("tests") {
  testonly = true

  deps = [ ":json_parser_unittests_bin($host_toolchain)" ]
  if (is_fuchsia) {
    deps += [ ":json_parser_unittests" ]
  }
}
