public string GetInvalidArgumentValueFailureMessage(IArrangement arrangement, IInvocation invocation) { var compareLogic = new CompareLogic(); var arrangementMethod = (IArrangementMethod)arrangement; var arrangementArguments = arrangementMethod.ArrangementArguments; IArrangementArgument arrangementArgument = null; for (var index = 0; index < arrangementArguments.Length; index++) { var arrangementArgumentValue = arrangementArguments[index].ArgumentValue; var invocationArgumentValue = invocation.Arguments[index]; var comparisonResult = compareLogic.Compare(arrangementArgumentValue, invocationArgumentValue); if (comparisonResult.AreEqual) { continue; } arrangementArgument = arrangementArguments[index]; break; } var ordinalPosition = arrangementArgument?.OrdinalPosition; var argumentName = arrangementArgument?.ArgumentName; var failureMessage = $"{arrangementMethod.MethodName} was not called with arranged argument " + $"for the {ordinalPosition} argument {{{argumentName}}}."; return(failureMessage); }
private static IArrangementArgument[] GetArrangementArguments(this Expression expression) { var methodCallExpression = (MethodCallExpression)expression; var readonlyOnlyExpressions = methodCallExpression.Arguments; var readonlyExpressionCount = readonlyOnlyExpressions.Count; var arrangementArguments = new IArrangementArgument[readonlyExpressionCount]; for (var index = 0; index < readonlyExpressionCount; index++) { var readonlyExpression = readonlyOnlyExpressions[index]; var member = Expression.Convert(readonlyExpression, typeof(object)); var lambda = Expression.Lambda <Func <object> >(member); var function = lambda.Compile(); var argumentValue = function(); var argumentType = argumentValue?.GetType(); var ordinalPosition = (index + 1).ToOrdinalWords(); string argumentName; string friendlyTypeName; if (argumentValue == null) { argumentName = $"{ordinalPosition} parameter"; friendlyTypeName = "(null)"; } else { friendlyTypeName = argumentType.GetFriendlyTypeName(); var operand = ((UnaryExpression)lambda.Body).Operand; argumentName = operand.NodeType == ExpressionType.MemberAccess ? (string)((dynamic)operand).Member.Name : $"{ordinalPosition} parameter"; } arrangementArguments[index] = new ArrangementArgument(argumentName, friendlyTypeName, ordinalPosition, argumentValue); } return(arrangementArguments); }