test: more test cases for computed w/ scheduler
This commit is contained in:
@@ -272,6 +272,68 @@ describe('reactivity/computed', () => {
|
||||
expect(spy).toHaveBeenCalledTimes(2)
|
||||
})
|
||||
|
||||
test('chained computed trigger', async () => {
|
||||
const effectSpy = jest.fn()
|
||||
const c1Spy = jest.fn()
|
||||
const c2Spy = jest.fn()
|
||||
|
||||
const src = ref(0)
|
||||
const c1 = computed(() => {
|
||||
c1Spy()
|
||||
return src.value % 2
|
||||
})
|
||||
const c2 = computed(() => {
|
||||
c2Spy()
|
||||
return c1.value + 1
|
||||
})
|
||||
|
||||
effect(() => {
|
||||
effectSpy(c2.value)
|
||||
})
|
||||
|
||||
expect(c1Spy).toHaveBeenCalledTimes(1)
|
||||
expect(c2Spy).toHaveBeenCalledTimes(1)
|
||||
expect(effectSpy).toHaveBeenCalledTimes(1)
|
||||
|
||||
src.value = 1
|
||||
await tick
|
||||
expect(c1Spy).toHaveBeenCalledTimes(2)
|
||||
expect(c2Spy).toHaveBeenCalledTimes(2)
|
||||
expect(effectSpy).toHaveBeenCalledTimes(2)
|
||||
})
|
||||
|
||||
test('chained computed avoid re-compute', async () => {
|
||||
const effectSpy = jest.fn()
|
||||
const c1Spy = jest.fn()
|
||||
const c2Spy = jest.fn()
|
||||
|
||||
const src = ref(0)
|
||||
const c1 = computed(() => {
|
||||
c1Spy()
|
||||
return src.value % 2
|
||||
})
|
||||
const c2 = computed(() => {
|
||||
c2Spy()
|
||||
return c1.value + 1
|
||||
})
|
||||
|
||||
effect(() => {
|
||||
effectSpy(c2.value)
|
||||
})
|
||||
|
||||
expect(effectSpy).toHaveBeenCalledTimes(1)
|
||||
src.value = 2
|
||||
src.value = 4
|
||||
src.value = 6
|
||||
await tick
|
||||
// c1 should re-compute once.
|
||||
expect(c1Spy).toHaveBeenCalledTimes(2)
|
||||
// c2 should not have to re-compute because c1 did not change.
|
||||
expect(c2Spy).toHaveBeenCalledTimes(1)
|
||||
// effect should not trigger because c2 did not change.
|
||||
expect(effectSpy).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
|
||||
test('chained computed value invalidation', async () => {
|
||||
const effectSpy = jest.fn()
|
||||
const c1Spy = jest.fn()
|
||||
@@ -302,25 +364,33 @@ describe('reactivity/computed', () => {
|
||||
// value should be available sync
|
||||
expect(c2.value).toBe(2)
|
||||
expect(c2Spy).toHaveBeenCalledTimes(2)
|
||||
})
|
||||
|
||||
test('sync access of invalidated chained computed should not prevent final effect from running', async () => {
|
||||
const effectSpy = jest.fn()
|
||||
const c1Spy = jest.fn()
|
||||
const c2Spy = jest.fn()
|
||||
|
||||
const src = ref(0)
|
||||
const c1 = computed(() => {
|
||||
c1Spy()
|
||||
return src.value % 2
|
||||
})
|
||||
const c2 = computed(() => {
|
||||
c2Spy()
|
||||
return c1.value + 1
|
||||
})
|
||||
|
||||
effect(() => {
|
||||
effectSpy(c2.value)
|
||||
})
|
||||
expect(effectSpy).toHaveBeenCalledTimes(1)
|
||||
|
||||
src.value = 1
|
||||
// sync access c2
|
||||
c2.value
|
||||
await tick
|
||||
expect(effectSpy).toHaveBeenCalledTimes(2)
|
||||
expect(effectSpy).toHaveBeenCalledWith(2)
|
||||
expect(c1Spy).toHaveBeenCalledTimes(2)
|
||||
expect(c2Spy).toHaveBeenCalledTimes(2)
|
||||
|
||||
src.value = 2
|
||||
await tick
|
||||
expect(effectSpy).toHaveBeenCalledTimes(3)
|
||||
expect(c1Spy).toHaveBeenCalledTimes(3)
|
||||
expect(c2Spy).toHaveBeenCalledTimes(3)
|
||||
|
||||
src.value = 4
|
||||
await tick
|
||||
expect(effectSpy).toHaveBeenCalledTimes(3)
|
||||
expect(c1Spy).toHaveBeenCalledTimes(4)
|
||||
// in-between chained computed always re-compute, but it does avoid
|
||||
// triggering the final subscribing effect.
|
||||
expect(c2Spy).toHaveBeenCalledTimes(4)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user