/*
* 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.
*/

// used for unit tests
apply plugin: 'groovy'

def spockVersion = '1.0-groovy-2.4'
def powermockVersion = "1.6.1"

dependencies {

    testCompile "org.codehaus.groovy:groovy-all:2.4.1"
    testCompile "org.spockframework:spock-core:$spockVersion"

    testCompile 'cglib:cglib-nodep:2.2.2'               // need to mock classes

    // useful to mock out statics and final classes in Java.
    testCompile "org.powermock:powermock-module-junit4:$powermockVersion"
    testCompile "org.powermock:powermock-module-junit4-rule:$powermockVersion"
    testCompile "org.powermock:powermock-classloading-xstream:$powermockVersion"
    testCompile "org.powermock:powermock-api-mockito:$powermockVersion"
}

// for spock to live in test java tree
sourceSets {
    test {
        groovy { srcDir 'src/test/java' }
    }
}

