/** * 指标变化规则纯函数单测 * 规则来源:design.md §8 变化颜色与箭头规则表 */ import * as ic from '@/utils/indicator-change' describe('indicator-change 变化规则', () => { describe('resolveChangeStyle(goodDirection, movement)', () => { test('higher_is_better + up → 改善/绿 ↑', () => { const s = ic.resolveChangeStyle('higher_is_better', 'up') expect(s.trendLabel).toBe('改善') expect(s.cssClass).toBe('impr-up') expect(s.arrow).toBe('↑') }) test('higher_is_better + down → 恶化/红 ↓', () => { const s = ic.resolveChangeStyle('higher_is_better', 'down') expect(s.trendLabel).toBe('恶化') expect(s.cssClass).toBe('worst-down') expect(s.arrow).toBe('↓') }) test('lower_is_better + up → 恶化/红 ↑ (如炎症水平上升)', () => { const s = ic.resolveChangeStyle('lower_is_better', 'up') expect(s.trendLabel).toBe('恶化') expect(s.cssClass).toBe('worst-up') expect(s.arrow).toBe('↑') }) test('lower_is_better + down → 改善/绿 ↓ (如炎症水平下降)', () => { const s = ic.resolveChangeStyle('lower_is_better', 'down') expect(s.trendLabel).toBe('改善') expect(s.cssClass).toBe('impr-down') expect(s.arrow).toBe('↓') }) test('neutral + up/down → 中性/灰', () => { const up = ic.resolveChangeStyle('neutral', 'up') const down = ic.resolveChangeStyle('neutral', 'down') expect(up.trendLabel).toBe('中性') expect(up.cssClass).toBe('neutral-up') expect(down.cssClass).toBe('neutral-down') }) test('flat → 无变化/灰 →', () => { const s = ic.resolveChangeStyle('higher_is_better', 'flat') expect(s.trendLabel).toBe('中性') expect(s.cssClass).toBe('flat') expect(s.arrow).toBe('→') }) test('未知 goodDirection 兜底为中性', () => { const s = ic.resolveChangeStyle('unknown_direction', 'up') expect(s.cssClass).toBe('neutral-up') }) }) describe('formatDelta(delta, deltaPct)', () => { test('正 delta 显示 + 并带百分比', () => { expect(ic.formatDelta(2, 100)).toBe('+2 (+100%)') }) test('负 delta 显示 -', () => { expect(ic.formatDelta(-1.5, -30)).toBe('-1.5 (-30%)') }) test('null 安全', () => { expect(ic.formatDelta(null, null)).toBe('--') expect(ic.formatDelta(0, 0)).toBe('0 (0%)') }) }) })