73 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {DefaultUrlSerializer} from '../src/url_serializer';
 | |
| import {UrlTree} from '../src/url_tree';
 | |
| import {Params, PRIMARY_OUTLET} from '../src/shared';
 | |
| import {ActivatedRoute, ActivatedRouteCandidate, RouterStateCandidate, createEmptyStateCandidate, createEmptyState} from '../src/router_state';
 | |
| import {createRouterState} from '../src/create_router_state';
 | |
| import {recognize} from '../src/recognize';
 | |
| import {RouterConfig} from '../src/config';
 | |
| 
 | |
| describe('create router state', () => {
 | |
|   const emptyCandidate = () => createEmptyStateCandidate(RootComponent);
 | |
|   const emptyState = () => createEmptyState(RootComponent);
 | |
| 
 | |
|   it('should work create new state', () => {
 | |
|     const state = createRouterState(createState([
 | |
|       {path: 'a', component: ComponentA},
 | |
|       {path: 'b', component: ComponentB, outlet: 'left'},
 | |
|       {path: 'c', component: ComponentC, outlet: 'right'}
 | |
|     ], "a(left:b//right:c)"), emptyCandidate(), emptyState());
 | |
| 
 | |
|     checkActivatedRoute(state.root, RootComponent);
 | |
| 
 | |
|     const c = state.children(state.root);
 | |
|     checkActivatedRoute(c[0], ComponentA);
 | |
|     checkActivatedRoute(c[1], ComponentB, 'left');
 | |
|     checkActivatedRoute(c[2], ComponentC, 'right');
 | |
|   });
 | |
| 
 | |
|   it('should reuse existing nodes when it can', () => {
 | |
|     const config = [
 | |
|       {path: 'a', component: ComponentA},
 | |
|       {path: 'b', component: ComponentB, outlet: 'left'},
 | |
|       {path: 'c', component: ComponentC, outlet: 'left'}
 | |
|     ];
 | |
| 
 | |
|     const prevCandidate = createState(config, "a(left:b)");
 | |
|     const prevState = createRouterState(prevCandidate, emptyCandidate(), emptyState());
 | |
| 
 | |
|     const state = createRouterState(createState(config, "a(left:c)"), prevCandidate, prevState);
 | |
| 
 | |
|     expect(prevState.root).toBe(state.root);
 | |
|     const prevC = prevState.children(prevState.root);
 | |
|     const currC = state.children(state.root);
 | |
| 
 | |
|     expect(prevC[0]).toBe(currC[0]);
 | |
|     expect(prevC[1]).not.toBe(currC[1]);
 | |
|     checkActivatedRoute(currC[1], ComponentC, 'left');
 | |
|   });
 | |
| });
 | |
| 
 | |
| function createState(config: RouterConfig, url: string): RouterStateCandidate {
 | |
|   let res;
 | |
|   recognize(RootComponent, config, tree(url)).forEach(s => res = s);
 | |
|   return res;
 | |
| }
 | |
| 
 | |
| function checkActivatedRoute(actual: ActivatedRoute | null, cmp: Function, outlet: string = PRIMARY_OUTLET):void {
 | |
|   if (actual === null) {
 | |
|     expect(actual).toBeDefined();
 | |
|   } else {
 | |
|     expect(actual.component).toBe(cmp);
 | |
|     expect(actual.outlet).toEqual(outlet);
 | |
|   }
 | |
| }
 | |
| 
 | |
| function tree(url: string): UrlTree {
 | |
|   return new DefaultUrlSerializer().parse(url);
 | |
| }
 | |
| 
 | |
| class RootComponent {}
 | |
| class ComponentA {}
 | |
| class ComponentB {}
 | |
| class ComponentC {}
 |