+ tet_infoline("Test for Dali::IntrusivePtr::operator !=(T*, U)");
+
+ IntrusivePtr<Counted> counted1(new Counted);
+ IntrusivePtr<CountedSubclass> countedSubclass1(new CountedSubclass);
+ IntrusivePtr<CountedSubclass> countedSubclass2(new CountedSubclass);
+ IntrusivePtr<Counted> counted2(countedSubclass2);
+
+ DALI_TEST_EQUALS(operator!=(counted1.Get(), countedSubclass1), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(operator!=(counted2.Get(), countedSubclass2), false, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliRefObjectCopyConstructor(void)
+{
+ tet_infoline("Test for Dali::RefObject(const RefObject&)");
+
+ {
+ IntrusivePtr<TestObject> testPtr(new TestObject);
+ DALI_TEST_EQUALS(testPtr->ReferenceCount(), 1, TEST_LOCATION);
+
+ const TestObject& testObject = *testPtr.Get();
+ {
+ IntrusivePtr<TestObject> testPtr2(new TestObject(testObject));
+ DALI_TEST_EQUALS(testPtr2->ReferenceCount(), 1, TEST_LOCATION);
+ }
+ DALI_TEST_EQUALS(testPtr->ReferenceCount(), 1, TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliRefObjectAssignmentOperator(void)
+{
+ tet_infoline("Test for Dali::RefObject::operator=(const RefObject&)");
+
+ {
+ IntrusivePtr<TestObject> testPtr(new TestObject);
+ DALI_TEST_EQUALS(testPtr->ReferenceCount(), 1, TEST_LOCATION);
+
+ const TestObject& testObject = *testPtr.Get();
+ {
+ IntrusivePtr<TestObject> testPtr2(new TestObject());
+ testPtr->data = 33;
+ IntrusivePtr<TestObject> testPtr3 = testPtr2;
+ DALI_TEST_EQUALS(testPtr2->ReferenceCount(), 2, TEST_LOCATION);
+ DALI_TEST_EQUALS(testPtr2->data, 201, TEST_LOCATION);
+
+ TestObject& testObject2 = *testPtr2.Get();
+ testObject2 = testObject;
+
+ DALI_TEST_EQUALS(testPtr->ReferenceCount(), 1, TEST_LOCATION);
+ DALI_TEST_EQUALS(testPtr2->ReferenceCount(), 2, TEST_LOCATION);
+ }
+ DALI_TEST_EQUALS(testPtr->ReferenceCount(), 1, TEST_LOCATION);
+ }
+
+ END_TEST;
+}
+
+int UtcDaliRefObjectAssignmentOperatorToNull(void)
+{
+ tet_infoline("Testing Dali::IntrusivePtr = nullptr");
+
+ g_creationCount = g_destructionCount = 0;
+
+ IntrusivePtr<Counted> counted(new Counted);
+
+ DALI_TEST_EQUALS(g_creationCount, 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(g_destructionCount, 0u, TEST_LOCATION);
+
+ IntrusivePtr<Counted> counted2 = counted;
+ DALI_TEST_EQUALS(g_creationCount, 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(g_destructionCount, 0u, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(counted->ReferenceCount(), 2, TEST_LOCATION);
+
+ counted2 = nullptr;
+ DALI_TEST_EQUALS(g_destructionCount, 0u, TEST_LOCATION);
+ DALI_TEST_EQUALS(counted->ReferenceCount(), 1, TEST_LOCATION);
+
+ counted = nullptr;
+ DALI_TEST_EQUALS(g_destructionCount, 1u, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliIntrusivePtrMoveConstructor(void)
+{
+ IntrusivePtr<TestObject> testPtr(new TestObject);
+ DALI_TEST_EQUALS(testPtr->ReferenceCount(), 1, TEST_LOCATION);
+ DALI_TEST_EQUALS(testPtr->data, 201, TEST_LOCATION);
+
+ IntrusivePtr<TestObject> movePtr = std::move(testPtr);
+ DALI_TEST_EQUALS(movePtr->ReferenceCount(), 1, TEST_LOCATION);
+ DALI_TEST_EQUALS(movePtr->data, 201, TEST_LOCATION);
+ DALI_TEST_CHECK(!testPtr);
+
+ IntrusivePtr<TestObject> anotherTestPtr(new TestObject);
+ DALI_TEST_EQUALS(anotherTestPtr->ReferenceCount(), 1, TEST_LOCATION);
+ DALI_TEST_EQUALS(anotherTestPtr->data, 201, TEST_LOCATION);
+ IntrusivePtr<TestObject> anotherMovePtr = std::move(anotherTestPtr);
+ DALI_TEST_EQUALS(anotherMovePtr->ReferenceCount(), 1, TEST_LOCATION);
+ DALI_TEST_EQUALS(anotherMovePtr->data, 201, TEST_LOCATION);
+ DALI_TEST_CHECK(!anotherTestPtr.Get());
+
+ IntrusivePtr<CountedSubclass> countedSubclass(new CountedSubclass);
+ DALI_TEST_EQUALS(countedSubclass->ReferenceCount(), 1, TEST_LOCATION);
+
+ IntrusivePtr<Counted> countedMovePtr = std::move(countedSubclass);
+ DALI_TEST_EQUALS(countedMovePtr->ReferenceCount(), 1, TEST_LOCATION);
+ DALI_TEST_CHECK(!countedSubclass);
+
+ END_TEST;
+}
+
+int UtcDaliIntrusivePtrMoveAssignment(void)
+{
+ IntrusivePtr<TestObject> testPtr(new TestObject);
+ DALI_TEST_EQUALS(testPtr->ReferenceCount(), 1, TEST_LOCATION);
+ DALI_TEST_EQUALS(testPtr->data, 201, TEST_LOCATION);
+
+ IntrusivePtr<TestObject> secondPtr(testPtr);
+ DALI_TEST_EQUALS(testPtr->ReferenceCount(), 2, TEST_LOCATION);
+
+ IntrusivePtr<TestObject> thirdPtr;
+ testPtr = std::move(thirdPtr);
+ DALI_TEST_EQUALS(secondPtr->ReferenceCount(), 1, TEST_LOCATION);
+ DALI_TEST_EQUALS(secondPtr->data, 201, TEST_LOCATION);
+ DALI_TEST_CHECK(!testPtr.Get());
+
+ IntrusivePtr<TestObject> fourthPtr(new TestObject);
+ testPtr = std::move(fourthPtr);
+ DALI_TEST_CHECK(!fourthPtr.Get());
+
+ IntrusivePtr<CountedSubclass> countedSubclassPtr(new CountedSubclass);
+ DALI_TEST_EQUALS(countedSubclassPtr->ReferenceCount(), 1, TEST_LOCATION);
+
+ IntrusivePtr<Counted> countedMovePtr;
+ countedMovePtr = std::move(countedSubclassPtr);
+ DALI_TEST_EQUALS(countedMovePtr->ReferenceCount(), 1, TEST_LOCATION);
+ DALI_TEST_CHECK(!countedSubclassPtr);
+
+ END_TEST;
+}
+
+/** Equality with nullptr */
+int UtcDaliIntrusivePtrOperatorEqualWithNullptr(void)
+{
+ tet_infoline("Test for Dali::IntrusivePtr::operator == nullptr");
+
+ IntrusivePtr<Counted> counted1(new Counted);
+
+ // counted1 is not nullptr.
+ DALI_TEST_CHECK(!(counted1 == nullptr));
+ DALI_TEST_CHECK(!(nullptr == counted1));
+ DALI_TEST_CHECK(counted1 != nullptr);
+ DALI_TEST_CHECK(nullptr != counted1);
+
+ counted1 = nullptr;