Files
wehub-resource-sync db620d33df
CodeQL / Analyze (csharp) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
dotnet-build-and-test / dotnet-test-functions (push) Has been cancelled
dotnet-build-and-test / paths-filter (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Debug, windows-latest, net9.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, ubuntu-latest, net8.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-build (Release, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, ubuntu-latest, net10.0) (push) Has been cancelled
dotnet-build-and-test / dotnet-test (Release, integration, true, windows-latest, net472) (push) Has been cancelled
dotnet-build-and-test / dotnet-foundry-hosted-it (push) Has been cancelled
dotnet-build-and-test / dotnet-build-and-test-check (push) Has been cancelled
dotnet-build-and-test / Integration Test Report (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:39:25 +08:00

80 lines
3.2 KiB
C#

// Copyright (c) Microsoft. All rights reserved.
using System;
using System.Collections.Generic;
using System.Linq;
using FluentAssertions;
namespace Microsoft.Agents.AI.Workflows.UnitTests;
/// <summary>
/// Tests focused on <see cref="MagenticWorkflowBuilder"/>'s output-designation surface —
/// the Python-aligned defaults applied at <see cref="MagenticWorkflowBuilder.Build"/> when
/// the user has not made explicit designations, and the memoized
/// <c>WithOutputFrom</c> / <c>WithIntermediateOutputFrom</c> replay otherwise.
/// </summary>
#pragma warning disable MAAIW001 // Experimental: MagenticWorkflowBuilder
public class MagenticWorkflowBuilderTests
{
[Fact]
public void Test_MagenticWorkflowBuilder_DefaultDesignationsMatchSpec()
{
TestReplayAgent manager = new(name: "Manager");
TestEchoAgent member1 = new(name: "Worker1");
TestEchoAgent member2 = new(name: "Worker2");
Workflow workflow = new MagenticWorkflowBuilder(manager)
.AddParticipants(member1, member2)
.RequirePlanSignoff(false)
.Build();
Dictionary<string, HashSet<OutputTag>> designations = workflow.OutputExecutors;
designations.Where(kvp => kvp.Value.Count == 0)
.Should().ContainSingle("the Magentic orchestrator is the sole terminal output by default");
designations.Where(kvp => kvp.Value.Contains(OutputTag.Intermediate))
.Should().HaveCount(2, "every team member is designated intermediate by default");
}
[Fact]
public void Test_MagenticWorkflowBuilder_ExplicitDesignationsReplaceDefaults()
{
TestReplayAgent manager = new(name: "Manager");
TestEchoAgent member1 = new(name: "Worker1");
TestEchoAgent member2 = new(name: "Worker2");
Workflow workflow = new MagenticWorkflowBuilder(manager)
.AddParticipants(member1, member2)
.RequirePlanSignoff(false)
.WithOutputFrom(member1)
.WithIntermediateOutputFrom([member2])
.Build();
Dictionary<string, HashSet<OutputTag>> designations = workflow.OutputExecutors;
designations.Should().HaveCount(2,
"only the user-specified designations land on the inner builder; the orchestrator default is suppressed");
designations.Values.Where(tags => tags.Count == 0)
.Should().ContainSingle("member1 is the only terminal designation");
designations.Values.Where(tags => tags.Contains(OutputTag.Intermediate))
.Should().ContainSingle("member2 is the only intermediate designation");
}
[Fact]
public void Test_MagenticWorkflowBuilder_DesignationForNonParticipantThrows()
{
TestReplayAgent manager = new(name: "Manager");
TestEchoAgent member = new(name: "Worker");
TestEchoAgent stranger = new(name: "Stranger");
MagenticWorkflowBuilder builder = new MagenticWorkflowBuilder(manager)
.AddParticipants(member)
.RequirePlanSignoff(false)
.WithIntermediateOutputFrom([stranger]);
Action build = () => builder.Build();
build.Should().Throw<InvalidOperationException>().WithMessage("*Stranger*");
}
}
#pragma warning restore MAAIW001