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