This commit is contained in:
2026-07-26 18:11:57 +02:00
parent d408e01ab5
commit 21a3b34471
139 changed files with 32872 additions and 0 deletions
+137
View File
@@ -0,0 +1,137 @@
/**
* Smoke-Checks für Teilaufgabe 04 (Kalenderregeln).
* Bündelt die echten Module via esbuild und prüft die Abnahmekriterien.
*/
import { execSync } from "node:child_process";
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
import { dirname, join } from "node:path";
import { fileURLToPath, pathToFileURL } from "node:url";
const __dirname = dirname(fileURLToPath(import.meta.url));
const webRoot = join(__dirname, "..");
const outDir = join(__dirname, ".tmp-verify");
const entry = join(outDir, "entry.mjs");
const bundle = join(outDir, "bundle.mjs");
function assert(cond, msg) {
if (!cond) throw new Error(`FAIL: ${msg}`);
}
mkdirSync(outDir, { recursive: true });
writeFileSync(
entry,
`
export {
feiertagActivityLine,
firstOpenDay,
getDayType,
getPublicHoliday,
getWeekNumber,
isInSchoolHoliday,
isWeekend,
weekNeedsSchool,
weekWorkdays,
} from "../../src/lib/calendar.ts";
export { createEmptyWeek } from "../../src/lib/storage.ts";
export { pickRandomSuggestions } from "../../src/lib/suggest.ts";
export { buildActivityLines, buildSchoolTopics } from "../../src/lib/weekExport.ts";
`,
);
execSync(
`npx esbuild "${entry}" --bundle --platform=node --format=esm --outfile="${bundle}"`,
{ cwd: webRoot, stdio: "inherit" },
);
const m = await import(pathToFileURL(bundle).href);
// 1) Normale Schulwoche nach Osterferien
const schoolWeek = "2026-04-13";
assert(
JSON.stringify(m.weekWorkdays(schoolWeek).map(m.getDayType)) ===
JSON.stringify(["betrieb", "schule", "betrieb", "schule", "betrieb"]),
"Schulwoche 13.04.2026: Di/Do = Schule",
);
assert(m.weekNeedsSchool(schoolWeek) === true, "Schulwoche braucht Schule");
// 2) Ferien → Betrieb auch Di/Do
assert(m.isInSchoolHoliday("2026-04-07") === "Osterferien", "Di in Osterferien");
assert(m.getDayType("2026-04-07") === "betrieb", "Di Ferien = Betrieb");
assert(m.getDayType("2026-04-09") === "betrieb", "Do Ferien = Betrieb");
// 3) Wochenende überspringen
assert(m.isWeekend("2026-04-11") && m.isWeekend("2026-04-12"), "Sa/So");
assert(
!m.weekWorkdays("2026-04-06").includes("2026-04-11"),
"Sa nicht in Workdays",
);
// 4) Abnahme Woche 79
const w79 = "2026-04-06";
assert(m.getWeekNumber(w79) === 79, "Wochennummer 79");
assert(m.firstOpenDay() === "2026-04-06", "Starttag nach Heft 78");
assert(m.getDayType(w79) === "feiertag", "Ostermontag Feiertag");
assert(m.getPublicHoliday(w79) === "Ostermontag", "Ostermontag Name");
assert(
m.weekWorkdays(w79).slice(1).every((d) => m.getDayType(d) === "betrieb"),
"Rest Woche 79 = Betrieb",
);
assert(m.weekNeedsSchool(w79) === false, "Woche 79 keine Schule");
assert(
JSON.stringify(m.createEmptyWeek(w79).schoolTopics) ===
JSON.stringify(["Ferien"]),
"Berufsschule-Feld = Ferien",
);
assert(m.feiertagActivityLine(w79) === "Montag Feiertag", "Feiertag-Zeile");
// 5) Export-Zeilen
const week = m.createEmptyWeek(w79);
week.activities = ["Reifenlager inventarisiert"];
assert(
JSON.stringify(m.buildActivityLines(week)) ===
JSON.stringify(["Reifenlager inventarisiert", "Montag Feiertag"]),
"Export enthält Montag Feiertag",
);
assert(
JSON.stringify(m.buildSchoolTopics(week)) === JSON.stringify(["Ferien"]),
"Export Schule = Ferien",
);
// 6) Vorschlags-Pool
const ferienPool = m.pickRandomSuggestions(w79, 8, [], []);
assert(
ferienPool.every((s) => s.type === "betrieb"),
"Ferienwoche: nur Betrieb-Vorschläge",
);
const schulPool = m.pickRandomSuggestions(schoolWeek, 8, [], []);
assert(
schulPool.some((s) => s.type === "schule") &&
schulPool.some((s) => s.type === "betrieb"),
"Schulwoche: Betrieb + Schule im Pool",
);
// 7) Wochennummern relativ zu 78
assert(m.getWeekNumber("2026-03-30") === 78, "Woche 78");
assert(m.getWeekNumber("2026-04-13") === 80, "Woche 80");
// 8) Pflicht-Feiertage 2026
for (const iso of [
"2026-01-01",
"2026-01-06",
"2026-04-03",
"2026-04-06",
"2026-05-01",
"2026-05-14",
"2026-05-25",
"2026-06-04",
"2026-10-03",
"2026-11-01",
"2026-12-25",
"2026-12-26",
]) {
assert(Boolean(m.getPublicHoliday(iso)), `Feiertag ${iso}`);
assert(m.getDayType(iso) === "feiertag", `Typ Feiertag ${iso}`);
}
rmSync(outDir, { recursive: true, force: true });
console.log("OK alle Kalender-Smoke-Checks bestanden.");