# 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/jumbo.gni")
import("//build/config/ui.gni")
import("//testing/test.gni")
import("//ui/display/display.gni")

jumbo_component("display") {
  sources = [
    "display.cc",
    "display.h",
    "display_change_notifier.cc",
    "display_change_notifier.h",
    "display_export.h",
    "display_finder.cc",
    "display_finder.h",
    "display_layout.cc",
    "display_layout.h",
    "display_layout_builder.cc",
    "display_layout_builder.h",
    "display_list.cc",
    "display_list.h",
    "display_observer.cc",
    "display_observer.h",
    "display_switches.cc",
    "display_switches.h",
    "ios/screen_ios.mm",
    "mac/screen_mac.mm",
    "screen.cc",
    "screen.h",
    "screen_android.cc",
    "screen_aura.cc",
    "screen_base.cc",
    "screen_base.h",
    "unified_desktop_utils.cc",
    "unified_desktop_utils.h",
    "win/color_profile_reader.cc",
    "win/color_profile_reader.h",
    "win/display_info.cc",
    "win/display_info.h",
    "win/dpi.cc",
    "win/dpi.h",
    "win/scaling_util.cc",
    "win/scaling_util.h",
    "win/screen_win.cc",
    "win/screen_win.h",
    "win/screen_win_display.cc",
    "win/screen_win_display.h",
    "win/uwp_text_scale_factor.cc",
    "win/uwp_text_scale_factor.h",
  ]

  configs += [ "//build/config/compiler:wexit_time_destructors" ]

  defines = [ "DISPLAY_IMPLEMENTATION" ]

  public_deps = [
    "//ui/display/types",
    "//ui/gfx:color_space",
    "//ui/gfx:gfx",
  ]

  deps = [
    "//base",
    "//mojo/public/cpp/bindings:struct_traits",
    "//ui/display/util",
    "//ui/gfx",
    "//ui/gfx/geometry",
  ]

  if (is_win) {
    # Don't conflict with Windows' "display.dll".
    output_name = "ui_display"
  }

  if (!use_aura) {
    sources -= [ "screen_aura.cc" ]
  }

  if (is_mac) {
    libs = [
      "AppKit.framework",
      "CoreGraphics.framework",
    ]
  }
}

component("display_manager_test_api") {
  testonly = true
  sources = [
    "test/display_manager_test_api.cc",
    "test/display_manager_test_api.h",
  ]

  defines = [ "DISPLAY_IMPLEMENTATION" ]

  public_deps = [
    "//ui/display/manager",
  ]

  deps = [
    "//base",
    "//ui/display",
    "//ui/display/types",
  ]
}

jumbo_static_library("test_support") {
  testonly = true
  sources = [
    "test/display_matchers.cc",
    "test/display_matchers.h",
    "test/display_test_util.h",
    "test/scoped_screen_override.cc",
    "test/scoped_screen_override.h",
    "test/test_screen.cc",
    "test/test_screen.h",
    "win/test/screen_util_win.cc",
    "win/test/screen_util_win.h",
  ]

  if (build_display_configuration) {
    sources += [
      "manager/test/action_logger.cc",
      "manager/test/action_logger.h",
      "manager/test/action_logger_util.cc",
      "manager/test/action_logger_util.h",
      "manager/test/test_display_layout_manager.cc",
      "manager/test/test_display_layout_manager.h",
      "manager/test/test_native_display_delegate.cc",
      "manager/test/test_native_display_delegate.h",
      "manager/test/touch_device_manager_test_api.cc",
      "manager/test/touch_device_manager_test_api.h",
      "manager/test/touch_transform_controller_test_api.cc",
      "manager/test/touch_transform_controller_test_api.h",
    ]
  }

  public_deps = [
    ":display",
    "//ui/display/manager",
  ]
  deps = [
    "//base",
    "//testing/gmock",
    "//ui/display/types",
    "//ui/events/devices",
    "//ui/gfx",
    "//ui/gfx:test_support",
    "//ui/gfx/geometry",
  ]
}

# This test covers all testable components in display.
test("display_unittests") {
  sources = [
    "display_change_notifier_unittest.cc",
    "display_layout_builder_unittest.cc",
    "display_layout_unittest.cc",
    "display_list_unittest.cc",
    "display_unittest.cc",
    "manager/display_manager_utilities_unittest.cc",
    "manager/fake_display_snapshot_unittest.cc",
    "manager/json_converter_unittest.cc",
    "manager/managed_display_info_unittest.cc",
    "mojo/display_struct_traits_unittest.cc",
    "screen_unittest.cc",
    "unified_desktop_utils_unittests.cc",
    "util/display_util_unittest.cc",
    "util/edid_parser_unittest.cc",
    "win/scaling_util_unittest.cc",
    "win/screen_win_unittest.cc",
  ]

  if (build_display_configuration) {
    sources += [
      "manager/apply_content_protection_task_unittest.cc",
      "manager/configure_displays_task_unittest.cc",
      "manager/display_change_observer_unittest.cc",
      "manager/display_configurator_unittest.cc",
      "manager/display_utils_unittest.cc",
      "manager/query_content_protection_task_unittest.cc",
      "manager/touch_device_manager_unittest.cc",
      "manager/touch_transform_controller_unittest.cc",
      "manager/update_display_configuration_task_unittest.cc",
    ]
  }

  deps = [
    ":display",
    ":display_manager_test_api",
    ":test_support",
    "//base",
    "//base/test:test_support",
    "//cc/base",
    "//mojo/core/test:run_all_unittests",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/display/manager",
    "//ui/display/mojo:interfaces",
    "//ui/display/types",
    "//ui/display/util",
    "//ui/events:test_support",
    "//ui/events/devices",
    "//ui/gfx:test_support",
    "//ui/gfx/geometry",
  ]

  if (is_android) {
    # Do not run display_change_notifier_unittest.cc on Android because it
    # does not compile display_observer.cc
    sources -= [ "display_change_notifier_unittest.cc" ]
  }

  if (is_chromeos) {
    deps += [ "//chromeos" ]
  }
}
