Пример #1
0
        public static void OrElse_UserDefinedOperator(int leftValue, int rightValue, int expectedValue, bool calledMethod, bool useInterpreter)
        {
            TrueFalseClass left  = new TrueFalseClass(leftValue);
            TrueFalseClass right = new TrueFalseClass(rightValue);

            BinaryExpression      expression = Expression.OrElse(Expression.Constant(left), Expression.Constant(right));
            Func <TrueFalseClass> lambda     = Expression.Lambda <Func <TrueFalseClass> >(expression).Compile(useInterpreter);

            Assert.Equal(expectedValue, lambda().Value);

            // OrElse only evaluates the true operator of left
            Assert.Equal(1, left.TrueCallCount);
            Assert.Equal(0, left.FalseCallCount);
            Assert.Equal(0, right.TrueCallCount);
            Assert.Equal(0, right.FalseCallCount);

            // OrElse only evaluates the operator if left is not true
            Assert.Equal(calledMethod ? 1 : 0, left.OperatorCallCount);
        }
Пример #2
0
        public static void AndAlso_Method(int leftValue, int rightValue, int expectedValue, bool calledMethod, bool useInterpreter)
        {
            MethodInfo method = typeof(TrueFalseClass).GetMethod(nameof(TrueFalseClass.AndMethod));

            TrueFalseClass left  = new TrueFalseClass(leftValue);
            TrueFalseClass right = new TrueFalseClass(rightValue);

            BinaryExpression      expression = Expression.AndAlso(Expression.Constant(left), Expression.Constant(right), method);
            Func <TrueFalseClass> lambda     = Expression.Lambda <Func <TrueFalseClass> >(expression).Compile(useInterpreter);

            Assert.Equal(expectedValue, lambda().Value);

            // AndAlso only evaluates the false operator of left
            Assert.Equal(0, left.TrueCallCount);
            Assert.Equal(1, left.FalseCallCount);
            Assert.Equal(0, right.TrueCallCount);
            Assert.Equal(0, right.FalseCallCount);

            // AndAlso only evaluates the method if left is not false
            Assert.Equal(0, left.OperatorCallCount);
            Assert.Equal(calledMethod ? 1 : 0, left.MethodCallCount);
        }
Пример #3
0
 public static TrueFalseClass OrMethod(TrueFalseClass c1, TrueFalseClass c2)
 {
     c1.MethodCallCount++;
     return(new TrueFalseClass(c1.Value | c2.Value));
 }
Пример #4
0
 public static TrueFalseClass OrMethod(TrueFalseClass c1, TrueFalseClass c2)
 {
     c1.MethodCallCount++;
     return new TrueFalseClass(c1.Value | c2.Value);
 }
Пример #5
0
        public static void OrElse_Method(int leftValue, int rightValue, int expectedValue, bool calledMethod, bool useInterpreter)
        {
            MethodInfo method = typeof(TrueFalseClass).GetMethod(nameof(TrueFalseClass.OrMethod));

            TrueFalseClass left = new TrueFalseClass(leftValue);
            TrueFalseClass right = new TrueFalseClass(rightValue);

            BinaryExpression expression = Expression.OrElse(Expression.Constant(left), Expression.Constant(right), method);
            Func<TrueFalseClass> lambda = Expression.Lambda<Func<TrueFalseClass>>(expression).Compile(useInterpreter);
            Assert.Equal(expectedValue, lambda().Value);

            // OrElse only evaluates the true operator of left
            Assert.Equal(1, left.TrueCallCount);
            Assert.Equal(0, left.FalseCallCount);
            Assert.Equal(0, right.TrueCallCount);
            Assert.Equal(0, right.FalseCallCount);

            // OrElse only evaluates the method if left is not true
            Assert.Equal(0, left.OperatorCallCount);
            Assert.Equal(calledMethod ? 1 : 0, left.MethodCallCount);
        }
Пример #6
0
        public static void AndAlso_UserDefinedOperator(int leftValue, int rightValue, int expectedValue, bool calledMethod, bool useInterpreter)
        {
            TrueFalseClass left = new TrueFalseClass(leftValue);
            TrueFalseClass right = new TrueFalseClass(rightValue);

            BinaryExpression expression = Expression.AndAlso(Expression.Constant(left), Expression.Constant(right));
            Func<TrueFalseClass> lambda = Expression.Lambda<Func<TrueFalseClass>>(expression).Compile(useInterpreter);
            Assert.Equal(expectedValue, lambda().Value);

            // AndAlso only evaluates the false operator of left
            Assert.Equal(0, left.TrueCallCount);
            Assert.Equal(1, left.FalseCallCount);
            Assert.Equal(0, right.TrueCallCount);
            Assert.Equal(0, right.FalseCallCount);

            // AndAlso only evaluates the operator if left is not false
            Assert.Equal(calledMethod ? 1 : 0, left.OperatorCallCount);
        }