@@ -4,17 +4,18 @@ use v6;
4
4
5
5
# Tests for lazy lists
6
6
#
7
- # TODO - uncomment "countable lazy slice" test
8
7
# TODO - add timeout control, in tests that may loop forever
9
8
# TODO - the backends that don't have infinite lists implemented
10
9
# should warn of this, instead of entering an infinite loop.
11
- # TODO - add test for "build a list from a coroutine"
12
- # TODO - add test for zip()
13
10
# TODO - add test for 2D array
14
11
12
+ # TODO - there used to be tests here (that were never run) for deleting
13
+ # elements from a lazy list. Can't seem to reproduce them with
14
+ # current spec.
15
+
15
16
use Test ;
16
17
17
- plan 12 ;
18
+ plan 19 ;
18
19
19
20
20
21
# ?pugs emit unless $?PUGS_BACKEND eq "BACKEND_PERL5" {
@@ -27,26 +28,21 @@ plan 12;
27
28
{
28
29
my @ a = (1 .. Inf );
29
30
is ( @ a . splice ( 2 , 3 ),
30
- " (3, 4, 5)" ,
31
+ (3 , 4 , 5 ),
31
32
" splice" );
32
33
}
33
34
34
35
# basic list operations
35
36
36
- is ( (1 .. Inf ). elems ,
37
+ is ( (1 ... Inf ). elems ,
37
38
Inf ,
38
39
" elems" );
39
40
40
- is ( (1 .. Inf ). shift ,
41
+ is ( (1 ... Inf ). shift ,
41
42
1 ,
42
43
" shift" );
43
44
44
- is ( (1 .. Inf ). pop ,
45
- Inf ,
46
- " pop" );
47
-
48
-
49
- is ( (1 .. Inf )[2 .. 5 ],
45
+ is ( (1 ... Inf )[2 .. 5 ],
50
46
[3 , 4 , 5 , 6 ],
51
47
" simple slice" );
52
48
@@ -71,7 +67,7 @@ is( (1..Inf)[2..5],
71
67
{
72
68
my @ a = (1 .. Inf );
73
69
@ a [1 ] = 99 ;
74
- is @ a [0 , 1 , 2 ]. join (' ' ), ' 1 99 2 ' , ' assignment to infinite list' ;
70
+ is @ a [0 , 1 , 2 ]. join (' ' ), ' 1 99 3 ' , ' assignment to infinite list' ;
75
71
}
76
72
77
73
{
@@ -84,24 +80,67 @@ is( (1..Inf)[2..5],
84
80
85
81
{
86
82
my @ a = (1 .. Inf );
87
- @ a [1 ]. delete ;
88
- is ~ @ a [0 , 2 ], ' 1 3' , ' array elemente delete (1)' ;
89
- nok @ a [1 ]. defined , ' array element delete (2)' ;
83
+ @ a [1 .. 10002 ] = @ a [9 .. 10010 ];
84
+ is ( ~ @ a [0 , 1 , 2 ],
85
+ ' 1 10 11' ,
86
+ " big slice assignment" );
90
87
}
91
88
89
+ my $ was-lazy = 1 ;
90
+ sub make-lazy-list ($ num ) { gather { take $ _ for 0 .. ^ $ num ; $ was-lazy = 0 } };
91
+
92
92
{
93
- my @ a = (1 .. Inf );
94
- @ a [0 ,1 ]. delete ;
95
- nok ( all (@ a [0 , 1 ]). defined ,
96
- " array slice delete()" );
93
+ $ was-lazy = 1 ;
94
+ my @ a = make-lazy-list(4 );
95
+ nok $ was-lazy , " sanity: make-lazy-list sets $ was-lazy ." ;
96
+ $ was-lazy = 1 ;
97
+ my @ b := make-lazy-list(4 );
98
+ ok $ was-lazy , " sanity: binding won't slurp up the lazy list" ;
97
99
}
98
100
99
101
{
100
- my @ a = (1 .. Inf );
101
- @ a [1 .. 1000002 ] = @ a [9 .. 1000010 ];
102
- is ( ~ @ a [0 , 1 , 2 ],
103
- ' 1 10 11' ,
104
- " big slice assignment" );
102
+ $ was-lazy = 1 ;
103
+ my @ one := make-lazy-list(10 );
104
+ is @ one . first (*. is-prime ), 2 , " sanity: first is-prime is 2" ;
105
+ ok $ was-lazy , " first is lazy" ;
106
+ }
107
+
108
+ {
109
+ $ was-lazy = 1 ;
110
+ my @ one := make-lazy-list(10 );
111
+ is @ one . grep (*. is-prime )[^ 3 ], (2 , 3 , 5 ), " sanity: first three primes are 2, 3 and 5" ;
112
+ ok $ was-lazy , " grep is lazy" ;
113
+ }
114
+
115
+ {
116
+ $ was-lazy = 1 ;
117
+ my @ one := make-lazy-list(10 );
118
+ is @ one . map ({ $ ^ num * 2 })[^ 3 ], (0 , 2 , 4 ), " sanity: first three numbers doubled are 0, 2, 4" ;
119
+ ok $ was-lazy , " map is lazy" ;
120
+ }
121
+
122
+ {
123
+ $ was-lazy = 1 ;
124
+ my @ one := make-lazy-list(10 );
125
+ my @ two = <a b c d e f >;
126
+ my @ res = (@ one Z @ two )[^ 3 ];
127
+ ok $ was-lazy , " first argument of Z is lazy" ;
128
+ }
129
+
130
+ {
131
+ $ was-lazy = 1 ;
132
+ my @ two := make-lazy-list(10 );
133
+ my @ one = <a b c d e f >;
134
+ my @ res = (@ one Z @ two )[^ 3 ];
135
+ ok $ was-lazy , " second argument of Z is lazy" ;
136
+ }
137
+
138
+ {
139
+ $ was-lazy = 1 ;
140
+ my @ one := make-lazy-list(10 );
141
+ my @ two = <a b c d e f >;
142
+ my @ res = (@ one X @ two )[^ 20 ];
143
+ ok $ was-lazy , " first argument of X is lazy" ;
105
144
}
106
145
107
146
# vim: ft=perl6
0 commit comments