@@ -56,7 +56,7 @@ describe('navigating to state', function() {
56
56
} ) ; // with abstract = false
57
57
58
58
59
- describe ( "with abstract = true" , function ( ) {
59
+ describe ( "with abstract = true and no default " , function ( ) {
60
60
61
61
beforeEach ( mock . module ( function ( $stateProvider : ng . ui . IStateProvider ) {
62
62
$stateProvider
@@ -89,14 +89,44 @@ describe('navigating to state', function() {
89
89
} ) . toThrowError ( "Cannot transition to abstract state 'base.abstract'" ) ;
90
90
} ) ) ;
91
91
92
- } ) ; // with abstract = true
92
+ } ) ; // with abstract = true and no default
93
93
94
94
let members = [ "abstract" , "default" ] ;
95
95
96
96
for ( let member of members ) {
97
97
98
98
describe ( "abstract with " + member + " =" , ( ) => {
99
99
100
+ describe ( "INVALID_STATE" , function ( ) {
101
+ beforeEach ( mock . module ( function ( $stateProvider : ng . ui . IStateProvider ) {
102
+ $stateProvider . state ( 'base' , {
103
+ abstract : true ,
104
+ [ member ] : 'INVALID_STATE'
105
+ } ) ;
106
+ } ) ) ;
107
+
108
+ it ( "should throw an informative error" , mock . inject ( function ( $state : IStateService , $rootScope : ng . IRootScopeService ) {
109
+ expect ( function ( ) {
110
+ $state . go ( 'base' ) ; $rootScope . $digest ( ) ;
111
+ } ) . toThrowError ( / ^ C o u l d n o t r e s o l v e .* I N V A L I D _ S T A T E / ) ;
112
+ } ) ) ;
113
+ } ) ; // invalid
114
+
115
+ describe ( ".INVALID_STATE" , function ( ) {
116
+ beforeEach ( mock . module ( function ( $stateProvider : ng . ui . IStateProvider ) {
117
+ $stateProvider . state ( 'base' , {
118
+ abstract : true ,
119
+ [ member ] : '.INVALID_STATE'
120
+ } ) ;
121
+ } ) ) ;
122
+
123
+ it ( "should throw an informative error" , mock . inject ( function ( $state : IStateService , $rootScope : ng . IRootScopeService ) {
124
+ expect ( function ( ) {
125
+ $state . go ( 'base' ) ; $rootScope . $digest ( ) ;
126
+ } ) . toThrowError ( / ^ C o u l d n o t r e s o l v e .* \. I N V A L I D _ S T A T E / ) ;
127
+ } ) ) ;
128
+ } ) ; // .invalid
129
+
100
130
describe ( "'.child'" , function ( ) {
101
131
102
132
beforeEach ( mock . module ( function ( $stateProvider : ng . ui . IStateProvider ) {
@@ -199,7 +229,23 @@ describe('navigating to state', function() {
199
229
expect ( $state . current . name ) . toEqual ( 'base.abstract.child2' ) ;
200
230
} ) ) ;
201
231
202
- } ) ; // with abstract = function() { return ...; }
232
+ it ( "should throw an informative error for INVALID_STATE" , mock . inject ( function ( $state : IStateService , $rootScope : ng . IRootScopeService ) {
233
+ $state . go ( 'base' ) ; $rootScope . $digest ( ) ;
234
+ state = 'INVALID_STATE' ;
235
+ expect ( function ( ) {
236
+ $state . go ( 'base.abstract' ) ; $rootScope . $digest ( ) ;
237
+ } ) . toThrowError ( / ^ C o u l d n o t r e s o l v e .* I N V A L I D _ S T A T E / ) ;
238
+ } ) ) ;
239
+
240
+ it ( "should throw an informative error for .INVALID_STATE" , mock . inject ( function ( $state : IStateService , $rootScope : ng . IRootScopeService ) {
241
+ $state . go ( 'base' ) ; $rootScope . $digest ( ) ;
242
+ state = '.INVALID_STATE' ;
243
+ expect ( function ( ) {
244
+ $state . go ( 'base.abstract' ) ; $rootScope . $digest ( ) ;
245
+ } ) . toThrowError ( / ^ C o u l d n o t r e s o l v e .* \. I N V A L I D _ S T A T E / ) ;
246
+ } ) ) ;
247
+
248
+ } ) ; // () => state
203
249
204
250
describe ( "['$rootScope', function($rootScope) => $rootScope.state]" , function ( ) {
205
251
@@ -232,6 +278,22 @@ describe('navigating to state', function() {
232
278
expect ( $state . current . name ) . toEqual ( 'base.abstract.child2' ) ;
233
279
} ) ) ;
234
280
281
+ it ( "should throw an informative error for INVALID_STATE" , mock . inject ( function ( $state : IStateService , $rootScope : ng . IRootScopeService & StateScope ) {
282
+ $state . go ( 'base' ) ; $rootScope . $digest ( ) ;
283
+ $rootScope . state = 'INVALID_STATE' ;
284
+ expect ( function ( ) {
285
+ $state . go ( 'base.abstract' ) ; $rootScope . $digest ( ) ;
286
+ } ) . toThrowError ( / ^ C o u l d n o t r e s o l v e .* I N V A L I D _ S T A T E / ) ;
287
+ } ) ) ;
288
+
289
+ it ( "should throw an informative error for .INVALID_STATE" , mock . inject ( function ( $state : IStateService , $rootScope : ng . IRootScopeService & StateScope ) {
290
+ $state . go ( 'base' ) ; $rootScope . $digest ( ) ;
291
+ $rootScope . state = '.INVALID_STATE' ;
292
+ expect ( function ( ) {
293
+ $state . go ( 'base.abstract' ) ; $rootScope . $digest ( ) ;
294
+ } ) . toThrowError ( / ^ C o u l d n o t r e s o l v e .* \. I N V A L I D _ S T A T E / ) ;
295
+ } ) ) ;
296
+
235
297
} ) ; // with abstract = ['$rootScope', function($rootScope: ng.IRootScopeService) { return ...; }]
236
298
237
299
describe ( "() => IPromise<string> that resolves" , function ( ) {
@@ -241,18 +303,31 @@ describe('navigating to state', function() {
241
303
$stateProvider
242
304
. state ( 'base' , {
243
305
} )
306
+ . state ( 'base.child' , {
307
+ } )
244
308
. state ( 'base.abstract' , {
245
309
abstract : true ,
246
310
[ member ] : [ '$q' , '$rootScope' , function ( $q : ng . IQService , $rootScope : ng . IRootScopeService ) {
247
311
var defer = $q . defer ( ) ;
248
312
setTimeout ( function ( ) {
249
313
defer . resolve ( 'base.abstract.child' ) ;
250
314
$rootScope . $digest ( ) ;
251
- } ) ;
315
+ } , 5 ) ;
252
316
return defer . promise ;
253
317
} ]
254
318
} )
255
319
. state ( 'base.abstract.child' , {
320
+ abstract : true ,
321
+ [ member ] : [ '$q' , '$rootScope' , function ( $q : ng . IQService , $rootScope : ng . IRootScopeService ) {
322
+ var defer = $q . defer ( ) ;
323
+ setTimeout ( function ( ) {
324
+ defer . resolve ( '.grandchild' ) ;
325
+ $rootScope . $digest ( ) ;
326
+ } , 5 ) ;
327
+ return defer . promise ;
328
+ } ]
329
+ } )
330
+ . state ( 'base.abstract.child.grandchild' , {
256
331
} )
257
332
. state ( 'base.abstract2' , {
258
333
abstract : true ,
@@ -261,7 +336,7 @@ describe('navigating to state', function() {
261
336
setTimeout ( function ( ) {
262
337
defer . resolve ( 'base.abstract2.child' ) ;
263
338
$rootScope . $digest ( ) ;
264
- } ) ;
339
+ } , 1 ) ;
265
340
return defer . promise ;
266
341
} ]
267
342
} )
@@ -273,7 +348,24 @@ describe('navigating to state', function() {
273
348
mock . inject ( function ( $state : IStateService , $rootScope : ng . IRootScopeService ) {
274
349
$state . go ( 'base.abstract' )
275
350
. then ( function ( ) {
276
- expect ( $state . current . name ) . toBe ( 'base.abstract.child' ) ;
351
+ expect ( $state . current . name ) . toBe ( 'base.abstract.child.grandchild' ) ;
352
+ } )
353
+ . catch ( function ( ) {
354
+ throw new Error ( 'Should not be here' ) ;
355
+ } )
356
+ . finally ( done ) ;
357
+
358
+ $rootScope . $digest ( ) ;
359
+ } ) ;
360
+ } ) ;
361
+
362
+ it ( "should work for relative states" , function ( done ) {
363
+ mock . inject ( function ( $state : IStateService , $rootScope : ng . IRootScopeService ) {
364
+ $state . go ( 'base.child' ) ;
365
+ $rootScope . $digest ( ) ;
366
+ $state . go ( '^.abstract' )
367
+ . then ( function ( ) {
368
+ expect ( $state . current . name ) . toBe ( 'base.abstract.child.grandchild' ) ;
277
369
} )
278
370
. catch ( function ( ) {
279
371
throw new Error ( 'Should not be here' ) ;
@@ -336,7 +428,7 @@ describe('navigating to state', function() {
336
428
setTimeout ( function ( ) {
337
429
defer . reject ( 'This is a rejection' ) ;
338
430
$rootScope . $apply ( ) ;
339
- } ) ;
431
+ } , 5 ) ;
340
432
return defer . promise ;
341
433
} ]
342
434
} )
0 commit comments