ThrowsExceptionConstraint
ThrowsExceptionConstraint tests that an exception has
been thrown, without any further tests.
using NUnit.Framework.Internal;
using System;
using System.Threading.Tasks;
namespace NUnit.Framework.Constraints
{
public class ThrowsExceptionConstraint : Constraint
{
private class ThrowsExceptionConstraintResult : ConstraintResult
{
public ThrowsExceptionConstraintResult(ThrowsExceptionConstraint constraint, Exception caughtException)
: base(constraint, caughtException, caughtException != null)
{
}
public override void WriteActualValueTo(MessageWriter writer)
{
if (base.Status == ConstraintStatus.Failure)
writer.Write("no exception thrown");
else
base.WriteActualValueTo(writer);
}
}
public override string Description => "an exception to be thrown";
public override ConstraintResult ApplyTo<TActual>(TActual actual)
{
TestDelegate testDelegate = actual as TestDelegate;
Exception caughtException = null;
if (testDelegate != null)
try {
testDelegate();
} catch (Exception ex) {
caughtException = ex;
}
AsyncTestDelegate asyncTestDelegate = actual as AsyncTestDelegate;
if (asyncTestDelegate != null) {
using (AsyncInvocationRegion asyncInvocationRegion = AsyncInvocationRegion.Create(asyncTestDelegate))
try {
Task invocationResult = asyncTestDelegate();
asyncInvocationRegion.WaitForPendingOperationsToComplete(invocationResult);
} catch (Exception ex2) {
caughtException = ex2;
}
}
if (testDelegate == null && asyncTestDelegate == null)
throw new ArgumentException($"""{actual.GetType().Name}", "actual");
return new ThrowsExceptionConstraintResult(this, caughtException);
}
public override ConstraintResult ApplyTo<TActual>(ActualValueDelegate<TActual> del)
{
if (typeof(TActual) == typeof(Task))
return ApplyTo<AsyncTestDelegate>(() => (Task)(object)del());
return ApplyTo<TestDelegate>(delegate {
del();
});
}
public ThrowsExceptionConstraint()
: base(Array.Empty<object>())
{
}
}
}