public void Evaluation_Throws_Exception_On_Variable_Encounter()
        {
            var variableExpression = new Variable()
            {
                Name = "a"
            };
            var    visitor = new EvaluatingExpressionVisitor();
            Action a       = () => visitor.Evaluate(variableExpression, null);

            a.ShouldThrow <InvalidOperationException>();
        }
        public void EvaluateReplacesExpressionsWithConstantExpressions()
        {
            Expression <Func <DateTime> > call = () => DateTime.Now.Subtract(TimeSpan.FromHours(5));
            var nodeToEvaluate = FlatteningExpressionVisitor.Flatten(call).OfType <MethodCallExpression>().Single(s => s.Method.Name == "FromHours");

            var evaluation = EvaluatingExpressionVisitor.Evaluate(call, new HashSet <Expression>(new[] { nodeToEvaluate }));

            var constantNodes = FlatteningExpressionVisitor.Flatten(evaluation).OfType <ConstantExpression>().ToArray();

            Assert.Equal(1, constantNodes.Length);
            Assert.Equal(TimeSpan.FromHours(5), constantNodes.Single().Value);
        }