xref: /aoo4110/main/o3tl/qa/test-heap_ptr.cxx (revision b1cdbd2c)
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