apply plugin: 'java'

configurations {
    // similar to 'default', export compile-time dependencies
    host.extendsFrom(hostCompile)
    target.extendsFrom(targetCompile)
}

sourceSets {
    host {
        java {
            srcDirs = ['src/main/java']
        }
    }

    target {
        java {
            srcDirs = ['src/main/java']
            include 'org/**',
                    'junit/extensions/**',
                    // remove these packages since they are in android.test.runner
                    // and proguard complains if they are present
                    // 'junit/runner/**',
                    // 'junit/textui/**',
                    'junit/framework/ComparisonCompactor.java',
                    'junit/framework/JUnit4TestAdapterCache.java',
                    'junit/framework/JUnit4TestAdapter.java',
                    'junit/framework/JUnit4TestCaseFacade.java'
        }
    }
}

task targetJar(type: Jar) {
    from sourceSets.target.output
    dependsOn targetClasses
    baseName "junit4"
    classifier "target"
}

task hostJar(type: Jar) {
    from sourceSets.host.output
    dependsOn hostClasses
    baseName "junit4"
    classifier "host"
}

artifacts {
    host hostJar
    target targetJar
}

if (project.hasProperty("usePrebuilts") && project.usePrebuilts == "true") {
    repositories {
        maven { url '../../prebuilts/tools/common/m2/repository' }
    }

    dependencies {
        targetCompile getAndroidPrebuilt('4')
        targetCompile 'org.hamcrest:hamcrest-core:1.1'

        hostCompile 'org.hamcrest:hamcrest-core:1.1'
    }
} else {
    dependencies {
        targetCompile getAndroidPrebuilt('4')
        targetCompile project(':hamcrest')

        hostCompile project(':hamcrest')
    }
}
