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);
+    }
+  }
 }