Files
lupin-demo/tests/sectorBuilder.test.ts
2026-01-23 23:20:39 +08:00

116 lines
3.5 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { ColorResolver } from '../src/colorResolver';
import { SectorBuilder } from '../src/sectorBuilder';
import type { SectorLayerConfig, ThemeConfig } from '../src/types';
describe('sectorBuilder', () => {
const theme: ThemeConfig = {
colorPalettes: {
A: '#111111',
B: '#222222',
},
};
it('应生成正确数量的扇区', () => {
const resolver = new ColorResolver(theme, '#000000');
const builder = new SectorBuilder(resolver);
const layer: SectorLayerConfig = {
divisions: 4,
rInner: 0,
rOuter: 10,
};
const sectors = builder.buildLayer(layer, 0);
expect(sectors).toHaveLength(4);
});
it('应遵循 sector > layer > background 的颜色优先级', () => {
const resolver = new ColorResolver(theme, '#000000');
const builder = new SectorBuilder(resolver);
const layer: SectorLayerConfig = {
divisions: 4,
rInner: 0,
rOuter: 10,
colorRef: 'A',
num: 2,
interval: 1,
sectors: [{ content: 'x', colorRef: 'B' }],
};
const sectors = builder.buildLayer(layer, 0);
expect(sectors[0].fill).toBe('#222222');
expect(sectors[1].fill).toBe('#111111');
expect(sectors[2].fill).toBe('#000000');
});
it('groupSplit=false 时应隐藏组内分割线', () => {
const resolver = new ColorResolver(theme, '#000000');
const builder = new SectorBuilder(resolver);
const layer: SectorLayerConfig = {
divisions: 4,
rInner: 0,
rOuter: 10,
num: 2,
interval: 1,
groupSplit: false,
};
const sectors = builder.buildLayer(layer, 0);
expect(sectors[0].groupSplitVisible).toBe(false);
expect(sectors[1].groupSplitVisible).toBe(true);
expect(sectors[2].groupSplitVisible).toBe(true);
});
it('groupSplit=false 时应受 patternOffset 影响', () => {
const resolver = new ColorResolver(theme, '#000000');
const builder = new SectorBuilder(resolver);
const baseLayer: SectorLayerConfig = {
divisions: 4,
rInner: 0,
rOuter: 10,
num: 2,
interval: 1,
groupSplit: false,
};
const baseSectors = builder.buildLayer(baseLayer, 0);
const offsetSectors = builder.buildLayer({ ...baseLayer, patternOffset: 2 }, 0);
expect(baseSectors[1].groupSplitVisible).toBe(false);
expect(offsetSectors[2].groupSplitVisible).toBe(false);
});
it('应生成多文本单元并按角度分配', () => {
const resolver = new ColorResolver(theme, '#000000');
const builder = new SectorBuilder(resolver);
const layer: SectorLayerConfig = {
divisions: 4,
rInner: 0,
rOuter: 10,
sectors: [{ content: '甲乙|子|丙丁' }],
};
const sector = builder.buildLayer(layer, 0)[0];
expect(sector.textUnits).toHaveLength(3);
expect(sector.textUnits?.[0].aStart).toBeCloseTo(0);
expect(sector.textUnits?.[0].aEnd).toBeCloseTo(22.5);
expect(sector.textUnits?.[1].aStart).toBeCloseTo(22.5);
expect(sector.textUnits?.[1].aEnd).toBeCloseTo(67.5);
});
it('应识别单文本 SVG 内容并生成路径', () => {
const resolver = new ColorResolver(theme, '#000000');
const builder = new SectorBuilder(resolver);
const layer: SectorLayerConfig = {
divisions: 1,
rInner: 0,
rOuter: 10,
sectors: [{ content: 'icon.svg' }],
};
const sector = builder.buildLayer(layer, 0)[0];
expect(sector.isSvgContent).toBe(true);
expect(sector.svgPath).toBe('src/assets/icons/icon.svg');
});
});