ComparisonAdapter
ComparisonAdapter class centralizes all comparisons of
values in NUnit, adapting to the use of any provided
IComparer, IComparer<T>
or Comparison<T>.
using NUnit.Framework.Internal;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace NUnit.Framework.Constraints
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public abstract class ComparisonAdapter
{
[System.Runtime.CompilerServices.NullableContext(0)]
private class DefaultComparisonAdapter : ComparerAdapter
{
public DefaultComparisonAdapter()
: base(NUnitComparer.Default)
{
}
}
[System.Runtime.CompilerServices.Nullable(0)]
private class ComparerAdapter : ComparisonAdapter
{
private readonly IComparer _comparer;
public ComparerAdapter(IComparer comparer)
{
_comparer = comparer;
}
[System.Runtime.CompilerServices.NullableContext(2)]
public override int Compare(object expected, object actual)
{
return _comparer.Compare(expected, actual);
}
}
[System.Runtime.CompilerServices.Nullable(0)]
private class ComparerAdapter<[System.Runtime.CompilerServices.Nullable(2)] T> : ComparisonAdapter
{
private readonly IComparer<T> _comparer;
public ComparerAdapter(IComparer<T> comparer)
{
_comparer = comparer;
}
[System.Runtime.CompilerServices.NullableContext(2)]
public override int Compare(object expected, object actual)
{
if (!TypeHelper.TryCast<T>(expected, out T value))
throw new ArgumentException("Cannot compare " + (expected?.ToString() ?? "null"));
if (!TypeHelper.TryCast<T>(actual, out T value2))
throw new ArgumentException("Cannot compare to " + (actual?.ToString() ?? "null"));
return _comparer.Compare(value, value2);
}
}
[System.Runtime.CompilerServices.Nullable(0)]
private class ComparisonAdapterForComparison<[System.Runtime.CompilerServices.Nullable(2)] T> : ComparisonAdapter
{
private readonly Comparison<T> _comparison;
public ComparisonAdapterForComparison(Comparison<T> comparer)
{
_comparison = comparer;
}
[System.Runtime.CompilerServices.NullableContext(2)]
public override int Compare(object expected, object actual)
{
if (!TypeHelper.TryCast<T>(expected, out T value))
throw new ArgumentException("Cannot compare " + (expected?.ToString() ?? "null"));
if (!TypeHelper.TryCast<T>(actual, out T value2))
throw new ArgumentException("Cannot compare to " + (actual?.ToString() ?? "null"));
return _comparison(value, value2);
}
}
public static ComparisonAdapter Default => new DefaultComparisonAdapter();
public static ComparisonAdapter For(IComparer comparer)
{
return new ComparerAdapter(comparer);
}
public static ComparisonAdapter For<[System.Runtime.CompilerServices.Nullable(2)] T>(IComparer<T> comparer)
{
return new ComparerAdapter<T>(comparer);
}
public static ComparisonAdapter For<[System.Runtime.CompilerServices.Nullable(2)] T>(Comparison<T> comparer)
{
return new ComparisonAdapterForComparison<T>(comparer);
}
[System.Runtime.CompilerServices.NullableContext(2)]
public abstract int Compare(object expected, object actual);
}
}