9
10
import type {Fiber} from 'react-reconciler/src/ReactFiber';
11
import type {FiberRoot} from 'react-reconciler/src/ReactFiberRoot';
12
+import type {Deadline} from 'react-reconciler/src/ReactFiberReconciler';
13
14
import ReactFiberReconciler from 'react-reconciler';
15
import {batchedUpdates} from 'events/ReactGenericBatching';
32
33
type TestRendererOptions = {
34
createNodeMock: (element: React$Element<any>) => any,
35
+ unstable_isAsync: boolean,
36
};
37
38
type ReactTestRendererJSON = {|
118
parentInstance.children.splice(index, 1);
119
}
120
121
+// Current virtual time
122
+let currentTime: number = 0;
123
+let scheduledCallback: ((deadline: Deadline) => mixed) | null = null;
124
+let yieldedValues: Array<mixed> | null = null;
125
+
126
const TestRenderer = ReactFiberReconciler({
127
getRootHostContext() {
128
return emptyObject;
207
};
208
},
209
203
- scheduleDeferredCallback(fn: Function): number {
204
- return setTimeout(fn, 0, {timeRemaining: Infinity});
210
+ scheduleDeferredCallback(
211
+ callback: (deadline: Deadline) => mixed,
212
+ options?: {timeout: number},
213
+ ): number {
214
+ scheduledCallback = callback;
215
+ return 0;
216
},
217
218
cancelDeferredCallback(timeoutID: number): void {
208
- clearTimeout(timeoutID);
219
+ scheduledCallback = null;
220
},
221
222
getPublicInstance,
223
224
now(): number {
214
- // Test renderer does not use expiration
215
- return 0;
225
+ return currentTime;
226
},
227
228
mutation: {
613
const ReactTestRendererFiber = {
614
create(element: React$Element<any>, options: TestRendererOptions) {
615
let createNodeMock = defaultTestOptions.createNodeMock;
606
- if (options && typeof options.createNodeMock === 'function') {
607
- createNodeMock = options.createNodeMock;
616
+ let isAsync = false;
617
+ if (typeof options === 'object' && options !== null) {
618
+ if (typeof options.createNodeMock === 'function') {
619
+ createNodeMock = options.createNodeMock;
620
+ }
621
+ if (options.unstable_isAsync === true) {
622
+ isAsync = true;
623
+ }
624
}
625
let container = {
626
children: [],
629
};
630
let root: FiberRoot | null = TestRenderer.createContainer(
631
container,
616
- false,
632
+ isAsync,
633
false,
634
);
635
invariant(root != null, 'something went wrong');
670
container = null;
671
root = null;
672
},
673
+ unstable_flushAll(): Array<mixed> {
674
+ yieldedValues = null;
675
+ while (scheduledCallback !== null) {
676
+ const cb = scheduledCallback;
677
+ scheduledCallback = null;
678
+ cb({
679
+ timeRemaining() {
680
+ // Keep rendering until there's no more work
681
+ return 999;
682
+ },
683
+ // React's scheduler has its own way of keeping track of expired
684
+ // work and doesn't read this, so don't bother setting it to the
685
+ // correct value.
686
+ didTimeout: false,
687
+ });
688
+ }
689
+ if (yieldedValues === null) {
690
+ // Always return an array.
691
+ return [];
692
+ }
693
+ return yieldedValues;
694
+ },
695
+ unstable_flushThrough(expectedValues: Array<mixed>): Array<mixed> {
696
+ let didStop = false;
697
+ yieldedValues = null;
698
+ while (scheduledCallback !== null && !didStop) {
699
+ const cb = scheduledCallback;
700
+ scheduledCallback = null;
701
+ cb({
702
+ timeRemaining() {
703
+ if (
704
+ yieldedValues !== null &&
705
+ yieldedValues.length >= expectedValues.length
706
+ ) {
707
+ // We at least as many values as expected. Stop rendering.
708
+ didStop = true;
709
+ return 0;
710
+ }
711
+ // Keep rendering.
712
+ return 999;
713
+ },
714
+ // React's scheduler has its own way of keeping track of expired
715
+ // work and doesn't read this, so don't bother setting it to the
716
+ // correct value.
717
+ didTimeout: false,
718
+ });
719
+ }
720
+ if (yieldedValues === null) {
721
+ // Always return an array.
722
+ return [];
723
+ }
724
+ return yieldedValues;
725
+ },
726
+ unstable_yield(value: mixed): void {
727
+ if (yieldedValues === null) {
728
+ yieldedValues = [value];
729
+ } else {
730
+ yieldedValues.push(value);
731
+ }
732
+ },
733
getInstance() {
734
if (root == null || root.current == null) {
735
return null;