mirror of
https://github.com/YspCoder/clawgo.git
synced 2026-04-12 14:07:30 +08:00
80 lines
2.5 KiB
Go
80 lines
2.5 KiB
Go
package agent
|
||
|
||
import (
|
||
"context"
|
||
"os"
|
||
"path/filepath"
|
||
"testing"
|
||
|
||
"clawgo/pkg/bus"
|
||
"clawgo/pkg/ekg"
|
||
"clawgo/pkg/providers"
|
||
)
|
||
|
||
func TestSplitPlannedSegments_Bullets(t *testing.T) {
|
||
parts := splitPlannedSegments("- 修复 a.go\n- 补充 b.go 测试")
|
||
if len(parts) != 2 {
|
||
t.Fatalf("unexpected parts: %#v", parts)
|
||
}
|
||
}
|
||
|
||
func TestPlanSessionTasks_Semicolon(t *testing.T) {
|
||
loop := &AgentLoop{}
|
||
tasks := loop.planSessionTasks(bus.InboundMessage{Channel: "cli", Content: "修复 pkg/a.go;修复 pkg/b.go"})
|
||
if len(tasks) != 2 {
|
||
t.Fatalf("expected 2 tasks, got %#v", tasks)
|
||
}
|
||
if tasks[0].Content == tasks[1].Content {
|
||
t.Fatalf("expected distinct tasks: %#v", tasks)
|
||
}
|
||
}
|
||
|
||
func TestProcessPlannedMessage_AggregatesResults(t *testing.T) {
|
||
rp := &recordingProvider{responses: []providers.LLMResponse{
|
||
{Content: "done-a", FinishReason: "stop"},
|
||
{Content: "done-b", FinishReason: "stop"},
|
||
}}
|
||
loop := setupLoop(t, rp)
|
||
|
||
resp, err := loop.processPlannedMessage(context.Background(), bus.InboundMessage{
|
||
Channel: "cli",
|
||
SenderID: "u",
|
||
ChatID: "direct",
|
||
SessionKey: "sess-plan",
|
||
Content: "修复 pkg/a.go;补充 pkg/b.go 测试",
|
||
})
|
||
if err != nil {
|
||
t.Fatalf("processPlannedMessage error: %v", err)
|
||
}
|
||
if len(rp.calls) != 2 {
|
||
t.Fatalf("expected 2 provider calls, got %d", len(rp.calls))
|
||
}
|
||
if resp == "" {
|
||
t.Fatalf("expected aggregate response")
|
||
}
|
||
}
|
||
|
||
func TestFindRecentRelatedErrorEvent(t *testing.T) {
|
||
ws := filepath.Join(t.TempDir(), "workspace")
|
||
_ = os.MkdirAll(filepath.Join(ws, "memory"), 0o755)
|
||
line := `{"task_id":"t1","status":"error","log":"open /tmp/a.go failed","input_preview":"修复 pkg/a.go 的读取错误","source":"direct","channel":"cli"}`
|
||
if err := os.WriteFile(filepath.Join(ws, "memory", "task-audit.jsonl"), []byte(line+"\n"), 0o644); err != nil {
|
||
t.Fatalf("write audit: %v", err)
|
||
}
|
||
loop := &AgentLoop{workspace: ws, ekg: ekg.New(ws)}
|
||
loop.ekg.Record(ekg.Event{TaskID: "t1", Status: "error", Log: "open /tmp/a.go failed"})
|
||
loop.ekg.Record(ekg.Event{TaskID: "t1", Status: "error", Log: "open /tmp/a.go failed"})
|
||
loop.ekg.Record(ekg.Event{TaskID: "t1", Status: "error", Log: "open /tmp/a.go failed"})
|
||
|
||
ev, ok := loop.findRecentRelatedErrorEvent("请修复 pkg/a.go 的读取问题")
|
||
if !ok {
|
||
t.Fatalf("expected matched recent error event")
|
||
}
|
||
if ev.TaskID != "t1" {
|
||
t.Fatalf("unexpected task id: %s", ev.TaskID)
|
||
}
|
||
if hint := loop.ekgHintForTask(plannedTask{Content: "修复 pkg/a.go"}); hint == "" {
|
||
t.Fatalf("expected non-empty ekg hint")
|
||
}
|
||
}
|