IndexerConstraint
IndexerConstraint extracts a named property and uses
its value as the actual value for a chained constraint.
using NUnit.Framework.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
namespace NUnit.Framework.Constraints
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public class IndexerConstraint : PrefixConstraint
{
private readonly Type[] _argumentTypes;
private readonly object[] _arguments;
public IndexerConstraint(IEnumerable<object> indexerArguments, IConstraint baseConstraint)
: this(indexerArguments.ToArray(), baseConstraint)
{
}
public IndexerConstraint(object[] indexerArguments, IConstraint baseConstraint)
: base(baseConstraint, "Default indexer accepting arguments " + MsgUtils.FormatCollection(indexerArguments, 0, 10))
{
_arguments = indexerArguments;
_argumentTypes = (from a in _arguments
select a.GetType()).ToArray();
}
public override ConstraintResult ApplyTo<[System.Runtime.CompilerServices.Nullable(2)] TActual>(TActual actual)
{
Guard.ArgumentNotNull(actual, "actual");
Type type = (actual as Type) ?? actual.GetType();
object actual2;
if (type.IsArray)
actual2 = (actual as Array)?.GetValue(_arguments.Cast<int>().ToArray());
else {
MethodInfo defaultIndexer = Reflect.GetDefaultIndexer(type, _argumentTypes);
if ((object)defaultIndexer == null) {
DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(19, 2);
defaultInterpolatedStringHandler.AppendFormatted(base.DescriptionPrefix);
defaultInterpolatedStringHandler.AppendLiteral(" was not found on ");
defaultInterpolatedStringHandler.AppendFormatted(type);
defaultInterpolatedStringHandler.AppendLiteral(".");
throw new ArgumentException(defaultInterpolatedStringHandler.ToStringAndClear());
}
MethodInfo method = defaultIndexer;
actual2 = Reflect.InvokeMethod(method, actual, _arguments);
}
return base.BaseConstraint.ApplyTo(actual2);
}
protected override string GetStringRepresentation()
{
DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(11, 2);
defaultInterpolatedStringHandler.AppendLiteral("<indexer ");
defaultInterpolatedStringHandler.AppendFormatted(MsgUtils.FormatCollection(_arguments, 0, 10));
defaultInterpolatedStringHandler.AppendLiteral(" ");
defaultInterpolatedStringHandler.AppendFormatted(base.BaseConstraint);
defaultInterpolatedStringHandler.AppendLiteral(">");
return defaultInterpolatedStringHandler.ToStringAndClear();
}
}
}