@@ -19,6 +19,7 @@ import {
1919
2020import { NumberWrapper } from 'angular2/src/core/facade/lang' ;
2121import { PromiseWrapper } from 'angular2/src/core/facade/async' ;
22+ import { ListWrapper } from 'angular2/src/core/facade/collection' ;
2223
2324import { provide , Component , DirectiveResolver , View } from 'angular2/core' ;
2425
@@ -133,6 +134,58 @@ export function main() {
133134 } ) ;
134135 } ) ) ;
135136
137+ it ( 'should generate link hrefs from a child to its sibling with no leading slash' ,
138+ inject ( [ AsyncTestCompleter ] , ( async ) => {
139+ compile ( )
140+ . then ( ( _ ) => router . config ( [
141+ new Route ( { path : '/page/:number' , component : NoPrefixSiblingPageCmp , as : 'Page' } )
142+ ] ) )
143+ . then ( ( _ ) => router . navigateByUrl ( '/page/1' ) )
144+ . then ( ( _ ) => {
145+ rootTC . detectChanges ( ) ;
146+ expect ( DOM . getAttribute ( rootTC . debugElement . componentViewChildren [ 1 ]
147+ . componentViewChildren [ 0 ]
148+ . nativeElement ,
149+ 'href' ) )
150+ . toEqual ( '/page/2' ) ;
151+ async . done ( ) ;
152+ } ) ;
153+ } ) ) ;
154+
155+ it ( 'should generate link hrefs to a child with no leading slash' ,
156+ inject ( [ AsyncTestCompleter ] , ( async ) => {
157+ compile ( )
158+ . then ( ( _ ) => router . config ( [
159+ new Route ( { path : '/book/:title/...' , component : NoPrefixBookCmp , as : 'Book' } )
160+ ] ) )
161+ . then ( ( _ ) => router . navigateByUrl ( '/book/1984/page/1' ) )
162+ . then ( ( _ ) => {
163+ rootTC . detectChanges ( ) ;
164+ expect ( DOM . getAttribute ( rootTC . debugElement . componentViewChildren [ 1 ]
165+ . componentViewChildren [ 0 ]
166+ . nativeElement ,
167+ 'href' ) )
168+ . toEqual ( '/book/1984/page/100' ) ;
169+ async . done ( ) ;
170+ } ) ;
171+ } ) ) ;
172+
173+ it ( 'should throw when links without a leading slash are ambiguous' ,
174+ inject ( [ AsyncTestCompleter ] , ( async ) => {
175+ compile ( )
176+ . then ( ( _ ) => router . config ( [
177+ new Route ( { path : '/book/:title/...' , component : AmbiguousBookCmp , as : 'Book' } )
178+ ] ) )
179+ . then ( ( _ ) => router . navigateByUrl ( '/book/1984/page/1' ) )
180+ . then ( ( _ ) => {
181+ var link = ListWrapper . toJSON ( [ 'Book' , { number : 100 } ] ) ;
182+ expect ( ( ) => rootTC . detectChanges ( ) )
183+ . toThrowErrorWith (
184+ `Link "${ link } " is ambiguous, use "./" or "../" to disambiguate.` ) ;
185+ async . done ( ) ;
186+ } ) ;
187+ } ) ) ;
188+
136189 it ( 'should generate link hrefs when asynchronously loaded' ,
137190 inject ( [ AsyncTestCompleter ] , ( async ) => {
138191 compile ( )
@@ -337,6 +390,21 @@ class SiblingPageCmp {
337390 }
338391}
339392
393+ @Component ( { selector : 'page-cmp' } )
394+ @View ( {
395+ template :
396+ `page #{{pageNumber}} | <a href="hello" [router-link]="[\'Page\', {number: nextPage}]">next</a>` ,
397+ directives : [ RouterLink ]
398+ } )
399+ class NoPrefixSiblingPageCmp {
400+ pageNumber : number ;
401+ nextPage : number ;
402+ constructor ( params : RouteParams ) {
403+ this . pageNumber = NumberWrapper . parseInt ( params . get ( 'number' ) , 10 ) ;
404+ this . nextPage = this . pageNumber + 1 ;
405+ }
406+ }
407+
340408@Component ( { selector : 'hello-cmp' } )
341409@View ( { template : 'hello' } )
342410class HelloCmp {
@@ -377,3 +445,27 @@ class BookCmp {
377445 title : string ;
378446 constructor ( params : RouteParams ) { this . title = params . get ( 'title' ) ; }
379447}
448+
449+ @Component ( { selector : 'book-cmp' } )
450+ @View ( {
451+ template : `<a href="hello" [router-link]="[\'Page\', {number: 100}]">{{title}}</a> |
452+ <router-outlet></router-outlet>` ,
453+ directives : ROUTER_DIRECTIVES
454+ } )
455+ @RouteConfig ( [ new Route ( { path : '/page/:number' , component : SiblingPageCmp , as : 'Page' } ) ] )
456+ class NoPrefixBookCmp {
457+ title : string ;
458+ constructor ( params : RouteParams ) { this . title = params . get ( 'title' ) ; }
459+ }
460+
461+ @Component ( { selector : 'book-cmp' } )
462+ @View ( {
463+ template : `<a href="hello" [router-link]="[\'Book\', {number: 100}]">{{title}}</a> |
464+ <router-outlet></router-outlet>` ,
465+ directives : ROUTER_DIRECTIVES
466+ } )
467+ @RouteConfig ( [ new Route ( { path : '/page/:number' , component : SiblingPageCmp , as : 'Book' } ) ] )
468+ class AmbiguousBookCmp {
469+ title : string ;
470+ constructor ( params : RouteParams ) { this . title = params . get ( 'title' ) ; }
471+ }
0 commit comments