|
|
@@ -5,7 +5,12 @@ import {
|
|
|
ref,
|
|
|
WritableComputedRef,
|
|
|
isReadonly,
|
|
|
- setComputedScheduler
|
|
|
+ setComputedScheduler,
|
|
|
+ DebuggerEvent,
|
|
|
+ toRaw,
|
|
|
+ TrackOpTypes,
|
|
|
+ ITERATE_KEY,
|
|
|
+ TriggerOpTypes
|
|
|
} from '../src'
|
|
|
|
|
|
describe('reactivity/computed', () => {
|
|
|
@@ -200,6 +205,75 @@ describe('reactivity/computed', () => {
|
|
|
expect(x.value).toBe(1)
|
|
|
})
|
|
|
|
|
|
+ it('debug: onTrack', () => {
|
|
|
+ let events: DebuggerEvent[] = []
|
|
|
+ const onTrack = jest.fn((e: DebuggerEvent) => {
|
|
|
+ events.push(e)
|
|
|
+ })
|
|
|
+ const obj = reactive({ foo: 1, bar: 2 })
|
|
|
+ const c = computed(() => (obj.foo, 'bar' in obj, Object.keys(obj)), {
|
|
|
+ onTrack
|
|
|
+ })
|
|
|
+ expect(c.value).toEqual(['foo', 'bar'])
|
|
|
+ expect(onTrack).toHaveBeenCalledTimes(3)
|
|
|
+ expect(events).toEqual([
|
|
|
+ {
|
|
|
+ effect: c.effect,
|
|
|
+ target: toRaw(obj),
|
|
|
+ type: TrackOpTypes.GET,
|
|
|
+ key: 'foo'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ effect: c.effect,
|
|
|
+ target: toRaw(obj),
|
|
|
+ type: TrackOpTypes.HAS,
|
|
|
+ key: 'bar'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ effect: c.effect,
|
|
|
+ target: toRaw(obj),
|
|
|
+ type: TrackOpTypes.ITERATE,
|
|
|
+ key: ITERATE_KEY
|
|
|
+ }
|
|
|
+ ])
|
|
|
+ })
|
|
|
+
|
|
|
+ it('debug: onTrigger', () => {
|
|
|
+ let events: DebuggerEvent[] = []
|
|
|
+ const onTrigger = jest.fn((e: DebuggerEvent) => {
|
|
|
+ events.push(e)
|
|
|
+ })
|
|
|
+ const obj = reactive({ foo: 1 })
|
|
|
+ const c = computed(() => obj.foo, { onTrigger })
|
|
|
+
|
|
|
+ // computed won't trigger compute until accessed
|
|
|
+ c.value
|
|
|
+
|
|
|
+ obj.foo++
|
|
|
+ expect(c.value).toBe(2)
|
|
|
+ expect(onTrigger).toHaveBeenCalledTimes(1)
|
|
|
+ expect(events[0]).toEqual({
|
|
|
+ effect: c.effect,
|
|
|
+ target: toRaw(obj),
|
|
|
+ type: TriggerOpTypes.SET,
|
|
|
+ key: 'foo',
|
|
|
+ oldValue: 1,
|
|
|
+ newValue: 2
|
|
|
+ })
|
|
|
+
|
|
|
+ // @ts-ignore
|
|
|
+ delete obj.foo
|
|
|
+ expect(c.value).toBeUndefined()
|
|
|
+ expect(onTrigger).toHaveBeenCalledTimes(2)
|
|
|
+ expect(events[1]).toEqual({
|
|
|
+ effect: c.effect,
|
|
|
+ target: toRaw(obj),
|
|
|
+ type: TriggerOpTypes.DELETE,
|
|
|
+ key: 'foo',
|
|
|
+ oldValue: 2
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
describe('with scheduler', () => {
|
|
|
// a simple scheduler similar to the main Vue scheduler
|
|
|
const tick = Promise.resolve()
|