< Summary - Helper.Tests

Information
Class: Configuration.Helper.AlphanumComparator
Assembly: Configuration.Helper
File(s): D:\a\NuGetPackages\NuGetPackages\src\Helper\Configuration.Helper\AlphanumComparator.cs
Tag: 3_8508158812
Line coverage
100%
Covered lines: 49
Uncovered lines: 0
Coverable lines: 49
Total lines: 110
Line coverage: 100%
Branch coverage
94%
Covered branches: 36
Total branches: 38
Branch coverage: 94.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
InChunk(...)100%88100%
GetStringBuilder(...)100%88100%
IsNumeric(...)100%22100%
SortNumeric(...)100%44100%
MoreToCheck(...)100%22100%
Compare(...)85.71%1414100%

File(s)

D:\a\NuGetPackages\NuGetPackages\src\Helper\Configuration.Helper\AlphanumComparator.cs

#LineLine coverage
 1// Ignore Spelling: Alphanum
 2
 3using System.Collections;
 4using System.Text;
 5
 6namespace Configuration.Helper;
 7
 8/// <summary>Exposes a method that compares two objects.</summary>
 9public class AlphanumComparator : IComparer
 10{
 11  #region Private Enumeration and Methods
 12
 13  private enum ChunkType { Alphanumeric, Numeric };
 14
 15  private const int clt = -1;
 16  private const int ceq = 0;
 17  private const int cgt = 1;
 18
 19  private static bool InChunk( char ch, char otherCh )
 25420  {
 25421    ChunkType type = ChunkType.Alphanumeric;
 22
 26623    if( char.IsDigit( otherCh ) ) { type = ChunkType.Numeric; }
 24
 25425    return ( type != ChunkType.Alphanumeric || !char.IsDigit( ch ) )
 25426      && ( type != ChunkType.Numeric || char.IsDigit( ch ) );
 25427  }
 28
 29  private static StringBuilder GetStringBuilder( ref string str, ref int marker )
 6630  {
 6631    char thisCh = str[marker];
 6632    StringBuilder rtn = new();
 33
 38334    while( ( marker < str.Length ) && ( rtn.Length == 0 || InChunk( thisCh, rtn[0] ) ) )
 31735    {
 31736      rtn.Append( thisCh );
 31737      marker++;
 38
 107939      if( marker < str.Length ) { thisCh = str[marker]; }
 31740    }
 41
 6642    return rtn;
 6643  }
 44
 45  private static bool IsNumeric( char x, char y )
 3346  {
 3347    return char.IsDigit( x ) && char.IsDigit( y );
 3348  }
 49
 50  private static int SortNumeric( string x, string y )
 351  {
 352    int xNumber = Convert.ToInt32( x );
 353    int yNumber = Convert.ToInt32( y );
 54
 555    if( xNumber < yNumber ) { return clt; }
 456    else if( xNumber > yNumber ) { return cgt; }
 157    return ceq;
 358  }
 59
 60  private static bool MoreToCheck( int xPos, string s1, int yPos, string s2 )
 3761  {
 3762    return ( xPos < s1.Length ) || ( yPos < s2.Length );
 3763  }
 64
 65  #endregion
 66
 67  #region IComparer Implementation
 68
 69  /// <summary>
 70  /// Compares two objects and returns a value indicating whether one is less than,
 71  /// equal to, or greater than the other.
 72  /// </summary>
 73  /// <param name="x">The first object to compare.</param>
 74  /// <param name="y">The second object to compare.</param>
 75  /// <returns>A signed integer that indicates the relative values of x and y:
 76  /// - If less than 0, x is less than y.
 77  /// - If 0, x equals y.
 78  /// - If greater than 0, x is greater than y.
 79  /// </returns>
 80  public int Compare( object? x, object? y )
 3981  {
 4582    if( x is not string s1 || y is not string s2 ) { return ceq; }
 83
 3684    int xPosition = 0;
 3685    int yPosition = 0;
 86
 3787    while( MoreToCheck( xPosition, s1, yPosition, s2 ) )
 3388    {
 3389      if( xPosition >= s1.Length ) { return clt; }
 3390      if( yPosition >= s2.Length ) { return cgt; }
 91
 3392      StringBuilder xChunk = GetStringBuilder( ref s1, ref xPosition );
 3393      StringBuilder yChunk = GetStringBuilder( ref s2, ref yPosition );
 94
 3395      string xStr = xChunk.ToString();
 3396      string yStr = yChunk.ToString();
 97
 98      // If both chunks contain numeric characters, sort them numerically
 3399      int result = IsNumeric( xChunk[0], yChunk[0] )
 33100        ? SortNumeric( xStr, yStr )
 33101        : string.Compare( xStr, yStr, StringComparison.Ordinal );
 102
 97103      if( result != ceq ) { return result; }
 1104    }
 105
 4106    return ceq;
 39107  }
 108
 109  #endregion
 110}