Skip to content

Commit e9c1445

Browse files
authored
Add regression test for facebook#18497 (facebook#18538)
1 parent 9d9cf38 commit e9c1445

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

packages/react-reconciler/src/__tests__/ReactHooksWithNoopRenderer-test.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3314,4 +3314,44 @@ describe('ReactHooksWithNoopRenderer', () => {
33143314
});
33153315
expect(ReactNoop).toMatchRenderedOutput('ABC');
33163316
});
3317+
3318+
it('keeps intermediate state updates (issue #18497)', () => {
3319+
let _dispatch;
3320+
function Counter() {
3321+
const [list, dispatch] = React.useReducer((l, c) => l.concat([c]), []);
3322+
_dispatch = dispatch;
3323+
3324+
const json = JSON.stringify(list);
3325+
Scheduler.unstable_yieldValue('Render ' + json);
3326+
useLayoutEffect(() => {
3327+
Scheduler.unstable_yieldValue('Commit ' + json);
3328+
});
3329+
3330+
return json;
3331+
}
3332+
3333+
act(() => {
3334+
ReactNoop.render(<Counter />);
3335+
expect(Scheduler).toFlushAndYieldThrough(['Render []', 'Commit []']);
3336+
expect(ReactNoop).toMatchRenderedOutput('[]');
3337+
});
3338+
3339+
act(() => {
3340+
_dispatch(1);
3341+
expect(Scheduler).toFlushAndYieldThrough(['Render [1]']);
3342+
3343+
_dispatch(2);
3344+
expect(Scheduler).toFlushAndYieldThrough(['Commit [1]']);
3345+
expect(ReactNoop).toMatchRenderedOutput('[1]');
3346+
3347+
expect(Scheduler).toFlushAndYieldThrough(['Render [1,2]']);
3348+
_dispatch(3);
3349+
3350+
expect(Scheduler).toFlushAndYieldThrough([
3351+
'Render [1,2,3]',
3352+
'Commit [1,2,3]',
3353+
]);
3354+
expect(ReactNoop).toMatchRenderedOutput('[1,2,3]');
3355+
});
3356+
});
33173357
});

scripts/jest/matchers/schedulerTestMatchers.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ function assertYieldsWereCleared(Scheduler) {
2020
const actualYields = Scheduler.unstable_clearYields();
2121
if (actualYields.length !== 0) {
2222
throw new Error(
23-
'Log of yielded values is not empty. ' +
23+
'Log of yielded values is not empty: ' +
24+
JSON.stringify(actualYields) +
25+
'. ' +
2426
'Call expect(Scheduler).toHaveYielded(...) first.'
2527
);
2628
}

0 commit comments

Comments
 (0)