package memory import ( "strings" "sync" "testing" "git.yeij.top/AskaEth/Cyrene_v2/internal/runtime/model" ) func TestWorkingMemory_Window_Sliding_正常(t *testing.T) { t.Parallel() w := NewWorkingMemory(3) for i := 0; i < 5; i++ { w.Add(model.TextMessage(model.RoleUser, string(rune('a'+i)))) } window := w.Window() if len(window) != 3 { t.Fatalf("Window length = %d, want 3", len(window)) } // The oldest two messages are evicted; the last three remain. for i, want := range []string{"c", "d", "e"} { if got := window[i].Content[0].Text; got != want { t.Errorf("window[%d].Text = %q, want %q", i, got, want) } } } func TestWorkingMemory_Window_IsDetached_正常(t *testing.T) { t.Parallel() w := NewWorkingMemory(2) w.Add(model.TextMessage(model.RoleUser, "one")) window := w.Window() window[0].Content[0].Text = "mutated" again := w.Window() if again[0].Content[0].Text != "one" { t.Fatalf("Window returned a shared slice; internal state mutated to %q", again[0].Content[0].Text) } } func TestWorkingMemory_Summarize_Default_正常(t *testing.T) { t.Parallel() w := NewWorkingMemory(10) w.Add(model.TextMessage(model.RoleUser, "你好")) w.Add(model.TextMessage(model.RoleUser, "今天天气不错")) w.Add(model.TextMessage(model.RoleAssistant, "是呀,很适合散步")) summary := w.Summarize() if !strings.Contains(summary, "3 条消息") { t.Errorf("summary missing message count: %q", summary) } if !strings.Contains(summary, "user 2") { t.Errorf("summary missing user count: %q", summary) } if !strings.Contains(summary, "assistant 1") { t.Errorf("summary missing assistant count: %q", summary) } if !strings.Contains(summary, "很适合散步") { t.Errorf("summary missing last message text: %q", summary) } } func TestWorkingMemory_Summarize_SetSummary_正常(t *testing.T) { t.Parallel() w := NewWorkingMemory(10) w.Add(model.TextMessage(model.RoleUser, "hello")) w.Add(model.TextMessage(model.RoleAssistant, "hi")) w.SetSummary("对话摘要:用户打招呼") if got := w.Summarize(); got != "对话摘要:用户打招呼" { t.Fatalf("Summarize() = %q, want stored summary", got) } } func TestWorkingMemory_Summarize_Empty_正常(t *testing.T) { t.Parallel() w := NewWorkingMemory(10) if got := w.Summarize(); got != "" { t.Fatalf("Summarize() on empty window = %q, want empty", got) } } func TestWorkingMemory_AddWindow_Concurrent_并发(t *testing.T) { t.Parallel() const n = 50 w := NewWorkingMemory(n) var wg sync.WaitGroup for i := 0; i < n; i++ { wg.Add(1) go func() { defer wg.Done() w.Add(model.TextMessage(model.RoleUser, "x")) }() } wg.Wait() if got := len(w.Window()); got != n { t.Fatalf("Window length = %d after concurrent add, want %d", got, n) } }