xref: /aoo42x/main/o3tl/qa/test-heap_ptr.cxx (revision 18cf0442)
131682d32SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
331682d32SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
431682d32SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
531682d32SAndrew Rist  * distributed with this work for additional information
631682d32SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
731682d32SAndrew Rist  * to you under the Apache License, Version 2.0 (the
831682d32SAndrew Rist  * "License"); you may not use this file except in compliance
931682d32SAndrew Rist  * with the License.  You may obtain a copy of the License at
1031682d32SAndrew Rist  *
1131682d32SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1231682d32SAndrew Rist  *
1331682d32SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1431682d32SAndrew Rist  * software distributed under the License is distributed on an
1531682d32SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1631682d32SAndrew Rist  * KIND, either express or implied.  See the License for the
1731682d32SAndrew Rist  * specific language governing permissions and limitations
1831682d32SAndrew Rist  * under the License.
1931682d32SAndrew Rist  *
2031682d32SAndrew Rist  *************************************************************/
2131682d32SAndrew Rist 
2231682d32SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "preextstl.h"
25*18cf0442SDamjan Jovanovic #include "gtest/gtest.h"
26cdf0e10cSrcweir #include "postextstl.h"
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <o3tl/heap_ptr.hxx>
29cdf0e10cSrcweir 
30cdf0e10cSrcweir 
31cdf0e10cSrcweir 
32cdf0e10cSrcweir 
33cdf0e10cSrcweir using o3tl::heap_ptr;
34cdf0e10cSrcweir 
35cdf0e10cSrcweir 
36cdf0e10cSrcweir class Help
37cdf0e10cSrcweir {
38cdf0e10cSrcweir   public:
Help(int i_n)39cdf0e10cSrcweir     explicit            Help(
40cdf0e10cSrcweir                             int                 i_n )
41cdf0e10cSrcweir                                                 : n(i_n) { ++nInstanceCount_; }
~Help()42cdf0e10cSrcweir                         ~Help()                 { --nInstanceCount_; }
Value() const43cdf0e10cSrcweir     int                 Value() const           { return n; }
InstanceCount_()44cdf0e10cSrcweir     static int          InstanceCount_()        { return nInstanceCount_; }
45cdf0e10cSrcweir 
46cdf0e10cSrcweir   private:
47cdf0e10cSrcweir     int                 n;
48cdf0e10cSrcweir     static int          nInstanceCount_;
49cdf0e10cSrcweir };
50cdf0e10cSrcweir int Help::nInstanceCount_ = 0;
51cdf0e10cSrcweir 
52cdf0e10cSrcweir 
53*18cf0442SDamjan Jovanovic class heap_ptr_test : public ::testing::Test
54cdf0e10cSrcweir {
55cdf0e10cSrcweir   public:
56*18cf0442SDamjan Jovanovic }; // class heap_ptr_test
57*18cf0442SDamjan Jovanovic 
TEST_F(heap_ptr_test,global)58*18cf0442SDamjan Jovanovic TEST_F(heap_ptr_test, global)
59*18cf0442SDamjan Jovanovic {
60*18cf0442SDamjan Jovanovic     // Construction
61*18cf0442SDamjan Jovanovic     heap_ptr<Help>
62*18cf0442SDamjan Jovanovic         t_empty;
63*18cf0442SDamjan Jovanovic     const heap_ptr<Help>
64*18cf0442SDamjan Jovanovic         t0( new Help(7000) );
65*18cf0442SDamjan Jovanovic     heap_ptr<Help>
66*18cf0442SDamjan Jovanovic         t1( new Help(10) );
67*18cf0442SDamjan Jovanovic     heap_ptr<Help>
68*18cf0442SDamjan Jovanovic         t2( new Help(20) );
69*18cf0442SDamjan Jovanovic 
70*18cf0442SDamjan Jovanovic     int nHelpCount = 3;
71*18cf0442SDamjan Jovanovic 
72*18cf0442SDamjan Jovanovic     ASSERT_TRUE(! t_empty.is()) << "ctor1";
73*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t0.is()) << "ctor2";
74*18cf0442SDamjan Jovanovic     ASSERT_TRUE((*t0).Value() == 7000) << "ctor3";
75*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t0->Value() == 7000) << "ctor4";
76*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t0.get() == t0.operator->()) << "ctor5";
77*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t0.get() == &(*t0)) << "ctor6";
78*18cf0442SDamjan Jovanovic 
79*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t1.is()) << "ctor7";
80*18cf0442SDamjan Jovanovic     ASSERT_TRUE((*t1).Value() == 10) << "ctor8";
81*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t1->Value() == 10) << "ctor9";
82*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t1.get() == t1.operator->()) << "ctor10";
83*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t1.get() == &(*t1)) << "ctor11";
84*18cf0442SDamjan Jovanovic 
85*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t2.operator*().Value() == 20) << "ctor12";
86*18cf0442SDamjan Jovanovic     ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "ctor13";
87*18cf0442SDamjan Jovanovic 
88*18cf0442SDamjan Jovanovic 
89*18cf0442SDamjan Jovanovic     // Operator safe_bool() / bool()
90*18cf0442SDamjan Jovanovic     ASSERT_TRUE(! t_empty) << "bool1";
91*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t0) << "bool2";
92*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t1.is() == static_cast<bool>(t1)) << "bool3";
93*18cf0442SDamjan Jovanovic 
94*18cf0442SDamjan Jovanovic 
95*18cf0442SDamjan Jovanovic     // Assignment, reset() and release()
96*18cf0442SDamjan Jovanovic         // Release
97*18cf0442SDamjan Jovanovic     Help * hp = t1.release();
98*18cf0442SDamjan Jovanovic     ASSERT_TRUE(! t1.is()) << "release1";
99*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t1.get() == 0) << "release2";
100*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t1.operator->() == 0) << "release3";
101*18cf0442SDamjan Jovanovic     ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "release4";
102*18cf0442SDamjan Jovanovic 
103*18cf0442SDamjan Jovanovic         // operator=()
104*18cf0442SDamjan Jovanovic     t_empty = hp;
105*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t_empty.is()) << "assign1";
106*18cf0442SDamjan Jovanovic     ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "assign2";
107*18cf0442SDamjan Jovanovic 
108*18cf0442SDamjan Jovanovic     t1 = t_empty.release();
109*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t1.is()) << "assign3";
110*18cf0442SDamjan Jovanovic     ASSERT_TRUE(! t_empty.is()) << "assign4";
111*18cf0442SDamjan Jovanovic     ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "assign5";
112*18cf0442SDamjan Jovanovic 
113*18cf0442SDamjan Jovanovic         // reset()
114*18cf0442SDamjan Jovanovic     hp = new Help(30);
115*18cf0442SDamjan Jovanovic     ++nHelpCount;
116*18cf0442SDamjan Jovanovic 
117*18cf0442SDamjan Jovanovic     t_empty.reset(hp);
118*18cf0442SDamjan Jovanovic     ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "reset1";
119*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t_empty.is()) << "reset2";
120*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t_empty.get() == hp) << "reset3";
121*18cf0442SDamjan Jovanovic 
122*18cf0442SDamjan Jovanovic         // Ignore second assignment
123*18cf0442SDamjan Jovanovic     t_empty = hp;
124*18cf0442SDamjan Jovanovic     ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "selfassign1";
125*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t_empty.is()) << "selfassign2";
126*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t_empty.get() == hp) << "selfassign3";
127*18cf0442SDamjan Jovanovic 
128*18cf0442SDamjan Jovanovic     t_empty.reset(0);
129*18cf0442SDamjan Jovanovic     hp = 0;
130*18cf0442SDamjan Jovanovic     --nHelpCount;
131*18cf0442SDamjan Jovanovic     ASSERT_TRUE(! t_empty.is()) << "reset4";
132*18cf0442SDamjan Jovanovic     ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "reset5";
133*18cf0442SDamjan Jovanovic 
134*18cf0442SDamjan Jovanovic 
135*18cf0442SDamjan Jovanovic     // swap
136*18cf0442SDamjan Jovanovic     t1.swap(t2);
137*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t1->Value() == 20) << "swap1";
138*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t2->Value() == 10) << "swap2";
139*18cf0442SDamjan Jovanovic     ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "swap3";
140*18cf0442SDamjan Jovanovic 
141*18cf0442SDamjan Jovanovic     o3tl::swap(t1,t2);
142*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t1->Value() == 10) << "swap4";
143*18cf0442SDamjan Jovanovic     ASSERT_TRUE(t2->Value() == 20) << "swap5";
144*18cf0442SDamjan Jovanovic     ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "swap6";
145*18cf0442SDamjan Jovanovic 
146*18cf0442SDamjan Jovanovic     // RAII
147cdf0e10cSrcweir     {
148cdf0e10cSrcweir         heap_ptr<Help>
149*18cf0442SDamjan Jovanovic             t_raii( new Help(55) );
150*18cf0442SDamjan Jovanovic         ASSERT_TRUE(Help::InstanceCount_() == nHelpCount + 1) << "raii1";
151cdf0e10cSrcweir     }
152*18cf0442SDamjan Jovanovic     ASSERT_TRUE(Help::InstanceCount_() == nHelpCount) << "raii2";
153*18cf0442SDamjan Jovanovic }
154cdf0e10cSrcweir 
155cdf0e10cSrcweir 
156