# 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("//build/config/android/rules.gni")

java_group("espresso_all_java") {
  testonly = true
  deps = [
    ":espresso_contrib_java",
    ":espresso_core_java",
    ":espresso_idling_java",
    ":espresso_intents_java",
    ":espresso_web_java",
  ]
}

android_java_prebuilt("espresso_contrib_java") {
  testonly = true
  jar_path = "lib/espresso-contrib-release-no-dep.jar"
  deps = [
    ":espresso_core_java",
    "//third_party/guava:guava_android_java",
    "//third_party/hamcrest:hamcrest_core_java",
  ]
}

android_java_prebuilt("espresso_core_java") {
  testonly = true
  jar_path = "lib/espresso-core-release-no-dep.jar"
  deps = [
    "//third_party/android_tools:android_support_annotations_java",
    "//third_party/guava:guava_android_java",
    "//third_party/hamcrest:hamcrest_core_java",
    "//third_party/javax_inject:javax_inject_java",
  ]
}

android_java_prebuilt("espresso_idling_java") {
  testonly = true
  jar_path = "lib/espresso-idling-resource-release-no-dep.jar"
}

android_java_prebuilt("espresso_intents_java") {
  testonly = true
  jar_path = "lib/espresso-intents-release-no-dep.jar"
  deps = [
    "//third_party/android_support_test_runner:runner_java",
    "//third_party/guava:guava_android_java",
    "//third_party/hamcrest:hamcrest_core_java",
  ]
}

android_java_prebuilt("espresso_web_java") {
  testonly = true
  jar_path = "lib/espresso-web-release-no-dep.jar"
  deps = [
    ":espresso_core_java",
    "//third_party/guava:guava_android_java",
    "//third_party/hamcrest:hamcrest_core_java",
  ]
}
