/* sbt -- Simple Build Tool
 * Copyright 2009  Steven Blundy, Mark Harrah
 */
package sbt

trait trait IntegrationTesting extends java.lang.Object with ScalaObjectIntegrationTesting
{
	/** Override to provide pre-suite setup. */
	protected def => Option[String]pretests: Option[String]Option[String] = object NoneNone
	/** Override to provide post-suite cleanup. */
	protected def => Option[String]posttests: Option[String]Option[String] = object NoneNone
}

trait trait ScalaIntegrationTesting extends java.lang.Object with sbt.IntegrationTesting with ScalaObjectScalaIntegrationTesting extends sbt.IntegrationTestingIntegrationTesting
{
	self: ScalaProject =>

	protected def (Iterable[sbt.TestFramework],sbt.PathFinder,sbt.CompileAnalysis,=> Seq[ScalaIntegrationTesting.this.TestOption])ScalaIntegrationTesting.this.TaskintegrationTestTask(Iterable[sbt.TestFramework]frameworks: Iterable[sbt.TestFramework]Iterable[TestFramework], sbt.PathFinderclasspath: sbt.PathFinderPathFinder, sbt.CompileAnalysisanalysis: sbt.CompileAnalysisCompileAnalysis, => Seq[ScalaIntegrationTesting.this.TestOption]options: => Seq[TestOption]) =
		(=> Option[String])ScalaIntegrationTesting.this.Tasktask{
			import Control._
			(=> String,sbt.Logger)(=> Option[String])Option[String]trapUnit(java.lang.String("Setup failed: ")"Setup failed: ", => sbt.Loggerlog)(=> Option[String]pretests) Option[String]match
			{
				Some[String]case Some(Stringmsg) => (String)Some[String]Some(Stringmsg)
				Option[String]case object NoneNone => (=> String,sbt.Logger)(=> Option[String])(=> Unit)Option[String]trapUnitAndFinally(java.lang.String("Exception in framework")"Exception in framework", => sbt.Loggerlog)((Iterable[sbt.TestFramework],sbt.PathFinder,sbt.CompileAnalysis,=> Seq[ScalaIntegrationTesting.this.TestOption])Option[String]executeIntegrationTests(Iterable[sbt.TestFramework]frameworks, sbt.PathFinderclasspath, sbt.CompileAnalysisanalysis, => Seq[ScalaIntegrationTesting.this.TestOption]options))(
					(=> String,sbt.Logger)(=> Option[String])Option[String]trapUnit(java.lang.String("Cleanup failed: ")"Cleanup failed: ", => sbt.Loggerlog)(=> Option[String]posttests) Unitmatch
					{
						Unitcase Some(Stringmsg) => => sbt.Loggerlog.(=> String)Uniterror(Stringmsg)
						Unitcase object NoneNone => Unit{}
					}
				)
			}
		}

	private def (Iterable[sbt.TestFramework],sbt.PathFinder,sbt.CompileAnalysis,=> Seq[ScalaIntegrationTesting.this.TestOption])Option[String]executeIntegrationTests(Iterable[sbt.TestFramework]frameworks: Iterable[sbt.TestFramework]Iterable[TestFramework], sbt.PathFinderclasspath: sbt.PathFinderPathFinder, sbt.CompileAnalysisanalysis: sbt.CompileAnalysisCompileAnalysis, => Seq[ScalaIntegrationTesting.this.TestOption]options: => Seq[TestOption]): Option[String]Option[String] =
		(Iterable[sbt.TestFramework],sbt.PathFinder,sbt.CompileAnalysis,=> Seq[ScalaIntegrationTesting.this.TestOption])Option[String]doTests(Iterable[sbt.TestFramework]frameworks, sbt.PathFinderclasspath, sbt.CompileAnalysisanalysis, => Seq[ScalaIntegrationTesting.this.TestOption]options)
}

/** A fully featured integration testing that may be mixed in with any subclass of <code>BasicScalaProject</code>.
 * Pre-suite setup and post-suite cleanup are provide by overriding <code>pretests</code> and <code>posttests</code> respectively.*/
trait trait BasicScalaIntegrationTesting extends java.lang.Object with sbt.ScalaIntegrationTesting with sbt.IntegrationTestPaths with sbt.BasicDependencyProject with ScalaObjectBasicScalaIntegrationTesting extends sbt.ScalaIntegrationTestingScalaIntegrationTesting with sbt.IntegrationTestPathsIntegrationTestPaths with sbt.BasicDependencyProjectBasicDependencyProject
{
	self: BasicScalaProject =>

	import BasicScalaIntegrationTesting._
	
	lazy val BasicScalaIntegrationTesting.this.TaskintegrationTestCompile = => BasicScalaIntegrationTesting.this.TaskintegrationTestCompileAction
	lazy val BasicScalaIntegrationTesting.this.TaskintegrationTest = => BasicScalaIntegrationTesting.this.TaskintegrationTestAction

	val sbt.CompileConditionalintegrationTestCompileConditional = sbt.CompileConditionalnew sbt.CompileConditionalCompileConditional(=> BasicScalaIntegrationTesting.this.IntegrationTestCompileConfigintegrationTestCompileConfiguration)

	protected def => BasicScalaIntegrationTesting.this.TaskintegrationTestAction = (Iterable[sbt.TestFramework],sbt.PathFinder,sbt.CompileAnalysis,=> Seq[BasicScalaIntegrationTesting.this.TestOption])BasicScalaIntegrationTesting.this.TaskintegrationTestTask(=> Iterable[sbt.TestFramework]integrationTestFrameworks, => sbt.PathFinderintegrationTestClasspath, => sbt.CompileConditionalintegrationTestCompileConditional.=> BasicScalaIntegrationTesting.this.integrationTestCompileConditional.AnalysisTypeanalysis, => Seq[BasicScalaIntegrationTesting.this.TestOption]integrationTestOptions) (BasicScalaIntegrationTesting.this.ManagedTask*)BasicScalaIntegrationTesting.this.TaskdependsOn => BasicScalaIntegrationTesting.this.TaskintegrationTestCompile (String)BasicScalaIntegrationTesting.this.TaskdescribedAs => java.lang.StringIntegrationTestCompileDescription
	protected def => BasicScalaIntegrationTesting.this.TaskintegrationTestCompileAction = ()BasicScalaIntegrationTesting.this.TaskintegrationTestCompileTask() (BasicScalaIntegrationTesting.this.ManagedTask*)BasicScalaIntegrationTesting.this.TaskdependsOn => BasicScalaIntegrationTesting.this.Taskcompile (String)BasicScalaIntegrationTesting.this.TaskdescribedAs => java.lang.StringIntegrationTestDescription

	protected def ()BasicScalaIntegrationTesting.this.TaskintegrationTestCompileTask() = (=> Option[String])BasicScalaIntegrationTesting.this.Tasktask{ => sbt.CompileConditionalintegrationTestCompileConditional.=> Option[String]run }

	def => Seq[BasicScalaIntegrationTesting.this.TestOption]integrationTestOptions: Seq[BasicScalaIntegrationTesting.this.TestOption]Seq[TestOption] = object NilNil
	def => Seq[BasicScalaIntegrationTesting.this.CompileOption]integrationTestCompileOptions = => Seq[BasicScalaIntegrationTesting.this.CompileOption]testCompileOptions
	
	def => sbt.ConfigurationintegrationTestConfiguration = sbt.Configurationif(=> BooleanuseIntegrationTestConfiguration) object sbt.ConfigurationsConfigurations.=> sbt.ConfigurationIntegrationTest else object sbt.ConfigurationsConfigurations.=> sbt.ConfigurationTest
	def => sbt.PathFinderintegrationTestClasspath = (sbt.Configuration)sbt.PathFinderfullClasspath(=> sbt.ConfigurationintegrationTestConfiguration) (sbt.PathFinder)sbt.PathFinder+++ => sbt.PathFinderoptionalClasspath
	
	def => sbt.PathFinderintegrationTestSources = (sbt.PathFinder,sbt.FileFilter)sbt.PathFinderdescendents(=> sbt.PathintegrationTestScalaSourcePath, implicit sbt.Project.filter : (String)sbt.NameFilter"*.scala")
	def => java.lang.StringintegrationTestLabel = java.lang.String("integration-test")"integration-test"
	def => BasicScalaIntegrationTesting.this.IntegrationTestCompileConfigintegrationTestCompileConfiguration = BasicScalaIntegrationTesting.this.IntegrationTestCompileConfignew BasicScalaIntegrationTesting.this.IntegrationTestCompileConfigIntegrationTestCompileConfig

	def => Iterable[sbt.TestFramework]integrationTestFrameworks = => Iterable[sbt.TestFramework]testFrameworks
	override def => BooleanuseIntegrationTestConfiguration = Boolean(false)false
	abstract override def (sbt.Configuration)sbt.PathFinderfullUnmanagedClasspath(sbt.Configurationconfig: sbt.ConfigurationConfiguration) =
	{
		val sbt.PathFindersuperClasspath = (sbt.Configuration)sbt.PathFindersuper.(sbt.Configuration)sbt.PathFinderfullUnmanagedClasspath(sbt.Configurationconfig)
		sbt.PathFinderif(sbt.Configurationconfig (AnyRef)Boolean== => sbt.ConfigurationintegrationTestConfiguration)
			=> sbt.PathintegrationTestCompilePath (sbt.PathFinder)sbt.PathFinder+++ => sbt.PathintegrationTestResourcesPath (sbt.PathFinder)sbt.PathFinder+++ sbt.PathFindersuperClasspath
		else
			sbt.PathFindersuperClasspath
	}

	class class IntegrationTestCompileConfig extends BasicScalaIntegrationTesting.this.BaseCompileConfig with ScalaObjectIntegrationTestCompileConfig extends BasicScalaIntegrationTesting.this.BaseCompileConfigBaseCompileConfig
	{
		def => java.lang.Stringlabel = => java.lang.StringintegrationTestLabel
		def => sbt.PathFindersources = => sbt.PathFinderintegrationTestSources
		def => sbt.PathoutputDirectory = => sbt.PathintegrationTestCompilePath
		def => sbt.PathFinderclasspath = => sbt.PathFinderintegrationTestClasspath
		def => sbt.PathanalysisPath = => sbt.PathintegrationTestAnalysisPath
		def => Seq[String]options = => Seq[BasicScalaIntegrationTesting.this.CompileOption]integrationTestCompileOptions.((BasicScalaIntegrationTesting.this.CompileOption) => String)Seq[String]map(BasicScalaIntegrationTesting.this.CompileOption_.=> StringasString)
		def => Iterable[String]testDefinitionClassNames = => Iterable[sbt.TestFramework]integrationTestFrameworks.((sbt.TestFramework) => String)Iterable[String]map(sbt.TestFramework_.=> StringtestSuperClassName)
	}
}

object object sbt.BasicScalaIntegrationTestingBasicScalaIntegrationTesting
{
	val java.lang.StringIntegrationTestCompileDescription = java.lang.String("Compiles integration test sources.")"Compiles integration test sources."
	val java.lang.StringIntegrationTestDescription = java.lang.String("Runs all integration tests detected during compilation.")"Runs all integration tests detected during compilation."
}

trait trait IntegrationTestPaths extends java.lang.Object with sbt.BasicProjectPaths with ScalaObjectIntegrationTestPaths extends sbt.BasicProjectPathsBasicProjectPaths
{
	import IntegrationTestPaths._

	def => java.lang.StringintegrationTestDirectoryName = => java.lang.StringDefaultIntegrationTestDirectoryName
	def => java.lang.StringintegrationTestCompileDirectoryName = => java.lang.StringDefaultIntegrationTestCompileDirectoryName
	def => java.lang.StringintegrationTestAnalysisDirectoryName = => java.lang.StringDefaultIntegrationTestAnalysisDirectoryName

	def => sbt.PathintegrationTestSourcePath = => sbt.PathsourcePath (String)sbt.Path/ => java.lang.StringintegrationTestDirectoryName
	def => sbt.PathintegrationTestScalaSourcePath = => sbt.PathintegrationTestSourcePath (String)sbt.Path/ => java.lang.StringscalaDirectoryName
	def => sbt.PathintegrationTestResourcesPath = => sbt.PathintegrationTestSourcePath (String)sbt.Path/ => java.lang.StringresourcesDirectoryName

	def => sbt.PathintegrationTestCompilePath = => sbt.PathoutputPath (String)sbt.Path/ => java.lang.StringintegrationTestCompileDirectoryName
	def => sbt.PathintegrationTestAnalysisPath = => sbt.PathoutputPath (String)sbt.Path/ => java.lang.StringintegrationTestAnalysisDirectoryName
}

object object sbt.IntegrationTestPathsIntegrationTestPaths
{
	val java.lang.StringDefaultIntegrationTestDirectoryName = java.lang.String("it")"it"
	val java.lang.StringDefaultIntegrationTestCompileDirectoryName = java.lang.String("it-classes")"it-classes"
	val java.lang.StringDefaultIntegrationTestAnalysisDirectoryName = java.lang.String("it-analysis")"it-analysis"
}