From c97fc5d7970246c82897ba032c0b9c4e68447f9c Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Thu, 25 Jul 2019 11:29:30 +0200 Subject: [PATCH] Add affectation operators and if statement node type tests --- tests/test_ASTNodeDataTypeBuilder.cpp | 272 ++++++++++++++++++++++++++ 1 file changed, 272 insertions(+) diff --git a/tests/test_ASTNodeDataTypeBuilder.cpp b/tests/test_ASTNodeDataTypeBuilder.cpp index 3b8558c3d..e73e0e7b0 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); + } + } } -- GitLab