diff options
| Commit | d51e7e38448e24123af13f0fa2682b861a64f964 (patch) | |
|---|---|---|
| Author | 2018-11-02 00:12:31 +0200 | |
| Committer | 2018-11-02 00:12:31 +0200 | |
| Files | ff687e7a9aba1f8d53af110afe3e1e079e7b2614 /JSImpl/test/ParserTests.cpp | |
| IPL-d51e7e38448e24123af13f0fa2682b861a64f964.tar IPL-d51e7e38448e24123af13f0fa2682b861a64f964.tar.gz IPL-d51e7e38448e24123af13f0fa2682b861a64f964.zip | ||
| Parent | 8f90af904002a028d37cbf25a07d81f7984577d1 (diff) | |
Add many fixes to parser.
Introduce Object Literal and Call expression.
Add more test for parser.
Little enhance around interpreter.
1 files changed, 111 insertions, 0 deletions
| -rw-r--r-- | JSImpl/test/ParserTests.cpp | 111 |
diff --git a/JSImpl/test/ParserTests.cpp b/JSImpl/test/ParserTests.cpp index a884f37..bacadf5 100644 --- a/JSImpl/test/ParserTests.cpp +++ b/JSImpl/test/ParserTests.cpp @@ -2,11 +2,17 @@ #include <src/Lexer.h> #include <src/Parser.h> #include <src/ASTPrinter.h> +#include <src/ASTInterpreter.h> #include <gtest/gtest.h> #include <sstream> +bool CloseFload(double a, double b, double eps = 0.00001) +{ + return fabs(a - b) < eps; +} + TEST(Parser, ParseUnaryExpr) { IPLVector<Token> tokens; @@ -20,3 +26,108 @@ TEST(Parser, ParseUnaryExpr) ASSERT_TRUE(!output.str().empty()); } +TEST(Parser, VariableDeclaration) +{ + IPLVector<Token> tokens; + Tokenize("var s = 0;", tokens); + + auto expr = Parse(tokens); + std::ostringstream output; + ASTInterpreter i; + i.Run(expr.get()); + ASSERT_TRUE(i.HasVariable("s")); + ASSERT_TRUE(i.ModifyVariable("s") == 0.0); +} + +TEST(Parser, VariableDeclarationAdditionOfLiterals) +{ + IPLVector<Token> tokens; + Tokenize("var s = 5 + 6;", tokens); + + auto expr = Parse(tokens); + std::ostringstream output; + ASTInterpreter i; + i.Run(expr.get()); + ASSERT_TRUE(i.HasVariable("s")); + ASSERT_TRUE(CloseFload(i.ModifyVariable("s"), 11.0)); +} + +TEST(Parser, VariableDeclarationAdditionOfVariables) +{ + IPLVector<Token> tokens; + Tokenize("var a = 5; var b = 4; var c = a + b;", tokens); + + auto expr = Parse(tokens); + std::ostringstream output; + ASTInterpreter i; + i.Run(expr.get()); + ASSERT_TRUE(i.HasVariable("a")); + ASSERT_TRUE(i.HasVariable("b")); + ASSERT_TRUE(i.HasVariable("c")); + ASSERT_TRUE(CloseFload(i.ModifyVariable("a"), 5.0)); + ASSERT_TRUE(CloseFload(i.ModifyVariable("b"), 4.0)); + ASSERT_TRUE(CloseFload(i.ModifyVariable("c"), 9.0)); +} + +TEST(Parser, VariableDeclarationMultiplicationOfLiterals) +{ + IPLVector<Token> tokens; + Tokenize("var s = 5 * 6;", tokens); + + auto expr = Parse(tokens); + std::ostringstream output; + ASTInterpreter i; + i.Run(expr.get()); + ASSERT_TRUE(i.HasVariable("s")); + ASSERT_TRUE(CloseFload(i.ModifyVariable("s"), 30.0)); +} + +TEST(Parser, VariableDeclarationMultiplicationOfVariables) +{ + IPLVector<Token> tokens; + Tokenize("var a = 5; var b = 4; var c = a * b;", tokens); + + auto expr = Parse(tokens); + std::ostringstream output; + ASTInterpreter i; + i.Run(expr.get()); + ASSERT_TRUE(i.HasVariable("a")); + ASSERT_TRUE(i.HasVariable("b")); + ASSERT_TRUE(i.HasVariable("c")); + ASSERT_TRUE(CloseFload(i.ModifyVariable("a"), 5.0)); + ASSERT_TRUE(CloseFload(i.ModifyVariable("b"), 4.0)); + ASSERT_TRUE(CloseFload(i.ModifyVariable("c"), 20.0)); +} + + +TEST(Parser, Unary) +{ + IPLVector<Token> tokens; + Tokenize("var a = 5; a++; var b = 6; --b;", tokens); + + auto expr = Parse(tokens); + std::ostringstream output; + ASTInterpreter i; + i.Run(expr.get()); + ASSERT_TRUE(i.HasVariable("a")); + ASSERT_TRUE(i.HasVariable("b")); + ASSERT_TRUE(CloseFload(i.ModifyVariable("a"), 6.0)); + ASSERT_TRUE(CloseFload(i.ModifyVariable("b"), 5.0)); +} + + +TEST(Parser, If) +{ + IPLVector<Token> tokens; + Tokenize("var a = 5; var b = 3; if(a == 5){a++; b++;} b++;", tokens); + + auto expr = Parse(tokens); + std::ostringstream output; + ASTInterpreter i; + i.Run(expr.get()); + ASSERT_TRUE(i.HasVariable("a")); + ASSERT_TRUE(i.HasVariable("b")); + ASSERT_TRUE(CloseFload(i.ModifyVariable("a"), 6.0)); + ASSERT_TRUE(CloseFload(i.ModifyVariable("b"), 5.0)); +} + |
