26
let useImperativeHandle;
27
let forwardRef;
28
let memo;
29
+let act;
30
31
// These tests use React Noop Renderer. All new tests should use React Test
32
// Renderer and go in ReactHooks-test; plan is gradually migrate the noop tests
51
useImperativeHandle = React.useImperativeHandle;
52
forwardRef = React.forwardRef;
53
memo = React.memo;
54
+ act = ReactNoop.act;
55
});
56
57
function span(prop) {
78
expect(ReactNoop.getChildren()).toEqual([span('Count: 0')]);
79
80
// Schedule some updates
79
- counter.current.updateCount(1);
80
- counter.current.updateCount(count => count + 10);
81
+ act(() => {
82
+ counter.current.updateCount(1);
83
+ counter.current.updateCount(count => count + 10);
84
+ });
85
+
86
// Partially flush without committing
87
ReactNoop.flushThrough(['Count: 11']);
88
expect(ReactNoop.getChildren()).toEqual([span('Count: 0')]);
162
ReactNoop.flush();
163
expect(ReactNoop.getChildren()).toEqual([span('Count: 0')]);
164
160
- counter.current.updateCount(1);
165
+ act(() => counter.current.updateCount(1));
166
ReactNoop.flush();
167
expect(ReactNoop.getChildren()).toEqual([span('Count: 1')]);
168
164
- counter.current.updateCount(count => count + 10);
169
+ act(() => counter.current.updateCount(count => count + 10));
170
ReactNoop.flush();
171
expect(ReactNoop.getChildren()).toEqual([span('Count: 11')]);
172
});
186
expect(ReactNoop.flush()).toEqual(['getInitialState', 'Count: 42']);
187
expect(ReactNoop.getChildren()).toEqual([span('Count: 42')]);
188
184
- counter.current.updateCount(7);
189
+ act(() => counter.current.updateCount(7));
190
expect(ReactNoop.flush()).toEqual(['Count: 7']);
191
expect(ReactNoop.getChildren()).toEqual([span('Count: 7')]);
192
});
204
ReactNoop.flush();
205
expect(ReactNoop.getChildren()).toEqual([span('Count: 0')]);
206
202
- counter.current.updateCount(7);
207
+ act(() => counter.current.updateCount(7));
208
expect(ReactNoop.flush()).toEqual(['Count: 7']);
209
205
- counter.current.updateLabel('Total');
210
+ act(() => counter.current.updateLabel('Total'));
211
expect(ReactNoop.flush()).toEqual(['Total: 7']);
212
});
213
222
ReactNoop.flush();
223
expect(ReactNoop.getChildren()).toEqual([span('Count: 0')]);
224
220
- updaters[0](1);
225
+ act(() => updaters[0](1));
226
ReactNoop.flush();
227
expect(ReactNoop.getChildren()).toEqual([span('Count: 1')]);
228
224
- updaters[0](count => count + 10);
229
+ act(() => updaters[0](count => count + 10));
230
ReactNoop.flush();
231
expect(ReactNoop.getChildren()).toEqual([span('Count: 11')]);
232
245
ReactNoop.flush();
246
ReactNoop.render(null);
247
ReactNoop.flush();
243
- expect(() => _updateCount(1)).toWarnDev(
248
+ expect(() => act(() => _updateCount(1))).toWarnDev(
249
"Warning: Can't perform a React state update on an unmounted " +
250
'component. This is a no-op, but it indicates a memory leak in your ' +
251
'application. To fix, cancel all subscriptions and asynchronous ' +
271
expect(ReactNoop.flush()).toEqual([]);
272
expect(ReactNoop.getChildren()).toEqual([span('Count: 0')]);
273
269
- _updateCount(1);
274
+ act(() => _updateCount(1));
275
expect(ReactNoop.flush()).toEqual(['Count: 1']);
276
expect(ReactNoop.getChildren()).toEqual([span('Count: 1')]);
277
});
495
ReactNoop.flush();
496
expect(ReactNoop.getChildren()).toEqual([span('Count: 0')]);
497
493
- counter.current.dispatch(INCREMENT);
498
+ act(() => counter.current.dispatch(INCREMENT));
499
ReactNoop.flush();
500
expect(ReactNoop.getChildren()).toEqual([span('Count: 1')]);
501
+ act(() => {
502
+ counter.current.dispatch(DECREMENT);
503
+ counter.current.dispatch(DECREMENT);
504
+ counter.current.dispatch(DECREMENT);
505
+ });
506
497
- counter.current.dispatch(DECREMENT);
498
- counter.current.dispatch(DECREMENT);
499
- counter.current.dispatch(DECREMENT);
507
ReactNoop.flush();
508
expect(ReactNoop.getChildren()).toEqual([span('Count: -2')]);
509
});
537
expect(ReactNoop.flush()).toEqual(['Init', 'Count: 10']);
538
expect(ReactNoop.getChildren()).toEqual([span('Count: 10')]);
539
533
- counter.current.dispatch(INCREMENT);
540
+ act(() => counter.current.dispatch(INCREMENT));
541
expect(ReactNoop.flush()).toEqual(['Count: 11']);
542
expect(ReactNoop.getChildren()).toEqual([span('Count: 11')]);
543
537
- counter.current.dispatch(DECREMENT);
538
- counter.current.dispatch(DECREMENT);
539
- counter.current.dispatch(DECREMENT);
544
+ act(() => {
545
+ counter.current.dispatch(DECREMENT);
546
+ counter.current.dispatch(DECREMENT);
547
+ counter.current.dispatch(DECREMENT);
548
+ });
549
+
550
expect(ReactNoop.flush()).toEqual(['Count: 8']);
551
expect(ReactNoop.getChildren()).toEqual([span('Count: 8')]);
552
});
572
ReactNoop.flush();
573
expect(ReactNoop.getChildren()).toEqual([span('Count: 0')]);
574
565
- counter.current.dispatch(INCREMENT);
566
- counter.current.dispatch(INCREMENT);
567
- counter.current.dispatch(INCREMENT);
575
+ act(() => {
576
+ counter.current.dispatch(INCREMENT);
577
+ counter.current.dispatch(INCREMENT);
578
+ counter.current.dispatch(INCREMENT);
579
+ });
580
+
581
ReactNoop.flushSync(() => {
582
counter.current.dispatch(INCREMENT);
583
});
660
});
661
return <Text text="Layout" />;
662
}
663
+
664
ReactNoop.render([<PassiveEffect key="p" />, <LayoutEffect key="l" />]);
651
- expect(ReactNoop.flush()).toEqual([
652
- 'Passive',
653
- 'Layout',
654
- 'Layout effect 0',
655
- 'Passive effect',
656
- 'Layout',
657
- 'Layout effect 1',
658
- ]);
665
+
666
+ act(() => {
667
+ expect(ReactNoop.flush()).toEqual([
668
+ 'Passive',
669
+ 'Layout',
670
+ 'Layout effect 0',
671
+ 'Passive effect',
672
+ 'Layout',
673
+ 'Layout effect 1',
674
+ ]);
675
+ });
676
+
677
expect(ReactNoop.getChildren()).toEqual([
678
span('Passive'),
679
span('Layout'),
797
ReactNoop.flushThrough(['Schedule update [0]', 'Count: 0']);
798
expect(ReactNoop.getChildren()).toEqual([span('Count: (empty)')]);
799
782
- expect(ReactNoop.flush()).toEqual([]);
800
+ ReactNoop.batchedUpdates(() => {
801
+ expect(ReactNoop.flush()).toEqual([]);
802
+ });
803
+
804
expect(ReactNoop.getChildren()).toEqual([span('Count: 0')]);
805
806
ReactNoop.flushPassiveEffects();
826
827
// Enqueuing this update forces the passive effect to be flushed --
828
// updateCount(1) happens first, so 2 wins.
808
- _updateCount(2);
829
+ act(() => _updateCount(2));
830
expect(ReactNoop.flush()).toEqual(['Will set count to 1', 'Count: 2']);
831
expect(ReactNoop.getChildren()).toEqual([span('Count: 2')]);
832
});
872
873
// Enqueuing this update forces the passive effect to be flushed --
874
// updateCount(1) happens first, so 2 wins.
854
- _updateCount(2);
875
+ act(() => _updateCount(2));
876
expect(ReactNoop.flush()).toEqual(['Will set count to 1', 'Count: 2']);
877
expect(ReactNoop.getChildren()).toEqual([span('Count: 2')]);
878
1389
span('Count: 0'),
1390
]);
1391
1371
- button.current.increment();
1392
+ act(button.current.increment);
1393
expect(ReactNoop.flush()).toEqual([
1394
// Button should not re-render, because its props haven't changed
1395
// 'Increment',
1413
]);
1414
1415
// Callback should have updated
1395
- button.current.increment();
1416
+ act(button.current.increment);
1417
expect(ReactNoop.flush()).toEqual(['Count: 11']);
1418
expect(ReactNoop.getChildren()).toEqual([
1419
span('Increment'),
1621
span('A: 0, B: 0, C: [not loaded]'),
1622
]);
1623
1603
- updateA(2);
1604
- updateB(3);
1624
+ act(() => {
1625
+ updateA(2);
1626
+ updateB(3);
1627
+ });
1628
+
1629
expect(ReactNoop.flush()).toEqual(['A: 2, B: 3, C: [not loaded]']);
1630
expect(ReactNoop.getChildren()).toEqual([
1631
span('A: 2, B: 3, C: [not loaded]'),
1670
ReactNoop.render(<App loadC={true} />);
1671
expect(ReactNoop.flush()).toEqual(['A: 0, B: 0, C: 0']);
1672
expect(ReactNoop.getChildren()).toEqual([span('A: 0, B: 0, C: 0')]);
1649
-
1650
- updateA(2);
1651
- updateB(3);
1652
- updateC(4);
1673
+ act(() => {
1674
+ updateA(2);
1675
+ updateB(3);
1676
+ updateC(4);
1677
+ });
1678
expect(ReactNoop.flush()).toEqual(['A: 2, B: 3, C: 4']);
1679
expect(ReactNoop.getChildren()).toEqual([span('A: 2, B: 3, C: 4')]);
1680
ReactNoop.render(<App loadC={false} />);