#include #include #include #include #include #include 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(*Interpreter.ModifyVariable(name)); } bool ValueAsBool(const char* name) { return std::get(*Interpreter.ModifyVariable(name)); } IPLString ValueAsString(const char* name) { return std::get(*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_TRUE(ValueAsBool("answer")); } TEST_F(ASTInterpret, LessString) { Run("var name = 'John' < 'Doe'"); ASSERT_TRUE(HasVariable("name")); ASSERT_FALSE(ValueAsBool("name")); } TEST_F(ASTInterpret, StringLessNumber) { ASSERT_THROW(Run("var data = 'John' < 42"), std::runtime_error); }