plugins {
    id 'java'
    id 'idea'
    id "org.sonarqube" version "3.2.0"
    id 'jacoco'
}

repositories {
    mavenCentral()
    jcenter()
}

test {
    useJUnitPlatform {
        includeEngines 'jqwik', 'junit-jupiter'
    }

    maxParallelForks = 1
}



// Fancy live test output (from https://stackoverflow.com/questions/3963708/gradle-how-to-display-test-results-in-the-console-in-real-time)

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

tasks.withType(Test) {
    testLogging {
        // set options for log level LIFECYCLE
        events TestLogEvent.FAILED,
               TestLogEvent.PASSED,
               TestLogEvent.SKIPPED
               // TestLogEvent.STANDARD_OUT
        exceptionFormat TestExceptionFormat.FULL
        showExceptions true
        showCauses true
        showStackTraces true

        // set options for log level DEBUG and INFO
        debug {
            events TestLogEvent.STARTED,
                   TestLogEvent.FAILED,
                   TestLogEvent.PASSED,
                   TestLogEvent.SKIPPED,
                   TestLogEvent.STANDARD_ERROR
                   TestLogEvent.STANDARD_OUT
            exceptionFormat TestExceptionFormat.FULL
        }
        // info.events = debug.events
        // info.exceptionFormat = debug.exceptionFormat

        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))
            }
        }
    }
}


jacocoTestReport {
    reports {
        html.enabled true
        xml.enabled true
        xml.destination file("${buildDir}/reports/jacoco.xml")
    }
}

plugins.withType(JacocoPlugin) {
    tasks["test"].finalizedBy 'jacocoTestReport'
}

sonarqube {
    properties {
        property "sonar.java.coveragePlugin", "jacoco"
        property "sonar.host.url", "https://sonarqube.yandrik.dev"
        property "sonar.coverage.jacoco.xmlReportPath", "${buildDir}/reports/jacoco.xml"
    }
}



dependencies {
    implementation 'com.fasterxml.jackson.core:jackson-core:2.12.4'
    implementation 'com.fasterxml.jackson.core:jackson-annotations:2.12.4'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.4'

    implementation "org.hibernate.validator:hibernate-validator:7.0.1.Final"
    implementation "org.glassfish:jakarta.el:4.0.1"

    implementation "org.tinylog:tinylog-api:2.4.0-M1"
    implementation "org.tinylog:tinylog-impl:2.4.0-M1"

    testImplementation 'net.jqwik:jqwik:1.5.3'
    testImplementation "org.junit.jupiter:junit-jupiter-api:5.8.0-M1"
    testImplementation 'org.mockito:mockito-core:3.11.2'
    testImplementation 'org.assertj:assertj-core:3.20.2'
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.8.0-M1"
}

tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}