// ============================================================ // BMI-FOR-AGE parity tests. // ============================================================ import { describe, expect, it } from 'vitest'; import * as fs from 'node:fs'; import * as path from 'node:path'; import { computeBmi } from './bmi'; import type { Sex } from './fenton'; interface BmiCase { name: string; inputs: { weightKg: number; heightCm: number; ageMonths: number; sex: Sex }; output: { bmi: number; z: number; percentile: number; L: number; M: number; S: number; classification: { label: string; pctOf95: number; bmi95: number }; }; } interface Vectors { bmi: BmiCase[] } const vectors: Vectors = JSON.parse( fs.readFileSync(path.join(__dirname, '..', '..', 'e2e', 'fixtures', 'calc-vectors.json'), 'utf8'), ); describe('CDC 2000 BMI-for-age — parity with vanilla calculators.js', () => { it.each(vectors.bmi)('$name', ({ inputs, output }) => { const actual = computeBmi(inputs.weightKg, inputs.heightCm, inputs.ageMonths, inputs.sex); expect(actual.bmi).toBeCloseTo(output.bmi, 10); expect(actual.z).toBeCloseTo(output.z, 10); expect(actual.percentile).toBeCloseTo(output.percentile, 6); expect(actual.L).toBeCloseTo(output.L, 10); expect(actual.M).toBeCloseTo(output.M, 10); expect(actual.S).toBeCloseTo(output.S, 10); expect(actual.classification.label).toBe(output.classification.label); expect(actual.classification.pctOf95).toBeCloseTo(output.classification.pctOf95, 6); expect(actual.classification.bmi95).toBeCloseTo(output.classification.bmi95, 10); }); });