package style8d import ( "strings" "testing" ) func TestResolvePersonaBlockUsesPersonaDraftWhenPersonaEmpty(t *testing.T) { raw := `{"username":"demo","analysis":{"d1Tone":{"summary":"口語親近","evidence":[]}},"personaDraft":"【我是誰】\n生活觀察者"}` block := ResolvePersonaBlock("", raw, "") if block == "" { t.Fatal("expected non-empty block") } for _, part := range []string{"生活觀察者", "D1 語氣人格", "口語親近", "語言指紋與寫作規則"} { if !strings.Contains(block, part) { t.Fatalf("block missing %q: %q", part, block) } } } func TestResolvePersonaBlockCombinesPersonaAndStyleFingerprint(t *testing.T) { raw := `{"analysis":{"d1Tone":{"summary":"口語親近","evidence":[]}},"personaDraft":"【語言指紋】\n常用慢慢、其實當轉折"}` block := ResolvePersonaBlock("備孕陪伴帳號", raw, "") for _, part := range []string{"備孕陪伴帳號", "常用慢慢", "語言指紋與寫作規則"} { if !strings.Contains(block, part) { t.Fatalf("block missing %q: %q", part, block) } } } func TestHasReady8DFromAnalysisOnly(t *testing.T) { raw := `{"analysis":{"d2Structure":{"summary":"短句開場","evidence":[]}}}` if !HasReady8D("", raw) { t.Fatal("expected ready from analysis summary") } } func TestHasReady8DRejectsPersonaDraftOnly(t *testing.T) { raw := `{"personaDraft":"【我是誰】\n生活觀察者"}` if HasReady8D("語氣描述", raw) { t.Fatal("personaDraft without 8D dimensions should not be ready") } }