@@ -2,8 +2,31 @@ import { Repeater } from "@repeaterjs/repeater";
2
2
import { act , renderHook } from "@testing-library/react-hooks" ;
3
3
import { useAsyncIter , useRepeater , useResult } from "../react-hooks" ;
4
4
5
+ describe ( "useRepeater" , ( ) => {
6
+ test ( "basic" , async ( ) => {
7
+ const { result } = renderHook ( ( ) => {
8
+ return useRepeater ( ) ;
9
+ } ) ;
10
+
11
+ const [ repeater , push , stop ] = result . current ;
12
+ expect ( repeater ) . toBeDefined ( ) ;
13
+ expect ( push ) . toBeDefined ( ) ;
14
+ expect ( stop ) . toBeDefined ( ) ;
15
+ push ( 1 ) ;
16
+ expect ( await repeater . next ( ) ) . toEqual ( { value : 1 , done : false } ) ;
17
+ push ( 2 ) ;
18
+ expect ( await repeater . next ( ) ) . toEqual ( { value : 2 , done : false } ) ;
19
+ push ( 3 ) ;
20
+ push ( 4 ) ;
21
+ expect ( await repeater . next ( ) ) . toEqual ( { value : 3 , done : false } ) ;
22
+ expect ( await repeater . next ( ) ) . toEqual ( { value : 4 , done : false } ) ;
23
+ stop ( ) ;
24
+ expect ( await repeater . next ( ) ) . toEqual ( { done : true } ) ;
25
+ } ) ;
26
+ } ) ;
27
+
5
28
describe ( "useAsyncIter" , ( ) => {
6
- test ( "render " , async ( ) => {
29
+ test ( "basic " , async ( ) => {
7
30
const callback = jest . fn ( async function * ( ) : AsyncIterableIterator < number > {
8
31
yield 1 ;
9
32
await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
@@ -40,14 +63,37 @@ describe("useAsyncIter", () => {
40
63
return useAsyncIter ( callback ) ;
41
64
} ) ;
42
65
66
+ expect ( await result . current . next ( ) ) . toEqual ( { value : 1 , done : false } ) ;
43
67
unmount ( ) ;
44
68
expect ( await result . current . next ( ) ) . toEqual ( { done : true } ) ;
45
69
expect ( callback ) . toHaveBeenCalledTimes ( 1 ) ;
46
70
} ) ;
71
+
72
+ test ( "deps" , async ( ) => {
73
+ const callback = jest . fn ( async function * (
74
+ deps : AsyncIterableIterator < [ number ] >
75
+ ) : AsyncIterableIterator < number > {
76
+ for await ( const [ num ] of deps ) {
77
+ yield num ** 2 ;
78
+ }
79
+ } ) ;
80
+
81
+ const { result, rerender } = renderHook ( ( props ) => {
82
+ return useAsyncIter ( callback , [ props . num ] ) ;
83
+ } , { initialProps : { num : 1 } } ) ;
84
+
85
+ expect ( await result . current . next ( ) ) . toEqual ( { value : 1 , done : false } ) ;
86
+ rerender ( { num : 2 } ) ;
87
+ expect ( await result . current . next ( ) ) . toEqual ( { value : 4 , done : false } ) ;
88
+ rerender ( { num : 3 } ) ;
89
+ rerender ( { num : 4 } ) ;
90
+ expect ( await result . current . next ( ) ) . toEqual ( { value : 9 , done : false } ) ;
91
+ expect ( await result . current . next ( ) ) . toEqual ( { value : 16 , done : false } ) ;
92
+ } ) ;
47
93
} ) ;
48
94
49
95
describe ( "useResult" , ( ) => {
50
- test ( "render " , async ( ) => {
96
+ test ( "basic " , async ( ) => {
51
97
let push : ( value : number ) => Promise < void > ;
52
98
let stop : ( ( ) => void ) & Promise < void > ;
53
99
const repeater = new Repeater ( async ( push1 , stop1 ) => {
@@ -97,36 +143,41 @@ describe("useResult", () => {
97
143
expect ( result . current ) . toBeUndefined ( ) ;
98
144
await act ( ( ) => push ( 1 ) ) ;
99
145
expect ( result . current ) . toEqual ( { value : 1 , done : false } ) ;
100
- await act ( ( ) => push ( 2 ) ) ;
101
- expect ( result . current ) . toEqual ( { value : 2 , done : false } ) ;
102
- await act ( ( ) => push ( 3 ) ) ;
103
- expect ( result . current ) . toEqual ( { value : 3 , done : false } ) ;
104
146
unmount ( ) ;
105
- expect ( result . current ) . toEqual ( { value : 3 , done : false } ) ;
106
147
expect ( callback ) . toHaveBeenCalledTimes ( 1 ) ;
107
148
expect ( returnSpy ) . toHaveBeenCalledTimes ( 1 ) ;
108
149
} ) ;
109
- } ) ;
110
150
111
- describe ( "useRepeater" , ( ) => {
112
- test ( "render" , async ( ) => {
113
- const { result } = renderHook ( ( ) => {
114
- return useRepeater ( ) ;
151
+ test ( "deps" , async ( ) => {
152
+ const callback = jest . fn ( ( deps ) => {
153
+ return new Repeater < number > ( async ( push1 ) => {
154
+ const push = async ( num : number ) => {
155
+ return act ( ( ) => push1 ( num ) ) ;
156
+ } ;
157
+
158
+ for await ( const [ num ] of deps ) {
159
+ await push ( num ) ;
160
+ }
161
+
162
+ return - 1 ;
163
+ } ) ;
115
164
} ) ;
116
165
117
- const [ repeater , push , stop ] = result . current ;
118
- expect ( repeater ) . toBeDefined ( ) ;
119
- expect ( push ) . toBeDefined ( ) ;
120
- expect ( stop ) . toBeDefined ( ) ;
121
- push ( 1 ) ;
122
- push ( 2 ) ;
123
- push ( 3 ) ;
124
- push ( 4 ) ;
125
- stop ( ) ;
126
- expect ( await repeater . next ( ) ) . toEqual ( { value : 1 , done : false } ) ;
127
- expect ( await repeater . next ( ) ) . toEqual ( { value : 2 , done : false } ) ;
128
- expect ( await repeater . next ( ) ) . toEqual ( { value : 3 , done : false } ) ;
129
- expect ( await repeater . next ( ) ) . toEqual ( { value : 4 , done : false } ) ;
130
- expect ( await repeater . next ( ) ) . toEqual ( { done : true } ) ;
166
+ const { result, rerender, waitForNextUpdate } = renderHook ( ( props ) => {
167
+ return useResult ( callback , [ props . num ] ) ;
168
+ } , { initialProps : { num : 1 } } ) ;
169
+
170
+ expect ( result . current ) . toBeUndefined ( ) ;
171
+ await waitForNextUpdate ( ) ;
172
+ expect ( result . current ) . toEqual ( { value : 1 , done : false } ) ;
173
+ rerender ( { num : 2 } ) ;
174
+ expect ( result . current ) . toEqual ( { value : 1 , done : false } ) ;
175
+ await waitForNextUpdate ( ) ;
176
+ expect ( result . current ) . toEqual ( { value : 2 , done : false } ) ;
177
+ rerender ( { num : 3 } ) ;
178
+ expect ( result . current ) . toEqual ( { value : 2 , done : false } ) ;
179
+ await waitForNextUpdate ( ) ;
180
+ expect ( result . current ) . toEqual ( { value : 3 , done : false } ) ;
181
+ expect ( callback ) . toHaveBeenCalledTimes ( 1 ) ;
131
182
} ) ;
132
183
} ) ;
0 commit comments