public void PartialEvalMemberInit()
        {
            Expression <Func <int, Test> > expr = x => new Test
            {
                List = new List <int>(x),
                Next =
                {
                    Next     =
                    {
                        List = { 1, 2, 3, x }
                    },
                    List     = { 1, 2, 3 }
                }
            };
            var evaled = (LambdaExpression)ExpressionEx.PartialEval(expr);

            Assert.Equal(ExpressionType.MemberInit, evaled.Body.NodeType);
            expr = x => new Test
            {
                List = new List <int>(3),
                Next =
                {
                    Next     =
                    {
                        List = { 1, 2, 3 }
                    },
                    List     = { 1, 2, 3 }
                }
            };
            evaled = (LambdaExpression)ExpressionEx.PartialEval(expr);
            Assert.Equal(ExpressionType.Constant, evaled.Body.NodeType);
        }
        public void PartialEvalListInit()
        {
            Expression <Func <int, List <int> > > expr = x => new List <int> {
                x, x, x, 2
            };

            Assert.Equal(ExpressionType.ListInit, expr.Body.NodeType);
            var evaled = (LambdaExpression)ExpressionEx.PartialEval(expr);

            Assert.Equal(ExpressionType.ListInit, evaled.Body.NodeType);

            expr = x => new List <int> {
                1, 2, 3, 4
            };
            Assert.Equal(ExpressionType.ListInit, expr.Body.NodeType);
            evaled = (LambdaExpression)ExpressionEx.PartialEval(expr);
            Assert.Equal(ExpressionType.Constant, evaled.Body.NodeType);

            expr = x => new List <int> {
                FuncEval(1), x
            };
            Assert.Equal(ExpressionType.ListInit, expr.Body.NodeType);
            var listInit = (ListInitExpression)expr.Body;

            Assert.Equal(ExpressionType.Call, listInit.Initializers[0].Arguments[0].NodeType);
            evaled = (LambdaExpression)ExpressionEx.PartialEval(expr);
            Assert.Equal(ExpressionType.ListInit, evaled.Body.NodeType);
            listInit = (ListInitExpression)evaled.Body;
            Assert.Equal(ExpressionType.Constant, listInit.Initializers[0].Arguments[0].NodeType);
        }
        public void PartialEvalDontEvalsWhatThrows()
        {
            Expression <Func <int> > test = () => 2 + FuncDontEval(1);
            var expr = test.Body;

            Assert.Equal(ExpressionType.Add, expr.NodeType);
            var evaled = ExpressionEx.PartialEval(expr);

            Assert.Equal(ExpressionType.Add, evaled.NodeType);
        }
        public void PartialEvalEvalsAll()
        {
            Expression <Func <int> > test = () => 2 + FuncEval(1);
            var expr = test.Body;

            Assert.Equal(ExpressionType.Add, expr.NodeType);
            var evaled = ExpressionEx.PartialEval(expr);

            Assert.Equal(ExpressionType.Constant, evaled.NodeType);
        }
        public void PartialEvalEvalsVoid()
        {
            var c = new ClassWithVoid();
            Expression <Action> test = () => c.SetValue(12);
            var expr = test.Body;

            Assert.Equal(ExpressionType.Call, expr.NodeType);
            var evaled = ExpressionEx.PartialEval(expr);

            Assert.Equal(ExpressionType.Default, evaled.NodeType);
            Assert.Equal(12, c.Value);
        }
        public void PartialDontEvalsVoidThatThrows()
        {
            var c = new ClassWithVoid();
            Expression <Action> test = () => c.InvokeWith42(10);
            var expr = test.Body;

            Assert.Equal(ExpressionType.Call, expr.NodeType);
            var evaled = ExpressionEx.PartialEval(expr);

            Assert.Equal(ExpressionType.Call, evaled.NodeType);
            test = () => c.InvokeWith42(42);

            expr = test.Body;
            Assert.Equal(ExpressionType.Call, expr.NodeType);
            evaled = ExpressionEx.PartialEval(expr);
            Assert.Equal(ExpressionType.Default, evaled.NodeType);

            Assert.Equal(42, c.Value);
        }