Skip to content

Commit 0271278

Browse files
committed
Double-invoke first function component render too
1 parent 33e59ec commit 0271278

File tree

5 files changed

+83
-37
lines changed

5 files changed

+83
-37
lines changed

packages/react-art/src/__tests__/ReactART-test.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ describe('ReactART', () => {
385385
</CurrentRendererContext.Provider>,
386386
);
387387

388-
ReactNoop.flushThrough(['A']);
388+
ReactNoop.flushThrough(__DEV__ ? ['A', 'A'] : ['A']);
389389

390390
ReactDOM.render(
391391
<Surface>
@@ -400,7 +400,9 @@ describe('ReactART', () => {
400400
expect(ops).toEqual([null, 'ART']);
401401

402402
ops = [];
403-
expect(ReactNoop.flush()).toEqual(['B', 'C']);
403+
expect(ReactNoop.flush()).toEqual(
404+
__DEV__ ? ['B', 'B', 'C', 'C'] : ['B', 'C'],
405+
);
404406

405407
expect(ops).toEqual(['Test']);
406408
});

packages/react-dom/src/__tests__/ReactDOMRoot-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ describe('ReactDOMRoot', () => {
232232
// Flush all async work.
233233
jest.runAllTimers();
234234
// Root should complete without committing.
235-
expect(ops).toEqual(['Foo']);
235+
expect(ops).toEqual(__DEV__ ? ['Foo', 'Foo'] : ['Foo']);
236236
expect(container.textContent).toEqual('');
237237

238238
ops = [];

packages/react-reconciler/src/ReactFiberBeginWork.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1173,7 +1173,20 @@ function mountIndeterminateComponent(
11731173
context,
11741174
renderExpirationTime,
11751175
);
1176-
// TODO: double-render here in strict mode.
1176+
if (
1177+
debugRenderPhaseSideEffects ||
1178+
(debugRenderPhaseSideEffectsForStrictMode &&
1179+
workInProgress.mode & StrictMode)
1180+
) {
1181+
renderWithHooks(
1182+
null,
1183+
workInProgress,
1184+
Component,
1185+
props,
1186+
context,
1187+
renderExpirationTime,
1188+
);
1189+
}
11771190
} else {
11781191
value = renderWithHooks(
11791192
null,

packages/react-reconciler/src/__tests__/ErrorBoundaryReconciliation-test.internal.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ describe('ErrorBoundaryReconciliation', () => {
7070
if (isConcurrent) {
7171
renderer.unstable_flushAll();
7272
}
73-
}).toWarnDev(isConcurrent ? ['invalid', 'invalid', 'invalid', 'invalid'] : ['invalid']);
73+
}).toWarnDev(
74+
isConcurrent
75+
? ['invalid', 'invalid', 'invalid', 'invalid']
76+
: ['invalid'],
77+
);
7478
const Fallback = fallbackTagName;
7579
expect(renderer).toMatchRenderedOutput(<Fallback prop="ErrorBoundary" />);
7680
}

packages/react-test-renderer/src/__tests__/ReactTestRendererAsync-test.js

Lines changed: 59 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -62,18 +62,19 @@ describe('ReactTestRendererAsync', () => {
6262
unstable_isConcurrent: true,
6363
});
6464

65-
expect(renderer).toFlushAndYield(['A:1', 'B:1', 'C:1']);
65+
expect(renderer).toFlushAndYield(
66+
__DEV__
67+
? ['A:1', 'A:1', 'B:1', 'B:1', 'C:1', 'C:1']
68+
: ['A:1', 'B:1', 'C:1'],
69+
);
6670
expect(renderer.toJSON()).toEqual(['A:1', 'B:1', 'C:1']);
6771

6872
renderer.update(<Parent step={2} />);
69-
expect(renderer).toFlushAndYield(__DEV__ ? [
70-
'A:2',
71-
'A:2',
72-
'B:2',
73-
'B:2',
74-
'C:2',
75-
'C:2'
76-
] : ['A:2', 'B:2', 'C:2']);
73+
expect(renderer).toFlushAndYield(
74+
__DEV__
75+
? ['A:2', 'A:2', 'B:2', 'B:2', 'C:2', 'C:2']
76+
: ['A:2', 'B:2', 'C:2'],
77+
);
7778
expect(renderer.toJSON()).toEqual(['A:2', 'B:2', 'C:2']);
7879
});
7980

@@ -96,12 +97,14 @@ describe('ReactTestRendererAsync', () => {
9697
});
9798

9899
// Flush the first two siblings
99-
expect(renderer).toFlushAndYieldThrough(['A:1', 'B:1']);
100+
expect(renderer).toFlushAndYieldThrough(
101+
__DEV__ ? ['A:1', 'A:1', 'B:1', 'B:1'] : ['A:1', 'B:1'],
102+
);
100103
// Did not commit yet.
101104
expect(renderer.toJSON()).toEqual(null);
102105

103106
// Flush the remaining work
104-
expect(renderer).toFlushAndYield(['C:1']);
107+
expect(renderer).toFlushAndYield(__DEV__ ? ['C:1', 'C:1'] : ['C:1']);
105108
expect(renderer.toJSON()).toEqual(['A:1', 'B:1', 'C:1']);
106109
});
107110

@@ -133,7 +136,7 @@ describe('ReactTestRendererAsync', () => {
133136
});
134137

135138
// Flush the some of the changes, but don't commit
136-
expect(renderer).toFlushAndYieldThrough(['A:1']);
139+
expect(renderer).toFlushAndYieldThrough(__DEV__ ? ['A:1', 'A:1'] : ['A:1']);
137140
expect(renderer.toJSON()).toEqual(null);
138141

139142
// Interrupt with higher priority properties
@@ -229,30 +232,54 @@ describe('ReactTestRendererAsync', () => {
229232
});
230233

231234
expect(renderer).toFlushAndThrow('Oh no!');
232-
expect(ReactTestRenderer).toHaveYielded([
233-
'A',
234-
'B',
235-
'C',
236-
'D',
237-
'A',
238-
'B',
239-
'C',
240-
'D',
241-
]);
235+
expect(ReactTestRenderer).toHaveYielded(
236+
__DEV__
237+
? [
238+
'A',
239+
'A',
240+
'B',
241+
'B',
242+
'C',
243+
'C',
244+
'D',
245+
'D',
246+
'A',
247+
'A',
248+
'B',
249+
'B',
250+
'C',
251+
'C',
252+
'D',
253+
'D',
254+
]
255+
: ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D'],
256+
);
242257

243258
renderer.update(<App />);
244259

245260
expect(renderer).toFlushAndThrow('Oh no!');
246-
expect(ReactTestRenderer).toHaveYielded([
247-
'A',
248-
'B',
249-
'C',
250-
'D',
251-
'A',
252-
'B',
253-
'C',
254-
'D',
255-
]);
261+
expect(ReactTestRenderer).toHaveYielded(
262+
__DEV__
263+
? [
264+
'A',
265+
'A',
266+
'B',
267+
'B',
268+
'C',
269+
'C',
270+
'D',
271+
'D',
272+
'A',
273+
'A',
274+
'B',
275+
'B',
276+
'C',
277+
'C',
278+
'D',
279+
'D',
280+
]
281+
: ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D'],
282+
);
256283

257284
renderer.update(<App />);
258285
expect(renderer).toFlushAndThrow('Oh no!');

0 commit comments

Comments
 (0)