sbt/tasks/src/test/scala/TestRunnerSort.scala

50 lines
1.1 KiB
Scala
Raw Normal View History

2010-06-10 14:19:15 +02:00
/* sbt -- Simple Build Tool
* Copyright 2009, 2010 Mark Harrah
*/
package sbt
2009-08-16 20:29:08 +02:00
import org.scalacheck._
import Prop._
import TaskGen._
2010-06-10 14:19:15 +02:00
import Task._
import Types._
2009-08-16 20:29:08 +02:00
object TaskRunnerSortTest extends Properties("TaskRunnerSort")
{
property("sort") = forAll(TaskListGen, MaxWorkersGen) { (list: List[Int], workers: Int) =>
val a = list.toArray
val sorted = a.toArray
java.util.Arrays.sort(sorted)
("Workers: " + workers) |: ("Array: " + a.toList) |:
{
2010-06-10 14:19:15 +02:00
def result = tryRun( sort(a.toSeq), false, if(workers > 0) workers else 1)
checkResult(result.toList, sorted.toList)
2009-08-16 20:29:08 +02:00
}
}
2010-06-10 14:19:15 +02:00
final def sortDirect(a: Seq[Int]): Seq[Int] =
2009-08-16 20:29:08 +02:00
{
if(a.length < 2)
a
else
{
val pivot = a(0)
2010-06-10 14:19:15 +02:00
val (lt,gte) = a.view.drop(1).partition(_ < pivot)
2009-08-16 20:29:08 +02:00
sortDirect(lt) ++ List(pivot) ++ sortDirect(gte)
}
}
2010-06-10 14:19:15 +02:00
final def sort(a: Seq[Int]): Task[Seq[Int]] =
2009-08-16 20:29:08 +02:00
{
2009-12-12 00:56:09 +01:00
if(a.length < 200)
2010-06-10 14:19:15 +02:00
pure(sortDirect(a))
2009-08-16 20:29:08 +02:00
else
{
2010-06-10 14:19:15 +02:00
pure(a) flatMap { a =>
2009-08-16 20:29:08 +02:00
val pivot = a(0)
2010-06-10 14:19:15 +02:00
val (lt,gte) = a.view.drop(1).partition(_ < pivot)
sort(lt) :^: sort(gte) :^: KNil mapH {
2010-06-10 14:19:15 +02:00
case l :+: g :+: HNil => l ++ List(pivot) ++ g
}
2009-08-16 20:29:08 +02:00
}
}
}
}