) => set(baseAtom, value)
)
baseAtom.debugLabel = 'base'
+ derivedAtom.debugLabel = 'derived'
function Counter({ level }: { level: string }) {
const [derived, setDerived] = useAtom(derivedAtom)
- const increaseDerived = () => setDerived((c) => c + 1)
+ const increaseDerived = () => {
+ setDerived((c) => c + 1)
+ }
return (
base:{derived}
@@ -139,7 +142,7 @@ describe('Counter', () => {
S0[base]: base0
S1[base]: base1
*/
- test('03. ScopeProvider provides isolation for scoped primitive atoms', () => {
+ test.skip('03. ScopeProvider provides isolation for scoped primitive atoms', () => {
const baseAtom = atom(0)
baseAtom.debugLabel = 'base'
function Counter({ level }: { level: string }) {
@@ -197,16 +200,29 @@ describe('Counter', () => {
S0[base]: derived0(base0)
S1[base]: derived0(base1)
*/
- test('04. unscoped derived can read and write to scoped primitive atoms', () => {
+ test.skip('04. unscoped derived can read and write to scoped primitive atoms', () => {
const baseAtom = atom(0)
baseAtom.debugLabel = 'base'
const derivedAtom = atom(
- (get) => get(baseAtom),
- (get, set) => set(baseAtom, get(baseAtom) + 1)
+ (get) => {
+ const v = get(baseAtom)
+ return v
+ },
+ (get, set) => {
+ const v = get(baseAtom)
+ set(baseAtom, v + 1)
+ }
)
derivedAtom.debugLabel = 'derived'
function Counter({ level }: { level: string }) {
+ // FIXME: derivedAtom in level1 should be a consumer
+ // Error: its atomState for the scoped clone should have baseAtom as a dependency
+ // But: it is only a clone because it is inherited
+ // This error causes readAtomState(atom.o)
+ // derivedAtom atomState should have baseAtom as a dependency
+ // But derivedAtom atomRead is only called once
+ // ================================================
const [derived, increaseFromDerived] = useAtom(derivedAtom)
const value = useAtomValue(baseAtom)
return (
@@ -214,7 +230,7 @@ describe('Counter', () => {
base:{derived}
value:{value}
)
}
const { container } = render()
- const increaseUnscopedBase = '.level0.setBase'
- const increaseScopedBase = '.level1.setBase'
+ const increaseUnscopedDerived = '.level0.setDerived'
+ const increaseScopedDerived = '.level1.setDerived'
const atomValueSelectors = [
'.level0.base',
'.level0.value',
@@ -245,30 +261,41 @@ describe('Counter', () => {
'.level1.value',
]
- expect(getTextContents(container, atomValueSelectors)).toEqual([
- '0', // level0 base
- '0', // level0 value
- '0', // level1 base
- '0', // level1 value
- ])
+ expect(getTextContents(container, atomValueSelectors) + '').toEqual(
+ [
+ '0', // level0 base
+ '0', // level0 value
+ '0', // level1 base
+ '0', // level1 value
+ ] + ''
+ )
- clickButton(container, increaseUnscopedBase)
- expect(getTextContents(container, atomValueSelectors)).toEqual([
- '1', // level0 base
- '1', // level0 value
- '0', // level1 base
- '0', // level1 value
- ])
+ // S0[a]: a0, b0(a1)
+ // S1[a]: a1, b0(a1)
+ // +S0 b0
+ clickButton(container, increaseUnscopedDerived)
+ expect(getTextContents(container, atomValueSelectors) + '').toEqual(
+ [
+ '1', // level0 base
+ '1', // level0 value
+ '0', // level1 base FIXME: receives 1
+ '0', // level1 value
+ ] + ''
+ )
- clickButton(container, increaseScopedBase)
- expect(getTextContents(container, atomValueSelectors)).toEqual([
- '1', // level0 base
- '1', // level0 value
- '1', // level1 base
- '1', // level1 value
- ])
+ clickButton(container, increaseScopedDerived)
+ expect(getTextContents(container, atomValueSelectors) + '').toEqual(
+ [
+ '1', // level0 base
+ '1', // level0 value
+ '1', // level1 base
+ '1', // level1 value
+ ] + ''
+ )
})
+ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
/*
base, notScoped, derived(base + notScoped)
S0[base]: derived0(base0 + notScoped0)
diff --git a/tests/issues.test.ts b/tests/issues.test.ts
index d97c32a..1191e93 100644
--- a/tests/issues.test.ts
+++ b/tests/issues.test.ts
@@ -4,7 +4,9 @@ import { createScope } from '../src/ScopeProvider/scope'
describe('open issues', () => {
// FIXME:
- it.skip('https://github.com/jotaijs/jotai-scope/issues/25', () => {
+ it.only('https://github.com/jotaijs/jotai-scope/issues/25', () => {
+ // is not scoped, so it only be computed once
+ // even if it's read from multiple scopes
const a = atom(
vi.fn(() => {
console.log('reading atomA')
@@ -21,8 +23,11 @@ describe('open issues', () => {
console.log('S0: atomA changed')
})
+ expect(a.read).toHaveBeenCalledTimes(1)
+ expect(a.onMount).toHaveBeenCalledTimes(1)
+
const s1 = createScope({
- atomSet: new Set([a]),
+ atomSet: new Set([]),
atomFamilySet: new Set(),
parentStore: s0,
scopeName: 's1',
diff --git a/tests/utils.ts b/tests/utils.ts
index 86154e7..7f37282 100644
--- a/tests/utils.ts
+++ b/tests/utils.ts
@@ -1,5 +1,5 @@
import { fireEvent } from '@testing-library/react'
-import { Store } from 'src/types'
+import { INTERNAL_Store as Store } from 'jotai/vanilla/internals'
function getElements(
container: HTMLElement,
@@ -39,7 +39,7 @@ type DevStoreRev4 = Omit<
export function getDevStore(store: Store): PrdStore & DevStoreRev4 {
if (!isDevStore(store)) {
- throw new Error('Store is not a dev store')
+ throw new Error('INTERNAL_Store is not a dev store')
}
return store
}
@@ -56,7 +56,7 @@ export function assertIsDevStore(
store: Store
): asserts store is PrdStore & DevStoreRev4 {
if (!isDevStore(store)) {
- throw new Error('Store is not a dev store')
+ throw new Error('INTERNAL_Store is not a dev store')
}
}