blob: 715e4718cc938e67513db30d74900a696b1057db [file] [log] [blame]
// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "emugl/common/smart_ptr.h"
#include <gtest/gtest.h>
namespace emugl {
// This Test sub-class is used to track allocations and deallocations of
// the MyTestClass instances that are created through newInstance().
// See below for typical usage.
class SmartPtrTest : public testing::Test {
public:
SmartPtrTest() : mNewCount(0), mDeleteCount(0), mDoCount(0) {}
~SmartPtrTest() {
mNewCount = 0;
mDoCount = 0;
mDeleteCount = 0;
}
class MyClass;
MyClass* newInstance() {
return new MyClass(this);
}
class MyClass {
public:
MyClass(SmartPtrTest* test) : mTest(test) {
mTest->mNewCount++;
}
void doStuff() {
mTest->mDoCount++;
}
~MyClass() {
mTest->mDeleteCount++;
}
private:
SmartPtrTest* mTest;
};
int mNewCount;
int mDeleteCount;
int mDoCount;
};
TEST_F(SmartPtrTest, Empty) {
SmartPtr<MyClass> ptr;
EXPECT_FALSE(ptr.get());
EXPECT_EQ(0, mNewCount);
EXPECT_EQ(0, mDeleteCount);
EXPECT_EQ(0, mDoCount);
}
TEST_F(SmartPtrTest, SingleRef) {
MyClass* obj = newInstance();
EXPECT_EQ(1, mNewCount);
{
SmartPtr<MyClass> ptr(obj);
EXPECT_EQ(obj, ptr.get());
EXPECT_EQ(1, mNewCount);
EXPECT_EQ(0, mDeleteCount);
EXPECT_EQ(0, mDoCount);
}
// Check that the object was deleted.
EXPECT_EQ(1, mDeleteCount);
}
TEST_F(SmartPtrTest, CopyConstructor) {
MyClass* obj = newInstance();
EXPECT_EQ(1, mNewCount);
{
SmartPtr<MyClass> ptr1(obj);
{
SmartPtr<MyClass> ptr2(ptr1);
EXPECT_EQ(2, ptr1.use_count());
EXPECT_EQ(2, ptr2.use_count());
EXPECT_EQ(1, mNewCount);
EXPECT_EQ(0, mDeleteCount);
EXPECT_EQ(0, mDoCount);
}
EXPECT_EQ(1, mNewCount);
EXPECT_EQ(0, mDeleteCount);
EXPECT_EQ(0, mDoCount);
}
EXPECT_EQ(1, mNewCount);
EXPECT_EQ(1, mDeleteCount);
EXPECT_EQ(0, mDoCount);
}
TEST_F(SmartPtrTest, AssignmentOperator) {
SmartPtr<MyClass> ptr1(newInstance());
SmartPtr<MyClass> ptr2(newInstance());
EXPECT_EQ(2, mNewCount);
EXPECT_EQ(0, mDeleteCount);
EXPECT_EQ(0, mDoCount);
ptr2 = ptr1;
EXPECT_EQ(2, mNewCount);
EXPECT_EQ(1, mDeleteCount);
EXPECT_EQ(ptr1.get(), ptr2.get());
EXPECT_EQ(2, ptr1.use_count());
EXPECT_EQ(2, ptr2.use_count());
}
TEST_F(SmartPtrTest, ArrowOperator) {
SmartPtr<MyClass> ptr(newInstance());
ptr->doStuff();
EXPECT_EQ(1, mDoCount);
(*ptr).doStuff();
EXPECT_EQ(2, mDoCount);
}
} // namespace emugl