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 - √ 第二天`) }) })