Skip to content

Commit 944012a

Browse files
liujupingJackLian
authored andcommitted
test(designer): add test ut to sequencify
1 parent b697ea9 commit 944012a

3 files changed

Lines changed: 177 additions & 10 deletions

File tree

packages/designer/jest.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const jestConfig = {
2020
// testMatch: ['**/node.test.ts'],
2121
// testMatch: ['**/builtin-hotkey.test.ts'],
2222
// testMatch: ['**/selection.test.ts'],
23+
// testMatch: ['**/plugin/sequencify.test.ts'],
2324
transformIgnorePatterns: [
2425
`/node_modules/(?!${esModules})/`,
2526
],

packages/designer/src/plugin/sequencify.ts

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,70 @@
1-
function sequence(tasks, names, results, missing, recursive, nest) {
1+
interface ITaks {
2+
[key: string]: {
3+
name: string;
4+
dep: string[];
5+
};
6+
}
7+
8+
export function sequence({
9+
tasks,
10+
names,
11+
results,
12+
missing,
13+
recursive,
14+
nest,
15+
parentName,
16+
}: {
17+
tasks: ITaks;
18+
names: string[];
19+
results: string[];
20+
missing: string[];
21+
recursive: string[][];
22+
nest: string[];
23+
parentName: string;
24+
}) {
225
names.forEach((name) => {
326
if (results.indexOf(name) !== -1) {
427
return; // de-dup results
528
}
629
const node = tasks[name];
730
if (!node) {
8-
missing.push(name);
31+
missing.push([parentName, name].filter((d => !!d)).join('.'));
932
} else if (nest.indexOf(name) > -1) {
1033
nest.push(name);
1134
recursive.push(nest.slice(0));
12-
nest.pop(name);
35+
nest.pop();
1336
} else if (node.dep.length) {
1437
nest.push(name);
15-
sequence(tasks, node.dep, results, missing, recursive, nest); // recurse
16-
nest.pop(name);
38+
sequence({
39+
tasks,
40+
parentName: name,
41+
names: node.dep,
42+
results,
43+
missing,
44+
recursive,
45+
nest,
46+
}); // recurse
47+
nest.pop();
1748
}
1849
results.push(name);
1950
});
2051
}
2152

2253
// tasks: object with keys as task names
2354
// names: array of task names
24-
export default function (tasks, names) {
25-
let results = []; // the final sequence
26-
const missing = []; // missing tasks
27-
const recursive = []; // recursive task dependencies
55+
export default function (tasks: ITaks, names: string[]) {
56+
let results: string[] = []; // the final sequence
57+
const missing: string[] = []; // missing tasks
58+
const recursive: string[][] = []; // recursive task dependencies
2859

29-
sequence(tasks, names, results, missing, recursive, []);
60+
sequence({
61+
tasks,
62+
names,
63+
results,
64+
missing,
65+
recursive,
66+
nest: [],
67+
});
3068

3169
if (missing.length || recursive.length) {
3270
results = []; // results are incomplete at best, completely wrong at worst, remove them to avoid confusion
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import sequencify, { sequence } from '../../src/plugin/sequencify';
2+
3+
describe('sequence', () => {
4+
it('handles tasks with no dependencies', () => {
5+
const tasks = {
6+
task1: { name: 'Task 1', dep: [] },
7+
task2: { name: 'Task 2', dep: [] }
8+
};
9+
const results = [];
10+
const missing = [];
11+
const recursive = [];
12+
sequence({ tasks, names: ['task1', 'task2'], results, missing, recursive, nest: [] });
13+
14+
expect(results).toEqual(['task1', 'task2']);
15+
expect(missing).toEqual([]);
16+
expect(recursive).toEqual([]);
17+
});
18+
19+
it('correctly orders tasks based on dependencies', () => {
20+
const tasks = {
21+
task1: { name: 'Task 1', dep: [] },
22+
task2: { name: 'Task 2', dep: ['task1'] }
23+
};
24+
const results = [];
25+
const missing = [];
26+
const recursive = [];
27+
sequence({ tasks, names: ['task2', 'task1'], results, missing, recursive, nest: [] });
28+
29+
expect(results).toEqual(['task1', 'task2']);
30+
expect(missing).toEqual([]);
31+
expect(recursive).toEqual([]);
32+
});
33+
34+
it('identifies missing tasks', () => {
35+
const tasks = {
36+
task1: { name: 'Task 1', dep: [] }
37+
};
38+
const results = [];
39+
const missing = [];
40+
const recursive = [];
41+
const nest = []
42+
sequence({ tasks, names: ['task2'], results, missing, recursive, nest });
43+
44+
expect(results).toEqual(['task2']);
45+
expect(missing).toEqual(['task2']);
46+
expect(recursive).toEqual([]);
47+
expect(nest).toEqual([]);
48+
});
49+
50+
it('detects recursive dependencies', () => {
51+
const tasks = {
52+
task1: { name: 'Task 1', dep: ['task2'] },
53+
task2: { name: 'Task 2', dep: ['task1'] }
54+
};
55+
const results = [];
56+
const missing = [];
57+
const recursive = [];
58+
const nest = []
59+
sequence({ tasks, names: ['task1', 'task2'], results, missing, recursive, nest });
60+
61+
expect(results).toEqual(['task1', 'task2', 'task1']);
62+
expect(missing).toEqual([]);
63+
expect(recursive).toEqual([['task1', 'task2', 'task1']]);
64+
expect(nest).toEqual([]);
65+
});
66+
});
67+
68+
describe('sequence', () => {
69+
70+
it('should return tasks in sequence without dependencies', () => {
71+
const tasks = {
72+
task1: { name: 'Task 1', dep: [] },
73+
task2: { name: 'Task 2', dep: [] },
74+
task3: { name: 'Task 3', dep: [] }
75+
};
76+
const names = ['task1', 'task2', 'task3'];
77+
const expected = {
78+
sequence: ['task1', 'task2', 'task3'],
79+
missingTasks: [],
80+
recursiveDependencies: []
81+
};
82+
expect(sequencify(tasks, names)).toEqual(expected);
83+
});
84+
85+
it('should handle tasks with dependencies', () => {
86+
const tasks = {
87+
task1: { name: 'Task 1', dep: [] },
88+
task2: { name: 'Task 2', dep: ['task1'] },
89+
task3: { name: 'Task 3', dep: ['task2'] }
90+
};
91+
const names = ['task3', 'task2', 'task1'];
92+
const expected = {
93+
sequence: ['task1', 'task2', 'task3'],
94+
missingTasks: [],
95+
recursiveDependencies: []
96+
};
97+
expect(sequencify(tasks, names)).toEqual(expected);
98+
});
99+
100+
it('should identify missing tasks', () => {
101+
const tasks = {
102+
task1: { name: 'Task 1', dep: [] },
103+
task2: { name: 'Task 2', dep: ['task3'] } // task3 is missing
104+
};
105+
const names = ['task1', 'task2'];
106+
const expected = {
107+
sequence: [],
108+
missingTasks: ['task2.task3'],
109+
recursiveDependencies: []
110+
};
111+
expect(sequencify(tasks, names)).toEqual(expected);
112+
});
113+
114+
it('should detect recursive dependencies', () => {
115+
const tasks = {
116+
task1: { name: 'Task 1', dep: ['task2'] },
117+
task2: { name: 'Task 2', dep: ['task1'] } // Recursive dependency
118+
};
119+
const names = ['task1', 'task2'];
120+
const expected = {
121+
sequence: [],
122+
missingTasks: [],
123+
recursiveDependencies: [['task1', 'task2', 'task1']]
124+
};
125+
expect(sequencify(tasks, names)).toEqual(expected);
126+
});
127+
128+
});

0 commit comments

Comments
 (0)