File Coverage

t/svapi/stash.cc
Criterion Covered Total %
statement 447 447 100.0
branch 1907 4254 44.8
condition n/a
subroutine n/a
pod n/a
total 2354 4701 50.0


line stmt bran cond sub pod time code
1             #include "test.h"
2              
3             using Test = TestSv;
4             using panda::string_view;
5              
6 181           TEST_CASE("Stash", "[Sv]") {
7 294 50         perlvars vars;
8 294 50         Stash my(vars.stash);
9 294 50         Hash h_valid(vars.stash), h_invalid(vars.hv);
    50          
10 294           Sv oth_valid(vars.stash), oth_invalid(vars.hv);
11 147 50         my.erase("test");
12              
13 187 50         SECTION("ctor") {
    50          
    50          
    50          
    100          
14 41 50         SECTION("empty") {
    50          
    50          
    50          
    100          
15 2           Stash o;
16 1 50         REQUIRE(!o);
    50          
    50          
    50          
    0          
    0          
17             }
18 62 50         SECTION("SV") {
    50          
    50          
    50          
    100          
19 22 50         SECTION("undef SV") { Test::ctor(vars.undef, behaviour_t::EMPTY); }
    50          
    50          
    50          
    100          
    50          
20 22 50         SECTION("number SV") { Test::ctor(vars.iv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
21 22 50         SECTION("string SV") { Test::ctor(vars.pv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
22 22 50         SECTION("RV") { Test::ctor(vars.rv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
23 22 50         SECTION("AV") { Test::ctor((SV*)vars.av, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
24 22 50         SECTION("HV") { Test::ctor((SV*)vars.hv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
25 22 50         SECTION("OHV") { Test::ctor((SV*)vars.ohv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
26 22 50         SECTION("SHV") { Test::ctor((SV*)vars.stash, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
27 22 50         SECTION("CV") { Test::ctor((SV*)vars.cv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
28 22 50         SECTION("GV") { Test::ctor((SV*)vars.gv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
29 22 50         SECTION("IO") { Test::ctor((SV*)vars.io, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
30             }
31 40 50         SECTION("HV") { Test::ctor(vars.hv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
32 40 50         SECTION("OHV") { Test::ctor(vars.ohv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
33 40 50         SECTION("SHV") { Test::ctor(vars.stash, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
34 41 50         SECTION("string") {
    50          
    50          
    50          
    100          
35 2 50         Stash o("MyTest");
36 1 50         REQUIRE(o);
    50          
    50          
    50          
    0          
    0          
37 1 50         REQUIRE(o == gv_stashpvs("MyTest", 0));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
38             }
39              
40 40 50         SECTION("Stash") { Test::ctor(my, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
41 40 50         SECTION("valid Hash") { Test::ctor(h_valid, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
42 40 50         SECTION("invalid Hash") { Test::ctor(h_invalid, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
43 40 50         SECTION("valid Sv") { Test::ctor(oth_valid, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
44 40 50         SECTION("invalid Sv") { Test::ctor(oth_invalid, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
45             }
46              
47 195 50         SECTION("operator=") {
    50          
    50          
    50          
    100          
48 96 50         Stash o(gv_stashpvs("MyTest::__Dummy", GV_ADD));
    50          
49 70 50         SECTION("SV") {
    50          
    50          
    50          
    100          
50 22 50         SECTION("undef SV") { Test::assign(o, vars.undef, behaviour_t::EMPTY); }
    50          
    50          
    50          
    100          
    50          
51 22 50         SECTION("number SV") { Test::assign(o, vars.iv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
52 22 50         SECTION("string SV") { Test::assign(o, vars.pv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
53 22 50         SECTION("RV") { Test::assign(o, vars.rv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
54 22 50         SECTION("AV") { Test::assign(o, (SV*)vars.av, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
55 22 50         SECTION("HV") { Test::assign(o, (SV*)vars.hv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
56 22 50         SECTION("OHV") { Test::assign(o, (SV*)vars.ohv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
57 22 50         SECTION("SHV") { Test::assign(o, (SV*)vars.stash, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
58 22 50         SECTION("CV") { Test::assign(o, (SV*)vars.cv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
59 22 50         SECTION("GV") { Test::assign(o, (SV*)vars.gv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
60 22 50         SECTION("IO") { Test::assign(o, (SV*)vars.io, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
61             }
62 48 50         SECTION("HV") { Test::assign(o, vars.hv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
63 48 50         SECTION("OHV") { Test::assign(o, vars.ohv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
64 48 50         SECTION("SHV") { Test::assign(o, vars.stash, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
65 48 50         SECTION("Stash") { Test::assign(o, my, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
66 48 50         SECTION("valid Hash") { Test::assign(o, h_valid, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
67 48 50         SECTION("invalid Hash") { Test::assign(o, h_invalid, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
68 48 50         SECTION("valid Sv") { Test::assign(o, oth_valid, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
69 48 50         SECTION("invalid Sv") { Test::assign(o, oth_invalid, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
70             }
71              
72 149 50         SECTION("set") {
    50          
    50          
    50          
    100          
73 4           Stash o;
74 3 50         SECTION("SV") {
    50          
    50          
    50          
    100          
75 1           auto cnt = SvREFCNT(vars.iv);
76 1 50         o.set(vars.iv); // no checks
77 1 50         REQUIRE(o);
    50          
    50          
    50          
    0          
    0          
78 1 50         REQUIRE(SvREFCNT(vars.iv) == cnt+1);
    50          
    50          
    50          
    50          
    0          
    0          
79 1 50         REQUIRE(o.get() == vars.iv);
    50          
    50          
    50          
    50          
    0          
    0          
80             }
81 3 50         SECTION("HV") {
    50          
    50          
    50          
    100          
82 1           auto cnt = SvREFCNT(vars.hv);
83 1 50         o.set(vars.hv); // no checks
84 1 50         REQUIRE(o);
    50          
    50          
    50          
    0          
    0          
85 1 50         REQUIRE(SvREFCNT(vars.hv) == cnt+1);
    50          
    50          
    50          
    50          
    0          
    0          
86 1 50         REQUIRE(o.get() == vars.hv);
    50          
    50          
    50          
    50          
    0          
    0          
87             }
88             }
89              
90 149 50         SECTION("cast") {
    50          
    50          
    50          
    100          
91 4 50         Stash o(vars.stash);
92 2           auto rcnt = SvREFCNT(vars.stash);
93 3 50         SECTION("to SV") {
    50          
    50          
    50          
    100          
94 1           SV* sv = o;
95 1 50         REQUIRE(sv == (SV*)vars.stash);
    50          
    50          
    50          
    50          
    0          
    0          
96 1 50         REQUIRE(SvREFCNT(vars.stash) == rcnt);
    50          
    50          
    50          
    50          
    0          
    0          
97             }
98 3 50         SECTION("to HV") {
    50          
    50          
    50          
    100          
99 1           HV* sv = o;
100 1 50         REQUIRE(sv == vars.stash);
    50          
    50          
    50          
    50          
    0          
    0          
101 1 50         REQUIRE(SvREFCNT(vars.stash) == rcnt);
    50          
    50          
    50          
    50          
    0          
    0          
102             }
103             }
104              
105 148 50         SECTION("get") {
    50          
    50          
    50          
    100          
106 2 50         Stash o(vars.stash);
107 1           auto rcnt = SvREFCNT(vars.stash);
108 1 50         REQUIRE(o.get<>() == (SV*)vars.stash);
    50          
    50          
    50          
    50          
    0          
    0          
109 1 50         REQUIRE(o.get() == (SV*)vars.stash);
    50          
    50          
    50          
    50          
    0          
    0          
110 1 50         REQUIRE(o.get() == vars.stash);
    50          
    50          
    50          
    50          
    0          
    0          
111 1 50         REQUIRE(SvREFCNT(vars.stash) == rcnt);
    50          
    50          
    50          
    50          
    0          
    0          
112             }
113              
114 148 50         SECTION("name/effective_name") {
    50          
    50          
    50          
    100          
115 1 50         REQUIRE(my.name() == "M1");
    50          
    50          
    50          
    50          
    0          
    0          
116 1 50         REQUIRE(my.effective_name() == "M1");
    50          
    50          
    50          
    50          
    0          
    0          
117             }
118              
119 148 50         SECTION("fetch") {
    50          
    50          
    50          
    100          
120 2 50         auto glob = my.fetch("method");
121 1 50         REQUIRE(glob);
    50          
    50          
    50          
    0          
    0          
122 1 50         REQUIRE(glob.sub() == get_cv("M1::method", 0));
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
123             }
124              
125 148 50         SECTION("[]const") {
    50          
    50          
    50          
    100          
126 1           const Stash& o = my;
127 2 50         auto glob = o["method"];
128 1 50         REQUIRE(glob);
    50          
    50          
    50          
    0          
    0          
129 1 50         REQUIRE(glob.sub() == get_cv("M1::method", 0));
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
130             }
131              
132 148 50         SECTION("at") {
    50          
    50          
    50          
    100          
133 2 50         auto glob = my.at("method");
134 1 50         REQUIRE(glob);
    50          
    50          
    50          
    0          
    0          
135 1 50         REQUIRE(glob.sub() == get_cv("M1::method", 0));
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
136 1 50         REQUIRE_THROWS(my.at("jopa"));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
137             }
138              
139 171 50         SECTION("[]=") {
    50          
    50          
    50          
    100          
140 25 50         SECTION("nullptr") {
    50          
    50          
    50          
    100          
141 1 50         my["test"].scalar(Simple(10));
    50          
    50          
142 1 50         REQUIRE(my.fetch("test").scalar());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
143 1 50         my["test"] = nullptr;
    50          
144 1 50         REQUIRE(!my.fetch("test").scalar());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
145             }
146 31 50         SECTION("SV") {
    50          
    50          
    50          
    100          
147 8 50         SECTION("undef") {
    50          
    50          
    50          
    100          
148 2 50         auto v = Sv::create();
149 1 50         my["test"] = v.get();
    50          
150 1 50         REQUIRE(my["test"].scalar() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
151             }
152 8 50         SECTION("simple") {
    50          
    50          
    50          
    100          
153 2 50         Simple v(100);
154 1 50         my["test"] = v.get();
    50          
155 1 50         REQUIRE(my["test"].scalar() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
156             }
157 8 50         SECTION("AV") {
    50          
    50          
    50          
    100          
158 2 50         auto v = Array::create();
159 1 50         my["test"] = v.get();
    50          
160 1 50         REQUIRE(my["test"].array() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
161             }
162 8 50         SECTION("HV") {
    50          
    50          
    50          
    100          
163 2 50         auto v = Hash::create();
164 1 50         my["test"] = v.get();
    50          
165 1 50         REQUIRE(my["test"].hash() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
166             }
167 8 50         SECTION("CV") {
    50          
    50          
    50          
    100          
168 2 50         Sub v(vars.cv);
169 1 50         my["test"] = v.get();
    50          
170 1 50         REQUIRE(my["test"].sub() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
171             }
172 8 50         SECTION("GV") {
    50          
    50          
    50          
    100          
173 2 50         auto v = my["method"];
174 1 50         my["test"] = v.get();
    50          
175 1 50         REQUIRE(my["test"] == v);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
176             }
177 8 50         SECTION("IO") {
    50          
    50          
    50          
    100          
178 2 50         Io v(vars.io);
179 1 50         my["test"] = v.get();
    50          
180 1 50         REQUIRE(my["test"].io() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
181             }
182             }
183 25 50         SECTION("AV") {
    50          
    50          
    50          
    100          
184 2 50         auto v = Array::create();
185 1 50         my["test"] = v.get();
    50          
186 1 50         REQUIRE(my["test"].array() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
187             }
188 25 50         SECTION("HV") {
    50          
    50          
    50          
    100          
189 2 50         auto v = Hash::create();
190 1 50         my["test"] = v.get();
    50          
191 1 50         REQUIRE(my["test"].hash() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
192             }
193 25 50         SECTION("CV") {
    50          
    50          
    50          
    100          
194 2 50         Sub v(vars.cv);
195 1 50         my["test"] = v.get();
    50          
196 1 50         REQUIRE(my["test"].sub() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
197             }
198 25 50         SECTION("GV") {
    50          
    50          
    50          
    100          
199 2 50         auto v = my["method"];
200 1 50         my["test"] = v.get();
    50          
201 1 50         REQUIRE(my["test"] == v);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
202              
203 1 50         my.erase("test");
204 2 50         auto o = my["test"];
205 1 50         o.scalar(Simple(100));
    50          
206 1 50         o.array(Array::create());
    50          
207 1 50         o.hash(Hash::create());
    50          
208 1 50         o.sub(Sub(vars.cv));
    50          
209 1 50         my["test"] = (GV*)NULL;
    50          
210 1 50         REQUIRE(!my["test"].scalar());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
211 1 50         REQUIRE(!my["test"].array());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
212 1 50         REQUIRE(!my["test"].hash());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
213 1 50         REQUIRE(!my["test"].sub());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
214             }
215 25 50         SECTION("IO") {
    50          
    50          
    50          
    100          
216 2 50         Io v(vars.io);
217 1 50         my["test"] = v.get();
    50          
218 1 50         REQUIRE(my["test"].io() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
219             }
220 25 50         SECTION("Sv") {
    50          
    50          
    50          
    100          
221 2 50         Sv v = Simple(100);
222 1 50         my["test"] = v;
    50          
223 1 50         REQUIRE(my["test"].scalar() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
224 1 50         v = Array::create();
225 1 50         my["test"] = v;
    50          
226 1 50         REQUIRE(my["test"].array() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
227             }
228 25 50         SECTION("Scalar") {
    50          
    50          
    50          
    100          
229 2 50         Scalar v = Simple(222);
230 1 50         my["test"] = v;
    50          
231 1 50         REQUIRE(my["test"].scalar() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
232             }
233 25 50         SECTION("Ref") {
    50          
    50          
    50          
    100          
234 2 50         Ref v = Ref::create(Simple(100));
    50          
235 1 50         my["test"] = v;
    50          
236 1 50         REQUIRE(my["test"].scalar() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
237             }
238 25 50         SECTION("Simple") {
    50          
    50          
    50          
    100          
239 2 50         Simple v(222);
240 1 50         my["test"] = v;
    50          
241 1 50         REQUIRE(my["test"].scalar() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
242             }
243 25 50         SECTION("Array") {
    50          
    50          
    50          
    100          
244 2 50         auto v = Array::create();
245 1 50         my["test"] = v;
    50          
246 1 50         REQUIRE(my["test"].array() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
247             }
248 25 50         SECTION("Hash") {
    50          
    50          
    50          
    100          
249 2 50         auto v = Hash::create();
250 1 50         my["test"] = v;
    50          
251 1 50         REQUIRE(my["test"].hash() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
252             }
253 25 50         SECTION("Stash") {
    50          
    50          
    50          
    100          
254 2 50         auto v = Stash(vars.stash);
255 1 50         my["test"] = v;
    50          
256 1 50         REQUIRE(my["test"].hash() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
257             }
258 25 50         SECTION("Sub") {
    50          
    50          
    50          
    100          
259 2 50         Sub v(vars.cv);
260 1 50         my["test"] = v;
    50          
261 1 50         REQUIRE(my["test"].sub() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
262             }
263 25 50         SECTION("Object") {
    50          
    50          
    50          
    100          
264 2 50         Object v(vars.ov);
265 1 50         my["test"] = v;
    50          
266 1 50         REQUIRE(my["test"].scalar() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
267 1 50         v = vars.oav;
268 1 50         my["test"] = v;
    50          
269 1 50         REQUIRE(my["test"].array() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
270             }
271 25 50         SECTION("Glob") {
    50          
    50          
    50          
    100          
272 1 50         my["test"] = my["method"];
    50          
    50          
273 1 50         REQUIRE(my["test"] == my.fetch("method"));
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
274 1 50         REQUIRE(my.fetch("test").sub() == get_cv("M1::method", 0));
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
275              
276 1 50         my.erase("test");
277 2 50         auto o = my["test"];
278 1 50         o.scalar(Simple(100));
    50          
279 1 50         o.array(Array::create());
    50          
280 1 50         o.hash(Hash::create());
    50          
281 1 50         o.sub(Sub(vars.cv));
    50          
282 1 50         my["test"] = Glob();
    50          
283 1 50         REQUIRE(!my["test"].scalar());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
284 1 50         REQUIRE(!my["test"].array());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
285 1 50         REQUIRE(!my["test"].hash());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
286 1 50         REQUIRE(!my["test"].sub());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
287             }
288 25 50         SECTION("Io") {
    50          
    50          
    50          
    100          
289 2 50         Io v(vars.io);
290 1 50         my["test"] = v;
    50          
291 1 50         REQUIRE(my["test"].io() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
292             }
293             }
294              
295 148 50         SECTION("store") {
    50          
    50          
    50          
    100          
296 1 50         my.store("test", my["method"]);
    50          
297 1 50         REQUIRE(my.fetch("test"));
    50          
    50          
    50          
    50          
    0          
    0          
298 1 50         REQUIRE(my.fetch("test").sub() == get_cv("M1::method", 0));
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
299 1 50         my.erase("test");
300 1 50         my.store("test", vars.iv);
301 1 50         REQUIRE(my.fetch("test"));
    50          
    50          
    50          
    50          
    0          
    0          
302 1 50         REQUIRE(my.fetch("test").scalar() == vars.iv);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
303             }
304              
305 148 50         SECTION("const sub promote") {
    50          
    50          
    50          
    100          
306 1 50         Hash(my).store("test", Ref::create(Simple(1)));
    50          
    50          
    50          
307 1 50         REQUIRE(my.fetch("test"));
    50          
    50          
    50          
    50          
    0          
    0          
308 1 50         REQUIRE(my.fetch("test").sub() == get_cv("M1::test", 0));
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
309             }
310              
311             if (PERL_VERSION >= 22) { // in older perls only globs and refs to primitives allowed in symbol tables
312 148 50         SECTION("sub promote") {
    50          
    50          
    50          
    100          
313 1 50         Hash(my).store("test", get_sv("M1::anon", 0));
    50          
    50          
314 1 50         REQUIRE(my.fetch("test"));
    50          
    50          
    50          
    50          
    0          
    0          
315 1 50         REQUIRE(my.fetch("test").sub() == get_cv("M1::test", 0));
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
316             }
317             }
318              
319 148 50         SECTION("scalar") {
    50          
    50          
    50          
    100          
320 1 50         REQUIRE(!my.scalar("jopa"));
    50          
    50          
    50          
    50          
    0          
    0          
321 2 50         auto v = Simple(333);
322 1 50         my.scalar("test", v);
323 1 50         REQUIRE(my["test"].scalar() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
324 1 50         REQUIRE(my.scalar("test") == v);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
325             }
326              
327 148 50         SECTION("array") {
    50          
    50          
    50          
    100          
328 1 50         REQUIRE(!my.array("jopa"));
    50          
    50          
    50          
    50          
    0          
    0          
329 2 50         auto v = Array::create();
330 1 50         my.array("test", v);
331 1 50         REQUIRE(my["test"].array() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
332 1 50         REQUIRE(my.array("test") == v);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
333             }
334              
335 148 50         SECTION("hash") {
    50          
    50          
    50          
    100          
336 1 50         REQUIRE(!my.hash("jopa"));
    50          
    50          
    50          
    50          
    0          
    0          
337 2 50         auto v = Hash::create();
338 1 50         my.hash("test", v);
339 1 50         REQUIRE(my["test"].hash() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
340 1 50         REQUIRE(my.hash("test") == v);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
341             }
342              
343 148 50         SECTION("sub") {
    50          
    50          
    50          
    100          
344 1 50         REQUIRE(!my.sub("jopa"));
    50          
    50          
    50          
    50          
    0          
    0          
345 2 50         auto v = Sub(vars.cv);
346 1 50         my.sub("test", v);
347 1 50         REQUIRE(my["test"].sub() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
348 1 50         REQUIRE(my.sub("test") == v);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
349             }
350              
351 148 50         SECTION("io") {
    50          
    50          
    50          
    100          
352 1 50         REQUIRE(!my.io("jopa"));
    50          
    50          
    50          
    50          
    0          
    0          
353 2 50         auto v = Io(vars.io);
354 1 50         my.io("test", v);
355 1 50         REQUIRE(my["test"].io() == v);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
356 1 50         REQUIRE(my.io("test") == v);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
357             }
358              
359 148 50         SECTION("path") {
    50          
    50          
    50          
    100          
360 2 50         Stash o("AA::BB::CC", GV_ADD);
361 1 50         REQUIRE(o.path() == "AA/BB/CC.pm");
    50          
    50          
    50          
    50          
    50          
    0          
    0          
362             }
363              
364 148 50         SECTION("mark_as_loaded") {
    50          
    50          
    50          
    100          
365 2 50         Stash o("M1");
366 1 50         o.mark_as_loaded(Stash("MyTest"));
    50          
367 1 50         REQUIRE(Stash::root().hash("INC").fetch(o.path()).is_true());
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
368 1 50         REQUIRE_THROWS(o.mark_as_loaded(Stash("Nonexistent")));
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
369             }
370              
371 148 50         SECTION("inherit") {
    50          
    50          
    50          
    100          
372 2 50         Stash o("M_INH", GV_ADD);
373 1 50         o.mark_as_loaded(Stash("MyTest"));
    50          
374 1 50         o.inherit(Stash("M1"));
    50          
375 2 50         auto ISA = o.array("ISA");
376 1 50         REQUIRE(ISA.size() == 1);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
377 1 50         REQUIRE(Simple(ISA[0]) == "M1");
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
378             }
379              
380 148 50         SECTION("method/method_strict") {
    50          
    50          
    50          
    100          
381 2 50         Stash o("M2");
382 1 50         REQUIRE(o.method("child_method"));
    50          
    50          
    50          
    50          
    0          
    0          
383 1 50         REQUIRE(o.method("child_method") == get_cv("M2::child_method", 0));
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
384 1 50         REQUIRE(o.method("child_method") == o.method_strict("child_method"));
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
385 1 50         REQUIRE(o.method("method"));
    50          
    50          
    50          
    50          
    0          
    0          
386 1 50         REQUIRE(o.method("method") == get_cv("M1::method", 0));
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
387 1 50         REQUIRE(o.method("method") == o.method_strict("method"));
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
388 1 50         REQUIRE(!o.method("nomethod"));
    50          
    50          
    50          
    50          
    0          
    0          
389 1 50         REQUIRE_THROWS(o.method_strict("nomethod"));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
390             }
391              
392 148 50         SECTION("name_hek") {
    50          
    50          
    50          
    100          
393 1           auto hek = my.name_hek();
394 1 50         REQUIRE(HEK_KEY(hek) == my.name().data());
    50          
    50          
    50          
    50          
    0          
    0          
395             }
396              
397 148 50         SECTION("name_sv") {
    50          
    50          
    50          
    100          
398 2 50         auto nm = my.name_sv();
    50          
399 1 50         REQUIRE((string_view)nm == my.name());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
400 1 50         REQUIRE(nm.c_str() == my.name().data());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
401             }
402              
403 148 50         SECTION("isa") {
    50          
    50          
    50          
    100          
404 2 50         Stash o("M2");
405 1 50         REQUIRE(o.isa("M1"));
    50          
    50          
    50          
    50          
    0          
    0          
406 1 50         REQUIRE(o.isa(Stash("M1")));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
407 1 50         REQUIRE(!o.isa("M254"));
    50          
    50          
    50          
    50          
    0          
    0          
408 1 50         REQUIRE(!o.isa(Stash("M255", GV_ADD)));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
409             }
410              
411 149 50         SECTION("bless") {
    50          
    50          
    50          
    100          
412 4 50         Stash st("MyTest");
413 4 50         Simple obase(100);
414 3 50         SECTION("SV") {
    50          
    50          
    50          
    100          
415 2 50         auto o = st.bless(obase);
416 1 50         REQUIRE(o);
    50          
    50          
    50          
    0          
    0          
417 1 50         REQUIRE(o == obase);
    50          
    50          
    50          
    50          
    0          
    0          
418 1 50         REQUIRE(o.stash() == st);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
419             }
420 3 50         SECTION("RV") {
    50          
    50          
    50          
    100          
421 2 50         auto r = Ref::create(obase);
422 2 50         auto o = st.bless(r);
423 1 50         REQUIRE(o);
    50          
    50          
    50          
    0          
    0          
424 1 50         REQUIRE(o == obase);
    50          
    50          
    50          
    50          
    0          
    0          
425 1 50         REQUIRE(o.stash() == st);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
426 1 50         REQUIRE(o.ref() == r);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
427             }
428             }
429              
430 148 50         SECTION("call") {
    50          
    50          
    50          
    100          
431 2 50         Simple ret = my.call("class_method");
    50          
432 1 50         REQUIRE(ret);
    50          
    50          
    50          
    0          
    0          
433 1 50         REQUIRE(ret == string_view("M1-hi"));
    50          
    50          
    50          
    50          
    0          
    0          
434 1 50         my.call("class_method", (SV**)NULL, 0);
435 1 50         my.call("class_method", (SV*)NULL);
436 1 50         my.call("class_method", Sv());
437 1 50         my.call("class_method");
438             }
439              
440 153 50         SECTION("call_next/super/SUPER") {
    50          
    50          
    50          
    100          
441 12 50         Stash s("M4");
442 12 50         Sub sub = s.method("meth");
443 12           Simple res;
444              
445 7 50         SECTION("SUPER") {
    50          
    50          
    50          
    100          
446 1 50         res = s.call_SUPER(sub);
    50          
447 1 50         REQUIRE(res == "M4-2");
    50          
    50          
    50          
    50          
    0          
    0          
448 1 50         sub = sub.SUPER_strict();
449 1 50         REQUIRE(sub == get_cv("M2::meth", 0));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
450              
451 1 50         res = s.call_SUPER(sub);
    50          
452 1 50         REQUIRE(res == "M4-1");
    50          
    50          
    50          
    50          
    0          
    0          
453 1 50         sub = sub.SUPER_strict();
454 1 50         REQUIRE(sub == get_cv("M1::meth", 0));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
455              
456 1 50         REQUIRE(!sub.SUPER());
    50          
    50          
    50          
    50          
    0          
    0          
457 1 50         REQUIRE_THROWS(sub.SUPER_strict());
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
458 1 50         REQUIRE_THROWS(s.call_SUPER(sub));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
459             }
460              
461 7 50         SECTION("next") {
    50          
    50          
    50          
    100          
462 1 50         res = s.call_next(sub);
    50          
463 1 50         REQUIRE(res == "M4-2");
    50          
    50          
    50          
    50          
    0          
    0          
464 1 50         sub = s.next_method_strict(sub);
465 1 50         REQUIRE(sub == get_cv("M2::meth", 0));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
466              
467 1 50         res = s.call_next(sub);
    50          
468 1 50         REQUIRE(res == "M4-3");
    50          
    50          
    50          
    50          
    0          
    0          
469 1 50         sub = s.next_method_strict(sub);
470 1 50         REQUIRE(sub == get_cv("M3::meth", 0));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
471              
472 1 50         res = s.call_next(sub);
    50          
473 1 50         REQUIRE(res == "M4-1");
    50          
    50          
    50          
    50          
    0          
    0          
474 1 50         sub = s.next_method_strict(sub);
475 1 50         REQUIRE(sub == get_cv("M1::meth", 0));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
476              
477 1 50         REQUIRE(!s.next_method(sub));
    50          
    50          
    50          
    50          
    0          
    0          
478 1 50         REQUIRE_THROWS(s.next_method_strict(sub));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
479 1 50         REQUIRE_THROWS(s.call_next(sub));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
480             }
481              
482 7 50         SECTION("next_maybe") {
    50          
    50          
    50          
    100          
483 1 50         res = s.call_next_maybe(sub);
    50          
484 1 50         REQUIRE(res == "M4-2");
    50          
    50          
    50          
    50          
    0          
    0          
485 1 50         sub = s.next_method(sub);
486              
487 1 50         res = s.call_next_maybe(sub);
    50          
488 1 50         REQUIRE(res == "M4-3");
    50          
    50          
    50          
    50          
    0          
    0          
489 1 50         sub = s.next_method(sub);
490              
491 1 50         res = s.call_next_maybe(sub);
    50          
492 1 50         REQUIRE(res == "M4-1");
    50          
    50          
    50          
    50          
    0          
    0          
493 1 50         sub = s.next_method(sub);
494              
495 1 50         res = s.call_next_maybe(sub);
    50          
496 1 50         REQUIRE(!res);
    50          
    50          
    50          
    0          
    0          
497             }
498              
499 7 50         SECTION("super/dfs") {
    50          
    50          
    50          
    100          
500 1 50         res = s.call_super(sub);
    50          
501 1 50         REQUIRE(res == "M4-2");
    50          
    50          
    50          
    50          
    0          
    0          
502 1 50         sub = s.super_method_strict(sub);
503 1 50         REQUIRE(sub == get_cv("M2::meth", 0));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
504              
505 1 50         res = s.call_super(sub);
    50          
506 1 50         REQUIRE(res == "M4-1");
    50          
    50          
    50          
    50          
    0          
    0          
507 1 50         sub = s.super_method_strict(sub);
508 1 50         REQUIRE(sub == get_cv("M1::meth", 0));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
509              
510 1 50         REQUIRE(!s.super_method(sub));
    50          
    50          
    50          
    50          
    0          
    0          
511 1 50         REQUIRE_THROWS(s.super_method_strict(sub));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
512 1 50         REQUIRE_THROWS(s.call_super(sub));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
513             }
514              
515 7 50         SECTION("super/c3") {
    50          
    50          
    50          
    100          
516 1 50         s.call("enable_c3");
517              
518 1 50         res = s.call_super(sub);
    50          
519 1 50         REQUIRE(res == "M4-2");
    50          
    50          
    50          
    50          
    0          
    0          
520 1 50         sub = s.super_method_strict(sub);
521 1 50         REQUIRE(sub == get_cv("M2::meth", 0));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
522              
523 1 50         res = s.call_super(sub);
    50          
524 1 50         REQUIRE(res == "M4-3");
    50          
    50          
    50          
    50          
    0          
    0          
525 1 50         sub = s.super_method_strict(sub);
526 1 50         REQUIRE(sub == get_cv("M3::meth", 0));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
527              
528 1 50         res = s.call_super(sub);
    50          
529 1 50         REQUIRE(res == "M4-1");
    50          
    50          
    50          
    50          
    0          
    0          
530 1 50         sub = s.super_method_strict(sub);
531 1 50         REQUIRE(sub == get_cv("M1::meth", 0));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
532              
533 1 50         REQUIRE(!s.super_method(sub));
    50          
    50          
    50          
    50          
    0          
    0          
534 1 50         REQUIRE_THROWS(s.super_method_strict(sub));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
535 1 50         REQUIRE_THROWS(s.call_super(sub));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
536              
537 1 50         s.call("disable_c3");
538             }
539              
540 7 50         SECTION("super_maybe") {
    50          
    50          
    50          
    100          
541 1 50         res = s.call_super_maybe(sub);
    50          
542 1 50         REQUIRE(res == "M4-2");
    50          
    50          
    50          
    50          
    0          
    0          
543 1 50         sub = s.super_method(sub);
544              
545 1 50         res = s.call_super_maybe(sub);
    50          
546 1 50         REQUIRE(res == "M4-1");
    50          
    50          
    50          
    50          
    0          
    0          
547 1 50         sub = s.super_method(sub);
548              
549 1 50         res = s.call_super_maybe(sub);
    50          
550 1 50         REQUIRE(!res);
    50          
    50          
    50          
    0          
    0          
551             }
552             }
553              
554 149 50         SECTION("add_const_sub") {
    50          
    50          
    50          
    100          
555 4 50         Stash st(vars.stash);
556 2 50         REQUIRE(!st.fetch("MYCONST"));
    50          
    50          
    50          
    50          
    0          
    0          
557              
558 3 50         SECTION("scalar") {
    50          
    50          
    50          
    100          
559 2 50         Simple v(123);
560 1 50         st.add_const_sub("MYCONST", v);
561 1 50         REQUIRE(v.use_count() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
562 1 50         REQUIRE(st.fetch("MYCONST"));
    50          
    50          
    50          
    50          
    0          
    0          
563 2 50         auto s = st["MYCONST"].sub();
    50          
564 1 50         REQUIRE(s);
    50          
    50          
    50          
    0          
    0          
565 2 50         Simple v2 = s.call();
    50          
566 1 50         REQUIRE(v2 == v.get());
    50          
    50          
    50          
    50          
    0          
    0          
567             }
568              
569             if (PERL_VERSION >= 20) { // in older perls values can only be scalars
570 3 50         SECTION("array") {
    50          
    50          
    50          
    100          
571 5 50         Array v({ Simple(1), Simple(2), Simple(3) });
    50          
    50          
    50          
    100          
    0          
572 1 50         st.add_const_sub("MYCONST", v);
573 1 50         REQUIRE(v.use_count() == 2);
    50          
    50          
    50          
    50          
    0          
    0          
574 2 50         auto res = st["MYCONST"].sub().call();
    50          
    50          
575 1 50         REQUIRE(res.size() == v.size());
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
576 1 50         REQUIRE(res != v);
    50          
    50          
    50          
    50          
    0          
    0          
577 1 50         REQUIRE(res[0] == v[0]);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
578 1 50         REQUIRE(res[1] == v[1]);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
579 1 50         REQUIRE(res[2] == v[2]);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
580             }
581             }
582              
583 2 50         st.erase("MYCONST");
584 2 50         REQUIRE(!st.fetch("MYCONST"));
    50          
    50          
    50          
    50          
    0          
    0          
585             }
586 283 50         }
    50