32 lines
1.5 KiB
JavaScript
32 lines
1.5 KiB
JavaScript
|
|
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]]);
|
||
|
|
});
|