buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        // NOTE: Always use fixed version codes not dynamic ones, e.g. 0.7.3 instead of 0.7.+, see README for more information
        classpath 'com.novoda:gradle-android-test-plugin:0.10.4'
    }
}

apply plugin: 'java'
apply plugin: 'android-test'
apply plugin: 'jacoco'

dependencies {
    testCompile 'junit:junit:4.11'
    testCompile 'com.google.android:android:4.1.1.4'
    testCompile('com.squareup:fest-android:1.0.8') { exclude module: 'support-v4' }
    testCompile 'org.apache.maven:maven-ant-tasks:2.1.3'
    testCompile ('org.robolectric:robolectric:2.4') {
        exclude module: 'classworlds'
        exclude module: 'maven-artifact'
        exclude module: 'maven-artifact-manager'
        exclude module: 'maven-error-diagnostics'
        exclude module: 'maven-model'
        exclude module: 'maven-plugin-registry'
        exclude module: 'maven-profile'
        exclude module: 'maven-project'
        exclude module: 'maven-settings'
        exclude module: 'nekohtml'
        exclude module: 'plexus-container-default'
        exclude module: 'plexus-interpolation'
        exclude module: 'plexus-utils'
        exclude module: 'support-v4' // crazy but my android studio don't like this dependency and to fix it remove .idea and re import project
        exclude module: 'wagon-file'
        exclude module: 'wagon-http-lightweight'
        exclude module: 'wagon-http-shared'
        exclude module: 'wagon-provider-api'
    }
}

test {
    exclude '**/*$*'
}

android {
    projectUnderTest ':OpenKeychain'
}

jacoco {
    toolVersion = "0.7.2.201409121644"
}


def coverageSourceDirs = [
        '../OpenKeychain/src/main/java',
        '../OpenKeychain/src/gen',
        '../OpenKeychain/build/source/apt/debug',
        '../OpenKeychain/build/source/generated/buildConfig/debug',
        '../OpenKeychain/build/source/generated/r/debug'
    ]

jacocoTestReport {
    reports {
        xml.enabled = true
        html.destination "${buildDir}/jacocoHtml"
    }
    // class R is used, but usage will not be covered, so ignore this class from report
    classDirectories = fileTree(dir: '../OpenKeychain/build/intermediates/classes/debug/org/sufficientlysecure/keychain', exclude: [ 'R*.class' ])
    additionalSourceDirs = files(coverageSourceDirs)
    executionData = files('build/jacoco/testDebug.exec')
}

// new workaround to force add custom output dirs for android studio
task addTest {
    def file = file(project.name + ".iml")
    doLast {
        try {
            def parsedXml = (new XmlParser()).parse(file)
            def node = parsedXml.component[1]
            def outputNode = parsedXml.component[1].output[0]
            def outputTestNode = parsedXml.component[1].'output-test'[0]
            def rewrite = false

            new Node(node, 'sourceFolder', ['url': 'file://$MODULE_DIR$/' + "${it}", 'isTestSource': "true"])

            if(outputNode == null) {
                new Node(node, 'output', ['url': 'file://$MODULE_DIR$/build/resources/testDebug'])
            } else {
                if(outputNode.attributes['url'] != 'file://$MODULE_DIR$/build/resources/testDebug') {
                    outputNode.attributes = ['url': 'file://$MODULE_DIR$/build/resources/testDebug']
                    rewrite = true
                }
            }

            if(outputTestNode == null) {
                new Node(node, 'output-test', ['url': 'file://$MODULE_DIR$/build/test-classes/debug'])
            } else {
                if(outputTestNode.attributes['url'] != 'file://$MODULE_DIR$/build/test-classes/debug') {
                    outputTestNode.attributes = ['url': 'file://$MODULE_DIR$/build/test-classes/debug']
                    rewrite = true
                }
            }

            if(rewrite) {
                def writer = new StringWriter()
                new XmlNodePrinter(new PrintWriter(writer)).print(parsedXml)
                file.text = writer.toString()
            }
        } catch (FileNotFoundException e) {
            // iml not found, common on command line only builds
        }

    }
}

// always do the addtest on prebuild
gradle.projectsEvaluated {
    testDebugClasses.dependsOn(addTest)
}