@@ -683,6 +683,50 @@ func (s *S) TestUpdate(c *C) {
683683 c .Assert (err , Equals , mgo .ErrNotFound )
684684}
685685
686+ func (s * S ) TestUpdateWithChangeInfo (c * C ) {
687+ session , err := mgo .Dial ("localhost:40001" )
688+ c .Assert (err , IsNil )
689+ defer session .Close ()
690+
691+ coll := session .DB ("mydb" ).C ("mycoll" )
692+
693+ ns := []int {40 , 41 , 42 , 43 , 44 , 45 , 46 }
694+ for _ , n := range ns {
695+ err := coll .Insert (M {"k" : n , "n" : n })
696+ c .Assert (err , IsNil )
697+ }
698+
699+ // No changes is a no-op and shouldn't return an error.
700+ info , err := coll .UpdateWithChangeInfo (M {"k" : 42 }, M {"$set" : M {"n" : 42 }})
701+ c .Assert (err , IsNil )
702+ c .Assert (info .Matched , Equals , 1 )
703+ c .Assert (info .Updated , Equals , 0 )
704+ c .Assert (info .Removed , Equals , 0 )
705+ c .Assert (info .UpsertedId , IsNil )
706+
707+ info , err = coll .UpdateWithChangeInfo (M {"k" : 42 }, M {"$inc" : M {"n" : 1 }})
708+ c .Assert (err , IsNil )
709+ c .Assert (info .Matched , Equals , 1 )
710+ c .Assert (info .Updated , Equals , 1 )
711+ c .Assert (info .Removed , Equals , 0 )
712+ c .Assert (info .UpsertedId , IsNil )
713+
714+ result := make (M )
715+ err = coll .Find (M {"k" : 42 }).One (result )
716+ c .Assert (err , IsNil )
717+ c .Assert (result ["n" ], Equals , 43 )
718+
719+ info , err = coll .UpdateWithChangeInfo (M {"k" : 47 }, M {"k" : 47 , "n" : 47 })
720+ c .Assert (err , Equals , mgo .ErrNotFound )
721+ c .Assert (info .Matched , Equals , 0 )
722+ c .Assert (info .Updated , Equals , 0 )
723+ c .Assert (info .Removed , Equals , 0 )
724+ c .Assert (info .UpsertedId , IsNil )
725+
726+ err = coll .Find (M {"k" : 47 }).One (result )
727+ c .Assert (err , Equals , mgo .ErrNotFound )
728+ }
729+
686730func (s * S ) TestUpdateId (c * C ) {
687731 session , err := mgo .Dial ("localhost:40001" )
688732 c .Assert (err , IsNil )
@@ -986,6 +1030,39 @@ func (s *S) TestRemove(c *C) {
9861030 c .Assert (result .N , Equals , 44 )
9871031}
9881032
1033+ func (s * S ) TestRemoveWithChangeInfo (c * C ) {
1034+ session , err := mgo .Dial ("localhost:40001" )
1035+ c .Assert (err , IsNil )
1036+ defer session .Close ()
1037+
1038+ coll := session .DB ("mydb" ).C ("mycoll" )
1039+
1040+ ns := []int {40 , 41 , 42 , 43 , 44 , 45 , 46 }
1041+ for _ , n := range ns {
1042+ err := coll .Insert (M {"n" : n })
1043+ c .Assert (err , IsNil )
1044+ }
1045+
1046+ info , err := coll .RemoveWithChangeInfo (M {"n" : M {"$gt" : 42 }})
1047+ c .Assert (err , IsNil )
1048+ c .Assert (info .Removed , Equals , 1 )
1049+ c .Assert (info .Matched , Equals , 3 )
1050+ c .Assert (info .Updated , Equals , 0 )
1051+ c .Assert (info .UpsertedId , IsNil )
1052+
1053+ result := & struct { N int }{}
1054+ err = coll .Find (M {"n" : 42 }).One (result )
1055+ c .Assert (err , IsNil )
1056+ c .Assert (result .N , Equals , 42 )
1057+
1058+ err = coll .Find (M {"n" : 43 }).One (result )
1059+ c .Assert (err , Equals , mgo .ErrNotFound )
1060+
1061+ err = coll .Find (M {"n" : 44 }).One (result )
1062+ c .Assert (err , IsNil )
1063+ c .Assert (result .N , Equals , 44 )
1064+ }
1065+
9891066func (s * S ) TestRemoveId (c * C ) {
9901067 session , err := mgo .Dial ("localhost:40001" )
9911068 c .Assert (err , IsNil )
0 commit comments