Example #1
0
        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);
        }