EqualUsingConstraint<T>
EqualUsingConstraint where the comparison is done by a user supplied comparer.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Text;
namespace NUnit.Framework.Constraints
{
[NullableContext(1)]
[Nullable(0)]
public class EqualUsingConstraint<[Nullable(2)] T> : Constraint
{
[Nullable(2)]
private readonly T _expected;
[Nullable(new byte[] {
2,
1,
1
})]
private readonly Func<T, T, bool> _comparer;
[Nullable(new byte[] {
2,
1,
1
})]
private readonly Func<object, object, bool> _nonTypedComparer;
public override string Description {
get {
StringBuilder stringBuilder = new StringBuilder(MsgUtils.FormatValue(_expected));
if (_comparer != null)
stringBuilder.Append(", using strongly typed comparer");
if (_nonTypedComparer != null)
stringBuilder.Append(", using untyped comparer");
return stringBuilder.ToString();
}
}
public EqualUsingConstraint([Nullable(2)] T expected, Func<T, T, bool> comparer)
: base(expected)
{
_expected = expected;
_comparer = comparer;
}
public EqualUsingConstraint([Nullable(2)] T expected, Func<object, object, bool> comparer)
: base(expected)
{
_expected = expected;
_nonTypedComparer = comparer;
}
[System.Runtime.CompilerServices.OverloadResolutionPriority(1)]
public EqualUsingConstraint([Nullable(2)] T expected, IEqualityComparer<T> comparer)
: this(expected, (Func<T, T, bool>)comparer.Equals)
{
}
public EqualUsingConstraint([Nullable(2)] T expected, IComparer<T> comparer)
: this(expected, (Func<T, T, bool>)((T x, T y) => comparer.Compare(x, y) == 0))
{
}
public EqualUsingConstraint([Nullable(2)] T expected, Comparison<T> comparer)
: this(expected, (Func<T, T, bool>)((T x, T y) => comparer(x, y) == 0))
{
}
public EqualUsingConstraint([Nullable(2)] T expected, IEqualityComparer comparer)
: this(expected, (Func<object, object, bool>)((object x, object y) => comparer.Equals(x, y)))
{
}
public EqualUsingConstraint([Nullable(2)] T expected, IComparer comparer)
: this(expected, (Func<object, object, bool>)((object x, object y) => comparer.Compare(x, y) == 0))
{
}
public virtual ConstraintResult ApplyTo([Nullable(2)] T actual)
{
bool hasSucceeded = (actual == null) ? (_expected == null) : (_expected != null && ((_comparer != null) ? _comparer(actual, _expected) : (_nonTypedComparer != null && _nonTypedComparer(actual, _expected))));
return ConstraintResult(actual, hasSucceeded);
}
public sealed override ConstraintResult ApplyTo<[Nullable(2)] TActual>(TActual actual)
{
bool hasSucceeded;
if (actual == null)
hasSucceeded = (this._expected == null);
else if (this._expected == null) {
hasSucceeded = false;
} else if (this._nonTypedComparer != null) {
hasSucceeded = this._nonTypedComparer(actual, this._expected);
} else if (this._comparer != null && ((object)actual) is T) {
T arg = actual as T;
hasSucceeded = this._comparer(arg, this._expected);
} else {
hasSucceeded = false;
}
return ConstraintResult(actual, hasSucceeded);
}
private ConstraintResult ConstraintResult<[Nullable(2)] TActual>(TActual actual, bool hasSucceeded)
{
return new EqualConstraintResult(this, actual, hasSucceeded);
}
}
}