naissance-jerry/test/scoring.test.js

32 lines
1.5 KiB
JavaScript
Raw Permalink Normal View History

2026-10-14 21:18:47 +02:00
const test = require('node:test');
const assert = require('node:assert');
const { scorePrediction, leaderboard } = require('../src/scoring');
const result = { birth_date: '2026-11-20', birth_time: '03:30', sex: 'F', weight_g: 3400, length_cm: 50, first_name: 'Léa' };
test('pronostic parfait = 100 points', () => {
assert.strictEqual(scorePrediction({ ...result, first_name: 'lea' }, result).total, 100);
});
test('écarts dégressifs', () => {
const s = scorePrediction({ birth_date: '2026-11-22', birth_time: '06:30', sex: 'M', weight_g: 3900, length_cm: 52, first_name: 'Lucie' }, result);
assert.deepStrictEqual(s.details, { date: 24, time: 7.5, sex: 0, weight: 7.5, length: 11.3, name: 3 });
});
test("l'heure est circulaire autour de minuit", () => {
const s = scorePrediction({ ...result, birth_time: '23:30' }, { ...result, birth_time: '00:30' });
assert.strictEqual(s.gaps.minutes, 60);
});
test('aucun point négatif', () => {
const s = scorePrediction({ birth_date: '2027-01-01', birth_time: '15:30', sex: 'M', weight_g: 1000, length_cm: 30, first_name: 'Max' }, result);
assert.strictEqual(s.total, 0);
});
test('égalité départagée par la saisie la plus ancienne', () => {
const a = { ...result, user_id: 'a', updated_at: '2026-10-02T00:00:00Z' };
const b = { ...result, user_id: 'b', updated_at: '2026-10-01T00:00:00Z' };
const lb = leaderboard([a, b], result);
assert.deepStrictEqual(lb.map((p) => [p.user_id, p.rank]), [['b', 1], ['a', 2]]);
});