diff --git a/tests/test_ASTNodeDataTypeBuilder.cpp b/tests/test_ASTNodeDataTypeBuilder.cpp index 3b8558c3d46700b80a622c111f6c51056a4e12a9..e73e0e7b01434f91953716776ad498d0d7b07472 100644 --- a/tests/test_ASTNodeDataTypeBuilder.cpp +++ b/tests/test_ASTNodeDataTypeBuilder.cpp @@ -256,4 +256,276 @@ break; CHECK_AST(data, result); } + + SECTION("eq_op") + { + std::string_view data = R"( +N a; +a = 1; +)"; + + std::string_view result = R"( +(root:void) + +-(language::declaration:N) + | +-(language::N_set:void) + | `-(language::name:a:N) + `-(language::eq_op:N) + +-(language::name:a:N) + `-(language::integer:1:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("multiplyeq_op") + { + std::string_view data = R"( +N a = 1; +a *= 1.2; +)"; + + std::string_view result = R"( +(root:void) + +-(language::declaration:N) + | +-(language::N_set:void) + | +-(language::name:a:N) + | `-(language::integer:1:Z) + `-(language::multiplyeq_op:N) + +-(language::name:a:N) + `-(language::real:1.2:R) +)"; + + CHECK_AST(data, result); + } + + SECTION("divideeq_op") + { + std::string_view data = R"( +R a = 3; +a /= 2; +)"; + + std::string_view result = R"( +(root:void) + +-(language::declaration:R) + | +-(language::R_set:void) + | +-(language::name:a:R) + | `-(language::integer:3:Z) + `-(language::divideeq_op:R) + +-(language::name:a:R) + `-(language::integer:2:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("pluseq_op") + { + std::string_view data = R"( +Z a = 3; +a += 2; +)"; + + std::string_view result = R"( +(root:void) + +-(language::declaration:Z) + | +-(language::Z_set:void) + | +-(language::name:a:Z) + | `-(language::integer:3:Z) + `-(language::pluseq_op:Z) + +-(language::name:a:Z) + `-(language::integer:2:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("minuseq_op") + { + std::string_view data = R"( +Z a = 1; +a -= 2; +)"; + + std::string_view result = R"( +(root:void) + +-(language::declaration:Z) + | +-(language::Z_set:void) + | +-(language::name:a:Z) + | `-(language::integer:1:Z) + `-(language::minuseq_op:Z) + +-(language::name:a:Z) + `-(language::integer:2:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("for simple") + { + std::string_view data = R"( +for (;;); +)"; + + std::string_view result = R"( +(root:void) + `-(language::for_statement:void) + +-(language::for_init:void) + +-(language::for_test:B) + +-(language::for_post:void) + `-(language::for_statement_bloc:void) +)"; + + CHECK_AST(data, result); + } + + SECTION("for std") + { + std::string_view data = R"( +for (Z i=0; i<3; i += 1) { i += 2; } +)"; + + std::string_view result = R"( +(root:void) + `-(language::for_statement:void) + +-(language::declaration:Z) + | +-(language::Z_set:void) + | +-(language::name:i:Z) + | `-(language::integer:0:Z) + +-(language::lesser_op:B) + | +-(language::name:i:Z) + | `-(language::integer:3:Z) + +-(language::pluseq_op:Z) + | +-(language::name:i:Z) + | `-(language::integer:1:Z) + `-(language::pluseq_op:Z) + +-(language::name:i:Z) + `-(language::integer:2:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("empty bloc") + { + std::string_view data = R"( +{} +)"; + + std::string_view result = R"( +(root:void) +)"; + + CHECK_AST(data, result); + } + + SECTION("bloc") + { + std::string_view data = R"( +{ + 3; +} +)"; + + std::string_view result = R"( +(root:void) + `-(language::bloc:void) + `-(language::integer:3:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("if statements") + { + SECTION("empty if") + { + std::string_view data = R"( +if (true); +)"; + + std::string_view result = R"( +(root:void) + `-(language::if_statement:void) + +-(language::true_kw:B) + `-(language::statement_bloc:void) +)"; + + CHECK_AST(data, result); + } + + SECTION("if else") + { + std::string_view data = R"( +if (true) + 1; +else + 2; +)"; + + std::string_view result = R"( +(root:void) + `-(language::if_statement:void) + +-(language::true_kw:B) + +-(language::integer:1:Z) + `-(language::integer:2:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("if else simplify bloc") + { + std::string_view data = R"( +if (true) { + 1; +} else { + 2; +} +)"; + + std::string_view result = R"( +(root:void) + `-(language::if_statement:void) + +-(language::true_kw:B) + +-(language::integer:1:Z) + `-(language::integer:2:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("if bloc") + { + std::string_view data = R"( +if (true) { + 1; + 2; +} +)"; + + std::string_view result = R"( +(root:void) + `-(language::if_statement:void) + +-(language::true_kw:B) + `-(language::bloc:void) + +-(language::integer:1:Z) + `-(language::integer:2:Z) +)"; + + CHECK_AST(data, result); + } + + SECTION("if invalid condition") + { + std::string_view data = R"( +if ("string"); +)"; + + string_input input{data, "test.pgs"}; + auto ast = ASTBuilder::build(input); + ASTSymbolTableBuilder{*ast}; + REQUIRE_THROWS_AS(ASTNodeDataTypeBuilder{*ast}, parse_error); + } + } }