# Copyright 2018 The PDFium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/sanitizers/sanitizers.gni")
import("//build_overrides/build.gni")
import("../pdfium.gni")

source_set("test_support") {
  testonly = true
  sources = [
    "command_line_helpers.cpp",
    "command_line_helpers.h",
    "font_renamer.cpp",
    "font_renamer.h",
    "fx_string_testhelpers.cpp",
    "fx_string_testhelpers.h",
    "invalid_seekable_read_stream.cpp",
    "invalid_seekable_read_stream.h",
    "pseudo_retainable.h",
    "scoped_set_tz.cpp",
    "scoped_set_tz.h",
    "string_write_stream.cpp",
    "string_write_stream.h",
    "test_fonts.cpp",
    "test_fonts.h",
    "test_loader.cpp",
    "test_loader.h",
    "test_support.h",
    "utils/bitmap_saver.cpp",
    "utils/bitmap_saver.h",
    "utils/file_util.cpp",
    "utils/file_util.h",
    "utils/hash.cpp",
    "utils/hash.h",
  ]
  data = [ "resources/" ]
  public_deps = [
    ":path_service",
    "//third_party/test_fonts",
  ]
  deps = [
    "../:pdfium_public_headers",
    "../core/fdrm",
    "../core/fxcrt",
    "../core/fxge",
    "../fpdfsdk",
    "image_diff",
  ]
  configs += [
    "../:pdfium_strict_config",
    "../:pdfium_noshorten_config",
  ]
  visibility = [ "../*" ]
  if (is_posix) {
    sources += [
      "scoped_locale.cc",
      "scoped_locale.h",
    ]
  }
  if (pdf_use_partition_alloc) {
    sources += [
      "allocator_shim_config.cpp",
      "allocator_shim_config.h",
    ]
    deps += [ "//base/allocator/partition_allocator/src/partition_alloc" ]
  }
  if (pdf_enable_v8) {
    sources += [
      "v8_initializer.cpp",
      "v8_initializer.h",
    ]
    deps += [
      "//v8",
      "//v8:v8_libplatform",
    ]
    configs += [ "//v8:external_startup_data" ]
  }
}

source_set("path_service") {
  testonly = true
  sources = [
    "utils/path_service.cpp",
    "utils/path_service.h",
  ]
  deps = [ "../core/fxcrt" ]
  configs += [
    "../:pdfium_strict_config",
    "../:pdfium_noshorten_config",
  ]
  visibility = [ "../*" ]
}

source_set("test_environments") {
  testonly = true
  sources = [
    "pdf_test_environment.cpp",
    "pdf_test_environment.h",
  ]
  deps = [
    ":test_support",
    "../core/fxcrt",
    "../core/fxge",
    "//testing/gtest",
  ]
  configs += [
    "../:pdfium_strict_config",
    "../:pdfium_noshorten_config",
  ]
  if (pdf_enable_v8) {
    sources += [
      "v8_test_environment.cpp",
      "v8_test_environment.h",
    ]
    deps += [
      "../fxjs",
      "//v8",
      "//v8:v8_libplatform",
    ]
    configs += [ "//v8:external_startup_data" ]
  }
  if (pdf_enable_xfa) {
    sources += [
      "xfa_test_environment.cpp",
      "xfa_test_environment.h",
    ]
    deps += [
      "../fxjs:gc",
      "../xfa/fgas/font",
    ]
  }
}

source_set("unit_test_support") {
  testonly = true
  sources = []
  deps = []
  configs += [
    "../:pdfium_strict_config",
    "../:pdfium_noshorten_config",
  ]
  public_deps = [
    ":test_environments",
    ":test_support",
  ]
  if (pdf_enable_v8) {
    sources += [
      "fxv8_unittest.cpp",
      "fxv8_unittest.h",
    ]
    deps += [
      "../fxjs",
      "//testing/gtest",
    ]
    configs += [ "//v8:external_startup_data" ]
    if (pdf_enable_xfa) {
      sources += [
        "fxgc_unittest.cpp",
        "fxgc_unittest.h",
      ]
      deps += [
        "../fxjs:gc",
        "//testing/gtest",
      ]
    }
  }
}

source_set("embedder_test_support") {
  testonly = true
  sources = [
    "embedder_test.cpp",
    "embedder_test.h",
    "embedder_test_constants.cpp",
    "embedder_test_constants.h",
    "embedder_test_environment.cpp",
    "embedder_test_environment.h",
    "embedder_test_mock_delegate.h",
    "embedder_test_timer_handling_delegate.h",
    "fake_file_access.cpp",
    "fake_file_access.h",
    "range_set.cpp",
    "range_set.h",
    "utils/compare_coordinates.cc",
    "utils/compare_coordinates.h",
  ]
  deps = [
    "../:pdfium_public_headers",
    "../core/fdrm",
    "../core/fxge",
    "../fpdfsdk",
    "//testing/gmock",
    "//testing/gtest",
  ]
  public_deps = [
    ":test_environments",
    ":test_support",
    "../core/fxcrt",
  ]
  configs += [
    "../:pdfium_strict_config",
    "../:pdfium_noshorten_config",
  ]
  visibility = [ "../*" ]
  if (pdf_enable_v8) {
    sources += [
      "external_engine_embedder_test.cpp",
      "external_engine_embedder_test.h",
      "js_embedder_test.cpp",
      "js_embedder_test.h",
    ]
    deps += [
      "../fxjs",
      "//v8",
      "//v8:v8_libplatform",
    ]
    configs += [ "//v8:external_startup_data" ]
    if (pdf_enable_xfa) {
      sources += [
        "xfa_js_embedder_test.cpp",
        "xfa_js_embedder_test.h",
      ]
      deps += [
        "../fpdfsdk",
        "../fpdfsdk/fpdfxfa",
        "../xfa/fxfa",
        "../xfa/fxfa/parser",
      ]
    }
  }
}

config("pdfium_test_config") {
  cflags = []
  ldflags = []
  defines = []
  include_dirs = [ ".." ]
  if (pdf_use_skia) {
    defines += [ "PDF_ENABLE_SKIA" ]
  }
  if (is_asan) {
    defines += [ "PDF_ENABLE_ASAN" ]
  }
  if (pdf_use_partition_alloc) {
    defines += [ "PDF_USE_PARTITION_ALLOC" ]
  }
  if (enable_callgrind) {
    defines += [ "ENABLE_CALLGRIND" ]
  }
  if (build_with_chromium) {
    defines += [ "BUILD_WITH_CHROMIUM" ]
  }
}

executable("pdfium_test") {
  testonly = true
  sources = [
    "helpers/dump.cc",
    "helpers/dump.h",
    "helpers/event.cc",
    "helpers/event.h",
    "helpers/page_renderer.cc",
    "helpers/page_renderer.h",
    "helpers/write.cc",
    "helpers/write.h",
    "pdfium_test.cc",
  ]

  # Note: One should write programs that depend on ../:pdfium. Whereas this
  # test program does not set a good example, and depends on PDFium internals,
  # as well as test support code, for convenience.
  deps = [
    "../:pdfium_public_headers",
    "../fpdfsdk",
    "../testing:test_support",
    "../testing/image_diff",
    "//build/win:default_exe_manifest",
  ]
  configs += [
    ":pdfium_test_config",
    "../:pdfium_common_config",
  ]

  if (is_win) {
    sources += [
      "helpers/win32/com_factory.cc",
      "helpers/win32/com_factory.h",
    ]
  }

  if (pdf_enable_v8) {
    deps += [
      "//v8:v8_headers",
      "//v8:v8_libplatform",
    ]
    include_dirs = [ "//v8" ]
    configs += [ "//v8:external_startup_data" ]
  }
  if (pdf_use_skia) {
    deps += [ "//skia" ]
    if (build_with_chromium) {
      sources += [
        "chromium_support/discardable_memory_allocator.cc",
        "chromium_support/discardable_memory_allocator.h",
      ]
      deps += [ "//base/test:test_support" ]
    }
  }

  if (!build_with_chromium) {
    assert_no_deps = [ "//testing/gtest/*" ]
  }
}

# Dummy group to keep satisfy references from //build.
group("test_scripts_shared") {
}
