1
- import { describe , expect , it } from 'vitest' ;
2
- import type { Fiber } from '../../types.js' ;
1
+ // import bippy, then react
2
+ import { expect , it , describe , vi } from 'vitest' ;
3
+ await import ( '../../index.js' ) ;
4
+ // biome-ignore lint/correctness/noUnusedVariables: needed for JSX
5
+ const React = require ( 'react' ) ;
6
+ import type { Fiber , FiberRoot } from '../../types.js' ;
3
7
import {
4
8
isValidFiber ,
5
9
isHostFiber ,
@@ -15,9 +19,7 @@ import {
15
19
getFiberFromHostInstance ,
16
20
instrument ,
17
21
} from '../../index.js' ;
18
- // biome-ignore lint/correctness/noUnusedImports: needed for JSX
19
- import React from 'react' ;
20
- import { render , screen } from '@testing-library/react' ;
22
+ import { render , type RenderOptions , screen } from '@testing-library/react' ;
21
23
import {
22
24
BasicComponent ,
23
25
BasicComponentWithChildren ,
@@ -276,6 +278,138 @@ describe('traverseFiber', () => {
276
278
) ,
277
279
) . toBe ( ( maybeFiber as unknown as Fiber ) ?. child ) ;
278
280
} ) ;
281
+
282
+
283
+ const onCommitFiberRoot = vi . fn ( ) ;
284
+ instrument ( { onCommitFiberRoot } ) ;
285
+
286
+ const renderWithFiber = ( ui : React . ReactNode , options ?: RenderOptions ) => {
287
+ const result = render ( ui , options ) ;
288
+ const fiber : FiberRoot = onCommitFiberRoot . mock . lastCall ?. [ 1 ] ;
289
+ return { ...result , fiber } ;
290
+ } ;
291
+
292
+ const { fiber } = renderWithFiber (
293
+ < div key = "root" >
294
+ < div key = "a" >
295
+ < div key = "a1" />
296
+ < div key = "a2" />
297
+ </ div >
298
+ < div key = "b" />
299
+ < div key = "c" />
300
+ < div key = "d" >
301
+ < div key = "d1" >
302
+ < div key = "d11" />
303
+ </ div >
304
+ </ div >
305
+ </ div > ,
306
+ ) ;
307
+
308
+ it ( 'should traverse a fiber' , ( ) => {
309
+ const order : string [ ] = [ ] ;
310
+ traverseFiber ( fiber . current , fiber => {
311
+ fiber . key && order . push ( fiber . key ) ;
312
+ } ) ;
313
+ expect ( order ) . toEqual ( [
314
+ 'root' ,
315
+ 'a' ,
316
+ 'a1' ,
317
+ 'a2' ,
318
+ 'b' ,
319
+ 'c' ,
320
+ 'd' ,
321
+ 'd1' ,
322
+ 'd11' ,
323
+ ] ) ;
324
+ } ) ;
325
+
326
+ it ( 'should traverse a fiber in reverse' , ( ) => {
327
+ const order : string [ ] = [ ] ;
328
+ const d11 = traverseFiber ( fiber . current , fiber => fiber . key === 'd11' ) ;
329
+ expect ( d11 ?. key ) . toBe ( 'd11' ) ;
330
+
331
+ traverseFiber (
332
+ d11 ,
333
+ fiber => {
334
+ fiber . key && order . push ( fiber . key ) ;
335
+ } ,
336
+ true ,
337
+ ) ;
338
+ expect ( order ) . toEqual ( [ 'd11' , 'd1' , 'd' , 'root' ] ) ;
339
+ } ) ;
340
+
341
+ it ( 'should traverse a fiber with entry and leave handlers' , ( ) => {
342
+ const enterOrder : string [ ] = [ ] ;
343
+ const leaveOrder : string [ ] = [ ] ;
344
+ traverseFiber ( fiber . current , {
345
+ enter : fiber => {
346
+ fiber . key && enterOrder . push ( fiber . key ) ;
347
+ } ,
348
+ leave : fiber => {
349
+ fiber . key && leaveOrder . push ( fiber . key ) ;
350
+ } ,
351
+ } ) ;
352
+ expect ( enterOrder ) . toEqual ( [
353
+ 'root' ,
354
+ 'a' ,
355
+ 'a1' ,
356
+ 'a2' ,
357
+ 'b' ,
358
+ 'c' ,
359
+ 'd' ,
360
+ 'd1' ,
361
+ 'd11' ,
362
+ ] ) ;
363
+ expect ( leaveOrder ) . toEqual ( [
364
+ 'a1' ,
365
+ 'a2' ,
366
+ 'a' ,
367
+ 'b' ,
368
+ 'c' ,
369
+ 'd11' ,
370
+ 'd1' ,
371
+ 'd' ,
372
+ 'root' ,
373
+ ] ) ;
374
+ } ) ;
375
+
376
+ it ( 'should traverse a fiber with entry and leave handlers in reverse' , ( ) => {
377
+ const d11 = traverseFiber ( fiber . current , fiber => fiber . key === 'd11' ) ;
378
+ expect ( d11 ?. key ) . toBe ( 'd11' ) ;
379
+
380
+ const enterOrder : string [ ] = [ ] ;
381
+ const leaveOrder : string [ ] = [ ] ;
382
+ traverseFiber ( d11 , {
383
+ ascending : true ,
384
+ enter : fiber => {
385
+ fiber . key && enterOrder . push ( fiber . key ) ;
386
+ } ,
387
+ leave : fiber => {
388
+ fiber . key && leaveOrder . push ( fiber . key ) ;
389
+ } ,
390
+ } ) ;
391
+ expect ( enterOrder ) . toEqual ( [ 'd11' , 'd1' , 'd' , 'root' ] ) ;
392
+ expect ( leaveOrder ) . toEqual ( [ 'root' , 'd' , 'd1' , 'd11' ] ) ;
393
+ } ) ;
394
+
395
+ it ( 'should traverse a fiber and get stack' , ( ) => {
396
+ const stack : Fiber [ ] = [ ] ;
397
+ traverseFiber ( fiber . current , {
398
+ enter : fiber => {
399
+ if ( fiber . key === 'd11' ) {
400
+ const keys = stack . map ( fiber => fiber . key ) . filter ( Boolean ) ;
401
+ expect ( keys ) . toEqual ( [ 'root' , 'd' , 'd1' ] ) ;
402
+ }
403
+
404
+ stack . push ( fiber ) ;
405
+ } ,
406
+ leave : fiber => {
407
+ const last = stack . pop ( ) ;
408
+ expect ( last ) . toBe ( fiber ) ;
409
+ } ,
410
+ } ) ;
411
+ expect ( stack ) . toEqual ( [ ] ) ;
412
+ } ) ;
279
413
} ) ;
280
414
281
415
describe ( 'getFiberFromHostInstance' , ( ) => {
0 commit comments