|
1 | 1 | import useBoolean from '..' |
2 | 2 |
|
3 | 3 | describe('useBoolean', () => { |
4 | | - // 基础功能测试 |
5 | | - it('should be defined', () => { |
6 | | - expect(useBoolean).toBeDefined() |
| 4 | + describe('Basic functionality', () => { |
| 5 | + it('should be defined', () => { |
| 6 | + expect(useBoolean).toBeDefined() |
| 7 | + }) |
| 8 | + |
| 9 | + it('default value should be false', () => { |
| 10 | + const [state] = useBoolean() |
| 11 | + expect(state.value).toBe(false) |
| 12 | + }) |
| 13 | + |
| 14 | + it('should accept custom default value', () => { |
| 15 | + const [state] = useBoolean(true) |
| 16 | + expect(state.value).toBe(true) |
| 17 | + }) |
7 | 18 | }) |
8 | 19 |
|
9 | | - // 默认值测试 |
10 | | - it('should default to be false', () => { |
11 | | - const [state] = useBoolean() |
12 | | - expect(state.value).toBeFalsy() |
| 20 | + describe('Operations', () => { |
| 21 | + let state: ReturnType<typeof useBoolean>[0] |
| 22 | + let actions: ReturnType<typeof useBoolean>[1] |
| 23 | + beforeEach(() => { |
| 24 | + ;[state, actions] = useBoolean(true) |
| 25 | + }) |
| 26 | + |
| 27 | + it('toggle should switch state', () => { |
| 28 | + actions.toggle() |
| 29 | + expect(state.value).toBe(false) |
| 30 | + actions.toggle() |
| 31 | + expect(state.value).toBe(true) |
| 32 | + }) |
| 33 | + |
| 34 | + it('set should set specified value', () => { |
| 35 | + actions.set(false) |
| 36 | + expect(state.value).toBe(false) |
| 37 | + actions.set(true) |
| 38 | + expect(state.value).toBe(true) |
| 39 | + }) |
| 40 | + |
| 41 | + it('setTrue/setFalse should set to true/false respectively', () => { |
| 42 | + actions.setFalse() |
| 43 | + expect(state.value).toBe(false) |
| 44 | + actions.setTrue() |
| 45 | + expect(state.value).toBe(true) |
| 46 | + }) |
13 | 47 | }) |
14 | 48 |
|
15 | | - // 自定义默认值测试 |
16 | | - it('should accept custom default value', () => { |
17 | | - const [state] = useBoolean(true) |
18 | | - expect(state.value).toBeTruthy() |
| 49 | + describe('Reactivity', () => { |
| 50 | + let state: ReturnType<typeof useBoolean>[0] |
| 51 | + let set: ReturnType<typeof useBoolean>[1]['set'] |
| 52 | + beforeEach(() => { |
| 53 | + ;[state, { set }] = useBoolean(false) |
| 54 | + }) |
| 55 | + |
| 56 | + it('set should update state multiple times', () => { |
| 57 | + set(true) |
| 58 | + expect(state.value).toBe(true) |
| 59 | + set(false) |
| 60 | + set(true) |
| 61 | + set(false) |
| 62 | + expect(state.value).toBe(false) |
| 63 | + }) |
19 | 64 | }) |
20 | 65 |
|
21 | | - // 完整功能测试 |
22 | | - it('should work with all actions', () => { |
23 | | - const [state, { set, setFalse, setTrue, toggle }] = useBoolean(true) |
24 | | - |
25 | | - // 初始值测试 |
26 | | - expect(state.value).toBeTruthy() |
27 | | - |
28 | | - // toggle 功能测试 |
29 | | - toggle() |
30 | | - expect(state.value).toBeFalsy() |
31 | | - toggle() |
32 | | - expect(state.value).toBeTruthy() |
33 | | - |
34 | | - // set 功能测试 |
35 | | - set(false) |
36 | | - expect(state.value).toBeFalsy() |
37 | | - set(true) |
38 | | - expect(state.value).toBeTruthy() |
39 | | - |
40 | | - // setTrue 功能测试 |
41 | | - setFalse() |
42 | | - expect(state.value).toBeFalsy() |
43 | | - setTrue() |
44 | | - expect(state.value).toBeTruthy() |
45 | | - |
46 | | - // setFalse 功能测试 |
47 | | - setTrue() |
48 | | - expect(state.value).toBeTruthy() |
49 | | - setFalse() |
50 | | - expect(state.value).toBeFalsy() |
| 66 | + describe('Edge cases', () => { |
| 67 | + let state: ReturnType<typeof useBoolean>[0] |
| 68 | + let set: ReturnType<typeof useBoolean>[1]['set'] |
| 69 | + beforeEach(() => { |
| 70 | + ;[state, { set }] = useBoolean(false) |
| 71 | + }) |
| 72 | + |
| 73 | + it('set(null) should be false', () => { |
| 74 | + set(null as any) |
| 75 | + expect(state.value).toBe(false) |
| 76 | + }) |
| 77 | + it('set(undefined) should be false', () => { |
| 78 | + set(undefined as any) |
| 79 | + expect(state.value).toBe(false) |
| 80 | + }) |
| 81 | + it('set(NaN) should be false', () => { |
| 82 | + set(NaN as any) |
| 83 | + expect(state.value).toBe(false) |
| 84 | + }) |
| 85 | + it('set({}) should be true', () => { |
| 86 | + set({} as any) |
| 87 | + expect(state.value).toBe(true) |
| 88 | + }) |
| 89 | + it('set([]) should be true', () => { |
| 90 | + set([] as any) |
| 91 | + expect(state.value).toBe(true) |
| 92 | + }) |
51 | 93 | }) |
52 | | - // 响应式测试 |
53 | | - it('should be reactive', () => { |
54 | | - const [state, { set }] = useBoolean(false) |
55 | | - |
56 | | - // 测试响应式更新 |
57 | | - set(true) |
58 | | - expect(state.value).toBeTruthy() |
59 | | - |
60 | | - // 测试多次更新 |
61 | | - set(false) |
62 | | - set(true) |
63 | | - set(false) |
64 | | - expect(state.value).toBeFalsy() |
65 | | - }) |
66 | | - |
67 | | - // 边界情况测试 |
68 | | - it('should handle edge cases', () => { |
69 | | - const [state, { set }] = useBoolean(false) |
70 | | - |
71 | | - // 测试 null |
72 | | - set(null as any) |
73 | | - expect(state.value).toBeFalsy() |
74 | | - |
75 | | - // 测试 undefined |
76 | | - set(undefined as any) |
77 | | - expect(state.value).toBeFalsy() |
78 | | - |
79 | | - // 测试 NaN |
80 | | - set(NaN as any) |
81 | | - expect(state.value).toBeFalsy() |
82 | | - |
83 | | - // 测试对象 |
84 | | - set({} as any) |
85 | | - expect(state.value).toBeTruthy() |
86 | | - |
87 | | - // 测试数组 |
88 | | - set([] as any) |
89 | | - expect(state.value).toBeTruthy() |
90 | | - }) |
91 | | - |
92 | | - // 性能测试 |
93 | | - it('should handle rapid toggles', () => { |
94 | | - const [state, { toggle }] = useBoolean(false) |
95 | | - |
96 | | - // 快速切换测试 |
97 | | - for (let i = 0; i < 100; i++) { |
98 | | - toggle() |
99 | | - } |
100 | 94 |
|
101 | | - expect(state.value).toBeFalsy() // 偶数次切换应该回到初始值 |
| 95 | + describe('Performance', () => { |
| 96 | + it('should return to initial value after toggling 100 times quickly', () => { |
| 97 | + const [state, { toggle }] = useBoolean(false) |
| 98 | + for (let i = 0; i < 100; i++) { |
| 99 | + toggle() |
| 100 | + } |
| 101 | + expect(state.value).toBe(false) |
| 102 | + }) |
102 | 103 | }) |
103 | 104 | }) |
0 commit comments