// Copyright (c) Microsoft. All rights reserved.
using Microsoft.Agents.AI.Workflows.Declarative.Interpreter;
namespace Microsoft.Agents.AI.Workflows.Declarative.UnitTests.Interpreter;
///
/// Tests execution of workflow created by .
///
public sealed class DeclarativeWorkflowModelTest(ITestOutputHelper output) : WorkflowTest(output)
{
[Fact]
public void GetDepthForDefault()
{
WorkflowModel model = new(new TestExecutor("root"));
Assert.Equal(0, model.GetDepth(null));
}
[Fact]
public void GetDepthForMissingNode()
{
WorkflowModel model = new(new TestExecutor("root"));
Assert.Throws(() => model.GetDepth("missing"));
}
[Fact]
public void ConnectMissingNode()
{
TestExecutor rootExecutor = new("root");
WorkflowModel model = new(rootExecutor);
model.AddLink("root", "missing");
TestWorkflowBuilder modelBuilder = new();
Assert.Throws(() => model.Build(modelBuilder));
}
[Fact]
public void AddToMissingParent()
{
WorkflowModel model = new(new TestExecutor("root"));
Assert.Throws(() => model.AddNode(new TestExecutor("next"), "missing"));
}
[Fact]
public void LinkFromMissingSource()
{
WorkflowModel model = new(new TestExecutor("root"));
Assert.Throws(() => model.AddLink("missing", "anything"));
}
[Fact]
public void LocateMissingParent()
{
WorkflowModel model = new(new TestExecutor("root"));
Assert.Null(model.LocateParent(null));
Assert.Throws(() => model.LocateParent("missing"));
}
internal sealed class TestExecutor(string actionId) : IModeledAction
{
public string Id { get; } = actionId;
}
internal sealed class TestWorkflowBuilder : IModelBuilder
{
public void Connect(IModeledAction source, IModeledAction target, string? condition = null)
{
Assert.Fail(); // Not expected to be called in this test.
}
}
}