import { describe, expect, it } from 'vitest' import { parseTeachingDesign } from './markdownParser' const standard = `# 个人主页——项目启动 教学设计 | **课题** | **个人主页——项目启动** | |:---|:---| | **课时** | 1课时(40分钟) | | **教学目标** | **知识目标**:认识 HTML。
**技能目标**:创建页面。
**素养目标**:规范操作。 | | **教学重难点** | **重点**:HTML。
**难点**:路径。 | | **教学资源准备** | 浏览器。 | ## 教学过程 | 教学环节 | 教学内容 | 教师活动 | 学生活动 | 设计意图 | |:---|:---|:---|:---|:---| | **1. 导入**
(6分钟) | 展示案例。 | **情境创设**
提问。 | **观察思考**
回答。 | 建立目标。 | ## 板书设计 \`\`\`text HTML → 浏览器 \`\`\` ## 教学成效与反思 | | | |:---|:---| | **教学成效** | 完成页面。 | | **教学反思** | 加强路径讲解。 | ` describe('parseTeachingDesign', () => { it('parses the complete teaching-design structure', () => { const design = parseTeachingDesign('1.md', standard) expect(design.topic).toBe('个人主页——项目启动') expect(design.knowledgeObjective).toBe('认识 HTML。') expect(design.processSteps[0]).toMatchObject({ name: '1. 导入', duration: '6分钟', content: '展示案例。', }) expect(design.boardDesign).toContain('HTML → 浏览器') expect(design.reflection).toBe('加强路径讲解。') expect(design.warnings).toEqual([]) }) it('accepts half-width punctuation and reports missing sections', () => { const markdown = standard .replaceAll(':', ':') .replace(/## 板书设计[\s\S]*?(?=## 教学成效与反思)/, '') const design = parseTeachingDesign('8.md', markdown) expect(design.knowledgeObjective).toBe('认识 HTML。') expect(design.boardDesign).toBe('') expect(design.warnings.some((warning) => warning.code === 'missing-board')).toBe(true) }) it('parses process steps where the step number is outside the bold name', () => { const markdown = standard.replace( '| **1. 导入**
(6分钟) | 展示案例。 | **情境创设**
提问。 | **观察思考**
回答。 | 建立目标。 |', '| 1. **导入**
(6分钟) | 展示案例。 | **情境创设**
提问。 | **观察思考**
回答。 | 建立目标。 |', ) const design = parseTeachingDesign('1.md', markdown) expect(design.processSteps[0]).toMatchObject({ name: '1. 导入', duration: '6分钟', }) }) it('reports a missing title when no level-one heading exists', () => { const markdown = standard.replace('# 个人主页——项目启动 教学设计\n\n', '') const design = parseTeachingDesign('1.md', markdown) expect(design.warnings.some((warning) => warning.code === 'missing-title')).toBe(true) }) })