Files
Cyrene_v2/internal/runtime/memory/working_test.go
T

109 lines
2.7 KiB
Go

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)
}
}