< Summary - Code Coverage

Information
Class: Plainquire.Filter.ValueFilterExtensions
Assembly: Plainquire.Filter
File(s): /home/runner/work/plainquire/plainquire/Plainquire.Filter/Plainquire.Filter/Extensions/ValueFilterExtensions.cs
Tag: 64_13932151703
Line coverage
91%
Covered lines: 45
Uncovered lines: 4
Coverable lines: 49
Total lines: 91
Line coverage: 91.8%
Branch coverage
82%
Covered branches: 19
Total branches: 23
Branch coverage: 82.6%
Method coverage
100%
Covered methods: 4
Total methods: 4
Method coverage: 100%

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
HumanizeFilterSyntax(...)100%44100%
ToString(...)50%2283.33%
GetOperatorName(...)80%151582.35%
GetDefaultOperator()100%22100%

File(s)

/home/runner/work/plainquire/plainquire/Plainquire.Filter/Plainquire.Filter/Extensions/ValueFilterExtensions.cs

#LineLine coverage
 1using Plainquire.Filter.Abstractions;
 2using System;
 3using System.Collections.Generic;
 4using System.Linq;
 5
 6namespace Plainquire.Filter;
 7
 8/// <summary>
 9/// Extension methods for <see cref="ValueFilter"/>.
 10/// </summary>
 11public static class ValueFilterExtensions
 12{
 13    /// <summary>
 14    /// Humanizes the filter syntax.
 15    /// </summary>
 16    /// <typeparam name="TValue">The type of the filtered value.</typeparam>
 17    /// <param name="filterSyntax">The filter syntax.</param>
 18    /// <param name="valueName">Name of the value.</param>
 19    /// <param name="configuration">The filter configuration to use.</param>
 20    public static string HumanizeFilterSyntax<TValue>(this string? filterSyntax, string valueName, FilterConfiguration? 
 21    {
 1622        if (string.IsNullOrWhiteSpace(filterSyntax))
 123            return $"{valueName} is unfiltered";
 24
 1525        var filters = ValueFiltersFactory.Create(filterSyntax, configuration)
 1526            .GroupBy(x => x.Operator)
 1527            .Select(filterGroup =>
 1528            {
 1529                var filterOperator = filterGroup.Key;
 1530                var operatorName = filterOperator.GetOperatorName<TValue>();
 1531
 1532                if (filterOperator is FilterOperator.IsNull or FilterOperator.NotNull)
 1533                    return $"{valueName} {operatorName}";
 1534
 1535                var filterValues = filterGroup.Select(x => x.Value).ToArray();
 1536                var valuesButLast = filterValues[..^1];
 1537                var prefixValueList = string.Join("', '", valuesButLast);
 1538                var valueList = !string.IsNullOrEmpty(prefixValueList)
 1539                    ? $"'{prefixValueList}' or '{filterValues[^1]}'"
 1540                    : $"'{filterValues[^1]}'";
 1541
 1542                return $"{valueName} {operatorName} {valueList}";
 1543            })
 1544            .ToList();
 45
 1546        return string.Join(" or ", filters);
 47    }
 48
 49    /// <summary>
 50    /// Creates filter micro syntax string from <see cref="ValueFilter"/>.
 51    /// </summary>
 52    /// <param name="filters">The filters.</param>
 53    /// <autogeneratedoc />
 54    public static string? ToString(IReadOnlyCollection<ValueFilter>? filters)
 55    {
 256        if (filters == null)
 057            return null;
 58
 259        var filterStrings = filters
 260            .Where(x => x != null)
 261            .Select(x => x.ToString()?.Replace(",", "\\,"));
 62
 263        return string.Join(",", filterStrings);
 64    }
 65
 66    private static string GetOperatorName<TValue>(this FilterOperator filterOperator)
 67    {
 1668        filterOperator = filterOperator != FilterOperator.Default ? filterOperator : GetDefaultOperator<TValue>();
 1669        return filterOperator switch
 1670        {
 271            FilterOperator.Contains => "contains",
 072            FilterOperator.StartsWith => "starts with",
 073            FilterOperator.EndsWith => "ends with",
 174            FilterOperator.EqualCaseSensitive => "is (case-sensitive)",
 475            FilterOperator.EqualCaseInsensitive => "is",
 176            FilterOperator.NotEqual => "is not",
 177            FilterOperator.LessThanOrEqual => "is less than or equal to",
 278            FilterOperator.LessThan => "is less than",
 179            FilterOperator.GreaterThanOrEqual => "is greater than or equal to",
 280            FilterOperator.GreaterThan => "is greater than",
 181            FilterOperator.IsNull => "is null",
 182            FilterOperator.NotNull => "is not null",
 083            _ => throw new ArgumentOutOfRangeException(nameof(filterOperator))
 1684        };
 85    }
 86
 87    private static FilterOperator GetDefaultOperator<TValue>()
 488        => typeof(TValue) == typeof(string)
 489            ? FilterOperator.Contains
 490            : FilterOperator.EqualCaseInsensitive;
 91}