IgnoreLineEndingFormatStringComparer
IEqualityComparer<T> that ignores line ending format (\r, \n, and \r\n).
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
namespace NUnit.Framework.Constraints.Comparers
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
internal sealed class IgnoreLineEndingFormatStringComparer : IEqualityComparer<string>
{
public static readonly IgnoreLineEndingFormatStringComparer CurrentCulture = new IgnoreLineEndingFormatStringComparer(StringComparison.CurrentCulture);
public static readonly IgnoreLineEndingFormatStringComparer CurrentCultureIgnoreCase = new IgnoreLineEndingFormatStringComparer(StringComparison.CurrentCultureIgnoreCase);
public static readonly IgnoreLineEndingFormatStringComparer InvariantCulture = new IgnoreLineEndingFormatStringComparer(StringComparison.InvariantCulture);
public static readonly IgnoreLineEndingFormatStringComparer InvariantCultureIgnoreCase = new IgnoreLineEndingFormatStringComparer(StringComparison.InvariantCultureIgnoreCase);
public static readonly IgnoreLineEndingFormatStringComparer Ordinal = new IgnoreLineEndingFormatStringComparer(StringComparison.Ordinal);
public static readonly IgnoreLineEndingFormatStringComparer OrdinalIgnoreCase = new IgnoreLineEndingFormatStringComparer(StringComparison.OrdinalIgnoreCase);
private readonly StringComparison _comparisonType;
private IgnoreLineEndingFormatStringComparer(StringComparison comparisonType)
{
_comparisonType = comparisonType;
}
[System.Runtime.CompilerServices.NullableContext(2)]
public bool Equals(string x, string y)
{
if ((object)x == y)
return true;
if (x == null || y == null)
return false;
int num = 0;
int num2 = 0;
while (num < x.Length && num2 < y.Length) {
char c = x[num];
bool flag = false;
switch (c) {
case '\r':
flag = true;
if (num + 1 < x.Length && x[num + 1] == '\n')
num++;
break;
case '\n':
flag = true;
break;
}
char c2 = y[num2];
bool flag2 = false;
switch (c2) {
case '\r':
flag2 = true;
if (num2 + 1 < y.Length && y[num2 + 1] == '\n')
num2++;
break;
case '\n':
flag2 = true;
break;
}
if (!(flag & flag2)) {
if (flag | flag2)
return false;
if (string.Compare(x, num, y, num2, 1, _comparisonType) != 0)
return false;
}
num++;
num2++;
}
if (num == x.Length)
return num2 == y.Length;
return false;
}
[System.Runtime.CompilerServices.NullableContext(2)]
public int GetHashCode(string obj)
{
if (obj == null)
return 0;
string obj2 = NormalizeForHashing(obj);
StringComparer underlyingComparer = GetUnderlyingComparer(_comparisonType);
return underlyingComparer.GetHashCode(obj2);
}
private static StringComparer GetUnderlyingComparer(StringComparison comparisonType)
{
switch (comparisonType) {
case StringComparison.CurrentCulture:
return StringComparer.CurrentCulture;
case StringComparison.CurrentCultureIgnoreCase:
return StringComparer.CurrentCultureIgnoreCase;
case StringComparison.InvariantCulture:
return StringComparer.InvariantCulture;
case StringComparison.InvariantCultureIgnoreCase:
return StringComparer.InvariantCultureIgnoreCase;
case StringComparison.Ordinal:
return StringComparer.Ordinal;
case StringComparison.OrdinalIgnoreCase:
return StringComparer.OrdinalIgnoreCase;
default: {
DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(36, 1);
defaultInterpolatedStringHandler.AppendLiteral("Unsupported StringComparison value: ");
defaultInterpolatedStringHandler.AppendFormatted(comparisonType);
throw new ArgumentOutOfRangeException("comparisonType", defaultInterpolatedStringHandler.ToStringAndClear());
}
}
}
private static string NormalizeForHashing(string input)
{
if (input.IndexOf('\r') == -1)
return input;
StringBuilder stringBuilder = new StringBuilder(input.Length);
for (int i = 0; i < input.Length; i++) {
char c = input[i];
if (c == '\r') {
stringBuilder.Append('\n');
if (i + 1 < input.Length && input[i + 1] == '\n')
i++;
} else
stringBuilder.Append(c);
}
return stringBuilder.ToString();
}
}
}