diff --git a/tests/test_ASTNodeDataTypeBuilder.cpp b/tests/test_ASTNodeDataTypeBuilder.cpp index e73e0e7b01434f91953716776ad498d0d7b07472..db5584779a619738a64acb22c6953f6b63f8ec30 100644 --- a/tests/test_ASTNodeDataTypeBuilder.cpp +++ b/tests/test_ASTNodeDataTypeBuilder.cpp @@ -528,4 +528,176 @@ if ("string"); REQUIRE_THROWS_AS(ASTNodeDataTypeBuilder{*ast}, parse_error); } } + + SECTION("while statements") + { + SECTION("empty while") + { + std::string_view data = R"( +while (true); +)"; + + std::string_view result = R"( +(root:void) + `-(language::while_statement:void) + +-(language::true_kw:B) + `-(language::statement_bloc:void) +)"; + + CHECK_AST(data, result); + } + + SECTION("simple while") + { + std::string_view data = R"( +while (true) 1; +)"; + + std::string_view result = R"( +(root:void) + `-(language::while_statement:void) + +-(language::true_kw:B) + `-(language::integer:1:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("while simplified bloc") + { + std::string_view data = R"( +while (true) { + 1; +} +)"; + + std::string_view result = R"( +(root:void) + `-(language::while_statement:void) + +-(language::true_kw:B) + `-(language::integer:1:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("while bloc_statement") + { + std::string_view data = R"( +while (true) { + 1; + 2; +} +)"; + + std::string_view result = R"( +(root:void) + `-(language::while_statement:void) + +-(language::true_kw:B) + `-(language::bloc:void) + +-(language::integer:1:Z) + `-(language::integer:2:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("while invalid condition") + { + std::string_view data = R"( +while ("string"); +)"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + ASTSymbolTableBuilder{*ast}; + REQUIRE_THROWS_AS(ASTNodeDataTypeBuilder{*ast}, parse_error); + } + } + + SECTION("do-while statements") + { + SECTION("empty do-while") + { + std::string_view data = R"( +do ; while (true); +)"; + + std::string_view result = R"( +(root:void) + `-(language::do_while_statement:void) + +-(language::statement_bloc:void) + `-(language::true_kw:B) +)"; + + CHECK_AST(data, result); + } + + SECTION("simple do-while") + { + std::string_view data = R"( +do 1; while (true); +)"; + + std::string_view result = R"( +(root:void) + `-(language::do_while_statement:void) + +-(language::integer:1:Z) + `-(language::true_kw:B) +)"; + + CHECK_AST(data, result); + } + + SECTION("do-while simplified bloc") + { + std::string_view data = R"( +do { + 1; +} while (true); +)"; + + std::string_view result = R"( +(root:void) + `-(language::do_while_statement:void) + +-(language::integer:1:Z) + `-(language::true_kw:B) +)"; + + CHECK_AST(data, result); + } + + SECTION("do-while bloc") + { + std::string_view data = R"( +do { + 1; + 2; +} while (true); +)"; + + std::string_view result = R"( +(root:void) + `-(language::do_while_statement:void) + +-(language::bloc:void) + | +-(language::integer:1:Z) + | `-(language::integer:2:Z) + `-(language::true_kw:B) +)"; + + CHECK_AST(data, result); + } + + SECTION("do-while invalid condition") + { + std::string_view data = R"( +do 1; while ("string"); + )"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + ASTSymbolTableBuilder{*ast}; + REQUIRE_THROWS_AS(ASTNodeDataTypeBuilder{*ast}, parse_error); + } + } }