< Summary

Information
Class: Elsa.Workflows.Activities.Flowchart.Models.FlowScope
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Models/FlowScope.cs
Line coverage
100%
Covered lines: 34
Uncovered lines: 0
Coverable lines: 34
Total lines: 125
Line coverage: 100%
Branch coverage
50%
Covered branches: 4
Total branches: 8
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Models/FlowScope.cs

#LineLine coverage
 1using System.Text.Json.Serialization;
 2
 3namespace Elsa.Workflows.Activities.Flowchart.Models;
 4
 5/// <summary>
 6/// Represents a scope for tracking activity and connection visits within a flowchart execution.
 7/// </summary>
 8public class FlowScope
 9{
 10    [JsonConstructor]
 3411    public FlowScope()
 12    {
 3413    }
 14
 15    [JsonInclude]
 62316    private Dictionary<string, long> ActivitiesVisitCount { get; init; } = new();
 17
 18    [JsonInclude]
 74319    private Dictionary<string, long> ConnectionVisitCount { get; init; } = new();
 20
 21    [JsonInclude]
 32722    private Dictionary<string, bool> ConnectionLastVisitFollowed { get; init; } = new();
 23
 24    /// <summary>
 25    /// Registers a visit to the specified activity, incrementing its visit count.
 26    /// </summary>
 27    /// <param name="activity">The activity being visited.</param>
 28    public void RegisterActivityVisit(IActivity activity)
 29    {
 15230        string activityId = activity.Id;
 15231        ActivitiesVisitCount.TryAdd(activityId, 0);
 15232        ActivitiesVisitCount[activityId]++;
 15233    }
 34
 35    /// <summary>
 36    /// Gets the number of times the specified activity has been visited.
 37    /// </summary>
 38    /// <param name="activity">The activity to check.</param>
 39    /// <returns>The visit count of the activity.</returns>
 25140    private long GetActivityVisitCount(IActivity activity) => ActivitiesVisitCount.GetValueOrDefault(activity.Id, 0);
 41
 42    /// <summary>
 43    /// Registers a visit to the specified connection and records whether it was followed.
 44    /// </summary>
 45    /// <param name="connection">The connection being visited.</param>
 46    /// <param name="followed">Indicates whether the connection was followed.</param>
 47    public void RegisterConnectionVisit(Connection connection, bool followed)
 48    {
 13249        var connectionId = connection.ToString();
 13250        ConnectionVisitCount.TryAdd(connectionId, 0);
 13251        ConnectionVisitCount[connectionId]++;
 13252        ConnectionLastVisitFollowed[connectionId] = followed;
 13253    }
 54
 55    /// <summary>
 56    /// Gets the number of times the specified connection has been visited.
 57    /// </summary>
 58    /// <param name="connection">The connection to check.</param>
 59    /// <returns>The visit count of the connection.</returns>
 41160    private long GetConnectionVisitCount(Connection connection) => ConnectionVisitCount.GetValueOrDefault(connection.ToS
 61
 62    /// <summary>
 63    /// Determines whether the last visit to the specified connection was followed.
 64    /// </summary>
 65    /// <param name="connection">The connection to check.</param>
 66    /// <returns>True if the connection was followed on the last visit, otherwise false.</returns>
 12767    public bool GetConnectionLastVisitFollowed(Connection connection) => ConnectionLastVisitFollowed.GetValueOrDefault(c
 68
 69    /// <summary>
 70    /// Determines whether all inbound connections to the specified activity have been visited.
 71    /// </summary>
 72    /// <param name="flowGraph">The flow graph containing connections.</param>
 73    /// <param name="activity">The activity to check.</param>
 74    /// <returns>True if all inbound connections have been visited, otherwise false.</returns>
 75    public bool AllInboundConnectionsVisited(FlowGraph flowGraph, IActivity activity)
 76    {
 12177        var forwardInboundConnections = flowGraph.GetForwardInboundConnections(activity);
 12178        var outboundActivityVisitCount = GetActivityVisitCount(activity);
 12179        var minConnectionVisitCount = forwardInboundConnections.Min(GetConnectionVisitCount);
 12180        return minConnectionVisitCount > outboundActivityVisitCount;
 81    }
 82
 83    /// <summary>
 84    /// Determines whether any inbound connection to the specified activity has been followed.
 85    /// </summary>
 86    /// <param name="flowGraph">The flow graph containing connections.</param>
 87    /// <param name="activity">The activity to check.</param>
 88    /// <returns>True if any inbound connection has been followed, otherwise false.</returns>
 89    public bool AnyInboundConnectionsFollowed(FlowGraph flowGraph, IActivity activity)
 90    {
 11191        var forwardInboundConnections = flowGraph.GetForwardInboundConnections(activity);
 11192        var outboundActivityVisitCount = GetActivityVisitCount(activity);
 11193        var maxConnectionVisitCount = forwardInboundConnections.Max(GetConnectionVisitCount);
 11194        return maxConnectionVisitCount > outboundActivityVisitCount
 22395            && forwardInboundConnections.Any(c => GetConnectionVisitCount(c) == maxConnectionVisitCount && GetConnection
 96    }
 97
 98    /// <summary>
 99    /// Determines whether all inbound connection to the specified activity has been followed.
 100    /// </summary>
 101    /// <param name="flowGraph">The flow graph containing connections.</param>
 102    /// <param name="activity">The activity to check.</param>
 103    /// <returns>True if all inbound connection has been followed, otherwise false.</returns>
 104    public bool AllInboundConnectionsFollowed(FlowGraph flowGraph, IActivity activity)
 105    {
 8106        var forwardInboundConnections = flowGraph.GetForwardInboundConnections(activity);
 8107        var outboundActivityVisitCount = GetActivityVisitCount(activity);
 8108        var maxConnectionVisitCount = forwardInboundConnections.Max(GetConnectionVisitCount);
 8109        return maxConnectionVisitCount > outboundActivityVisitCount
 23110            && forwardInboundConnections.All(c => GetConnectionVisitCount(c) == maxConnectionVisitCount && GetConnection
 111    }
 112
 113    /// <summary>
 114    /// Determines whether a connection should be ignored based on visit counts.
 115    /// </summary>
 116    /// <param name="connection">The connection to check.</param>
 117    /// <param name="activity">The activity associated with the connection.</param>
 118    /// <returns>True if the connection should be ignored, otherwise false.</returns>
 119    public bool ShouldIgnoreConnection(Connection connection, IActivity activity)
 120    {
 11121        var connectionVisitCount = GetConnectionVisitCount(connection);
 11122        var activityVisitCount = GetActivityVisitCount(activity);
 11123        return connectionVisitCount <= activityVisitCount;
 124    }
 125}