Performs evaluation of the LINQ Expression.
Inheritance: System.Linq.Expressions.ExpressionVisitor
        public void ClosureOnClassConstant()
        {
            // Arrange
            var evaluator = new ExpressionEvaluator();
            Expression<Func<string>> lambda = () => string.Empty;

            // Act
            Expression result = evaluator.Evaluate(lambda.Body);

            // Assert
            Assert.IsType<ConstantExpression>(result);
            Assert.Equal(string.Empty, ((ConstantExpression) result).Value);
        }
        public void ClosureOnCastOfEnumValue()
        {
            // Arrange
            var country = Countries.Finland;
            var evaluator = new ExpressionEvaluator();
            Expression<Func<int>> lambda = () => (int)country;

            // Act
            Expression result = evaluator.Evaluate(lambda.Body);

            // Assert
            Assert.IsType<ConstantExpression>(result);
            Assert.Equal((int)country, ((ConstantExpression)result).Value);
        }
        public void ClosureOnLocalVariable()
        {
            // Arrange
            string value = "String value";
            var evaluator = new ExpressionEvaluator();
            Expression<Func<string>> lambda = () => value;

            // Act
            Expression result = evaluator.Evaluate(lambda.Body);

            // Assert
            Assert.IsType<ConstantExpression>(result);
            Assert.Equal(value, ((ConstantExpression) result).Value);
        }
        public void ClosureOnEnumValue()
        {
            // Arrange
            var country = Countries.Finland;
            var evaluator = new ExpressionEvaluator();
            Expression<Func<string>> lambda = () => country.ToString();

            // Act
            Expression result = evaluator.Evaluate(lambda.Body);

            // Assert
            Assert.IsType<ConstantExpression>(result);
            Assert.Equal(country.ToString(), ((ConstantExpression) result).Value);
        }
 /// <summary>
 ///     Constructor.
 /// </summary>
 /// <param name="nameChanges"></param>
 internal ExpressionTranslator(IDictionary<string, string> nameChanges)
 {
     _nameChanges = nameChanges;
     _constantEvaluator = new ExpressionEvaluator();
 }
        public void MeasureEvaluationTime()
        {
            // Arrange
            var evaluator = new ExpressionEvaluator();
            var country = new Country {Continent = "abc"};
            Expression<Func<string>> lambda = () => country.Continent;
            var stopwatch = new Stopwatch();

            // Act
            evaluator.Evaluate(lambda.Body);
            stopwatch.Start();
            for (int i = 0; i < 60000000; i++)
            {
                country.Continent = i.ToString(CultureInfo.InvariantCulture);
                evaluator.Evaluate(lambda.Body);
            }
            stopwatch.Stop();
        }
        public void ClosureOnFunctionValue()
        {
            // Arrange
            var evaluator = new ExpressionEvaluator();
            Expression<Func<string>> lambda = () => GetTestString();

            // Act
            Expression result = evaluator.Evaluate(lambda.Body);

            // Assert
            Assert.IsType<ConstantExpression>(result);
            Assert.Equal(GetTestString(), ((ConstantExpression) result).Value);
        }
        public void ClosureOnForeachLoopValue()
        {
            // Arrange
            var evaluator = new ExpressionEvaluator();
            var data = new byte[] {0x11, 0x22, 0x33};
            var values = new List<object>(data.Length);

            // Act
            // ReSharper disable AccessToForEachVariableInClosure
            // ReSharper disable LoopCanBeConvertedToQuery
            foreach (byte value in data)
            {
                Expression<Func<byte>> lambda = () => value;
                var result = (ConstantExpression) evaluator.Evaluate(lambda.Body);
                values.Add(result.Value);
            }
            // ReSharper restore LoopCanBeConvertedToQuery
            // ReSharper restore AccessToForEachVariableInClosure

            // Assert
            Assert.Equal(data.Length, values.Count);
            foreach (byte value in data)
            {
                Assert.Contains(value, values);
            }
        }
        public void ClosureOnLocalConstant()
        {
            // Arrange
            const long value = 0xfefefe;
            var evaluator = new ExpressionEvaluator();
            Expression<Func<long>> lambda = () => value;

            // Act
            Expression result = evaluator.Evaluate(lambda.Body);

            // Assert
            Assert.IsType<ConstantExpression>(result);
            Assert.Equal(value, ((ConstantExpression) result).Value);
        }
        public void ClosureOnVariableWithField()
        {
            // Arrange
            var evaluator = new ExpressionEvaluator();
            var user = new Entity {PublicField = 123};
            Expression<Func<int>> lambda = () => user.PublicField;

            // Act
            Expression result = evaluator.Evaluate(lambda.Body);

            // Assert
            Assert.IsType<ConstantExpression>(result);
            Assert.Equal(user.PublicField, ((ConstantExpression) result).Value);
        }
        public void ClosureOnVariableWithNotAutoProperty()
        {
            // Arrange
            var evaluator = new ExpressionEvaluator();
            var user = new Entity();
            Expression<Func<byte[]>> lambda = () => user.NotAutoProperty;

            // Act
            Expression result = evaluator.Evaluate(lambda.Body);

            // Assert
            Assert.IsType<ConstantExpression>(result);
            Assert.Equal(user.NotAutoProperty, ((ConstantExpression) result).Value);
        }
        // ReSharper restore ConvertToConstant.Local

        public void ClosureOnVariableWithProperty()
        {
            // Arrange
            var evaluator = new ExpressionEvaluator();
            var country = new Country {Continent = "abc"};
            Expression<Func<string>> lambda = () => country.Continent;

            // Act
            Expression result = evaluator.Evaluate(lambda.Body);

            // Assert
            Assert.IsType<ConstantExpression>(result);
            Assert.Equal(country.Continent, ((ConstantExpression) result).Value);
        }