Add course schedules for ISF and ITZS programs for 2026 and 2024 sessions

- Created new snapshot files for ISF credits and daily schedules for the 26-АРХ and 26-ПГС programs.
- Added summer 2026 and winter 2024 exam schedules for the 23-ИТзс program, detailing lectures, labs, and consultations.
This commit is contained in:
2026-10-19 22:55:28 +03:00
parent 15851b26cd
commit e38c388462
24 changed files with 73775 additions and 70942 deletions

84
test/diagnostics.test.js Normal file
View File

@@ -0,0 +1,84 @@
import { test } from "node:test";
import assert from "node:assert/strict";
import { diagnose, catalogDiagnostics } from "../server/diagnostics.js";
const lesson = (raw, fields = {}) => ({
day: 1,
start: "09:00",
end: "10:20",
subject: raw,
condition: "",
weekRanges: null,
dates: [],
date: null,
groups: ["25-АРХ"],
subgroups: [],
raw,
...fields,
});
const codes = (...lessons) =>
diagnose({ academicYear: "2026", groups: ["25-АРХ"], lessons }).map((p) => p.code);
test("Диагностика: обычные занятия без замечаний", () => {
assert.deepEqual(
codes(
lesson("Химия (л.) Иванов И.И. 101", { subject: "Химия" }),
lesson("1-8н. Физика", { subject: "Физика", condition: "1-8н.", weekRanges: [[1, 8]] }),
lesson("Единый день 07.09;14.09", { subject: "Единый день", dates: ["2026-09-07", "2026-09-14"] }),
),
[],
);
});
test("Диагностика: пометка недель прочитана не целиком", () => {
assert.deepEqual(
codes(lesson("1-4н.;6-12н. Политэкономия", { subject: "6-12н. Политэкономия", condition: "1-4н.", weekRanges: [[1, 4]] })),
["weeks_partly"],
);
});
test("Диагностика: дата и время в начале ячейки", () => {
assert.deepEqual(codes(lesson("24.11. Компьютерная графика")), ["date_in_subject"]);
assert.deepEqual(codes(lesson("3.12 Микроконтроллеры")), ["date_in_subject"]);
assert.deepEqual(codes(lesson("9.00 Информационный час")), ["time_in_subject"]);
assert.deepEqual(codes(lesson("11:10-11:30 – информационный час")), ["time_in_subject"]);
});
test("Диагностика: опечатка в дате, нечитаемые недели, даты не того дня", () => {
assert.deepEqual(
codes(lesson("19,11, 03.12, 17.12 Микроконтроллеры", { subject: "Микроконтроллеры", condition: "19,11,", weekRanges: null })),
["weeks_like_date"],
);
assert.deepEqual(
codes(lesson("2,6-12-16н Управление проектами", { subject: "Управление проектами", condition: "2,6-12-16н" })),
["weeks_unreadable"],
);
// 2026-10-13 is a Tuesday, the row is Monday's.
assert.deepEqual(codes(lesson("13.10 Информационный час", { subject: "Информационный час", date: "2026-10-13" })), [
"date_weekday",
]);
assert.deepEqual(codes(lesson("15 октября Экскурсия", { subject: "Экскурсия" })), ["dates_unread"]);
});
test("Диагностика каталога: фильтры по группе и коду", () => {
const doc = (id, groups, lessons) => ({
id,
file: { name: `${id}.docx`, faculty: "ИСФ" },
schedule: { academicYear: "2026", groups, lessons, source: {} },
});
const idx = {
builtAt: "2026-10-19T00:00:00Z",
failed: [],
docs: [
doc("a", ["25-АРХ"], [lesson("9.00 Информационный час")]),
doc("b", ["24-ДС"], [lesson("3.12 Химия", { groups: ["24-ДС"] })]),
doc("c", ["23-ИТ"], [lesson("Химия", { groups: ["23-ИТ"] })]),
],
};
const all = catalogDiagnostics(idx);
assert.equal(all.documents, 3);
assert.equal(all.problems, 2);
assert.deepEqual(all.counts, { time_in_subject: 1, date_in_subject: 1 });
assert.deepEqual(catalogDiagnostics(idx, { group: "24-дс" }).items.map((i) => i.doc.id), ["b"]);
assert.deepEqual(catalogDiagnostics(idx, { code: "time_in_subject" }).items.map((i) => i.doc.id), ["a"]);
});