aboutsummaryrefslogtreecommitdiff
path: root/tests/common/UniqueTrackablePtr.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-11 18:16:34 +0100
committerfunjoker <funjoker109@gmail.com>2024-03-25 20:16:28 +0100
commit8acf79193f36e018e47661ae9e6228edbf2b6512 (patch)
tree0ad2ff63a23acf4e76cd78af8aaaab06bba8d5a0 /tests/common/UniqueTrackablePtr.cpp
parent6d16f5a1ec4138e30925765f283e598ff47c68a5 (diff)
Core/Utils: Added a custom smart pointer type unique_trackable_ptr - a specialized variant of std::shared_ptr that enforces unique ownership
* This is intended to be used by external code unable to track object lifetime such as custom scripting engines (cherry picked from commit 32e54b6bd168c196adb45360b18721851162d731)
Diffstat (limited to 'tests/common/UniqueTrackablePtr.cpp')
-rw-r--r--tests/common/UniqueTrackablePtr.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/tests/common/UniqueTrackablePtr.cpp b/tests/common/UniqueTrackablePtr.cpp
new file mode 100644
index 00000000000..6a1db9fa277
--- /dev/null
+++ b/tests/common/UniqueTrackablePtr.cpp
@@ -0,0 +1,90 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "tc_catch2.h"
+
+#include "UniqueTrackingPtr.h"
+
+struct TestObj
+{
+ TestObj(bool* deleted = nullptr) : Deleted(deleted) { }
+
+ ~TestObj()
+ {
+ if (Deleted)
+ *Deleted = true;
+ }
+
+ bool* Deleted = nullptr;
+};
+
+TEST_CASE("Trinity::unique_trackable_ptr frees memory", "[UniqueTrackingPtr]")
+{
+ bool deleted = false;
+
+ SECTION("reassigning new object deletes old one")
+ {
+ Trinity::unique_trackable_ptr<TestObj> ptr = Trinity::make_unique_trackable<TestObj>(&deleted);
+
+ ptr.reset(new TestObj());
+
+ REQUIRE(deleted == true);
+ }
+
+ SECTION("going out of scope deletes object")
+ {
+ REQUIRE(deleted == false);
+
+ {
+ Trinity::unique_trackable_ptr<TestObj> ptr = Trinity::make_unique_trackable<TestObj>(&deleted);
+ }
+
+ REQUIRE(deleted == true);
+ }
+}
+
+TEST_CASE("Trinity::unique_weak_ptr", "[UniqueTrackingPtr]")
+{
+ Trinity::unique_trackable_ptr<int> ptr = Trinity::make_unique_trackable<int>();
+
+ Trinity::unique_weak_ptr<int> weakRef = ptr;
+
+ SECTION("when unique_trackable_ptr no longer holds a value then weak cannot retrieve it")
+ {
+ ptr.reset();
+
+ REQUIRE(weakRef.expired());
+ REQUIRE(!weakRef.lock());
+ }
+
+ SECTION("when unique_trackable_ptr is reassigned then weak cannot retrieve old value")
+ {
+ ptr.reset(new int);
+
+ Trinity::unique_weak_ptr<int> weakRef2 = ptr;
+
+ REQUIRE(weakRef.expired());
+ REQUIRE(!weakRef2.expired());
+ REQUIRE(weakRef.lock() != weakRef2.lock());
+ }
+
+ SECTION("when unique_trackable_ptr holds a value then weak can retrieve it")
+ {
+ REQUIRE(!weakRef.expired());
+ REQUIRE(!!weakRef.lock());
+ }
+}