< 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>
 90714    public ActivityVisitor(IEnumerable<IActivityResolver> portResolvers, IServiceProvider serviceProvider)
 15    {
 90716        _serviceProvider = serviceProvider;
 360217        _portResolvers = portResolvers.OrderByDescending(x => x.Priority).ToList();
 90718    }
 19
 20    /// <inheritdoc />
 21    public async Task<ActivityNode> VisitAsync(IActivity activity, CancellationToken cancellationToken = default)
 22    {
 449223        var graph = new ActivityNode(activity, "Root");
 449224        var collectedNodes = new HashSet<ActivityNode>([
 449225            graph
 449226        ]);
 449227        var collectedActivities = new HashSet<IActivity>([
 449228            activity
 449229        ]);
 449230        var visitorContext = new ActivityVisitorContext
 449231        {
 449232            CollectedActivities = collectedActivities,
 449233            CollectedNodes = collectedNodes
 449234        };
 35
 449236        await VisitRecursiveAsync((graph, activity), visitorContext, cancellationToken);
 449237        return graph;
 449238    }
 39
 40    private async Task VisitRecursiveAsync((ActivityNode Node, IActivity Activity) pair, ActivityVisitorContext visitorC
 41    {
 1863742        if (pair.Activity is IInitializable initializable)
 43        {
 76144            var context = new InitializationContext(_serviceProvider, cancellationToken);
 76145            await initializable.InitializeAsync(context);
 46        }
 47
 1863748        await VisitPortsRecursiveAsync(pair, visitorContext, cancellationToken);
 1863749    }
 50
 51    private async Task VisitPortsRecursiveAsync((ActivityNode Node, IActivity Activity) pair, ActivityVisitorContext vis
 52    {
 8741453        var resolver = _portResolvers.FirstOrDefault(x => x.GetSupportsActivity(pair.Activity));
 54
 1863755        if (resolver == null)
 056            return;
 57
 1863758        var activityPorts = await resolver.GetActivityPortsAsync(pair.Activity, cancellationToken);
 1863759        var collectedActivities = visitorContext.CollectedActivities;
 1863760        var collectedNodes = visitorContext.CollectedNodes;
 61
 5836662        foreach (var activityPort in activityPorts)
 63        {
 4969664            foreach (var activity in activityPort.GetActivities())
 65            {
 66                // Continue if the specified activity was already encountered.
 1430267                if (collectedActivities.Contains(activity))
 68                    continue;
 69
 5417870                var childNode = collectedNodes.FirstOrDefault(x => x.Activity == activity);
 71
 1414572                if (childNode == null)
 73                {
 1414574                    childNode = new(activity, activityPort.PortName);
 1414575                    collectedNodes.Add(childNode);
 76                }
 77
 1414578                childNode.AddParent(pair.Node);
 1414579                pair.Node.AddChild(childNode);
 1414580                collectedActivities.Add(activity);
 1414581                await VisitRecursiveAsync((childNode, activity), visitorContext, cancellationToken);
 82            }
 1054683        }
 1863784    }
 85
 86    private class ActivityVisitorContext
 87    {
 2762188        public HashSet<IActivity> CollectedActivities { get; set; } = [];
 2762189        public HashSet<ActivityNode> CollectedNodes { get; set; } = [];
 90    }
 91}