summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2014-05-27 15:40:16 +0200
committerJason Zaugg <jzaugg@gmail.com>2014-05-27 15:40:16 +0200
commit5551cf66e5b27ae398b527df6fe4247aed1ff307 (patch)
tree34cc550412c44edef803297db35d34dde21fdde9
parentb20bb5587fbd36b212027a04a62f65d6709d05af (diff)
parent71cfb57499bda80f5fb0a810f37d0f9c54e1afd3 (diff)
downloadscala-5551cf66e5b27ae398b527df6fe4247aed1ff307.tar.gz
scala-5551cf66e5b27ae398b527df6fe4247aed1ff307.tar.bz2
scala-5551cf66e5b27ae398b527df6fe4247aed1ff307.zip
Merge pull request #3733 from retronym/topic/pr-3712-resubmit
SI-8475 Fix off by one in GroupedIterator when Streaming
-rw-r--r--src/library/scala/collection/Iterator.scala4
-rw-r--r--test/junit/scala/collection/IteratorTest.scala20
2 files changed, 23 insertions, 1 deletions
diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala
index 1b496383a3..e321a6adba 100644
--- a/src/library/scala/collection/Iterator.scala
+++ b/src/library/scala/collection/Iterator.scala
@@ -926,7 +926,9 @@ trait Iterator[+A] extends TraversableOnce[A] {
private def takeDestructively(size: Int): Seq[A] = {
val buf = new ArrayBuffer[A]
var i = 0
- while (self.hasNext && i < size) {
+ // The order of terms in the following condition is important
+ // here as self.hasNext could be blocking
+ while (i < size && self.hasNext) {
buf += self.next
i += 1
}
diff --git a/test/junit/scala/collection/IteratorTest.scala b/test/junit/scala/collection/IteratorTest.scala
new file mode 100644
index 0000000000..cb7cbb40bc
--- /dev/null
+++ b/test/junit/scala/collection/IteratorTest.scala
@@ -0,0 +1,20 @@
+
+package scala.collection
+
+import org.junit.Assert._
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(classOf[JUnit4])
+class IteratorTest {
+
+ @Test
+ def groupedIteratorShouldNotAskForUnneededElement(): Unit = {
+ var counter = 0
+ val it = new Iterator[Int] { var i = 0 ; def hasNext = { counter = i; true } ; def next = { i += 1; i } }
+ val slidingIt = it sliding 2
+ slidingIt.next
+ assertEquals("Counter should be one, that means we didn't look further than needed", 1, counter)
+ }
+}