<PackageReference Include="NUnit" Version="4.4.0-beta.2.1" />

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(); } } }