@@ -6,11 +6,14 @@ import org.junit.Test
6
6
import org .junit .runner .RunWith
7
7
import org .junit .runners .JUnit4
8
8
9
+ import scala .tools .testing .AssertUtil ._
10
+
11
+ import Seq .empty
12
+
9
13
@ RunWith (classOf [JUnit4 ])
10
14
class IteratorTest {
11
15
12
- @ Test
13
- def groupedIteratorShouldNotAskForUnneededElement (): Unit = {
16
+ @ Test def groupedIteratorShouldNotAskForUnneededElement (): Unit = {
14
17
var counter = 0
15
18
val it = new Iterator [Int ] { var i = 0 ; def hasNext = { counter = i; true } ; def next = { i += 1 ; i } }
16
19
val slidingIt = it sliding 2
@@ -25,4 +28,130 @@ class IteratorTest {
25
28
slidingIt.next
26
29
assertEquals(" Counter should be one, that means we didn't look further than needed" , 1 , counter)
27
30
}
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
+ }
28
157
}
0 commit comments