From fa32cf299f514a0daa5ccd16fd8595b5cc6bc18b Mon Sep 17 00:00:00 2001
From: jddxf <740531372@qq.com>
Date: Tue, 30 Jun 2020 19:42:59 +0800
Subject: [PATCH] Add regression tests where sync render causes later
concurrent render to expire soon (#18608)
* Add a failing test for #17911
* Add more test cases where sync render causes later concurrent render to expire soon
---
.../__tests__/ReactIncrementalUpdates-test.js | 64 +++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/packages/react-reconciler/src/__tests__/ReactIncrementalUpdates-test.js b/packages/react-reconciler/src/__tests__/ReactIncrementalUpdates-test.js
index 63f06e2de2..d86c57a0c4 100644
--- a/packages/react-reconciler/src/__tests__/ReactIncrementalUpdates-test.js
+++ b/packages/react-reconciler/src/__tests__/ReactIncrementalUpdates-test.js
@@ -438,6 +438,70 @@ describe('ReactIncrementalUpdates', () => {
expect(ReactNoop.getChildren()).toEqual([span('derived state')]);
});
+ it('regression: does not expire soon due to layout effects in the last batch', () => {
+ const {useState, useLayoutEffect} = React;
+
+ let setCount;
+ function App() {
+ const [count, _setCount] = useState(0);
+ setCount = _setCount;
+ Scheduler.unstable_yieldValue('Render: ' + count);
+ useLayoutEffect(() => {
+ setCount(prevCount => prevCount + 1);
+ Scheduler.unstable_yieldValue('Commit: ' + count);
+ }, []);
+ return null;
+ }
+
+ ReactNoop.act(() => {
+ ReactNoop.render();
+ expect(Scheduler).toFlushExpired([]);
+ expect(Scheduler).toFlushAndYield([
+ 'Render: 0',
+ 'Commit: 0',
+ 'Render: 1',
+ ]);
+
+ Scheduler.unstable_advanceTime(10000);
+
+ setCount(2);
+ expect(Scheduler).toFlushExpired([]);
+ });
+ });
+
+ it('regression: does not expire soon due to previous flushSync', () => {
+ function Text({text}) {
+ Scheduler.unstable_yieldValue(text);
+ return text;
+ }
+
+ ReactNoop.flushSync(() => {
+ ReactNoop.render();
+ });
+ expect(Scheduler).toHaveYielded(['A']);
+
+ Scheduler.unstable_advanceTime(10000);
+
+ ReactNoop.render();
+ expect(Scheduler).toFlushExpired([]);
+ });
+
+ it('regression: does not expire soon due to previous expired work', () => {
+ function Text({text}) {
+ Scheduler.unstable_yieldValue(text);
+ return text;
+ }
+
+ ReactNoop.render();
+ Scheduler.unstable_advanceTime(10000);
+ expect(Scheduler).toFlushExpired(['A']);
+
+ Scheduler.unstable_advanceTime(10000);
+
+ ReactNoop.render();
+ expect(Scheduler).toFlushExpired([]);
+ });
+
it('when rebasing, does not exclude updates that were already committed, regardless of priority', async () => {
const {useState, useLayoutEffect} = React;