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'); }); });