@@ -136,6 +136,19 @@ describe('Filter: filter', function() {
136
136
} ) ;
137
137
138
138
139
+ it ( 'should respect the nesting level of "$"' , function ( ) {
140
+ var items = [ { supervisor : 'me' , person : { name : 'Annet' , email : 'annet@example.com' } } ,
141
+ { supervisor : 'me' , person : { name : 'Billy' , email : 'me@billy.com' } } ,
142
+ { supervisor : 'me' , person : { name : 'Joan' , email : 'joan@example.net' } } ,
143
+ { supervisor : 'me' , person : { name : 'John' , email : 'john@example.com' } } ,
144
+ { supervisor : 'me' , person : { name : 'Rita' , email : 'rita@example.com' } } ] ;
145
+ var expr = { $ : { $ : 'me' } } ;
146
+
147
+ expect ( filter ( items , expr ) . length ) . toBe ( 1 ) ;
148
+ expect ( filter ( items , expr ) ) . toEqual ( [ items [ 1 ] ] ) ;
149
+ } ) ;
150
+
151
+
139
152
it ( 'should support boolean properties' , function ( ) {
140
153
var items = [ { name : 'tom' , current : true } ,
141
154
{ name : 'demi' , current : false } ,
@@ -156,23 +169,146 @@ describe('Filter: filter', function() {
156
169
} ) ;
157
170
158
171
159
- it ( 'should not consider the expression\'s inherited properties' , function ( ) {
160
- Object . prototype . noop = noop ;
172
+ it ( 'should ignore function properties in items' , function ( ) {
173
+ // Own function properties
174
+ var items = [
175
+ { text : 'hello' , func : noop } ,
176
+ { text : 'goodbye' } ,
177
+ { text : 'kittens' } ,
178
+ { text : 'puppies' }
179
+ ] ;
180
+ var expr = { text : 'hello' } ;
181
+
182
+ expect ( filter ( items , expr ) . length ) . toBe ( 1 ) ;
183
+ expect ( filter ( items , expr ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
184
+ expect ( filter ( items , expr , true ) . length ) . toBe ( 1 ) ;
185
+ expect ( filter ( items , expr , true ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
186
+
187
+ // Inherited function proprties
188
+ function Item ( text ) {
189
+ this . text = text ;
190
+ }
191
+ Item . prototype . func = noop ;
192
+
193
+ items = [
194
+ new Item ( 'hello' ) ,
195
+ new Item ( 'goodbye' ) ,
196
+ new Item ( 'kittens' ) ,
197
+ new Item ( 'puppies' )
198
+ ] ;
161
199
200
+ expect ( filter ( items , expr ) . length ) . toBe ( 1 ) ;
201
+ expect ( filter ( items , expr ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
202
+ expect ( filter ( items , expr , true ) . length ) . toBe ( 1 ) ;
203
+ expect ( filter ( items , expr , true ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
204
+ } ) ;
205
+
206
+
207
+ it ( 'should ignore function properties in expression' , function ( ) {
208
+ // Own function properties
162
209
var items = [
163
210
{ text : 'hello' } ,
164
211
{ text : 'goodbye' } ,
165
212
{ text : 'kittens' } ,
166
213
{ text : 'puppies' }
167
214
] ;
215
+ var expr = { text : 'hello' , func : noop } ;
216
+
217
+ expect ( filter ( items , expr ) . length ) . toBe ( 1 ) ;
218
+ expect ( filter ( items , expr ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
219
+ expect ( filter ( items , expr , true ) . length ) . toBe ( 1 ) ;
220
+ expect ( filter ( items , expr , true ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
221
+
222
+ // Inherited function proprties
223
+ function Expr ( text ) {
224
+ this . text = text ;
225
+ }
226
+ Expr . prototype . func = noop ;
227
+
228
+ expr = new Expr ( 'hello' ) ;
229
+
230
+ expect ( filter ( items , expr ) . length ) . toBe ( 1 ) ;
231
+ expect ( filter ( items , expr ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
232
+ expect ( filter ( items , expr , true ) . length ) . toBe ( 1 ) ;
233
+ expect ( filter ( items , expr , true ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
234
+ } ) ;
235
+
236
+
237
+ it ( 'should consider inherited properties in items' , function ( ) {
238
+ function Item ( text ) {
239
+ this . text = text ;
240
+ }
241
+ Item . prototype . doubleL = 'maybe' ;
242
+
243
+ var items = [
244
+ new Item ( 'hello' ) ,
245
+ new Item ( 'goodbye' ) ,
246
+ new Item ( 'kittens' ) ,
247
+ new Item ( 'puppies' )
248
+ ] ;
249
+ var expr = { text : 'hello' , doubleL : 'perhaps' } ;
250
+
251
+ expect ( filter ( items , expr ) . length ) . toBe ( 0 ) ;
252
+ expect ( filter ( items , expr , true ) . length ) . toBe ( 0 ) ;
253
+
254
+ expr = { text : 'hello' , doubleL : 'maybe' } ;
255
+
256
+ expect ( filter ( items , expr ) . length ) . toBe ( 1 ) ;
257
+ expect ( filter ( items , expr ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
258
+ expect ( filter ( items , expr , true ) . length ) . toBe ( 1 ) ;
259
+ expect ( filter ( items , expr , true ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
260
+ } ) ;
261
+
262
+
263
+ it ( 'should consider inherited properties in expression' , function ( ) {
264
+ function Expr ( text ) {
265
+ this . text = text ;
266
+ }
267
+ Expr . prototype . doubleL = true ;
268
+
269
+ var items = [
270
+ { text : 'hello' , doubleL : true } ,
271
+ { text : 'goodbye' } ,
272
+ { text : 'kittens' } ,
273
+ { text : 'puppies' }
274
+ ] ;
275
+ var expr = new Expr ( 'e' ) ;
276
+
277
+ expect ( filter ( items , expr ) . length ) . toBe ( 1 ) ;
278
+ expect ( filter ( items , expr ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
279
+
280
+ expr = new Expr ( 'hello' ) ;
281
+
282
+ expect ( filter ( items , expr , true ) . length ) . toBe ( 1 ) ;
283
+ expect ( filter ( items , expr ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
284
+ } ) ;
285
+
286
+
287
+ it ( 'should not be affected by `Object.prototype` when using a string expression' , function ( ) {
288
+ Object . prototype . someProp = 'oo' ;
289
+
290
+ var items = [
291
+ createMap ( ) ,
292
+ createMap ( ) ,
293
+ createMap ( ) ,
294
+ createMap ( )
295
+ ] ;
296
+ items [ 0 ] . someProp = 'hello' ;
297
+ items [ 1 ] . someProp = 'goodbye' ;
298
+ items [ 2 ] . someProp = 'kittens' ;
299
+ items [ 3 ] . someProp = 'puppies' ;
300
+
301
+ // Affected by `Object.prototype`
302
+ expect ( filter ( items , { } ) . length ) . toBe ( 1 ) ;
303
+ expect ( filter ( items , { } ) [ 0 ] ) . toBe ( items [ 1 ] ) ;
168
304
169
- expect ( filter ( items , { text : 'hell' } ) . length ) . toBe ( 1 ) ;
170
- expect ( filter ( items , { text : 'hell' } ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
305
+ expect ( filter ( items , { $ : 'll' } ) . length ) . toBe ( 0 ) ;
171
306
172
- expect ( filter ( items , 'hell' ) . length ) . toBe ( 1 ) ;
173
- expect ( filter ( items , 'hell' ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
307
+ // Not affected by `Object.prototype`
308
+ expect ( filter ( items , 'll' ) . length ) . toBe ( 1 ) ;
309
+ expect ( filter ( items , 'll' ) [ 0 ] ) . toBe ( items [ 0 ] ) ;
174
310
175
- delete ( Object . prototype . noop ) ;
311
+ delete Object . prototype . someProp ;
176
312
} ) ;
177
313
178
314
0 commit comments