< Summary

Information
Class: Nabs.ActivityFramework.Activity<T>
Assembly: Nabs.ActivityFramework
File(s): /home/runner/work/Nabs/Nabs/src/Nabs.ActivityFramework/Activity.cs
Tag: 90_14636759620
Line coverage
76%
Covered lines: 33
Uncovered lines: 10
Coverable lines: 43
Total lines: 137
Line coverage: 76.7%
Branch coverage
58%
Covered branches: 14
Total branches: 24
Branch coverage: 58.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
.ctor(...)100%11100%
get_InitialActivityState()100%11100%
set_InitialActivityState(...)50%2280%
get_HasStateChanged()100%210%
AddFactory(...)100%11100%
AddValidator(...)100%11100%
AddValidator()100%11100%
AddBehaviour(...)100%11100%
RunAsync()66.66%151272.72%
ProcessBehaviours()50%171058.33%

File(s)

/home/runner/work/Nabs/Nabs/src/Nabs.ActivityFramework/Activity.cs

#LineLine coverage
 1namespace Nabs.ActivityFramework;
 2
 3public interface IActivity
 4{
 5    bool HasStateChanged { get; }
 6    ValidationResult ValidationResult { get; }
 7    Task RunAsync();
 8}
 9
 10public interface IActivity<TActivityState>
 11    : IActivity
 12    where TActivityState : class, IActivityState;
 13
 14/// <summary>
 15/// An activity that holds the state based on TActivityState.
 16/// An activity that simply creates and instance of the state defined by TActivityState.
 17/// Typically this state is used to start off a workflow that will present blank or partially filled state.
 18/// </summary>
 19/// <typeparam name="TActivityState"></typeparam>
 20public abstract class Activity<TActivityState>
 21    : IActivity<TActivityState>
 22    where TActivityState : class, IActivityState
 23{
 24    private IActivityStateFactory<TActivityState>? _activityStateFactory;
 25    private IActivityStateValidator<TActivityState>? _activityStateValidator;
 26
 27    protected Activity()
 28    {
 129    }
 30
 31    protected Activity(TActivityState activityState)
 32    {
 133        InitialActivityState = activityState;
 134        ActivityState = activityState;
 135    }
 36
 37    private TActivityState? _initialActivityState;
 38    public TActivityState? InitialActivityState
 39    {
 240        get { return _initialActivityState; }
 41        protected set
 42        {
 243            if (_initialActivityState is not null)
 44            {
 045                throw new InvalidOperationException("InitialActivityState can only be set once.");
 46            }
 247            _initialActivityState = value;
 248            ActivityState = value;
 249        }
 50    }
 51    public TActivityState? ActivityState { get; protected set; } = default!;
 52
 053    public bool HasStateChanged => InitialActivityState != ActivityState;
 54
 55    public ValidationResult ValidationResult { get; set; } = default!;
 56
 257    protected Dictionary<IActivityStateBehaviour, Action?> Behaviours { get; } = [];
 58
 59    protected void AddFactory(IActivityStateFactory<TActivityState> factory)
 60    {
 161        _activityStateFactory = factory;
 162    }
 63
 64    protected void AddValidator(IActivityStateValidator<TActivityState> validator)
 65    {
 166        _activityStateValidator = validator;
 167    }
 68
 69    protected void AddValidator<TStateValidator>()
 70        where TStateValidator : IActivityStateValidator<TActivityState>, new()
 71    {
 172        _activityStateValidator = new TStateValidator();
 173    }
 74
 75    protected void AddBehaviour(IActivityStateBehaviour behaviour, Action? action = null)
 76    {
 277        Behaviours.Add(behaviour, action);
 278    }
 79
 80    public async Task RunAsync()
 81    {
 282        if (InitialActivityState is null)
 83        {
 084            if (_activityStateFactory is not null)
 85            {
 086                InitialActivityState = _activityStateFactory.Run();
 87            }
 88            else
 89            {
 090                throw new InvalidOperationException("InitialActivityState is null and no factory has been provided. Set 
 91            }
 92        }
 93
 294        ActivityState ??= InitialActivityState;
 95
 296        if (Behaviours.Count > 0)
 97        {
 298            await ProcessBehaviours();
 99        }
 100
 2101        if (_activityStateValidator is not null)
 102        {
 1103            ValidationResult = _activityStateValidator.Run(ActivityState);
 104        }
 2105        ValidationResult ??= new ValidationResult();
 2106    }
 107
 108    private async Task ProcessBehaviours()
 109    {
 2110        if (ActivityState is null)
 111        {
 0112            return;
 113        }
 114
 6115        foreach (var behaviour in Behaviours)
 116        {
 2117            if (behaviour.Key is IActivityStateBehaviourSync<TActivityState> syncBehaviour)
 118            {
 2119                ActivityState = syncBehaviour.Run(ActivityState);
 120
 121            }
 0122            else if (behaviour.Key is IActivityStateBehaviourAsync<TActivityState> asyncBehaviour)
 123            {
 0124                ActivityState = await asyncBehaviour.RunAsync(ActivityState);
 125            }
 126            else
 127            {
 0128                throw new InvalidOperationException("Behaviour is not of type IActivityStateBehaviourSync or IActivitySt
 129            }
 130
 2131            if (behaviour.Value is not null)
 132            {
 0133                behaviour.Value();
 134            }
 2135        }
 2136    }
 137}