@@ -18,6 +18,13 @@ import org.junit.Test
18
18
import next ._
19
19
20
20
class TestLazyListExtensions {
21
+
22
+ // This method will *not* terminate for non-cyclic infinite-sized collections.
23
+ def assertIsCyclical [T ](xs : LazyList [T ]): Unit = {
24
+ assertTrue(xs.nonEmpty)
25
+ xs.force
26
+ }
27
+
21
28
@ Test
22
29
def testEmpty1 (): Unit = {
23
30
val xs = LazyList .empty // realized
@@ -39,6 +46,7 @@ class TestLazyListExtensions {
39
46
val xs = LazyList (1 , 2 , 3 )
40
47
val cyc = xs.cycle
41
48
assertFalse(cyc.isEmpty)
49
+ assertIsCyclical(cyc)
42
50
assertEquals(LazyList (1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 ), cyc.take(8 ))
43
51
}
44
52
@ Test
@@ -76,4 +84,32 @@ class TestLazyListExtensions {
76
84
assertEquals(10 , cyc.take(10 ).size)
77
85
assertEquals(3 , counter)
78
86
}
87
+ @ Test
88
+ def testConstantMemory3 (): Unit = {
89
+ val xs = LazyList (1 , 2 , 3 )
90
+ val cyc = xs.cycle
91
+ assertIsCyclical(cyc)
92
+ assertIsCyclical(cyc.tail)
93
+ assertIsCyclical(cyc.tail.tail)
94
+ assertIsCyclical(cyc.tail.tail.tail)
95
+ assertIsCyclical(cyc.tail.tail.tail.tail)
96
+ assertIsCyclical(cyc.drop(1 ))
97
+ assertIsCyclical(cyc.drop(10 ))
98
+ }
99
+ @ Test
100
+ def testUnbounded (): Unit = {
101
+ val xs = LazyList .from(1 )
102
+ val cyc = xs.cycle
103
+ assertEquals(LazyList (1 , 2 , 3 ), cyc.take(3 ))
104
+ }
105
+ @ Test
106
+ def testSecondCallIsSafeButNotIdempotent (): Unit = {
107
+ val xs = LazyList (1 , 2 , 3 )
108
+ // this is safe to do
109
+ val twice = xs.cycle.cycle
110
+ // and the contents are as expected
111
+ assertEquals(LazyList (1 , 2 , 3 , 1 , 2 , 3 , 1 , 2 ), twice.take(8 ))
112
+ // but the result is not a cycle. TODO do we care?
113
+ assertFalse(twice.tail eq twice.tail.tail.tail.tail)
114
+ }
79
115
}
0 commit comments