@@ -183,6 +183,323 @@ describe('ReactDOMFizSuspenseList', () => {
183
183
) ;
184
184
} ) ;
185
185
186
+ // @gate enableSuspenseList
187
+ it ( 'displays all "together"' , async ( ) => {
188
+ const A = createAsyncText ( 'A' ) ;
189
+ const B = createAsyncText ( 'B' ) ;
190
+ const C = createAsyncText ( 'C' ) ;
191
+
192
+ function Foo ( ) {
193
+ return (
194
+ < div >
195
+ < SuspenseList revealOrder = "together" >
196
+ < Suspense fallback = { < Text text = "Loading A" /> } >
197
+ < A />
198
+ </ Suspense >
199
+ < Suspense fallback = { < Text text = "Loading B" /> } >
200
+ < B />
201
+ </ Suspense >
202
+ < Suspense fallback = { < Text text = "Loading C" /> } >
203
+ < C />
204
+ </ Suspense >
205
+ </ SuspenseList >
206
+ </ div >
207
+ ) ;
208
+ }
209
+
210
+ await A . resolve ( ) ;
211
+
212
+ await serverAct ( async ( ) => {
213
+ const { pipe} = ReactDOMFizzServer . renderToPipeableStream ( < Foo /> ) ;
214
+ pipe ( writable ) ;
215
+ } ) ;
216
+
217
+ assertLog ( [
218
+ 'A' ,
219
+ 'Suspend! [B]' ,
220
+ 'Suspend! [C]' ,
221
+ 'Loading A' ,
222
+ 'Loading B' ,
223
+ 'Loading C' ,
224
+ ] ) ;
225
+
226
+ expect ( getVisibleChildren ( container ) ) . toEqual (
227
+ < div >
228
+ < span > Loading A</ span >
229
+ < span > Loading B</ span >
230
+ < span > Loading C</ span >
231
+ </ div > ,
232
+ ) ;
233
+
234
+ await serverAct ( ( ) => B . resolve ( ) ) ;
235
+ assertLog ( [ 'B' ] ) ;
236
+
237
+ expect ( getVisibleChildren ( container ) ) . toEqual (
238
+ < div >
239
+ < span > Loading A</ span >
240
+ < span > Loading B</ span >
241
+ < span > Loading C</ span >
242
+ </ div > ,
243
+ ) ;
244
+
245
+ await serverAct ( ( ) => C . resolve ( ) ) ;
246
+ assertLog ( [ 'C' ] ) ;
247
+
248
+ expect ( getVisibleChildren ( container ) ) . toEqual (
249
+ < div >
250
+ < span > A</ span >
251
+ < span > B</ span >
252
+ < span > C</ span >
253
+ </ div > ,
254
+ ) ;
255
+ } ) ;
256
+
257
+ // @gate enableSuspenseList
258
+ it ( 'displays all "together" in a single pass' , async ( ) => {
259
+ function Foo ( ) {
260
+ return (
261
+ < div >
262
+ < SuspenseList revealOrder = "together" >
263
+ < Suspense fallback = { < Text text = "Loading A" /> } >
264
+ < Text text = "A" />
265
+ </ Suspense >
266
+ < Suspense fallback = { < Text text = "Loading B" /> } >
267
+ < Text text = "B" />
268
+ </ Suspense >
269
+ < Suspense fallback = { < Text text = "Loading C" /> } >
270
+ < Text text = "C" />
271
+ </ Suspense >
272
+ </ SuspenseList >
273
+ </ div >
274
+ ) ;
275
+ }
276
+
277
+ const { pipe} = ReactDOMFizzServer . renderToPipeableStream ( < Foo /> ) ;
278
+ pipe ( writable ) ;
279
+ await 0 ;
280
+ const bufferedContent = buffer ;
281
+ buffer = '' ;
282
+
283
+ assertLog ( [ 'A' , 'B' , 'C' , 'Loading A' , 'Loading B' , 'Loading C' ] ) ;
284
+
285
+ expect ( bufferedContent ) . toMatchInlineSnapshot (
286
+ `"<div><!--$--><span>A</span><!--/$--><!--$--><span>B</span><!--/$--><!--$--><span>C</span><!--/$--></div>"` ,
287
+ ) ;
288
+ } ) ;
289
+
290
+ // @gate enableSuspenseList
291
+ it ( 'displays all "together" even when nested as siblings' , async ( ) => {
292
+ const A = createAsyncText ( 'A' ) ;
293
+ const B = createAsyncText ( 'B' ) ;
294
+ const C = createAsyncText ( 'C' ) ;
295
+
296
+ function Foo ( ) {
297
+ return (
298
+ < div >
299
+ < SuspenseList revealOrder = "together" >
300
+ < div >
301
+ < Suspense fallback = { < Text text = "Loading A" /> } >
302
+ < A />
303
+ </ Suspense >
304
+ < Suspense fallback = { < Text text = "Loading B" /> } >
305
+ < B />
306
+ </ Suspense >
307
+ </ div >
308
+ < div >
309
+ < Suspense fallback = { < Text text = "Loading C" /> } >
310
+ < C />
311
+ </ Suspense >
312
+ </ div >
313
+ </ SuspenseList >
314
+ </ div >
315
+ ) ;
316
+ }
317
+
318
+ await A . resolve ( ) ;
319
+
320
+ await serverAct ( async ( ) => {
321
+ const { pipe} = ReactDOMFizzServer . renderToPipeableStream ( < Foo /> ) ;
322
+ pipe ( writable ) ;
323
+ } ) ;
324
+
325
+ assertLog ( [
326
+ 'A' ,
327
+ 'Suspend! [B]' ,
328
+ 'Suspend! [C]' ,
329
+ 'Loading A' ,
330
+ 'Loading B' ,
331
+ 'Loading C' ,
332
+ ] ) ;
333
+
334
+ expect ( getVisibleChildren ( container ) ) . toEqual (
335
+ < div >
336
+ < div >
337
+ < span > Loading A</ span >
338
+ < span > Loading B</ span >
339
+ </ div >
340
+ < div >
341
+ < span > Loading C</ span >
342
+ </ div >
343
+ </ div > ,
344
+ ) ;
345
+
346
+ await serverAct ( ( ) => B . resolve ( ) ) ;
347
+ assertLog ( [ 'B' ] ) ;
348
+
349
+ expect ( getVisibleChildren ( container ) ) . toEqual (
350
+ < div >
351
+ < div >
352
+ < span > Loading A</ span >
353
+ < span > Loading B</ span >
354
+ </ div >
355
+ < div >
356
+ < span > Loading C</ span >
357
+ </ div >
358
+ </ div > ,
359
+ ) ;
360
+
361
+ await serverAct ( ( ) => C . resolve ( ) ) ;
362
+ assertLog ( [ 'C' ] ) ;
363
+
364
+ expect ( getVisibleChildren ( container ) ) . toEqual (
365
+ < div >
366
+ < div >
367
+ < span > A</ span >
368
+ < span > B</ span >
369
+ </ div >
370
+ < div >
371
+ < span > C</ span >
372
+ </ div >
373
+ </ div > ,
374
+ ) ;
375
+ } ) ;
376
+
377
+ // @gate enableSuspenseList
378
+ it ( 'displays all "together" in nested SuspenseLists' , async ( ) => {
379
+ const A = createAsyncText ( 'A' ) ;
380
+ const B = createAsyncText ( 'B' ) ;
381
+ const C = createAsyncText ( 'C' ) ;
382
+
383
+ function Foo ( ) {
384
+ return (
385
+ < div >
386
+ < SuspenseList revealOrder = "together" >
387
+ < Suspense fallback = { < Text text = "Loading A" /> } >
388
+ < A />
389
+ </ Suspense >
390
+ < SuspenseList revealOrder = "together" >
391
+ < Suspense fallback = { < Text text = "Loading B" /> } >
392
+ < B />
393
+ </ Suspense >
394
+ < Suspense fallback = { < Text text = "Loading C" /> } >
395
+ < C />
396
+ </ Suspense >
397
+ </ SuspenseList >
398
+ </ SuspenseList >
399
+ </ div >
400
+ ) ;
401
+ }
402
+
403
+ await A . resolve ( ) ;
404
+ await B . resolve ( ) ;
405
+
406
+ await serverAct ( async ( ) => {
407
+ const { pipe} = ReactDOMFizzServer . renderToPipeableStream ( < Foo /> ) ;
408
+ pipe ( writable ) ;
409
+ } ) ;
410
+
411
+ assertLog ( [
412
+ 'A' ,
413
+ 'B' ,
414
+ 'Suspend! [C]' ,
415
+ 'Loading A' ,
416
+ 'Loading B' ,
417
+ 'Loading C' ,
418
+ ] ) ;
419
+
420
+ expect ( getVisibleChildren ( container ) ) . toEqual (
421
+ < div >
422
+ < span > Loading A</ span >
423
+ < span > Loading B</ span >
424
+ < span > Loading C</ span >
425
+ </ div > ,
426
+ ) ;
427
+
428
+ await serverAct ( ( ) => C . resolve ( ) ) ;
429
+ assertLog ( [ 'C' ] ) ;
430
+
431
+ expect ( getVisibleChildren ( container ) ) . toEqual (
432
+ < div >
433
+ < span > A</ span >
434
+ < span > B</ span >
435
+ < span > C</ span >
436
+ </ div > ,
437
+ ) ;
438
+ } ) ;
439
+
440
+ // @gate enableSuspenseList
441
+ it ( 'displays all "together" in nested SuspenseLists where the inner is default' , async ( ) => {
442
+ const A = createAsyncText ( 'A' ) ;
443
+ const B = createAsyncText ( 'B' ) ;
444
+ const C = createAsyncText ( 'C' ) ;
445
+
446
+ function Foo ( ) {
447
+ return (
448
+ < div >
449
+ < SuspenseList revealOrder = "together" >
450
+ < Suspense fallback = { < Text text = "Loading A" /> } >
451
+ < A />
452
+ </ Suspense >
453
+ < SuspenseList >
454
+ < Suspense fallback = { < Text text = "Loading B" /> } >
455
+ < B />
456
+ </ Suspense >
457
+ < Suspense fallback = { < Text text = "Loading C" /> } >
458
+ < C />
459
+ </ Suspense >
460
+ </ SuspenseList >
461
+ </ SuspenseList >
462
+ </ div >
463
+ ) ;
464
+ }
465
+
466
+ await A . resolve ( ) ;
467
+ await B . resolve ( ) ;
468
+
469
+ await serverAct ( async ( ) => {
470
+ const { pipe} = ReactDOMFizzServer . renderToPipeableStream ( < Foo /> ) ;
471
+ pipe ( writable ) ;
472
+ } ) ;
473
+
474
+ assertLog ( [
475
+ 'A' ,
476
+ 'B' ,
477
+ 'Suspend! [C]' ,
478
+ 'Loading A' ,
479
+ 'Loading B' ,
480
+ 'Loading C' ,
481
+ ] ) ;
482
+
483
+ expect ( getVisibleChildren ( container ) ) . toEqual (
484
+ < div >
485
+ < span > Loading A</ span >
486
+ < span > Loading B</ span >
487
+ < span > Loading C</ span >
488
+ </ div > ,
489
+ ) ;
490
+
491
+ await serverAct ( ( ) => C . resolve ( ) ) ;
492
+ assertLog ( [ 'C' ] ) ;
493
+
494
+ expect ( getVisibleChildren ( container ) ) . toEqual (
495
+ < div >
496
+ < span > A</ span >
497
+ < span > B</ span >
498
+ < span > C</ span >
499
+ </ div > ,
500
+ ) ;
501
+ } ) ;
502
+
186
503
// @gate enableSuspenseList
187
504
it ( 'displays each items in "forwards" order' , async ( ) => {
188
505
const A = createAsyncText ( 'A' ) ;
0 commit comments