| 12345678910111213141516171819202122232425262728293031 |
- import { createServer } from 'vite'
- import assert from 'node:assert/strict'
- const vite = await createServer({ server: { middlewareMode: true }, appType: 'custom', logLevel: 'error' })
- try {
- const { editableOutlinePages, confirmedCoursewareOutline, inspectConfirmedOutline } = await vite.ssrLoadModule('/src/utils/aiCoursewareOutline.ts')
- const outline = { title: '课堂', textbookResearch: { teachingObjectives: ['旧目标'] }, pages: Array.from({ length: 8 }, (_, i) => ({ pageNo: i + 1, type: i ? 'practice_check' : 'cover', title: `页面${i}`, durationMinutes: 5, bullets: ['旧内容'], imageKeywords: [], objectiveIds: ['1'] })) }
- const pages = editableOutlinePages(outline)
- pages[1].page.title = '老师修改的标题'
- pages[1].pointsText = ' 听辨强弱\n\n用拍手表现 '
- pages.splice(2, 0, pages.splice(1, 1)[0])
- const confirmed = confirmedCoursewareOutline(outline, ' 能分辨声音强弱\n能用拍手表现 ', pages)
- assert.deepEqual(inspectConfirmedOutline(confirmed, 40), [])
- assert.deepEqual(confirmed.textbookResearch.teachingObjectives, ['能分辨声音强弱', '能用拍手表现'])
- assert.equal(confirmed.pages[2].title, '老师修改的标题')
- assert.deepEqual(confirmed.pages.map(p => p.pageNo), [1,2,3,4,5,6,7,8])
- assert.deepEqual(confirmed.pages[2].studentContent.points, ['听辨强弱','用拍手表现'])
- assert.deepEqual(confirmed.pages[2].objectiveIds, [])
- assert.equal(outline.pages[1].title, '页面1')
- const invalid = structuredClone(confirmed)
- invalid.pages[1].title = ''
- invalid.pages[2].durationMinutes = 0
- invalid.textbookResearch.teachingObjectives = []
- assert.ok(inspectConfirmedOutline(invalid, 40).some(s => s.includes('教学目标')))
- assert.ok(inspectConfirmedOutline(invalid, 40).some(s => s.includes('第2页标题')))
- assert.ok(inspectConfirmedOutline(invalid, 40).some(s => s.includes('第3页用时')))
- const optional = structuredClone(confirmed)
- optional.pages.push({ ...optional.pages[1], pageNo: 9, durationMinutes: 4, optional: true })
- assert.deepEqual(inspectConfirmedOutline(optional, 40), [])
- console.log('PASS: edited goals, 8-page outline, reordered pages, preserved content, invalid inputs, optional timing and source isolation')
- } finally { await vite.close() }
|