@@ -456,6 +456,78 @@ describe('reactivity/computed', () => {
456456 expect ( fnSpy ) . toBeCalledTimes ( 2 )
457457 } )
458458
459+ it ( 'should mark dirty as MaybeDirty_ComputedSideEffect_Origin' , ( ) => {
460+ const v = ref ( 1 )
461+ const c = computed ( ( ) => {
462+ v . value += 1
463+ return v . value
464+ } )
465+
466+ c . value
467+ expect ( c . effect . _dirtyLevel ) . toBe (
468+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
469+ )
470+ expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
471+ } )
472+
473+ it ( 'should not infinite re-run effect when effect access original side effect computed' , async ( ) => {
474+ const spy = vi . fn ( )
475+ const v = ref ( 0 )
476+ const c = computed ( ( ) => {
477+ v . value += 1
478+ return v . value
479+ } )
480+ const Comp = {
481+ setup : ( ) => {
482+ return ( ) => {
483+ spy ( )
484+ return v . value + c . value
485+ }
486+ } ,
487+ }
488+ const root = nodeOps . createElement ( 'div' )
489+
490+ render ( h ( Comp ) , root )
491+ expect ( spy ) . toBeCalledTimes ( 1 )
492+ await nextTick ( )
493+ expect ( c . effect . _dirtyLevel ) . toBe (
494+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
495+ )
496+ expect ( serializeInner ( root ) ) . toBe ( '2' )
497+ expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
498+ } )
499+
500+ it ( 'should not infinite re-run effect when effect access chained side effect computed' , async ( ) => {
501+ const spy = vi . fn ( )
502+ const v = ref ( 0 )
503+ const c1 = computed ( ( ) => {
504+ v . value += 1
505+ return v . value
506+ } )
507+ const c2 = computed ( ( ) => v . value + c1 . value )
508+ const Comp = {
509+ setup : ( ) => {
510+ return ( ) => {
511+ spy ( )
512+ return v . value + c1 . value + c2 . value
513+ }
514+ } ,
515+ }
516+ const root = nodeOps . createElement ( 'div' )
517+
518+ render ( h ( Comp ) , root )
519+ expect ( spy ) . toBeCalledTimes ( 1 )
520+ await nextTick ( )
521+ expect ( c1 . effect . _dirtyLevel ) . toBe (
522+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
523+ )
524+ expect ( c2 . effect . _dirtyLevel ) . toBe (
525+ DirtyLevels . MaybeDirty_ComputedSideEffect ,
526+ )
527+ expect ( serializeInner ( root ) ) . toBe ( '4' )
528+ expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
529+ } )
530+
459531 it ( 'should chained recurse effects clear dirty after trigger' , ( ) => {
460532 const v = ref ( 1 )
461533 const c1 = computed ( ( ) => v . value )
@@ -482,7 +554,9 @@ describe('reactivity/computed', () => {
482554
483555 c3 . value
484556
485- expect ( c1 . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
557+ expect ( c1 . effect . _dirtyLevel ) . toBe (
558+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
559+ )
486560 expect ( c2 . effect . _dirtyLevel ) . toBe (
487561 DirtyLevels . MaybeDirty_ComputedSideEffect ,
488562 )
@@ -502,7 +576,9 @@ describe('reactivity/computed', () => {
502576 } )
503577 const c2 = computed ( ( ) => v . value + c1 . value )
504578 expect ( c2 . value ) . toBe ( '0foo' )
505- expect ( c2 . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
579+ expect ( c2 . effect . _dirtyLevel ) . toBe (
580+ DirtyLevels . MaybeDirty_ComputedSideEffect ,
581+ )
506582 expect ( c2 . value ) . toBe ( '1foo' )
507583 expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
508584 } )
@@ -523,8 +599,12 @@ describe('reactivity/computed', () => {
523599 c2 . value
524600 } )
525601 expect ( fnSpy ) . toBeCalledTimes ( 1 )
526- expect ( c1 . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
527- expect ( c2 . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
602+ expect ( c1 . effect . _dirtyLevel ) . toBe (
603+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
604+ )
605+ expect ( c2 . effect . _dirtyLevel ) . toBe (
606+ DirtyLevels . MaybeDirty_ComputedSideEffect ,
607+ )
528608 v . value = 2
529609 expect ( fnSpy ) . toBeCalledTimes ( 2 )
530610 expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
@@ -557,7 +637,9 @@ describe('reactivity/computed', () => {
557637 expect ( c3 . effect . _dirtyLevel ) . toBe ( DirtyLevels . MaybeDirty )
558638
559639 c3 . value
560- expect ( c1 . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
640+ expect ( c1 . effect . _dirtyLevel ) . toBe (
641+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
642+ )
561643 expect ( c2 . effect . _dirtyLevel ) . toBe (
562644 DirtyLevels . MaybeDirty_ComputedSideEffect ,
563645 )
@@ -611,11 +693,18 @@ describe('reactivity/computed', () => {
611693
612694 render ( h ( Comp ) , root )
613695 await nextTick ( )
696+ expect ( c . effect . _dirtyLevel ) . toBe (
697+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
698+ )
614699 expect ( serializeInner ( root ) ) . toBe ( 'Hello World' )
615700
616701 v . value += ' World'
702+ expect ( c . effect . _dirtyLevel ) . toBe ( DirtyLevels . Dirty )
617703 await nextTick ( )
618- expect ( serializeInner ( root ) ) . toBe ( 'Hello World World World World' )
704+ expect ( c . effect . _dirtyLevel ) . toBe (
705+ DirtyLevels . MaybeDirty_ComputedSideEffect_Origin ,
706+ )
707+ expect ( serializeInner ( root ) ) . toBe ( 'Hello World World World' )
619708 expect ( COMPUTED_SIDE_EFFECT_WARN ) . toHaveBeenWarned ( )
620709 } )
621710
0 commit comments