2020-03-14 18:09:46 -04:00
|
|
|
/**
|
|
|
|
* @license
|
2020-05-19 15:08:49 -04:00
|
|
|
* Copyright Google LLC All Rights Reserved.
|
2020-03-14 18:09:46 -04: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],
|
|
|
|
]);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|