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]]); });