Skip to content

Commit 1044194

Browse files
committed
test: move traverseFiber cases to test/core/fiber.test.tsx
1 parent ab6b3c6 commit 1044194

File tree

4 files changed

+140
-145
lines changed

4 files changed

+140
-145
lines changed

packages/bippy/src/core.test.tsx

Lines changed: 0 additions & 138 deletions
This file was deleted.

packages/bippy/src/test/core/fiber.test.tsx

Lines changed: 139 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
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';
37
import {
48
isValidFiber,
59
isHostFiber,
@@ -15,9 +19,7 @@ import {
1519
getFiberFromHostInstance,
1620
instrument,
1721
} 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';
2123
import {
2224
BasicComponent,
2325
BasicComponentWithChildren,
@@ -276,6 +278,138 @@ describe('traverseFiber', () => {
276278
),
277279
).toBe((maybeFiber as unknown as Fiber)?.child);
278280
});
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+
});
279413
});
280414

281415
describe('getFiberFromHostInstance', () => {

setup-test.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"compilerOptions": {
3-
"jsx": "react-jsx",
3+
"jsx": "react",
44
"module": "NodeNext",
55
"esModuleInterop": true,
66
"strictNullChecks": true,

0 commit comments

Comments
 (0)