< Summary - Code Coverage

Information
Class: Plainquire.Filter.Abstractions.Range<T>
Assembly: Plainquire.Filter.Abstractions
File(s): /home/runner/work/plainquire/plainquire/Plainquire.Filter/Plainquire.Filter.Abstractions/Models/Range.cs
Tag: 64_13932151703
Line coverage
100%
Covered lines: 81
Uncovered lines: 0
Coverable lines: 81
Total lines: 264
Line coverage: 100%
Branch coverage
100%
Covered branches: 36
Total branches: 36
Branch coverage: 100%
Method coverage
100%
Covered methods: 31
Total methods: 31
Method coverage: 100%

Metrics

File(s)

/home/runner/work/plainquire/plainquire/Plainquire.Filter/Plainquire.Filter.Abstractions/Models/Range.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3
 4namespace Plainquire.Filter.Abstractions;
 5
 6/// <summary>
 7/// Represents a range of <typeparamref name="TType"/>.
 8/// </summary>
 9public class Range<TType> : IEquatable<Range<TType>>, IConvertible where TType : IComparable<TType>
 10{
 11    /// <summary>
 12    /// The start of range.
 13    /// </summary>
 14    public TType? Start { get; }
 15
 16    /// <summary>
 17    /// The end of range.
 18    /// </summary>
 19    public TType? End { get; }
 20
 21    /// <summary>
 22    /// Gets the distance between <see cref="Start"/> and <see cref="End"/>.
 23    /// </summary>
 24    /// <autogeneratedoc />
 525    public double Distance => ToDouble(End) - ToDouble(Start);
 26
 27    /// <summary>
 28    /// Initializes a new instance of the <see cref="Range{TType}"/> class.
 29    /// </summary>
 30    /// <param name="start">The start of range.</param>
 31    /// <param name="end">The end of range.</param>
 32    public Range(TType? start, TType? end)
 33    {
 3524534        Start = start;
 3524535        End = end;
 3524536    }
 37
 38    /// <inheritdoc />
 39    public override string ToString()
 40    {
 33241        var start = ToString(Start);
 33242        var end = ToString(End);
 43
 33244        return $"{start}_{end}";
 45
 46        //if (start != null && end != null)
 47        //    return $"{start}_{end}";
 48        //if (start != null)
 49        //    return start;
 50        //if (end != null)
 51        //    return end;
 52        //return string.Empty;
 53    }
 54
 55    /// <inheritdoc />
 56    public override bool Equals(object? obj)
 2057        => Equals(obj as Range<TType>);
 58
 59    /// <inheritdoc />
 60    public bool Equals(Range<TType>? other)
 2061        => other != null && EqualityComparer<TType?>.Default.Equals(Start, other.Start) && EqualityComparer<TType?>.Defa
 62
 63    /// <inheritdoc />
 64    public override int GetHashCode()
 165        => HashCode.Combine(Start, End);
 66
 67    /// <summary>
 68    /// Indicates whether the <paramref name="val1"/> object is equal to <paramref name="val2"/> object.
 69    /// </summary>
 70    /// <param name="val1">The object to compare with <paramref name="val2"/>.</param>
 71    /// <param name="val2">The object to compare with <paramref name="val1"/>.</param>
 72    public static bool operator ==(Range<TType>? val1, Range<TType>? val2)
 17873        => EqualityComparer<Range<TType>?>.Default.Equals(val1, val2);
 74
 75    /// <summary>
 76    /// Indicates whether the <paramref name="val1"/> object is not equal to <paramref name="val2"/> object.
 77    /// </summary>
 78    /// <param name="val1">The object to compare with <paramref name="val2"/>.</param>
 79    /// <param name="val2">The object to compare with <paramref name="val1"/>.</param>
 80    public static bool operator !=(Range<TType>? val1, Range<TType>? val2)
 2081        => !(val1 == val2);
 82
 83    /// <summary>
 84    /// Indicates whether the range of <paramref name="val1"/> is lower than the range of <paramref name="val2"/> object
 85    /// </summary>
 86    /// <param name="val1">The object to compare with <paramref name="val2"/>.</param>
 87    /// <param name="val2">The object to compare with <paramref name="val1"/>.</param>
 88    public static bool operator <(Range<TType> val1, Range<TType> val2)
 289        => ((IConvertible)val1).ToDecimal(null) < ((IConvertible)val2).ToDecimal(null);
 90
 91    /// <summary>
 92    /// Indicates whether the range of <paramref name="val1"/> is greater than the range of <paramref name="val2"/> obje
 93    /// </summary>
 94    /// <param name="val1">The object to compare with <paramref name="val2"/>.</param>
 95    /// <param name="val2">The object to compare with <paramref name="val1"/>.</param>
 96    public static bool operator >(Range<TType> val1, Range<TType> val2)
 297        => ((IConvertible)val1).ToDecimal(null) > ((IConvertible)val2).ToDecimal(null);
 98
 99    /// <summary>
 100    /// Indicates whether the range of <paramref name="val1"/> is lower than or equal to the range of <paramref name="va
 101    /// </summary>
 102    /// <param name="val1">The object to compare with <paramref name="val2"/>.</param>
 103    /// <param name="val2">The object to compare with <paramref name="val1"/>.</param>
 104    public static bool operator <=(Range<TType> val1, Range<TType> val2)
 2105        => ((IConvertible)val1).ToDecimal(null) <= ((IConvertible)val2).ToDecimal(null);
 106
 107    /// <summary>
 108    /// Indicates whether the range of <paramref name="val1"/> is greater than or equal to the range of <paramref name="
 109    /// </summary>
 110    /// <param name="val1">The object to compare with <paramref name="val2"/>.</param>
 111    /// <param name="val2">The object to compare with <paramref name="val1"/>.</param>
 112    public static bool operator >=(Range<TType> val1, Range<TType> val2)
 2113        => ((IConvertible)val1).ToDecimal(null) >= ((IConvertible)val2).ToDecimal(null);
 114
 115    private static string? ToString(TType? value)
 664116        => value switch
 664117        {
 4118            null => null,
 2119            DateTime dateTime => dateTime.ToString("o"),
 648120            DateTimeOffset dateTime => dateTime.ToString("o"),
 10121            _ => value.ToString()
 664122        };
 123
 124    private static double ToDouble(TType? val)
 114125        => val switch
 114126        {
 2127            null => 0,
 2128            DateTime dateTime => dateTime.Ticks,
 2129            DateTimeOffset dateTime => dateTime.Ticks,
 106130            IConvertible convertible => convertible.ToDouble(null),
 2131            _ => throw new InvalidOperationException($"The type {typeof(TType).Name} is not convertible to {nameof(Doubl
 114132        };
 133
 134    #region IConvertible
 135    TypeCode IConvertible.GetTypeCode()
 1136        => TypeCode.Object;
 137
 138    bool IConvertible.ToBoolean(IFormatProvider? provider)
 1139        => throw new InvalidCastException($"Invalid cast from {nameof(Range)} to {nameof(Boolean)}");
 140
 141    char IConvertible.ToChar(IFormatProvider? provider)
 1142        => throw new InvalidCastException($"Invalid cast from {nameof(Range)} to {nameof(Char)}");
 143
 144    DateTime IConvertible.ToDateTime(IFormatProvider? provider)
 1145        => throw new InvalidCastException($"Invalid cast from {nameof(Range)} to {nameof(DateTime)}");
 146
 147    string IConvertible.ToString(IFormatProvider? provider)
 2148        => this.ToString();
 149
 150    object IConvertible.ToType(Type conversionType, IFormatProvider? provider)
 151    {
 152        try
 153        {
 3154            return ((IConvertible)((IConvertible)this).ToDouble(provider)).ToType(conversionType, provider);
 155        }
 1156        catch (OverflowException)
 157        {
 1158            throw new OverflowException($"Range was too large for a {conversionType.Name}");
 159        }
 2160    }
 161
 162    byte IConvertible.ToByte(IFormatProvider? provider)
 163    {
 3164        var result = ToDouble(End) - ToDouble(Start);
 3165        if (result <= byte.MaxValue)
 2166            return (byte)result;
 1167        throw new OverflowException($"Range was too large for a {nameof(Byte)}");
 168    }
 169
 170    decimal IConvertible.ToDecimal(IFormatProvider? provider)
 171    {
 172        try
 173        {
 19174            return Convert.ToDecimal(ToDouble(End) - ToDouble(Start));
 175        }
 1176        catch (OverflowException)
 177        {
 1178            throw new OverflowException($"Range was too large for a {nameof(Decimal)}");
 179        }
 18180    }
 181
 182    double IConvertible.ToDouble(IFormatProvider? provider)
 7183        => ToDouble(End) - ToDouble(Start);
 184
 185    short IConvertible.ToInt16(IFormatProvider? provider)
 186    {
 3187        var result = ToDouble(End) - ToDouble(Start);
 3188        if (result <= short.MaxValue)
 2189            return (short)result;
 1190        throw new OverflowException($"Range was too large for a {nameof(Int16)}");
 191    }
 192
 193    int IConvertible.ToInt32(IFormatProvider? provider)
 194    {
 3195        var result = ToDouble(End) - ToDouble(Start);
 3196        if (result <= int.MaxValue)
 2197            return (int)result;
 1198        throw new OverflowException($"Range was too large for a {nameof(Int32)}");
 199    }
 200
 201    long IConvertible.ToInt64(IFormatProvider? provider)
 202    {
 3203        var result = ToDouble(End) - ToDouble(Start);
 3204        if (result <= long.MaxValue)
 2205            return (long)result;
 1206        throw new OverflowException($"Range was too large for a {nameof(Int64)}");
 207    }
 208
 209    sbyte IConvertible.ToSByte(IFormatProvider? provider)
 210    {
 3211        var result = ToDouble(End) - ToDouble(Start);
 3212        if (result <= sbyte.MaxValue)
 2213            return (sbyte)result;
 1214        throw new OverflowException($"Range was too large for a {nameof(SByte)}");
 215    }
 216
 217    float IConvertible.ToSingle(IFormatProvider? provider)
 218    {
 3219        var result = ToDouble(End) - ToDouble(Start);
 3220        if (result < float.MaxValue)
 2221            return (float)result;
 1222        throw new OverflowException($"Range was too large for a {nameof(Single)}");
 223    }
 224
 225    ushort IConvertible.ToUInt16(IFormatProvider? provider)
 226    {
 3227        var result = ToDouble(End) - ToDouble(Start);
 3228        if (result <= ushort.MaxValue)
 2229            return (ushort)result;
 1230        throw new OverflowException($"Range was too large for a {nameof(UInt16)}");
 231    }
 232
 233    uint IConvertible.ToUInt32(IFormatProvider? provider)
 234    {
 3235        var result = ToDouble(End) - ToDouble(Start);
 3236        if (result <= uint.MaxValue)
 2237            return (uint)result;
 1238        throw new OverflowException($"Range was too large for a {nameof(UInt32)}");
 239    }
 240
 241    ulong IConvertible.ToUInt64(IFormatProvider? provider)
 242    {
 3243        var result = ToDouble(End) - ToDouble(Start);
 3244        if (result <= ulong.MaxValue)
 2245            return (ulong)result;
 1246        throw new OverflowException($"Range was too large for a {nameof(UInt64)}");
 247    }
 248    #endregion
 249}
 250
 251/// <summary>
 252/// Utility class to create a <see cref="Range{TType}"/>.
 253/// </summary>
 254public static class Range
 255{
 256    /// <summary>
 257    /// Creates a <see cref="Range{TType}"/>.
 258    /// </summary>
 259    /// <typeparam name="TType">The type of the values represented by range.</typeparam>
 260    /// <param name="start">The start of range.</param>
 261    /// <param name="end">The end of range.</param>
 262    public static Range<TType> Create<TType>(TType? start, TType? end) where TType : IComparable<TType>
 263        => new(start, end);
 264}

Methods/Properties

Distance()
.ctor(TType,TType)
ToString()
Equals(System.Object)
Equals(Plainquire.Filter.Abstractions.Range`1<TType>)
GetHashCode()
op_Equality(Plainquire.Filter.Abstractions.Range`1<TType>,Plainquire.Filter.Abstractions.Range`1<TType>)
op_Inequality(Plainquire.Filter.Abstractions.Range`1<TType>,Plainquire.Filter.Abstractions.Range`1<TType>)
op_LessThan(Plainquire.Filter.Abstractions.Range`1<TType>,Plainquire.Filter.Abstractions.Range`1<TType>)
op_GreaterThan(Plainquire.Filter.Abstractions.Range`1<TType>,Plainquire.Filter.Abstractions.Range`1<TType>)
op_LessThanOrEqual(Plainquire.Filter.Abstractions.Range`1<TType>,Plainquire.Filter.Abstractions.Range`1<TType>)
op_GreaterThanOrEqual(Plainquire.Filter.Abstractions.Range`1<TType>,Plainquire.Filter.Abstractions.Range`1<TType>)
ToString(TType)
ToDouble(TType)
System.IConvertible.GetTypeCode()
System.IConvertible.ToBoolean(System.IFormatProvider)
System.IConvertible.ToChar(System.IFormatProvider)
System.IConvertible.ToDateTime(System.IFormatProvider)
System.IConvertible.ToString(System.IFormatProvider)
System.IConvertible.ToType(System.Type,System.IFormatProvider)
System.IConvertible.ToByte(System.IFormatProvider)
System.IConvertible.ToDecimal(System.IFormatProvider)
System.IConvertible.ToDouble(System.IFormatProvider)
System.IConvertible.ToInt16(System.IFormatProvider)
System.IConvertible.ToInt32(System.IFormatProvider)
System.IConvertible.ToInt64(System.IFormatProvider)
System.IConvertible.ToSByte(System.IFormatProvider)
System.IConvertible.ToSingle(System.IFormatProvider)
System.IConvertible.ToUInt16(System.IFormatProvider)
System.IConvertible.ToUInt32(System.IFormatProvider)
System.IConvertible.ToUInt64(System.IFormatProvider)