Skip to content

Commit bddb3af

Browse files
committed
Merge pull request scala#4075 from som-snytt/issue/8835-junit
SI-8835 Iterator tests can be junit
2 parents 9a99913 + 1f0d347 commit bddb3af

File tree

10 files changed

+152
-227
lines changed

10 files changed

+152
-227
lines changed

src/library/scala/collection/Iterator.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,8 @@ trait Iterator[+A] extends TraversableOnce[A] {
322322
*/
323323
def drop(n: Int): Iterator[A] = {
324324
var j = 0
325-
while (j < n && this.hasNext) {
326-
this.next
325+
while (j < n && hasNext) {
326+
next()
327327
j += 1
328328
}
329329
this

test/files/run/iterator-concat.check

Lines changed: 0 additions & 4 deletions
This file was deleted.

test/files/run/iterator-concat.scala

Lines changed: 0 additions & 15 deletions
This file was deleted.

test/files/run/iterator-iterate-lazy.scala

Lines changed: 0 additions & 5 deletions
This file was deleted.

test/files/run/iterators.check

Lines changed: 0 additions & 14 deletions
This file was deleted.

test/files/run/iterators.scala

Lines changed: 0 additions & 168 deletions
This file was deleted.

test/files/run/t3516.check

Lines changed: 0 additions & 3 deletions
This file was deleted.

test/files/run/t3516.scala

Lines changed: 0 additions & 13 deletions
This file was deleted.

test/junit/scala/collection/IteratorTest.scala

Lines changed: 131 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ import org.junit.Test
66
import org.junit.runner.RunWith
77
import org.junit.runners.JUnit4
88

9+
import scala.tools.testing.AssertUtil._
10+
11+
import Seq.empty
12+
913
@RunWith(classOf[JUnit4])
1014
class IteratorTest {
1115

12-
@Test
13-
def groupedIteratorShouldNotAskForUnneededElement(): Unit = {
16+
@Test def groupedIteratorShouldNotAskForUnneededElement(): Unit = {
1417
var counter = 0
1518
val it = new Iterator[Int] { var i = 0 ; def hasNext = { counter = i; true } ; def next = { i += 1; i } }
1619
val slidingIt = it sliding 2
@@ -25,4 +28,130 @@ class IteratorTest {
2528
slidingIt.next
2629
assertEquals("Counter should be one, that means we didn't look further than needed", 1, counter)
2730
}
31+
32+
@Test def dropDoesNotGrowStack(): Unit = {
33+
def it = new Iterator[Throwable] { def hasNext = true ; def next = new Throwable }
34+
35+
assertEquals(it.drop(1).next.getStackTrace.length, it.drop(1).drop(1).next.getStackTrace.length)
36+
}
37+
38+
@Test def dropIsChainable(): Unit = {
39+
assertSameElements(1 to 4, Iterator from 0 take 5 drop 1)
40+
assertSameElements(3 to 4, Iterator from 0 take 5 drop 3)
41+
assertSameElements(empty, Iterator from 0 take 5 drop 5)
42+
assertSameElements(empty, Iterator from 0 take 5 drop 10)
43+
assertSameElements(0 to 4, Iterator from 0 take 5 drop 0)
44+
assertSameElements(0 to 4, Iterator from 0 take 5 drop -1)
45+
assertSameElements(2 to 8 by 2, Iterator from 0 take 5 drop 1 map (2 * _))
46+
assertSameElements(2 to 8 by 2, Iterator from 0 take 5 map (2 * _) drop 1)
47+
assertSameElements(3 to 4, Iterator from 0 take 5 drop 1 drop 2)
48+
assertSameElements(3 to 4, Iterator from 0 take 5 drop 2 drop 1)
49+
}
50+
51+
@Test def sliceIsChainable(): Unit = {
52+
assertSameElements(3 to 6, Iterator from 0 slice (3, 7))
53+
assertSameElements(empty, Iterator from 0 slice (3, 3))
54+
assertSameElements(0 to 2, Iterator from 0 slice (-1, 3))
55+
assertSameElements(empty, Iterator from 0 slice (3, -1))
56+
assertSameElements(6 to 12 by 2, Iterator from 0 slice (3, 7) map (2 * _))
57+
assertSameElements(6 to 12 by 2, Iterator from 0 map (2 * _) slice (3, 7))
58+
assertSameElements(4 to 6, Iterator from 0 slice (3, 7) drop 1)
59+
assertSameElements(4 to 7, Iterator from 0 drop 1 slice (3, 7))
60+
assertSameElements(4 to 5, Iterator from 0 slice (3, 7) slice (1, 3))
61+
assertSameElements(4 to 6, Iterator from 0 slice (3, 7) slice (1, 10))
62+
}
63+
64+
// test/files/run/iterator-concat.scala
65+
@Test def concatIsStackFriendly(): Unit = {
66+
// Create `size` Function0s, each of which evaluates to an Iterator
67+
// which produces 1. Then fold them over ++ to get a single iterator,
68+
// which should sum to "size".
69+
def mk(size: Int): Iterator[Int] = {
70+
//val closures = (1 to size).toList.map(x => (() => Iterator(1)))
71+
//closures.foldLeft(Iterator.empty: Iterator[Int])((res, f) => res ++ f())
72+
List.fill(size)(() => Iterator(1)).foldLeft(Iterator.empty: Iterator[Int])((res, f) => res ++ f())
73+
}
74+
assertEquals(100, mk(100).sum)
75+
assertEquals(1000, mk(1000).sum)
76+
assertEquals(10000, mk(10000).sum)
77+
assertEquals(100000, mk(100000).sum)
78+
}
79+
80+
@Test def from(): Unit = {
81+
val it1 = Iterator.from(-1)
82+
val it2 = Iterator.from(0, -1)
83+
assertEquals(-1, it1.next())
84+
assertEquals(0, it2.next())
85+
}
86+
@Test def range(): Unit = {
87+
assertEquals(5, Iterator.range(0, 10, 2).size)
88+
assertEquals(0, Iterator.range(0, 10, -2).size)
89+
assertEquals(5, Iterator.range(10, 0, -2).size)
90+
assertEquals(0, Iterator.range(10, 0, 2).size)
91+
assertEquals(1, Iterator.range(0, 10, 11).size)
92+
assertEquals(10, Iterator.range(0, 10, 1).size)
93+
assertEquals(10, Iterator.range(10, 0, -1).size)
94+
}
95+
@Test def range3(): Unit = {
96+
val r1 = Iterator.range(0, 10)
97+
assertTrue(r1 contains 5)
98+
assertTrue(r1 contains 6)
99+
assertFalse(r1 contains 4)
100+
val r2a = Iterator.range(0, 10, 2)
101+
assertFalse(r2a contains 5)
102+
val r2b = Iterator.range(0, 10, 2)
103+
assertTrue(r2b contains 6)
104+
val r3 = Iterator.range(0, 10, 11)
105+
assertFalse(r3 contains 5)
106+
assertTrue(r3.isEmpty)
107+
}
108+
@Test def take(): Unit = {
109+
assertEquals(10, (Iterator from 0 take 10).size)
110+
}
111+
@Test def foreach(): Unit = {
112+
val it1 = Iterator.from(0) take 20
113+
var n = 0
114+
it1 foreach { n += _ }
115+
assertEquals(190, n)
116+
}
117+
// ticket #429
118+
@Test def fromArray(): Unit = {
119+
val a = List(1, 2, 3, 4).toArray
120+
var xs0 = a.iterator.toList;
121+
var xs1 = a.slice(0, 1).iterator
122+
var xs2 = a.slice(0, 2).iterator
123+
var xs3 = a.slice(0, 3).iterator
124+
var xs4 = a.slice(0, 4).iterator
125+
assertEquals(14, xs0.size + xs1.size + xs2.size + xs3.size + xs4.size)
126+
}
127+
@Test def toSeq(): Unit = {
128+
assertEquals("1x2x3x4x5", List(1, 2, 3, 4, 5).iterator.mkString("x"))
129+
}
130+
@Test def indexOf(): Unit = {
131+
assertEquals(3, List(1, 2, 3, 4, 5).iterator.indexOf(4))
132+
assertEquals(-1, List(1, 2, 3, 4, 5).iterator.indexOf(16))
133+
}
134+
@Test def indexWhere(): Unit = {
135+
assertEquals(3, List(1, 2, 3, 4, 5).iterator.indexWhere { x: Int => x >= 4 })
136+
assertEquals(-1, List(1, 2, 3, 4, 5).iterator.indexWhere { x: Int => x >= 16 })
137+
}
138+
// iterator-iterate-lazy.scala
139+
// was java.lang.UnsupportedOperationException: tail of empty list
140+
@Test def iterateIsSufficientlyLazy(): Unit = {
141+
//Iterator.iterate((1 to 5).toList)(_.tail).takeWhile(_.nonEmpty).toList // suffices
142+
Iterator.iterate((1 to 5).toList)(_.tail).takeWhile(_.nonEmpty).map(_.head).toList
143+
}
144+
// SI-3516
145+
@Test def toStreamIsSufficientlyLazy(): Unit = {
146+
val results = collection.mutable.ListBuffer.empty[Int]
147+
def mkIterator = (1 to 5).iterator map (x => { results += x ; x })
148+
def mkInfinite = Iterator continually { results += 1 ; 1 }
149+
150+
// Stream is strict in its head so we should see 1 from each of them.
151+
val s1 = mkIterator.toStream
152+
val s2 = mkInfinite.toStream
153+
// back and forth without slipping into nontermination.
154+
results += (Stream from 1).toIterator.drop(10).toStream.drop(10).toIterator.next()
155+
assertSameElements(List(1,1,21), results)
156+
}
28157
}

0 commit comments

Comments
 (0)