mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-12 20:27:30 +00:00
4 个文件全部在 `<module>/test/`,源码目录仍零 `_test.go`。
共 18 条判据,只调导出接口,输入 → 可观察输出。
## pkg/embedding —— 注册表 + 校验
TestRegisterThenOpen 注册 → Names/Open → Info/Embed 输出
TestOpenUnknownProviderReportsError 未注册名报错且可诊断
TestValidateInfo 维度/指纹真值表
TestValidateVector 维度不符 / NaN / Inf 必拒
## pkg/generation —— 注册表
TestRegisterThenOpen 注册 → Names/Open → Info/Generate 输出
TestOpenUnknownProviderReportsError 未注册名报错
## internal/memory/text —— 真实临时目录
TestAppendThenRecentEvents Append → RecentEvents 读回内容
TestReplayVisitsAppendedEvents Replay 收到全部事件
TestFileCountAndStats 写后文件数/统计可用
## internal/memory/social —— 真实内存图库
TestNilDBReportsError 无图库时写操作报错(不静默)
TestSetTraitThenGetTrait 特质往返
TestSetTraitOverwrites 同键覆盖
TestAddRelationThenGetRelations 关系往返
TestListPersons 人物列表含已写入的人
## 变异验证(改回旧实现必须红)
embedding 非有限值检查留 NaN 通过 → ★ 非法向量被接受:[NaN 2 3]
generation 未注册名静默返回 nil → ★ 未注册 provider 的报错不可诊断
text Append 不写盘 → ★ RecentEvents = 0 条
social SetTrait 不写 → ★ 无图库却 SetTrait 成功
前两条第一版变异分别造成「编译失败(math 未使用)」和「panic」,
不是干净的断言红 —— 改成只改行为、仍能编译的变异后确认有效。
## 验证
go build ./... PASS
go vet ./... PASS
gofmt -l 干净
python3 .github/scripts/check-ci-gates.py PASS
go test ./... -count=1 32 个测试包 / 100 包无测试 / 0 FAIL
4 个新包 -race 全绿
源码目录 _test.go 0
68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
package test
|
||
|
||
// internal/memory/text 的黑盒判据:New/Start → Append → RecentEvents/Replay/Stats。
|
||
// 用真实临时目录,不碰 m.current/m.encoder。
|
||
|
||
import (
|
||
"testing"
|
||
|
||
"github.com/JianFeeeee/HologramAgent/internal/memory/text"
|
||
)
|
||
|
||
func newMemory(t *testing.T) *text.Memory {
|
||
t.Helper()
|
||
m := text.New(t.TempDir())
|
||
if err := m.Start(); err != nil {
|
||
t.Fatalf("Start: %v", err)
|
||
}
|
||
t.Cleanup(m.Stop)
|
||
return m
|
||
}
|
||
|
||
// TestAppendThenRecentEvents:Append 后 RecentEvents 能读回内容。
|
||
func TestAppendThenRecentEvents(t *testing.T) {
|
||
m := newMemory(t)
|
||
if err := m.Append(text.Event{Source: "qq", Input: "你好", Response: "在"}); err != nil {
|
||
t.Fatalf("Append: %v", err)
|
||
}
|
||
evts, err := m.RecentEvents(5)
|
||
if err != nil {
|
||
t.Fatalf("RecentEvents: %v", err)
|
||
}
|
||
if len(evts) != 1 {
|
||
t.Fatalf("★ RecentEvents = %d 条,期望 1", len(evts))
|
||
}
|
||
if evts[0].Input != "你好" || evts[0].Response != "在" {
|
||
t.Fatalf("★ 内容不符:%+v", evts[0])
|
||
}
|
||
}
|
||
|
||
// TestReplayVisitsAppendedEvents:Replay 回调收到已写入的事件。
|
||
func TestReplayVisitsAppendedEvents(t *testing.T) {
|
||
m := newMemory(t)
|
||
_ = m.Append(text.Event{Source: "webui", Input: "A"})
|
||
_ = m.Append(text.Event{Source: "webui", Input: "B"})
|
||
inputs := map[string]bool{}
|
||
if err := m.Replay(func(e text.Event) error {
|
||
inputs[e.Input] = true
|
||
return nil
|
||
}); err != nil {
|
||
t.Fatalf("Replay: %v", err)
|
||
}
|
||
if !inputs["A"] || !inputs["B"] {
|
||
t.Fatalf("★ Replay 没收到全部事件:%v", inputs)
|
||
}
|
||
}
|
||
|
||
// TestFileCountAndStats:写后文件数/统计输出可用。
|
||
func TestFileCountAndStats(t *testing.T) {
|
||
m := newMemory(t)
|
||
_ = m.Append(text.Event{Source: "s", Input: "x"})
|
||
if got := m.FileCount(); got < 1 {
|
||
t.Fatalf("★ FileCount = %d,期望 ≥1", got)
|
||
}
|
||
if st := m.Stats(); st == nil {
|
||
t.Fatal("★ Stats() 返回 nil")
|
||
}
|
||
}
|