import { test } from 'node:test' import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import vm from 'node:vm' // Reine Kalenderlogik des Widgets public/embed/unterkunft.js (Task 16): Datei per node:vm laden, data-test="1" macht WKU_LOGIK als __wkuLogik sichtbar. const QUELLE = readFileSync(new URL('../public/embed/unterkunft.js', import.meta.url), 'utf8') function lade() { const doc = { readyState: 'complete', currentScript: { dataset: { test: '1' } }, querySelectorAll: () => [], addEventListener() {} } const ctx = vm.createContext({ document: doc, console }) vm.runInContext(QUELLE, ctx, { filename: 'unterkunft.js' }) return ctx.__wkuLogik } const L = lade() test('ohne data-test bleibt die Logik verborgen', () => { const doc = { readyState: 'complete', currentScript: { dataset: {} }, querySelectorAll: () => [], addEventListener() {} } const ctx = vm.createContext({ document: doc }) vm.runInContext(QUELLE, ctx) assert.equal(ctx.__wkuLogik, undefined) }) test('monatsRaster: Montag zuerst, 1.11.2026 (Sonntag) hat 6 Leerfelder, 30 Tage', () => { const r = L.monatsRaster(2026, 11) assert.equal(r.length % 7, 0) assert.ok(r.slice(0, 6).every((z) => z.tag === null)) assert.equal(r[6].tag, '2026-11-01') assert.equal(r.filter((z) => z.tag).length, 30) assert.equal(L.monatsRaster(2026, 2).filter((z) => z.tag).length, 28) assert.equal(L.monatsRaster(2028, 2).filter((z) => z.tag).length, 29) assert.equal(L.monatsRaster(2026, 12)[1].tag, '2026-12-01') // 1.12.2026 ist Dienstag }) test('nachtBelegt: Nacht von von (inklusive) bis bis (exklusive)', () => { const b = [{ von: '2026-11-10', bis: '2026-11-12' }] assert.equal(L.nachtBelegt('2026-11-09', b), false) assert.equal(L.nachtBelegt('2026-11-10', b), true) assert.equal(L.nachtBelegt('2026-11-11', b), true) assert.equal(L.nachtBelegt('2026-11-12', b), false) }) test('waehle: Anreise, Abreise, Neustart', () => { const b = [{ von: '2026-11-20', bis: '2026-11-25' }] let z = L.waehle({}, '2026-11-12', b, 1) assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-12', bis: null }) z = L.waehle(z, '2026-11-15', b, 1) assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-12', bis: '2026-11-15' }) z = L.waehle(z, '2026-11-14', b, 1) // dritter Klick = neue Anreise assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-14', bis: null }) z = L.waehle(z, '2026-11-10', b, 1) // Klick vor Anreise assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-10', bis: null }) }) test('waehle: belegte Nacht dazwischen -> neue Anreise; Abreise am Anreisetag eines Fremdbuchers erlaubt', () => { const b = [{ von: '2026-11-20', bis: '2026-11-25' }] let z = L.waehle({ von: '2026-11-18', bis: null }, '2026-11-27', b, 1) assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-27', bis: null }) z = L.waehle({ von: '2026-11-18', bis: null }, '2026-11-20', b, 1) // Nacht 18., 19. frei, Abreise am 20. assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-18', bis: '2026-11-20' }) z = L.waehle({ von: '2026-11-18', bis: null }, '2026-11-21', b, 1) assert.deepEqual({ von: z.von, bis: z.bis }, { von: '2026-11-18', bis: null }) // Nacht 20. belegt, 21. selbst belegt: weder Abreise noch Anreise, Zustand bleibt }) test('waehle: Anreise auf belegter Nacht nicht moeglich; Anreise am Abreisetag eines Fremdbuchers moeglich', () => { const b = [{ von: '2026-11-20', bis: '2026-11-25' }] const z1 = L.waehle({}, '2026-11-22', b, 1) assert.equal(z1.von, null) const z2 = L.waehle({}, '2026-11-25', b, 1) assert.equal(z2.von, '2026-11-25') }) test('waehle: unter den Mindestnaechten -> Hinweis-Zustand, Anreise bleibt', () => { const z = L.waehle({ von: '2026-11-12', bis: null }, '2026-11-13', [], 3) assert.equal(z.fehler, 'mindestnaechte') assert.equal(z.von, '2026-11-12') assert.equal(z.bis, null) const ok = L.waehle({ von: '2026-11-12', bis: null }, '2026-11-15', [], 3) assert.equal(ok.bis, '2026-11-15') assert.equal(ok.fehler, undefined) }) test('zusammenfassung', () => { assert.equal(L.zusammenfassung('2026-11-12', '2026-11-30'), '12.–30. Nov. · 18 Nächte') assert.equal(L.zusammenfassung('2026-11-28', '2026-12-03'), '28. Nov. – 3. Dez. · 5 Nächte') assert.equal(L.zusammenfassung('2026-11-12', '2026-11-13'), '12.–13. Nov. · 1 Nacht') assert.equal(L.zusammenfassung('2026-12-30', '2027-01-02'), '30. Dez. 2026 – 2. Jan. 2027 · 3 Nächte') assert.equal(L.zusammenfassung('2026-03-01', '2026-03-05').slice(0, 18), '1.–5. März · 4 Näc') })