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 |
||||
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 |
||||||
567 | 1 | 50 | weak = panda::weak |
||||
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 |
||||
50 | |||||||
50 | |||||||
50 | |||||||
50 | |||||||
0 | |||||||
0 | |||||||
603 | } | ||||||
604 | 118 | 50 | } | ||||
50 |