@@ -71,7 +71,7 @@ suite("CachedAsyncIterable", function() {
71
71
} ) ;
72
72
} ) ;
73
73
74
- suite ( "sync iteration over cached elements" , function ( ) {
74
+ suite . skip ( "sync iteration over cached elements" , function ( ) {
75
75
let o1 , o2 ;
76
76
77
77
suiteSetup ( function ( ) {
@@ -125,7 +125,8 @@ suite("CachedAsyncIterable", function() {
125
125
126
126
const iterable = new CachedAsyncIterable ( generate ( ) ) ;
127
127
await iterable . touchNext ( ) ;
128
- assert . deepEqual ( [ ...iterable ] , [ o1 ] ) ;
128
+ let x = [ ...iterable ] ;
129
+ assert . deepEqual ( [ ...iterable ] , [ o1 ] )
129
130
} ) ;
130
131
131
132
test ( "async iterable with all cached elements" , async function ( ) {
@@ -170,6 +171,47 @@ suite("CachedAsyncIterable", function() {
170
171
const first = await toArray ( iterable ) ;
171
172
assert . deepEqual ( await toArray ( iterable ) , first ) ;
172
173
} ) ;
174
+
175
+ test ( "lazy iterable can be called multiple times in parallel" , async function ( ) {
176
+ let counter = 0 ;
177
+
178
+ async function * generate ( ) {
179
+ while ( true ) {
180
+ counter ++ ;
181
+ yield null ;
182
+ }
183
+ }
184
+
185
+ // We're testing that if the first call to asyncIterator has been
186
+ // made, but the value of it has not been returned yet,
187
+ // the consecutive call returns the same Promise rather than,
188
+ // attempting to fetch the next item from the iterator.
189
+ const iterable = new CachedAsyncIterable ( generate ( ) ) ;
190
+ const [ val1 , val2 ] = await Promise . all ( [
191
+ iterable [ Symbol . asyncIterator ] ( ) . next ( ) ,
192
+ iterable [ Symbol . asyncIterator ] ( ) . next ( ) ,
193
+ ] ) ;
194
+ assert . equal ( counter , 1 ) ;
195
+ assert . equal ( val1 , val2 ) ;
196
+ } ) ;
197
+
198
+ test ( "iterable's next can be called multiple times in parallel" , async function ( ) {
199
+ let counter = 0 ;
200
+
201
+ async function * generate ( ) {
202
+ while ( true ) {
203
+ counter ++ ;
204
+ yield null ;
205
+ }
206
+ }
207
+
208
+ const iterable = new CachedAsyncIterable ( generate ( ) ) ;
209
+ const iterator = iterable [ Symbol . asyncIterator ] ( ) ;
210
+ let val1 = await iterator . next ( ) ;
211
+ let val2 = await iterator . next ( ) ;
212
+ assert . equal ( counter , 2 ) ;
213
+ assert . notEqual ( val1 , val2 ) ;
214
+ } ) ;
173
215
} ) ;
174
216
175
217
suite ( "async touchNext" , function ( ) {
@@ -273,5 +315,30 @@ suite("CachedAsyncIterable", function() {
273
315
await iterable . touchNext ( ) ,
274
316
{ value : undefined , done : true } ) ;
275
317
} ) ;
318
+
319
+ test ( "touchNext can be called multiple times in parallel" , async function ( ) {
320
+ let counter = 0 ;
321
+
322
+ async function * generate ( ) {
323
+ let value = 5 ;
324
+ while ( value -- > 0 ) {
325
+ counter ++ ;
326
+ yield await Promise . resolve ( value ) ;
327
+ }
328
+ }
329
+
330
+ // We're testing that if the first call to asyncIterator has been
331
+ // made, but the value of it has not been returned yet,
332
+ // the consequitive call returns the same Promise rather than,
333
+ // attempting to fetch the next item from the iterator.
334
+ const iterable = new CachedAsyncIterable ( generate ( ) ) ;
335
+ await Promise . all ( [
336
+ iterable . touchNext ( 2 ) ,
337
+ iterable [ Symbol . asyncIterator ] ( ) . next ( ) ,
338
+ iterable . touchNext ( 2 ) ,
339
+ iterable [ Symbol . asyncIterator ] ( ) . next ( ) ,
340
+ ] ) ;
341
+ assert . equal ( counter , 4 ) ;
342
+ } ) ;
276
343
} ) ;
277
344
} ) ;
0 commit comments