# Copyright 2014 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("//build/config/ui.gni")
import("//sky/engine/config.gni")

visibility = [ "//sky/*" ]

platform_web_unittest_files = [
  "//sky/engine/platform/graphics/BitmapImageTest.cpp",
  "//sky/engine/platform/graphics/DeferredImageDecoderTest.cpp",
  "//sky/engine/platform/graphics/ImageDecodingStoreTest.cpp",
  "//sky/engine/platform/graphics/ImageFrameGeneratorTest.cpp",
  "//sky/engine/platform/graphics/OpaqueRectTrackingContentLayerDelegateTest.cpp",
  "//sky/engine/platform/graphics/test/MockImageDecoder.h",
  "//sky/engine/platform/graphics/test/MockWebGraphicsContext3D.h",
  "//sky/engine/platform/image-decoders/gif/GIFImageDecoderTest.cpp",
  "//sky/engine/platform/image-decoders/jpeg/JPEGImageDecoderTest.cpp",
]

component("web") {
  output_name = "sky_web"

  deps = [
    "//sky/engine/core",
    "//sky/engine/platform",

    # FIXME: v8_inspector should not depend on core types and be separate
    # from both web and core.
    "//sky/engine/v8_inspector",
  ]

  configs += [
    "//sky/engine:config",
    "//sky/engine:inside_blink",
    "//sky/engine:non_test_config",
  ]

  sources = [
    "AssertMatchingEnums.cpp",
    "ChromeClientImpl.cpp",
    "ChromeClientImpl.h",
    "CompositionUnderlineBuilder.h",
    "CompositionUnderlineVectorBuilder.cpp",
    "CompositionUnderlineVectorBuilder.h",
    "EditorClientImpl.cpp",
    "EditorClientImpl.h",
    "FrameLoaderClientImpl.cpp",
    "FrameLoaderClientImpl.h",
    "PageWidgetDelegate.cpp",
    "PageWidgetDelegate.h",
    "SpellCheckerClientImpl.cpp",
    "SpellCheckerClientImpl.h",
    "WebArrayBufferConverter.cpp",
    "WebArrayBufferView.cpp",
    "WebCache.cpp",
    "WebCachedURLRequest.cpp",
    "WebDocument.cpp",
    "WebElement.cpp",
    "WebFontDescription.cpp",
    "WebFontImpl.cpp",
    "WebFontImpl.h",
    "WebFrame.cpp",
    "WebGlyphCache.cpp",
    "WebHitTestResult.cpp",
    "WebImageCache.cpp",
    "WebImageDecoder.cpp",
    "WebInputEventConversion.cpp",
    "WebInputEventConversion.h",
    "Sky.cpp",
    "WebLeakDetector.cpp",
    "WebLocalFrameImpl.cpp",
    "WebLocalFrameImpl.h",
    "WebNode.cpp",
    "WebRange.cpp",
    "WebRuntimeFeatures.cpp",
    "WebScopedUserGesture.cpp",
    "WebScriptBindings.cpp",
    "WebScriptController.cpp",
    "WebSettingsImpl.cpp",
    "WebSettingsImpl.h",
    "WebTextCheckingCompletionImpl.cpp",
    "WebTextCheckingCompletionImpl.h",
    "WebTextCheckingResult.cpp",
    "WebTextInputInfo.cpp",
    "WebTextRun.cpp",
    "WebUserGestureIndicator.cpp",
    "WebUserGestureToken.cpp",
    "WebViewImpl.cpp",
    "WebViewImpl.h",
    "linux/WebFontRendering.cpp",
  ]

  if (is_component_build) {
    deps += [
      "//base/test:test_support",
      "//testing/gmock",
      "//testing/gtest",
      "//sky/engine/core:testing",
    ]

    configs -= [ "//sky/engine:non_test_config" ]

    sources += platform_web_unittest_files

    sources += [ "WebTestingSupport.cpp" ]
  }
}

source_set("test_support") {
  if (!is_component_build) {
    deps = [
      "//skia",
      "//sky/engine/core:testing",
      "//sky/engine/wtf",
    ]

    sources = [
      "WebTestingSupport.cpp",
    ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      "//sky/engine:config",
    ]
  }
}

test("sky_unittests") {
  deps = [
    "//base",
    "//base/test:test_support",
    "//base:i18n",
    "//sky/engine/testing/platform",
    "//sky/engine/wtf:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/zlib",
    "//url",
    "//v8",
    ":test_support",
    ":web",
  ]

  # TODO(abarth): This is a lie - this test is not embedded in an environment
  # that injects the system thunks, so system calls don't actually work. This
  # just tricks the linker into thinking that an implementation of these calls
  # will be injected at runtime so the link succeeds.
  deps += [ "//mojo/public/platform/native:system" ]

  sources = [
    "tests/RunAllTests.cpp",
  ]

  configs += [ "//sky/engine:config" ]

  if (!is_component_build) {
    deps += [ "//sky/engine/core" ]

    configs += [ "//sky/engine:inside_blink" ]

    sources += platform_web_unittest_files
  }
}
