summaryrefslogtreecommitdiff
path: root/test/junit/scala/collection/ParallelConsistencyTest.scala
diff options
context:
space:
mode:
Diffstat (limited to 'test/junit/scala/collection/ParallelConsistencyTest.scala')
-rw-r--r--test/junit/scala/collection/ParallelConsistencyTest.scala44
1 files changed, 44 insertions, 0 deletions
diff --git a/test/junit/scala/collection/ParallelConsistencyTest.scala b/test/junit/scala/collection/ParallelConsistencyTest.scala
new file mode 100644
index 0000000000..da96362413
--- /dev/null
+++ b/test/junit/scala/collection/ParallelConsistencyTest.scala
@@ -0,0 +1,44 @@
+package scala.collection.immutable
+
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(classOf[JUnit4])
+class ParallelConsistencyTest {
+
+ private val theSeq = Seq(1,2,3)
+
+ // This collection will throw an exception if you do anything but call .length or .seq
+ private val mustCallSeq: collection.GenSeq[Int] = new collection.parallel.ParSeq[Int] {
+ def length = 3
+
+ // This method is surely sequential & safe -- want all access to go through here
+ def seq = theSeq
+
+ def notSeq = throw new Exception("Access to parallel collection not via .seq")
+
+ // These methods could possibly be used dangerously explicitly or internally
+ // (apply could also be used safely; if it is, do test with mustCallSeq)
+ def apply(i: Int) = notSeq
+ def splitter = notSeq
+ }
+
+ // Test Vector ++ with a small parallel collection concatenation (SI-9072).
+ @Test
+ def testPlusPlus(): Unit = {
+ assert((Vector.empty ++ mustCallSeq) == theSeq, "Vector ++ unsafe with parallel vectors")
+ }
+
+ // SI-9126, 1 of 2
+ @Test
+ def testTranspose(): Unit = {
+ assert(List(mustCallSeq).transpose.flatten == theSeq, "Transposing inner parallel collection unsafe")
+ }
+
+ // SI-9126, 2 of 2
+ @Test
+ def testList_flatMap(): Unit = {
+ assert(List(1).flatMap(_ => mustCallSeq) == theSeq, "List#flatMap on inner parallel collection unsafe")
+ }
+}