Skip to content

Commit e84f7d7

Browse files
committed
Add a failing test for Offscreen in StrictMode
1 parent 9fcaf88 commit e84f7d7

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
let React;
2+
let Offscreen;
3+
let ReactDOMClient;
4+
let act;
5+
6+
describe('ReactOffscreenStrictMode', () => {
7+
let log;
8+
9+
beforeEach(() => {
10+
jest.resetModules();
11+
log = [];
12+
13+
React = require('react');
14+
Offscreen = React.unstable_Offscreen;
15+
ReactDOMClient = require('react-dom/client');
16+
act = require('jest-react').act;
17+
18+
const ReactFeatureFlags = require('shared/ReactFeatureFlags');
19+
ReactFeatureFlags.enableStrictEffects = __DEV__;
20+
});
21+
22+
function Component({ label }) {
23+
React.useEffect(() => {
24+
log.push(`${label}: useEffect mount`);
25+
return () => log.push(`${label}: useEffect unmount`);
26+
});
27+
28+
React.useLayoutEffect(() => {
29+
log.push(`${label}: useLayoutEffect mount`);
30+
return () => log.push(`${label}: useLayoutEffect unmount`);
31+
});
32+
33+
log.push(`${label}: render`);
34+
35+
return null;
36+
}
37+
38+
if (__DEV__) {
39+
// @gate enableOffscreen
40+
it('should trigger strict effects when offscreen is visible', () => {
41+
const container = document.createElement('div');
42+
const root = ReactDOMClient.createRoot(container, {
43+
unstable_strictMode: true,
44+
});
45+
act(() => {
46+
root.render(
47+
<Offscreen mode="visible">
48+
<Component label="A" />
49+
</Offscreen>
50+
);
51+
});
52+
53+
expect(log).toEqual([
54+
'A: render',
55+
'A: render',
56+
'A: useLayoutEffect mount',
57+
'A: useEffect mount',
58+
'A: useLayoutEffect unmount',
59+
'A: useEffect unmount',
60+
'A: useLayoutEffect mount',
61+
'A: useEffect mount',
62+
]);
63+
});
64+
65+
// @gate enableOffscreen
66+
it('should not trigger strict effects when offscreen is hidden', () => {
67+
const container = document.createElement('div');
68+
const root = ReactDOMClient.createRoot(container, {
69+
unstable_strictMode: true,
70+
});
71+
act(() => {
72+
root.render(
73+
<Offscreen mode="hidden">
74+
<Component label="A" />
75+
</Offscreen>
76+
);
77+
});
78+
79+
expect(log).toEqual([]);
80+
});
81+
}
82+
});

0 commit comments

Comments
 (0)