85 lines
3.4 KiB
TypeScript
85 lines
3.4 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { buildDemoTaskCatalog, resolveSelectedDemoJobs } from './demoFlow';
|
|
import { listPlugins } from './plugins/registry';
|
|
import type { PluginManifest } from './plugins/types';
|
|
|
|
function manifest(id: string, tasks: PluginManifest['demoTasks']): PluginManifest {
|
|
return {
|
|
id,
|
|
name: id,
|
|
description: id,
|
|
version: '1',
|
|
schemaVersion: 1,
|
|
demoTasks: tasks,
|
|
demoSelection: { kind: 'task-nos', param: 'demoTaskNos' },
|
|
runtime: { kind: 'mock', fixture: 'unused.json' },
|
|
};
|
|
}
|
|
|
|
const manifests = [
|
|
manifest('distance', [
|
|
{ taskNo: 2, name: '车体长度', category: '尺寸', inspectionObjects: ['head', 'middle'] },
|
|
]),
|
|
manifest('contour', [
|
|
{ taskNo: 11, name: '车钩面板的平整度', category: '轮廓', inspectionObjects: ['head', 'middle'] },
|
|
]),
|
|
manifest('coupler', [
|
|
{ taskNo: 9, name: '参考面右偏转', category: '车钩', inspectionObjects: ['middle'] },
|
|
{ taskNo: 10, name: '纵向中心右偏转', category: '车钩', inspectionObjects: ['head'] },
|
|
]),
|
|
];
|
|
|
|
describe('demo task catalog', () => {
|
|
it('按数值排序并标记不适用于当前检测对象的任务', () => {
|
|
const catalog = buildDemoTaskCatalog(manifests, 'head', '头车');
|
|
expect(catalog.items.map((item) => item.taskNo)).toEqual([2, 9, 10, 11]);
|
|
expect(catalog.total).toBe(3);
|
|
expect(catalog.items.find((item) => item.taskNo === 9)).toMatchObject({ enabled: false });
|
|
});
|
|
|
|
it('跨算法选择转换为最小作业集合并去重', () => {
|
|
const catalog = buildDemoTaskCatalog(manifests, 'head', '头车');
|
|
const plan = resolveSelectedDemoJobs(manifests, catalog, [11, 2, 10, 2]);
|
|
expect(plan.taskNos).toEqual([2, 10, 11]);
|
|
expect(plan.jobs.map((job) => job.pluginId)).toEqual(['distance', 'coupler', 'contour']);
|
|
expect(plan.jobs).toHaveLength(3);
|
|
});
|
|
|
|
it('拒绝当前检测对象不可运行的任务', () => {
|
|
const catalog = buildDemoTaskCatalog(manifests, 'head', '头车');
|
|
expect(() => resolveSelectedDemoJobs(manifests, catalog, [9])).toThrow('不适用于当前头车');
|
|
});
|
|
});
|
|
|
|
describe('actual plugin demo task catalog', () => {
|
|
const actualManifests = listPlugins();
|
|
|
|
it('返回真实非连续任务号、名称与检测对象动态数量', () => {
|
|
const head = buildDemoTaskCatalog(actualManifests, 'head', '头车');
|
|
const middle = buildDemoTaskCatalog(actualManifests, 'middle', '中车');
|
|
expect(head.total).toBe(39);
|
|
expect(middle.total).toBe(26);
|
|
expect(head.items.find((item) => item.taskNo === 11)?.name).toBe('车钩面板的平整度');
|
|
expect(head.items.some((item) => item.taskNo === 3)).toBe(false);
|
|
expect(head.items.map((item) => item.taskNo)).toEqual(
|
|
[...head.items.map((item) => item.taskNo)].sort((a, b) => a - b),
|
|
);
|
|
});
|
|
|
|
it('任务 2、11、10 生成三个插件作业,单个车钩任务只生成一次共享作业', () => {
|
|
const head = buildDemoTaskCatalog(actualManifests, 'head', '头车');
|
|
const mixed = resolveSelectedDemoJobs(actualManifests, head, [2, 11, 10]);
|
|
expect(mixed.jobs.map((job) => job.pluginId)).toEqual([
|
|
'train-measurement',
|
|
'coupler-panel',
|
|
'flatness-suite',
|
|
]);
|
|
const couplerOnly = resolveSelectedDemoJobs(actualManifests, head, [8]);
|
|
expect(couplerOnly.jobs).toEqual([{
|
|
pluginId: 'coupler-panel',
|
|
taskNos: [8],
|
|
params: { demoTaskNos: [8] },
|
|
}]);
|
|
});
|
|
});
|