gute
This commit is contained in:
@@ -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.");
|
||||
Reference in New Issue
Block a user