const assert = require("assert"); const fs = require("fs"); const path = require("path"); const root = path.resolve(__dirname, ".."); const read = (file) => fs.readFileSync(path.join(root, file), "utf8"); const taskPage = read("src/views/teacherEnd/task/index.vue"); const sidebar = read("src/layout/components/Sidebar/index.vue"); const api = read("src/api/teacher.js"); assert(taskPage.includes("listClassTrainingTasks"), "task allocation must use training tasks as its data source"); assert(taskPage.includes("listClassTrainingTasks"), "task allocation must load training tasks for the selected teaching class"); assert(taskPage.includes("await listClassTrainingTasks(classId.value, { enabledOnly: false })"), "class task loading must request disabled and enabled tasks"); assert(taskPage.includes("tasks.value = [];\n const res = await listClassTrainingTasks"), "class task loading must clear prior class rows before requesting the selected class"); assert((taskPage.match(/const requestedClassId = classId\.value;/g) || []).length >= 2, "task and publication loading must capture the requested class"); assert((taskPage.match(/if \(classId\.value !== requestedClassId\) return;/g) || []).length >= 2, "stale class requests must not update task rows or publication selection"); assert(taskPage.includes("getTaskPublication"), "task allocation must load the selected class publication state"); assert(taskPage.includes("tasks.value.map((task) => task.taskKey)"), "an unconfigured class must default to all tasks selected"); assert(taskPage.includes("保存发布配置"), "task allocation must require an explicit save"); assert(api.includes("selectTaskPublicationByClassId"), "publication API missing"); assert(sidebar.includes("filterStudentCourseNavigation"), "student menu must be filtered by published training tasks"); assert(sidebar.includes("publishedTaskKeys"), "student menu must retain published task keys"); console.log("task publication front-end contract passed");