@@ -19,28 +19,111 @@ import {recognize} from 'angular2/src/alt_router/recognize';
1919import { Routes , Route } from 'angular2/alt_router' ;
2020import { provide , Component , ComponentResolver } from 'angular2/core' ;
2121import { UrlSegment , Tree } from 'angular2/src/alt_router/segments' ;
22+ import { DefaultRouterUrlParser } from 'angular2/src/alt_router/router_url_parser' ;
23+ import { DEFAULT_OUTLET_NAME } from 'angular2/src/alt_router/constants' ;
2224
2325export function main ( ) {
2426 describe ( 'recognize' , ( ) => {
2527 it ( 'should handle position args' ,
2628 inject ( [ AsyncTestCompleter , ComponentResolver ] , ( async , resolver ) => {
27- recognize ( resolver , ComponentA , tree ( [ "b" , " paramB" , "c" , " paramC" ] ) )
29+ recognize ( resolver , ComponentA , tree ( "b/ paramB/c/ paramC/d" ) )
2830 . then ( r => {
29- let b = r . root ;
31+ let a = r . root ;
32+ expect ( stringifyUrl ( a . urlSegments ) ) . toEqual ( [ "" ] ) ;
33+ expect ( a . type ) . toBe ( ComponentA ) ;
34+
35+ let b = r . firstChild ( r . root ) ;
3036 expect ( stringifyUrl ( b . urlSegments ) ) . toEqual ( [ "b" , "paramB" ] ) ;
3137 expect ( b . type ) . toBe ( ComponentB ) ;
3238
33- let c = r . firstChild ( r . root ) ;
39+ let c = r . firstChild ( r . firstChild ( r . root ) ) ;
3440 expect ( stringifyUrl ( c . urlSegments ) ) . toEqual ( [ "c" , "paramC" ] ) ;
3541 expect ( c . type ) . toBe ( ComponentC ) ;
3642
43+ let d = r . firstChild ( r . firstChild ( r . firstChild ( r . root ) ) ) ;
44+ expect ( stringifyUrl ( d . urlSegments ) ) . toEqual ( [ "d" ] ) ;
45+ expect ( d . type ) . toBe ( ComponentD ) ;
46+
47+ async . done ( ) ;
48+ } ) ;
49+ } ) ) ;
50+
51+ it ( 'should handle aux routes' ,
52+ inject ( [ AsyncTestCompleter , ComponentResolver ] , ( async , resolver ) => {
53+ recognize ( resolver , ComponentA , tree ( "b/paramB(/d//right:d)" ) )
54+ . then ( r => {
55+ let c = r . children ( r . root ) ;
56+ expect ( stringifyUrl ( c [ 0 ] . urlSegments ) ) . toEqual ( [ "b" , "paramB" ] ) ;
57+ expect ( c [ 0 ] . outlet ) . toEqual ( DEFAULT_OUTLET_NAME ) ;
58+ expect ( c [ 0 ] . type ) . toBe ( ComponentB ) ;
59+
60+ expect ( stringifyUrl ( c [ 1 ] . urlSegments ) ) . toEqual ( [ "d" ] ) ;
61+ expect ( c [ 1 ] . outlet ) . toEqual ( "aux" ) ;
62+ expect ( c [ 1 ] . type ) . toBe ( ComponentD ) ;
63+
64+ expect ( stringifyUrl ( c [ 2 ] . urlSegments ) ) . toEqual ( [ "d" ] ) ;
65+ expect ( c [ 2 ] . outlet ) . toEqual ( "right" ) ;
66+ expect ( c [ 2 ] . type ) . toBe ( ComponentD ) ;
67+
68+ async . done ( ) ;
69+ } ) ;
70+ } ) ) ;
71+
72+ it ( "should error when two segments with the same outlet name" ,
73+ inject ( [ AsyncTestCompleter , ComponentResolver ] , ( async , resolver ) => {
74+ recognize ( resolver , ComponentA , tree ( "b/paramB(right:d//right:e)" ) )
75+ . catch ( e => {
76+ expect ( e . message ) . toEqual (
77+ "Two segments cannot have the same outlet name: 'right:d' and 'right:e'." ) ;
78+ async . done ( ) ;
79+ } ) ;
80+ } ) ) ;
81+
82+ it ( 'should handle nested aux routes' ,
83+ inject ( [ AsyncTestCompleter , ComponentResolver ] , ( async , resolver ) => {
84+ recognize ( resolver , ComponentA , tree ( "b/paramB(/d(right:e))" ) )
85+ . then ( r => {
86+ let c = r . children ( r . root ) ;
87+ expect ( stringifyUrl ( c [ 0 ] . urlSegments ) ) . toEqual ( [ "b" , "paramB" ] ) ;
88+ expect ( c [ 0 ] . outlet ) . toEqual ( DEFAULT_OUTLET_NAME ) ;
89+ expect ( c [ 0 ] . type ) . toBe ( ComponentB ) ;
90+
91+ expect ( stringifyUrl ( c [ 1 ] . urlSegments ) ) . toEqual ( [ "d" ] ) ;
92+ expect ( c [ 1 ] . outlet ) . toEqual ( "aux" ) ;
93+ expect ( c [ 1 ] . type ) . toBe ( ComponentD ) ;
94+
95+ expect ( stringifyUrl ( c [ 2 ] . urlSegments ) ) . toEqual ( [ "e" ] ) ;
96+ expect ( c [ 2 ] . outlet ) . toEqual ( "right" ) ;
97+ expect ( c [ 2 ] . type ) . toBe ( ComponentE ) ;
98+
99+ async . done ( ) ;
100+ } ) ;
101+ } ) ) ;
102+
103+ it ( 'should handle matrix parameters' ,
104+ inject ( [ AsyncTestCompleter , ComponentResolver ] , ( async , resolver ) => {
105+ recognize ( resolver , ComponentA , tree ( "b/paramB;b1=1;b2=2(/d;d1=1;d2=2)" ) )
106+ . then ( r => {
107+ let c = r . children ( r . root ) ;
108+ expect ( c [ 0 ] . parameters ) . toEqual ( { 'b' : 'paramB' , 'b1' : '1' , 'b2' : '2' } ) ;
109+ expect ( c [ 1 ] . parameters ) . toEqual ( { 'd1' : '1' , 'd2' : '2' } ) ;
110+
37111 async . done ( ) ;
38112 } ) ;
39113 } ) ) ;
40114
41115 it ( 'should error when no matching routes' ,
42116 inject ( [ AsyncTestCompleter , ComponentResolver ] , ( async , resolver ) => {
43- recognize ( resolver , ComponentA , tree ( [ "invalid" ] ) )
117+ recognize ( resolver , ComponentA , tree ( "invalid" ) )
118+ . catch ( e => {
119+ expect ( e . message ) . toEqual ( "Cannot match any routes" ) ;
120+ async . done ( ) ;
121+ } ) ;
122+ } ) ) ;
123+
124+ it ( 'should handle no matching routes (too short)' ,
125+ inject ( [ AsyncTestCompleter , ComponentResolver ] , ( async , resolver ) => {
126+ recognize ( resolver , ComponentA , tree ( "b" ) )
44127 . catch ( e => {
45128 expect ( e . message ) . toEqual ( "Cannot match any routes" ) ;
46129 async . done ( ) ;
@@ -49,7 +132,7 @@ export function main() {
49132
50133 it ( "should error when a component doesn't have @Routes" ,
51134 inject ( [ AsyncTestCompleter , ComponentResolver ] , ( async , resolver ) => {
52- recognize ( resolver , ComponentA , tree ( [ "d" , " invalid"] ) )
135+ recognize ( resolver , ComponentA , tree ( "d/ invalid") )
53136 . catch ( e => {
54137 expect ( e . message )
55138 . toEqual ( "Component 'ComponentD' does not have route configuration" ) ;
@@ -59,22 +142,27 @@ export function main() {
59142 } ) ;
60143}
61144
62- function tree ( nodes : string [ ] ) {
63- return new Tree < UrlSegment > ( nodes . map ( v => new UrlSegment ( v , { } , "" ) ) ) ;
145+ function tree ( url : string ) : Tree < UrlSegment > {
146+ return new DefaultRouterUrlParser ( ) . parse ( url ) ;
64147}
65148
66149function stringifyUrl ( segments : UrlSegment [ ] ) : string [ ] {
67150 return segments . map ( s => s . segment ) ;
68151}
69152
70- @Component ( { selector : 'c' , template : 't' } )
71- class ComponentC {
72- }
73-
74153@Component ( { selector : 'd' , template : 't' } )
75154class ComponentD {
76155}
77156
157+ @Component ( { selector : 'e' , template : 't' } )
158+ class ComponentE {
159+ }
160+
161+ @Component ( { selector : 'c' , template : 't' } )
162+ @Routes ( [ new Route ( { path : "d" , component : ComponentD } ) ] )
163+ class ComponentC {
164+ }
165+
78166@Component ( { selector : 'b' , template : 't' } )
79167@Routes ( [ new Route ( { path : "c/:c" , component : ComponentC } ) ] )
80168class ComponentB {
@@ -83,7 +171,8 @@ class ComponentB {
83171@Component ( { selector : 'a' , template : 't' } )
84172@Routes ( [
85173 new Route ( { path : "b/:b" , component : ComponentB } ) ,
86- new Route ( { path : "d" , component : ComponentD } )
174+ new Route ( { path : "d" , component : ComponentD } ) ,
175+ new Route ( { path : "e" , component : ComponentE } )
87176] )
88177class ComponentA {
89178}
0 commit comments