@@ -211,29 +211,65 @@ describe("UrlMatcher", function () {
211
211
it ( "should conditionally be wrapped in an array by default" , inject ( function ( $location ) {
212
212
var m = new UrlMatcher ( '/foo?param1' ) ;
213
213
214
- expect ( m . exec ( "/foo" ) ) . toEqual ( { } ) ;
215
-
214
+ // empty array [] is treated like "undefined"
215
+ expect ( m . format ( { param1 : undefined } ) ) . toBe ( "/foo" ) ;
216
+ expect ( m . format ( { param1 : [ ] } ) ) . toBe ( "/foo" ) ;
217
+ expect ( m . format ( { param1 : "" } ) ) . toBe ( "/foo" ) ;
218
+ expect ( m . format ( { param1 : "1" } ) ) . toBe ( "/foo?param1=1" ) ;
219
+ expect ( m . format ( { param1 : [ "1" ] } ) ) . toBe ( "/foo?param1=1" ) ;
220
+ expect ( m . format ( { param1 : [ "1" , "2" ] } ) ) . toBe ( "/foo?param1=1¶m1=2" ) ;
221
+
222
+ expect ( m . exec ( "/foo" ) ) . toEqual ( { param1 : undefined } ) ;
223
+ expect ( m . exec ( "/foo" , { } ) ) . toEqual ( { param1 : undefined } ) ;
224
+ expect ( m . exec ( "/foo" , { param1 : "" } ) ) . toEqual ( { param1 : undefined } ) ;
225
+ expect ( m . exec ( "/foo" , { param1 : "1" } ) ) . toEqual ( { param1 : "1" } ) ; // auto unwrap single values
226
+ expect ( m . exec ( "/foo" , { param1 : [ "1" , "2" ] } ) ) . toEqual ( { param1 : [ "1" , "2" ] } ) ;
227
+
228
+ $location . url ( "/foo" ) ;
229
+ expect ( m . exec ( $location . path ( ) , $location . search ( ) ) ) . toEqual ( { param1 : undefined } ) ;
216
230
$location . url ( "/foo?param1=bar" ) ;
217
- expect ( m . exec ( $location . path ( ) , $location . search ( ) ) ) . toEqual ( { param1 : 'bar' } ) ;
218
- expect ( m . format ( { param1 : 'bar' } ) ) . toBe ( "/foo?param1=bar" ) ;
219
-
231
+ expect ( m . exec ( $location . path ( ) , $location . search ( ) ) ) . toEqual ( { param1 : 'bar' } ) ; // auto unwrap
220
232
$location . url ( "/foo?param1=bar¶m1=baz" ) ;
221
233
expect ( m . exec ( $location . path ( ) , $location . search ( ) ) ) . toEqual ( { param1 : [ 'bar' , 'baz' ] } ) ;
234
+
235
+ expect ( m . format ( { } ) ) . toBe ( "/foo" ) ;
236
+ expect ( m . format ( { param1 : undefined } ) ) . toBe ( "/foo" ) ;
237
+ expect ( m . format ( { param1 : "" } ) ) . toBe ( "/foo" ) ;
238
+ expect ( m . format ( { param1 : 'bar' } ) ) . toBe ( "/foo?param1=bar" ) ;
239
+ expect ( m . format ( { param1 : [ 'bar' ] } ) ) . toBe ( "/foo?param1=bar" ) ;
222
240
expect ( m . format ( { param1 : [ 'bar' , 'baz' ] } ) ) . toBe ( "/foo?param1=bar¶m1=baz" ) ;
241
+
223
242
} ) ) ;
224
243
225
244
it ( "should be wrapped in an array if array: true" , inject ( function ( $location ) {
226
245
var m = new UrlMatcher ( '/foo?param1' , { params : { param1 : { array : true } } } ) ;
227
246
228
- expect ( m . exec ( "/foo" ) ) . toEqual ( { } ) ;
229
-
247
+ // empty array [] is treated like "undefined"
248
+ expect ( m . format ( { param1 : undefined } ) ) . toBe ( "/foo" ) ;
249
+ expect ( m . format ( { param1 : [ ] } ) ) . toBe ( "/foo" ) ;
250
+ expect ( m . format ( { param1 : "" } ) ) . toBe ( "/foo" ) ;
251
+ expect ( m . format ( { param1 : "1" } ) ) . toBe ( "/foo?param1=1" ) ;
252
+ expect ( m . format ( { param1 : [ "1" ] } ) ) . toBe ( "/foo?param1=1" ) ;
253
+ expect ( m . format ( { param1 : [ "1" , "2" ] } ) ) . toBe ( "/foo?param1=1¶m1=2" ) ;
254
+
255
+ expect ( m . exec ( "/foo" ) ) . toEqual ( { param1 : undefined } ) ;
256
+ expect ( m . exec ( "/foo" , { } ) ) . toEqual ( { param1 : undefined } ) ;
257
+ expect ( m . exec ( "/foo" , { param1 : "" } ) ) . toEqual ( { param1 : undefined } ) ;
258
+ expect ( m . exec ( "/foo" , { param1 : "1" } ) ) . toEqual ( { param1 : [ "1" ] } ) ;
259
+ expect ( m . exec ( "/foo" , { param1 : [ "1" , "2" ] } ) ) . toEqual ( { param1 : [ "1" , "2" ] } ) ;
260
+
261
+ $location . url ( "/foo" ) ;
262
+ expect ( m . exec ( $location . path ( ) , $location . search ( ) ) ) . toEqual ( { param1 : undefined } ) ;
230
263
$location . url ( "/foo?param1=bar" ) ;
231
264
expect ( m . exec ( $location . path ( ) , $location . search ( ) ) ) . toEqual ( { param1 : [ 'bar' ] } ) ;
232
- expect ( m . format ( { param1 : 'bar' } ) ) . toBe ( "/foo?param1=bar" ) ;
233
- expect ( m . format ( { param1 : [ 'bar' ] } ) ) . toBe ( "/foo?param1=bar" ) ;
234
-
235
265
$location . url ( "/foo?param1=bar¶m1=baz" ) ;
236
266
expect ( m . exec ( $location . path ( ) , $location . search ( ) ) ) . toEqual ( { param1 : [ 'bar' , 'baz' ] } ) ;
267
+
268
+ expect ( m . format ( { } ) ) . toBe ( "/foo" ) ;
269
+ expect ( m . format ( { param1 : undefined } ) ) . toBe ( "/foo" ) ;
270
+ expect ( m . format ( { param1 : "" } ) ) . toBe ( "/foo" ) ;
271
+ expect ( m . format ( { param1 : 'bar' } ) ) . toBe ( "/foo?param1=bar" ) ;
272
+ expect ( m . format ( { param1 : [ 'bar' ] } ) ) . toBe ( "/foo?param1=bar" ) ;
237
273
expect ( m . format ( { param1 : [ 'bar' , 'baz' ] } ) ) . toBe ( "/foo?param1=bar¶m1=baz" ) ;
238
274
} ) ) ;
239
275
@@ -292,6 +328,36 @@ describe("UrlMatcher", function () {
292
328
expect ( m . format ( { param1 : [ 'bar' , 'baz' ] } ) ) . toEqual ( "/foo/bar-baz" ) ;
293
329
} ) ) ;
294
330
331
+ it ( "should behave similar to multi-value query params" , inject ( function ( $location ) {
332
+ var m = new UrlMatcher ( '/foo/:param1[]' ) ;
333
+
334
+ // empty array [] is treated like "undefined"
335
+ expect ( m . format ( { "param1[]" : undefined } ) ) . toBe ( "/foo/" ) ;
336
+ expect ( m . format ( { "param1[]" : [ ] } ) ) . toBe ( "/foo/" ) ;
337
+ expect ( m . format ( { "param1[]" : "" } ) ) . toBe ( "/foo/" ) ;
338
+ expect ( m . format ( { "param1[]" : "1" } ) ) . toBe ( "/foo/1" ) ;
339
+ expect ( m . format ( { "param1[]" : [ "1" ] } ) ) . toBe ( "/foo/1" ) ;
340
+ expect ( m . format ( { "param1[]" : [ "1" , "2" ] } ) ) . toBe ( "/foo/1-2" ) ;
341
+
342
+ expect ( m . exec ( "/foo/" ) ) . toEqual ( { "param1[]" : undefined } ) ;
343
+ expect ( m . exec ( "/foo/1" ) ) . toEqual ( { "param1[]" : [ "1" ] } ) ;
344
+ expect ( m . exec ( "/foo/1-2" ) ) . toEqual ( { "param1[]" : [ "1" , "2" ] } ) ;
345
+
346
+ $location . url ( "/foo/" ) ;
347
+ expect ( m . exec ( $location . path ( ) , $location . search ( ) ) ) . toEqual ( { "param1[]" : undefined } ) ;
348
+ $location . url ( "/foo/bar" ) ;
349
+ expect ( m . exec ( $location . path ( ) , $location . search ( ) ) ) . toEqual ( { "param1[]" : [ 'bar' ] } ) ;
350
+ $location . url ( "/foo/bar-baz" ) ;
351
+ expect ( m . exec ( $location . path ( ) , $location . search ( ) ) ) . toEqual ( { "param1[]" : [ 'bar' , 'baz' ] } ) ;
352
+
353
+ expect ( m . format ( { } ) ) . toBe ( "/foo/" ) ;
354
+ expect ( m . format ( { "param1[]" : undefined } ) ) . toBe ( "/foo/" ) ;
355
+ expect ( m . format ( { "param1[]" : "" } ) ) . toBe ( "/foo/" ) ;
356
+ expect ( m . format ( { "param1[]" : 'bar' } ) ) . toBe ( "/foo/bar" ) ;
357
+ expect ( m . format ( { "param1[]" : [ 'bar' ] } ) ) . toBe ( "/foo/bar" ) ;
358
+ expect ( m . format ( { "param1[]" : [ 'bar' , 'baz' ] } ) ) . toBe ( "/foo/bar-baz" ) ;
359
+ } ) ) ;
360
+
295
361
it ( "should be split on - in url and wrapped in an array if paramname looks like param[]" , inject ( function ( $location ) {
296
362
var m = new UrlMatcher ( '/foo/:param1[]' ) ;
297
363
0 commit comments