From d51e7e38448e24123af13f0fa2682b861a64f964 Mon Sep 17 00:00:00 2001 From: martin dobrev Date: Fri, 2 Nov 2018 00:12:31 +0200 Subject: Add many fixes to parser. Introduce Object Literal and Call expression. Add more test for parser. Little enhance around interpreter. --- JSImpl/test/ParserTests.cpp | 111 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) (limited to 'JSImpl/test/ParserTests.cpp') 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 #include #include +#include #include #include +bool CloseFload(double a, double b, double eps = 0.00001) +{ + return fabs(a - b) < eps; +} + TEST(Parser, ParseUnaryExpr) { IPLVector tokens; @@ -20,3 +26,108 @@ TEST(Parser, ParseUnaryExpr) ASSERT_TRUE(!output.str().empty()); } +TEST(Parser, VariableDeclaration) +{ + IPLVector 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 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 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 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 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 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 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)); +} + -- cgit v1.3.1-23-gd82d