-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy pathuseStableValue.test.ts
More file actions
75 lines (55 loc) · 2.08 KB
/
useStableValue.test.ts
File metadata and controls
75 lines (55 loc) · 2.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import { renderHook } from '@testing-library/react';
import { useStableValue } from './useStableValue';
describe('useStableValue', () => {
it('returns same reference when value is deeply equal', () => {
const initial = { a: 1, b: 'hello', nested: { x: true } };
const { result, rerender } = renderHook(
({ value }) => useStableValue(value),
{ initialProps: { value: initial } },
);
const firstRef = result.current;
// Re-render with a new object that has identical data
rerender({ value: { a: 1, b: 'hello', nested: { x: true } } });
expect(result.current).toBe(firstRef);
});
it('returns new reference when value changes', () => {
const initial = { a: 1, b: 'hello' };
const { result, rerender } = renderHook(
({ value }) => useStableValue(value),
{ initialProps: { value: initial } },
);
const firstRef = result.current;
rerender({ value: { a: 2, b: 'hello' } });
expect(result.current).not.toBe(firstRef);
expect(result.current).toEqual({ a: 2, b: 'hello' });
});
it('handles null to value transition', () => {
const { result, rerender } = renderHook(
({ value }) => useStableValue(value),
{ initialProps: { value: null as { a: number } | null } },
);
expect(result.current).toBeNull();
rerender({ value: { a: 1 } });
expect(result.current).toEqual({ a: 1 });
});
it('handles value to null transition', () => {
const { result, rerender } = renderHook(
({ value }) => useStableValue(value),
{ initialProps: { value: { a: 1 } as { a: number } | null } },
);
expect(result.current).toEqual({ a: 1 });
rerender({ value: null });
expect(result.current).toBeNull();
});
it('is key-order independent', () => {
const initial = { b: 2, a: 1 };
const { result, rerender } = renderHook(
({ value }) => useStableValue(value),
{ initialProps: { value: initial } },
);
const firstRef = result.current;
// Same data, different key order
rerender({ value: { a: 1, b: 2 } });
expect(result.current).toBe(firstRef);
});
});