240 lines
8.4 KiB
TypeScript
Generated
240 lines
8.4 KiB
TypeScript
Generated
|
|
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
import ComponentModel, { ComponentModelConstructor } from '@/src/model/Component';
|
|
import { ComponentMainType } from '@/src/util/types';
|
|
|
|
const componentModelConstructor = ComponentModel as ComponentModelConstructor;
|
|
|
|
function extendModel(type: string, dependencies?: string[]) {
|
|
class SubModel extends ComponentModel {
|
|
static type: string = type;
|
|
type: string = type;
|
|
static dependencies = dependencies || [];
|
|
};
|
|
ComponentModel.registerClass(SubModel);
|
|
return SubModel;
|
|
}
|
|
|
|
describe('componentDependency', function () {
|
|
|
|
let idx = 0;
|
|
|
|
function makeTypes(count: number): string[] {
|
|
const arr = [];
|
|
for (let i = 0; i < count; i++) {
|
|
arr.push('type_' + idx++);
|
|
}
|
|
return arr;
|
|
}
|
|
|
|
type TopoResultItem = [ComponentMainType, ComponentMainType[]];
|
|
|
|
it('topologicalTravel_base', function () {
|
|
const [m1, a1, a2] = makeTypes(3);
|
|
extendModel(m1, [a1, a2]);
|
|
extendModel(a1);
|
|
extendModel(a2);
|
|
const result: TopoResultItem[] = [];
|
|
const allList = componentModelConstructor.getAllClassMainTypes();
|
|
componentModelConstructor.topologicalTravel(
|
|
[m1, a1, a2],
|
|
allList,
|
|
function (componentType, dependencies) {
|
|
result.push([componentType, dependencies]);
|
|
}
|
|
);
|
|
expect(result).toEqual([[a2, ['dataset']], [a1, ['dataset']], [m1, ['dataset', a1, a2]]]);
|
|
});
|
|
|
|
it('topologicalTravel_a1IsAbsent', function () {
|
|
const [m1, a1, a2] = makeTypes(3);
|
|
extendModel(m1, [a1, a2]);
|
|
extendModel(a2);
|
|
const allList = componentModelConstructor.getAllClassMainTypes();
|
|
const result: TopoResultItem[] = [];
|
|
componentModelConstructor.topologicalTravel(
|
|
[m1, a2],
|
|
allList,
|
|
function (componentType, dependencies) {
|
|
result.push([componentType, dependencies]);
|
|
}
|
|
);
|
|
expect(result).toEqual([[a2, ['dataset']], [m1, ['dataset', a1, a2]]]);
|
|
});
|
|
|
|
it('topologicalTravel_empty', function () {
|
|
const [m1, a1, a2] = makeTypes(3);
|
|
extendModel(m1, [a1, a2]);
|
|
extendModel(a1);
|
|
extendModel(a2);
|
|
const allList = componentModelConstructor.getAllClassMainTypes();
|
|
const result: TopoResultItem[] = [];
|
|
componentModelConstructor.topologicalTravel(
|
|
[],
|
|
allList,
|
|
function (componentType, dependencies) {
|
|
result.push([componentType, dependencies]);
|
|
}
|
|
);
|
|
expect(result).toEqual([]);
|
|
});
|
|
|
|
it('topologicalTravel_isolate', function () {
|
|
const [m1, a1, a2] = makeTypes(3);
|
|
extendModel(a2);
|
|
extendModel(a1);
|
|
extendModel(m1, [a2]);
|
|
const allList = componentModelConstructor.getAllClassMainTypes();
|
|
const result: TopoResultItem[] = [];
|
|
componentModelConstructor.topologicalTravel(
|
|
[a1, a2, m1],
|
|
allList,
|
|
function (componentType, dependencies) {
|
|
result.push([componentType, dependencies]);
|
|
}
|
|
);
|
|
expect(result).toEqual([[a1, ['dataset']], [a2, ['dataset']], [m1, ['dataset', a2]]]);
|
|
});
|
|
|
|
it('topologicalTravel_diamond', function () {
|
|
const [m1, a1, a2, a3] = makeTypes(4);
|
|
extendModel(a1, []);
|
|
extendModel(a2, [a1]);
|
|
extendModel(a3, [a1]);
|
|
extendModel(m1, [a2, a3]);
|
|
const allList = componentModelConstructor.getAllClassMainTypes();
|
|
const result: TopoResultItem[] = [];
|
|
componentModelConstructor.topologicalTravel(
|
|
[m1, a1, a2, a3],
|
|
allList,
|
|
function (componentType, dependencies) {
|
|
result.push([componentType, dependencies]);
|
|
}
|
|
);
|
|
expect(result).toEqual(
|
|
[[a1, ['dataset']],
|
|
[a3, ['dataset', a1]],
|
|
[a2, ['dataset', a1]],
|
|
[m1, ['dataset', a2, a3]]
|
|
]);
|
|
});
|
|
|
|
it('topologicalTravel_loop', function () {
|
|
const [m1, m2, a1, a2, a3] = makeTypes(5);
|
|
extendModel(m1, [a1, a2]);
|
|
extendModel(m2, [m1, a2]);
|
|
extendModel(a1, [m2, a2, a3]);
|
|
extendModel(a2);
|
|
extendModel(a3);
|
|
const allList = componentModelConstructor.getAllClassMainTypes();
|
|
expect(function () {
|
|
componentModelConstructor.topologicalTravel(
|
|
[m1, m2, a1],
|
|
allList,
|
|
() => {}
|
|
);
|
|
}).toThrowError(/Circular/);
|
|
});
|
|
|
|
it('topologicalTravel_multipleEchartsInstance', function () {
|
|
const [m1, m2, a1, a2] = makeTypes(4);
|
|
extendModel(m1, [a1, a2]);
|
|
extendModel(a1);
|
|
extendModel(a2);
|
|
let allList = componentModelConstructor.getAllClassMainTypes();
|
|
let result: TopoResultItem[] = [];
|
|
componentModelConstructor.topologicalTravel(
|
|
[m1, a1, a2],
|
|
allList,
|
|
function (componentType, dependencies) {
|
|
result.push([componentType, dependencies]);
|
|
}
|
|
);
|
|
expect(result).toEqual([[a2, ['dataset']], [a1, ['dataset']], [m1, ['dataset', a1, a2]]]);
|
|
|
|
result = [];
|
|
extendModel(m2, [a1, m1]);
|
|
allList = componentModelConstructor.getAllClassMainTypes();
|
|
componentModelConstructor.topologicalTravel(
|
|
[m2, m1, a1, a2],
|
|
allList,
|
|
function (componentType, dependencies) {
|
|
result.push([componentType, dependencies]);
|
|
}
|
|
);
|
|
expect(result).toEqual(
|
|
[[a2, ['dataset']], [a1, ['dataset']], [m1, ['dataset', a1, a2]], [m2, ['dataset', a1, m1]]]
|
|
);
|
|
});
|
|
|
|
it('topologicalTravel_missingSomeNodeButHasDependencies', function () {
|
|
const [m1, a1, a2, a3, a4] = makeTypes(5);
|
|
extendModel(m1, [a1, a2]);
|
|
extendModel(a2, [a3]);
|
|
extendModel(a3);
|
|
extendModel(a4);
|
|
let result: TopoResultItem[] = [];
|
|
let allList = componentModelConstructor.getAllClassMainTypes();
|
|
componentModelConstructor.topologicalTravel(
|
|
[a3, m1],
|
|
allList,
|
|
function (componentType, dependencies) {
|
|
result.push([componentType, dependencies]);
|
|
}
|
|
);
|
|
expect(result).toEqual([[a3, ['dataset']], [a2, ['dataset', a3]], [m1, ['dataset', a1, a2]]]);
|
|
result = [];
|
|
allList = componentModelConstructor.getAllClassMainTypes();
|
|
componentModelConstructor.topologicalTravel(
|
|
[m1, a3],
|
|
allList,
|
|
function (componentType, dependencies) {
|
|
result.push([componentType, dependencies]);
|
|
}
|
|
);
|
|
expect(result).toEqual([[a3, ['dataset']], [a2, ['dataset', a3]], [m1, ['dataset', a1, a2]]]);
|
|
});
|
|
|
|
it('topologicalTravel_subType', function () {
|
|
const [m1, a1, a2, a3, a4] = makeTypes(5);
|
|
extendModel(m1, [a1, a2]);
|
|
extendModel(a1 + '.aaa', [a2]);
|
|
extendModel(a1 + '.bbb', [a3, a4]);
|
|
extendModel(a2);
|
|
extendModel(a3);
|
|
extendModel(a4);
|
|
const result: TopoResultItem[] = [];
|
|
const allList = componentModelConstructor.getAllClassMainTypes();
|
|
componentModelConstructor.topologicalTravel(
|
|
[m1, a1, a2, a4],
|
|
allList,
|
|
function (componentType, dependencies) {
|
|
result.push([componentType, dependencies]);
|
|
}
|
|
);
|
|
expect(result).toEqual(
|
|
[[a4, ['dataset']],
|
|
[a2, ['dataset']],
|
|
[a1, ['dataset', a2, a3, a4]],
|
|
[m1, ['dataset', a1, a2]]
|
|
]);
|
|
});
|
|
}); |