116 lines
3.5 KiB
TypeScript
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');
|
|
});
|
|
});
|