summaryrefslogtreecommitdiff
path: root/test/files/scalacheck/Ctrie.scala
diff options
context:
space:
mode:
Diffstat (limited to 'test/files/scalacheck/Ctrie.scala')
-rw-r--r--test/files/scalacheck/Ctrie.scala66
1 files changed, 33 insertions, 33 deletions
diff --git a/test/files/scalacheck/Ctrie.scala b/test/files/scalacheck/Ctrie.scala
index 736bf938bc..714f1c3b09 100644
--- a/test/files/scalacheck/Ctrie.scala
+++ b/test/files/scalacheck/Ctrie.scala
@@ -17,21 +17,21 @@ case class Wrap(i: Int) {
/** A check mainly oriented towards checking snapshot correctness.
*/
object Test extends Properties("concurrent.TrieMap") {
-
+
/* generators */
-
+
val sizes = choose(0, 200000)
-
+
val threadCounts = choose(2, 16)
-
+
val threadCountsAndSizes = for {
p <- threadCounts
sz <- sizes
} yield (p, sz);
-
-
+
+
/* helpers */
-
+
def inParallel[T](totalThreads: Int)(body: Int => T): Seq[T] = {
val threads = for (idx <- 0 until totalThreads) yield new Thread {
setName("ParThread-" + idx)
@@ -44,11 +44,11 @@ object Test extends Properties("concurrent.TrieMap") {
res
}
}
-
+
threads foreach (_.start())
threads map (_.result)
}
-
+
def spawn[T](body: =>T): { def get: T } = {
val t = new Thread {
setName("SpawnThread")
@@ -66,7 +66,7 @@ object Test extends Properties("concurrent.TrieMap") {
}
}
}
-
+
def elementRange(threadIdx: Int, totalThreads: Int, totalElems: Int): Range = {
val sz = totalElems
val idx = threadIdx
@@ -76,7 +76,7 @@ object Test extends Properties("concurrent.TrieMap") {
val end = start + elems
(start until end)
}
-
+
def hasGrown[K, V](last: Map[K, V], current: Map[K, V]) = {
(last.size <= current.size) && {
last forall {
@@ -84,7 +84,7 @@ object Test extends Properties("concurrent.TrieMap") {
}
}
}
-
+
object err {
var buffer = new StringBuilder
def println(a: AnyRef) = buffer.append(a.toString).append("\n")
@@ -94,16 +94,16 @@ object Test extends Properties("concurrent.TrieMap") {
clear()
}
}
-
-
+
+
/* properties */
-
+
property("concurrent growing snapshots") = forAll(threadCounts, sizes) {
(numThreads, numElems) =>
val p = 3 //numThreads
val sz = 102 //numElems
val ct = new TrieMap[Wrap, Int]
-
+
// checker
val checker = spawn {
def check(last: Map[Wrap, Int], iterationsLeft: Int): Boolean = {
@@ -115,23 +115,23 @@ object Test extends Properties("concurrent.TrieMap") {
}
check(ct.readOnlySnapshot(), 500)
}
-
+
// fillers
inParallel(p) {
idx =>
elementRange(idx, p, sz) foreach (i => ct.update(Wrap(i), i))
}
-
+
// wait for checker to finish
val growing = true//checker.get
-
+
val ok = growing && ((0 until sz) forall {
case i => ct.get(Wrap(i)) == Some(i)
})
-
+
ok
}
-
+
property("update") = forAll(sizes) {
(n: Int) =>
val ct = new TrieMap[Int, Int]
@@ -140,52 +140,52 @@ object Test extends Properties("concurrent.TrieMap") {
case i => ct(i) == i
}
}
-
+
property("concurrent update") = forAll(threadCountsAndSizes) {
case (p, sz) =>
val ct = new TrieMap[Wrap, Int]
-
+
inParallel(p) {
idx =>
for (i <- elementRange(idx, p, sz)) ct(Wrap(i)) = i
}
-
+
(0 until sz) forall {
case i => ct(Wrap(i)) == i
}
}
-
-
+
+
property("concurrent remove") = forAll(threadCounts, sizes) {
(p, sz) =>
val ct = new TrieMap[Wrap, Int]
for (i <- 0 until sz) ct(Wrap(i)) = i
-
+
inParallel(p) {
idx =>
for (i <- elementRange(idx, p, sz)) ct.remove(Wrap(i))
}
-
+
(0 until sz) forall {
case i => ct.get(Wrap(i)) == None
}
}
-
-
+
+
property("concurrent putIfAbsent") = forAll(threadCounts, sizes) {
(p, sz) =>
val ct = new TrieMap[Wrap, Int]
-
+
val results = inParallel(p) {
idx =>
elementRange(idx, p, sz) find (i => ct.putIfAbsent(Wrap(i), i) != None)
}
-
+
(results forall (_ == None)) && ((0 until sz) forall {
case i => ct.get(Wrap(i)) == Some(i)
})
}
-
+
}