package main import ( "testing" "time" ) // 验证提醒解析:带日期的完整格式 func TestParseTodoReminderFull(t *testing.T) { item := parseTodoReminder("做作业 @ 2026-10-31 17:30") if item == nil { t.Fatal("应解析出提醒项") } if item.Text != "做作业" { t.Fatalf("文本错误: %q", item.Text) } want := time.Date(2026, 10, 31, 17, 30, 0, 0, time.Local) if !item.When.Equal(want) { t.Fatalf("时间错误: %v, want %v", item.When, want) } } // 验证提醒解析:无日期默认当天 func TestParseTodoReminderToday(t *testing.T) { item := parseTodoReminder("开会 @ 15:00") if item == nil { t.Fatal("应解析出提醒项") } if item.Text != "开会" { t.Fatalf("文本错误: %q", item.Text) } now := time.Now() if item.When.Hour() != 15 || item.When.Minute() != 0 { t.Fatalf("时间错误: %v", item.When) } if item.When.Year() != now.Year() || item.When.Month() != now.Month() || item.When.Day() != now.Day() { t.Fatalf("应默认当天: %v", item.When) } } // 验证带 [x] 前缀的完成项也能解析出提醒 func TestParseTodoReminderDone(t *testing.T) { item := parseTodoReminder("[x] 买牛奶 @ 08:30") if item == nil { t.Fatal("应解析出提醒项") } if item.Text != "买牛奶" { t.Fatalf("文本错误: %q", item.Text) } } // 验证无提醒标记的行返回 nil func TestParseTodoReminderNone(t *testing.T) { if item := parseTodoReminder("普通任务"); item != nil { t.Fatalf("无标记应返回 nil, 得到 %+v", item) } if item := parseTodoReminder("[x] 已完成"); item != nil { t.Fatalf("无标记完成项应返回 nil, 得到 %+v", item) } } // 验证非法格式返回 nil func TestParseTodoReminderInvalid(t *testing.T) { for _, line := range []string{"任务 @ 25:99", "任务 @ abc", "@ 10:00", "任务 @ 2026-13-01 10:00"} { if item := parseTodoReminder(line); item != nil { t.Fatalf("非法行 %q 应返回 nil, 得到 %+v", line, item) } } }