| 
									
										
										
										
											2020-03-14 22:09:46 +00:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2020-03-14 22:09:46 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | import {computeTaskDependencies, sortTasksByPriority} from '../../src/execution/tasks/utils'; | 
					
						
							|  |  |  | import {createTasksAndGraph} from './helpers'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('execution utils', () => { | 
					
						
							|  |  |  |   describe('computeTaskDependencies()', () => { | 
					
						
							|  |  |  |     it('should throw, if there are multiple tasks that generate typings for a single entry-point', | 
					
						
							|  |  |  |        () => { | 
					
						
							|  |  |  |          const {tasks, graph} = createTasksAndGraph(2, 2, { | 
					
						
							|  |  |  |            0: [],   // Entry-point #0 does not depend on anything.
 | 
					
						
							|  |  |  |            1: [0],  // Entry-point #1 depends on #0.
 | 
					
						
							|  |  |  |          }); | 
					
						
							|  |  |  |          tasks[1].processDts = true;  // Tweak task #1 to also generate typings.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          expect(() => computeTaskDependencies(tasks, graph)) | 
					
						
							|  |  |  |              .toThrowError( | 
					
						
							|  |  |  |                  'Invariant violated: Multiple tasks are assigned generating typings for ' + | 
					
						
							|  |  |  |                  '\'/path/to/entry/point/0\':\n' + | 
					
						
							|  |  |  |                  '  - {entryPoint: entry-point-0, formatProperty: prop-0, processDts: true}\n' + | 
					
						
							|  |  |  |                  '  - {entryPoint: entry-point-0, formatProperty: prop-1, processDts: true}'); | 
					
						
							|  |  |  |        }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should add non-typings tasks to the dependents of typings tasks', () => { | 
					
						
							|  |  |  |       const {tasks, graph} = createTasksAndGraph(2, 2, { | 
					
						
							|  |  |  |         0: [],   // entry-point-0 does not depend on anything.
 | 
					
						
							|  |  |  |         1: [0],  // entry-point-1 depends on entry-point-0.
 | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const dependents = computeTaskDependencies(tasks, graph); | 
					
						
							|  |  |  |       // entry-point-0
 | 
					
						
							|  |  |  |       expect(dependents.get(tasks[0])).toEqual(new Set([ | 
					
						
							|  |  |  |         tasks[1],  // non-typings task for entry-point-0
 | 
					
						
							|  |  |  |         tasks[2],  // typings task for entry-point-1, which depends upon entry-point-0
 | 
					
						
							|  |  |  |         tasks[3],  // non-typings task for entry-point-1, which depends upon entry-point-0
 | 
					
						
							|  |  |  |       ])); | 
					
						
							|  |  |  |       expect(dependents.get(tasks[1])).toBeUndefined(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // entry-point-1
 | 
					
						
							|  |  |  |       expect(dependents.get(tasks[2])).toEqual(new Set([ | 
					
						
							|  |  |  |         tasks[3],  // non-typings task for entry-point-1
 | 
					
						
							|  |  |  |       ])); | 
					
						
							|  |  |  |       expect(dependents.get(tasks[3])).toBeUndefined(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('sortTasksByPriority', () => { | 
					
						
							|  |  |  |     it('should return the tasks in their original order if there are no dependencies', () => { | 
					
						
							|  |  |  |       const {tasks} = createTasksAndGraph(3, 1); | 
					
						
							|  |  |  |       const sortedTasks = sortTasksByPriority(tasks, new Map()); | 
					
						
							|  |  |  |       expect(sortedTasks).toEqual(tasks); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should return the tasks ordered by how many tasks depend upon them', () => { | 
					
						
							|  |  |  |       // Before sort:
 | 
					
						
							|  |  |  |       // 0 blocks [3]
 | 
					
						
							|  |  |  |       // 1 blocks [2, 3]
 | 
					
						
							|  |  |  |       // 2 blocks []
 | 
					
						
							|  |  |  |       // 3 blocks [4]
 | 
					
						
							|  |  |  |       // 4 blocks []
 | 
					
						
							|  |  |  |       const {tasks, graph} = createTasksAndGraph(5, 1, {0: [], 1: [], 2: [1], 3: [0, 1], 4: [3]}); | 
					
						
							|  |  |  |       const sortedTasks = sortTasksByPriority(tasks, computeTaskDependencies(tasks, graph)); | 
					
						
							|  |  |  |       // After sort:
 | 
					
						
							|  |  |  |       // 1 blocks [2, 3]
 | 
					
						
							|  |  |  |       // 0 blocks [3]
 | 
					
						
							|  |  |  |       // 3 blocks [4]
 | 
					
						
							|  |  |  |       // 2 blocks []
 | 
					
						
							|  |  |  |       // 4 blocks []
 | 
					
						
							|  |  |  |       expect(sortedTasks).toEqual([ | 
					
						
							|  |  |  |         tasks[1], | 
					
						
							|  |  |  |         tasks[0], | 
					
						
							|  |  |  |         tasks[3], | 
					
						
							|  |  |  |         tasks[2], | 
					
						
							|  |  |  |         tasks[4], | 
					
						
							|  |  |  |       ]); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |