test(calc): Story 5.3/5.4 — variants.js node-testbar + Regressionstests (Juni-Faelle); Report-Splice als Paste-Artefakt verifiziert (kein Code-Bug)

This commit is contained in:
Kenearos 2026-07-07 23:21:59 +02:00
parent 4f0f143d68
commit bb4e0d2bbb
2 changed files with 59 additions and 6 deletions

View file

@ -124,9 +124,14 @@ function variant3(classified, isVacation) {
return payResult(3, threshold, classified, deduction);
}
// Expose globally
window.classify = classify;
window.classifyDuties = classifyDuties;
window.variant1 = variant1;
window.variant2 = variant2;
window.variant3 = variant3;
// Expose globally (Browser) + require-bar (Node-Tests)
if (typeof window !== 'undefined') {
window.classify = classify;
window.classifyDuties = classifyDuties;
window.variant1 = variant1;
window.variant2 = variant2;
window.variant3 = variant3;
}
if (typeof module !== 'undefined' && module.exports) {
module.exports = { classify, classifyDuties, variant1, variant2, variant3, RATE_NORMAL, RATE_WEEKEND };
}

48
variants.test.js Normal file
View file

@ -0,0 +1,48 @@
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);
});