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); }
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); }
public static TrueFalseClass OrMethod(TrueFalseClass c1, TrueFalseClass c2) { c1.MethodCallCount++; return(new TrueFalseClass(c1.Value | c2.Value)); }
public static TrueFalseClass OrMethod(TrueFalseClass c1, TrueFalseClass c2) { c1.MethodCallCount++; return new TrueFalseClass(c1.Value | c2.Value); }
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); }
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); }