diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-03-11 18:16:34 +0100 |
---|---|---|
committer | funjoker <funjoker109@gmail.com> | 2024-03-25 20:16:28 +0100 |
commit | 8acf79193f36e018e47661ae9e6228edbf2b6512 (patch) | |
tree | 0ad2ff63a23acf4e76cd78af8aaaab06bba8d5a0 /tests/common/UniqueTrackablePtr.cpp | |
parent | 6d16f5a1ec4138e30925765f283e598ff47c68a5 (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.cpp | 90 |
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()); + } +} |