@@ -483,104 +483,127 @@ describe('Scope', function() {
483483 describe ( '$watchCollection' , function ( ) {
484484 var log , $rootScope , deregister ;
485485
486- beforeEach ( inject ( function ( _$rootScope_ ) {
487- log = [ ] ;
486+ beforeEach ( inject ( function ( _$rootScope_ , _log_ ) {
488487 $rootScope = _$rootScope_ ;
489- deregister = $rootScope . $watchCollection ( 'obj' , function logger ( obj ) {
490- log . push ( toJson ( obj ) ) ;
488+ log = _log_ ;
489+ deregister = $rootScope . $watchCollection ( 'obj' , function logger ( newVal , oldVal ) {
490+ var msg = { newVal : newVal , oldVal : oldVal } ;
491+
492+ if ( newVal === oldVal ) {
493+ msg . identical = true ;
494+ }
495+
496+ log ( msg ) ;
491497 } ) ;
492498 } ) ) ;
493499
494500
495501 it ( 'should not trigger if nothing change' , inject ( function ( $rootScope ) {
496502 $rootScope . $digest ( ) ;
497- expect ( log ) . toEqual ( [ undefined ] ) ;
503+ expect ( log ) . toEqual ( [ { newVal : undefined , oldVal : undefined , identical : true } ] ) ;
504+ log . reset ( ) ;
498505
499506 $rootScope . $digest ( ) ;
500- expect ( log ) . toEqual ( [ undefined ] ) ;
507+ expect ( log ) . toEqual ( [ ] ) ;
501508 } ) ) ;
502509
503510
504- it ( 'should allow deregistration' , inject ( function ( $rootScope ) {
511+ it ( 'should allow deregistration' , function ( ) {
505512 $rootScope . obj = [ ] ;
506513 $rootScope . $digest ( ) ;
507-
508- expect ( log ) . toEqual ( [ '[]' ] ) ;
514+ expect ( log . toArray ( ) . length ) . toBe ( 1 ) ;
515+ log . reset ( ) ;
509516
510517 $rootScope . obj . push ( 'a' ) ;
511518 deregister ( ) ;
512519
513520 $rootScope . $digest ( ) ;
514- expect ( log ) . toEqual ( [ '[]' ] ) ;
515- } ) ) ;
521+ expect ( log ) . toEqual ( [ ] ) ;
522+ } ) ;
516523
517524
518525 describe ( 'array' , function ( ) {
526+
527+ it ( 'should return oldCollection === newCollection only on the first listener call' ,
528+ inject ( function ( $rootScope , log ) {
529+
530+ // first time should be identical
531+ $rootScope . obj = [ 'a' , 'b' ] ;
532+ $rootScope . $digest ( ) ;
533+ expect ( log ) . toEqual ( [ { newVal : [ 'a' , 'b' ] , oldVal : [ 'a' , 'b' ] , identical : true } ] ) ;
534+ log . reset ( ) ;
535+
536+ // second time should be different
537+ $rootScope . obj [ 1 ] = 'c' ;
538+ $rootScope . $digest ( ) ;
539+ expect ( log ) . toEqual ( [ { newVal : [ 'a' , 'c' ] , oldVal : [ 'a' , 'b' ] } ] ) ;
540+ } ) ) ;
541+
542+
519543 it ( 'should trigger when property changes into array' , function ( ) {
520544 $rootScope . obj = 'test' ;
521545 $rootScope . $digest ( ) ;
522- expect ( log ) . toEqual ( [ ' "test"' ] ) ;
546+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : "test" , oldVal : "test" , identical : true } ] ) ;
523547
524548 $rootScope . obj = [ ] ;
525549 $rootScope . $digest ( ) ;
526- expect ( log ) . toEqual ( [ '"test"' , '[]' ] ) ;
550+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ ] , oldVal : "test" } ] ) ;
527551
528552 $rootScope . obj = { } ;
529553 $rootScope . $digest ( ) ;
530- expect ( log ) . toEqual ( [ '"test"' , '[]' , '{}' ] ) ;
554+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { } , oldVal : [ ] } ] ) ;
531555
532556 $rootScope . obj = [ ] ;
533557 $rootScope . $digest ( ) ;
534- expect ( log ) . toEqual ( [ '"test"' , '[]' , '{}' , '[]' ] ) ;
558+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ ] , oldVal : { } } ] ) ;
535559
536560 $rootScope . obj = undefined ;
537561 $rootScope . $digest ( ) ;
538- expect ( log ) . toEqual ( [ '"test"' , '[]' , '{}' , '[]' , undefined ] ) ;
562+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : undefined , oldVal : [ ] } ] ) ;
539563 } ) ;
540564
541565
542566 it ( 'should not trigger change when object in collection changes' , function ( ) {
543567 $rootScope . obj = [ { } ] ;
544568 $rootScope . $digest ( ) ;
545- expect ( log ) . toEqual ( [ ' [{}]' ] ) ;
569+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ { } ] , oldVal : [ { } ] , identical : true } ] ) ;
546570
547571 $rootScope . obj [ 0 ] . name = 'foo' ;
548572 $rootScope . $digest ( ) ;
549- expect ( log ) . toEqual ( [ '[{}]' ] ) ;
573+ expect ( log ) . toEqual ( [ ] ) ;
550574 } ) ;
551575
552576
553577 it ( 'should watch array properties' , function ( ) {
554578 $rootScope . obj = [ ] ;
555579 $rootScope . $digest ( ) ;
556- expect ( log ) . toEqual ( [ '[]' ] ) ;
580+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ ] , oldVal : [ ] , identical : true } ] ) ;
557581
558582 $rootScope . obj . push ( 'a' ) ;
559583 $rootScope . $digest ( ) ;
560- expect ( log ) . toEqual ( [ '[]' , '["a"]' ] ) ;
584+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ 'a' ] , oldVal : [ ] } ] ) ;
561585
562586 $rootScope . obj [ 0 ] = 'b' ;
563587 $rootScope . $digest ( ) ;
564- expect ( log ) . toEqual ( [ '[]' , '["a"]' , '["b"]' ] ) ;
588+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ 'b' ] , oldVal : [ 'a' ] } ] ) ;
565589
566590 $rootScope . obj . push ( [ ] ) ;
567591 $rootScope . obj . push ( { } ) ;
568- log = [ ] ;
569592 $rootScope . $digest ( ) ;
570- expect ( log ) . toEqual ( [ '["b", [],{}]' ] ) ;
593+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ 'b' , [ ] , { } ] , oldVal : [ 'b' ] } ] ) ;
571594
572595 var temp = $rootScope . obj [ 1 ] ;
573596 $rootScope . obj [ 1 ] = $rootScope . obj [ 2 ] ;
574597 $rootScope . obj [ 2 ] = temp ;
575598 $rootScope . $digest ( ) ;
576- expect ( log ) . toEqual ( [ '["b",[],{}]' , '["b",{},[]]' ] ) ;
599+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ 'b' , { } , [ ] ] , oldVal : [ 'b' , [ ] , { } ] } ] ) ;
577600
578601 $rootScope . obj . shift ( ) ;
579- log = [ ] ;
580602 $rootScope . $digest ( ) ;
581- expect ( log ) . toEqual ( [ ' [{},[]]' ] ) ;
603+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : [ { } , [ ] ] , oldVal : [ 'b' , { } , [ ] ] } ] ) ;
582604 } ) ;
583605
606+
584607 it ( 'should watch array-like objects like arrays' , function ( ) {
585608 var arrayLikelog = [ ] ;
586609 $rootScope . $watchCollection ( 'arrayLikeObject' , function logger ( obj ) {
@@ -601,57 +624,72 @@ describe('Scope', function() {
601624
602625
603626 describe ( 'object' , function ( ) {
627+
628+ it ( 'should return oldCollection === newCollection only on the first listener call' ,
629+ inject ( function ( $rootScope , log ) {
630+
631+ $rootScope . obj = { 'a' : 'b' } ;
632+ // first time should be identical
633+ $rootScope . $digest ( ) ;
634+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { 'a' : 'b' } , oldVal : { 'a' : 'b' } , identical : true } ] ) ;
635+
636+ // second time not identical
637+ $rootScope . obj . a = 'c' ;
638+ $rootScope . $digest ( ) ;
639+ expect ( log ) . toEqual ( [ { newVal : { 'a' : 'c' } , oldVal : { 'a' : 'b' } } ] ) ;
640+ } ) ) ;
641+
642+
604643 it ( 'should trigger when property changes into object' , function ( ) {
605644 $rootScope . obj = 'test' ;
606645 $rootScope . $digest ( ) ;
607- expect ( log ) . toEqual ( [ '" test"' ] ) ;
646+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : ' test' , oldVal : 'test' , identical : true } ] ) ;
608647
609648 $rootScope . obj = { } ;
610649 $rootScope . $digest ( ) ;
611- expect ( log ) . toEqual ( [ '"test"' , '{}' ] ) ;
650+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { } , oldVal : 'test' } ] ) ;
612651 } ) ;
613652
614653
615654 it ( 'should not trigger change when object in collection changes' , function ( ) {
616655 $rootScope . obj = { name : { } } ;
617656 $rootScope . $digest ( ) ;
618- expect ( log ) . toEqual ( [ '{" name": {}}' ] ) ;
657+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { name : { } } , oldVal : { name : { } } , identical : true } ] ) ;
619658
620659 $rootScope . obj . name . bar = 'foo' ;
621660 $rootScope . $digest ( ) ;
622- expect ( log ) . toEqual ( [ '{"name":{}}' ] ) ;
661+ expect ( log . empty ( ) ) . toEqual ( [ ] ) ;
623662 } ) ;
624663
625664
626665 it ( 'should watch object properties' , function ( ) {
627666 $rootScope . obj = { } ;
628667 $rootScope . $digest ( ) ;
629- expect ( log ) . toEqual ( [ '{}' ] ) ;
668+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { } , oldVal : { } , identical : true } ] ) ;
630669
631670 $rootScope . obj . a = 'A' ;
632671 $rootScope . $digest ( ) ;
633- expect ( log ) . toEqual ( [ '{}' , '{"a":"A"}' ] ) ;
672+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { a : 'A' } , oldVal : { } } ] ) ;
634673
635674 $rootScope . obj . a = 'B' ;
636675 $rootScope . $digest ( ) ;
637- expect ( log ) . toEqual ( [ '{}' , '{"a":"A"}' , '{"a":"B"}' ] ) ;
676+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { a : 'B' } , oldVal : { a : 'A' } } ] ) ;
638677
639678 $rootScope . obj . b = [ ] ;
640679 $rootScope . obj . c = { } ;
641- log = [ ] ;
642680 $rootScope . $digest ( ) ;
643- expect ( log ) . toEqual ( [ '{"a":"B","b": [],"c": {}}' ] ) ;
681+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { a : 'B' , b : [ ] , c : { } } , oldVal : { a : 'B' } } ] ) ;
644682
645683 var temp = $rootScope . obj . a ;
646684 $rootScope . obj . a = $rootScope . obj . b ;
647685 $rootScope . obj . c = temp ;
648686 $rootScope . $digest ( ) ;
649- expect ( log ) . toEqual ( [ '{"a":"B","b":[],"c":{}}' , '{"a":[],"b":[],"c":"B"}' ] ) ;
687+ expect ( log . empty ( ) ) .
688+ toEqual ( [ { newVal : { a : [ ] , b : { } , c : 'B' } , oldVal : { a : 'B' , b : [ ] , c : { } } } ] ) ;
650689
651690 delete $rootScope . obj . a ;
652- log = [ ] ;
653691 $rootScope . $digest ( ) ;
654- expect ( log ) . toEqual ( [ '{"b": [],"c":"B"}' ] ) ;
692+ expect ( log . empty ( ) ) . toEqual ( [ { newVal : { b : { } , c : 'B' } , oldVal : { a : [ ] , b : { } , c : 'B' } } ] ) ;
655693 } ) ;
656694 } ) ;
657695 } ) ;
0 commit comments