File Coverage

t/iptr.cc
Criterion Covered Total %
statement 440 440 100.0
branch 1566 3848 40.7
condition n/a
subroutine n/a
pod n/a
total 2006 4288 46.7


line stmt bran cond sub pod time code
1             #include "test.h"
2             #include
3              
4             using panda::iptr;
5             using panda::weak_iptr;
6             using test::Tracer;
7             using panda::Refcnt;
8             using panda::Refcntd;
9              
10             static int on_delete_calls = 0;
11              
12 187 50         struct Test : Tracer, Refcnt {
    50          
13 48 50         using Tracer::Tracer;
14             };
15              
16 82 50         struct TestChild : Test {
17 38           using Test::Test;
18             };
19              
20 5 50         struct TestDel : Tracer, Refcntd {
    50          
21             using Tracer::Tracer;
22              
23 1           void on_delete () noexcept override { on_delete_calls++; }
24             };
25              
26 4 50         struct TestRes : Tracer, Refcntd {
27             using Tracer::Tracer;
28             bool resurected;
29              
30 1 50         TestRes () : resurected() {}
31              
32 2           void on_delete () noexcept override {
33 2           on_delete_calls++;
34 2 100         if (resurected) return;
35 1           retain();
36 1           resurected = true;
37             }
38             };
39              
40             using TestSP = iptr;
41             using TestChildSP = iptr;
42             using TestDelSP = iptr;
43             using TestResSP = iptr;
44             using TestWP = weak_iptr;
45             using TestChildWP = weak_iptr;
46              
47             struct A : Refcnt {};
48             struct AA : A {};
49             struct B : Refcnt {};
50              
51 2           static int foo (iptr) {
52 2           return 10;
53             }
54              
55 1           static int foo (iptr) {
56 1           return 20;
57             }
58              
59 64           TEST_CASE("iptr", "[iptr]") {
60 46           Tracer::reset();
61 46           on_delete_calls = 0;
62              
63 52 50         SECTION("ctor") {
    50          
    50          
    50          
    100          
64 7 50         SECTION("empty") {
    50          
    50          
    50          
    100          
65             {
66 2           auto p = TestSP();
67 1 50         REQUIRE(!p);
    50          
    50          
    50          
    0          
    0          
68 1 50         REQUIRE(Tracer::ctor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
69             }
70 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
71             }
72              
73 7 50         SECTION("from object") {
    50          
    50          
    50          
    100          
74             {
75 2 50         auto p = TestSP(new Test());
    50          
76 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
77 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
78 1 50         REQUIRE(p->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
79             }
80 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
81             }
82              
83 7 50         SECTION("from iptr") {
    50          
    50          
    50          
    100          
84             {
85 2 50         auto src = TestSP(new Test());
    50          
86 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
87 2           auto p(src);
88 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
89 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
90 1 50         REQUIRE(p->refcnt() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
91             }
92 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
93             }
94              
95 7 50         SECTION("from foreign iptr") {
    50          
    50          
    50          
    100          
96             {
97 2 50         auto src = TestChildSP(new TestChild());
    50          
98 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
99 2           TestSP p(src);
100 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
101 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
102 1 50         REQUIRE(p->refcnt() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
103             }
104 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
105             }
106              
107 7 50         SECTION("move from iptr") {
    50          
    50          
    50          
    100          
108             {
109 2 50         auto src = TestSP(new Test(123));
    50          
110 2           auto p = TestSP(std::move(src));
111 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
112 1 50         REQUIRE(!src);
    50          
    50          
    50          
    0          
    0          
113 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
114 1 50         REQUIRE(p->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
115 1 50         REQUIRE(p->value == 123);
    50          
    50          
    50          
    50          
    0          
    0          
116             }
117 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
118             }
119              
120 7 50         SECTION("move from foreign iptr") {
    50          
    50          
    50          
    100          
121             {
122 2 50         auto src = TestChildSP(new TestChild(321));
    50          
123 2           auto p = TestSP(std::move(src));
124 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
125 1 50         REQUIRE(!src);
    50          
    50          
    50          
    0          
    0          
126 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
127 1 50         REQUIRE(p->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
128 1 50         REQUIRE(p->value == 321);
    50          
    50          
    50          
    50          
    0          
    0          
129             }
130 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
131             }
132             }
133              
134 49 50         SECTION("reset") {
    50          
    50          
    50          
    100          
135 4 50         SECTION("no args") {
    50          
    50          
    50          
    100          
136 2 50         auto p = TestSP(new Test());
    50          
137 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
138 1           p.reset();
139 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
140 1 50         REQUIRE(!p);
    50          
    50          
    50          
    0          
    0          
141             }
142              
143 4 50         SECTION("with same object") {
    50          
    50          
    50          
    100          
144 2 50         auto p = TestSP(new Test(1));
    50          
145 1 50         auto o = new Test(2);
    50          
146 1 50         p.reset(o);
147 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
148 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
149 1 50         REQUIRE(p->value == 2);
    50          
    50          
    50          
    50          
    0          
    0          
150 1           p.reset();
151 1 50         REQUIRE(Tracer::dtor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
152 1 50         REQUIRE(!p);
    50          
    50          
    50          
    0          
    0          
153             }
154              
155 4 50         SECTION("foreign object") {
    50          
    50          
    50          
    100          
156 2 50         auto p = TestSP(new Test(10));
    50          
157 1 50         auto o = new TestChild(20);
    50          
158 1 50         p.reset(o);
159 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
160 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
161 1 50         REQUIRE(p->value == 20);
    50          
    50          
    50          
    50          
    0          
    0          
162 1           p.reset();
163 1 50         REQUIRE(Tracer::dtor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
164 1 50         REQUIRE(!p);
    50          
    50          
    50          
    0          
    0          
165             }
166             }
167              
168 60 50         SECTION("assign") {
    50          
    50          
    50          
    100          
169 16 50         SECTION("NULL") {
    50          
    50          
    50          
    100          
170 3 50         SECTION("from empty") {
    50          
    50          
    50          
    100          
171 2           TestSP p;
172 1           p = NULL;
173 1 50         REQUIRE(Tracer::ctor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
174 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
175 1 50         REQUIRE(!p);
    50          
    50          
    50          
    0          
    0          
176 1           p.reset();
177 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
178             }
179 3 50         SECTION("from object") {
    50          
    50          
    50          
    100          
180 2 50         auto p = TestSP(new Test());
    50          
181 1           p = NULL;
182 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
183 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
184 1 50         REQUIRE(!p);
    50          
    50          
    50          
    0          
    0          
185 1           p.reset();
186 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
187             }
188             }
189              
190 16 50         SECTION("same object") {
    50          
    50          
    50          
    100          
191 3 50         SECTION("from empty") {
    50          
    50          
    50          
    100          
192 2           TestSP p;
193 1 50         p = new Test(2);
    50          
194 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
195 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
196 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
197 1 50         REQUIRE(p->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
198 1 50         REQUIRE(p->value == 2);
    50          
    50          
    50          
    50          
    0          
    0          
199 1           p.reset();
200 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
201             }
202 3 50         SECTION("from object") {
    50          
    50          
    50          
    100          
203 2 50         auto p = TestSP(new Test(1));
    50          
204 1 50         p = new Test(2);
    50          
205 1 50         REQUIRE(Tracer::ctor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
206 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
207 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
208 1 50         REQUIRE(p->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
209 1 50         REQUIRE(p->value == 2);
    50          
    50          
    50          
    50          
    0          
    0          
210 1           p.reset();
211 1 50         REQUIRE(Tracer::dtor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
212             }
213             }
214              
215 16 50         SECTION("foreign object") {
    50          
    50          
    50          
    100          
216 3 50         SECTION("from empty") {
    50          
    50          
    50          
    100          
217 2           TestSP p;
218 1 50         p = new TestChild(2);
    50          
219 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
220 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
221 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
222 1 50         REQUIRE(p->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
223 1 50         REQUIRE(p->value == 2);
    50          
    50          
    50          
    50          
    0          
    0          
224 1           p.reset();
225 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
226             }
227 3 50         SECTION("from object") {
    50          
    50          
    50          
    100          
228 2 50         auto p = TestSP(new Test(1));
    50          
229 1 50         p = new TestChild(2);
    50          
230 1 50         REQUIRE(Tracer::ctor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
231 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
232 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
233 1 50         REQUIRE(p->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
234 1 50         REQUIRE(p->value == 2);
    50          
    50          
    50          
    50          
    0          
    0          
235 1           p.reset();
236 1 50         REQUIRE(Tracer::dtor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
237             }
238             }
239              
240 16 50         SECTION("same iptr") {
    50          
    50          
    50          
    100          
241 3 50         SECTION("from empty") {
    50          
    50          
    50          
    100          
242 2           TestSP p;
243 2 50         auto p2 = TestSP(new Test(2));
    50          
244 1           p = p2;
245 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
246 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
247 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
248 1 50         REQUIRE(p2->refcnt() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
249 1           p.reset();
250 1 50         REQUIRE(p2->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
251 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
252 1           p2.reset();
253 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
254             }
255 3 50         SECTION("from object") {
    50          
    50          
    50          
    100          
256 2 50         auto p = TestSP(new Test(1));
    50          
257 2 50         auto p2 = TestSP(new Test(2));
    50          
258 1           p = p2;
259 1 50         REQUIRE(Tracer::ctor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
260 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
261 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
262 1 50         REQUIRE(p2->refcnt() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
263 1           p.reset();
264 1 50         REQUIRE(p2->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
265 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
266 1           p2.reset();
267 1 50         REQUIRE(Tracer::dtor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
268             }
269             }
270              
271 16 50         SECTION("foreign iptr") {
    50          
    50          
    50          
    100          
272 3 50         SECTION("from empty") {
    50          
    50          
    50          
    100          
273 2           TestSP p;
274 2 50         auto p2 = TestChildSP(new TestChild(2));
    50          
275 1           p = p2;
276 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
277 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
278 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
279 1 50         REQUIRE(p2->refcnt() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
280 1           p.reset();
281 1 50         REQUIRE(p2->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
282 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
283 1           p2.reset();
284 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
285             }
286 3 50         SECTION("from object") {
    50          
    50          
    50          
    100          
287 2 50         auto p = TestSP(new Test(1));
    50          
288 2 50         auto p2 = TestChildSP(new TestChild(2));
    50          
289 1           p = p2;
290 1 50         REQUIRE(Tracer::ctor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
291 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
292 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
293 1 50         REQUIRE(p2->refcnt() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
294 1           p.reset();
295 1 50         REQUIRE(p2->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
296 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
297 1           p2.reset();
298 1 50         REQUIRE(Tracer::dtor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
299             }
300             }
301              
302 16 50         SECTION("move same iptr") {
    50          
    50          
    50          
    100          
303 3 50         SECTION("from empty") {
    50          
    50          
    50          
    100          
304 2           TestSP p;
305 2 50         auto p2 = TestSP(new Test(2));
    50          
306 1           p = std::move(p2);
307 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
308 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
309 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
310 1 50         REQUIRE(p->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
311 1 50         REQUIRE(p->value == 2);
    50          
    50          
    50          
    50          
    0          
    0          
312 1 50         REQUIRE(!p2);
    50          
    50          
    50          
    0          
    0          
313 1           p.reset();
314 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
315 1           p2.reset();
316 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
317             }
318 3 50         SECTION("from object") {
    50          
    50          
    50          
    100          
319 2 50         auto p = TestSP(new Test(1));
    50          
320 2 50         auto p2 = TestSP(new Test(2));
    50          
321 1           p = std::move(p2);
322 1 50         REQUIRE(Tracer::ctor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
323 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
324 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
325 1 50         REQUIRE(p->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
326 1 50         REQUIRE(p->value == 2);
    50          
    50          
    50          
    50          
    0          
    0          
327 1 50         REQUIRE(p2);
    50          
    50          
    50          
    0          
    0          
328 1 50         REQUIRE(p2->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
329 1 50         REQUIRE(p2->value == 1);
    50          
    50          
    50          
    50          
    0          
    0          
330 1           p.reset();
331 1 50         REQUIRE(!p);
    50          
    50          
    50          
    0          
    0          
332 1 50         REQUIRE(p2);
    50          
    50          
    50          
    0          
    0          
333 1 50         REQUIRE(p2->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
334 1 50         REQUIRE(p2->value == 1);
    50          
    50          
    50          
    50          
    0          
    0          
335 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
336 1           p2.reset();
337 1 50         REQUIRE(Tracer::dtor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
338             }
339             }
340              
341 16 50         SECTION("move foreign iptr") {
    50          
    50          
    50          
    100          
342 3 50         SECTION("from empty") {
    50          
    50          
    50          
    100          
343 2           TestSP p;
344 2 50         auto p2 = TestChildSP(new TestChild(2));
    50          
345 1           p = std::move(p2);
346 1 50         REQUIRE(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
347 1 50         REQUIRE(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
348 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
349 1 50         REQUIRE(p->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
350 1 50         REQUIRE(p->value == 2);
    50          
    50          
    50          
    50          
    0          
    0          
351 1 50         REQUIRE(!p2);
    50          
    50          
    50          
    0          
    0          
352 1           p.reset();
353 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
354 1           p2.reset();
355 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
356             }
357 3 50         SECTION("from object") {
    50          
    50          
    50          
    100          
358 2 50         auto p = TestSP(new Test(1));
    50          
359 2 50         auto p2 = TestChildSP(new TestChild(2));
    50          
360 1           p = std::move(p2);
361 1 50         REQUIRE(Tracer::ctor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
362 1 50         REQUIRE(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
363 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
364 1 50         REQUIRE(p->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
365 1 50         REQUIRE(p->value == 2);
    50          
    50          
    50          
    50          
    0          
    0          
366 1 50         REQUIRE(!p2);
    50          
    50          
    50          
    0          
    0          
367 1           p.reset();
368 1 50         REQUIRE(!p);
    50          
    50          
    50          
    0          
    0          
369 1 50         REQUIRE(Tracer::dtor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
370 1           p2.reset();
371 1 50         REQUIRE(Tracer::dtor_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
372             }
373             }
374             }
375              
376 47 50         SECTION("dereference") {
    50          
    50          
    50          
    100          
377 1 50         auto obj = new Test(123);
    50          
378 2           auto p = TestSP(obj);
379 1 50         REQUIRE(p->value == 123);
    50          
    50          
    50          
    50          
    0          
    0          
380 1 50         REQUIRE((*p).value == 123);
    50          
    50          
    50          
    50          
    0          
    0          
381 1 50         REQUIRE(p.get()->value == 123);
    50          
    50          
    50          
    50          
    0          
    0          
382 1 50         REQUIRE(p.get() == obj);
    50          
    50          
    50          
    50          
    0          
    0          
383 1 50         REQUIRE(((Test*)p)->value == 123);
    50          
    50          
    50          
    50          
    0          
    0          
384 1 50         REQUIRE((Test*)p == obj);
    50          
    50          
    50          
    50          
    0          
    0          
385 1 50         REQUIRE(p);
    50          
    50          
    50          
    0          
    0          
386 1 50         REQUIRE((bool)p == true);
    50          
    50          
    50          
    50          
    0          
    0          
387             }
388              
389 47 50         SECTION("ops") {
    50          
    50          
    50          
    100          
390 1 50         auto ptr = new Test(123);
    50          
391 2           auto sp1 = TestSP(ptr);
392 2           auto sp2 = TestSP(ptr);
393 1 50         CHECK(sp1 == sp2);
    50          
    50          
    50          
    50          
    0          
    0          
394 1 50         CHECK(sp1 == ptr);
    50          
    50          
    50          
    50          
    0          
    0          
395             }
396              
397 64 50         SECTION("weak") {
    50          
    50          
    50          
    100          
398 26 50         SECTION("ctor") {
    50          
    50          
    50          
    100          
399 9 50         SECTION("empty") {
    50          
    50          
    50          
    100          
400 2 50         TestWP empty;
401 1 50         CHECK_FALSE(empty);
    50          
    50          
    50          
    50          
    0          
    0          
402             }
403 10 50         SECTION("from iptr") {
    50          
    50          
    50          
    100          
404 3 50         SECTION("base") {
    50          
    50          
    50          
    100          
405 2 50         TestSP obj = new Test(123);
    50          
406 1 50         CHECK(obj->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
407 2 50         TestWP weak = obj;
408 1 50         CHECK(obj->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
409             }
410 3 50         SECTION("derived") {
    50          
    50          
    50          
    100          
411 2 50         TestChildSP obj = new TestChild(123);
    50          
412 2 50         TestWP weak = obj;
413 1 50         CHECK(obj->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
414             }
415             }
416 10 50         SECTION("from bad") {
    50          
    50          
    50          
    100          
417 3 50         SECTION("bad iptr") {
    50          
    50          
    50          
    100          
418 2           TestSP nothing;
419 2 50         TestWP weak(nothing);
420 1 50         CHECK_FALSE(weak);
    50          
    50          
    50          
    50          
    0          
    0          
421             }
422              
423 3 50         SECTION("bad weak_iptr") {
    50          
    50          
    50          
    100          
424 2 50         TestWP nothing;
425 2 50         TestWP weak(nothing);
426 1 50         CHECK_FALSE(weak);
    50          
    50          
    50          
    50          
    0          
    0          
427             }
428             }
429              
430 11 50         SECTION("from weak") {
    50          
    50          
    50          
    100          
431 6 50         TestSP base = new Test(123);
    50          
432 6 50         TestChildSP der = new TestChild(123);
    50          
433 6 50         TestWP wbase = base;
434 6 50         TestChildWP wder = der;
435              
436 4 50         SECTION("base") {
    50          
    50          
    50          
    100          
437 2 50         TestWP weak = wbase;
438 1 50         CHECK(weak.lock() == base);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
439 1 50         CHECK(base->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
440             }
441 4 50         SECTION("derived") {
    50          
    50          
    50          
    100          
442 2           TestWP weak = wder;
443 1 50         CHECK(weak.lock() == der);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
444 1 50         CHECK(der->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
445             }
446              
447 4 50         SECTION("move") {
    50          
    50          
    50          
    100          
448 2 50         TestWP moved(std::move(wbase));
449 1 50         CHECK(moved.weak_count() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
450 1 50         CHECK(moved.use_count() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
451             }
452             }
453             }
454              
455 24 50         SECTION("assign") {
    50          
    50          
    50          
    100          
456 12 50         TestWP empty;
457 12 50         TestSP base = new Test(123);
    50          
458 12 50         TestChildSP der = new TestChild(123);
    50          
459 12 50         TestWP wbase = base;
460 12 50         TestChildWP wder = der;
461              
462 12 50         TestWP wbase2;
463 12 50         TestChildWP wder2;
464              
465 7 50         SECTION("empty") {
    50          
    50          
    50          
    100          
466 2 50         TestWP e2;
467 1 50         e2 = empty;
468 1 50         CHECK_FALSE(e2);
    50          
    50          
    50          
    50          
    0          
    0          
469             }
470              
471 7 50         SECTION("base") {
    50          
    50          
    50          
    100          
472 1 50         wbase2 = base;
473 1 50         CHECK(wbase2.lock() == base);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
474 1 50         CHECK(wbase2.weak_count() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
475 1 50         wbase2 = der;
476 1 50         CHECK(wbase2.lock() == der);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
477 1 50         CHECK(wbase2.weak_count() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
478 1 50         wbase2 = wbase;
479 1 50         CHECK(wbase2.lock() == base);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
480 1 50         CHECK(wbase2.weak_count() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
481 1 50         wbase2 = wder;
482 1 50         CHECK(wbase2.lock() == der);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
483 1 50         CHECK(wbase2.weak_count() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
484             }
485 7 50         SECTION("derived") {
    50          
    50          
    50          
    100          
486 1 50         wder2 = der;
487 1 50         CHECK(wder2.lock() == der);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
488 1 50         wder2 = wder;
489 1 50         CHECK(wder2.lock() == der);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
490 1 50         CHECK(der->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
491             }
492              
493 7 50         SECTION("move") {
    50          
    50          
    50          
    100          
494 1 50         wbase2 = std::move(wbase);
495 1 50         CHECK(wbase2.lock() == base);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
496 1 50         CHECK(wbase2.weak_count() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
497 1           wbase2 = std::move(wder);
498 1 50         CHECK(wbase2.lock() == der);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
499 1 50         CHECK(wbase2.weak_count() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
500             }
501              
502 8 50         SECTION("from bad") {
    50          
    50          
    50          
    100          
503 3 50         SECTION("bad iptr") {
    50          
    50          
    50          
    100          
504 2           TestSP nothing;
505 1 50         wbase2 = nothing;
506             }
507              
508 3 50         SECTION("bad weak_iptr") {
    50          
    50          
    50          
    100          
509 2 50         TestWP nothing;
510 1 50         wbase2 = nothing;
511             }
512 2 50         CHECK_FALSE(wbase2);
    50          
    50          
    50          
    50          
    0          
    0          
513 2 50         CHECK_FALSE(wbase2.lock());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
514             }
515             }
516              
517 20 50         SECTION("lock") {
    50          
    50          
    50          
    100          
518 4           TestSP obj;
519 4 50         TestWP weak;
520 2 50         CHECK_FALSE(weak.lock());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
521              
522 3 50         SECTION("base") {
    50          
    50          
    50          
    100          
523 1 50         obj = new Test(123);
    50          
524             }
525 3 50         SECTION("derived") {
    50          
    50          
    50          
    100          
526 1 50         obj = new TestChild(123);
    50          
527             }
528 2 50         weak = obj;
529              
530 4 50         if (TestSP tmp = weak.lock()) {
    50          
531 2 50         CHECK(obj->refcnt() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
532 2 50         CHECK(obj == tmp);
    50          
    50          
    50          
    50          
    0          
    0          
533             }
534 2 50         CHECK(obj->refcnt() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
535 2           obj.reset();
536 2 50         CHECK(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
537 2 50         CHECK(weak.expired());
    50          
    50          
    50          
    0          
    0          
538 2 50         CHECK_FALSE(weak.lock());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
539             }
540              
541 19 50         SECTION("use_count") {
    50          
    50          
    50          
    100          
542 2 50         TestWP weak;
543 1 50         CHECK(weak.use_count() == 0);
    50          
    50          
    50          
    50          
    0          
    0          
544 1 50         CHECK(weak.weak_count() == 0);
    50          
    50          
    50          
    50          
    0          
    0          
545              
546 2 50         TestSP obj = new Test;
    50          
547 1 50         weak = obj;
548 1 50         CHECK(weak.use_count() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
549 1 50         CHECK(weak.weak_count() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
550              
551 2 50         TestWP w2 = weak;
552 1 50         CHECK(weak.use_count() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
553 1 50         CHECK(weak.weak_count() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
554              
555 1           obj.reset();
556 1 50         CHECK(weak.use_count() == 0);
    50          
    50          
    50          
    50          
    0          
    0          
557 1 50         CHECK(weak.weak_count() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
558             }
559              
560 19 50         SECTION("weak generalization") {
    50          
    50          
    50          
    100          
561 2 50         TestSP obj = new Test;
    50          
562 2 50         panda::weak weak = obj;
563 1 50         CHECK(weak.use_count() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
564 1 50         CHECK(weak.weak_count() == 1);
    50          
    50          
    50          
    50          
    0          
    0          
565              
566             // check that weak> is interchangeable with weak_iptr
567 1 50         weak = panda::weak(TestWP());
    50          
568 1 50         CHECK(weak.weak_count() == 0);
    50          
    50          
    50          
    50          
    0          
    0          
569              
570 1 50         weak = TestWP();
    50          
571 1 50         CHECK(weak.weak_count() == 0);
    50          
    50          
    50          
    50          
    0          
    0          
572             }
573              
574 18 50         CHECK(Tracer::dtor_calls == Tracer::ctor_total());
    50          
    50          
    50          
    50          
    0          
    0          
575             }
576              
577 48 50         SECTION("Refcntd") {
    50          
    50          
    50          
    100          
578 3 50         SECTION("on_delete") {
    50          
    50          
    50          
    100          
579 2 50         TestDelSP obj = new TestDel();
    50          
580 1           obj.reset();
581 1 50         CHECK(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
582 1 50         CHECK(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
583 1 50         CHECK(on_delete_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
584             }
585 3 50         SECTION("resurect") {
    50          
    50          
    50          
    100          
586 1 50         auto ptr = new TestRes();
    50          
587 2           TestResSP obj = ptr;
588 1           obj.reset();
589 1 50         CHECK(Tracer::ctor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
590 1 50         CHECK(Tracer::dtor_calls == 0);
    50          
    50          
    50          
    50          
    0          
    0          
591 1 50         CHECK(on_delete_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
592              
593 1           ptr->release();
594 1 50         CHECK(Tracer::dtor_calls == 1);
    50          
    50          
    50          
    50          
    0          
    0          
595 1 50         CHECK(on_delete_calls == 2);
    50          
    50          
    50          
    50          
    0          
    0          
596             }
597             }
598              
599 47 50         SECTION("compiles") {
    50          
    50          
    50          
    100          
600 1 50         REQUIRE(foo(iptr(nullptr)) == 10);
    50          
    50          
    50          
    50          
    0          
    0          
601 1 50         REQUIRE(foo(iptr(nullptr)) == 20);
    50          
    50          
    50          
    50          
    0          
    0          
602 1 50         REQUIRE(foo(iptr(nullptr)) == 10);
    50          
    50          
    50          
    50          
    0          
    0          
603             }
604 118 50         }
    50