| 
									
										
										
										
											2016-08-02 14:34:00 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-31 13:11:36 -07:00
										 |  |  | import {BehaviorSubject} from 'rxjs/BehaviorSubject'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {ActivatedRoute, ActivatedRouteSnapshot, RouterState, RouterStateSnapshot, advanceActivatedRoute, equalParamsAndUrlSegments} from '../src/router_state'; | 
					
						
							| 
									
										
										
										
											2016-10-28 15:17:00 -07:00
										 |  |  | import {Params} from '../src/shared'; | 
					
						
							|  |  |  | import {UrlSegment} from '../src/url_tree'; | 
					
						
							| 
									
										
										
										
											2016-08-02 14:34:00 -07:00
										 |  |  | import {TreeNode} from '../src/utils/tree'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('RouterState & Snapshot', () => { | 
					
						
							|  |  |  |   describe('RouterStateSnapshot', () => { | 
					
						
							|  |  |  |     let state: RouterStateSnapshot; | 
					
						
							|  |  |  |     let a: ActivatedRouteSnapshot; | 
					
						
							|  |  |  |     let b: ActivatedRouteSnapshot; | 
					
						
							|  |  |  |     let c: ActivatedRouteSnapshot; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     beforeEach(() => { | 
					
						
							|  |  |  |       a = createActivatedRouteSnapshot('a'); | 
					
						
							|  |  |  |       b = createActivatedRouteSnapshot('b'); | 
					
						
							|  |  |  |       c = createActivatedRouteSnapshot('c'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const root = new TreeNode(a, [new TreeNode(b, []), new TreeNode(c, [])]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 15:31:56 -07:00
										 |  |  |       state = new RouterStateSnapshot('url', root); | 
					
						
							| 
									
										
										
										
											2016-08-02 14:34:00 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return first child', () => { expect(state.root.firstChild).toBe(b); }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return children', () => { | 
					
						
							|  |  |  |       const cc = state.root.children; | 
					
						
							|  |  |  |       expect(cc[0]).toBe(b); | 
					
						
							|  |  |  |       expect(cc[1]).toBe(c); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return root', () => { | 
					
						
							| 
									
										
										
										
											2017-04-17 11:13:13 -07:00
										 |  |  |       const b = state.root.firstChild !; | 
					
						
							| 
									
										
										
										
											2016-08-07 20:09:04 -07:00
										 |  |  |       expect(b.root).toBe(state.root); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return parent', () => { | 
					
						
							| 
									
										
										
										
											2017-04-17 11:13:13 -07:00
										 |  |  |       const b = state.root.firstChild !; | 
					
						
							| 
									
										
										
										
											2016-08-02 14:34:00 -07:00
										 |  |  |       expect(b.parent).toBe(state.root); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return path from root', () => { | 
					
						
							| 
									
										
										
										
											2017-04-17 11:13:13 -07:00
										 |  |  |       const b = state.root.firstChild !; | 
					
						
							| 
									
										
										
										
											2016-08-02 14:34:00 -07:00
										 |  |  |       const p = b.pathFromRoot; | 
					
						
							|  |  |  |       expect(p[0]).toBe(state.root); | 
					
						
							|  |  |  |       expect(p[1]).toBe(b); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('RouterState', () => { | 
					
						
							|  |  |  |     let state: RouterState; | 
					
						
							|  |  |  |     let a: ActivatedRoute; | 
					
						
							|  |  |  |     let b: ActivatedRoute; | 
					
						
							|  |  |  |     let c: ActivatedRoute; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     beforeEach(() => { | 
					
						
							|  |  |  |       a = createActivatedRoute('a'); | 
					
						
							|  |  |  |       b = createActivatedRoute('b'); | 
					
						
							|  |  |  |       c = createActivatedRoute('c'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const root = new TreeNode(a, [new TreeNode(b, []), new TreeNode(c, [])]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-02 15:31:56 -07:00
										 |  |  |       state = new RouterState(root, <any>null); | 
					
						
							| 
									
										
										
										
											2016-08-02 14:34:00 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return first child', () => { expect(state.root.firstChild).toBe(b); }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return children', () => { | 
					
						
							|  |  |  |       const cc = state.root.children; | 
					
						
							|  |  |  |       expect(cc[0]).toBe(b); | 
					
						
							|  |  |  |       expect(cc[1]).toBe(c); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return root', () => { | 
					
						
							| 
									
										
										
										
											2017-04-17 11:13:13 -07:00
										 |  |  |       const b = state.root.firstChild !; | 
					
						
							| 
									
										
										
										
											2016-08-07 20:09:04 -07:00
										 |  |  |       expect(b.root).toBe(state.root); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return parent', () => { | 
					
						
							| 
									
										
										
										
											2017-04-17 11:13:13 -07:00
										 |  |  |       const b = state.root.firstChild !; | 
					
						
							| 
									
										
										
										
											2016-08-02 14:34:00 -07:00
										 |  |  |       expect(b.parent).toBe(state.root); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return path from root', () => { | 
					
						
							| 
									
										
										
										
											2017-04-17 11:13:13 -07:00
										 |  |  |       const b = state.root.firstChild !; | 
					
						
							| 
									
										
										
										
											2016-08-02 14:34:00 -07:00
										 |  |  |       const p = b.pathFromRoot; | 
					
						
							|  |  |  |       expect(p[0]).toBe(state.root); | 
					
						
							|  |  |  |       expect(p[1]).toBe(b); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-10-28 15:17:00 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe('equalParamsAndUrlSegments', () => { | 
					
						
							|  |  |  |     function createSnapshot(params: Params, url: UrlSegment[]): ActivatedRouteSnapshot { | 
					
						
							| 
									
										
										
										
											2016-12-14 13:21:45 +01:00
										 |  |  |       const snapshot = new ActivatedRouteSnapshot( | 
					
						
							| 
									
										
										
										
											2016-10-28 15:17:00 -07:00
										 |  |  |           url, params, <any>null, <any>null, <any>null, <any>null, <any>null, <any>null, <any>null, | 
					
						
							| 
									
										
										
										
											2017-04-17 11:13:13 -07:00
										 |  |  |           -1, null !); | 
					
						
							| 
									
										
										
										
											2016-12-14 13:21:45 +01:00
										 |  |  |       snapshot._routerState = new RouterStateSnapshot('', new TreeNode(snapshot, [])); | 
					
						
							|  |  |  |       return snapshot; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function createSnapshotPairWithParent( | 
					
						
							|  |  |  |         params: [Params, Params], parentParams: [Params, Params], | 
					
						
							|  |  |  |         urls: [string, string]): [ActivatedRouteSnapshot, ActivatedRouteSnapshot] { | 
					
						
							|  |  |  |       const snapshot1 = createSnapshot(params[0], []); | 
					
						
							|  |  |  |       const snapshot2 = createSnapshot(params[1], []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const snapshot1Parent = createSnapshot(parentParams[0], [new UrlSegment(urls[0], {})]); | 
					
						
							|  |  |  |       const snapshot2Parent = createSnapshot(parentParams[1], [new UrlSegment(urls[1], {})]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       snapshot1._routerState = | 
					
						
							|  |  |  |           new RouterStateSnapshot('', new TreeNode(snapshot1Parent, [new TreeNode(snapshot1, [])])); | 
					
						
							|  |  |  |       snapshot2._routerState = | 
					
						
							|  |  |  |           new RouterStateSnapshot('', new TreeNode(snapshot2Parent, [new TreeNode(snapshot2, [])])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return [snapshot1, snapshot2]; | 
					
						
							| 
									
										
										
										
											2016-10-28 15:17:00 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return false when params are different', () => { | 
					
						
							|  |  |  |       expect(equalParamsAndUrlSegments(createSnapshot({a: 1}, []), createSnapshot({a: 2}, []))) | 
					
						
							|  |  |  |           .toEqual(false); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return false when urls are different', () => { | 
					
						
							|  |  |  |       expect(equalParamsAndUrlSegments( | 
					
						
							|  |  |  |                  createSnapshot({a: 1}, [new UrlSegment('a', {})]), | 
					
						
							|  |  |  |                  createSnapshot({a: 1}, [new UrlSegment('b', {})]))) | 
					
						
							|  |  |  |           .toEqual(false); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return true othewise', () => { | 
					
						
							|  |  |  |       expect(equalParamsAndUrlSegments( | 
					
						
							|  |  |  |                  createSnapshot({a: 1}, [new UrlSegment('a', {})]), | 
					
						
							|  |  |  |                  createSnapshot({a: 1}, [new UrlSegment('a', {})]))) | 
					
						
							|  |  |  |           .toEqual(true); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-12-14 13:21:45 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it('should return false when upstream params are different', () => { | 
					
						
							|  |  |  |       const [snapshot1, snapshot2] = | 
					
						
							|  |  |  |           createSnapshotPairWithParent([{a: 1}, {a: 1}], [{b: 1}, {c: 1}], ['a', 'a']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(false); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return false when upstream urls are different', () => { | 
					
						
							|  |  |  |       const [snapshot1, snapshot2] = | 
					
						
							|  |  |  |           createSnapshotPairWithParent([{a: 1}, {a: 1}], [{b: 1}, {b: 1}], ['a', 'b']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(false); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return true when upstream urls and params are equal', () => { | 
					
						
							|  |  |  |       const [snapshot1, snapshot2] = | 
					
						
							|  |  |  |           createSnapshotPairWithParent([{a: 1}, {a: 1}], [{b: 1}, {b: 1}], ['a', 'a']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(equalParamsAndUrlSegments(snapshot1, snapshot2)).toEqual(true); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-10-28 15:17:00 -07:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-10-31 13:11:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe('advanceActivatedRoute', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let route: ActivatedRoute; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     beforeEach(() => { route = createActivatedRoute('a'); }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function createSnapshot(params: Params, url: UrlSegment[]): ActivatedRouteSnapshot { | 
					
						
							|  |  |  |       const queryParams = {}; | 
					
						
							|  |  |  |       const fragment = ''; | 
					
						
							|  |  |  |       const data = {}; | 
					
						
							| 
									
										
										
										
											2016-12-14 13:21:45 +01:00
										 |  |  |       const snapshot = new ActivatedRouteSnapshot( | 
					
						
							| 
									
										
										
										
											2016-10-31 13:11:36 -07:00
										 |  |  |           url, params, queryParams, fragment, data, <any>null, <any>null, <any>null, <any>null, -1, | 
					
						
							| 
									
										
										
										
											2017-04-17 11:13:13 -07:00
										 |  |  |           null !); | 
					
						
							| 
									
										
										
										
											2016-12-14 13:21:45 +01:00
										 |  |  |       const state = new RouterStateSnapshot('', new TreeNode(snapshot, [])); | 
					
						
							|  |  |  |       snapshot._routerState = state; | 
					
						
							|  |  |  |       return snapshot; | 
					
						
							| 
									
										
										
										
											2016-10-31 13:11:36 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should call change observers', () => { | 
					
						
							|  |  |  |       const firstPlace = createSnapshot({a: 1}, []); | 
					
						
							|  |  |  |       const secondPlace = createSnapshot({a: 2}, []); | 
					
						
							|  |  |  |       route.snapshot = firstPlace; | 
					
						
							|  |  |  |       route._futureSnapshot = secondPlace; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       let hasSeenDataChange = false; | 
					
						
							|  |  |  |       route.data.forEach((data) => { hasSeenDataChange = true; }); | 
					
						
							|  |  |  |       advanceActivatedRoute(route); | 
					
						
							|  |  |  |       expect(hasSeenDataChange).toEqual(true); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-08-02 14:34:00 -07:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function createActivatedRouteSnapshot(cmp: string) { | 
					
						
							|  |  |  |   return new ActivatedRouteSnapshot( | 
					
						
							| 
									
										
										
										
											2016-08-02 15:31:56 -07:00
										 |  |  |       <any>null, <any>null, <any>null, <any>null, <any>null, <any>null, <any>cmp, <any>null, | 
					
						
							| 
									
										
										
										
											2017-04-17 11:13:13 -07:00
										 |  |  |       <any>null, -1, null !); | 
					
						
							| 
									
										
										
										
											2016-08-02 14:34:00 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function createActivatedRoute(cmp: string) { | 
					
						
							| 
									
										
										
										
											2016-08-02 15:31:56 -07:00
										 |  |  |   return new ActivatedRoute( | 
					
						
							| 
									
										
										
										
											2016-10-31 13:11:36 -07:00
										 |  |  |       new BehaviorSubject([new UrlSegment('', {})]), new BehaviorSubject({}), <any>null, <any>null, | 
					
						
							|  |  |  |       new BehaviorSubject({}), <any>null, <any>cmp, <any>null); | 
					
						
							| 
									
										
										
										
											2016-08-02 14:34:00 -07:00
										 |  |  | } |