From bb4e0d2bbb81a41a4925adafefe7b42e67a4ee15 Mon Sep 17 00:00:00 2001 From: Kenearos Date: Tue, 7 Jul 2026 23:21:59 +0200 Subject: [PATCH] =?UTF-8?q?test(calc):=20Story=205.3/5.4=20=E2=80=94=20var?= =?UTF-8?q?iants.js=20node-testbar=20+=20Regressionstests=20(Juni-Faelle);?= =?UTF-8?q?=20Report-Splice=20als=20Paste-Artefakt=20verifiziert=20(kein?= =?UTF-8?q?=20Code-Bug)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- variants.js | 17 +++++++++++------ variants.test.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 variants.test.js diff --git a/variants.js b/variants.js index 07fb90f..f30bcfa 100644 --- a/variants.js +++ b/variants.js @@ -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 }; +} diff --git a/variants.test.js b/variants.test.js new file mode 100644 index 0000000..4497632 --- /dev/null +++ b/variants.test.js @@ -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 (Mo–Do)', () => { + 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); +});