blob: 163d664809eea33d2f84902192890cf8161abfd2 [file] [log] [blame]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you 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
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 <gtest/gtest.h>
#include "capu/util/SmartPointer.h"
class DummyClass {
private:
capu::int32_t mValue;
FRIEND_TEST(SmartPointer, Constructors);
FRIEND_TEST(SmartPointer, Deconstructor);
FRIEND_TEST(SmartPointer, FileOperator);
FRIEND_TEST(SmartPointer, DereferencingOperator);
public:
static capu::int32_t mRefCount;
public:
DummyClass() {
mValue = 5;
mRefCount++;
}
~DummyClass() {
mRefCount--;
};
void set(capu::int32_t value) {
mValue = value;
};
};
class ChildDummyClass : public DummyClass {
public:
ChildDummyClass() {
}
};
capu::int32_t DummyClass::mRefCount = 0;
TEST(SmartPointer, Constructors) {
{
capu::SmartPointer<DummyClass> ptr(new DummyClass());
EXPECT_EQ((capu::uint32_t)1, ptr.getRefCount());
EXPECT_EQ(1, DummyClass::mRefCount);
//Copy constructor
capu::SmartPointer<DummyClass> ptr2(ptr);
EXPECT_EQ((capu::uint32_t)2, ptr.getRefCount());
EXPECT_EQ((capu::uint32_t)2, ptr2.getRefCount());
EXPECT_EQ(1, DummyClass::mRefCount);
EXPECT_EQ(5, ptr2->mValue);
}
EXPECT_EQ(0,DummyClass::mRefCount);
//constructor for castable type
capu::SmartPointer<ChildDummyClass> childPtr(new ChildDummyClass());
capu::SmartPointer<DummyClass> parentPtr(childPtr);
EXPECT_EQ((capu::uint32_t)2,childPtr.getRefCount());
EXPECT_EQ((capu::uint32_t)2,parentPtr.getRefCount());
}
TEST(SmartPointer, AssignmentOperator) {
capu::SmartPointer<DummyClass> ptr = new DummyClass();
EXPECT_EQ((capu::uint32_t)1, ptr.getRefCount());
//copy
capu::SmartPointer<DummyClass> ptr2 = ptr;
EXPECT_EQ((capu::uint32_t)2, ptr.getRefCount());
capu::SmartPointer<DummyClass> ptr3 = new DummyClass();
ptr3 = NULL;
EXPECT_EQ((capu::uint32_t)1, ptr3.getRefCount());
capu::SmartPointer<DummyClass> ptr4 = ptr3;
EXPECT_EQ((capu::uint32_t)2, ptr4.getRefCount());
ptr3 = new DummyClass();
EXPECT_EQ((capu::uint32_t)1,ptr3.getRefCount());
EXPECT_EQ((capu::uint32_t)1,ptr4.getRefCount());
//assignment of castable type
capu::SmartPointer<ChildDummyClass> childPtr(new ChildDummyClass());
capu::SmartPointer<DummyClass> parentPtr(new DummyClass());
capu::SmartPointer<DummyClass> parentPtrCopy(parentPtr);
EXPECT_EQ((capu::uint32_t)2,parentPtr.getRefCount());
EXPECT_EQ((capu::uint32_t)2,parentPtrCopy.getRefCount());
//assign
parentPtr = childPtr;
EXPECT_EQ((capu::uint32_t)2,childPtr.getRefCount());
EXPECT_EQ((capu::uint32_t)2,parentPtr.getRefCount());
EXPECT_EQ((capu::uint32_t)1,parentPtrCopy.getRefCount());
}
TEST(SmartPointer, FileOperator) {
capu::SmartPointer<DummyClass> ptr = new DummyClass();
EXPECT_EQ(5, ptr->mValue);
ptr->set(13);
EXPECT_EQ(13, ptr->mValue);
}
TEST(SmartPointer, DereferencingOperator) {
DummyClass *dc = new DummyClass();
capu::SmartPointer<DummyClass> ptr(dc);
DummyClass *dc2 = &(*ptr);
EXPECT_EQ(dc, dc2);
}
TEST(SmartPointer, getObject) {
DummyClass *dc = new DummyClass();
capu::SmartPointer<DummyClass> ptr(dc);
DummyClass *dc2 = ptr.get();
EXPECT_TRUE(dc2 != NULL);
EXPECT_EQ(dc, dc2);
}
TEST(SmartPointer, BoolOperator) {
capu::SmartPointer<DummyClass> ptr;
ptr = new DummyClass();
ASSERT_TRUE(ptr);
ptr = NULL;
ASSERT_FALSE(ptr);
}
TEST(SmartPointer, getRefCount) {
capu::SmartPointer<DummyClass> ptr;
ptr = new DummyClass();
EXPECT_EQ((capu::uint32_t)1, ptr.getRefCount());
ptr.~SmartPointer();
EXPECT_EQ((capu::uint32_t)0, ptr.getRefCount());
}
TEST(SmartPointer, operatorTest) {
capu::SmartPointer<DummyClass> ptr, ptr2;
ptr = new DummyClass();
EXPECT_EQ((capu::uint32_t)1, ptr.getRefCount());
EXPECT_FALSE(ptr == ptr2);
EXPECT_TRUE(ptr != ptr2);
ptr2 = ptr;
EXPECT_TRUE(ptr == ptr2);
EXPECT_FALSE(ptr != ptr2);
}
TEST(SmartPointer,castTest) {
capu::SmartPointer<DummyClass> ptr2;
capu::SmartPointer<ChildDummyClass> ptr;
ptr = new ChildDummyClass();
EXPECT_EQ((capu::uint32_t)1, ptr.getRefCount());
capu::SmartPointer<DummyClass> gecastet = ptr;
EXPECT_EQ((capu::uint32_t)2, ptr.getRefCount());
}
TEST(SmartPointer,smartpointer_castTest) {
capu::SmartPointer<DummyClass> spDummy;
spDummy = new ChildDummyClass();
EXPECT_EQ((capu::uint32_t)1, spDummy.getRefCount());
// test cast to pointer and copy
capu::SmartPointer<ChildDummyClass> spChildDummy = capu::smartpointer_cast<ChildDummyClass>(spDummy);
EXPECT_EQ((capu::uint32_t)2, spDummy.getRefCount());
EXPECT_EQ((capu::uint32_t)2, spChildDummy.getRefCount());
// change pointer
spDummy = new ChildDummyClass();
EXPECT_EQ((capu::uint32_t)1, spDummy.getRefCount());
EXPECT_EQ((capu::uint32_t)1, spChildDummy.getRefCount());
}