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