You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

53 lines
2.0 KiB

package memory
import "testing"
// 模型时常无视「不要 markdown 代码块」,也常在数组前后带一句解释。
// 这些都不是异常输入,是实测里的常态,解析必须扛得住。
func TestParseExtractedTodos_Tolerance(t *testing.T) {
cases := []struct {
name string
raw string
want int
}{
{"裸数组", `[{"title":"跟进A客户","owner":"王总","due_date":"2026-09-10","due_raw":"下周四前"}]`, 1},
{"带 json 代码块", "```json\n[{\"title\":\"跟进A客户\"}]\n```", 1},
{"带无语言代码块", "```\n[{\"title\":\"跟进A客户\"}]\n```", 1},
{"前后有解释文字", "好的,以下是待办:\n[{\"title\":\"跟进A客户\"}]\n希望对你有帮助。", 1},
{"空数组", `[]`, 0},
{"空数组带代码块", "```json\n[]\n```", 0},
{"多条", `[{"title":"A"},{"title":"B"},{"title":"C"}]`, 3},
}
for _, c := range cases {
got, err := parseExtractedTodos(c.raw)
if err != nil {
t.Errorf("%s: 解析失败 %v", c.name, err)
continue
}
if len(got) != c.want {
t.Errorf("%s: 期望 %d 条,得到 %d 条", c.name, c.want, len(got))
}
}
}
// 真正解析不出来时必须报错,不能悄悄返回空数组——
// 那样「模型输出坏了」和「本次会议确实没有待办」就分不开了。
func TestParseExtractedTodos_RealFailureReturnsError(t *testing.T) {
for _, raw := range []string{"", "本次会议无明确待办事项。", "{不是JSON"} {
if _, err := parseExtractedTodos(raw); err == nil {
t.Errorf("输入 %q 应该报错而不是返回空数组", raw)
}
}
}
func TestParseExtractedTodos_FieldMapping(t *testing.T) {
raw := `[{"title":"跟进A客户","owner":"王总","due_date":"2026-09-10","due_raw":"下周四前"}]`
got, err := parseExtractedTodos(raw)
if err != nil || len(got) != 1 {
t.Fatalf("解析失败 err=%v n=%d", err, len(got))
}
if got[0].Title != "跟进A客户" || got[0].Owner != "王总" ||
got[0].DueDate != "2026-09-10" || got[0].DueRaw != "下周四前" {
t.Errorf("字段映射错: %+v", got[0])
}
}