/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */
buildscript {
    ext.kotlin_version = '1.3.21'

    repositories {
        mavenCentral()
        maven {
            url 'http://repository.jetbrains.com/all'
        }
        maven {
            url "https://jetbrains.jfrog.io/jetbrains/spek-snapshots"
        }
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0'
    }
}

apply plugin: 'kotlin'
apply plugin: 'java'
apply plugin: 'org.junit.platform.gradle.plugin'

junitPlatform {
    filters {
        engines {
            include 'spek'
        }
    }
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
    jcenter()
    maven { url "https://plugins.gradle.org/m2/" }
    maven { url 'http://repository.jetbrains.com/all' }
    maven { url "https://jetbrains.jfrog.io/jetbrains/spek-snapshots" }
    maven { url "http://dl.bintray.com/jetbrains/spek" }
    maven { url "http://oss.jfrog.org/artifactory/oss-snapshot-local" }


}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-reflect"
    compile('com.uchuhimo:konf:0.11') {
        exclude group: 'org.eclipse.jgit'
    }

    compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.9.8'
    compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.9.8'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.8'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.8'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.8'

    testCompile 'org.jetbrains.spek:spek-api:1.1.5'
    testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
    testRuntime 'org.jetbrains.spek:spek-junit-platform-engine:1.1.5'

    // spek requires kotlin-reflect, can be omitted if already in the classpath
    testRuntimeOnly "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"


    testImplementation 'org.junit.platform:junit-platform-runner:1.0.0'
    testImplementation 'org.junit.platform:junit-platform-launcher:1.0.0'
    testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.0'
}

sourceSets {
    test {
        resources.srcDirs += [file('src/test/resources')]
    }
}

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
