Files
AskaEth 61cf80d5ee
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled
docs(comments): 注释中文化 · internal/runtime/memory(31 文件,纯替换)
- 只翻注释/文档字符串:820 增 / 820 删 严格 1:1;剥掉整行注释与行尾注释尾巴后,
  逐文件与 HEAD 比对「代码部分差异 = 0」;裁决/design 编号计数逐项与 HEAD 一致
- 保留可执行 SQL 样例、SQLite 报错原文、pgvector/HNSW/ANN/BLOB 等技术词原文
- 复核:go build 绿 + memory/projectindex/vector 三包测试绿;gofmt 仅剩 2 个既有未格式化文件(改动前即如此,未顺手修)
2026-10-04 13:32:54 +08:00

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