#include "google/gtest/gtest.h" #include "../optional_ownership_ptr.h" #include "../macros.h" using std::unique_ptr; using std::function; using ::testing::Test; using namespace cpputils; class TestObject { public: TestObject(function destructorListener) : _destructorListener(destructorListener) {} virtual ~TestObject() { _destructorListener(); } private: function _destructorListener; }; class TestObjectHolder { public: TestObjectHolder() : _isDestructed(false), _testObject(new TestObject([this]() {_isDestructed = true;})) { } ~TestObjectHolder() { if (!_isDestructed) { delete _testObject; _isDestructed = true; } } TestObject *get() { return _testObject; } bool isDestructed() { return _isDestructed; } private: bool _isDestructed; TestObject *_testObject; }; class OptionalOwnershipPointerTest: public Test { public: TestObjectHolder obj; TestObjectHolder obj2; }; TEST_F(OptionalOwnershipPointerTest, TestIsInitializedCorrectly) { EXPECT_FALSE(obj.isDestructed()); } TEST_F(OptionalOwnershipPointerTest, DestructsWhenItHasOwnership) { { optional_ownership_ptr ptr = WithOwnership(unique_ptr(obj.get())); UNUSED(ptr); } EXPECT_TRUE(obj.isDestructed()); } TEST_F(OptionalOwnershipPointerTest, DestructsWhenItHasOwnershipAfterAssignment) { { optional_ownership_ptr ptr = WithoutOwnership(obj.get()); ptr = WithOwnership(unique_ptr(obj2.get())); } EXPECT_FALSE(obj.isDestructed()); EXPECT_TRUE(obj2.isDestructed()); } TEST_F(OptionalOwnershipPointerTest, DoesntDestructWhenItDoesntHaveOwnership) { { optional_ownership_ptr ptr = WithoutOwnership(obj.get()); UNUSED(ptr); } EXPECT_FALSE(obj.isDestructed()); } TEST_F(OptionalOwnershipPointerTest, DoesntDestructWhenItDoesntHaveOwnershipAfterAssignment) { { optional_ownership_ptr ptr = WithOwnership(unique_ptr(obj.get())); ptr = WithoutOwnership(obj2.get()); EXPECT_TRUE(obj.isDestructed()); } EXPECT_FALSE(obj2.isDestructed()); } TEST_F(OptionalOwnershipPointerTest, DestructsOnReassignmentWithNull) { optional_ownership_ptr ptr = WithOwnership(unique_ptr(obj.get())); ptr = null(); EXPECT_TRUE(obj.isDestructed()); } TEST_F(OptionalOwnershipPointerTest, DoesntCrashWhenDestructingNullptr1) { optional_ownership_ptr ptr = null(); UNUSED(ptr); } TEST_F(OptionalOwnershipPointerTest, DoesntCrashWhenDestructingNullptrWithoutOwnership) { optional_ownership_ptr ptr = WithoutOwnership((TestObject*)nullptr); UNUSED(ptr); } TEST_F(OptionalOwnershipPointerTest, DoesntCrashWhenDestructingNullptrWithOwnership) { optional_ownership_ptr ptr = WithOwnership(unique_ptr(nullptr)); UNUSED(ptr); }