// ============================================================ // BP PERCENTILE parity tests. Vectors captured directly from the // vanilla calculators.js height-LMS + Rosner spline coefficients. // ============================================================ import { describe, expect, it } from 'vitest'; import * as fs from 'node:fs'; import * as path from 'node:path'; import { computeBp, type Sex, type BpClassification } from './bp'; interface BpCase { name: string; inputs: { ageYears: number; sex: Sex; heightCm: number; sbp: number; dbp: number }; output: { sysPercentile: number; diaPercentile: number; heightPercentile: number; sysClass: BpClassification; diaClass: BpClassification; classification: BpClassification; }; } interface Vectors { bp: BpCase[] } const vectors: Vectors = JSON.parse( fs.readFileSync(path.join(__dirname, '..', '..', 'e2e', 'fixtures', 'calc-vectors.json'), 'utf8'), ); describe('AAP 2017 BP percentile — parity with vanilla calculators.js', () => { it.each(vectors.bp)('$name', ({ inputs, output }) => { const actual = computeBp(inputs.ageYears, inputs.sex, inputs.heightCm, inputs.sbp, inputs.dbp); expect(actual.sysPercentile).toBe(output.sysPercentile); expect(actual.diaPercentile).toBe(output.diaPercentile); expect(actual.heightPercentile).toBeCloseTo(output.heightPercentile, 6); expect(actual.sysClass).toBe(output.sysClass); expect(actual.diaClass).toBe(output.diaClass); expect(actual.classification).toBe(output.classification); }); });