Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl / test / ASTInterpreterTests.cpp
diff options
context:
space:
mode:
Commit64a545c0c9988755a1b022bffd5f4303d0070af2 (patch)
Author
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2020-11-09 22:09:38 +0200
Committer
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2020-11-09 22:09:38 +0200
Files99816280741e7e6d6a8460ed216484b84fd4aefc /JSImpl/test/ASTInterpreterTests.cpp
IPL-64a545c0c9988755a1b022bffd5f4303d0070af2.tar
IPL-64a545c0c9988755a1b022bffd5f4303d0070af2.tar.gz
IPL-64a545c0c9988755a1b022bffd5f4303d0070af2.zip
Parent1d2838877d4b905c68578e5bd4c01ab2857099ee (diff)
Parentf4598a0e6deb5fb1a63b4fc125804aa85ca818bd (diff)
Merge branch 'feature/interpreter_string'
1 files changed, 77 insertions, 0 deletions
-rw-r--r--JSImpl/test/ASTInterpreterTests.cpp77
diff --git a/JSImpl/test/ASTInterpreterTests.cpp b/JSImpl/test/ASTInterpreterTests.cpp
new file mode 100644
index 0000000..e8cf282
--- /dev/null
+++ b/JSImpl/test/ASTInterpreterTests.cpp
@@ -0,0 +1,77 @@
+#include <gtest/gtest.h>
+
+#include <src/CommonTypes.h>
+#include <src/Lexer.h>
+#include <src/Parser.h>
+#include <src/ASTPrinter.h>
+#include <src/ASTInterpreter.h>
+
+struct ASTInterpret : ::testing::Test
+{
+ void Run(const char* program)
+ {
+ auto tokens = Tokenize(program).tokens;
+ auto expr = Parse(tokens);
+ Interpreter.Run(expr.get());
+ }
+
+ bool HasVariable(const char* name)
+ {
+ return Interpreter.HasVariable(name);
+ }
+
+ double ValueAsNumber(const char* name)
+ {
+ return std::get<double>(*Interpreter.ModifyVariable(name));
+ }
+
+ IPLString ValueAsString(const char* name)
+ {
+ return std::get<IPLString>(*Interpreter.ModifyVariable(name));
+ }
+
+ ASTInterpreter Interpreter;
+};
+
+TEST_F(ASTInterpret, VarNumber)
+{
+ Run("var answer = 6 * 7");
+ ASSERT_TRUE(HasVariable("answer"));
+ ASSERT_DOUBLE_EQ(ValueAsNumber("answer"), 42.0);
+}
+
+TEST_F(ASTInterpret, VarString)
+{
+ Run("var name = 'John' + ' ' + 'Doe'");
+ ASSERT_TRUE(HasVariable("name"));
+ ASSERT_EQ(ValueAsString("name"), "John Doe");
+}
+
+TEST_F(ASTInterpret, StringPlusNumberNotSupported)
+{
+ ASSERT_THROW(Run("var data = 'John Doe' + 42"), std::runtime_error);
+}
+
+TEST_F(ASTInterpret, StringMinusString)
+{
+ ASSERT_THROW(Run("var data = 'John' - 'Doe'"), std::runtime_error);
+}
+
+TEST_F(ASTInterpret, LessNumber)
+{
+ Run("var answer = 6 < 7");
+ ASSERT_TRUE(HasVariable("answer"));
+ ASSERT_DOUBLE_EQ(ValueAsNumber("answer"), 1.0);
+}
+
+TEST_F(ASTInterpret, LessString)
+{
+ Run("var name = 'John' < 'Doe'");
+ ASSERT_TRUE(HasVariable("name"));
+ ASSERT_DOUBLE_EQ(ValueAsNumber("name"), 0.0);
+}
+
+TEST_F(ASTInterpret, StringLessNumber)
+{
+ ASSERT_THROW(Run("var data = 'John' < 42"), std::runtime_error);
+}