import org.gradle.api.tasks.testing.logging.TestLogEvent

dependencies {
    testImplementation 'org.hamcrest:hamcrest:3.0'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.14.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-params:5.14.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.14.2'
    testRuntimeOnly "org.junit.platform:junit-platform-launcher"
}

tasks.withType(Test).configureEach {
    jvmArgs += ["-Xmx2g"]
    useJUnitPlatform()
    testLogging {
        events TestLogEvent.FAILED,
               TestLogEvent.PASSED,
               TestLogEvent.SKIPPED,
               TestLogEvent.STANDARD_OUT,
               TestLogEvent.STANDARD_ERROR,
               TestLogEvent.STARTED

        exceptionFormat = 'full'
        showExceptions = true
        showCauses = true
        showStandardStreams = true
    }

    outputs.upToDateWhen { false }

    afterSuite { desc, result ->
        if (!desc.parent) { // will match the outermost suite
            def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} passed, ${result.failedTestCount} failed, ${result.skippedTestCount} skipped)"
            def startItem = '|  ', endItem = '  |'
            def repeatLength = startItem.length() + output.length() + endItem.length()
            println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength))
        }
    }
}
