< Summary

Information
Class: Intentum.Runtime.Policy.PolicyVariantSet
Assembly: Intentum.Runtime
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Runtime/Policy/PolicyVariantSet.cs
Line coverage
100%
Covered lines: 14
Uncovered lines: 0
Coverable lines: 14
Total lines: 42
Line coverage: 100%
Branch coverage
62%
Covered branches: 5
Total branches: 8
Branch coverage: 62.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)50%44100%
Decide(...)75%44100%
GetVariantNames()100%11100%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Runtime/Policy/PolicyVariantSet.cs

#LineLine coverage
 1using Intentum.Core.Intents;
 2using Intentum.Runtime.Engine;
 3
 4namespace Intentum.Runtime.Policy;
 5
 6/// <summary>
 7/// A/B policy variants: multiple named policies with a selector to choose which policy applies for a given intent.
 8/// </summary>
 9public sealed class PolicyVariantSet
 10{
 11    private readonly IReadOnlyDictionary<string, IntentPolicy> _variants;
 12    private readonly Func<Intent, string> _selector;
 13
 14    /// <summary>
 15    /// Creates a variant set with named policies and a selector that returns the variant name for a given intent.
 16    /// </summary>
 17    /// <param name="variants">Named policies (e.g. "control", "treatment").</param>
 18    /// <param name="selector">Function that returns which variant name to use for the given intent (e.g. random, by con
 319    public PolicyVariantSet(
 320        IReadOnlyDictionary<string, IntentPolicy> variants,
 321        Func<Intent, string> selector)
 322    {
 323        _variants = variants ?? throw new ArgumentNullException(nameof(variants));
 324        _selector = selector ?? throw new ArgumentNullException(nameof(selector));
 325    }
 26
 27    /// <summary>
 28    /// Evaluates the intent with the policy selected by the selector. If the selected variant name is unknown, returns 
 29    /// </summary>
 30    public PolicyDecision Decide(Intent intent)
 331    {
 332        var name = _selector(intent);
 333        if (string.IsNullOrEmpty(name) || !_variants.TryGetValue(name, out var policy))
 134            return PolicyDecision.Observe;
 235        return IntentPolicyEngine.Evaluate(intent, policy);
 336    }
 37
 38    /// <summary>
 39    /// Returns the variant names in this set.
 40    /// </summary>
 341    public IReadOnlyCollection<string> GetVariantNames() => _variants.Keys.ToList();
 42}