diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index bd30945f2fab3f09362b27e25f74cc830496b9a9..fda652d92696c9bca0ff39db5766b2a5fd63b0d1 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -3,6 +3,7 @@ set(EXECUTABLE_OUTPUT_PATH ${PUGS_BINARY_DIR})
 
 add_executable (unit_tests
   test_main.cpp
+  test_ASTSymbolTableBuilder.cpp
   test_ASTBuilder.cpp
   test_Array.cpp
   test_ArrayUtils.cpp
diff --git a/tests/test_ASTSymbolTableBuilder.cpp b/tests/test_ASTSymbolTableBuilder.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1f3d98f21f74c8ff9fc538d6964fb4f96e03c271
--- /dev/null
+++ b/tests/test_ASTSymbolTableBuilder.cpp
@@ -0,0 +1,48 @@
+#include <catch2/catch.hpp>
+
+#include <ASTBuilder.hpp>
+#include <ASTSymbolTableBuilder.hpp>
+
+TEST_CASE("ASTSymbolTableBuilder", "[language]")
+{
+  SECTION("Build symbols")
+  {
+    std::string_view data = R"(
+N n = 2;
+{
+ N m = n;
+ R n = m/3.;
+}
+)";
+
+    string_input input{data, "test.pgs"};
+    auto ast = ASTBuilder::build(input);
+
+    ASTSymbolTableBuilder{*ast};
+  }
+
+  SECTION("Undeclared symbol")
+  {
+    std::string_view data = R"(
+N n = a;
+)";
+
+    string_input input{data, "test.pgs"};
+    auto ast = ASTBuilder::build(input);
+
+    REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error);
+  }
+
+  SECTION("Re-declared symbol")
+  {
+    std::string_view data = R"(
+N n = 0;
+N n = 1;
+)";
+
+    string_input input{data, "test.pgs"};
+    auto ast = ASTBuilder::build(input);
+
+    REQUIRE_THROWS_AS(ASTSymbolTableBuilder{*ast}, parse_error);
+  }
+}