@@ -7,6 +7,7 @@ describe('Filter: filter', function() {
77 filter = $filter ( 'filter' ) ;
88 } ) ) ;
99
10+
1011 it ( 'should filter by string' , function ( ) {
1112 var items = [ 'MIsKO' , { name : 'shyam' } , [ 'adam' ] , 1234 ] ;
1213 expect ( filter ( items , '' ) . length ) . toBe ( 4 ) ;
@@ -27,13 +28,15 @@ describe('Filter: filter', function() {
2728 expect ( filter ( items , "I don't exist" ) . length ) . toBe ( 0 ) ;
2829 } ) ;
2930
31+
3032 it ( 'should not read $ properties' , function ( ) {
3133 expect ( '' . charAt ( 0 ) ) . toBe ( '' ) ; // assumption
3234
3335 var items = [ { $name : 'misko' } ] ;
3436 expect ( filter ( items , 'misko' ) . length ) . toBe ( 0 ) ;
3537 } ) ;
3638
39+
3740 it ( 'should filter on specific property' , function ( ) {
3841 var items = [ { ignore : 'a' , name : 'a' } , { ignore : 'a' , name : 'abc' } ] ;
3942 expect ( filter ( items , { } ) . length ) . toBe ( 2 ) ;
@@ -44,11 +47,13 @@ describe('Filter: filter', function() {
4447 expect ( filter ( items , { name : 'b' } ) [ 0 ] . name ) . toBe ( 'abc' ) ;
4548 } ) ;
4649
50+
4751 it ( 'should take function as predicate' , function ( ) {
4852 var items = [ { name : 'a' } , { name : 'abc' , done : true } ] ;
4953 expect ( filter ( items , function ( i ) { return i . done ; } ) . length ) . toBe ( 1 ) ;
5054 } ) ;
5155
56+
5257 it ( 'should pass the index to a function predicate' , function ( ) {
5358 var items = [ 0 , 1 , 2 , 3 ] ;
5459
@@ -59,6 +64,7 @@ describe('Filter: filter', function() {
5964 expect ( result ) . toEqual ( [ 0 , 2 ] ) ;
6065 } ) ;
6166
67+
6268 it ( 'should take object as predicate' , function ( ) {
6369 var items = [ { first : 'misko' , last : 'hevery' } ,
6470 { first : 'adam' , last : 'abrons' } ] ;
@@ -92,6 +98,18 @@ describe('Filter: filter', function() {
9298 } ) ;
9399
94100
101+ it ( 'should support deep expression objects with multiple properties' , function ( ) {
102+ var items = [ { person : { name : 'John' , email : 'john@example.com' } } ,
103+ { person : { name : 'Rita' , email : 'rita@example.com' } } ,
104+ { person : { name : 'Billy' , email : 'me@billy.com' } } ,
105+ { person : { name : 'Joan' , email : 'joan@example.net' } } ] ;
106+ var expr = { person : { name : 'Jo' , email : '!example.com' } } ;
107+
108+ expect ( filter ( items , expr ) . length ) . toBe ( 1 ) ;
109+ expect ( filter ( items , expr ) ) . toEqual ( [ items [ 3 ] ] ) ;
110+ } ) ;
111+
112+
95113 it ( 'should match any properties for given "$" property' , function ( ) {
96114 var items = [ { first : 'tom' , last : 'hevery' } ,
97115 { first : 'adam' , last : 'hevery' , alias : 'tom' , done : false } ,
@@ -103,24 +121,27 @@ describe('Filter: filter', function() {
103121 expect ( filter ( items , { $ : 'hevery' } ) [ 0 ] ) . toEqual ( items [ 0 ] ) ;
104122 } ) ;
105123
124+
106125 it ( 'should support boolean properties' , function ( ) {
107126 var items = [ { name : 'tom' , current : true } ,
108- { name : 'demi' , current : false } ,
109- { name : 'sofia' } ] ;
127+ { name : 'demi' , current : false } ,
128+ { name : 'sofia' } ] ;
110129
111130 expect ( filter ( items , { current :true } ) . length ) . toBe ( 1 ) ;
112131 expect ( filter ( items , { current :true } ) [ 0 ] . name ) . toBe ( 'tom' ) ;
113132 expect ( filter ( items , { current :false } ) . length ) . toBe ( 1 ) ;
114133 expect ( filter ( items , { current :false } ) [ 0 ] . name ) . toBe ( 'demi' ) ;
115134 } ) ;
116135
136+
117137 it ( 'should support negation operator' , function ( ) {
118138 var items = [ 'misko' , 'adam' ] ;
119139
120140 expect ( filter ( items , '!isk' ) . length ) . toBe ( 1 ) ;
121141 expect ( filter ( items , '!isk' ) [ 0 ] ) . toEqual ( items [ 1 ] ) ;
122142 } ) ;
123143
144+
124145 describe ( 'should support comparator' , function ( ) {
125146
126147 it ( 'as equality when true' , function ( ) {
@@ -133,8 +154,8 @@ describe('Filter: filter', function() {
133154 { key : 'value1' , nonkey : 1 } ,
134155 { key : 'value2' , nonkey : 2 } ,
135156 { key : 'value12' , nonkey : 3 } ,
136- { key : 'value1' , nonkey :4 } ,
137- { key : 'Value1' , nonkey :5 }
157+ { key : 'value1' , nonkey : 4 } ,
158+ { key : 'Value1' , nonkey : 5 }
138159 ] ;
139160 expr = { key : 'value1' } ;
140161 expect ( filter ( items , expr , true ) ) . toEqual ( [ items [ 0 ] , items [ 3 ] ] ) ;
@@ -143,21 +164,22 @@ describe('Filter: filter', function() {
143164 { key : 1 , nonkey : 1 } ,
144165 { key : 2 , nonkey : 2 } ,
145166 { key : 12 , nonkey : 3 } ,
146- { key : 1 , nonkey :4 }
167+ { key : 1 , nonkey : 4 }
147168 ] ;
148- expr = { key : 1 } ;
169+ expr = { key : 1 } ;
149170 expect ( filter ( items , expr , true ) ) . toEqual ( [ items [ 0 ] , items [ 3 ] ] ) ;
150171
151172 expr = 12 ;
152173 expect ( filter ( items , expr , true ) ) . toEqual ( [ items [ 2 ] ] ) ;
153174 } ) ;
154175
176+
155177 it ( 'and use the function given to compare values' , function ( ) {
156178 var items = [
157179 { key : 1 , nonkey : 1 } ,
158180 { key : 2 , nonkey : 2 } ,
159181 { key : 12 , nonkey : 3 } ,
160- { key : 1 , nonkey :14 }
182+ { key : 1 , nonkey : 14 }
161183 ] ;
162184 var expr = { key : 10 } ;
163185 var comparator = function ( obj , value ) {
@@ -167,10 +189,47 @@ describe('Filter: filter', function() {
167189
168190 expr = 10 ;
169191 expect ( filter ( items , expr , comparator ) ) . toEqual ( [ items [ 2 ] , items [ 3 ] ] ) ;
170-
171192 } ) ;
172193
173194
174- } ) ;
195+ it ( 'and use it correctly with deep expression objects' , function ( ) {
196+ var items = [
197+ { id : 0 , details : { email : 'admin@example.com' , role : 'admin' } } ,
198+ { id : 1 , details : { email : 'user1@example.com' , role : 'user' } } ,
199+ { id : 2 , details : { email : 'user2@example.com' , role : 'user' } }
200+ ] ;
201+ var expr , comp ;
202+
203+ expr = { details : { email : 'user@example.com' , role : 'adm' } } ;
204+ expect ( filter ( items , expr ) ) . toEqual ( [ ] ) ;
205+
206+ expr = { details : { email : 'admin@example.com' , role : 'adm' } } ;
207+ expect ( filter ( items , expr ) ) . toEqual ( [ items [ 0 ] ] ) ;
208+
209+ expr = { details : { email : 'admin@example.com' , role : 'adm' } } ;
210+ expect ( filter ( items , expr , true ) ) . toEqual ( [ ] ) ;
211+
212+ expr = { details : { email : 'admin@example.com' , role : 'admin' } } ;
213+ expect ( filter ( items , expr , true ) ) . toEqual ( [ items [ 0 ] ] ) ;
214+
215+ expr = { details : { email : 'user' , role : 'us' } } ;
216+ expect ( filter ( items , expr ) ) . toEqual ( [ items [ 1 ] , items [ 2 ] ] ) ;
175217
218+ expr = { id : 0 , details : { email : 'user' , role : 'us' } } ;
219+ expect ( filter ( items , expr ) ) . toEqual ( [ ] ) ;
220+
221+ expr = { id : 1 , details : { email : 'user' , role : 'us' } } ;
222+ expect ( filter ( items , expr ) ) . toEqual ( [ items [ 1 ] ] ) ;
223+
224+ comp = function ( actual , expected ) {
225+ return isString ( actual ) && isString ( expected ) && ( actual . indexOf ( expected ) === 0 ) ;
226+ } ;
227+
228+ expr = { details : { email : 'admin@example.com' , role : 'admn' } } ;
229+ expect ( filter ( items , expr , comp ) ) . toEqual ( [ ] ) ;
230+
231+ expr = { details : { email : 'admin@example.com' , role : 'adm' } } ;
232+ expect ( filter ( items , expr , comp ) ) . toEqual ( [ items [ 0 ] ] ) ;
233+ } ) ;
234+ } ) ;
176235} ) ;
0 commit comments