Files
XCDesktop/api/modules/todo/__tests__/parser.test.ts
2026-03-08 01:34:54 +08:00

172 lines
4.7 KiB
TypeScript

import { describe, it, expect } from 'vitest'
import { parseTodoContent, generateTodoContent } from '../parser.js'
import type { DayTodo } from '../types.js'
describe('parseTodoContent', () => {
it('should parse basic todo content correctly', () => {
const content = `## 2024-01-01
- √ 完成工作
- ○ 购物`
const result = parseTodoContent(content)
expect(result).toHaveLength(1)
expect(result[0].date).toBe('2024-01-01')
expect(result[0].items).toHaveLength(2)
expect(result[0].items[0].content).toBe('完成工作')
expect(result[0].items[1].content).toBe('购物')
})
it('should correctly identify completed status with √', () => {
const content = `## 2024-01-01
- √ 已完成任务`
const result = parseTodoContent(content)
expect(result[0].items[0].completed).toBe(true)
})
it('should correctly identify incomplete status with ○', () => {
const content = `## 2024-01-01
- ○ 未完成任务`
const result = parseTodoContent(content)
expect(result[0].items[0].completed).toBe(false)
})
it('should parse multiple days correctly', () => {
const content = `## 2024-01-01
- √ 第一天任务
## 2024-01-02
- ○ 第二天任务
## 2024-01-03
- √ 第三天任务`
const result = parseTodoContent(content)
expect(result).toHaveLength(3)
expect(result[0].date).toBe('2024-01-01')
expect(result[1].date).toBe('2024-01-02')
expect(result[2].date).toBe('2024-01-03')
expect(result[0].items[0].content).toBe('第一天任务')
expect(result[1].items[0].content).toBe('第二天任务')
expect(result[2].items[0].content).toBe('第三天任务')
})
it('should handle empty content', () => {
const content = ''
const result = parseTodoContent(content)
expect(result).toHaveLength(0)
})
it('should ignore invalid format lines', () => {
const content = `## 2024-01-01
这是一行普通文本
- 无效格式
- x 错误的标记
random line
- √ 有效的任务`
const result = parseTodoContent(content)
expect(result).toHaveLength(1)
expect(result[0].items).toHaveLength(1)
expect(result[0].items[0].content).toBe('有效的任务')
})
it('should generate unique IDs for items', () => {
const content = `## 2024-01-01
- √ 任务一
- ○ 任务二
- √ 任务三`
const result = parseTodoContent(content)
expect(result[0].items[0].id).toBe('2024-01-01-0')
expect(result[0].items[1].id).toBe('2024-01-01-1')
expect(result[0].items[2].id).toBe('2024-01-01-2')
})
})
describe('generateTodoContent', () => {
it('should generate basic todo content correctly', () => {
const dayTodos: DayTodo[] = [
{
date: '2024-01-01',
items: [
{ id: '2024-01-01-0', content: '完成工作', completed: true },
{ id: '2024-01-01-1', content: '购物', completed: false }
]
}
]
const result = generateTodoContent(dayTodos)
expect(result).toBe(`## 2024-01-01
- √ 完成工作
- ○ 购物`)
})
it('should include completed status in generated content', () => {
const dayTodos: DayTodo[] = [
{
date: '2024-01-01',
items: [
{ id: '2024-01-01-0', content: '已完成', completed: true },
{ id: '2024-01-01-1', content: '未完成', completed: false }
]
}
]
const result = generateTodoContent(dayTodos)
expect(result).toContain('√ 已完成')
expect(result).toContain('○ 未完成')
})
it('should sort dates in ascending order', () => {
const dayTodos: DayTodo[] = [
{ date: '2024-01-03', items: [{ id: '1', content: '第三天', completed: false }] },
{ date: '2024-01-01', items: [{ id: '2', content: '第一天', completed: false }] },
{ date: '2024-01-02', items: [{ id: '3', content: '第二天', completed: false }] }
]
const result = generateTodoContent(dayTodos)
const firstDateIndex = result.indexOf('2024-01-01')
const secondDateIndex = result.indexOf('2024-01-02')
const thirdDateIndex = result.indexOf('2024-01-03')
expect(firstDateIndex).toBeLessThan(secondDateIndex)
expect(secondDateIndex).toBeLessThan(thirdDateIndex)
})
it('should handle empty array', () => {
const dayTodos: DayTodo[] = []
const result = generateTodoContent(dayTodos)
expect(result).toBe('')
})
it('should generate content for multiple days with sorting', () => {
const dayTodos: DayTodo[] = [
{ date: '2024-01-02', items: [{ id: '1', content: '第二天', completed: true }] },
{ date: '2024-01-01', items: [{ id: '2', content: '第一天', completed: false }] }
]
const result = generateTodoContent(dayTodos)
expect(result).toBe(`## 2024-01-01
- ○ 第一天
## 2024-01-02
- √ 第二天`)
})
})