Dienstplan-Pro/variants.test.js

48 lines
2.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const { test } = require('node:test');
const assert = require('node:assert');
const { classify, variant1, variant2, variant3 } = require('./variants');
const noHolidays = { isHoliday: () => false, isDayBeforeHoliday: () => false };
const d = (s) => new Date(s + 'T12:00:00');
test('classify: echte Wochentage', () => {
assert.strictEqual(classify(d('2026-06-12'), noHolidays), 'fr'); // Freitag
assert.strictEqual(classify(d('2026-06-13'), noHolidays), 'sa'); // Samstag
assert.strictEqual(classify(d('2026-06-14'), noHolidays), 'so'); // Sonntag
assert.strictEqual(classify(d('2026-06-10'), noHolidays), 'weekday'); // Mittwoch
});
test('classify: Feiertags-Verschiebung (MoDo)', () => {
const hp = { isHoliday: (x) => x.getDate() === 4, isDayBeforeHoliday: (x) => x.getDate() === 3 };
assert.strictEqual(classify(d('2026-06-04'), hp), 'so'); // Do-Feiertag → so
assert.strictEqual(classify(d('2026-06-03'), hp), 'fr'); // Tag davor → fr
const sandwich = { isHoliday: (x) => x.getDate() === 4, isDayBeforeHoliday: (x) => x.getDate() === 4 };
assert.strictEqual(classify(d('2026-06-04'), sandwich), 'sa'); // Sandwich → sa
});
test('Juni-Fall Jizdan: V3 gewinnt mit 500 €', () => {
const c = { fr: 2, sa: 0, so: 0, weekday: 2 };
assert.strictEqual(variant3(c, false).bonus, 500); // Pool 2 abgezogen, 2 Werktage × 250
assert.strictEqual(variant1(c, false).eligible, false); // Werktage 2 < 3
assert.strictEqual(variant2(c, false).eligible, false); // kein sa
});
test('Juni-Fall Giurgiu: V1=450, V2=700, V3=750 (Gewinner V3)', () => {
const c = { fr: 0, sa: 1, so: 1, weekday: 3 };
assert.strictEqual(variant1(c, false).bonus, 450);
assert.strictEqual(variant2(c, false).bonus, 700);
assert.strictEqual(variant3(c, false).bonus, 750);
});
test('Juni-Fall Günes: keine Variante greift → 0 €', () => {
const c = { fr: 0, sa: 1, so: 0, weekday: 0 };
assert.strictEqual(variant1(c, false).eligible, false);
assert.strictEqual(variant2(c, false).eligible, false);
assert.strictEqual(variant3(c, false).eligible, false);
});
test('Urlaubsmodus halbiert Schwellen: Günes mit Urlaub → V2 greift', () => {
const c = { fr: 0, sa: 0.5, so: 0, weekday: 1 };
// Urlaub: V2 Schwelle sa≥0.5 UND weekday≥1 → greift; Abzug 0.5 sa + 1 weekday → 0 bezahlt
assert.strictEqual(variant2(c, true).eligible, true);
});