|
| 1 | +import type React from 'react'; |
| 2 | +import { render, type RenderOptions } from '@testing-library/react'; |
| 3 | +import { describe, expect, it, vi } from 'vitest'; |
| 4 | +import { instrument, traverseFiber } from './core.js'; |
| 5 | +import type { FiberRoot } from './types.js'; |
| 6 | + |
| 7 | +describe('traverseFiber', () => { |
| 8 | + const onCommitFiberRoot = vi.fn(); |
| 9 | + instrument({ onCommitFiberRoot }); |
| 10 | + |
| 11 | + const renderWithFiber = (ui: React.ReactNode, options?: RenderOptions) => { |
| 12 | + const result = render(ui, options); |
| 13 | + const fiber: FiberRoot = onCommitFiberRoot.mock.lastCall?.[1]; |
| 14 | + return { ...result, fiber }; |
| 15 | + }; |
| 16 | + |
| 17 | + const { fiber } = renderWithFiber( |
| 18 | + <div key="root"> |
| 19 | + <div key="a"> |
| 20 | + <div key="a1" /> |
| 21 | + <div key="a2" /> |
| 22 | + </div> |
| 23 | + <div key="b" /> |
| 24 | + <div key="c" /> |
| 25 | + <div key="d"> |
| 26 | + <div key="d1"> |
| 27 | + <div key="d11" /> |
| 28 | + </div> |
| 29 | + </div> |
| 30 | + </div>, |
| 31 | + ); |
| 32 | + |
| 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); |
| 39 | + }); |
| 40 | + |
| 41 | + it('should traverse a fiber in reverse', () => { |
| 42 | + const handler = vi.fn(); |
| 43 | + const d11 = traverseFiber(fiber.current, fiber => fiber.key === 'd11'); |
| 44 | + 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']); |
| 48 | + }); |
| 49 | +}); |
0 commit comments