import { describe, it, expect } from 'vitest'; import { buildDegreeRing } from '../src/degreeRing'; import type { DegreeRingConfig } from '../src/types'; describe('degreeRing', () => { const baseConfig: DegreeRingConfig = { rInner: 90, rOuter: 100, showDegree: 1, mode: 'both', opacity: 0.3, tickLength: 6, tickLengthStep: 1, majorTick: 10, minorTick: 5, microTick: 1, tickColor: '#ffffff', ringColor: '#ffffff', }; it('应生成主/次/微刻度并支持 both 模式', () => { const data = buildDegreeRing(baseConfig); const angle0 = data.ticks.filter((tick) => tick.angle === 0); expect(angle0).toHaveLength(2); expect(angle0[0].length).toBe(6); expect(angle0[1].length).toBe(6); }); it('应按 majorTick 生成度数标签', () => { const data = buildDegreeRing(baseConfig); expect(data.labels?.length).toBe(36); expect(data.labels?.[0].text).toBe('0'); expect(data.labels?.[1].text).toBe('10'); }); it('inner 模式应从 rInner 向外绘制', () => { const data = buildDegreeRing({ ...baseConfig, mode: 'inner' }); const tick = data.ticks[0]; expect(tick.startR).toBe(baseConfig.rInner); expect(tick.endR).toBe(baseConfig.rInner + tick.length); }); it('tickLengthStep 应影响次/微刻度长度', () => { const data = buildDegreeRing({ ...baseConfig, tickLength: 6, tickLengthStep: 2 }); const major = data.ticks.find((tick) => tick.angle === 0); const minor = data.ticks.find((tick) => tick.angle === 5 && tick.type === 'minor'); const micro = data.ticks.find((tick) => tick.angle === 1 && tick.type === 'micro'); expect(major?.length).toBe(6); expect(minor?.length).toBe(4); expect(micro?.length).toBe(2); }); it('度数标签应生成 textPath', () => { const data = buildDegreeRing(baseConfig); const label = data.labels?.[0]; expect(label?.textPath).toContain('M '); }); });