< Summary

Information
Class: Elsa.Workflows.OutputConverterRegistry
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Services/OutputConverterRegistry.cs
Line coverage
96%
Covered lines: 30
Uncovered lines: 1
Coverable lines: 31
Total lines: 72
Line coverage: 96.7%
Branch coverage
90%
Covered branches: 20
Total branches: 22
Branch coverage: 90.9%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ListAll()100%11100%
Find(...)100%22100%
FindRegistration(...)100%22100%
FindCompatible(...)100%22100%
IsAssignableToDestination(...)75%44100%
ValidateRegistrations(...)100%66100%
ValidateDescriptor(...)83.33%6680%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Services/OutputConverterRegistry.cs

#LineLine coverage
 1using Elsa.Workflows.Models;
 2
 3namespace Elsa.Workflows;
 4
 5/// <inheritdoc />
 6public class OutputConverterRegistry : IOutputConverterRegistry
 7{
 8    private readonly IReadOnlyDictionary<string, OutputConverterRegistration> _registrations;
 9
 15510    public OutputConverterRegistry(IEnumerable<OutputConverterRegistration> registrations)
 11    {
 15512        var registrationList = registrations.ToList();
 15513        ValidateRegistrations(registrationList);
 17914        _registrations = registrationList.ToDictionary(x => x.Descriptor.Id, StringComparer.Ordinal);
 14915    }
 16
 17    /// <inheritdoc />
 1718    public IEnumerable<OutputConverterDescriptor> ListAll() => _registrations.Values.Select(x => x.Descriptor);
 19
 20    /// <inheritdoc />
 21    public OutputConverterDescriptor? Find(string id) =>
 1922        _registrations.TryGetValue(id, out var registration) ? registration.Descriptor : null;
 23
 24    /// <summary>
 25    /// Finds the internal keyed-service registration associated with the specified converter ID.
 26    /// </summary>
 27    public OutputConverterRegistration? FindRegistration(string id) =>
 328        _registrations.TryGetValue(id, out var registration) ? registration : null;
 29
 30    /// <inheritdoc />
 31    public IEnumerable<OutputConverterDescriptor> FindCompatible(Type sourceType, Type destinationType) =>
 532        ListAll().Where(x =>
 1433            x.SourceType.IsAssignableFrom(sourceType) &&
 1434            IsAssignableToDestination(x.ResultType, destinationType));
 35
 36    internal static bool IsAssignableToDestination(Type valueType, Type destinationType)
 37    {
 2138        if (destinationType.IsAssignableFrom(valueType))
 1739            return true;
 40
 441        var underlyingDestinationType = Nullable.GetUnderlyingType(destinationType);
 442        return underlyingDestinationType?.IsAssignableFrom(valueType) == true;
 43    }
 44
 45    private static void ValidateRegistrations(IReadOnlyCollection<OutputConverterRegistration> registrations)
 46    {
 38247        foreach (var registration in registrations)
 48        {
 3849            ValidateDescriptor(registration.Descriptor);
 3650            var id = registration.Descriptor.Id;
 51
 3652            if (!string.Equals(id, registration.ServiceKey, StringComparison.Ordinal))
 253                throw new InvalidOperationException($"Output converter registration '{id}' must use the Converter ID as 
 54        }
 55
 15156        var duplicate = registrations
 3457            .GroupBy(x => x.Descriptor.Id, StringComparer.OrdinalIgnoreCase)
 18358            .FirstOrDefault(x => x.Count() > 1);
 59
 15160        if (duplicate != null)
 261            throw new InvalidOperationException($"Output converter ID '{duplicate.Key}' is registered more than once or 
 14962    }
 63
 64    internal static void ValidateDescriptor(OutputConverterDescriptor descriptor)
 65    {
 4666        if (string.IsNullOrWhiteSpace(descriptor.Id))
 067            throw new InvalidOperationException("Output converter IDs cannot be empty.");
 68
 4669        if (descriptor.SourceType.ContainsGenericParameters || descriptor.ResultType.ContainsGenericParameters)
 270            throw new InvalidOperationException($"Output converter '{descriptor.Id}' cannot use open-generic source or r
 4471    }
 72}