84 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			84 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @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
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								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],
							 | 
						||
| 
								 | 
							
								      ]);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 |