public void Translate_CastMethodCallFilterExpression_ReturnsCorrectLinqExpression()
        {
            var filterExpression = FilterExpression.MethodCall(Function.Cast, FilterExpression.MemberAccess("TestObject"), FilterExpression.Constant(typeof(string)));

            var expression = _filterExpressionTranslator.Translate(filterExpression);

            var expected = GetLambdaBody(x => (string)x.TestObject);

            Assert.That(expression.ToString(), Is.EqualTo(expected.ToString()));
        }
        public void Translate_IndexOfFilterExpression_ReturnsCorrectLinqExpression()
        {
            var filterExpression = FilterExpression.MethodCall(Function.IndexOf, FilterExpression.MemberAccess("TestString"), FilterExpression.Constant("hi"));

            var expression = _filterExpressionTranslator.Translate(filterExpression);

            var expected = GetLambdaBody(x => x.TestString.IndexOf("hi"));

            Assert.That(expression.ToString(), Is.EqualTo(expected.ToString()));
        }
        public FilterExpression BuildExpression(Stack <Token> stack)
        {
            if (stack == null)
            {
                throw new ArgumentNullException("stack", "Cannot build function expression with a null expression stack.");
            }

            if (stack.Count < 1)
            {
                throw new ArgumentException("Cannot build function expression for function '{0}'. Not enough parameters.");
            }

            var token = stack.Pop();

            if (token == null)
            {
                throw new ArgumentException("Cannot parse a null token.");
            }

            var function = token.Value.GetFromODataQueryMethodName();

            var arity = function.Arity();

            if (stack.Count < arity)
            {
                throw new ArgumentException(String.Format("Cannot build function expression for function '{0}'. Not enough parameters.", function));
            }

            var arguments = new List <FilterExpression>();

            for (int i = 0; i < arity; i++)
            {
                var argument = _filterExpressionParserStrategy.BuildExpression(stack);
                arguments.Add(argument);
            }

            arguments.Reverse();

            var result = FilterExpression.MethodCall(function, arguments.ToArray());

            return(result);
        }