- 只翻注释/文档字符串:820 增 / 820 删 严格 1:1;剥掉整行注释与行尾注释尾巴后, 逐文件与 HEAD 比对「代码部分差异 = 0」;裁决/design 编号计数逐项与 HEAD 一致 - 保留可执行 SQL 样例、SQLite 报错原文、pgvector/HNSW/ANN/BLOB 等技术词原文 - 复核:go build 绿 + memory/projectindex/vector 三包测试绿;gofmt 仅剩 2 个既有未格式化文件(改动前即如此,未顺手修)
109 lines
2.7 KiB
Go
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))
|
|
}
|
|
// 最旧的两条消息被淘汰;后三条保留。
|
|
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)
|
|
}
|
|
}
|