Files
2026-07-13 13:00:08 +08:00

77 lines
2.6 KiB
Go

package agent
import (
"testing"
"time"
)
func TestMemoryCompilerInjectionGateLimitsCooldownAndResets(t *testing.T) {
a := New(nil, nil, NewSession(""), Options{}, nil)
base := time.Date(2026, 6, 28, 8, 0, 0, 0, time.UTC)
if !a.tryMarkMemoryCompilerInjected(base) {
t.Fatal("first injection should be allowed")
}
if a.tryMarkMemoryCompilerInjected(base.Add(memoryCompilerInjectionCooldown / 2)) {
t.Fatal("injection inside cooldown should be rejected")
}
for i := 1; i < memoryCompilerInjectionMax; i++ {
if !a.tryMarkMemoryCompilerInjected(base.Add(time.Duration(i+1) * memoryCompilerInjectionCooldown)) {
t.Fatalf("injection %d should be allowed before max", i+1)
}
}
if a.tryMarkMemoryCompilerInjected(base.Add(time.Duration(memoryCompilerInjectionMax+1) * memoryCompilerInjectionCooldown)) {
t.Fatal("injection after session max should be rejected")
}
a.SetSession(NewSession(""))
if !a.tryMarkMemoryCompilerInjected(base.Add(time.Duration(memoryCompilerInjectionMax+2) * memoryCompilerInjectionCooldown)) {
t.Fatal("new session should reset injection budget")
}
}
func TestShouldStartMemoryCompilerRejectsHostControlText(t *testing.T) {
cases := []struct {
input string
want bool
}{
{input: "", want: false},
{input: " \n\t", want: false},
{input: "<memory-compiler-execution>{}</memory-compiler-execution>", want: false},
{input: " <response-language>zh</response-language>", want: false},
{input: "fix the bug", want: true},
{input: "Referenced context:\n\n<file path=\"x\">x</file>\n\nfix @x", want: true},
}
for _, tc := range cases {
if got := shouldStartMemoryCompiler(tc.input); got != tc.want {
t.Fatalf("shouldStartMemoryCompiler(%q) = %v, want %v", tc.input, got, tc.want)
}
}
}
func TestShouldInjectMemoryCompilerContractForInputRequiresActionableTask(t *testing.T) {
cases := []struct {
input string
want bool
}{
{input: "hello", want: false},
{input: "hi", want: false},
{input: "你好", want: false},
{input: "nihao", want: false},
{input: "thanks", want: false},
{input: "ok", want: false},
{input: "fix the bug", want: true},
{input: "create file nihao", want: true},
{input: "review this diff", want: true},
{input: "run tests", want: true},
{input: "帮我修复这个 bug", want: true},
{input: "继续处理这个 issue", want: true},
{input: "fix @auth.go", want: true},
}
for _, tc := range cases {
if got := shouldInjectMemoryCompilerContractForInput(tc.input); got != tc.want {
t.Fatalf("shouldInjectMemoryCompilerContractForInput(%q) = %v, want %v", tc.input, got, tc.want)
}
}
}