@@ -6,36 +6,115 @@ import org.junit.{Assert, Test}
6
6
import scala .util .Try
7
7
8
8
class IteratorDecoratorTest {
9
+ @ Test
10
+ def intersperseShouldIntersperseASeparator (): Unit = {
11
+ Assert .assertEquals(Seq (1 , 0 , 2 , 0 , 3 ), Iterator (1 , 2 , 3 ).intersperse(0 ).toSeq)
12
+ Assert .assertEquals(Seq ('a' , ',' , 'b' , ',' , 'c' ), Iterator ('a' , 'b' , 'c' ).intersperse(',' ).toSeq)
13
+ Assert .assertEquals(Seq ('a' ), Iterator ('a' ).intersperse(',' ).toSeq)
14
+ Assert .assertEquals(Seq .empty, Iterator ().intersperse(',' ).toSeq)
15
+ }
16
+
17
+ @ Test
18
+ def intersperseShouldIntersperseASeparatorAndInsertStartAndEnd (): Unit = {
19
+ Assert .assertEquals(Seq (- 1 , 1 , 0 , 2 , 0 , 3 , 99 ), Iterator (1 , 2 , 3 ).intersperse(- 1 , 0 , 99 ).toSeq)
20
+ Assert .assertEquals(Seq ('[' , 'a' , ',' , 'b' , ',' , 'c' , ']' ),
21
+ Iterator ('a' , 'b' , 'c' ).intersperse('[' , ',' , ']' ).toSeq)
22
+ Assert .assertEquals(Seq ('[' , 'a' , ']' ), Iterator ('a' ).intersperse('[' , ',' , ']' ).toSeq)
23
+ Assert .assertEquals(Seq ('[' , ']' ), Iterator ().intersperse('[' , ',' , ']' ).toSeq)
24
+ }
25
+
26
+ @ Test
27
+ def foldSomeLeftShouldFold (): Unit = {
28
+ def sumOp (acc : Int , e : Int ): Option [Int ] = if (e == 4 ) None else Some (acc + e)
29
+ Assert .assertEquals(0 , Iterator ().foldSomeLeft(0 )(sumOp))
30
+ Assert .assertEquals(6 , Iterator (1 , 2 , 3 ).foldSomeLeft(0 )(sumOp))
31
+ Assert .assertEquals(6 , Iterator (1 , 2 , 3 , 4 , 5 ).foldSomeLeft(0 )(sumOp))
32
+ Assert .assertEquals(0 , Iterator (4 , 5 ).foldSomeLeft(0 )(sumOp))
33
+ }
34
+
35
+ @ Test
36
+ def lazyFoldLeftShouldFold (): Unit = {
37
+ // Notice how sumOp doesn't evaluate `e` under some conditions.
38
+ def sumOp (acc : Int , e : => Int ): Int = if (acc >= 5 ) acc else acc + e
39
+ Assert .assertEquals(0 , Iterator ().lazyFoldLeft(0 )(sumOp))
40
+ Assert .assertEquals(3 , Iterator (1 , 1 , 1 ).lazyFoldLeft(0 )(sumOp))
41
+ Assert .assertEquals(6 , Iterator (1 , 2 , 3 , 4 , 5 ).lazyFoldLeft(0 )(sumOp))
42
+ Assert .assertEquals(5 , Iterator (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ).lazyFoldLeft(0 )(sumOp))
43
+ Assert .assertEquals(9 , Iterator (4 , 5 ).lazyFoldLeft(0 )(sumOp))
44
+ Assert .assertEquals(9 , Iterator (4 , 5 , 1 ).lazyFoldLeft(0 )(sumOp))
45
+ Assert .assertEquals(10 , Iterator (10 , 20 , 30 ).lazyFoldLeft(0 )(sumOp))
46
+ }
47
+
48
+ @ Test
49
+ def lazyFoldLeftShouldFoldWeirdEdgeCases (): Unit = {
50
+ // `delayedSumOp` doesn't return `acc`, causing a delayed stop of the iteration.
51
+ def delayedSumOp (acc : Int , e : => Int ): Int = if (acc >= 5 ) 5 else acc + e
52
+ Assert .assertEquals(0 , Iterator ().lazyFoldLeft(0 )(delayedSumOp))
53
+ Assert .assertEquals(3 , Iterator (1 , 1 , 1 ).lazyFoldLeft(0 )(delayedSumOp))
54
+ Assert .assertEquals(9 , Iterator (4 , 5 ).lazyFoldLeft(0 )(delayedSumOp))
55
+ Assert .assertEquals(5 , Iterator (4 , 5 , 1 ).lazyFoldLeft(0 )(delayedSumOp))
56
+ Assert .assertEquals(5 , Iterator (6 , 1 ).lazyFoldLeft(0 )(delayedSumOp))
57
+
58
+ // `alwaysGrowingSumOp` returns a new value every time, causing no stop in the iteration.
59
+ def alwaysGrowingSumOp (acc : Int , e : => Int ): Int = if (acc >= 5 ) acc + 1 else acc + e
60
+ Assert .assertEquals(0 , Iterator ().lazyFoldLeft(0 )(alwaysGrowingSumOp))
61
+ Assert .assertEquals(3 , Iterator (1 , 1 , 1 ).lazyFoldLeft(0 )(alwaysGrowingSumOp))
62
+ Assert .assertEquals(9 , Iterator (5 , 10 , 10 , 10 , 10 ).lazyFoldLeft(0 )(alwaysGrowingSumOp))
63
+ Assert .assertEquals(9 , Iterator (4 , 5 ).lazyFoldLeft(0 )(alwaysGrowingSumOp))
64
+ Assert .assertEquals(10 , Iterator (4 , 5 , 20 ).lazyFoldLeft(0 )(alwaysGrowingSumOp))
65
+ }
66
+
67
+ @ Test
68
+ def lazyFoldRightShouldFold (): Unit = {
69
+ def sumOp (acc : Int ): Either [Int , Int => Int ] = if (acc >= 5 ) Left (acc) else Right (acc + _)
70
+ Assert .assertEquals(0 , Iterator ().lazyFoldRight(0 )(sumOp))
71
+ Assert .assertEquals(3 , Iterator (1 , 1 , 1 ).lazyFoldRight(0 )(sumOp))
72
+ Assert .assertEquals(15 , Iterator (1 , 2 , 3 , 4 , 5 ).lazyFoldRight(0 )(sumOp))
73
+ Assert .assertEquals(8 , Iterator (1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ).lazyFoldRight(0 )(sumOp))
74
+ Assert .assertEquals(5 , Iterator (5 , 4 ).lazyFoldRight(0 )(sumOp))
75
+ Assert .assertEquals(6 , Iterator (1 , 5 , 4 ).lazyFoldRight(0 )(sumOp))
76
+ Assert .assertEquals(32 , Iterator (32 , 21 , 10 ).lazyFoldRight(0 )(sumOp))
77
+ }
78
+
9
79
@ Test
10
80
def splitByShouldHonorEmptyIterator (): Unit = {
11
81
val groupedIterator = Iterator .empty.splitBy(identity)
12
82
Assert .assertFalse(groupedIterator.hasNext)
13
- Assert .assertEquals(Try (groupedIterator. next) .toString, Try (Iterator .empty. next() ).toString)
83
+ Assert .assertEquals(Try (Iterator .empty. next()) .toString, Try (groupedIterator. next).toString)
14
84
}
15
85
16
86
@ Test
17
87
def splitByShouldReturnIteratorOfSingleSeqWhenAllElHaveTheSameKey (): Unit = {
18
88
val value = Vector (" 1" , " 1" , " 1" )
19
89
val groupedIterator = value.iterator.splitBy(identity)
20
90
Assert .assertTrue(groupedIterator.hasNext)
21
- Assert .assertEquals(groupedIterator.next.toVector, value )
91
+ Assert .assertEquals(value, groupedIterator.next.toVector)
22
92
Assert .assertFalse(groupedIterator.hasNext)
23
- Assert .assertEquals(Try (groupedIterator. next) .toString, Try (Iterator .empty. next() ).toString)
93
+ Assert .assertEquals(Try (Iterator .empty. next()) .toString, Try (groupedIterator. next).toString)
24
94
}
25
95
26
96
@ Test
27
97
def splitByShouldReturnIteratorOfSeqOfConsecutiveElementsWithTheSameKey (): Unit = {
28
98
val value = Vector (" 1" , " 2" , " 2" , " 3" , " 3" , " 3" , " 2" , " 2" )
29
99
val groupedIterator = value.iterator.splitBy(identity)
30
100
Assert .assertTrue(groupedIterator.hasNext)
31
- Assert .assertEquals(groupedIterator.next.toVector, Vector (" 1" ))
101
+ Assert .assertEquals(Vector (" 1" ), groupedIterator.next.toVector )
32
102
Assert .assertTrue(groupedIterator.hasNext)
33
- Assert .assertEquals(groupedIterator.next.toVector, Vector (" 2" , " 2" ))
103
+ Assert .assertEquals(Vector (" 2" , " 2" ), groupedIterator.next.toVector )
34
104
Assert .assertTrue(groupedIterator.hasNext)
35
- Assert .assertEquals(groupedIterator.next.toVector, Vector (" 3" , " 3" , " 3" ))
105
+ Assert .assertEquals(Vector (" 3" , " 3" , " 3" ), groupedIterator.next.toVector )
36
106
Assert .assertTrue(groupedIterator.hasNext)
37
- Assert .assertEquals(groupedIterator.next.toVector, Vector (" 2" , " 2" ))
107
+ Assert .assertEquals(Vector (" 2" , " 2" ), groupedIterator.next.toVector )
38
108
Assert .assertFalse(groupedIterator.hasNext)
39
- Assert .assertEquals(Try (groupedIterator.next).toString, Try (Iterator .empty.next()).toString)
109
+ Assert .assertEquals(Try (Iterator .empty.next()).toString, Try (groupedIterator.next).toString)
110
+ }
111
+
112
+ @ Test
113
+ def splitByShouldSplitByFunction (): Unit = {
114
+ Assert .assertEquals(Seq (Seq ((1 ,1 ), (1 ,2 )), Seq ((2 ,3 ))), Iterator ((1 ,1 ), (1 ,2 ), (2 ,3 )).splitBy(_._1).toSeq)
115
+ Assert .assertEquals(
116
+ Seq (Seq ((1 ,1 ), (1 ,2 )), Seq ((2 ,3 )), Seq ((1 ,4 ))),
117
+ Iterator ((1 ,1 ), (1 ,2 ), (2 ,3 ), (1 ,4 )).splitBy(_._1).toSeq
118
+ )
40
119
}
41
120
}
0 commit comments