61 lines
1.9 KiB
TypeScript
61 lines
1.9 KiB
TypeScript
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 ');
|
|
});
|
|
});
|