@@ -105,6 +105,8 @@ describe('state', function () {
105
105
url : "/bad2/{param:[0-9]{5}}"
106
106
} )
107
107
108
+ . state ( 'json' , { url : '/jsonstate/{param:json}' } )
109
+
108
110
. state ( 'first' , { url : '^/first/subpath' } )
109
111
. state ( 'second' , { url : '^/second' } )
110
112
@@ -268,13 +270,13 @@ describe('state', function () {
268
270
} ) ) ;
269
271
270
272
it ( 'can lazy-define a state in $stateNotFound' , inject ( function ( $state , $q , $rootScope ) {
271
- initStateTo ( DD , { x : 1 , y : 2 , z : 3 } ) ;
273
+ initStateTo ( DD , { x : "1" , y : "2" , z : "3" } ) ;
272
274
var called ;
273
275
$rootScope . $on ( '$stateNotFound' , function ( ev , redirect ) {
274
276
stateProvider . state ( redirect . to , { parent : DD , params : { x : { } , y : { } , z : { } , w : { } } } ) ;
275
277
called = true ;
276
278
} ) ;
277
- var promise = $state . go ( 'DDD' , { w : 4 } ) ;
279
+ var promise = $state . go ( 'DDD' , { w : "4" } ) ;
278
280
$q . flush ( ) ;
279
281
expect ( called ) . toBeTruthy ( ) ;
280
282
expect ( $state . current . name ) . toEqual ( 'DDD' ) ;
@@ -289,7 +291,7 @@ describe('state', function () {
289
291
ev . retry = deferred . promise ;
290
292
called = true ;
291
293
} ) ;
292
- var promise = $state . go ( 'AA' , { a : 1 } ) ;
294
+ var promise = $state . go ( 'AA' , { a : "1" } ) ;
293
295
stateProvider . state ( 'AA' , { parent : A , params : { a : { } } } ) ;
294
296
deferred . resolve ( ) ;
295
297
$q . flush ( ) ;
@@ -780,6 +782,7 @@ describe('state', function () {
780
782
'home' ,
781
783
'home.item' ,
782
784
'home.redirect' ,
785
+ 'json' ,
783
786
'resolveFail' ,
784
787
'resolveTimeout' ,
785
788
'root' ,
@@ -819,6 +822,18 @@ describe('state', function () {
819
822
expect ( stateParams ) . toEqual ( { param : "100" } ) ;
820
823
} ) ) ;
821
824
825
+ it ( "should allow null default value for non-url params" , inject ( function ( $state , $q ) {
826
+ $state . go ( "D" ) ; $q . flush ( ) ;
827
+ expect ( $state . current . name ) . toBe ( "D" ) ;
828
+ expect ( $state . params ) . toEqual ( { x : null , y : null } ) ;
829
+ } ) ) ;
830
+
831
+ it ( "should allow arbitrary objects to pass for non-url params" , inject ( function ( $state , $q ) {
832
+ $state . go ( "D" , { x : 100 , y : { foo : 'bar' } } ) ; $q . flush ( ) ;
833
+ expect ( $state . current . name ) . toBe ( "D" ) ;
834
+ expect ( $state . params ) . toEqual ( { x : 100 , y : { foo : 'bar' } } ) ;
835
+ } ) ) ;
836
+
822
837
it ( "should be populated during primary transition, if unspecified" , inject ( function ( $state , $q ) {
823
838
var count = 0 ;
824
839
$state . get ( "OPT" ) . onEnter = function ( $stateParams ) { count ++ ; } ;
@@ -911,6 +926,24 @@ describe('state', function () {
911
926
} ) ) ;
912
927
913
928
describe ( "typed parameter handling" , function ( ) {
929
+ beforeEach ( function ( ) {
930
+ stateProvider . state ( {
931
+ name : "types" ,
932
+ url : "/types/{p1:string}/{p2:date}" ,
933
+ params : {
934
+ p1 : { value : [ "defaultValue" ] , array : true } ,
935
+ p2 : new Date ( 2014 , 10 , 15 ) ,
936
+ nonurl : null
937
+ }
938
+ } ) ;
939
+ stateProvider . state ( {
940
+ name : "types.substate" ,
941
+ url : "/sub/{p3[]:int}/{p4:json}?{p5:bool}" ,
942
+ params : {
943
+ "p3[]" : [ 10 ]
944
+ }
945
+ } ) ;
946
+ } ) ;
914
947
915
948
it ( 'should initialize parameters without a hacky empty test' , inject ( function ( $urlMatcherFactory , $state ) {
916
949
new UrlMatcher ( "" ) ;
@@ -954,6 +987,45 @@ describe('state', function () {
954
987
$rootScope . $apply ( ) ;
955
988
expect ( $state . current . name ) . toBe ( "about" ) ;
956
989
} ) ) ;
990
+
991
+ function expectStateUrlMappingFn ( $state , $rootScope , $q , $location ) {
992
+ return function ( state , url , params , defaults , nonurlparams ) {
993
+ $state . go ( state , extend ( { } , nonurlparams , params ) ) ;
994
+ $q . flush ( ) ;
995
+
996
+ expect ( $state . current . name ) . toBe ( state . name || state ) ; // allow object
997
+ expect ( $state . params ) . toEqual ( extend ( { } , defaults , params , nonurlparams ) ) ;
998
+ expect ( $location . url ( ) ) . toBe ( url ) ;
999
+
1000
+ initStateTo ( A ) ;
1001
+
1002
+ $location . url ( url ) ;
1003
+ $rootScope . $broadcast ( "$locationChangeSuccess" ) ;
1004
+ $q . flush ( ) ;
1005
+
1006
+ expect ( $state . current . name ) . toBe ( state . name || state ) ; // allow object
1007
+ expect ( $state . params ) . toEqual ( extend ( { } , defaults , params ) ) ;
1008
+ expect ( $location . url ( ) ) . toBe ( url ) ;
1009
+ }
1010
+ }
1011
+
1012
+ it ( 'should map to/from the $location.url() and $stateParams' , inject ( function ( $state , $location , $q , $rootScope ) {
1013
+ var nov15 = new Date ( 2014 , 10 , 15 ) ;
1014
+ var defaults = { p1 : [ 'defaultValue' ] , p2 : nov15 , nonurl : null } ;
1015
+ var params = { p1 : [ "foo" ] , p2 : nov15 } ;
1016
+ var nonurl = { nonurl : { foo : 'bar' } } ;
1017
+
1018
+ var check = expectStateUrlMappingFn ( $state , $rootScope , $q , $location ) ;
1019
+ check ( 'types' , '/types/defaultValue/2014-11-15' , { } , defaults ) ;
1020
+ check ( 'types' , "/types/foo/2014-11-15" , params , defaults , nonurl ) ;
1021
+
1022
+ extend ( defaults , { "p3[]" : [ 10 ] } ) ;
1023
+ extend ( params , { p4 : { baz : "qux" } } ) ;
1024
+ check ( 'types.substate' , "/types/foo/2014-11-15/sub/10/%7B%22baz%22:%22qux%22%7D" , params , defaults , nonurl ) ;
1025
+
1026
+ extend ( params , { p5 : true } ) ;
1027
+ check ( 'types.substate' , "/types/foo/2014-11-15/sub/10/%7B%22baz%22:%22qux%22%7D?p5=1" , params , defaults , nonurl ) ;
1028
+ } ) ) ;
957
1029
} ) ;
958
1030
959
1031
it ( 'should revert to last known working url on state change failure' , inject ( function ( $state , $rootScope , $location , $q ) {
0 commit comments