aboutsummaryrefslogtreecommitdiffstats
path: root/test/ObjectManager.cpp
diff options
context:
space:
mode:
authorMarcos Magueta <maguetamarcos@gmail.com>2026-05-18 12:50:25 -0300
committerGitHub <noreply@github.com>2026-05-18 12:50:25 -0300
commitaf8759a9c1d965a3220024d1857aea219d62d898 (patch)
tree9cf14af855cac3674f508ec001bd04e262a524ae /test/ObjectManager.cpp
parent0fc76b99abbff1d3cef8e2f9fcd56f3ae4f23a7a (diff)
downloadRNT-af8759a9c1d965a3220024d1857aea219d62d898.tar.gz
RNT-af8759a9c1d965a3220024d1857aea219d62d898.zip
Branching and object registry rework (#11)
Diffstat (limited to '')
-rw-r--r--test/ObjectManager.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/test/ObjectManager.cpp b/test/ObjectManager.cpp
new file mode 100644
index 0000000..e97bcb2
--- /dev/null
+++ b/test/ObjectManager.cpp
@@ -0,0 +1,75 @@
+#include <catch2/catch_test_macros.hpp>
+
+#include "ObjectManager.h"
+
+#include <memory>
+
+// ---------------------------------------------------------------------------
+// Step 5 — Unregister
+//
+// Sessions are disposable and must be removable from the registry on close.
+// Unregister is the splice-out primitive that rnt_session_close, the
+// LifecycleManager TryCollect path, and any future explicit-delete API all
+// share.
+// ---------------------------------------------------------------------------
+
+namespace
+{
+ std::unique_ptr<nt::ObjectManager::object_type> session_type()
+ {
+ auto t = std::make_unique<nt::ObjectManager::object_type>();
+ t->label = SESSION;
+ t->disposable = true;
+ t->methods = { OPEN, CLOSE };
+ return t;
+ }
+}
+
+TEST_CASE("Unregister removes the entry and Find returns nullptr", "[step5][object-manager]")
+{
+ nt::ObjectManager om;
+ om.Register({"system", "sessions", "alpha"},
+ std::make_unique<nt::ObjectManager::Session>(),
+ session_type());
+ REQUIRE(om.Find({"system", "sessions", "alpha"}) != nullptr);
+
+ REQUIRE(om.Unregister({"system", "sessions", "alpha"}) == true);
+ REQUIRE(om.Find({"system", "sessions", "alpha"}) == nullptr);
+}
+
+TEST_CASE("Unregister returns false for missing paths", "[step5][object-manager]")
+{
+ nt::ObjectManager om;
+ REQUIRE(om.Unregister({"never", "registered"}) == false);
+}
+
+TEST_CASE("Unregister splices a middle entry without disturbing neighbours",
+ "[step5][object-manager]")
+{
+ nt::ObjectManager om;
+ om.Register({"a"}, std::make_unique<nt::ObjectManager::Session>(), session_type());
+ om.Register({"b"}, std::make_unique<nt::ObjectManager::Session>(), session_type());
+ om.Register({"c"}, std::make_unique<nt::ObjectManager::Session>(), session_type());
+
+ REQUIRE(om.Unregister({"b"}) == true);
+
+ REQUIRE(om.Find({"a"}) != nullptr);
+ REQUIRE(om.Find({"b"}) == nullptr);
+ REQUIRE(om.Find({"c"}) != nullptr);
+}
+
+TEST_CASE("Unregister at the head of the list works", "[step5][object-manager]")
+{
+ nt::ObjectManager om;
+ om.Register({"first"}, std::make_unique<nt::ObjectManager::Session>(), session_type());
+ om.Register({"second"}, std::make_unique<nt::ObjectManager::Session>(), session_type());
+
+ // The most recently registered entry is the list head (LIFO).
+ REQUIRE(om.Unregister({"second"}) == true);
+ REQUIRE(om.Find({"second"}) == nullptr);
+ REQUIRE(om.Find({"first"}) != nullptr);
+
+ // And the new head is removable too.
+ REQUIRE(om.Unregister({"first"}) == true);
+ REQUIRE(om.Find({"first"}) == nullptr);
+}