Пример #1
0
        public void IfExpressionTest()
        {
            const string input   = "if (x < y) { x }";
            var          lexer   = new Lexer(input);
            var          parser  = new Parser(lexer);
            var          program = parser.ParseCode();

            StaticTests.CheckParserErrors(parser);

            Assert.AreEqual(1, program.Statements.Count,
                            $"program should have 1 statement, got={program.Statements.Count}");

            var stmt = program.Statements.First() as ExpressionStatement;

            Assert.AreEqual("ExpressionStatement", stmt.GetType().Name,
                            $"first statement not of type 'ExpressionStatement', got={stmt.GetType().Name}");

            Assert.AreEqual("IfExpression", stmt.Expression.GetType().Name);

            var exp = stmt.Expression as IfExpression;

            Assert.AreEqual("(x < y)", exp.Condition.Str());

            Assert.AreEqual(1, exp.Consequence.Statements.Count);

            Assert.AreEqual("ExpressionStatement", exp.Consequence.Statements.First().GetType().Name);

            var consequence = exp.Consequence.Statements.First() as ExpressionStatement;

            StaticTests.TestIdentifier(consequence.Expression, "x");

            Assert.AreEqual(null, exp.Alternative);
        }
Пример #2
0
        public void IndexExpressionParsingTest()
        {
            var input = "someList[1 + 1]";

            var lexer   = new Lexer(input);
            var parser  = new Parser(lexer);
            var program = parser.ParseCode();

            StaticTests.CheckParserErrors(parser);

            Assert.AreEqual(nameof(ExpressionStatement), program.Statements.First().GetType().Name);

            var stmt = (ExpressionStatement)program.Statements.First();

            Assert.AreEqual(nameof(IndexExpression), stmt.Expression.GetType().Name);

            var indexExp = (IndexExpression)stmt.Expression;

            StaticTests.TestIdentifier(indexExp.Left, "someList");

            var int1 = new IntegerLiteral {
                Token = new Token {
                    Type = Token.Int, Literal = "1"
                }, Value = 1
            };

            StaticTests.TestInfixExpression(indexExp.Index, int1, "+", int1);
        }
Пример #3
0
        public void CallExpressionTest()
        {
            const string input   = "sub(1, 2 * 3, 4 + 5)";
            var          lexer   = new Lexer(input);
            var          parser  = new Parser(lexer);
            var          program = parser.ParseCode();

            StaticTests.CheckParserErrors(parser);

            Assert.AreEqual(1, program.Statements.Count,
                            $"program should have 1 statement, got={program.Statements.Count}");

            Assert.AreEqual("ExpressionStatement", program.Statements.First().GetType().Name,
                            $"first statement not of type 'ExpressionStatement', got={program.Statements.First().GetType().Name}");

            var stmt = program.Statements.First() as ExpressionStatement;

            Assert.AreEqual("CallExpression", stmt.Expression.GetType().Name,
                            $"first statement not of type 'CallExpression', got={stmt.Expression.GetType().Name}");

            var exp = stmt.Expression as CallExpression;

            StaticTests.TestIdentifier(exp.Function, "sub");

            Assert.AreEqual(3, exp.Arguments.Count);

            Assert.AreEqual("1", exp.Arguments.First().Str());
            Assert.AreEqual("(2 * 3)", exp.Arguments[1].Str());
            Assert.AreEqual("(4 + 5)", exp.Arguments.Last().Str());
        }
Пример #4
0
        public void IdentifierExpressionTest()
        {
            const string input   = "fooBar;";
            var          lexer   = new Lexer(input);
            var          parser  = new Parser(lexer);
            var          program = parser.ParseCode();

            StaticTests.CheckParserErrors(parser);
            Assert.AreEqual(1, program.Statements.Count,
                            $"program should have 1 statement, got={program.Statements.Count}");

            var stmt = program.Statements.First() as ExpressionStatement;

            Assert.AreEqual("ExpressionStatement", stmt.GetType().Name,
                            $"first statement not of type 'ExpressionStatement', got={stmt.GetType().Name}");

            StaticTests.TestIdentifier(stmt.Expression, "fooBar");
        }