import { describe, expect, it } from 'vitest'; import { buildPercentileScale, calculateHistogramMean, formatFilterValue, formatTransactionDate, parseInputValue, roundedPercentages, } from './format'; describe('format utilities', () => { it('formats compact filter values and transaction dates', () => { expect(formatFilterValue(1250)).toBe('1.3k'); expect(formatFilterValue(1_250_000)).toBe('1.3M'); expect(formatFilterValue(1250, true)).toBe('1250'); expect(formatFilterValue(87.4, { raw: true, suffix: '%' })).toBe('87%'); expect(formatTransactionDate(2024.5)).toBe('Jul 2024'); }); it('parses user-entered compact numeric values', () => { expect(parseInputValue('£1.25M', { prefix: '£', step: 5000 })).toBe(1_250_000); expect(parseInputValue('45 sqm', { suffix: ' sqm' })).toBe(45); expect(parseInputValue('2.5万')).toBe(25_000); expect(parseInputValue('not a number')).toBeNull(); }); it('rounds percentages so displayed values sum to 100', () => { expect(roundedPercentages([1, 1, 1], 3)).toEqual([34, 33, 33]); expect(roundedPercentages([1, 2, 3], 6, 1)).toEqual([16.7, 33.3, 50]); expect(roundedPercentages([5, 5], 0)).toEqual([0, 0]); }); it('maps histogram percentiles and weighted means consistently', () => { const histogram = { min: 0, p1: 10, p99: 90, max: 100, counts: [10, 80, 10] }; const scale = buildPercentileScale(histogram); expect(scale.toValue(0)).toBe(0); expect(scale.toValue(50)).toBeCloseTo(50); expect(scale.toPercentile(50)).toBeCloseTo(50); expect(calculateHistogramMean(histogram)).toBeCloseTo(50); }); });