({
key: 'atomFamily effect init',
default: 'DEFAULT',
effects: [
({setSelf}) => {
inited++;
setSelf('INIT');
},
],
});
expect(inited).toEqual(0);
expect(get(myFamily(1))).toEqual('INIT');
expect(inited).toEqual(1);
set(myFamily(2));
expect(inited).toEqual(2);
const [ReadsWritesAtom, _, reset] = componentThatReadsAndWritesAtom(
myFamily(1),
);
const c = renderElements();
expect(c.textContent).toEqual('"INIT"');
act(reset);
expect(c.textContent).toEqual('"DEFAULT"');
});
testRecoil('Parameterized Initialization', () => {
const myFamily = atomFamily({
key: 'atomFamily effect parameterized init',
default: 'DEFAULT',
effects: param => [({setSelf}) => setSelf(param)],
});
expect(get(myFamily(1))).toEqual(1);
expect(get(myFamily(2))).toEqual(2);
});
testRecoil('Cleanup Handlers - when root unmounted', () => {
const refCounts: {[string]: number} = {A: 0, B: 0};
const atoms = atomFamily({
key: 'atomFamily effect cleanup',
default: p => p,
effects: p => [
() => {
refCounts[p]++;
return () => {
refCounts[p]--;
};
},
],
});
let setNumRoots;
function App() {
const [numRoots, _setNumRoots] = useState(0);
setNumRoots = _setNumRoots;
return (
{Array(numRoots)
.fill(null)
.map((_, idx) => (
))}
);
}
const c = renderElements();
expect(c.textContent).toBe('');
expect(refCounts).toEqual({A: 0, B: 0});
act(() => setNumRoots(1));
expect(c.textContent).toBe('"A""B"');
expect(refCounts).toEqual({A: 1, B: 1});
act(() => setNumRoots(2));
expect(c.textContent).toBe('"A""B""A""B"');
expect(refCounts).toEqual({A: 2, B: 2});
act(() => setNumRoots(1));
expect(c.textContent).toBe('"A""B"');
expect(refCounts).toEqual({A: 1, B: 1});
act(() => setNumRoots(0));
expect(c.textContent).toBe('');
expect(refCounts).toEqual({A: 0, B: 0});
});
testRecoil('storeID matches ', async () => {
const atoms = atomFamily({
key: 'atomFamily effect - storeID',
default: 'DEFAULT',
effects: rootKey => [
({storeID, setSelf}) => {
expect(storeID).toEqual(storeIDs[rootKey]);
setSelf(rootKey);
},
],
});
const storeIDs: {[string]: StoreIDType} = {};
function StoreID({
rootKey,
}:
| $TEMPORARY$object<{rootKey: $TEMPORARY$string<'A'>}>
| $TEMPORARY$object<{rootKey: $TEMPORARY$string<'A1'>}>
| $TEMPORARY$object<{rootKey: $TEMPORARY$string<'A2'>}>
| $TEMPORARY$object<{rootKey: $TEMPORARY$string<'B'>}>) {
const storeID = useRecoilStoreID();
storeIDs[rootKey] = storeID;
return null;
}
function MyApp() {
return (
);
}
const c = renderElements();
expect(c.textContent).toEqual('"A""A1""A2""B"');
expect('A' in storeIDs).toEqual(true);
expect('A1' in storeIDs).toEqual(true);
expect('A2' in storeIDs).toEqual(true);
expect('B' in storeIDs).toEqual(true);
expect(storeIDs.A).not.toEqual(storeIDs.B);
expect(storeIDs.A).not.toEqual(storeIDs.A1);
expect(storeIDs.A).toEqual(storeIDs.A2);
expect(storeIDs.B).not.toEqual(storeIDs.A1);
expect(storeIDs.B).not.toEqual(storeIDs.A2);
});
});