Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl / test / ParserTests.cpp
diff options
context:
space:
mode:
Commitd51e7e38448e24123af13f0fa2682b861a64f964 (patch)
Author
 martin dobrev <martindobrev0@gmail.com>
2018-11-02 00:12:31 +0200
Committer
 martin dobrev <martindobrev0@gmail.com>
2018-11-02 00:12:31 +0200
Filesff687e7a9aba1f8d53af110afe3e1e079e7b2614 /JSImpl/test/ParserTests.cpp
IPL-d51e7e38448e24123af13f0fa2682b861a64f964.tar
IPL-d51e7e38448e24123af13f0fa2682b861a64f964.tar.gz
IPL-d51e7e38448e24123af13f0fa2682b861a64f964.zip
Parent8f90af904002a028d37cbf25a07d81f7984577d1 (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.cpp111
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));
+}
+