2015-02-16 21:31:07 +01:00
|
|
|
#include "google/gtest/gtest.h"
|
2015-02-16 21:36:00 +01:00
|
|
|
#include "../optional_ownership_ptr.h"
|
|
|
|
#include "../macros.h"
|
2015-02-16 21:31:07 +01:00
|
|
|
|
|
|
|
using std::unique_ptr;
|
|
|
|
using std::function;
|
|
|
|
using ::testing::Test;
|
|
|
|
|
2015-02-16 21:36:00 +01:00
|
|
|
using namespace cpputils;
|
2015-02-16 21:31:07 +01:00
|
|
|
|
|
|
|
class TestObject {
|
|
|
|
public:
|
|
|
|
TestObject(function<void()> destructorListener) : _destructorListener(destructorListener) {}
|
|
|
|
virtual ~TestObject() {
|
|
|
|
_destructorListener();
|
|
|
|
}
|
|
|
|
private:
|
|
|
|
function<void()> _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) {
|
|
|
|
{
|
2015-02-16 21:36:00 +01:00
|
|
|
optional_ownership_ptr<TestObject> ptr = WithOwnership(unique_ptr<TestObject>(obj.get()));
|
2015-02-16 21:31:07 +01:00
|
|
|
UNUSED(ptr);
|
|
|
|
}
|
|
|
|
EXPECT_TRUE(obj.isDestructed());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(OptionalOwnershipPointerTest, DestructsWhenItHasOwnershipAfterAssignment) {
|
|
|
|
{
|
2015-02-16 21:36:00 +01:00
|
|
|
optional_ownership_ptr<TestObject> ptr = WithoutOwnership(obj.get());
|
|
|
|
ptr = WithOwnership(unique_ptr<TestObject>(obj2.get()));
|
2015-02-16 21:31:07 +01:00
|
|
|
}
|
|
|
|
EXPECT_FALSE(obj.isDestructed());
|
|
|
|
EXPECT_TRUE(obj2.isDestructed());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(OptionalOwnershipPointerTest, DoesntDestructWhenItDoesntHaveOwnership) {
|
|
|
|
{
|
2015-02-16 21:36:00 +01:00
|
|
|
optional_ownership_ptr<TestObject> ptr = WithoutOwnership(obj.get());
|
2015-02-16 21:31:07 +01:00
|
|
|
UNUSED(ptr);
|
|
|
|
}
|
|
|
|
EXPECT_FALSE(obj.isDestructed());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(OptionalOwnershipPointerTest, DoesntDestructWhenItDoesntHaveOwnershipAfterAssignment) {
|
|
|
|
{
|
2015-02-16 21:36:00 +01:00
|
|
|
optional_ownership_ptr<TestObject> ptr = WithOwnership(unique_ptr<TestObject>(obj.get()));
|
|
|
|
ptr = WithoutOwnership(obj2.get());
|
2015-02-16 21:31:07 +01:00
|
|
|
EXPECT_TRUE(obj.isDestructed());
|
|
|
|
}
|
|
|
|
EXPECT_FALSE(obj2.isDestructed());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(OptionalOwnershipPointerTest, DestructsOnReassignmentWithNull) {
|
2015-02-16 21:36:00 +01:00
|
|
|
optional_ownership_ptr<TestObject> ptr = WithOwnership(unique_ptr<TestObject>(obj.get()));
|
|
|
|
ptr = null<TestObject>();
|
2015-02-16 21:31:07 +01:00
|
|
|
EXPECT_TRUE(obj.isDestructed());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(OptionalOwnershipPointerTest, DoesntCrashWhenDestructingNullptr1) {
|
2015-02-16 21:36:00 +01:00
|
|
|
optional_ownership_ptr<TestObject> ptr = null<TestObject>();
|
2015-02-16 21:31:07 +01:00
|
|
|
UNUSED(ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(OptionalOwnershipPointerTest, DoesntCrashWhenDestructingNullptrWithoutOwnership) {
|
2015-02-16 21:36:00 +01:00
|
|
|
optional_ownership_ptr<TestObject> ptr = WithoutOwnership((TestObject*)nullptr);
|
2015-02-16 21:31:07 +01:00
|
|
|
UNUSED(ptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(OptionalOwnershipPointerTest, DoesntCrashWhenDestructingNullptrWithOwnership) {
|
2015-02-16 21:36:00 +01:00
|
|
|
optional_ownership_ptr<TestObject> ptr = WithOwnership(unique_ptr<TestObject>(nullptr));
|
2015-02-16 21:31:07 +01:00
|
|
|
UNUSED(ptr);
|
|
|
|
}
|