diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 235e1315340de59889dd21bc33fd1be998776200..c30308bbf1f536a2724c9e01402d4228455fd2ac 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -10,6 +10,7 @@ add_executable (unit_tests test_ASTNodeDataType.cpp test_ASTNodeDataTypeBuilder.cpp test_ASTNodeDataTypeChecker.cpp + test_ASTNodeDeclarationCleaner.cpp test_ASTNodeDeclarationToAffectationConverter.cpp test_ASTNodeJumpPlacementChecker.cpp test_ASTNodeValueBuilder.cpp diff --git a/tests/test_ASTNodeDeclarationCleaner.cpp b/tests/test_ASTNodeDeclarationCleaner.cpp new file mode 100644 index 0000000000000000000000000000000000000000..03c46fff4490a8284cd7b5665e75fd030af7b0c2 --- /dev/null +++ b/tests/test_ASTNodeDeclarationCleaner.cpp @@ -0,0 +1,98 @@ +#include <catch2/catch.hpp> + +#include <ASTNodeValueBuilder.hpp> + +#include <ASTBuilder.hpp> +#include <ASTNodeDataTypeBuilder.hpp> + +#include <ASTNodeDeclarationCleaner.hpp> + +#include <ASTSymbolTableBuilder.hpp> + +#include <ASTPrinter.hpp> + +#define CHECK_AST(data, expected_output) \ + { \ + static_assert(std::is_same_v<std::decay_t<decltype(data)>, std::string_view>); \ + static_assert(std::is_same_v<std::decay_t<decltype(expected_output)>, std::string_view>); \ + \ + string_input input{data, "test.pgs"}; \ + auto ast = ASTBuilder::build(input); \ + \ + ASTSymbolTableBuilder{*ast}; \ + ASTNodeDataTypeBuilder{*ast}; \ + ASTNodeValueBuilder{*ast}; \ + \ + ASTNodeDeclarationCleaner{*ast}; \ + \ + std::stringstream ast_output; \ + ast_output << '\n' << ASTPrinter{*ast, ASTPrinter::Format::raw, {ASTPrinter::Info::none}}; \ + \ + REQUIRE(ast_output.str() == expected_output); \ + } + +TEST_CASE("ASTNodeDeclarationCleaner", "[language]") +{ + SECTION("no declaration") + { + std::string_view data = R"( +cout << "two=" << 2 << "\n"; +)"; + + std::string_view result = R"( +(root) + `-(language::cout_kw) + +-(language::literal:"two=") + +-(language::integer:2) + `-(language::literal:"\n") +)"; + + CHECK_AST(data, result); + } + + SECTION("single declaration") + { + std::string_view data = R"( +R z; +z = 1; +)"; + + std::string_view result = R"( +(root) + `-(language::eq_op) + +-(language::name:z) + `-(language::integer:1) +)"; + + CHECK_AST(data, result); + } + + SECTION("multiple declaration") + { + std::string_view data = R"( +Z z; +z = 1; +if (true) { + R x; + x = 0.5 *z; +} +)"; + + std::string_view result = R"( +(root) + +-(language::eq_op) + | +-(language::name:z) + | `-(language::integer:1) + `-(language::if_statement) + +-(language::true_kw) + `-(language::bloc) + `-(language::eq_op) + +-(language::name:x) + `-(language::multiply_op) + +-(language::real:0.5) + `-(language::name:z) +)"; + + CHECK_AST(data, result); + } +}