< 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>
 102114    public ActivityVisitor(IEnumerable<IActivityResolver> portResolvers, IServiceProvider serviceProvider)
 15    {
 102116        _serviceProvider = serviceProvider;
 411317        _portResolvers = portResolvers.OrderByDescending(x => x.Priority).ToList();
 102118    }
 19
 20    /// <inheritdoc />
 21    public async Task<ActivityNode> VisitAsync(IActivity activity, CancellationToken cancellationToken = default)
 22    {
 1107623        var graph = new ActivityNode(activity, "Root");
 1107624        var collectedNodes = new HashSet<ActivityNode>([
 1107625            graph
 1107626        ]);
 1107627        var collectedActivities = new HashSet<IActivity>([
 1107628            activity
 1107629        ]);
 1107630        var visitorContext = new ActivityVisitorContext
 1107631        {
 1107632            CollectedActivities = collectedActivities,
 1107633            CollectedNodes = collectedNodes
 1107634        };
 35
 1107636        await VisitRecursiveAsync((graph, activity), visitorContext, cancellationToken);
 1107637        return graph;
 1107638    }
 39
 40    private async Task VisitRecursiveAsync((ActivityNode Node, IActivity Activity) pair, ActivityVisitorContext visitorC
 41    {
 4578442        if (pair.Activity is IInitializable initializable)
 43        {
 105944            var context = new InitializationContext(_serviceProvider, cancellationToken);
 105945            await initializable.InitializeAsync(context);
 46        }
 47
 4578448        await VisitPortsRecursiveAsync(pair, visitorContext, cancellationToken);
 4578449    }
 50
 51    private async Task VisitPortsRecursiveAsync((ActivityNode Node, IActivity Activity) pair, ActivityVisitorContext vis
 52    {
 22253953        var resolver = _portResolvers.FirstOrDefault(x => x.GetSupportsActivity(pair.Activity));
 54
 4578455        if (resolver == null)
 056            return;
 57
 4578458        var activityPorts = await resolver.GetActivityPortsAsync(pair.Activity, cancellationToken);
 4578459        var collectedActivities = visitorContext.CollectedActivities;
 4578460        var collectedNodes = visitorContext.CollectedNodes;
 61
 14018262        foreach (var activityPort in activityPorts)
 63        {
 11852864            foreach (var activity in activityPort.GetActivities())
 65            {
 66                // Continue if the specified activity was already encountered.
 3495767                if (collectedActivities.Contains(activity))
 68                    continue;
 69
 12718370                var childNode = collectedNodes.FirstOrDefault(x => x.Activity == activity);
 71
 3470872                if (childNode == null)
 73                {
 3470874                    childNode = new(activity, activityPort.PortName);
 3470875                    collectedNodes.Add(childNode);
 76                }
 77
 3470878                childNode.AddParent(pair.Node);
 3470879                pair.Node.AddChild(childNode);
 3470880                collectedActivities.Add(activity);
 3470881                await VisitRecursiveAsync((childNode, activity), visitorContext, cancellationToken);
 82            }
 2430783        }
 4578484    }
 85
 86    private class ActivityVisitorContext
 87    {
 6793688        public HashSet<IActivity> CollectedActivities { get; set; } = [];
 6793689        public HashSet<ActivityNode> CollectedNodes { get; set; } = [];
 90    }
 91}