public void TestUnaryOpException()
        {
            var m = new Module(null);
            var e = Assert.Throws <ArgumentException>(() => BinaryExpression.Create(OberonGrammarLexer.PLUS,
                                                                                    ConstantExpression.Create(false), null, m.Block));

            Assert.Equal("Cannot find operation '+' (Bool, Any)", e.Message);
        }
예제 #2
0
        public void ExpressionRelGe1()
        {
            var m = new Module(null);
            var e = BinaryExpression.Create(
                OberonGrammarLexer.GE,
                ConstantExpression.Create(4),
                ConstantExpression.Create(4),
                m.Block);
            var result = ConstantSolver.Solve(e, m.Block) as ConstantBoolExpression;

            Assert.NotNull(result);
            Assert.True(result.ToBool());
        }
        public void ExpressionDiv1()
        {
            var m = new Module(null);
            var e = BinaryExpression.Create(
                OberonGrammarLexer.DIV,
                ConstantExpression.Create(10),
                ConstantExpression.Create(2),
                m.Block);
            var result = ConstantSolver.Solve(e, m.Block) as ConstantIntExpression;

            Assert.NotNull(result);
            Assert.Equal(5, result.ToInt32());
        }
        public void ExpressionDiv0()
        {
            var m = new Module(null);
            var e = BinaryExpression.Create(
                OberonGrammarLexer.DIV,
                ConstantExpression.Create("10.0"),
                ConstantIntExpression.Zero,
                m.Block);
            var result = ConstantSolver.Solve(e, m.Block) as ConstantDoubleExpression;

            Assert.NotNull(result);
            Assert.True(double.IsInfinity(result.ToDouble()));
        }
        public void ExpressionAnd()
        {
            var m = new Module(null);
            var e = BinaryExpression.Create(
                OberonGrammarLexer.AND,
                ConstantExpression.Create(false),
                ConstantExpression.Create("true"),
                m.Block);
            var result = ConstantSolver.Solve(e, m.Block) as ConstantBoolExpression;

            Assert.NotNull(result);
            Assert.False(result.ToBool());
        }
        public void ExpressionAdd2()
        {
            var m = new Module(null);
            var e = BinaryExpression.Create(
                OberonGrammarLexer.PLUS,
                ConstantExpression.Create(1),
                ConstantExpression.Create(1.42),
                m.Block);
            var result = ConstantSolver.Solve(e, m.Block) as ConstantDoubleExpression;

            Assert.NotNull(result);
            Assert.Equal(2.42, result.ToDouble());
        }
        public void ExpressionMult2()
        {
            var m = new Module(null);
            var e = BinaryExpression.Create(
                OberonGrammarLexer.STAR,
                ConstantExpression.Create(6.1),
                ConstantExpression.Create(7),
                m.Block);
            var result = ConstantSolver.Solve(e, m.Block) as ConstantDoubleExpression;

            Assert.NotNull(result);
            Assert.True(result.ToDouble() - 42.7 < double.Epsilon);
        }
        public void ExpressionDiv3()
        {
            var m = new Module(null);
            var e = BinaryExpression.Create(
                OberonGrammarLexer.DIV,
                ConstantExpression.Create("10.0"),
                ConstantExpression.Create(4),
                m.Block);
            var result = ConstantSolver.Solve(e, m.Block) as ConstantDoubleExpression;

            Assert.NotNull(result);
            Assert.Equal(2.5, result.ToDouble());
        }
예제 #9
0
        public void BinaryOperatorCheckParametersNull()
        {
            var b = new Module(null).Block;
            var e = Assert.Throws <ArgumentNullException>(
                () => new OpRelOp().Operate(null, b, null));

            Assert.Equal("e", e.ParamName);
            var e1 = Assert.Throws <ArgumentNullException>(
                () => new OpRelOp().Operate(
                    BinaryExpression.Create(OberonGrammarLexer.PLUS, ConstantExpression.Create(0),
                                            ConstantExpression.Create(1), b), null, null));

            Assert.Equal("block", e1.ParamName);
        }
예제 #10
0
        public void ExpressionRelVar()
        {
            var m = new Module(null);

            m.Block.Declarations.Add(new Declaration("a", m.Block.LookupType("INTEGER")));
            var e = BinaryExpression.Create(
                OberonGrammarLexer.NOTEQUAL,
                VariableReferenceExpression.Create(m.Block.LookupVar("a"), null),
                ConstantExpression.Create(10),
                m.Block);
            var result = ConstantSolver.Solve(e, m.Block) as BinaryExpression;

            Assert.NotNull(result);
            Assert.False(result.IsConst);
        }
        public void ExpressionAddRes0()
        {
            var m = new Module(null);
            var e = BinaryExpression.Create(
                OberonGrammarLexer.PLUS,
                ConstantExpression.Create(1),
                ConstantDoubleExpression.Zero,
                m.Block);
            var result = ConstantSolver.Solve(e, m.Block) as ConstantDoubleExpression;

            Assert.NotNull(result);
            Assert.Equal(1, result.ToInt32());
            Assert.Equal(1.0, result.ToDouble());
            Assert.True(result.ToBool());
            Assert.False(result.IsUnary);
            Assert.True(result.IsConst);
        }
        /* expressions */

        public override void ExitExprConstant(OberonGrammarParser.ExprConstantContext context)
        {
            context.expReturn = ConstantExpression.Create(context.c.Text);
        }
        public void ExpressionInvalidConst()
        {
            var ex = Assert.Throws <InvalidOperationException>(() => ConstantExpression.Create("Test"));

            Assert.Equal("Unknown constant 'Test'", ex.Message);
        }