@@ -2,7 +2,7 @@ import type React from 'react';
2
2
import { render , type RenderOptions } from '@testing-library/react' ;
3
3
import { describe , expect , it , vi } from 'vitest' ;
4
4
import { instrument , traverseFiber } from './core.js' ;
5
- import type { FiberRoot } from './types.js' ;
5
+ import type { Fiber , FiberRoot } from './types.js' ;
6
6
7
7
describe ( 'traverseFiber' , ( ) => {
8
8
const onCommitFiberRoot = vi . fn ( ) ;
@@ -31,19 +31,108 @@ describe('traverseFiber', () => {
31
31
) ;
32
32
33
33
it ( 'should traverse a fiber' , ( ) => {
34
- const handler = vi . fn ( ) ;
35
- traverseFiber ( fiber . current , fiber => handler ( fiber . key ) ) ;
36
- const keys = handler . mock . calls . map ( call => call [ 0 ] ) . slice ( 1 ) ;
37
- const expected = [ 'root' , 'a' , 'a1' , 'a2' , 'b' , 'c' , 'd' , 'd1' , 'd11' ] ;
38
- expect ( keys ) . toEqual ( expected ) ;
34
+ const order : string [ ] = [ ] ;
35
+ traverseFiber ( fiber . current , fiber => {
36
+ fiber . key && order . push ( fiber . key ) ;
37
+ } ) ;
38
+ expect ( order ) . toEqual ( [
39
+ 'root' ,
40
+ 'a' ,
41
+ 'a1' ,
42
+ 'a2' ,
43
+ 'b' ,
44
+ 'c' ,
45
+ 'd' ,
46
+ 'd1' ,
47
+ 'd11' ,
48
+ ] ) ;
39
49
} ) ;
40
50
41
51
it ( 'should traverse a fiber in reverse' , ( ) => {
42
- const handler = vi . fn ( ) ;
52
+ const order : string [ ] = [ ] ;
43
53
const d11 = traverseFiber ( fiber . current , fiber => fiber . key === 'd11' ) ;
44
54
expect ( d11 ?. key ) . toBe ( 'd11' ) ;
45
- traverseFiber ( d11 , fiber => handler ( fiber . key ) , true ) ;
46
- const keys = handler . mock . calls . map ( call => call [ 0 ] ) . slice ( 0 , - 1 ) ;
47
- expect ( keys ) . toEqual ( [ 'd11' , 'd1' , 'd' , 'root' ] ) ;
55
+
56
+ traverseFiber (
57
+ d11 ,
58
+ fiber => {
59
+ fiber . key && order . push ( fiber . key ) ;
60
+ } ,
61
+ true ,
62
+ ) ;
63
+ expect ( order ) . toEqual ( [ 'd11' , 'd1' , 'd' , 'root' ] ) ;
64
+ } ) ;
65
+
66
+ it ( 'should traverse a fiber with entry and leave handlers' , ( ) => {
67
+ const enterOrder : string [ ] = [ ] ;
68
+ const leaveOrder : string [ ] = [ ] ;
69
+ traverseFiber ( fiber . current , {
70
+ enter : fiber => {
71
+ fiber . key && enterOrder . push ( fiber . key ) ;
72
+ } ,
73
+ leave : fiber => {
74
+ fiber . key && leaveOrder . push ( fiber . key ) ;
75
+ } ,
76
+ } ) ;
77
+ expect ( enterOrder ) . toEqual ( [
78
+ 'root' ,
79
+ 'a' ,
80
+ 'a1' ,
81
+ 'a2' ,
82
+ 'b' ,
83
+ 'c' ,
84
+ 'd' ,
85
+ 'd1' ,
86
+ 'd11' ,
87
+ ] ) ;
88
+ expect ( leaveOrder ) . toEqual ( [
89
+ 'a1' ,
90
+ 'a2' ,
91
+ 'a' ,
92
+ 'b' ,
93
+ 'c' ,
94
+ 'd11' ,
95
+ 'd1' ,
96
+ 'd' ,
97
+ 'root' ,
98
+ ] ) ;
99
+ } ) ;
100
+
101
+ it ( 'should traverse a fiber with entry and leave handlers in reverse' , ( ) => {
102
+ const d11 = traverseFiber ( fiber . current , fiber => fiber . key === 'd11' ) ;
103
+ expect ( d11 ?. key ) . toBe ( 'd11' ) ;
104
+
105
+ const enterOrder : string [ ] = [ ] ;
106
+ const leaveOrder : string [ ] = [ ] ;
107
+ traverseFiber ( d11 , {
108
+ ascending : true ,
109
+ enter : fiber => {
110
+ fiber . key && enterOrder . push ( fiber . key ) ;
111
+ } ,
112
+ leave : fiber => {
113
+ fiber . key && leaveOrder . push ( fiber . key ) ;
114
+ } ,
115
+ } ) ;
116
+ expect ( enterOrder ) . toEqual ( [ 'd11' , 'd1' , 'd' , 'root' ] ) ;
117
+ expect ( leaveOrder ) . toEqual ( [ 'root' , 'd' , 'd1' , 'd11' ] ) ;
118
+ } ) ;
119
+
120
+ it ( 'should traverse a fiber and get stack' , ( ) => {
121
+ const stack : Fiber [ ] = [ ] ;
122
+ traverseFiber ( fiber . current , {
123
+ enter : fiber => {
124
+ if ( fiber . key === 'd11' ) {
125
+ const keys = stack . map ( fiber => fiber . key ) . filter ( Boolean ) ;
126
+ expect ( keys ) . toEqual ( [ 'root' , 'd' , 'd1' ] ) ;
127
+ }
128
+
129
+ stack . push ( fiber ) ;
130
+ } ,
131
+ leave : fiber => {
132
+ const last = stack . pop ( ) ;
133
+ expect ( last ) . toBe ( fiber ) ;
134
+ } ,
135
+ } ) ;
136
+ expect ( stack ) . toEqual ( [ ] ) ;
48
137
} ) ;
49
138
} ) ;
0 commit comments