feat: 任务解析器及测试

This commit is contained in:
2026-06-08 17:18:06 +08:00
parent 9cdf5302be
commit ca7a86e888
2 changed files with 70 additions and 0 deletions

16
src/core/task-parser.ts Normal file
View File

@@ -0,0 +1,16 @@
import type { TaskItem } from "../types.ts";
export function parseTasks(content: string): TaskItem[] {
const tasks: TaskItem[] = [];
const lines = content.split("\n");
for (const line of lines) {
const match = line.match(/^[\s]*- \[([ xX])\] (.*)$/);
if (match) {
tasks.push({
checked: match[1] !== " ",
text: match[2],
});
}
}
return tasks;
}

View File

@@ -0,0 +1,54 @@
import { describe, it, expect } from "bun:test";
import { parseTasks } from "../../src/core/task-parser.ts";
describe("parseTasks", () => {
it("解析标准 checkbox 格式", () => {
const content = `- [ ] 任务一
- [ ] 任务二
- [x] 任务三`;
const tasks = parseTasks(content);
expect(tasks).toHaveLength(3);
expect(tasks[0]).toEqual({ checked: false, text: "任务一" });
expect(tasks[1]).toEqual({ checked: false, text: "任务二" });
expect(tasks[2]).toEqual({ checked: true, text: "任务三" });
});
it("跳过非 checkbox 行", () => {
const content = `# 标题
一些描述
- [ ] 任务一
普通文本
- [x] 任务二`;
const tasks = parseTasks(content);
expect(tasks).toHaveLength(2);
});
it("空内容返回空数组", () => {
expect(parseTasks("")).toEqual([]);
expect(parseTasks("# 只有标题")).toEqual([]);
});
it("支持大写 X 标记", () => {
const content = `- [X] 大写标记`;
const tasks = parseTasks(content);
expect(tasks).toHaveLength(1);
expect(tasks[0].checked).toBe(true);
});
it("支持缩进的 checkbox", () => {
const content = ` - [ ] 缩进任务`;
const tasks = parseTasks(content);
expect(tasks).toHaveLength(1);
expect(tasks[0].text).toBe("缩进任务");
});
it("计算已完成和总数", () => {
const content = `- [x] 已完成
- [ ] 未完成
- [x] 另一个完成`;
const tasks = parseTasks(content);
const completed = tasks.filter((t) => t.checked).length;
expect(completed).toBe(2);
expect(tasks.length).toBe(3);
});
});