these too
This commit is contained in:
parent
d4dde21ad2
commit
90c47afe17
11 changed files with 1045 additions and 0 deletions
42
frontend/src/lib/format.test.ts
Normal file
42
frontend/src/lib/format.test.ts
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
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(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);
|
||||
});
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue