Constraint
The Constraint class is the base of all built-in constraints
within NUnit. It provides the operator overloads used to combine
constraints.
using NUnit.Framework.Internal;
using System;
using System.Collections;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace NUnit.Framework.Constraints
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public abstract class Constraint : IAsyncConstraint, IConstraint, IResolveConstraint
{
private readonly Lazy<string> _displayName;
public virtual string DisplayName => _displayName.Value;
public abstract string Description { get; }
[System.Runtime.CompilerServices.Nullable(new byte[] {
1,
2
})]
[field: System.Runtime.CompilerServices.Nullable(new byte[] {
1,
2
})]
public object[] Arguments {
[return: System.Runtime.CompilerServices.Nullable(new byte[] {
1,
2
})]
get;
}
[System.Runtime.CompilerServices.Nullable(2)]
[field: System.Runtime.CompilerServices.Nullable(2)]
public ConstraintBuilder Builder {
[System.Runtime.CompilerServices.NullableContext(2)]
get;
[System.Runtime.CompilerServices.NullableContext(2)]
set;
}
public ConstraintExpression And {
get {
ConstraintBuilder constraintBuilder = Builder;
if (constraintBuilder == null) {
constraintBuilder = new ConstraintBuilder();
constraintBuilder.Append(this);
}
constraintBuilder.Append(new AndOperator());
return new ConstraintExpression(constraintBuilder);
}
}
public ConstraintExpression With => And;
public ConstraintExpression Or {
get {
ConstraintBuilder constraintBuilder = Builder;
if (constraintBuilder == null) {
constraintBuilder = new ConstraintBuilder();
constraintBuilder.Append(this);
}
constraintBuilder.Append(new OrOperator());
return new ConstraintExpression(constraintBuilder);
}
}
internal ConstraintExpression Instead {
get {
ConstraintBuilder constraintBuilder = Builder;
if (constraintBuilder == null) {
constraintBuilder = new ConstraintBuilder();
constraintBuilder.Append(this);
}
constraintBuilder.Append(new InsteadOperator());
return new ConstraintExpression(constraintBuilder);
}
}
protected Constraint([System.Runtime.CompilerServices.Nullable(new byte[] {
1,
2
})] params object[] args)
{
Arguments = args;
_displayName = new Lazy<string>(delegate {
Type type = GetType();
string text = type.Name;
if (type.IsGenericType)
text = text.Substring(0, text.Length - 2);
if (text.EndsWith("Constraint", StringComparison.Ordinal))
text = text.Substring(0, text.Length - 10);
return text;
});
}
public abstract ConstraintResult ApplyTo<[System.Runtime.CompilerServices.Nullable(2)] TActual>(TActual actual);
public virtual ConstraintResult ApplyTo<[System.Runtime.CompilerServices.Nullable(2)] TActual>(ActualValueDelegate<TActual> del)
{
if (AsyncToSyncAdapter.IsAsyncOperation(del))
return ApplyTo(AsyncToSyncAdapter.Await(TestExecutionContext.CurrentContext, () => del()));
return ApplyTo(GetTestObject(del));
}
public virtual ConstraintResult ApplyTo<[System.Runtime.CompilerServices.Nullable(2)] TActual>(ref TActual actual)
{
return ApplyTo(actual);
}
[AsyncStateMachine(typeof(<ApplyToAsync>d__16<>))]
public virtual Task<ConstraintResult> ApplyToAsync<[System.Runtime.CompilerServices.Nullable(2)] TActual>(Func<Task<TActual>> taskDel)
{
<ApplyToAsync>d__16<TActual> stateMachine = default(<ApplyToAsync>d__16<TActual>);
stateMachine.<>t__builder = AsyncTaskMethodBuilder<ConstraintResult>.Create();
stateMachine.<>4__this = this;
stateMachine.taskDel = taskDel;
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.Start(ref stateMachine);
return stateMachine.<>t__builder.Task;
}
[System.Runtime.CompilerServices.NullableContext(2)]
protected virtual object GetTestObject<TActual>([System.Runtime.CompilerServices.Nullable(1)] ActualValueDelegate<TActual> del)
{
return del();
}
public override string ToString()
{
string stringRepresentation = GetStringRepresentation();
if (Builder != null)
return "<unresolved " + stringRepresentation + ">";
return stringRepresentation;
}
protected string GetStringRepresentation(IEnumerable arguments)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("<");
stringBuilder.Append(DisplayName.ToLower());
foreach (object argument in arguments) {
stringBuilder.Append(" ");
stringBuilder.Append(<GetStringRepresentation>g__Displayable|19_0(argument));
}
stringBuilder.Append(">");
return stringBuilder.ToString();
}
protected virtual string GetStringRepresentation()
{
return GetStringRepresentation(Arguments);
}
public static Constraint operator &(Constraint left, Constraint right)
{
return new AndConstraint(((IResolveConstraint)left).Resolve(), ((IResolveConstraint)right).Resolve());
}
public static Constraint operator |(Constraint left, Constraint right)
{
return new OrConstraint(((IResolveConstraint)left).Resolve(), ((IResolveConstraint)right).Resolve());
}
public static Constraint operator !(Constraint constraint)
{
return new NotConstraint(((IResolveConstraint)constraint).Resolve());
}
public DelayedConstraint.WithRawDelayInterval After(int delay)
{
return new DelayedConstraint.WithRawDelayInterval(new DelayedConstraint((Builder == null) ? this : Builder.Resolve(), delay));
}
public DelayedConstraint After(int delayInMilliseconds, int pollingInterval)
{
return new DelayedConstraint((Builder == null) ? this : Builder.Resolve(), delayInMilliseconds, pollingInterval);
}
IConstraint IResolveConstraint.Resolve()
{
if (Builder != null)
return Builder.Resolve();
return this;
}
}
}