diff --git a/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js b/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js index f7ab26011b64e..2e11f01d5a2d6 100644 --- a/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js +++ b/packages/react-reconciler/src/__tests__/ReactHooks-test.internal.js @@ -669,6 +669,76 @@ describe('ReactHooks', () => { }).toThrow('is not a function'); }); + it('does not forget render phase useState updates inside an effect', () => { + const {useState, useEffect} = React; + + function Counter() { + const [counter, setCounter] = useState(0); + if (counter === 0) { + setCounter(x => x + 1); + setCounter(x => x + 1); + } + useEffect(() => { + setCounter(x => x + 1); + setCounter(x => x + 1); + }, []); + return counter; + } + + const root = ReactTestRenderer.create(null); + ReactTestRenderer.act(() => { + root.update(); + }); + expect(root).toMatchRenderedOutput('4'); + }); + + it('does not forget render phase useReducer updates inside an effect with hoisted reducer', () => { + const {useReducer, useEffect} = React; + + const reducer = x => x + 1; + function Counter() { + const [counter, increment] = useReducer(reducer, 0); + if (counter === 0) { + increment(); + increment(); + } + useEffect(() => { + increment(); + increment(); + }, []); + return counter; + } + + const root = ReactTestRenderer.create(null); + ReactTestRenderer.act(() => { + root.update(); + }); + expect(root).toMatchRenderedOutput('4'); + }); + + it('does not forget render phase useReducer updates inside an effect with inline reducer', () => { + const {useReducer, useEffect} = React; + + function Counter() { + const [counter, increment] = useReducer(x => x + 1, 0); + if (counter === 0) { + increment(); + increment(); + } + useEffect(() => { + increment(); + increment(); + }, []); + return counter; + } + + const root = ReactTestRenderer.create(null); + ReactTestRenderer.act(() => { + root.update(); + }); + expect(root).toMatchRenderedOutput('4'); + }); + it('warns for bad useImperativeHandle first arg', () => { const {useImperativeHandle} = React; function App() {