/*
 * Copyright 2000-2012 JetBrains s.r.o.
 *
 * Licensed 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.
 */
import static org.jetbrains.jps.idea.IdeaProjectLoader.guessHome

includeTargets << new File("${guessHome(this)}/build/scripts/utils.gant")
includeTargets << new File("${guessHome(this)}/build/scripts/cucumber-tests.gant")

requireProperty("out", "$home/out")

target(compile: "Compile project") {
  ant.delete(failonerror: false) {
    fileset(dir: "$home/reports")
    fileset(dir: "$home/bin", includes: "*.hprof")
  }

  loadProject()
  projectBuilder.useInProcessJavac = true
  projectBuilder.targetFolder = out
  projectBuilder.cleanOutput()
  projectBuilder.buildAll()
}

private pass(String prop) {
  if (isDefined(prop)) {
    ant.jvmarg(value: "-D$prop=${p(prop)}")
  }
}

target('run_tests': 'Run java tests') {
  depends([compile])

  ant.junit(fork: "yes", showoutput: "true", logfailedtests:false) {
    pass("idea.test.group")
    pass("idea.test.patterns")
    pass("idea.fast.only")
    pass("teamcity.build.tempDir")
    pass("teamcity.tests.recentlyFailedTests.file")
    jvmarg (value: "-Didea.platform.prefix=Idea")
    jvmarg (value: "-Djava.system.class.loader=com.intellij.util.lang.UrlClassLoader")

    System.getProperties().entrySet().each {
      if (it.key.startsWith("pass.")) {
        def trimmed = it.key.substring("pass.".length());
        jvmarg(value: "-D${trimmed}=${it.value}");
      };
    }

    commonJvmArgs().each { jvmarg(value: it) }

    if (isDefined("jvm_args")) {
      jvm_args.each { jvmarg(value: it) }
    }

    classpath {
      projectBuilder.moduleRuntimeClasspath(findModule("community-main"), true).each {
        pathelement(location: it)
      }
      pathelement(location: "${jdkHome}/lib/tools.jar")
    }

    testcases.each {
      test (name: it)
    }
  }
}

target('default' : "Run all tests") {
  depends([compile, run_tests, run_cucumber_tests])
}