172 lines
4.7 KiB
TypeScript
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
|
||
|
|
- √ 第二天`)
|
||
|
|
})
|
||
|
|
})
|