mirror of https://github.com/sbt/sbt.git
64 lines
1.9 KiB
Scala
64 lines
1.9 KiB
Scala
import xsbt._
|
|
|
|
import org.scalacheck._
|
|
import Prop._
|
|
|
|
object TaskRunnerCircularTest extends Properties("TaskRunner Circular")
|
|
{
|
|
specify("Catches circular references", (intermediate: Int, workers: Int) =>
|
|
(workers > 0 && intermediate >= 0) ==> checkCircularReferences(intermediate, workers)
|
|
)
|
|
/*specify("Check root complete", (intermediate: Int, workers: Int) =>
|
|
(workers > 0 && intermediate >= 0) ==> checkRootComplete(intermediate, workers)
|
|
)*/
|
|
specify("Allows noncircular references", (intermediate: Int, workers: Int) =>
|
|
(workers > 0 && intermediate >= 0) ==> allowedReference(intermediate, workers)
|
|
)
|
|
final def allowedReference(intermediate: Int, workers: Int) =
|
|
{
|
|
val top = Task(intermediate) named("top")
|
|
def iterate(task: Task[Int]): Task[Int] =
|
|
task bind { t =>
|
|
if(t <= 0)
|
|
top
|
|
else
|
|
iterate(Task(t-1) named (t-1).toString)
|
|
}
|
|
try { checkResult(TaskRunner(iterate(top), workers), 0) }
|
|
catch { case e: CircularDependency => ("Unexpected exception: " + e) |: false }
|
|
}
|
|
final def checkCircularReferences(intermediate: Int, workers: Int) =
|
|
{
|
|
lazy val top = iterate(Task(intermediate) named"bottom", intermediate)
|
|
def iterate(task: Task[Int], i: Int): Task[Int] =
|
|
{
|
|
lazy val it: Task[Int] =
|
|
task bind { t =>
|
|
if(t <= 0)
|
|
top
|
|
else
|
|
iterate(Task(t-1) named (t-1).toString, i-1)
|
|
} named("it_" + i)
|
|
it
|
|
}
|
|
try { TaskRunner(top, workers); false }
|
|
catch { case TasksFailed(failures) => failures.exists(_.exception.isInstanceOf[CircularDependency]) }
|
|
}
|
|
final def checkRootComplete(intermediate: Int, workers: Int) =
|
|
{
|
|
val top = Task(intermediate)
|
|
def iterate(task: Task[Int]): Task[Int] =
|
|
{
|
|
lazy val it: Task[Int] =
|
|
task bind { t =>
|
|
if(t <= 0)
|
|
it
|
|
else
|
|
iterate(Task(t-1) named (t-1).toString)
|
|
} named("it")
|
|
it
|
|
}
|
|
try { TaskRunner(iterate(top), workers); false }
|
|
catch { case e: CircularDependency => true }
|
|
}
|
|
} |