summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRex Kerr <ichoran@gmail.com>2013-12-02 15:00:20 -0800
committerRex Kerr <ichoran@gmail.com>2013-12-02 15:00:20 -0800
commit03bf97e0893b227812125f7c049fdac254181cb2 (patch)
tree6107017bc3885c0f60c5348d8185c5c749371d7a
parent6c63ab153651f7946ece5740d52e0f2b701e349d (diff)
downloadscala-03bf97e0893b227812125f7c049fdac254181cb2.tar.gz
scala-03bf97e0893b227812125f7c049fdac254181cb2.tar.bz2
scala-03bf97e0893b227812125f7c049fdac254181cb2.zip
Fixes SI-8014, regression in Vector ++ TraversableOnce.
Now uses the cached copy instead of the exhausted iterator. Adds a JUnit test for ++.
-rw-r--r--src/library/scala/collection/immutable/Vector.scala2
-rw-r--r--test/junit/scala/collection/VectorTest.scala51
2 files changed, 52 insertions, 1 deletions
diff --git a/src/library/scala/collection/immutable/Vector.scala b/src/library/scala/collection/immutable/Vector.scala
index 0a100578c0..3dc1ad6a79 100644
--- a/src/library/scala/collection/immutable/Vector.scala
+++ b/src/library/scala/collection/immutable/Vector.scala
@@ -227,7 +227,7 @@ override def companion: GenericCompanion[Vector] = Vector
val ri = this.reverseIterator
while (ri.hasNext) v = ri.next +: v
v.asInstanceOf[That]
- case _ => super.++(that)
+ case _ => super.++(again)
}
}
}
diff --git a/test/junit/scala/collection/VectorTest.scala b/test/junit/scala/collection/VectorTest.scala
new file mode 100644
index 0000000000..e9c4d44a72
--- /dev/null
+++ b/test/junit/scala/collection/VectorTest.scala
@@ -0,0 +1,51 @@
+package scala.collection.mutable
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.Test
+import scala.collection.mutable
+
+@RunWith(classOf[JUnit4])
+/* Test for SI-8014 and ++ in general */
+class VectorTest {
+ val noVec = Vector.empty[Int]
+ val smallVec = Vector.range(0,3)
+ val bigVec = Vector.range(0,64)
+ val smsm = Vector.tabulate(2 * smallVec.length)(i => (i % smallVec.length))
+ val smbig = Vector.tabulate(smallVec.length + bigVec.length)(i =>
+ if (i < smallVec.length) i else i - smallVec.length
+ )
+ val bigsm = Vector.tabulate(smallVec.length + bigVec.length)(i =>
+ if (i < bigVec.length) i else i - bigVec.length
+ )
+ val bigbig = Vector.tabulate(2 * bigVec.length)(i => (i % bigVec.length))
+
+
+ val vecs = List(noVec, smallVec, bigVec)
+ val ans = List(
+ vecs,
+ List(smallVec, smsm, smbig),
+ List(bigVec, bigsm, bigbig)
+ )
+
+ @Test
+ def vectorCat() {
+ val cats = vecs.map(a => vecs.map(a ++ _))
+ assert( cats == ans )
+ }
+
+ @Test
+ def iteratorCat() {
+ def its = vecs.map(_.toList.toIterator)
+ val cats = vecs.map(a => its.map(a ++ _))
+ println(cats)
+ assert( cats == ans )
+ }
+
+ @Test
+ def arrayCat() {
+ val ars = vecs.map(_.toArray)
+ val cats = vecs.map(a => ars.map(a ++ _))
+ assert( cats == ans )
+ }
+}