1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #include "preextstl.h" 25*b1cdbd2cSJim Jagielski #include "cppunit/TestAssert.h" 26*b1cdbd2cSJim Jagielski #include "cppunit/TestFixture.h" 27*b1cdbd2cSJim Jagielski #include "cppunit/extensions/HelperMacros.h" 28*b1cdbd2cSJim Jagielski #include "postextstl.h" 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski #include <o3tl/heap_ptr.hxx> 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski using o3tl::heap_ptr; 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski 38*b1cdbd2cSJim Jagielski class Help 39*b1cdbd2cSJim Jagielski { 40*b1cdbd2cSJim Jagielski public: Help(int i_n)41*b1cdbd2cSJim Jagielski explicit Help( 42*b1cdbd2cSJim Jagielski int i_n ) 43*b1cdbd2cSJim Jagielski : n(i_n) { ++nInstanceCount_; } ~Help()44*b1cdbd2cSJim Jagielski ~Help() { --nInstanceCount_; } Value() const45*b1cdbd2cSJim Jagielski int Value() const { return n; } InstanceCount_()46*b1cdbd2cSJim Jagielski static int InstanceCount_() { return nInstanceCount_; } 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski private: 49*b1cdbd2cSJim Jagielski int n; 50*b1cdbd2cSJim Jagielski static int nInstanceCount_; 51*b1cdbd2cSJim Jagielski }; 52*b1cdbd2cSJim Jagielski int Help::nInstanceCount_ = 0; 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski class heap_ptr_test : public CppUnit::TestFixture 56*b1cdbd2cSJim Jagielski { 57*b1cdbd2cSJim Jagielski public: global()58*b1cdbd2cSJim Jagielski void global() 59*b1cdbd2cSJim Jagielski { 60*b1cdbd2cSJim Jagielski // Construction 61*b1cdbd2cSJim Jagielski heap_ptr<Help> 62*b1cdbd2cSJim Jagielski t_empty; 63*b1cdbd2cSJim Jagielski const heap_ptr<Help> 64*b1cdbd2cSJim Jagielski t0( new Help(7000) ); 65*b1cdbd2cSJim Jagielski heap_ptr<Help> 66*b1cdbd2cSJim Jagielski t1( new Help(10) ); 67*b1cdbd2cSJim Jagielski heap_ptr<Help> 68*b1cdbd2cSJim Jagielski t2( new Help(20) ); 69*b1cdbd2cSJim Jagielski 70*b1cdbd2cSJim Jagielski int nHelpCount = 3; 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor1", ! t_empty.is()); 73*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor2", t0.is()); 74*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor3", (*t0).Value() == 7000 ); 75*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor4", t0->Value() == 7000 ); 76*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor5", t0.get() == t0.operator->() ); 77*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor6", t0.get() == &(*t0) ); 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor7", t1.is()); 80*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor8", (*t1).Value() == 10 ); 81*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor9", t1->Value() == 10 ); 82*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor10", t1.get() == t1.operator->() ); 83*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor11", t1.get() == &(*t1) ); 84*b1cdbd2cSJim Jagielski 85*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor12", t2.operator*().Value() == 20); 86*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("ctor13", Help::InstanceCount_() == nHelpCount); 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski 89*b1cdbd2cSJim Jagielski // Operator safe_bool() / bool() 90*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("bool1", ! t_empty); 91*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("bool2", t0); 92*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("bool3", t1.is() == static_cast<bool>(t1)); 93*b1cdbd2cSJim Jagielski 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski // Assignment, reset() and release() 96*b1cdbd2cSJim Jagielski // Release 97*b1cdbd2cSJim Jagielski Help * hp = t1.release(); 98*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("release1", ! t1.is() ); 99*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("release2", t1.get() == 0 ); 100*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("release3", t1.operator->() == 0 ); 101*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("release4", Help::InstanceCount_() == nHelpCount); 102*b1cdbd2cSJim Jagielski 103*b1cdbd2cSJim Jagielski // operator=() 104*b1cdbd2cSJim Jagielski t_empty = hp; 105*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("assign1", t_empty.is() ); 106*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("assign2", Help::InstanceCount_() == nHelpCount); 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski t1 = t_empty.release(); 109*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("assign3", t1.is() ); 110*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("assign4", ! t_empty.is() ); 111*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("assign5", Help::InstanceCount_() == nHelpCount); 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski // reset() 114*b1cdbd2cSJim Jagielski hp = new Help(30); 115*b1cdbd2cSJim Jagielski ++nHelpCount; 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski t_empty.reset(hp); 118*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("reset1", Help::InstanceCount_() == nHelpCount); 119*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("reset2", t_empty.is() ); 120*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("reset3", t_empty.get() == hp ); 121*b1cdbd2cSJim Jagielski 122*b1cdbd2cSJim Jagielski // Ignore second assignment 123*b1cdbd2cSJim Jagielski t_empty = hp; 124*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("selfassign1", Help::InstanceCount_() == nHelpCount); 125*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("selfassign2", t_empty.is() ); 126*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("selfassign3", t_empty.get() == hp ); 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski t_empty.reset(0); 129*b1cdbd2cSJim Jagielski hp = 0; 130*b1cdbd2cSJim Jagielski --nHelpCount; 131*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("reset4", ! t_empty.is() ); 132*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("reset5", Help::InstanceCount_() == nHelpCount); 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski // swap 136*b1cdbd2cSJim Jagielski t1.swap(t2); 137*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("swap1", t1->Value() == 20 ); 138*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("swap2", t2->Value() == 10 ); 139*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("swap3", Help::InstanceCount_() == nHelpCount); 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski o3tl::swap(t1,t2); 142*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("swap4", t1->Value() == 10 ); 143*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("swap5", t2->Value() == 20 ); 144*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("swap6", Help::InstanceCount_() == nHelpCount); 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski // RAII 147*b1cdbd2cSJim Jagielski { 148*b1cdbd2cSJim Jagielski heap_ptr<Help> 149*b1cdbd2cSJim Jagielski t_raii( new Help(55) ); 150*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("raii1", Help::InstanceCount_() == nHelpCount + 1); 151*b1cdbd2cSJim Jagielski } 152*b1cdbd2cSJim Jagielski CPPUNIT_ASSERT_MESSAGE("raii2", Help::InstanceCount_() == nHelpCount); 153*b1cdbd2cSJim Jagielski } 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski // These macros are needed by auto register mechanism. 157*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE(heap_ptr_test); 158*b1cdbd2cSJim Jagielski CPPUNIT_TEST(global); 159*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_END(); 160*b1cdbd2cSJim Jagielski }; // class heap_ptr_test 161*b1cdbd2cSJim Jagielski 162*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------- 163*b1cdbd2cSJim Jagielski CPPUNIT_TEST_SUITE_REGISTRATION(heap_ptr_test); 164