From 8acf79193f36e018e47661ae9e6228edbf2b6512 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 11 Mar 2024 18:16:34 +0100 Subject: 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) --- tests/common/UniqueTrackablePtr.cpp | 90 +++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 tests/common/UniqueTrackablePtr.cpp (limited to 'tests/common/UniqueTrackablePtr.cpp') 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 . + */ + +#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 ptr = Trinity::make_unique_trackable(&deleted); + + ptr.reset(new TestObj()); + + REQUIRE(deleted == true); + } + + SECTION("going out of scope deletes object") + { + REQUIRE(deleted == false); + + { + Trinity::unique_trackable_ptr ptr = Trinity::make_unique_trackable(&deleted); + } + + REQUIRE(deleted == true); + } +} + +TEST_CASE("Trinity::unique_weak_ptr", "[UniqueTrackingPtr]") +{ + Trinity::unique_trackable_ptr ptr = Trinity::make_unique_trackable(); + + Trinity::unique_weak_ptr 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 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()); + } +} -- cgit v1.2.3