@@ -6,36 +6,115 @@ import org.junit.{Assert, Test}
66import scala .util .Try
77
88class 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+
979 @ Test
1080 def splitByShouldHonorEmptyIterator (): Unit = {
1181 val groupedIterator = Iterator .empty.splitBy(identity)
1282 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)
1484 }
1585
1686 @ Test
1787 def splitByShouldReturnIteratorOfSingleSeqWhenAllElHaveTheSameKey (): Unit = {
1888 val value = Vector (" 1" , " 1" , " 1" )
1989 val groupedIterator = value.iterator.splitBy(identity)
2090 Assert .assertTrue(groupedIterator.hasNext)
21- Assert .assertEquals(groupedIterator.next.toVector, value )
91+ Assert .assertEquals(value, groupedIterator.next.toVector)
2292 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)
2494 }
2595
2696 @ Test
2797 def splitByShouldReturnIteratorOfSeqOfConsecutiveElementsWithTheSameKey (): Unit = {
2898 val value = Vector (" 1" , " 2" , " 2" , " 3" , " 3" , " 3" , " 2" , " 2" )
2999 val groupedIterator = value.iterator.splitBy(identity)
30100 Assert .assertTrue(groupedIterator.hasNext)
31- Assert .assertEquals(groupedIterator.next.toVector, Vector (" 1" ))
101+ Assert .assertEquals(Vector (" 1" ), groupedIterator.next.toVector )
32102 Assert .assertTrue(groupedIterator.hasNext)
33- Assert .assertEquals(groupedIterator.next.toVector, Vector (" 2" , " 2" ))
103+ Assert .assertEquals(Vector (" 2" , " 2" ), groupedIterator.next.toVector )
34104 Assert .assertTrue(groupedIterator.hasNext)
35- Assert .assertEquals(groupedIterator.next.toVector, Vector (" 3" , " 3" , " 3" ))
105+ Assert .assertEquals(Vector (" 3" , " 3" , " 3" ), groupedIterator.next.toVector )
36106 Assert .assertTrue(groupedIterator.hasNext)
37- Assert .assertEquals(groupedIterator.next.toVector, Vector (" 2" , " 2" ))
107+ Assert .assertEquals(Vector (" 2" , " 2" ), groupedIterator.next.toVector )
38108 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+ )
40119 }
41120}
0 commit comments