// ============================================================ // FENTON 2013 parity tests — drives the TS port against vectors // captured from the authoritative vanilla implementation. // ============================================================ import { describe, expect, it } from 'vitest'; import * as fs from 'node:fs'; import * as path from 'node:path'; import { fentonWeightForAge, neonatalAssess, type Sex } from './fenton'; interface FentonCase { name: string; inputs: { sex: Sex; gaWeeks: number; weightGrams: number }; output: { L: number; M: number; S: number; z: number; percentile: number }; } interface NeonatalCase { name: string; inputs: { weeks: number; days: number; weightGrams: number; sex: Sex }; output: { gaDecimal: number; L: number; M: number; S: number; z: number; percentile: number; expectedWeight: number }; } interface Vectors { fenton: FentonCase[]; neonatal: NeonatalCase[] } const vectors: Vectors = JSON.parse( fs.readFileSync(path.join(__dirname, '..', '..', 'e2e', 'fixtures', 'calc-vectors.json'), 'utf8'), ); describe('Fenton 2013 weight-for-GA — parity with vanilla calculators.js', () => { it.each(vectors.fenton)('$name', ({ inputs, output }) => { const actual = fentonWeightForAge(inputs.gaWeeks, inputs.weightGrams, inputs.sex); expect(actual.L).toBeCloseTo(output.L, 10); expect(actual.M).toBeCloseTo(output.M, 6); expect(actual.S).toBeCloseTo(output.S, 10); expect(actual.z).toBeCloseTo(output.z, 10); expect(actual.percentile).toBeCloseTo(output.percentile, 10); }); }); describe('Neonatal peditools Fenton — parity with vanilla bedside/neonatal.js', () => { it.each(vectors.neonatal)('$name', ({ inputs, output }) => { const actual = neonatalAssess(inputs.weeks, inputs.days, inputs.weightGrams, inputs.sex); expect(actual.gaDecimal).toBeCloseTo(output.gaDecimal, 10); expect(actual.L).toBeCloseTo(output.L, 10); expect(actual.M).toBeCloseTo(output.M, 6); expect(actual.S).toBeCloseTo(output.S, 10); expect(actual.z).toBeCloseTo(output.z, 10); expect(actual.percentile).toBeCloseTo(output.percentile, 10); expect(actual.expectedWeight).toBe(output.expectedWeight); }); });