update at 2026-01-22 18:43:01
This commit is contained in:
96
tests/sectorBuilder.test.ts
Normal file
96
tests/sectorBuilder.test.ts
Normal file
@@ -0,0 +1,96 @@
|
||||
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('应生成多文本单元并按角度分配', () => {
|
||||
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');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user