/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

apply plugin: 'com.android.library'

version = testingSupportLibVersion
group = 'com.android.support.test'

configurations {
    androidTestCompile.exclude module: 'exposed-instrumentation-api-publish'
}

dependencies {
    provided project(path: ':exposed-instrumentation-api-provided', configuration: 'androidJar')
    publish project(path: ':exposed-instrumentation-api-publish', configuration: 'androidJar')

    compile 'junit:junit:4.12'
    compile 'com.android.support:support-annotations:'+supportLibVersion
    androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
    androidTestCompile 'org.hamcrest:hamcrest-integration:1.3'
    androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
}

android {

    lintOptions {
        abortOnError false
    }

    packagingOptions {
        exclude 'LICENSE.txt'
    }

    defaultConfig {
        testApplicationId "android.support.test.tests"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
}

apply from: "../publish.gradle"
apply from: "../contTest.gradle"
