예제 #1
0
        public void Compile_NegationOfNonBooleanVariable_ShouldCompileAndRuntimeError()
        {
            var code = "not x";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "1" }
            };
            var compilationResult = _compiler.Compile(code);

            Exception exception = null;

            try
            {
                var result = compilationResult.Code(runtimeCtx);
            }
            catch (Exception ex)
            {
                exception = ex;
            }


            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.NotNull(exception);
        }
        public void Compile_VariableInvalidType_ShouldCompileRuntimeErrorFormatException()
        {
            var code = "x";
            var compilationResult = _compiler.Compile(code);

            Exception exception = null;
            var       ctx       = new XpressRuntimeContext()
            {
                { "x", "4" }
            };

            try
            {
                var result = compilationResult.Code(ctx);
            }
            catch (Exception ex)
            {
                exception = ex;
            }


            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.NotNull(exception);
            Assert.Equal("String was not recognized as a valid Boolean.", exception.Message);
        }
예제 #3
0
        public void Compile_EqualityStringEqualNumber_ShouldFailCompile()
        {
            var code = "'1' eq 1";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext();
            var compilationResult = _compiler.Compile(code);

            Assert.False(compilationResult.Compiled);
            Assert.True(compilationResult.Log.HasErrors);
        }
        public void Compile_BooleanFalseExpression_ShouldCompileAndEvalFalse()
        {
            var code = "false";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext();
            var compilationResult           = _compiler.Compile(code);
            var result = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.False(result);
        }
예제 #5
0
        public void Compile_EqualityBinaryExprEqualBinaryExpr_ShouldCompileAndEvalTrue()
        {
            var code = "x+1 eq y+5";
            var compilationResult = _compiler.Compile(code);
            var ctx = new XpressRuntimeContext() { { "x", "5" }, { "y", "1" } };
            var result = compilationResult.Code(ctx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
예제 #6
0
        public void Compile_EqualityNumberEqualString_ShouldFailCompile()
        {
            var code = "1 eq '1'";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext();
            var compilationResult = _compiler.Compile(code);

            Assert.False(compilationResult.Compiled);
            Assert.True(compilationResult.Log.HasErrors);

            // fail - operator 'eq' cannot be applied to operands of type 'Int32' and 'String'. Error at '1' position 0
        }
예제 #7
0
        public void Compile_EqualityVariableEqualBoolean_ShouldCompileAndEvalTrue()
        {
            var code = "x eq true";
            var compilationResult = _compiler.Compile(code);
            var ctx = new XpressRuntimeContext() { { "x", "true" } };
            var result = compilationResult.Code(ctx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
예제 #8
0
        public void Compile_EqualityNullEqualNull_ShouldCompileAndEvalTrue()
        {
            var code = "null eq null";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext();
            var compilationResult = _compiler.Compile(code);
            var result = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
예제 #9
0
        public void Compile_EqualityEqualTwoNumbers_ShouldCompileAndEvalFalse()
        {
            var code = "1 eq 4";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext();
            var compilationResult = _compiler.Compile(code);
            var result = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.False(result);
        }
예제 #10
0
        public void Compile_EqualityStringEqualStringCaseInsensitive_ShouldCompileAndEvalTrue()
        {
            var code = "'ahmed' eq 'AHMED'";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext();
            var compilationResult = _compiler.Compile(code);
            var result = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
예제 #11
0
        public void Compile_RelationalLessThanOrEqual_ShouldCompileAndEvalTrue()
        {
            var code = "9 le 10";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext();
            var compilationResult           = _compiler.Compile(code);
            var result = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
예제 #12
0
        public void Compile_BinaryAddNullAndNumber_ShouldFailCompile()
        {
            var code = "x gt (null + 1)";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "3" }
            };
            var compilationResult = _compiler.Compile(code);

            Assert.False(compilationResult.Compiled);
            Assert.True(compilationResult.Log.HasErrors);
        }
예제 #13
0
        public void Compile_BinaryVariableMultiplyNull_ShouldFailCompile()
        {
            var code = "x gt (x * null)";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "3" }
            };
            var compilationResult = _compiler.Compile(code);

            Assert.False(compilationResult.Compiled);
            Assert.True(compilationResult.Log.HasErrors);
        }
예제 #14
0
        public void Compile_EqualityVariableNotExistsAndNotEqualNull_ShouldCompileAndEvalFalse()
        {
            // Check equality with null, will verify that variable exists first
            var code = "xy ne null";
            var compilationResult = _compiler.Compile(code);
            var ctx = new XpressRuntimeContext() { { "x", "zzz" } };
            var result = compilationResult.Code(ctx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.False(result);
        }
예제 #15
0
        public void Compile_BinaryNumberMultiplyString_ShouldFailCompile()
        {
            var code = "x gt (1* '2')";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "3" }
            };
            var compilationResult = _compiler.Compile(code);

            Assert.False(compilationResult.Compiled);
            Assert.True(compilationResult.Log.HasErrors);
        }
예제 #16
0
        public void Compile_EqualityEmptyStringEqualNull_ShouldCompileAndEvalTrue()
        {
            // this is odd case null is pretty much empty only works for strings since the language doesn't support objects
            var code = "'' eq null";
            var compilationResult = _compiler.Compile(code);
            var ctx = new XpressRuntimeContext();
            var result = compilationResult.Code(ctx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
            // fail - operator 'eq' cannot be applied to operands of type 'Int32' and 'Object'. Error at '1' position 0
        }
예제 #17
0
        public void Compile_NegationOfBooleanFalseVariable_ShouldCompileAndEvalTrue()
        {
            var code = "not x";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "false" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
예제 #18
0
        public void Compile_NegationOfConditioanlExpression_ShouldCompileAndEvalTrue()
        {
            var code = "not ('a' eq 'b' and 9 gt 10)";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "false" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
예제 #19
0
        public void Compile_RelationalNumberLessThanVariable_ShouldCompileAndEvalTrue()
        {
            var code = "9 lt x";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "10" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
        public void Compile_ComplexExpression_ShouldCompileAndEvalTrue()
        {
            var code = "(x ne null and x+1 gt 10) or (y ne null and (y*(5+1)-2) lt 5)";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "5" }, { "y", "1" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
        public void Compile_ConditionalFalseOrRelationalExpressionWithVariable_ShouldCompileAndEvalFalse()
        {
            var code = "false or x lt 2";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "5" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.False(result);
        }
        public void Compile_ConditionalOfRelationals_ShouldCompileAndEvalTrue()
        {
            var code = "x gt 2 and y lt 5";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "5" }, { "y", "1" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
예제 #23
0
        public void Compile_BinaryModuloNumbers_ShouldCompileAndEvalTrue()
        {
            var code = "x eq (11 % 2)";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "1" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
        public void Compile_BinaryOperatorPrecedenceWithParanetcise_ShouldCompileAndEvalTrue()
        {
            var code = "r eq (((x+1)*2)-4)/5";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "6" }, { "r", "2" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
예제 #25
0
        public void Compile_BinaryAdditionConcatTwoStrings_ShouldCompileAndEvalTrue()
        {
            var code = "x eq ('ahmed '+'elmalt')";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "ahmed elmalt" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
        public void Compile_BinaryOperatorPrecedenceInvalid_ShouldCompileAndEvalFalse()
        {
            var code = "r eq x+2*2-4/2"; // ((x+(2*2))-(4/2))
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "6" }, { "r", "2" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.False(result);
        }
예제 #27
0
        public void Compile_BinaryAdditionVariableAndNumber_ShouldCompileAndEvalTrue()
        {
            var code = "x lt (x+2)";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "3" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
        public void Compile_Default_RelationalVariableGreaterThanVariable_ShouldCompileAndEvalTrue()
        {
            var code = "x gt y";
            XpressRuntimeContext runtimeCtx = new XpressRuntimeContext()
            {
                { "x", "10" }, { "y", "9" }
            };
            var compilationResult = _compiler.Compile(code);
            var result            = compilationResult.Code(runtimeCtx);

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.True(result);
        }
예제 #29
0
        public void Compile_EqualityWithVariableEmptyString_ShouldCompileRuntimeError()
        {
            var code = "10 ne x";
            var compilationResult = _compiler.Compile(code);
            var ctx = new XpressRuntimeContext() { { "x", "" } };

            Exception exception = null;
            try
            {
                var result = compilationResult.Code(ctx);
            }
            catch (Exception ex)
            {
                exception = ex;
            }

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.NotNull(exception);
        }
예제 #30
0
        public void Compile_EqualityVariableNotExistsAndEqualEmptyString_ShouldCompileAndRuntimeError()
        {
            // Equality comparison with empty string will not check for existance first
            var code = "xy ne ''";
            var compilationResult = _compiler.Compile(code);
            var ctx = new XpressRuntimeContext() { { "x", "" } };

            Exception exception = null;
            try
            {
                var result = compilationResult.Code(ctx);
            }
            catch (Exception ex)
            {
                exception = ex;
            }

            Assert.True(compilationResult.Compiled);
            Assert.False(compilationResult.Log.HasErrors);
            Assert.NotNull(exception);
        }