67 lines
2.0 KiB
Go
67 lines
2.0 KiB
Go
package loop
|
||
|
||
import (
|
||
"context"
|
||
"strings"
|
||
"testing"
|
||
)
|
||
|
||
// TestSubagentTask_RoundTrip:挂载的任务目标能被原样读回(ok=true)。
|
||
func TestSubagentTask_RoundTrip(t *testing.T) {
|
||
t.Parallel()
|
||
|
||
ctx := WithSubagentTask(context.Background(), "整理导出文件")
|
||
got, ok := SubagentTaskFrom(ctx)
|
||
if !ok || got != "整理导出文件" {
|
||
t.Fatalf("SubagentTaskFrom = (%q, %v), want (整理导出文件, true)", got, ok)
|
||
}
|
||
}
|
||
|
||
// TestSubagentTask_EmptyIsNoop:未派发的运行(主会话自身、后台思考)是
|
||
// ok=false —— 这正是「非子代理发起」的语义,判定侧据此不加判定。
|
||
func TestSubagentTask_EmptyIsNoop(t *testing.T) {
|
||
t.Parallel()
|
||
|
||
tests := []struct {
|
||
name string
|
||
ctx context.Context
|
||
}{
|
||
{name: "bare context", ctx: context.Background()},
|
||
{name: "blank goal", ctx: WithSubagentTask(context.Background(), " ")},
|
||
{name: "nil context", ctx: nil},
|
||
}
|
||
for _, tt := range tests {
|
||
tt := tt
|
||
t.Run(tt.name, func(t *testing.T) {
|
||
t.Parallel()
|
||
if got, ok := SubagentTaskFrom(tt.ctx); ok || got != "" {
|
||
t.Fatalf("SubagentTaskFrom = (%q, %v), want (\"\", false)", got, ok)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
// TestSubagentTask_NilContextIsNoop:nil ctx 是空操作,不 panic。
|
||
func TestSubagentTask_NilContextIsNoop(t *testing.T) {
|
||
t.Parallel()
|
||
|
||
if got := WithSubagentTask(nil, "任务"); got != nil {
|
||
t.Fatalf("WithSubagentTask(nil, …) = %v, want nil", got)
|
||
}
|
||
}
|
||
|
||
// TestSubagentTask_PropagatesThroughChildContexts:派发标记必须能穿过中途派生的
|
||
// ctx 抵达工具执行点(准入钩子拿到的就是那一层 ctx);被取消的派生 ctx 同样保留它。
|
||
func TestSubagentTask_PropagatesThroughChildContexts(t *testing.T) {
|
||
t.Parallel()
|
||
|
||
parent := WithSubagentTask(context.Background(), "整理导出文件")
|
||
child, cancel := context.WithCancel(parent)
|
||
defer cancel()
|
||
|
||
got, ok := SubagentTaskFrom(child)
|
||
if !ok || !strings.Contains(got, "整理") {
|
||
t.Fatalf("派生 ctx 上的任务 = (%q, %v), want 原任务", got, ok)
|
||
}
|
||
}
|