diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 87cac19205c7eece3918e7d2e076d6ba4e79f74f..af385092149149d41fbf41f70172759e29320573 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -19,6 +19,7 @@ add_executable (unit_tests
   test_ArraySubscriptProcessor.cpp
   test_ASTBuilder.cpp
   test_ASTDotPrinter.cpp
+  test_ASTExecutionStack.cpp
   test_ASTModulesImporter.cpp
   test_ASTNode.cpp
   test_ASTNodeAffectationExpressionBuilder.cpp
diff --git a/tests/test_ASTExecutionStack.cpp b/tests/test_ASTExecutionStack.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d78c8572c9e6f44372f03f1c500c9c922b1e994b
--- /dev/null
+++ b/tests/test_ASTExecutionStack.cpp
@@ -0,0 +1,82 @@
+#include <catch2/catch_test_macros.hpp>
+#include <catch2/matchers/catch_matchers_all.hpp>
+
+#include <language/ast/ASTBuilder.hpp>
+#include <language/ast/ASTExecutionStack.hpp>
+#include <language/ast/ASTModulesImporter.hpp>
+#include <language/ast/ASTNodeDataTypeBuilder.hpp>
+#include <language/ast/ASTNodeDeclarationToAffectationConverter.hpp>
+#include <language/ast/ASTNodeExpressionBuilder.hpp>
+#include <language/ast/ASTNodeTypeCleaner.hpp>
+#include <language/ast/ASTSymbolTableBuilder.hpp>
+
+#include <pegtl/string_input.hpp>
+
+#include <sstream>
+
+// clazy:excludeall=non-pod-global-static
+
+TEST_CASE("ASTExecutionStack", "[language]")
+{
+  REQUIRE_NOTHROW(ASTExecutionStack::create());
+  REQUIRE_THROWS_WITH(ASTExecutionStack::create(), "unexpected error: ASTExecutionStack was already created!");
+
+#ifndef NDEBUG
+  REQUIRE_THROWS_WITH(ASTExecutionStack::getInstance().sourceLocation(), "stack.size() > 0");
+#endif   // NDEBUG
+
+  REQUIRE_NOTHROW(ASTExecutionStack::destroy());
+
+  std::string data = R"(
+import math;
+
+for (let i:N, i=0; i<5; ++i) {
+  cout << 2 * i << "\n";
+  i += 1;
+}
+)";
+
+  auto input = std::make_shared<TAO_PEGTL_NAMESPACE::string_input<>>(data, "test.pgs");
+
+  ASTExecutionStack::create(input, data);
+
+  REQUIRE_THROWS_WITH(ASTExecutionStack::create(input, data),
+                      "unexpected error: ASTExecutionStack was already created!");
+
+  auto ast = ASTBuilder::build(*input);
+
+  ASTModulesImporter{*ast};
+  ASTNodeTypeCleaner<language::import_instruction>{*ast};
+
+  ASTSymbolTableBuilder{*ast};
+  ASTNodeDataTypeBuilder{*ast};
+
+  ASTNodeDeclarationToAffectationConverter{*ast};
+  ASTNodeTypeCleaner<language::var_declaration>{*ast};
+
+  ASTNodeExpressionBuilder{*ast};
+
+  REQUIRE(ASTExecutionStack::getInstance().errorMessageAt("error_msg") == "error_msg");
+
+  ASTExecutionStack::getInstance().push(ast->children[0].get());
+  ASTExecutionStack::getInstance().push(ast->children[0]->children[3]->children[1].get());
+
+  REQUIRE(ASTExecutionStack::getInstance().errorMessageAt("error_msg") == R"(test.pgs:6:5: error_msg
+  i += 1;
+    ^
+)");
+
+  auto source_location = ASTExecutionStack::getInstance().sourceLocation();
+  REQUIRE(source_location.filename() == "test.pgs");
+  REQUIRE(source_location.line() == 6);
+  REQUIRE(source_location.column() == 5);
+  REQUIRE(source_location.function() == "");
+
+  ASTExecutionStack::getInstance().pop();
+  ASTExecutionStack::getInstance().pop();
+
+  ast->m_symbol_table->clearValues();
+
+  REQUIRE_NOTHROW(ASTExecutionStack::destroy());
+  REQUIRE_THROWS_WITH(ASTExecutionStack::destroy(), "unexpected error: ASTExecutionStack was not created!");
+}