using System.Reflection; using Bpmn.Semantics; using Elsa.Bpmn.Activities; using Elsa.Workflows; using Elsa.Workflows.Models; using NSubstitute; using Xunit; namespace Elsa.Bpmn.UnitTests; public class BpmnProcessDescriptorTests { [Fact(DisplayName = "BpmnProcess's descriptor declares Done and Cancelled as its only flow ports")] public async Task DescribeActivityAsync_DeclaresDoneAndCancelledAsOnlyFlowPorts() { var defaultValueResolver = Substitute.For(); var propertyUIHandlerResolver = Substitute.For(); defaultValueResolver.GetDefaultValue(Arg.Any()).Returns((object?)null); propertyUIHandlerResolver .GetUIPropertiesAsync(Arg.Any(), Arg.Any(), Arg.Any()) .Returns(_ => new ValueTask>(new Dictionary())); var describer = new ActivityDescriber(defaultValueResolver, propertyUIHandlerResolver); var descriptor = await describer.DescribeActivityAsync(typeof(BpmnProcess)); var flowPorts = descriptor.Ports.Where(port => port.Type == PortType.Flow).ToList(); Assert.Equal(2, flowPorts.Count); Assert.Contains(flowPorts, port => port.Name == BpmnInterpreter.DoneOutcomeName); Assert.Contains(flowPorts, port => port.Name == BpmnInterpreter.CancelledOutcomeName); } }