/*
 * 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(check: "Ensure the environment is configured") {
  tempDir = p("teamcity.build.tempDir")
}

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

  loadProject()
  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([check, compile])

  def classpathFile = "$home/junit.classpath"
  List<String> testRuntimeClasspath = projectBuilder.moduleRuntimeClasspath(findModule("community-main"), true)
  new File(classpathFile).text = testRuntimeClasspath.findAll({ new File((String)it).exists() }).join('\n')

  testcases.each { testCase ->
    ant.junit(fork: "yes", showoutput: "true", logfailedtests: false) {
      jvmarg(value: "-Dclasspath.file=${classpathFile}")
      pass("idea.test.group")
      pass("idea.test.patterns")
      pass("idea.fast.only")
      pass("idea.coverage.enabled.build")
      pass("teamcity.build.tempDir")
      pass("teamcity.tests.recentlyFailedTests.file")
      jvmarg(value: "-Didea.platform.prefix=Idea")

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

      jvmarg(value: "-Dbootstrap.testcases=$testCase")

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

      classpath {
        projectBuilder.moduleRuntimeClasspath(findModule("tests_bootstrap"), false).each {
          pathelement(location: it)
        }
        pathelement(location: "${jdkHome}/lib/tools.jar")
      }

      test(name: 'com.intellij.tests.BootstrapTests')
    }
  }
}

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