|
|
@@ -13,7 +13,7 @@ import {
|
|
|
} from '../src/views/analysis/warningAnalysis/windPointManage/windTopology/hooks/useTopologyOrdering';
|
|
|
import { computeLayout } from '../src/views/analysis/warningAnalysis/windPointManage/windTopology/hooks/useTopologyLayout';
|
|
|
|
|
|
-/** 构造测风点位(MineArea) */
|
|
|
+/** 构造测风地点(MineArea) */
|
|
|
const area = (id: string, level: number, airVolume = 100, extra: Record<string, any> = {}) => ({
|
|
|
id,
|
|
|
name: id,
|
|
|
@@ -65,10 +65,25 @@ describe('countCrossings 交叉数统计', () => {
|
|
|
['x', 0],
|
|
|
['y', 1],
|
|
|
]);
|
|
|
- expect(countCrossings(rankA, rankB, [['a', 'y'], ['b', 'x']])).toBe(1);
|
|
|
- expect(countCrossings(rankA, rankB, [['a', 'x'], ['b', 'y']])).toBe(0);
|
|
|
+ expect(
|
|
|
+ countCrossings(rankA, rankB, [
|
|
|
+ ['a', 'y'],
|
|
|
+ ['b', 'x'],
|
|
|
+ ])
|
|
|
+ ).toBe(1);
|
|
|
+ expect(
|
|
|
+ countCrossings(rankA, rankB, [
|
|
|
+ ['a', 'x'],
|
|
|
+ ['b', 'y'],
|
|
|
+ ])
|
|
|
+ ).toBe(0);
|
|
|
// 无公共端点秩(防御:缺失端点跳过不计数)
|
|
|
- expect(countCrossings(rankA, rankB, [['a', 'y'], ['unknown', 'x']])).toBe(0);
|
|
|
+ expect(
|
|
|
+ countCrossings(rankA, rankB, [
|
|
|
+ ['a', 'y'],
|
|
|
+ ['unknown', 'x'],
|
|
|
+ ])
|
|
|
+ ).toBe(0);
|
|
|
});
|
|
|
});
|
|
|
|
|
|
@@ -86,16 +101,13 @@ describe('orderNodesByLevel median 扫描法', () => {
|
|
|
|
|
|
test('确定性:同一输入两次调用结果完全一致(含 barycenter 方法)', () => {
|
|
|
const areas = [area('a1', 1), area('a2', 1), area('a3', 1), area('b1', 2), area('b2', 2), area('b3', 2)];
|
|
|
- const relations = buildRelationArray(
|
|
|
- areas,
|
|
|
- [
|
|
|
- rel('r1', 'a1', 'b2'),
|
|
|
- rel('r2', 'a2', 'b3'),
|
|
|
- rel('r3', 'a3', 'b1'),
|
|
|
- rel('r1b', 'a1', 'b3'),
|
|
|
- rel('r2b', 'a2', 'b1'),
|
|
|
- ],
|
|
|
- );
|
|
|
+ const relations = buildRelationArray(areas, [
|
|
|
+ rel('r1', 'a1', 'b2'),
|
|
|
+ rel('r2', 'a2', 'b3'),
|
|
|
+ rel('r3', 'a3', 'b1'),
|
|
|
+ rel('r1b', 'a1', 'b3'),
|
|
|
+ rel('r2b', 'a2', 'b1'),
|
|
|
+ ]);
|
|
|
const data = transformToTopologyData(areas, relations);
|
|
|
for (const method of ['median', 'barycenter'] as const) {
|
|
|
const o1 = orderNodesByLevel(data, { method });
|
|
|
@@ -164,15 +176,7 @@ describe('orderNodesByLevel median 扫描法', () => {
|
|
|
// lv0=[a0,a1]、lv1=[b1,b2]:边 a0→b2、a1→b1 → 初始 1 交叉
|
|
|
// lv5=[e1,e2]、lv6=[f1,f2]:边 e1→f2、e2→f1 → 初始 1 交叉
|
|
|
const areas = [area('a0', 0), area('a1', 0), area('b1', 1), area('b2', 1), area('e1', 5), area('e2', 5), area('f1', 6), area('f2', 6)];
|
|
|
- const relations = buildRelationArray(
|
|
|
- areas,
|
|
|
- [
|
|
|
- rel('r1', 'a0', 'b2'),
|
|
|
- rel('r2', 'a1', 'b1'),
|
|
|
- rel('r3', 'e1', 'f2'),
|
|
|
- rel('r4', 'e2', 'f1'),
|
|
|
- ],
|
|
|
- );
|
|
|
+ const relations = buildRelationArray(areas, [rel('r1', 'a0', 'b2'), rel('r2', 'a1', 'b1'), rel('r3', 'e1', 'f2'), rel('r4', 'e2', 'f1')]);
|
|
|
const data = transformToTopologyData(areas, relations);
|
|
|
const order = orderNodesByLevel(data);
|
|
|
expect(order.get('0')).toHaveLength(2);
|
|
|
@@ -214,10 +218,7 @@ describe('computeLayout 与排序集成', () => {
|
|
|
|
|
|
test('5 层线状模型(laneTopo 等价):全部坐标合法,交叉数为 0', () => {
|
|
|
const areas = [area('a1', 1), area('b1', 2), area('c1', 3), area('d1', 4), area('e1', 5)];
|
|
|
- const relations = buildRelationArray(
|
|
|
- areas,
|
|
|
- [rel('r1', 'a1', 'b1'), rel('r2', 'b1', 'c1'), rel('r3', 'c1', 'd1'), rel('r4', 'd1', 'e1')],
|
|
|
- );
|
|
|
+ const relations = buildRelationArray(areas, [rel('r1', 'a1', 'b1'), rel('r2', 'b1', 'c1'), rel('r3', 'c1', 'd1'), rel('r4', 'd1', 'e1')]);
|
|
|
const data = transformToTopologyData(areas, relations);
|
|
|
const order = orderNodesByLevel(data);
|
|
|
expect(countTotalCrossings(data, order)).toBe(0);
|
|
|
@@ -233,10 +234,7 @@ describe('computeLayout 与排序集成', () => {
|
|
|
|
|
|
test('排序不改变列序与总进/总回地面节点位置', () => {
|
|
|
const areas = [area('a1', 1), area('b1', 2), area('c1', 3), area('d1', 4), area('e1', 5)];
|
|
|
- const relations = buildRelationArray(
|
|
|
- areas,
|
|
|
- [rel('r1', 'a1', 'b1'), rel('r2', 'b1', 'c1'), rel('r3', 'c1', 'd1'), rel('r4', 'd1', 'e1')],
|
|
|
- );
|
|
|
+ const relations = buildRelationArray(areas, [rel('r1', 'a1', 'b1'), rel('r2', 'b1', 'c1'), rel('r3', 'c1', 'd1'), rel('r4', 'd1', 'e1')]);
|
|
|
const data = transformToTopologyData(areas, relations);
|
|
|
const pos = computeLayout(data, 1200, 700).positions;
|
|
|
expect(pos[ROOT_IN_ID].x).toBe(laneX(0));
|
|
|
@@ -249,15 +247,12 @@ describe('computeLayout 与排序集成', () => {
|
|
|
|
|
|
test('pairEdgesOf 复算与 countTotalCrossings 一致(防实现漂移)', () => {
|
|
|
const areas = [area('a1', 1), area('a2', 1), area('b1', 2), area('b2', 2), area('c1', 3)];
|
|
|
- const relations = buildRelationArray(
|
|
|
- areas,
|
|
|
- [
|
|
|
- rel('r1', 'a1', 'b2'),
|
|
|
- rel('r2', 'a2', 'b1'),
|
|
|
- rel('r3', 'b2', 'c1'),
|
|
|
- rel('r4', 'a1', 'c1'), // 跨层边:不参与
|
|
|
- ],
|
|
|
- );
|
|
|
+ const relations = buildRelationArray(areas, [
|
|
|
+ rel('r1', 'a1', 'b2'),
|
|
|
+ rel('r2', 'a2', 'b1'),
|
|
|
+ rel('r3', 'b2', 'c1'),
|
|
|
+ rel('r4', 'a1', 'c1'), // 跨层边:不参与
|
|
|
+ ]);
|
|
|
const data = transformToTopologyData(areas, relations);
|
|
|
const order = orderNodesByLevel(data);
|
|
|
// 独立复算相邻层边,再统计交叉数,应与 countTotalCrossings 一致
|