Пример #1
0
        public void CooperativeExpressionVisitor_MethodCall_Rewrite3()
        {
            var cv = new CooperativeExpressionVisitor();

            var m1 = (Expression <Func <MethOp, int, int> >)((m, x) => MethOp.Foo(MethOp.Qux(m.Bar(x))));

            var res = cv.Visit(m1.Body);
            var mr  = res as MethodCallExpression;

            Assert.IsNotNull(mr);
            Assert.IsNull(mr.Object);
            Assert.AreEqual("Foz", mr.Method.Name);

            var mi = mr.Arguments[0] as MethodCallExpression;

            Assert.IsNotNull(mi);
            Assert.IsNull(mi.Object);
            Assert.AreEqual("Qux", mi.Method.Name);

            var mj = mi.Arguments[0] as MethodCallExpression;

            Assert.IsNotNull(mj);
            Assert.AreSame(m1.Parameters[0], mj.Object);
            Assert.AreSame(m1.Parameters[1], mj.Arguments[0]);
        }
Пример #2
0
        public void CooperativeExpressionVisitor_Index_NoRewrite()
        {
            var cv = new CooperativeExpressionVisitor();

            var p1 = Expression.Parameter(typeof(List <string>));
            var i1 = Expression.Lambda(Expression.MakeIndex(p1, typeof(List <string>).GetProperty("Item"), new[] { Expression.Constant(42) }), p1);

            Assert.AreSame(i1, cv.Visit(i1));
        }
Пример #3
0
        public void CooperativeExpressionVisitor_Unary_NoRewrite()
        {
            var cv = new CooperativeExpressionVisitor();

            var u1 = (Expression <Func <int, int> >)(x => - x);

            Assert.AreSame(u1, cv.Visit(u1));

            var u2 = (Expression <Func <TimeSpan, TimeSpan> >)(x => - x);

            Assert.AreSame(u2, cv.Visit(u2));
        }
Пример #4
0
        public void CooperativeExpressionVisitor_Binary_NoRewrite()
        {
            var cv = new CooperativeExpressionVisitor();

            var b1 = (Expression <Func <int, int, int> >)((a, b) => a + b);

            Assert.AreSame(b1, cv.Visit(b1));

            var b2 = (Expression <Func <DateTime, TimeSpan, DateTime> >)((a, b) => a + b);

            Assert.AreSame(b2, cv.Visit(b2));
        }
Пример #5
0
        public void CooperativeExpressionVisitor_MethodCall_NoRewrite()
        {
            var cv = new CooperativeExpressionVisitor();

            var m1 = (Expression <Action <string> >)(s => Console.WriteLine(s));

            Assert.AreSame(m1, cv.Visit(m1));

            var m2 = (Expression <Func <TimeSpan, TimeSpan, TimeSpan> >)((t1, t2) => t1.Add(t2));

            Assert.AreSame(m2, cv.Visit(m2));
        }
Пример #6
0
        public void CooperativeExpressionVisitor_Member_NoRewrite()
        {
            var cv = new CooperativeExpressionVisitor();

            var m1 = (Expression <Func <Exception, string> >)(ex => ex.Message);

            Assert.AreSame(m1, cv.Visit(m1));

            var m2 = (Expression <Func <int> >)(() => new { a = 42, b = "bar" }.a);

            Assert.AreSame(m2, cv.Visit(m2));
        }
Пример #7
0
        public void CooperativeExpressionVisitor_Unary_Rewrite1()
        {
            var cv = new CooperativeExpressionVisitor();

            var u1 = (Expression <Func <UnOp, UnOp> >)(x => - x);

            var res = cv.Visit(u1.Body);
            var br  = res as UnaryExpression;

            Assert.IsNotNull(br);
            Assert.AreEqual(ExpressionType.UnaryPlus, br.NodeType);
            Assert.AreSame(u1.Parameters[0], br.Operand);
        }
Пример #8
0
        public void CooperativeExpressionVisitor_Member_Rewrite2()
        {
            var cv = new CooperativeExpressionVisitor();

            var m1 = (Expression <Func <int> >)(() => MemOp.Foo);

            var res = cv.Visit(m1.Body);
            var mr  = res as MemberExpression;

            Assert.IsNotNull(mr);
            Assert.IsNull(mr.Expression);
            Assert.AreEqual("Foz", mr.Member.Name);
        }
Пример #9
0
        public void CooperativeExpressionVisitor_Member_Rewrite1()
        {
            var cv = new CooperativeExpressionVisitor();

            var m1 = (Expression <Func <MemOp, int> >)(m => m.Bar);

            var res = cv.Visit(m1.Body);
            var mr  = res as MemberExpression;

            Assert.IsNotNull(mr);
            Assert.AreSame(m1.Parameters[0], mr.Expression);
            Assert.AreEqual("Baz", mr.Member.Name);
        }
Пример #10
0
        public void CooperativeExpressionVisitor_Binary_Rewrite1()
        {
            var cv = new CooperativeExpressionVisitor();

            var b1 = (Expression <Func <BinOp, BinOp, BinOp> >)((a, b) => a + b);

            var res = cv.Visit(b1.Body);
            var br  = res as BinaryExpression;

            Assert.IsNotNull(br);
            Assert.AreEqual(ExpressionType.Subtract, br.NodeType);
            Assert.AreSame(b1.Parameters[0], br.Left);
            Assert.AreSame(b1.Parameters[1], br.Right);
        }
Пример #11
0
        public void CooperativeExpressionVisitor_New_Rewrite1()
        {
            var cv = new CooperativeExpressionVisitor();

            var n1 = (Expression <Func <int, string, NewOp> >)((x, s) => new NewOp(x, s));

            var res = cv.Visit(n1.Body);
            var nr  = res as NewExpression;

            Assert.IsNotNull(nr);
            Assert.IsTrue(new[] { typeof(string), typeof(int) }.SequenceEqual(nr.Constructor.GetParameters().Select(p => p.ParameterType)));
            Assert.AreSame(n1.Parameters[1], nr.Arguments[0]);
            Assert.AreSame(n1.Parameters[0], nr.Arguments[1]);
        }
Пример #12
0
        public void CooperativeExpressionVisitor_MethodCall_Rewrite2()
        {
            var cv = new CooperativeExpressionVisitor();

            var m1 = (Expression <Func <int, int> >)(x => MethOp.Foo(x));

            var res = cv.Visit(m1.Body);
            var mr  = res as MethodCallExpression;

            Assert.IsNotNull(mr);
            Assert.IsNull(mr.Object);
            Assert.AreEqual("Foz", mr.Method.Name);
            Assert.AreSame(m1.Parameters[0], mr.Arguments[0]);
        }
Пример #13
0
        public void CooperativeExpressionVisitor_Index_Rewrite1()
        {
            var cv = new CooperativeExpressionVisitor();

            var p1 = Expression.Parameter(typeof(IndOp));
            var i1 = Expression.Lambda(Expression.MakeIndex(p1, typeof(IndOp).GetProperty("Item"), new[] { Expression.Constant(42) }), p1);

            var res = cv.Visit(i1.Body);
            var ir  = res as MethodCallExpression;

            Assert.IsNotNull(ir);
            Assert.AreEqual("Get", ir.Method.Name);

            Assert.AreSame(i1.Parameters[0], ir.Object);
        }
Пример #14
0
        public void CooperativeExpressionVisitor_New_NoRewrite()
        {
            var cv = new CooperativeExpressionVisitor();

            var n1 = (Expression <Func <Exception> >)(() => new Exception("foo"));

            Assert.AreSame(n1, cv.Visit(n1));

            var n2 = (Expression <Func <object> >)(() => new { a = 42, b = "bar" });

            Assert.AreSame(n2, cv.Visit(n2));

            var n3 = Expression.Lambda(Expression.New(typeof(int)));

            Assert.AreSame(n3, cv.Visit(n3));
        }