# Copyright 2016 The Chromium 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("//testing/test.gni")

config("ced_config") {
  include_dirs = [ "src" ]
}

config("ced_config_private") {
  # This cannot be set directly on the "ced" and "ced_unittests" target because
  # the target cflags property is added to the command-line before the cflags
  # property from its config. For configs, the cflags property are set in the
  # order public_configs, configs thus it is correctly set after the flag that
  # enable the error.
  if (is_clang) {
    cflags = [ "-Wno-unused-function" ]
  }
}

static_library("ced") {
  sources = [
    # find src -maxdepth 3 ! -type d | egrep '\.(h|cc)$' | grep -v test.cc |\
    # LC_COLLATE=c sort | sed 's/^\(.*\)$/    "\1",/'
    "src/compact_enc_det/compact_enc_det.cc",
    "src/compact_enc_det/compact_enc_det_generated_tables.h",
    "src/compact_enc_det/compact_enc_det_generated_tables2.h",
    "src/compact_enc_det/compact_enc_det_hint_code.cc",
    "src/compact_enc_det/compact_enc_det_hint_code.h",
    "src/util/basictypes.h",
    "src/util/case_insensitive_hash.h",
    "src/util/commandlineflags.h",
    "src/util/encodings/encodings.cc",
    "src/util/encodings/encodings.h",
    "src/util/encodings/encodings.pb.h",
    "src/util/languages/languages.cc",
    "src/util/languages/languages.h",
    "src/util/languages/languages.pb.h",
    "src/util/logging.h",
    "src/util/port.h",
    "src/util/string_util.h",
    "src/util/varsetter.h",
  ]
  public = [
    "src/compact_enc_det/compact_enc_det.h",
  ]
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    ":ced_config_private",
  ]

  public_configs = [ ":ced_config" ]

  if (is_win) {
    defines = [ "COMPILER_MSVC" ]
    cflags = [
      "/wd4005",  # Macro defined twice.
      "/wd4006",  # #undef expected an identifier.
      "/wd4018",  # '<': signed/unsigned mismatch
      "/wd4309",  # Truncation of constant value.
    ]
  } else {
    defines = [ "COMPILER_GCC" ]
  }

  defines += [ "HTML5_MODE" ]
}

test("ced_unittests") {
  sources = [
    "src/compact_enc_det/compact_enc_det_fuzz_test.cc",
    "src/compact_enc_det/compact_enc_det_unittest.cc",
    "src/compact_enc_det/detail_head_string.inc",
    "src/util/encodings/encodings_unittest.cc",
  ]

  configs += [ ":ced_config_private" ]

  if (is_win) {
    defines = [ "COMPILER_MSVC" ]
    cflags = [
      "/wd4310",  # Truncation of constant value.
      "/wd4267",  # size_t -> int
    ]
  } else {
    defines = [ "COMPILER_GCC" ]
  }

  defines += [ "HTML5_MODE" ]

  deps = [
    ":ced",
    "//testing/gtest",
    "//testing/gtest:gtest_main",
  ]
}
