From 83df4955d4faf1b58c79109e788c878634309267 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Tue, 8 Jul 2025 11:18:54 +0200 Subject: [PATCH] added tests for the stringification of the program --- src/ast/program.hpp | 6 +++++ src/ast/statements/expression.cpp | 2 ++ src/ast/statements/let.cpp | 7 ++++++ src/ast/statements/let.hpp | 1 + src/ast/statements/return.cpp | 6 +++++ src/ast/statements/return.hpp | 1 + test/program.cpp | 38 +++++++++++++++++++++++++++++++ 7 files changed, 61 insertions(+) create mode 100644 test/program.cpp diff --git a/src/ast/program.hpp b/src/ast/program.hpp index f84238f..4da1b27 100644 --- a/src/ast/program.hpp +++ b/src/ast/program.hpp @@ -8,6 +8,12 @@ namespace ast { struct program : public node { std::vector statements; + + program() {} + + program(std::vector statements) + : statements(std::move(statements)) {}; + std::string token_literal() const override; virtual std::string str() const override; diff --git a/src/ast/statements/expression.cpp b/src/ast/statements/expression.cpp index c3f57f4..0e527b3 100644 --- a/src/ast/statements/expression.cpp +++ b/src/ast/statements/expression.cpp @@ -22,6 +22,8 @@ namespace ast { if (expression != nullptr) ss << expression->str(); + ss << ';'; + return ss.str(); }; } // namespace ast diff --git a/src/ast/statements/let.cpp b/src/ast/statements/let.cpp index de564a0..761d136 100644 --- a/src/ast/statements/let.cpp +++ b/src/ast/statements/let.cpp @@ -8,6 +8,11 @@ namespace ast { name(nullptr), value(nullptr) {} + let_stmt::let_stmt(token::token token, identifier* name, expression* value) + : token(std::move(token)), + name(name), + value(value) {} + std::string let_stmt::token_literal() const { return token.literal; } @@ -24,6 +29,8 @@ namespace ast { if (value != nullptr) ss << value->str(); + ss << ';'; + return ss.str(); }; } // namespace ast diff --git a/src/ast/statements/let.hpp b/src/ast/statements/let.hpp index f520b7b..ce87673 100644 --- a/src/ast/statements/let.hpp +++ b/src/ast/statements/let.hpp @@ -7,6 +7,7 @@ namespace ast { struct let_stmt : statement { let_stmt(token::token token); + let_stmt(token::token token, identifier* name, expression* value); token::token token; identifier* name; diff --git a/src/ast/statements/return.cpp b/src/ast/statements/return.cpp index 41f4889..5c541e0 100644 --- a/src/ast/statements/return.cpp +++ b/src/ast/statements/return.cpp @@ -7,6 +7,10 @@ namespace ast { : token(std::move(token)), value(nullptr) {} + return_stmt::return_stmt(token::token token, expression* value) + : token(std::move(token)), + value(value) {} + std::string return_stmt::token_literal() const { return token.literal; } @@ -22,6 +26,8 @@ namespace ast { if (value != nullptr) ss << value->str(); + ss << ';'; + return ss.str(); }; } // namespace ast diff --git a/src/ast/statements/return.hpp b/src/ast/statements/return.hpp index d5ef478..3252b8e 100644 --- a/src/ast/statements/return.hpp +++ b/src/ast/statements/return.hpp @@ -6,6 +6,7 @@ namespace ast { struct return_stmt : statement { return_stmt(token::token token); + return_stmt(token::token token, expression* value); token::token token; expression* value; diff --git a/test/program.cpp b/test/program.cpp new file mode 100644 index 0000000..93cbd96 --- /dev/null +++ b/test/program.cpp @@ -0,0 +1,38 @@ +#include "ast/program.hpp" + +#include "ast/ast.hpp" +#include "ast/statements/let.hpp" +#include "ast/statements/return.hpp" +#include "token/type.hpp" + +#include + +TEST_SUITE("Program") { + TEST_CASE("Let string") { + ast::program program({new ast::let_stmt( + token::token(token::type::LET, "let"), + new ast::identifier( + token::token(token::type::IDENTIFIER, "myVar"), + "myVar" + ), + new ast::identifier( + token::token(token::type::IDENTIFIER, "anotherVar"), + "anotherVar" + ) + )}); + + CHECK(program.str() == "let myVar = anotherVar;"); + } + + TEST_CASE("Return string") { + ast::program program({new ast::return_stmt( + token::token(token::type::RETURN, "return"), + new ast::identifier( + token::token(token::type::IDENTIFIER, "myVar"), + "myVar" + ) + )}); + + CHECK(program.str() == "return myVar;"); + } +}