ExactCountConstraint
ExactCountConstraint applies another constraint to each
item in a collection, succeeding only if a specified
number of items succeed.
using System;
using System.Collections;
namespace NUnit.Framework.Constraints
{
public class ExactCountConstraint : Constraint
{
private readonly int _expectedCount;
private readonly IConstraint _itemConstraint;
public override string Description {
get {
string text = (_expectedCount == 0) ? "no item" : ((_expectedCount == 1) ? "exactly one item" : $"""{new object[1] {
_expectedCount
}}""");
if (_itemConstraint == null)
return text;
return PrefixConstraint.FormatDescription(text, _itemConstraint);
}
}
public ExactCountConstraint(int expectedCount)
{
_expectedCount = expectedCount;
}
public ExactCountConstraint(int expectedCount, IConstraint itemConstraint)
: base(itemConstraint)
{
Guard.ArgumentNotNull(itemConstraint, "itemConstraint");
_itemConstraint = itemConstraint.Resolve();
_expectedCount = expectedCount;
}
public override ConstraintResult ApplyTo<TActual>(TActual actual)
{
if (!(((object)actual) is IEnumerable))
throw new ArgumentException("The actual value must be an IEnumerable", "actual");
int num = 0;
if (_itemConstraint == null) {
foreach (object item in (IEnumerable)(object)actual) {
object obj = item;
num++;
}
} else {
foreach (object item2 in (IEnumerable)(object)actual) {
if (_itemConstraint.ApplyTo(item2).IsSuccess)
num++;
}
}
return new ConstraintResult(this, actual, num == _expectedCount);
}
}
}