# 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("//remoting/build/config/remoting_build.gni")
import("//remoting/remoting_locales.gni")

group("all") {
  testonly = true

  deps = [
    ":ios_core",
    "app:all",
  ]
}

group("all_test") {
  testonly = true

  deps = [ ":ios_core_unit_tests" ]
}

source_set("ios_core") {
  sources = [
    "client_gestures.h",
    "client_gestures.mm",
    "client_keyboard.h",
    "client_keyboard.mm",
  ]

  public_deps = [
    "//remoting/ios/domain",
    "//remoting/ios/facade",
    "//remoting/ios/session",
    "//third_party/webrtc_overrides:webrtc_component",
  ]

  deps = [
    "//base",
    "//remoting/client",
    "//remoting/client/input",
    "//remoting/protocol",
  ]

  frameworks = [
    "CoreGraphics.framework",
    "GLKit.framework",
    "OpenGLES.framework",
  ]

  configs += [ "//build/config/compiler:enable_arc" ]
}

source_set("ios_core_unit_tests") {
  testonly = true

  include_dirs = [
    "$root_gen_dir",
    "//third_party/protobuf/src",
  ]

  sources = []

  deps = [
    ":ios_core",
    "//testing/gtest",
  ]

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

  data = []
}

# test

test("ios_remoting_unittests") {
  deps = [
    "//base/test:test_support",
    "//ios/third_party/material_components_ios:material_components_ios+link",
    "//remoting/base:run_all_unittests",
    "//remoting/ios/audio:unit_tests",
    "//remoting/ios/facade:unit_tests",
    "//remoting/ios/persistence:unit_tests",
  ]

  foreach(locale, remoting_locales_with_underscores) {
    deps += [ ":unittests_locale_${locale}_bundle_data" ]
  }

  bundle_deps = [
    "//ios/third_party/material_components_ios:material_components_ios+bundle",
  ]
}

foreach(locale, remoting_locales_with_underscores) {
  bundle_data("unittests_locale_${locale}_bundle_data") {
    sources = [ "$root_out_dir/remoting/resources/$locale.lproj/locale.pak" ]
    outputs = [ "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}" ]
    public_deps = [ "//remoting/resources:copy_locales" ]
  }
}
