< Summary

Information
Class: Elsa.Workflows.ActivityVisitor
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Services/ActivityVisitor.cs
Line coverage
97%
Covered lines: 44
Uncovered lines: 1
Coverable lines: 45
Total lines: 91
Line coverage: 97.7%
Branch coverage
91%
Covered branches: 11
Total branches: 12
Branch coverage: 91.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
VisitAsync()100%11100%
VisitRecursiveAsync()100%22100%
VisitPortsRecursiveAsync()90%101094.11%
get_CollectedActivities()100%11100%
get_CollectedNodes()100%11100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Services/ActivityVisitor.cs

#LineLine coverage
 1using ActivityNode = Elsa.Workflows.Models.ActivityNode;
 2
 3namespace Elsa.Workflows;
 4
 5/// <inheritdoc />
 6public class ActivityVisitor : IActivityVisitor
 7{
 8    private readonly IServiceProvider _serviceProvider;
 9    private readonly IEnumerable<IActivityResolver> _portResolvers;
 10
 11    /// <summary>
 12    /// Initializes a new instance of the <see cref="ActivityVisitor"/> class.
 13    /// </summary>
 99814    public ActivityVisitor(IEnumerable<IActivityResolver> portResolvers, IServiceProvider serviceProvider)
 15    {
 99816        _serviceProvider = serviceProvider;
 405217        _portResolvers = portResolvers.OrderByDescending(x => x.Priority).ToList();
 99818    }
 19
 20    /// <inheritdoc />
 21    public async Task<ActivityNode> VisitAsync(IActivity activity, CancellationToken cancellationToken = default)
 22    {
 1043623        var graph = new ActivityNode(activity, "Root");
 1043624        var collectedNodes = new HashSet<ActivityNode>([
 1043625            graph
 1043626        ]);
 1043627        var collectedActivities = new HashSet<IActivity>([
 1043628            activity
 1043629        ]);
 1043630        var visitorContext = new ActivityVisitorContext
 1043631        {
 1043632            CollectedActivities = collectedActivities,
 1043633            CollectedNodes = collectedNodes
 1043634        };
 35
 1043636        await VisitRecursiveAsync((graph, activity), visitorContext, cancellationToken);
 1043637        return graph;
 1043638    }
 39
 40    private async Task VisitRecursiveAsync((ActivityNode Node, IActivity Activity) pair, ActivityVisitorContext visitorC
 41    {
 4231042        if (pair.Activity is IInitializable initializable)
 43        {
 64744            var context = new InitializationContext(_serviceProvider, cancellationToken);
 64745            await initializable.InitializeAsync(context);
 46        }
 47
 4231048        await VisitPortsRecursiveAsync(pair, visitorContext, cancellationToken);
 4231049    }
 50
 51    private async Task VisitPortsRecursiveAsync((ActivityNode Node, IActivity Activity) pair, ActivityVisitorContext vis
 52    {
 20600853        var resolver = _portResolvers.FirstOrDefault(x => x.GetSupportsActivity(pair.Activity));
 54
 4231055        if (resolver == null)
 056            return;
 57
 4231058        var activityPorts = await resolver.GetActivityPortsAsync(pair.Activity, cancellationToken);
 4231059        var collectedActivities = visitorContext.CollectedActivities;
 4231060        var collectedNodes = visitorContext.CollectedNodes;
 61
 12842462        foreach (var activityPort in activityPorts)
 63        {
 10803464            foreach (var activity in activityPort.GetActivities())
 65            {
 66                // Continue if the specified activity was already encountered.
 3211567                if (collectedActivities.Contains(activity))
 68                    continue;
 69
 11448070                var childNode = collectedNodes.FirstOrDefault(x => x.Activity == activity);
 71
 3187472                if (childNode == null)
 73                {
 3187474                    childNode = new(activity, activityPort.PortName);
 3187475                    collectedNodes.Add(childNode);
 76                }
 77
 3187478                childNode.AddParent(pair.Node);
 3187479                pair.Node.AddChild(childNode);
 3187480                collectedActivities.Add(activity);
 3187481                await VisitRecursiveAsync((childNode, activity), visitorContext, cancellationToken);
 82            }
 2190283        }
 4231084    }
 85
 86    private class ActivityVisitorContext
 87    {
 6318288        public HashSet<IActivity> CollectedActivities { get; set; } = [];
 6318289        public HashSet<ActivityNode> CollectedNodes { get; set; } = [];
 90    }
 91}