@@ -103,6 +103,11 @@ describe('update', function() {
103
103
update ( obj , { $set : { c : 'd' } } ) ;
104
104
expect ( obj ) . toEqual ( { a : 'b' } ) ;
105
105
} ) ;
106
+ it ( 'keeps reference equality when possible' , function ( ) {
107
+ var original = { a : 1 } ;
108
+ expect ( update ( original , { a : { $set : 1 } } ) ) . toBe ( original ) ;
109
+ expect ( update ( original , { a : { $set : 2 } } ) ) . toNotBe ( original ) ;
110
+ } ) ;
106
111
} ) ;
107
112
108
113
describe ( '$apply' , function ( ) {
@@ -122,38 +127,82 @@ describe('update', function() {
122
127
'update(): expected spec of $apply to be a function; got 123.'
123
128
) ;
124
129
} ) ;
130
+ it ( 'keeps reference equality when possible' , function ( ) {
131
+ var original = { a : { b : { } } } ;
132
+ function identity ( val ) {
133
+ return val ;
134
+ }
135
+ expect ( update ( original , { a : { $apply : identity } } ) ) . toBe ( original ) ;
136
+ expect ( update ( original , { a : { $apply : applier } } ) ) . toNotBe ( original ) ;
137
+ } ) ;
125
138
} ) ;
126
139
127
- it ( 'should support deep updates' , function ( ) {
128
- expect ( update ( {
129
- a : 'b' ,
130
- c : {
131
- d : 'e' ,
132
- f : [ 1 ] ,
133
- g : [ 2 ] ,
134
- h : [ 3 ] ,
135
- i : { j : 'k' } ,
136
- l : 4 ,
137
- } ,
138
- } , {
139
- c : {
140
- d : { $set : 'm' } ,
141
- f : { $push : [ 5 ] } ,
142
- g : { $unshift : [ 6 ] } ,
143
- h : { $splice : [ [ 0 , 1 , 7 ] ] } ,
144
- i : { $merge : { n : 'o' } } ,
145
- l : { $apply : function ( x ) { return x * 2 } } ,
146
- } ,
147
- } ) ) . toEqual ( {
148
- a : 'b' ,
149
- c : {
150
- d : 'm' ,
151
- f : [ 1 , 5 ] ,
152
- g : [ 6 , 2 ] ,
153
- h : [ 7 ] ,
154
- i : { j : 'k' , n : 'o' } ,
155
- l : 8 ,
156
- } ,
140
+ describe ( 'deep update' , function ( ) {
141
+ it ( 'works' , function ( ) {
142
+ expect ( update ( {
143
+ a : 'b' ,
144
+ c : {
145
+ d : 'e' ,
146
+ f : [ 1 ] ,
147
+ g : [ 2 ] ,
148
+ h : [ 3 ] ,
149
+ i : { j : 'k' } ,
150
+ l : 4 ,
151
+ } ,
152
+ } , {
153
+ c : {
154
+ d : { $set : 'm' } ,
155
+ f : { $push : [ 5 ] } ,
156
+ g : { $unshift : [ 6 ] } ,
157
+ h : { $splice : [ [ 0 , 1 , 7 ] ] } ,
158
+ i : { $merge : { n : 'o' } } ,
159
+ l : { $apply : function ( x ) { return x * 2 ; } } ,
160
+ } ,
161
+ } ) ) . toEqual ( {
162
+ a : 'b' ,
163
+ c : {
164
+ d : 'm' ,
165
+ f : [ 1 , 5 ] ,
166
+ g : [ 6 , 2 ] ,
167
+ h : [ 7 ] ,
168
+ i : { j : 'k' , n : 'o' } ,
169
+ l : 8 ,
170
+ } ,
171
+ } ) ;
172
+ } ) ;
173
+ it ( 'keeps reference equality when possible' , function ( ) {
174
+ var original = { a : { b : 1 } , c : { d : { e : 1 } } } ;
175
+
176
+ expect ( update ( original , { a : { b : { $set : 1 } } } ) ) . toBe ( original ) ;
177
+ expect ( update ( original , { a : { b : { $set : 1 } } } ) . a ) . toBe ( original . a ) ;
178
+
179
+ expect ( update ( original , { c : { d : { e : { $set : 1 } } } } ) ) . toBe ( original ) ;
180
+ expect ( update ( original , { c : { d : { e : { $set : 1 } } } } ) . c ) . toBe ( original . c ) ;
181
+ expect ( update ( original , { c : { d : { e : { $set : 1 } } } } ) . c . d ) . toBe ( original . c . d ) ;
182
+
183
+ expect ( update ( original , {
184
+ a : { b : { $set : 1 } } ,
185
+ c : { d : { e : { $set : 1 } } } ,
186
+ } ) ) . toBe ( original ) ;
187
+ expect ( update ( original , {
188
+ a : { b : { $set : 1 } } ,
189
+ c : { d : { e : { $set : 1 } } } ,
190
+ } ) . a ) . toBe ( original . a ) ;
191
+ expect ( update ( original , {
192
+ a : { b : { $set : 1 } } ,
193
+ c : { d : { e : { $set : 1 } } } ,
194
+ } ) . c ) . toBe ( original . c ) ;
195
+ expect ( update ( original , {
196
+ a : { b : { $set : 1 } } ,
197
+ c : { d : { e : { $set : 1 } } } ,
198
+ } ) . c . d ) . toBe ( original . c . d ) ;
199
+
200
+ expect ( update ( original , { a : { b : { $set : 2 } } } ) ) . toNotBe ( original ) ;
201
+ expect ( update ( original , { a : { b : { $set : 2 } } } ) . a ) . toNotBe ( original . a ) ;
202
+ expect ( update ( original , { a : { b : { $set : 2 } } } ) . a . b ) . toNotBe ( original . a . b ) ;
203
+
204
+ expect ( update ( original , { a : { b : { $set : 2 } } } ) . c ) . toBe ( original . c ) ;
205
+ expect ( update ( original , { a : { b : { $set : 2 } } } ) . c . d ) . toBe ( original . c . d ) ;
157
206
} ) ;
158
207
} ) ;
159
208
@@ -188,6 +237,16 @@ describe('update', function() {
188
237
expect ( myUpdate ( 5 , { $addtax : 0.10 } ) ) . toEqual ( 5.5 ) ;
189
238
} ) ;
190
239
240
+ it ( 'gets the original object (so be careful about mutations)' , function ( ) {
241
+ var obj = { } ;
242
+ var passedOriginal ;
243
+ myUpdate . extend ( '$foobar' , function ( prop , original ) {
244
+ passedOriginal = original ;
245
+ } ) ;
246
+ myUpdate ( obj , { $foobar : null } ) ;
247
+ expect ( obj ) . toBe ( passedOriginal ) ;
248
+ } ) ;
249
+
191
250
it ( "doesn't touch the original update" , function ( ) {
192
251
myUpdate . extend ( '$addtax' , function ( tax , original ) {
193
252
return original + ( tax * original ) ;
0 commit comments