import {getLegacyRenderImplementation} from './utils';
describe('StoreStress (Legacy Mode)', () => {
let React;
let act;
let bridge;
let store;
let print;
beforeEach(() => {
bridge = global.bridge;
store = global.store;
store.collapseNodesByDefault = false;
React = require('react');
const utils = require('./utils');
act = utils.act;
print = require('./__serializers__/storeSerializer').print;
});
const {render, unmount, createContainer, getContainer} =
getLegacyRenderImplementation();
it('should handle a stress test with different tree operations (Legacy Mode)', () => {
let setShowX;
const A = () => 'a';
const B = () => 'b';
const C = () => {
const [showX, _setShowX] = React.useState(false);
setShowX = _setShowX;
return showX ? <X /> : 'c';
};
const D = () => 'd';
const E = () => 'e';
const X = () => 'x';
const a = <A key="a" />;
const b = <B key="b" />;
const c = <C key="c" />;
const d = <D key="d" />;
const e = <E key="e" />;
function Parent({children}) {
return children;
}
act(() => render(<Parent>{[a, b, c, d, e]}</Parent>));
expect(store).toMatchInlineSnapshot(`
[root]
▾ <Parent>
<A key="a">
<B key="b">
<C key="c">
<D key="d">
<E key="e">
`);
expect(getContainer().textContent).toMatch('abcde');
const snapshotForABCDE = print(store);
act(() => {
setShowX(true);
});
expect(store).toMatchInlineSnapshot(`
[root]
▾ <Parent>
<A key="a">
<B key="b">
▾ <C key="c">
<X>
<D key="d">
<E key="e">
`);
expect(getContainer().textContent).toMatch('abxde');
const snapshotForABXDE = print(store);
act(() => {
setShowX(false);
});
expect(getContainer().textContent).toMatch('abcde');
expect(print(store)).toBe(snapshotForABCDE);
act(() => unmount());
expect(print(store)).toBe('');
const cases = [
[a, b, c, d, e],
[[a], b, c, d, e],
[[a, b], c, d, e],
[[a, b], c, [d, e]],
[[a, b], c, [d, '', e]],
[[a], b, c, d, [e]],
[a, b, [[c]], d, e],
[[a, ''], [b], [c], [d], [e]],
[a, b, [c, [d, ['', e]]]],
[a, b, c, d, e],
[<div key="0">{a}</div>, b, c, d, e],
[<div key="0">{a}{b}</div>, c, d, e],
[<div key="0">{a}{b}</div>, c, <div key="1">{d}{e}</div>],
[<div key="1">{a}{b}</div>, c, <div key="0">{d}{e}</div>],
[<div key="0">{a}{b}</div>, c, <div key="1">{d}{e}</div>],
[<div key="2">{a}{b}</div>, c, <div key="3">{d}{e}</div>],
[<span key="0">{a}</span>, b, c, d, [e]],
[a, b, <span key="0"><span>{c}</span></span>, d, e],
[<div key="0">{a}</div>, [b], <span key="1">{c}</span>, [d], <div key="2">{e}</div>],
[a, b, [c, <div key="0">{d}<span>{e}</span></div>], ''],
[a, [[]], b, c, [d, [[]], e]],
[[[a, b, c, d], e]],
[a, b, c, d, e],
];
for (let i = 0; i < cases.length; i++) {
createContainer();
act(() => render(<Parent>{cases[i]}</Parent>));
expect(getContainer().textContent).toMatch('abcde');
expect(print(store)).toEqual(snapshotForABCDE);
act(() => {
setShowX(true);
});
expect(getContainer().textContent).toMatch('abxde');
expect(print(store)).toBe(snapshotForABXDE);
act(() => {
setShowX(false);
});
expect(getContainer().textContent).toMatch('abcde');
expect(print(store)).toBe(snapshotForABCDE);
act(() => unmount());
expect(print(store)).toBe('');
}
createContainer();
for (let i = 0; i < cases.length; i++) {
act(() => render(<Parent>{cases[i]}</Parent>));
expect(getContainer().textContent).toMatch('abcde');
expect(print(store)).toEqual(snapshotForABCDE);
act(() => {
setShowX(true);
});
expect(getContainer().textContent).toMatch('abxde');
expect(print(store)).toBe(snapshotForABXDE);
act(() => {
setShowX(false);
});
expect(getContainer().textContent).toMatch('abcde');
expect(print(store)).toBe(snapshotForABCDE);
}
act(() => unmount());
expect(print(store)).toBe('');
});
it('should handle stress test with reordering (Legacy Mode)', () => {
const A = () => 'a';
const B = () => 'b';
const C = () => 'c';
const D = () => 'd';
const E = () => 'e';
const a = <A key="a" />;
const b = <B key="b" />;
const c = <C key="c" />;
const d = <D key="d" />;
const e = <E key="e" />;
const steps = [
a,
b,
c,
d,
e,
[a],
[b],
[c],
[d],
[e],
[a, b],
[b, a],
[b, c],
[c, b],
[a, c],
[c, a],
];
const stepsSnapshot = [
`
[root]
▾ <Root>
<A key="a">
`,
`
[root]
▾ <Root>
<B key="b">
`,
`
[root]
▾ <Root>
<C key="c">
`,
`
[root]
▾ <Root>
<D key="d">
`,
`
[root]
▾ <Root>
<E key="e">
`,
`
[root]
▾ <Root>
<A key="a">
`,
`
[root]
▾ <Root>
<B key="b">
`,
`
[root]
▾ <Root>
<C key="c">
`,
`
[root]
▾ <Root>
<D key="d">
`,
`
[root]
▾ <Root>
<E key="e">
`,
`
[root]
▾ <Root>
<A key="a">
<B key="b">
`,
`
[root]
▾ <Root>
<B key="b">
<A key="a">
`,
`
[root]
▾ <Root>
<B key="b">
<C key="c">
`,
`
[root]
▾ <Root>
<C key="c">
<B key="b">
`,
`
[root]
▾ <Root>
<A key="a">
<C key="c">
`,
`
[root]
▾ <Root>
<C key="c">
<A key="a">
`,
];
const Root = ({children}) => {
return children;
};
const snapshots = [];
for (let i = 0; i < steps.length; i++) {
createContainer();
act(() => render(<Root>{steps[i]}</Root>));
expect(store).toMatchInlineSnapshot(stepsSnapshot[i]);
snapshots.push(print(store));
act(() => unmount());
expect(print(store)).toBe('');
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() => render(<Root>{steps[i]}</Root>));
expect(print(store)).toMatch(snapshots[i]);
act(() => render(<Root>{steps[j]}</Root>));
expect(print(store)).toMatch(snapshots[j]);
act(() => render(<Root>{steps[i]}</Root>));
expect(print(store)).toMatch(snapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() =>
render(
<Root>
<div>{steps[i]}</div>
</Root>,
),
);
expect(print(store)).toMatch(snapshots[i]);
act(() =>
render(
<Root>
<div>{steps[j]}</div>
</Root>,
),
);
expect(print(store)).toMatch(snapshots[j]);
act(() =>
render(
<Root>
<div>{steps[i]}</div>
</Root>,
),
);
expect(print(store)).toMatch(snapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
});
it('should handle a stress test for Suspense (Legacy Mode)', async () => {
const A = () => 'a';
const B = () => 'b';
const C = () => 'c';
const X = () => 'x';
const Y = () => 'y';
const Z = () => 'z';
const a = <A key="a" />;
const b = <B key="b" />;
const c = <C key="c" />;
const z = <Z key="z" />;
const steps = [
a,
[a],
[a, b, c],
[c, b, a],
[c, null, a],
<React.Fragment>{c}{a}</React.Fragment>,
<div>{c}{a}</div>,
<div><span>{a}</span>{b}</div>,
[[a]],
null,
b,
a,
];
const stepsSnapshot = [
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<B key="b">
<C key="c">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<C key="c">
<B key="b">
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<C key="c">
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<C key="c">
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<C key="c">
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<B key="b">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
<Suspense>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<B key="b">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<Y>
`,
];
const Never = () => {
throw new Promise(() => {});
};
const Root = ({children}) => {
return children;
};
const snapshots = [];
for (let i = 0; i < steps.length; i++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>{steps[i]}</React.Suspense>
<Y />
</Root>,
),
);
expect(store).toMatchInlineSnapshot(stepsSnapshot[i]);
snapshots.push(print(store));
act(() => unmount());
expect(print(store)).toBe('');
}
for (let i = 0; i < steps.length; i++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[i]}>
<Z />
<Never />
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>{steps[i]}</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>{steps[j]}</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[j]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>{steps[i]}</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[i]}>
<Z />
<Never />
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[j]}>
<Z />
<Never />
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[j]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[i]}>
<Z />
<Never />
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>{steps[i]}</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[j]}>
<Z />
<Never />
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[j]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>{steps[i]}</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[i]}>
<Z />
<Never />
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>{steps[j]}</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[j]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[i]}>
<Z />
<Never />
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[j]}>{steps[i]}</React.Suspense>
<Y />
</Root>,
),
);
const suspenseID = store.getElementIDAtIndex(2);
expect(print(store)).toEqual(snapshots[i]);
act(() => {
bridge.send('overrideSuspense', {
id: suspenseID,
rendererID: store.getRendererIDForElement(suspenseID),
forceFallback: true,
});
});
expect(print(store)).toEqual(snapshots[j]);
act(() => {
bridge.send('overrideSuspense', {
id: suspenseID,
rendererID: store.getRendererIDForElement(suspenseID),
forceFallback: false,
});
});
expect(print(store)).toEqual(snapshots[i]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[j]}>
<Z />
<Never />
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[j]);
act(() => {
bridge.send('overrideSuspense', {
id: suspenseID,
rendererID: store.getRendererIDForElement(suspenseID),
forceFallback: true,
});
});
expect(print(store)).toEqual(snapshots[j]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[j]}>{steps[i]}</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[j]);
act(() => {
bridge.send('overrideSuspense', {
id: suspenseID,
rendererID: store.getRendererIDForElement(suspenseID),
forceFallback: false,
});
});
expect(print(store)).toEqual(snapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
});
it('should handle a stress test for Suspense without type change (Legacy Mode)', () => {
const A = () => 'a';
const B = () => 'b';
const C = () => 'c';
const X = () => 'x';
const Y = () => 'y';
const Z = () => 'z';
const a = <A key="a" />;
const b = <B key="b" />;
const c = <C key="c" />;
const z = <Z key="z" />;
const steps = [
a,
[a],
[a, b, c],
[c, b, a],
[c, null, a],
<React.Fragment>{c}{a}</React.Fragment>,
<div>{c}{a}</div>,
<div><span>{a}</span>{b}</div>,
[[a]],
null,
b,
a,
];
const stepsSnapshot = [
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<A key="a">
<Z>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<A key="a">
<Z>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<A key="a">
<B key="b">
<C key="c">
<Z>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<C key="c">
<B key="b">
<A key="a">
<Z>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<C key="c">
<A key="a">
<Z>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<C key="c">
<A key="a">
<Z>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<C key="c">
<A key="a">
<Z>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<A key="a">
<B key="b">
<Z>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<A key="a">
<Z>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<Z>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<B key="b">
<Z>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
▾ <MaybeSuspend>
<A key="a">
<Z>
<Y>
`,
];
const stepsSnapshotTwo = [
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<B key="b">
<C key="c">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<C key="c">
<B key="b">
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<C key="c">
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<C key="c">
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<C key="c">
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<B key="b">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<Y>
`,
`
[root]
▾ <Root>
<X>
<Suspense>
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<B key="b">
<Y>
`,
`
[root]
▾ <Root>
<X>
▾ <Suspense>
<A key="a">
<Y>
`,
];
const Never = () => {
throw new Promise(() => {});
};
const MaybeSuspend = ({children, suspend}) => {
if (suspend) {
return (
<div>
{children}
<Never />
<X />
</div>
);
}
return (
<div>
{children}
<Z />
</div>
);
};
const Root = ({children}) => {
return children;
};
const snapshots = [];
for (let i = 0; i < steps.length; i++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>
<MaybeSuspend suspend={false}>{steps[i]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(store).toMatchInlineSnapshot(stepsSnapshot[i]);
snapshots.push(print(store));
act(() => unmount());
expect(print(store)).toBe('');
}
const fallbackSnapshots = [];
for (let i = 0; i < steps.length; i++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[i]}>
<Z />
<MaybeSuspend suspend={true}>{steps[i]}</MaybeSuspend>
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(store).toMatchInlineSnapshot(stepsSnapshotTwo[i]);
fallbackSnapshots.push(print(store));
act(() => unmount());
expect(print(store)).toBe('');
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>
<MaybeSuspend suspend={false}>{steps[i]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>
<MaybeSuspend suspend={false}>{steps[j]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[j]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>
<MaybeSuspend suspend={false}>{steps[i]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[i]}>
<Z />
<MaybeSuspend suspend={true}>
<X />
<Y />
</MaybeSuspend>
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(fallbackSnapshots[i]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[j]}>
<Z />
<MaybeSuspend suspend={true}>
<Y />
<X />
</MaybeSuspend>
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(fallbackSnapshots[j]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[i]}>
<Z />
<MaybeSuspend suspend={true}>
<X />
<Y />
</MaybeSuspend>
<Z />
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(fallbackSnapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>
<MaybeSuspend suspend={false}>{steps[i]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[j]}>
<MaybeSuspend suspend={true}>{steps[i]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(fallbackSnapshots[j]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={z}>
<MaybeSuspend suspend={false}>{steps[i]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[i]}>
<MaybeSuspend suspend={true}>{steps[j]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(fallbackSnapshots[i]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[i]}>
<MaybeSuspend suspend={false}>{steps[j]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(snapshots[j]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[i]}>
<MaybeSuspend suspend={true}>{steps[j]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(fallbackSnapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
for (let i = 0; i < steps.length; i++) {
for (let j = 0; j < steps.length; j++) {
createContainer();
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[j]}>
<MaybeSuspend suspend={false}>{steps[i]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
const suspenseID = store.getElementIDAtIndex(2);
expect(print(store)).toEqual(snapshots[i]);
act(() => {
bridge.send('overrideSuspense', {
id: suspenseID,
rendererID: store.getRendererIDForElement(suspenseID),
forceFallback: true,
});
});
expect(print(store)).toEqual(fallbackSnapshots[j]);
act(() => {
bridge.send('overrideSuspense', {
id: suspenseID,
rendererID: store.getRendererIDForElement(suspenseID),
forceFallback: false,
});
});
expect(print(store)).toEqual(snapshots[i]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[j]}>
<MaybeSuspend suspend={true}>{steps[i]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(fallbackSnapshots[j]);
act(() => {
bridge.send('overrideSuspense', {
id: suspenseID,
rendererID: store.getRendererIDForElement(suspenseID),
forceFallback: true,
});
});
expect(print(store)).toEqual(fallbackSnapshots[j]);
act(() =>
render(
<Root>
<X />
<React.Suspense fallback={steps[j]}>
<MaybeSuspend suspend={false}>{steps[i]}</MaybeSuspend>
</React.Suspense>
<Y />
</Root>,
),
);
expect(print(store)).toEqual(fallbackSnapshots[j]);
act(() => {
bridge.send('overrideSuspense', {
id: suspenseID,
rendererID: store.getRendererIDForElement(suspenseID),
forceFallback: false,
});
});
expect(print(store)).toEqual(snapshots[i]);
act(() => unmount());
expect(print(store)).toBe('');
}
}
});
});