Esempio n. 1
0
        public void DynamicAwait_Visitor()
        {
            var res = DynamicCSharpExpression.DynamicAwait(Expression.Default(typeof(Task <int>)));

            var v = new V();

            Assert.AreSame(res, v.Visit(res));
            Assert.IsTrue(v.Visited);
        }
Esempio n. 2
0
        public void DynamicAwait_Compile()
        {
            var e    = Expression.Constant(Task.FromResult(42));
            var expr = DynamicCSharpExpression.DynamicAwait(e);

            var f = CSharpExpression.AsyncLambda <Func <Task <object> > >(expr);

            Assert.AreEqual(42, f.Compile()().Result);
        }
Esempio n. 3
0
        public void DynamicAwait_Properties_Void()
        {
            var e    = Expression.Default(typeof(Task));
            var expr = DynamicCSharpExpression.DynamicAwait(e, true);

            Assert.AreEqual(CSharpExpressionType.Await, expr.CSharpNodeType);
            Assert.AreSame(e, expr.Operand);
            Assert.AreEqual(typeof(void), expr.Type);
            Assert.IsNull(expr.GetAwaiterMethod);
        }
Esempio n. 4
0
        public void DynamicAwait_CantReduce()
        {
            var e    = Expression.Default(typeof(Task <int>));
            var expr = DynamicCSharpExpression.DynamicAwait(e);

            Assert.IsFalse(expr.CanReduce);
            Assert.AreSame(expr, expr.Reduce());

            var f = Expression.Lambda <Func <object> >(expr);

            AssertEx.Throws <ArgumentException>(() => f.Compile());
        }
Esempio n. 5
0
        public void DynamicAwait_Update()
        {
            var e    = Expression.Default(typeof(Task <int>));
            var expr = DynamicCSharpExpression.DynamicAwait(e);

            Assert.AreSame(expr, expr.Update(e));

            var f   = Expression.Default(typeof(Task <int>));
            var upd = expr.Update(f);

            Assert.AreNotSame(upd, expr);
            Assert.AreSame(f, upd.Operand);
        }
        public void DynamicAwait_Properties_Void()
        {
            var e    = Expression.Default(typeof(Task));
            var expr = DynamicCSharpExpression.DynamicAwait(e, true);

            Assert.AreEqual(CSharpExpressionType.Await, expr.CSharpNodeType);
            Assert.AreSame(e, expr.Operand);
            Assert.AreEqual(typeof(void), expr.Type);
            Assert.IsTrue(expr.Info.IsDynamic);

            if (expr.Info is DynamicAwaitInfo d)
            {
                Assert.IsNull(d.Context);
                Assert.IsTrue(d.ResultDiscarded);
            }
            else
            {
                Assert.Fail();
            }
        }
Esempio n. 7
0
 public void DynamicAwait_Factory_ArgumentChecking()
 {
     AssertEx.Throws <ArgumentNullException>(() => DynamicCSharpExpression.DynamicAwait(default(Expression)));
     AssertEx.Throws <ArgumentNullException>(() => DynamicCSharpExpression.DynamicAwait(default(Expression), false));
     AssertEx.Throws <ArgumentNullException>(() => DynamicCSharpExpression.DynamicAwait(default(Expression), false, typeof(DynamicAwaitTests)));
 }
        public void Dynamic_UnaryAssign_GeneratedFactories()
        {
            var oe = Expression.Parameter(typeof(object));

            var od = DynamicCSharpExpression.DynamicArgument(oe);

            var ue0 = DynamicCSharpExpression.DynamicPreIncrementAssign(oe);

            Assert.AreEqual(CSharpExpressionType.PreIncrementAssign, ue0.OperationNodeType);
            Assert.AreSame(oe, ue0.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue0.Flags);

            var ud0 = DynamicCSharpExpression.DynamicPreIncrementAssign(od);

            Assert.AreEqual(CSharpExpressionType.PreIncrementAssign, ud0.OperationNodeType);
            Assert.AreSame(od, ud0.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud0.Flags);

            var uf0 = DynamicCSharpExpression.DynamicPreIncrementAssign(od, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.PreIncrementAssign, uf0.OperationNodeType);
            Assert.AreSame(od, uf0.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf0.Flags);

            var uc0 = DynamicCSharpExpression.DynamicPreIncrementAssign(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.PreIncrementAssign, uc0.OperationNodeType);
            Assert.AreSame(od, uc0.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc0.Flags);
            Assert.AreEqual(typeof(int), uc0.Context);

            var ue1 = DynamicCSharpExpression.DynamicPreDecrementAssign(oe);

            Assert.AreEqual(CSharpExpressionType.PreDecrementAssign, ue1.OperationNodeType);
            Assert.AreSame(oe, ue1.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue1.Flags);

            var ud1 = DynamicCSharpExpression.DynamicPreDecrementAssign(od);

            Assert.AreEqual(CSharpExpressionType.PreDecrementAssign, ud1.OperationNodeType);
            Assert.AreSame(od, ud1.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud1.Flags);

            var uf1 = DynamicCSharpExpression.DynamicPreDecrementAssign(od, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.PreDecrementAssign, uf1.OperationNodeType);
            Assert.AreSame(od, uf1.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf1.Flags);

            var uc1 = DynamicCSharpExpression.DynamicPreDecrementAssign(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.PreDecrementAssign, uc1.OperationNodeType);
            Assert.AreSame(od, uc1.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc1.Flags);
            Assert.AreEqual(typeof(int), uc1.Context);

            var ue2 = DynamicCSharpExpression.DynamicPostIncrementAssign(oe);

            Assert.AreEqual(CSharpExpressionType.PostIncrementAssign, ue2.OperationNodeType);
            Assert.AreSame(oe, ue2.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue2.Flags);

            var ud2 = DynamicCSharpExpression.DynamicPostIncrementAssign(od);

            Assert.AreEqual(CSharpExpressionType.PostIncrementAssign, ud2.OperationNodeType);
            Assert.AreSame(od, ud2.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud2.Flags);

            var uf2 = DynamicCSharpExpression.DynamicPostIncrementAssign(od, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.PostIncrementAssign, uf2.OperationNodeType);
            Assert.AreSame(od, uf2.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf2.Flags);

            var uc2 = DynamicCSharpExpression.DynamicPostIncrementAssign(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.PostIncrementAssign, uc2.OperationNodeType);
            Assert.AreSame(od, uc2.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc2.Flags);
            Assert.AreEqual(typeof(int), uc2.Context);

            var ue3 = DynamicCSharpExpression.DynamicPostDecrementAssign(oe);

            Assert.AreEqual(CSharpExpressionType.PostDecrementAssign, ue3.OperationNodeType);
            Assert.AreSame(oe, ue3.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue3.Flags);

            var ud3 = DynamicCSharpExpression.DynamicPostDecrementAssign(od);

            Assert.AreEqual(CSharpExpressionType.PostDecrementAssign, ud3.OperationNodeType);
            Assert.AreSame(od, ud3.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud3.Flags);

            var uf3 = DynamicCSharpExpression.DynamicPostDecrementAssign(od, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.PostDecrementAssign, uf3.OperationNodeType);
            Assert.AreSame(od, uf3.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf3.Flags);

            var uc3 = DynamicCSharpExpression.DynamicPostDecrementAssign(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.PostDecrementAssign, uc3.OperationNodeType);
            Assert.AreSame(od, uc3.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc3.Flags);
            Assert.AreEqual(typeof(int), uc3.Context);

            var ue4 = DynamicCSharpExpression.DynamicPreIncrementAssignChecked(oe);

            Assert.AreEqual(CSharpExpressionType.PreIncrementAssignChecked, ue4.OperationNodeType);
            Assert.AreSame(oe, ue4.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, ue4.Flags);

            var ud4 = DynamicCSharpExpression.DynamicPreIncrementAssignChecked(od);

            Assert.AreEqual(CSharpExpressionType.PreIncrementAssignChecked, ud4.OperationNodeType);
            Assert.AreSame(od, ud4.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, ud4.Flags);

            var uf4 = DynamicCSharpExpression.DynamicPreIncrementAssignChecked(od, CSharpBinderFlags.CheckedContext);

            Assert.AreEqual(CSharpExpressionType.PreIncrementAssignChecked, uf4.OperationNodeType);
            Assert.AreSame(od, uf4.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, uf4.Flags);

            var uc4 = DynamicCSharpExpression.DynamicPreIncrementAssignChecked(od, CSharpBinderFlags.CheckedContext, typeof(int));

            Assert.AreEqual(CSharpExpressionType.PreIncrementAssignChecked, uc4.OperationNodeType);
            Assert.AreSame(od, uc4.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, uc4.Flags);
            Assert.AreEqual(typeof(int), uc4.Context);

            var ue5 = DynamicCSharpExpression.DynamicPreDecrementAssignChecked(oe);

            Assert.AreEqual(CSharpExpressionType.PreDecrementAssignChecked, ue5.OperationNodeType);
            Assert.AreSame(oe, ue5.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, ue5.Flags);

            var ud5 = DynamicCSharpExpression.DynamicPreDecrementAssignChecked(od);

            Assert.AreEqual(CSharpExpressionType.PreDecrementAssignChecked, ud5.OperationNodeType);
            Assert.AreSame(od, ud5.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, ud5.Flags);

            var uf5 = DynamicCSharpExpression.DynamicPreDecrementAssignChecked(od, CSharpBinderFlags.CheckedContext);

            Assert.AreEqual(CSharpExpressionType.PreDecrementAssignChecked, uf5.OperationNodeType);
            Assert.AreSame(od, uf5.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, uf5.Flags);

            var uc5 = DynamicCSharpExpression.DynamicPreDecrementAssignChecked(od, CSharpBinderFlags.CheckedContext, typeof(int));

            Assert.AreEqual(CSharpExpressionType.PreDecrementAssignChecked, uc5.OperationNodeType);
            Assert.AreSame(od, uc5.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, uc5.Flags);
            Assert.AreEqual(typeof(int), uc5.Context);

            var ue6 = DynamicCSharpExpression.DynamicPostIncrementAssignChecked(oe);

            Assert.AreEqual(CSharpExpressionType.PostIncrementAssignChecked, ue6.OperationNodeType);
            Assert.AreSame(oe, ue6.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, ue6.Flags);

            var ud6 = DynamicCSharpExpression.DynamicPostIncrementAssignChecked(od);

            Assert.AreEqual(CSharpExpressionType.PostIncrementAssignChecked, ud6.OperationNodeType);
            Assert.AreSame(od, ud6.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, ud6.Flags);

            var uf6 = DynamicCSharpExpression.DynamicPostIncrementAssignChecked(od, CSharpBinderFlags.CheckedContext);

            Assert.AreEqual(CSharpExpressionType.PostIncrementAssignChecked, uf6.OperationNodeType);
            Assert.AreSame(od, uf6.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, uf6.Flags);

            var uc6 = DynamicCSharpExpression.DynamicPostIncrementAssignChecked(od, CSharpBinderFlags.CheckedContext, typeof(int));

            Assert.AreEqual(CSharpExpressionType.PostIncrementAssignChecked, uc6.OperationNodeType);
            Assert.AreSame(od, uc6.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, uc6.Flags);
            Assert.AreEqual(typeof(int), uc6.Context);

            var ue7 = DynamicCSharpExpression.DynamicPostDecrementAssignChecked(oe);

            Assert.AreEqual(CSharpExpressionType.PostDecrementAssignChecked, ue7.OperationNodeType);
            Assert.AreSame(oe, ue7.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, ue7.Flags);

            var ud7 = DynamicCSharpExpression.DynamicPostDecrementAssignChecked(od);

            Assert.AreEqual(CSharpExpressionType.PostDecrementAssignChecked, ud7.OperationNodeType);
            Assert.AreSame(od, ud7.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, ud7.Flags);

            var uf7 = DynamicCSharpExpression.DynamicPostDecrementAssignChecked(od, CSharpBinderFlags.CheckedContext);

            Assert.AreEqual(CSharpExpressionType.PostDecrementAssignChecked, uf7.OperationNodeType);
            Assert.AreSame(od, uf7.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, uf7.Flags);

            var uc7 = DynamicCSharpExpression.DynamicPostDecrementAssignChecked(od, CSharpBinderFlags.CheckedContext, typeof(int));

            Assert.AreEqual(CSharpExpressionType.PostDecrementAssignChecked, uc7.OperationNodeType);
            Assert.AreSame(od, uc7.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, uc7.Flags);
            Assert.AreEqual(typeof(int), uc7.Context);
        }
        public void Dynamic_BinaryAssign_GeneratedFactories()
        {
            var le = Expression.Parameter(typeof(object));
            var re = Expression.Constant(2);

            var ld = DynamicCSharpExpression.DynamicArgument(le);
            var rd = DynamicCSharpExpression.DynamicArgument(re);

            var be0 = DynamicCSharpExpression.DynamicAssign(le, re);

            Assert.AreEqual(CSharpExpressionType.Assign, be0.OperationNodeType);
            Assert.AreSame(le, be0.Left.Expression);
            Assert.AreSame(re, be0.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be0.Flags);

            var bd0 = DynamicCSharpExpression.DynamicAssign(ld, rd);

            Assert.AreEqual(CSharpExpressionType.Assign, bd0.OperationNodeType);
            Assert.AreSame(ld, bd0.Left);
            Assert.AreSame(rd, bd0.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd0.Flags);

            var bf0 = DynamicCSharpExpression.DynamicAssign(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.Assign, bf0.OperationNodeType);
            Assert.AreSame(ld, bf0.Left);
            Assert.AreSame(rd, bf0.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf0.Flags);

            var bc0 = DynamicCSharpExpression.DynamicAssign(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.Assign, bc0.OperationNodeType);
            Assert.AreSame(ld, bc0.Left);
            Assert.AreSame(rd, bc0.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc0.Flags);
            Assert.AreEqual(typeof(int), bc0.Context);

            var be1 = DynamicCSharpExpression.DynamicAddAssign(le, re);

            Assert.AreEqual(CSharpExpressionType.AddAssign, be1.OperationNodeType);
            Assert.AreSame(le, be1.Left.Expression);
            Assert.AreSame(re, be1.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be1.Flags);

            var bd1 = DynamicCSharpExpression.DynamicAddAssign(ld, rd);

            Assert.AreEqual(CSharpExpressionType.AddAssign, bd1.OperationNodeType);
            Assert.AreSame(ld, bd1.Left);
            Assert.AreSame(rd, bd1.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd1.Flags);

            var bf1 = DynamicCSharpExpression.DynamicAddAssign(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.AddAssign, bf1.OperationNodeType);
            Assert.AreSame(ld, bf1.Left);
            Assert.AreSame(rd, bf1.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf1.Flags);

            var bc1 = DynamicCSharpExpression.DynamicAddAssign(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.AddAssign, bc1.OperationNodeType);
            Assert.AreSame(ld, bc1.Left);
            Assert.AreSame(rd, bc1.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc1.Flags);
            Assert.AreEqual(typeof(int), bc1.Context);

            var be2 = DynamicCSharpExpression.DynamicAndAssign(le, re);

            Assert.AreEqual(CSharpExpressionType.AndAssign, be2.OperationNodeType);
            Assert.AreSame(le, be2.Left.Expression);
            Assert.AreSame(re, be2.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be2.Flags);

            var bd2 = DynamicCSharpExpression.DynamicAndAssign(ld, rd);

            Assert.AreEqual(CSharpExpressionType.AndAssign, bd2.OperationNodeType);
            Assert.AreSame(ld, bd2.Left);
            Assert.AreSame(rd, bd2.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd2.Flags);

            var bf2 = DynamicCSharpExpression.DynamicAndAssign(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.AndAssign, bf2.OperationNodeType);
            Assert.AreSame(ld, bf2.Left);
            Assert.AreSame(rd, bf2.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf2.Flags);

            var bc2 = DynamicCSharpExpression.DynamicAndAssign(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.AndAssign, bc2.OperationNodeType);
            Assert.AreSame(ld, bc2.Left);
            Assert.AreSame(rd, bc2.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc2.Flags);
            Assert.AreEqual(typeof(int), bc2.Context);

            var be3 = DynamicCSharpExpression.DynamicDivideAssign(le, re);

            Assert.AreEqual(CSharpExpressionType.DivideAssign, be3.OperationNodeType);
            Assert.AreSame(le, be3.Left.Expression);
            Assert.AreSame(re, be3.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be3.Flags);

            var bd3 = DynamicCSharpExpression.DynamicDivideAssign(ld, rd);

            Assert.AreEqual(CSharpExpressionType.DivideAssign, bd3.OperationNodeType);
            Assert.AreSame(ld, bd3.Left);
            Assert.AreSame(rd, bd3.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd3.Flags);

            var bf3 = DynamicCSharpExpression.DynamicDivideAssign(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.DivideAssign, bf3.OperationNodeType);
            Assert.AreSame(ld, bf3.Left);
            Assert.AreSame(rd, bf3.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf3.Flags);

            var bc3 = DynamicCSharpExpression.DynamicDivideAssign(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.DivideAssign, bc3.OperationNodeType);
            Assert.AreSame(ld, bc3.Left);
            Assert.AreSame(rd, bc3.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc3.Flags);
            Assert.AreEqual(typeof(int), bc3.Context);

            var be4 = DynamicCSharpExpression.DynamicExclusiveOrAssign(le, re);

            Assert.AreEqual(CSharpExpressionType.ExclusiveOrAssign, be4.OperationNodeType);
            Assert.AreSame(le, be4.Left.Expression);
            Assert.AreSame(re, be4.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be4.Flags);

            var bd4 = DynamicCSharpExpression.DynamicExclusiveOrAssign(ld, rd);

            Assert.AreEqual(CSharpExpressionType.ExclusiveOrAssign, bd4.OperationNodeType);
            Assert.AreSame(ld, bd4.Left);
            Assert.AreSame(rd, bd4.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd4.Flags);

            var bf4 = DynamicCSharpExpression.DynamicExclusiveOrAssign(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.ExclusiveOrAssign, bf4.OperationNodeType);
            Assert.AreSame(ld, bf4.Left);
            Assert.AreSame(rd, bf4.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf4.Flags);

            var bc4 = DynamicCSharpExpression.DynamicExclusiveOrAssign(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.ExclusiveOrAssign, bc4.OperationNodeType);
            Assert.AreSame(ld, bc4.Left);
            Assert.AreSame(rd, bc4.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc4.Flags);
            Assert.AreEqual(typeof(int), bc4.Context);

            var be5 = DynamicCSharpExpression.DynamicLeftShiftAssign(le, re);

            Assert.AreEqual(CSharpExpressionType.LeftShiftAssign, be5.OperationNodeType);
            Assert.AreSame(le, be5.Left.Expression);
            Assert.AreSame(re, be5.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be5.Flags);

            var bd5 = DynamicCSharpExpression.DynamicLeftShiftAssign(ld, rd);

            Assert.AreEqual(CSharpExpressionType.LeftShiftAssign, bd5.OperationNodeType);
            Assert.AreSame(ld, bd5.Left);
            Assert.AreSame(rd, bd5.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd5.Flags);

            var bf5 = DynamicCSharpExpression.DynamicLeftShiftAssign(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.LeftShiftAssign, bf5.OperationNodeType);
            Assert.AreSame(ld, bf5.Left);
            Assert.AreSame(rd, bf5.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf5.Flags);

            var bc5 = DynamicCSharpExpression.DynamicLeftShiftAssign(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.LeftShiftAssign, bc5.OperationNodeType);
            Assert.AreSame(ld, bc5.Left);
            Assert.AreSame(rd, bc5.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc5.Flags);
            Assert.AreEqual(typeof(int), bc5.Context);

            var be6 = DynamicCSharpExpression.DynamicModuloAssign(le, re);

            Assert.AreEqual(CSharpExpressionType.ModuloAssign, be6.OperationNodeType);
            Assert.AreSame(le, be6.Left.Expression);
            Assert.AreSame(re, be6.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be6.Flags);

            var bd6 = DynamicCSharpExpression.DynamicModuloAssign(ld, rd);

            Assert.AreEqual(CSharpExpressionType.ModuloAssign, bd6.OperationNodeType);
            Assert.AreSame(ld, bd6.Left);
            Assert.AreSame(rd, bd6.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd6.Flags);

            var bf6 = DynamicCSharpExpression.DynamicModuloAssign(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.ModuloAssign, bf6.OperationNodeType);
            Assert.AreSame(ld, bf6.Left);
            Assert.AreSame(rd, bf6.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf6.Flags);

            var bc6 = DynamicCSharpExpression.DynamicModuloAssign(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.ModuloAssign, bc6.OperationNodeType);
            Assert.AreSame(ld, bc6.Left);
            Assert.AreSame(rd, bc6.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc6.Flags);
            Assert.AreEqual(typeof(int), bc6.Context);

            var be7 = DynamicCSharpExpression.DynamicMultiplyAssign(le, re);

            Assert.AreEqual(CSharpExpressionType.MultiplyAssign, be7.OperationNodeType);
            Assert.AreSame(le, be7.Left.Expression);
            Assert.AreSame(re, be7.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be7.Flags);

            var bd7 = DynamicCSharpExpression.DynamicMultiplyAssign(ld, rd);

            Assert.AreEqual(CSharpExpressionType.MultiplyAssign, bd7.OperationNodeType);
            Assert.AreSame(ld, bd7.Left);
            Assert.AreSame(rd, bd7.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd7.Flags);

            var bf7 = DynamicCSharpExpression.DynamicMultiplyAssign(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.MultiplyAssign, bf7.OperationNodeType);
            Assert.AreSame(ld, bf7.Left);
            Assert.AreSame(rd, bf7.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf7.Flags);

            var bc7 = DynamicCSharpExpression.DynamicMultiplyAssign(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.MultiplyAssign, bc7.OperationNodeType);
            Assert.AreSame(ld, bc7.Left);
            Assert.AreSame(rd, bc7.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc7.Flags);
            Assert.AreEqual(typeof(int), bc7.Context);

            var be8 = DynamicCSharpExpression.DynamicOrAssign(le, re);

            Assert.AreEqual(CSharpExpressionType.OrAssign, be8.OperationNodeType);
            Assert.AreSame(le, be8.Left.Expression);
            Assert.AreSame(re, be8.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be8.Flags);

            var bd8 = DynamicCSharpExpression.DynamicOrAssign(ld, rd);

            Assert.AreEqual(CSharpExpressionType.OrAssign, bd8.OperationNodeType);
            Assert.AreSame(ld, bd8.Left);
            Assert.AreSame(rd, bd8.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd8.Flags);

            var bf8 = DynamicCSharpExpression.DynamicOrAssign(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.OrAssign, bf8.OperationNodeType);
            Assert.AreSame(ld, bf8.Left);
            Assert.AreSame(rd, bf8.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf8.Flags);

            var bc8 = DynamicCSharpExpression.DynamicOrAssign(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.OrAssign, bc8.OperationNodeType);
            Assert.AreSame(ld, bc8.Left);
            Assert.AreSame(rd, bc8.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc8.Flags);
            Assert.AreEqual(typeof(int), bc8.Context);

            var be9 = DynamicCSharpExpression.DynamicRightShiftAssign(le, re);

            Assert.AreEqual(CSharpExpressionType.RightShiftAssign, be9.OperationNodeType);
            Assert.AreSame(le, be9.Left.Expression);
            Assert.AreSame(re, be9.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be9.Flags);

            var bd9 = DynamicCSharpExpression.DynamicRightShiftAssign(ld, rd);

            Assert.AreEqual(CSharpExpressionType.RightShiftAssign, bd9.OperationNodeType);
            Assert.AreSame(ld, bd9.Left);
            Assert.AreSame(rd, bd9.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd9.Flags);

            var bf9 = DynamicCSharpExpression.DynamicRightShiftAssign(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.RightShiftAssign, bf9.OperationNodeType);
            Assert.AreSame(ld, bf9.Left);
            Assert.AreSame(rd, bf9.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf9.Flags);

            var bc9 = DynamicCSharpExpression.DynamicRightShiftAssign(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.RightShiftAssign, bc9.OperationNodeType);
            Assert.AreSame(ld, bc9.Left);
            Assert.AreSame(rd, bc9.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc9.Flags);
            Assert.AreEqual(typeof(int), bc9.Context);

            var be10 = DynamicCSharpExpression.DynamicSubtractAssign(le, re);

            Assert.AreEqual(CSharpExpressionType.SubtractAssign, be10.OperationNodeType);
            Assert.AreSame(le, be10.Left.Expression);
            Assert.AreSame(re, be10.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be10.Flags);

            var bd10 = DynamicCSharpExpression.DynamicSubtractAssign(ld, rd);

            Assert.AreEqual(CSharpExpressionType.SubtractAssign, bd10.OperationNodeType);
            Assert.AreSame(ld, bd10.Left);
            Assert.AreSame(rd, bd10.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd10.Flags);

            var bf10 = DynamicCSharpExpression.DynamicSubtractAssign(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(CSharpExpressionType.SubtractAssign, bf10.OperationNodeType);
            Assert.AreSame(ld, bf10.Left);
            Assert.AreSame(rd, bf10.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf10.Flags);

            var bc10 = DynamicCSharpExpression.DynamicSubtractAssign(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(CSharpExpressionType.SubtractAssign, bc10.OperationNodeType);
            Assert.AreSame(ld, bc10.Left);
            Assert.AreSame(rd, bc10.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc10.Flags);
            Assert.AreEqual(typeof(int), bc10.Context);

            var be11 = DynamicCSharpExpression.DynamicAddAssignChecked(le, re);

            Assert.AreEqual(CSharpExpressionType.AddAssignChecked, be11.OperationNodeType);
            Assert.AreSame(le, be11.Left.Expression);
            Assert.AreSame(re, be11.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, be11.Flags);

            var bd11 = DynamicCSharpExpression.DynamicAddAssignChecked(ld, rd);

            Assert.AreEqual(CSharpExpressionType.AddAssignChecked, bd11.OperationNodeType);
            Assert.AreSame(ld, bd11.Left);
            Assert.AreSame(rd, bd11.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bd11.Flags);

            var bf11 = DynamicCSharpExpression.DynamicAddAssignChecked(ld, rd, CSharpBinderFlags.CheckedContext);

            Assert.AreEqual(CSharpExpressionType.AddAssignChecked, bf11.OperationNodeType);
            Assert.AreSame(ld, bf11.Left);
            Assert.AreSame(rd, bf11.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bf11.Flags);

            var bc11 = DynamicCSharpExpression.DynamicAddAssignChecked(ld, rd, CSharpBinderFlags.CheckedContext, typeof(int));

            Assert.AreEqual(CSharpExpressionType.AddAssignChecked, bc11.OperationNodeType);
            Assert.AreSame(ld, bc11.Left);
            Assert.AreSame(rd, bc11.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bc11.Flags);
            Assert.AreEqual(typeof(int), bc11.Context);

            var be12 = DynamicCSharpExpression.DynamicMultiplyAssignChecked(le, re);

            Assert.AreEqual(CSharpExpressionType.MultiplyAssignChecked, be12.OperationNodeType);
            Assert.AreSame(le, be12.Left.Expression);
            Assert.AreSame(re, be12.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, be12.Flags);

            var bd12 = DynamicCSharpExpression.DynamicMultiplyAssignChecked(ld, rd);

            Assert.AreEqual(CSharpExpressionType.MultiplyAssignChecked, bd12.OperationNodeType);
            Assert.AreSame(ld, bd12.Left);
            Assert.AreSame(rd, bd12.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bd12.Flags);

            var bf12 = DynamicCSharpExpression.DynamicMultiplyAssignChecked(ld, rd, CSharpBinderFlags.CheckedContext);

            Assert.AreEqual(CSharpExpressionType.MultiplyAssignChecked, bf12.OperationNodeType);
            Assert.AreSame(ld, bf12.Left);
            Assert.AreSame(rd, bf12.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bf12.Flags);

            var bc12 = DynamicCSharpExpression.DynamicMultiplyAssignChecked(ld, rd, CSharpBinderFlags.CheckedContext, typeof(int));

            Assert.AreEqual(CSharpExpressionType.MultiplyAssignChecked, bc12.OperationNodeType);
            Assert.AreSame(ld, bc12.Left);
            Assert.AreSame(rd, bc12.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bc12.Flags);
            Assert.AreEqual(typeof(int), bc12.Context);

            var be13 = DynamicCSharpExpression.DynamicSubtractAssignChecked(le, re);

            Assert.AreEqual(CSharpExpressionType.SubtractAssignChecked, be13.OperationNodeType);
            Assert.AreSame(le, be13.Left.Expression);
            Assert.AreSame(re, be13.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, be13.Flags);

            var bd13 = DynamicCSharpExpression.DynamicSubtractAssignChecked(ld, rd);

            Assert.AreEqual(CSharpExpressionType.SubtractAssignChecked, bd13.OperationNodeType);
            Assert.AreSame(ld, bd13.Left);
            Assert.AreSame(rd, bd13.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bd13.Flags);

            var bf13 = DynamicCSharpExpression.DynamicSubtractAssignChecked(ld, rd, CSharpBinderFlags.CheckedContext);

            Assert.AreEqual(CSharpExpressionType.SubtractAssignChecked, bf13.OperationNodeType);
            Assert.AreSame(ld, bf13.Left);
            Assert.AreSame(rd, bf13.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bf13.Flags);

            var bc13 = DynamicCSharpExpression.DynamicSubtractAssignChecked(ld, rd, CSharpBinderFlags.CheckedContext, typeof(int));

            Assert.AreEqual(CSharpExpressionType.SubtractAssignChecked, bc13.OperationNodeType);
            Assert.AreSame(ld, bc13.Left);
            Assert.AreSame(rd, bc13.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bc13.Flags);
            Assert.AreEqual(typeof(int), bc13.Context);
        }
        public void Dynamic_Unary_GeneratedFactories()
        {
            var oe = Expression.Constant(1);

            var od = DynamicCSharpExpression.DynamicArgument(oe);

            var ue0 = DynamicCSharpExpression.DynamicNegate(oe);

            Assert.AreEqual(ExpressionType.Negate, ue0.OperationNodeType);
            Assert.AreSame(oe, ue0.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue0.Flags);

            var ud0 = DynamicCSharpExpression.DynamicNegate(od);

            Assert.AreEqual(ExpressionType.Negate, ud0.OperationNodeType);
            Assert.AreSame(od, ud0.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud0.Flags);

            var uf0 = DynamicCSharpExpression.DynamicNegate(od, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.Negate, uf0.OperationNodeType);
            Assert.AreSame(od, uf0.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf0.Flags);

            var uc0 = DynamicCSharpExpression.DynamicNegate(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.Negate, uc0.OperationNodeType);
            Assert.AreSame(od, uc0.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc0.Flags);
            Assert.AreEqual(typeof(int), uc0.Context);

            var ue1 = DynamicCSharpExpression.DynamicUnaryPlus(oe);

            Assert.AreEqual(ExpressionType.UnaryPlus, ue1.OperationNodeType);
            Assert.AreSame(oe, ue1.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue1.Flags);

            var ud1 = DynamicCSharpExpression.DynamicUnaryPlus(od);

            Assert.AreEqual(ExpressionType.UnaryPlus, ud1.OperationNodeType);
            Assert.AreSame(od, ud1.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud1.Flags);

            var uf1 = DynamicCSharpExpression.DynamicUnaryPlus(od, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.UnaryPlus, uf1.OperationNodeType);
            Assert.AreSame(od, uf1.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf1.Flags);

            var uc1 = DynamicCSharpExpression.DynamicUnaryPlus(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.UnaryPlus, uc1.OperationNodeType);
            Assert.AreSame(od, uc1.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc1.Flags);
            Assert.AreEqual(typeof(int), uc1.Context);

            var ue2 = DynamicCSharpExpression.DynamicNegateChecked(oe);

            Assert.AreEqual(ExpressionType.NegateChecked, ue2.OperationNodeType);
            Assert.AreSame(oe, ue2.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, ue2.Flags);

            var ud2 = DynamicCSharpExpression.DynamicNegateChecked(od);

            Assert.AreEqual(ExpressionType.NegateChecked, ud2.OperationNodeType);
            Assert.AreSame(od, ud2.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, ud2.Flags);

            var uf2 = DynamicCSharpExpression.DynamicNegateChecked(od, CSharpBinderFlags.CheckedContext);

            Assert.AreEqual(ExpressionType.NegateChecked, uf2.OperationNodeType);
            Assert.AreSame(od, uf2.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, uf2.Flags);

            var uc2 = DynamicCSharpExpression.DynamicNegateChecked(od, CSharpBinderFlags.CheckedContext, typeof(int));

            Assert.AreEqual(ExpressionType.NegateChecked, uc2.OperationNodeType);
            Assert.AreSame(od, uc2.Operand);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, uc2.Flags);
            Assert.AreEqual(typeof(int), uc2.Context);

            var ue3 = DynamicCSharpExpression.DynamicNot(oe);

            Assert.AreEqual(ExpressionType.Not, ue3.OperationNodeType);
            Assert.AreSame(oe, ue3.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue3.Flags);

            var ud3 = DynamicCSharpExpression.DynamicNot(od);

            Assert.AreEqual(ExpressionType.Not, ud3.OperationNodeType);
            Assert.AreSame(od, ud3.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud3.Flags);

            var uf3 = DynamicCSharpExpression.DynamicNot(od, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.Not, uf3.OperationNodeType);
            Assert.AreSame(od, uf3.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf3.Flags);

            var uc3 = DynamicCSharpExpression.DynamicNot(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.Not, uc3.OperationNodeType);
            Assert.AreSame(od, uc3.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc3.Flags);
            Assert.AreEqual(typeof(int), uc3.Context);

            var ue4 = DynamicCSharpExpression.DynamicDecrement(oe);

            Assert.AreEqual(ExpressionType.Decrement, ue4.OperationNodeType);
            Assert.AreSame(oe, ue4.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue4.Flags);

            var ud4 = DynamicCSharpExpression.DynamicDecrement(od);

            Assert.AreEqual(ExpressionType.Decrement, ud4.OperationNodeType);
            Assert.AreSame(od, ud4.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud4.Flags);

            var uf4 = DynamicCSharpExpression.DynamicDecrement(od, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.Decrement, uf4.OperationNodeType);
            Assert.AreSame(od, uf4.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf4.Flags);

            var uc4 = DynamicCSharpExpression.DynamicDecrement(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.Decrement, uc4.OperationNodeType);
            Assert.AreSame(od, uc4.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc4.Flags);
            Assert.AreEqual(typeof(int), uc4.Context);

            var ue5 = DynamicCSharpExpression.DynamicIncrement(oe);

            Assert.AreEqual(ExpressionType.Increment, ue5.OperationNodeType);
            Assert.AreSame(oe, ue5.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue5.Flags);

            var ud5 = DynamicCSharpExpression.DynamicIncrement(od);

            Assert.AreEqual(ExpressionType.Increment, ud5.OperationNodeType);
            Assert.AreSame(od, ud5.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud5.Flags);

            var uf5 = DynamicCSharpExpression.DynamicIncrement(od, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.Increment, uf5.OperationNodeType);
            Assert.AreSame(od, uf5.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf5.Flags);

            var uc5 = DynamicCSharpExpression.DynamicIncrement(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.Increment, uc5.OperationNodeType);
            Assert.AreSame(od, uc5.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc5.Flags);
            Assert.AreEqual(typeof(int), uc5.Context);

            var ue6 = DynamicCSharpExpression.DynamicOnesComplement(oe);

            Assert.AreEqual(ExpressionType.OnesComplement, ue6.OperationNodeType);
            Assert.AreSame(oe, ue6.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue6.Flags);

            var ud6 = DynamicCSharpExpression.DynamicOnesComplement(od);

            Assert.AreEqual(ExpressionType.OnesComplement, ud6.OperationNodeType);
            Assert.AreSame(od, ud6.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud6.Flags);

            var uf6 = DynamicCSharpExpression.DynamicOnesComplement(od, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.OnesComplement, uf6.OperationNodeType);
            Assert.AreSame(od, uf6.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf6.Flags);

            var uc6 = DynamicCSharpExpression.DynamicOnesComplement(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.OnesComplement, uc6.OperationNodeType);
            Assert.AreSame(od, uc6.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc6.Flags);
            Assert.AreEqual(typeof(int), uc6.Context);

            var ue7 = DynamicCSharpExpression.DynamicIsTrue(oe);

            Assert.AreEqual(ExpressionType.IsTrue, ue7.OperationNodeType);
            Assert.AreSame(oe, ue7.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue7.Flags);

            var ud7 = DynamicCSharpExpression.DynamicIsTrue(od);

            Assert.AreEqual(ExpressionType.IsTrue, ud7.OperationNodeType);
            Assert.AreSame(od, ud7.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud7.Flags);

            var uf7 = DynamicCSharpExpression.DynamicIsTrue(od, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.IsTrue, uf7.OperationNodeType);
            Assert.AreSame(od, uf7.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf7.Flags);

            var uc7 = DynamicCSharpExpression.DynamicIsTrue(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.IsTrue, uc7.OperationNodeType);
            Assert.AreSame(od, uc7.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc7.Flags);
            Assert.AreEqual(typeof(int), uc7.Context);

            var ue8 = DynamicCSharpExpression.DynamicIsFalse(oe);

            Assert.AreEqual(ExpressionType.IsFalse, ue8.OperationNodeType);
            Assert.AreSame(oe, ue8.Operand.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, ue8.Flags);

            var ud8 = DynamicCSharpExpression.DynamicIsFalse(od);

            Assert.AreEqual(ExpressionType.IsFalse, ud8.OperationNodeType);
            Assert.AreSame(od, ud8.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, ud8.Flags);

            var uf8 = DynamicCSharpExpression.DynamicIsFalse(od, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.IsFalse, uf8.OperationNodeType);
            Assert.AreSame(od, uf8.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uf8.Flags);

            var uc8 = DynamicCSharpExpression.DynamicIsFalse(od, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.IsFalse, uc8.OperationNodeType);
            Assert.AreSame(od, uc8.Operand);
            Assert.AreEqual(CSharpBinderFlags.None, uc8.Flags);
            Assert.AreEqual(typeof(int), uc8.Context);
        }
        public void Dynamic_Binary_GeneratedFactories()
        {
            var le = Expression.Constant(1);
            var re = Expression.Constant(2);

            var ld = DynamicCSharpExpression.DynamicArgument(le);
            var rd = DynamicCSharpExpression.DynamicArgument(re);

            var be0 = DynamicCSharpExpression.DynamicAdd(le, re);

            Assert.AreEqual(ExpressionType.Add, be0.OperationNodeType);
            Assert.AreSame(le, be0.Left.Expression);
            Assert.AreSame(re, be0.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be0.Flags);

            var bd0 = DynamicCSharpExpression.DynamicAdd(ld, rd);

            Assert.AreEqual(ExpressionType.Add, bd0.OperationNodeType);
            Assert.AreSame(ld, bd0.Left);
            Assert.AreSame(rd, bd0.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd0.Flags);

            var bf0 = DynamicCSharpExpression.DynamicAdd(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.Add, bf0.OperationNodeType);
            Assert.AreSame(ld, bf0.Left);
            Assert.AreSame(rd, bf0.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf0.Flags);

            var bc0 = DynamicCSharpExpression.DynamicAdd(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.Add, bc0.OperationNodeType);
            Assert.AreSame(ld, bc0.Left);
            Assert.AreSame(rd, bc0.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc0.Flags);
            Assert.AreEqual(typeof(int), bc0.Context);

            var be1 = DynamicCSharpExpression.DynamicAddChecked(le, re);

            Assert.AreEqual(ExpressionType.AddChecked, be1.OperationNodeType);
            Assert.AreSame(le, be1.Left.Expression);
            Assert.AreSame(re, be1.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, be1.Flags);

            var bd1 = DynamicCSharpExpression.DynamicAddChecked(ld, rd);

            Assert.AreEqual(ExpressionType.AddChecked, bd1.OperationNodeType);
            Assert.AreSame(ld, bd1.Left);
            Assert.AreSame(rd, bd1.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bd1.Flags);

            var bf1 = DynamicCSharpExpression.DynamicAddChecked(ld, rd, CSharpBinderFlags.CheckedContext);

            Assert.AreEqual(ExpressionType.AddChecked, bf1.OperationNodeType);
            Assert.AreSame(ld, bf1.Left);
            Assert.AreSame(rd, bf1.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bf1.Flags);

            var bc1 = DynamicCSharpExpression.DynamicAddChecked(ld, rd, CSharpBinderFlags.CheckedContext, typeof(int));

            Assert.AreEqual(ExpressionType.AddChecked, bc1.OperationNodeType);
            Assert.AreSame(ld, bc1.Left);
            Assert.AreSame(rd, bc1.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bc1.Flags);
            Assert.AreEqual(typeof(int), bc1.Context);

            var be2 = DynamicCSharpExpression.DynamicAnd(le, re);

            Assert.AreEqual(ExpressionType.And, be2.OperationNodeType);
            Assert.AreSame(le, be2.Left.Expression);
            Assert.AreSame(re, be2.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be2.Flags);

            var bd2 = DynamicCSharpExpression.DynamicAnd(ld, rd);

            Assert.AreEqual(ExpressionType.And, bd2.OperationNodeType);
            Assert.AreSame(ld, bd2.Left);
            Assert.AreSame(rd, bd2.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd2.Flags);

            var bf2 = DynamicCSharpExpression.DynamicAnd(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.And, bf2.OperationNodeType);
            Assert.AreSame(ld, bf2.Left);
            Assert.AreSame(rd, bf2.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf2.Flags);

            var bc2 = DynamicCSharpExpression.DynamicAnd(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.And, bc2.OperationNodeType);
            Assert.AreSame(ld, bc2.Left);
            Assert.AreSame(rd, bc2.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc2.Flags);
            Assert.AreEqual(typeof(int), bc2.Context);

            var be3 = DynamicCSharpExpression.DynamicAndAlso(le, re);

            Assert.AreEqual(ExpressionType.AndAlso, be3.OperationNodeType);
            Assert.AreSame(le, be3.Left.Expression);
            Assert.AreSame(re, be3.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.BinaryOperationLogical, be3.Flags);

            var bd3 = DynamicCSharpExpression.DynamicAndAlso(ld, rd);

            Assert.AreEqual(ExpressionType.AndAlso, bd3.OperationNodeType);
            Assert.AreSame(ld, bd3.Left);
            Assert.AreSame(rd, bd3.Right);
            Assert.AreEqual(CSharpBinderFlags.BinaryOperationLogical, bd3.Flags);

            var bf3 = DynamicCSharpExpression.DynamicAndAlso(ld, rd, CSharpBinderFlags.BinaryOperationLogical);

            Assert.AreEqual(ExpressionType.AndAlso, bf3.OperationNodeType);
            Assert.AreSame(ld, bf3.Left);
            Assert.AreSame(rd, bf3.Right);
            Assert.AreEqual(CSharpBinderFlags.BinaryOperationLogical, bf3.Flags);

            var bc3 = DynamicCSharpExpression.DynamicAndAlso(ld, rd, CSharpBinderFlags.BinaryOperationLogical, typeof(int));

            Assert.AreEqual(ExpressionType.AndAlso, bc3.OperationNodeType);
            Assert.AreSame(ld, bc3.Left);
            Assert.AreSame(rd, bc3.Right);
            Assert.AreEqual(CSharpBinderFlags.BinaryOperationLogical, bc3.Flags);
            Assert.AreEqual(typeof(int), bc3.Context);

            var be4 = DynamicCSharpExpression.DynamicDivide(le, re);

            Assert.AreEqual(ExpressionType.Divide, be4.OperationNodeType);
            Assert.AreSame(le, be4.Left.Expression);
            Assert.AreSame(re, be4.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be4.Flags);

            var bd4 = DynamicCSharpExpression.DynamicDivide(ld, rd);

            Assert.AreEqual(ExpressionType.Divide, bd4.OperationNodeType);
            Assert.AreSame(ld, bd4.Left);
            Assert.AreSame(rd, bd4.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd4.Flags);

            var bf4 = DynamicCSharpExpression.DynamicDivide(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.Divide, bf4.OperationNodeType);
            Assert.AreSame(ld, bf4.Left);
            Assert.AreSame(rd, bf4.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf4.Flags);

            var bc4 = DynamicCSharpExpression.DynamicDivide(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.Divide, bc4.OperationNodeType);
            Assert.AreSame(ld, bc4.Left);
            Assert.AreSame(rd, bc4.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc4.Flags);
            Assert.AreEqual(typeof(int), bc4.Context);

            var be5 = DynamicCSharpExpression.DynamicEqual(le, re);

            Assert.AreEqual(ExpressionType.Equal, be5.OperationNodeType);
            Assert.AreSame(le, be5.Left.Expression);
            Assert.AreSame(re, be5.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be5.Flags);

            var bd5 = DynamicCSharpExpression.DynamicEqual(ld, rd);

            Assert.AreEqual(ExpressionType.Equal, bd5.OperationNodeType);
            Assert.AreSame(ld, bd5.Left);
            Assert.AreSame(rd, bd5.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd5.Flags);

            var bf5 = DynamicCSharpExpression.DynamicEqual(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.Equal, bf5.OperationNodeType);
            Assert.AreSame(ld, bf5.Left);
            Assert.AreSame(rd, bf5.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf5.Flags);

            var bc5 = DynamicCSharpExpression.DynamicEqual(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.Equal, bc5.OperationNodeType);
            Assert.AreSame(ld, bc5.Left);
            Assert.AreSame(rd, bc5.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc5.Flags);
            Assert.AreEqual(typeof(int), bc5.Context);

            var be6 = DynamicCSharpExpression.DynamicExclusiveOr(le, re);

            Assert.AreEqual(ExpressionType.ExclusiveOr, be6.OperationNodeType);
            Assert.AreSame(le, be6.Left.Expression);
            Assert.AreSame(re, be6.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be6.Flags);

            var bd6 = DynamicCSharpExpression.DynamicExclusiveOr(ld, rd);

            Assert.AreEqual(ExpressionType.ExclusiveOr, bd6.OperationNodeType);
            Assert.AreSame(ld, bd6.Left);
            Assert.AreSame(rd, bd6.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd6.Flags);

            var bf6 = DynamicCSharpExpression.DynamicExclusiveOr(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.ExclusiveOr, bf6.OperationNodeType);
            Assert.AreSame(ld, bf6.Left);
            Assert.AreSame(rd, bf6.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf6.Flags);

            var bc6 = DynamicCSharpExpression.DynamicExclusiveOr(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.ExclusiveOr, bc6.OperationNodeType);
            Assert.AreSame(ld, bc6.Left);
            Assert.AreSame(rd, bc6.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc6.Flags);
            Assert.AreEqual(typeof(int), bc6.Context);

            var be7 = DynamicCSharpExpression.DynamicGreaterThan(le, re);

            Assert.AreEqual(ExpressionType.GreaterThan, be7.OperationNodeType);
            Assert.AreSame(le, be7.Left.Expression);
            Assert.AreSame(re, be7.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be7.Flags);

            var bd7 = DynamicCSharpExpression.DynamicGreaterThan(ld, rd);

            Assert.AreEqual(ExpressionType.GreaterThan, bd7.OperationNodeType);
            Assert.AreSame(ld, bd7.Left);
            Assert.AreSame(rd, bd7.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd7.Flags);

            var bf7 = DynamicCSharpExpression.DynamicGreaterThan(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.GreaterThan, bf7.OperationNodeType);
            Assert.AreSame(ld, bf7.Left);
            Assert.AreSame(rd, bf7.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf7.Flags);

            var bc7 = DynamicCSharpExpression.DynamicGreaterThan(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.GreaterThan, bc7.OperationNodeType);
            Assert.AreSame(ld, bc7.Left);
            Assert.AreSame(rd, bc7.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc7.Flags);
            Assert.AreEqual(typeof(int), bc7.Context);

            var be8 = DynamicCSharpExpression.DynamicGreaterThanOrEqual(le, re);

            Assert.AreEqual(ExpressionType.GreaterThanOrEqual, be8.OperationNodeType);
            Assert.AreSame(le, be8.Left.Expression);
            Assert.AreSame(re, be8.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be8.Flags);

            var bd8 = DynamicCSharpExpression.DynamicGreaterThanOrEqual(ld, rd);

            Assert.AreEqual(ExpressionType.GreaterThanOrEqual, bd8.OperationNodeType);
            Assert.AreSame(ld, bd8.Left);
            Assert.AreSame(rd, bd8.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd8.Flags);

            var bf8 = DynamicCSharpExpression.DynamicGreaterThanOrEqual(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.GreaterThanOrEqual, bf8.OperationNodeType);
            Assert.AreSame(ld, bf8.Left);
            Assert.AreSame(rd, bf8.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf8.Flags);

            var bc8 = DynamicCSharpExpression.DynamicGreaterThanOrEqual(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.GreaterThanOrEqual, bc8.OperationNodeType);
            Assert.AreSame(ld, bc8.Left);
            Assert.AreSame(rd, bc8.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc8.Flags);
            Assert.AreEqual(typeof(int), bc8.Context);

            var be9 = DynamicCSharpExpression.DynamicLeftShift(le, re);

            Assert.AreEqual(ExpressionType.LeftShift, be9.OperationNodeType);
            Assert.AreSame(le, be9.Left.Expression);
            Assert.AreSame(re, be9.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be9.Flags);

            var bd9 = DynamicCSharpExpression.DynamicLeftShift(ld, rd);

            Assert.AreEqual(ExpressionType.LeftShift, bd9.OperationNodeType);
            Assert.AreSame(ld, bd9.Left);
            Assert.AreSame(rd, bd9.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd9.Flags);

            var bf9 = DynamicCSharpExpression.DynamicLeftShift(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.LeftShift, bf9.OperationNodeType);
            Assert.AreSame(ld, bf9.Left);
            Assert.AreSame(rd, bf9.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf9.Flags);

            var bc9 = DynamicCSharpExpression.DynamicLeftShift(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.LeftShift, bc9.OperationNodeType);
            Assert.AreSame(ld, bc9.Left);
            Assert.AreSame(rd, bc9.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc9.Flags);
            Assert.AreEqual(typeof(int), bc9.Context);

            var be10 = DynamicCSharpExpression.DynamicLessThan(le, re);

            Assert.AreEqual(ExpressionType.LessThan, be10.OperationNodeType);
            Assert.AreSame(le, be10.Left.Expression);
            Assert.AreSame(re, be10.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be10.Flags);

            var bd10 = DynamicCSharpExpression.DynamicLessThan(ld, rd);

            Assert.AreEqual(ExpressionType.LessThan, bd10.OperationNodeType);
            Assert.AreSame(ld, bd10.Left);
            Assert.AreSame(rd, bd10.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd10.Flags);

            var bf10 = DynamicCSharpExpression.DynamicLessThan(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.LessThan, bf10.OperationNodeType);
            Assert.AreSame(ld, bf10.Left);
            Assert.AreSame(rd, bf10.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf10.Flags);

            var bc10 = DynamicCSharpExpression.DynamicLessThan(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.LessThan, bc10.OperationNodeType);
            Assert.AreSame(ld, bc10.Left);
            Assert.AreSame(rd, bc10.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc10.Flags);
            Assert.AreEqual(typeof(int), bc10.Context);

            var be11 = DynamicCSharpExpression.DynamicLessThanOrEqual(le, re);

            Assert.AreEqual(ExpressionType.LessThanOrEqual, be11.OperationNodeType);
            Assert.AreSame(le, be11.Left.Expression);
            Assert.AreSame(re, be11.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be11.Flags);

            var bd11 = DynamicCSharpExpression.DynamicLessThanOrEqual(ld, rd);

            Assert.AreEqual(ExpressionType.LessThanOrEqual, bd11.OperationNodeType);
            Assert.AreSame(ld, bd11.Left);
            Assert.AreSame(rd, bd11.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd11.Flags);

            var bf11 = DynamicCSharpExpression.DynamicLessThanOrEqual(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.LessThanOrEqual, bf11.OperationNodeType);
            Assert.AreSame(ld, bf11.Left);
            Assert.AreSame(rd, bf11.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf11.Flags);

            var bc11 = DynamicCSharpExpression.DynamicLessThanOrEqual(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.LessThanOrEqual, bc11.OperationNodeType);
            Assert.AreSame(ld, bc11.Left);
            Assert.AreSame(rd, bc11.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc11.Flags);
            Assert.AreEqual(typeof(int), bc11.Context);

            var be12 = DynamicCSharpExpression.DynamicModulo(le, re);

            Assert.AreEqual(ExpressionType.Modulo, be12.OperationNodeType);
            Assert.AreSame(le, be12.Left.Expression);
            Assert.AreSame(re, be12.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be12.Flags);

            var bd12 = DynamicCSharpExpression.DynamicModulo(ld, rd);

            Assert.AreEqual(ExpressionType.Modulo, bd12.OperationNodeType);
            Assert.AreSame(ld, bd12.Left);
            Assert.AreSame(rd, bd12.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd12.Flags);

            var bf12 = DynamicCSharpExpression.DynamicModulo(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.Modulo, bf12.OperationNodeType);
            Assert.AreSame(ld, bf12.Left);
            Assert.AreSame(rd, bf12.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf12.Flags);

            var bc12 = DynamicCSharpExpression.DynamicModulo(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.Modulo, bc12.OperationNodeType);
            Assert.AreSame(ld, bc12.Left);
            Assert.AreSame(rd, bc12.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc12.Flags);
            Assert.AreEqual(typeof(int), bc12.Context);

            var be13 = DynamicCSharpExpression.DynamicMultiply(le, re);

            Assert.AreEqual(ExpressionType.Multiply, be13.OperationNodeType);
            Assert.AreSame(le, be13.Left.Expression);
            Assert.AreSame(re, be13.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be13.Flags);

            var bd13 = DynamicCSharpExpression.DynamicMultiply(ld, rd);

            Assert.AreEqual(ExpressionType.Multiply, bd13.OperationNodeType);
            Assert.AreSame(ld, bd13.Left);
            Assert.AreSame(rd, bd13.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd13.Flags);

            var bf13 = DynamicCSharpExpression.DynamicMultiply(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.Multiply, bf13.OperationNodeType);
            Assert.AreSame(ld, bf13.Left);
            Assert.AreSame(rd, bf13.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf13.Flags);

            var bc13 = DynamicCSharpExpression.DynamicMultiply(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.Multiply, bc13.OperationNodeType);
            Assert.AreSame(ld, bc13.Left);
            Assert.AreSame(rd, bc13.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc13.Flags);
            Assert.AreEqual(typeof(int), bc13.Context);

            var be14 = DynamicCSharpExpression.DynamicMultiplyChecked(le, re);

            Assert.AreEqual(ExpressionType.MultiplyChecked, be14.OperationNodeType);
            Assert.AreSame(le, be14.Left.Expression);
            Assert.AreSame(re, be14.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, be14.Flags);

            var bd14 = DynamicCSharpExpression.DynamicMultiplyChecked(ld, rd);

            Assert.AreEqual(ExpressionType.MultiplyChecked, bd14.OperationNodeType);
            Assert.AreSame(ld, bd14.Left);
            Assert.AreSame(rd, bd14.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bd14.Flags);

            var bf14 = DynamicCSharpExpression.DynamicMultiplyChecked(ld, rd, CSharpBinderFlags.CheckedContext);

            Assert.AreEqual(ExpressionType.MultiplyChecked, bf14.OperationNodeType);
            Assert.AreSame(ld, bf14.Left);
            Assert.AreSame(rd, bf14.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bf14.Flags);

            var bc14 = DynamicCSharpExpression.DynamicMultiplyChecked(ld, rd, CSharpBinderFlags.CheckedContext, typeof(int));

            Assert.AreEqual(ExpressionType.MultiplyChecked, bc14.OperationNodeType);
            Assert.AreSame(ld, bc14.Left);
            Assert.AreSame(rd, bc14.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bc14.Flags);
            Assert.AreEqual(typeof(int), bc14.Context);

            var be15 = DynamicCSharpExpression.DynamicNotEqual(le, re);

            Assert.AreEqual(ExpressionType.NotEqual, be15.OperationNodeType);
            Assert.AreSame(le, be15.Left.Expression);
            Assert.AreSame(re, be15.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be15.Flags);

            var bd15 = DynamicCSharpExpression.DynamicNotEqual(ld, rd);

            Assert.AreEqual(ExpressionType.NotEqual, bd15.OperationNodeType);
            Assert.AreSame(ld, bd15.Left);
            Assert.AreSame(rd, bd15.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd15.Flags);

            var bf15 = DynamicCSharpExpression.DynamicNotEqual(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.NotEqual, bf15.OperationNodeType);
            Assert.AreSame(ld, bf15.Left);
            Assert.AreSame(rd, bf15.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf15.Flags);

            var bc15 = DynamicCSharpExpression.DynamicNotEqual(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.NotEqual, bc15.OperationNodeType);
            Assert.AreSame(ld, bc15.Left);
            Assert.AreSame(rd, bc15.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc15.Flags);
            Assert.AreEqual(typeof(int), bc15.Context);

            var be16 = DynamicCSharpExpression.DynamicOr(le, re);

            Assert.AreEqual(ExpressionType.Or, be16.OperationNodeType);
            Assert.AreSame(le, be16.Left.Expression);
            Assert.AreSame(re, be16.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be16.Flags);

            var bd16 = DynamicCSharpExpression.DynamicOr(ld, rd);

            Assert.AreEqual(ExpressionType.Or, bd16.OperationNodeType);
            Assert.AreSame(ld, bd16.Left);
            Assert.AreSame(rd, bd16.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd16.Flags);

            var bf16 = DynamicCSharpExpression.DynamicOr(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.Or, bf16.OperationNodeType);
            Assert.AreSame(ld, bf16.Left);
            Assert.AreSame(rd, bf16.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf16.Flags);

            var bc16 = DynamicCSharpExpression.DynamicOr(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.Or, bc16.OperationNodeType);
            Assert.AreSame(ld, bc16.Left);
            Assert.AreSame(rd, bc16.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc16.Flags);
            Assert.AreEqual(typeof(int), bc16.Context);

            var be17 = DynamicCSharpExpression.DynamicOrElse(le, re);

            Assert.AreEqual(ExpressionType.OrElse, be17.OperationNodeType);
            Assert.AreSame(le, be17.Left.Expression);
            Assert.AreSame(re, be17.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.BinaryOperationLogical, be17.Flags);

            var bd17 = DynamicCSharpExpression.DynamicOrElse(ld, rd);

            Assert.AreEqual(ExpressionType.OrElse, bd17.OperationNodeType);
            Assert.AreSame(ld, bd17.Left);
            Assert.AreSame(rd, bd17.Right);
            Assert.AreEqual(CSharpBinderFlags.BinaryOperationLogical, bd17.Flags);

            var bf17 = DynamicCSharpExpression.DynamicOrElse(ld, rd, CSharpBinderFlags.BinaryOperationLogical);

            Assert.AreEqual(ExpressionType.OrElse, bf17.OperationNodeType);
            Assert.AreSame(ld, bf17.Left);
            Assert.AreSame(rd, bf17.Right);
            Assert.AreEqual(CSharpBinderFlags.BinaryOperationLogical, bf17.Flags);

            var bc17 = DynamicCSharpExpression.DynamicOrElse(ld, rd, CSharpBinderFlags.BinaryOperationLogical, typeof(int));

            Assert.AreEqual(ExpressionType.OrElse, bc17.OperationNodeType);
            Assert.AreSame(ld, bc17.Left);
            Assert.AreSame(rd, bc17.Right);
            Assert.AreEqual(CSharpBinderFlags.BinaryOperationLogical, bc17.Flags);
            Assert.AreEqual(typeof(int), bc17.Context);

            var be18 = DynamicCSharpExpression.DynamicRightShift(le, re);

            Assert.AreEqual(ExpressionType.RightShift, be18.OperationNodeType);
            Assert.AreSame(le, be18.Left.Expression);
            Assert.AreSame(re, be18.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be18.Flags);

            var bd18 = DynamicCSharpExpression.DynamicRightShift(ld, rd);

            Assert.AreEqual(ExpressionType.RightShift, bd18.OperationNodeType);
            Assert.AreSame(ld, bd18.Left);
            Assert.AreSame(rd, bd18.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd18.Flags);

            var bf18 = DynamicCSharpExpression.DynamicRightShift(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.RightShift, bf18.OperationNodeType);
            Assert.AreSame(ld, bf18.Left);
            Assert.AreSame(rd, bf18.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf18.Flags);

            var bc18 = DynamicCSharpExpression.DynamicRightShift(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.RightShift, bc18.OperationNodeType);
            Assert.AreSame(ld, bc18.Left);
            Assert.AreSame(rd, bc18.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc18.Flags);
            Assert.AreEqual(typeof(int), bc18.Context);

            var be19 = DynamicCSharpExpression.DynamicSubtract(le, re);

            Assert.AreEqual(ExpressionType.Subtract, be19.OperationNodeType);
            Assert.AreSame(le, be19.Left.Expression);
            Assert.AreSame(re, be19.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.None, be19.Flags);

            var bd19 = DynamicCSharpExpression.DynamicSubtract(ld, rd);

            Assert.AreEqual(ExpressionType.Subtract, bd19.OperationNodeType);
            Assert.AreSame(ld, bd19.Left);
            Assert.AreSame(rd, bd19.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bd19.Flags);

            var bf19 = DynamicCSharpExpression.DynamicSubtract(ld, rd, CSharpBinderFlags.None);

            Assert.AreEqual(ExpressionType.Subtract, bf19.OperationNodeType);
            Assert.AreSame(ld, bf19.Left);
            Assert.AreSame(rd, bf19.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bf19.Flags);

            var bc19 = DynamicCSharpExpression.DynamicSubtract(ld, rd, CSharpBinderFlags.None, typeof(int));

            Assert.AreEqual(ExpressionType.Subtract, bc19.OperationNodeType);
            Assert.AreSame(ld, bc19.Left);
            Assert.AreSame(rd, bc19.Right);
            Assert.AreEqual(CSharpBinderFlags.None, bc19.Flags);
            Assert.AreEqual(typeof(int), bc19.Context);

            var be20 = DynamicCSharpExpression.DynamicSubtractChecked(le, re);

            Assert.AreEqual(ExpressionType.SubtractChecked, be20.OperationNodeType);
            Assert.AreSame(le, be20.Left.Expression);
            Assert.AreSame(re, be20.Right.Expression);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, be20.Flags);

            var bd20 = DynamicCSharpExpression.DynamicSubtractChecked(ld, rd);

            Assert.AreEqual(ExpressionType.SubtractChecked, bd20.OperationNodeType);
            Assert.AreSame(ld, bd20.Left);
            Assert.AreSame(rd, bd20.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bd20.Flags);

            var bf20 = DynamicCSharpExpression.DynamicSubtractChecked(ld, rd, CSharpBinderFlags.CheckedContext);

            Assert.AreEqual(ExpressionType.SubtractChecked, bf20.OperationNodeType);
            Assert.AreSame(ld, bf20.Left);
            Assert.AreSame(rd, bf20.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bf20.Flags);

            var bc20 = DynamicCSharpExpression.DynamicSubtractChecked(ld, rd, CSharpBinderFlags.CheckedContext, typeof(int));

            Assert.AreEqual(ExpressionType.SubtractChecked, bc20.OperationNodeType);
            Assert.AreSame(ld, bc20.Left);
            Assert.AreSame(rd, bc20.Right);
            Assert.AreEqual(CSharpBinderFlags.CheckedContext, bc20.Flags);
            Assert.AreEqual(typeof(int), bc20.Context);
        }