|
| 1 | +import { |
| 2 | + type DebuggerEvent, |
| 3 | + ITERATE_KEY, |
| 4 | + TrackOpTypes, |
| 5 | + TriggerOpTypes, |
| 6 | + reactive, |
| 7 | +} from '@vue/reactivity' |
1 | 8 | import {
|
2 | 9 | type InjectionKey,
|
3 | 10 | type Ref,
|
@@ -337,49 +344,97 @@ describe('api: lifecycle hooks', () => {
|
337 | 344 | })
|
338 | 345 |
|
339 | 346 | test('onRenderTracked', async () => {
|
340 |
| - const onTrackedFn = vi.fn() |
341 |
| - const count = ref(0) |
342 |
| - const { host, render } = define({ |
| 347 | + const events: DebuggerEvent[] = [] |
| 348 | + const onTrack = vi.fn((e: DebuggerEvent) => { |
| 349 | + events.push(e) |
| 350 | + }) |
| 351 | + const obj = reactive({ foo: 1, bar: 2 }) |
| 352 | + |
| 353 | + const { render } = define({ |
343 | 354 | setup() {
|
344 |
| - onRenderTracked(onTrackedFn) |
| 355 | + onRenderTracked(onTrack) |
345 | 356 | return (() => {
|
346 | 357 | const n0 = createTextNode()
|
347 | 358 | renderEffect(() => {
|
348 |
| - setText(n0, count.value) |
| 359 | + setText(n0, [obj.foo, 'bar' in obj, Object.keys(obj).join('')]) |
349 | 360 | })
|
350 | 361 | return n0
|
351 | 362 | })()
|
352 | 363 | },
|
353 | 364 | })
|
| 365 | + |
354 | 366 | render()
|
355 |
| - await nextTick() |
356 |
| - expect(onTrackedFn).toBeCalled() |
357 |
| - expect(host.innerHTML).toBe('0') |
358 |
| - // TODO: compatibility with packages/runtime-core/__tests__/apiLifecycle.spec.ts |
| 367 | + expect(onTrack).toHaveBeenCalledTimes(3) |
| 368 | + expect(events).toMatchObject([ |
| 369 | + { |
| 370 | + target: obj, |
| 371 | + type: TrackOpTypes.GET, |
| 372 | + key: 'foo', |
| 373 | + }, |
| 374 | + { |
| 375 | + target: obj, |
| 376 | + type: TrackOpTypes.HAS, |
| 377 | + key: 'bar', |
| 378 | + }, |
| 379 | + { |
| 380 | + target: obj, |
| 381 | + type: TrackOpTypes.ITERATE, |
| 382 | + key: ITERATE_KEY, |
| 383 | + }, |
| 384 | + ]) |
359 | 385 | })
|
360 | 386 |
|
361 | 387 | test('onRenderTrigger', async () => {
|
362 |
| - const onRenderTriggerFn = vi.fn() |
363 |
| - const count = ref(0) |
364 |
| - const { host, render } = define({ |
| 388 | + const events: DebuggerEvent[] = [] |
| 389 | + const onTrigger = vi.fn((e: DebuggerEvent) => { |
| 390 | + events.push(e) |
| 391 | + }) |
| 392 | + const obj = reactive<{ |
| 393 | + foo: number |
| 394 | + bar?: number |
| 395 | + }>({ foo: 1, bar: 2 }) |
| 396 | + |
| 397 | + const { render } = define({ |
365 | 398 | setup() {
|
366 |
| - onRenderTriggered(onRenderTriggerFn) |
| 399 | + onRenderTriggered(onTrigger) |
367 | 400 | return (() => {
|
368 | 401 | const n0 = createTextNode()
|
369 | 402 | renderEffect(() => {
|
370 |
| - setText(n0, count.value) |
| 403 | + setText(n0, [obj.foo, 'bar' in obj, Object.keys(obj).join('')]) |
371 | 404 | })
|
372 | 405 | return n0
|
373 | 406 | })()
|
374 | 407 | },
|
375 | 408 | })
|
| 409 | + |
376 | 410 | render()
|
377 |
| - count.value++ |
| 411 | + |
| 412 | + obj.foo++ |
378 | 413 | await nextTick()
|
379 |
| - expect(onRenderTriggerFn).toBeCalled() |
380 |
| - expect(onRenderTriggerFn).toHaveBeenCalledOnce() |
381 |
| - expect(host.innerHTML).toBe('1') |
382 |
| - // TODO: compatibility with packages/runtime-core/__tests__/apiLifecycle.spec.ts |
| 414 | + expect(onTrigger).toHaveBeenCalledTimes(1) |
| 415 | + expect(events[0]).toMatchObject({ |
| 416 | + type: TriggerOpTypes.SET, |
| 417 | + key: 'foo', |
| 418 | + oldValue: 1, |
| 419 | + newValue: 2, |
| 420 | + }) |
| 421 | + |
| 422 | + delete obj.bar |
| 423 | + await nextTick() |
| 424 | + expect(onTrigger).toHaveBeenCalledTimes(2) |
| 425 | + expect(events[1]).toMatchObject({ |
| 426 | + type: TriggerOpTypes.DELETE, |
| 427 | + key: 'bar', |
| 428 | + oldValue: 2, |
| 429 | + }) |
| 430 | + ;(obj as any).baz = 3 |
| 431 | + await nextTick() |
| 432 | + expect(onTrigger).toHaveBeenCalledTimes(3) |
| 433 | + expect(events[2]).toMatchObject({ |
| 434 | + type: TriggerOpTypes.ADD, |
| 435 | + key: 'baz', |
| 436 | + newValue: 3, |
| 437 | + }) |
383 | 438 | })
|
384 | 439 |
|
385 | 440 | it('runs shared hook fn for each instance', async () => {
|
|
0 commit comments