File Coverage

t/svapi/scalar.cc
Criterion Covered Total %
statement 108 108 100.0
branch 552 1096 50.3
condition n/a
subroutine n/a
pod n/a
total 660 1204 54.8


line stmt bran cond sub pod time code
1             #include "test.h"
2              
3             using Test = TestSv;
4              
5             // when policy = INCREMENT, and SV* declined, do nothing (+1 -1)
6             // when policy = NONE and SV* declined, it MUST be decremented
7              
8 117           TEST_CASE("Scalar", "[Sv]") {
9 166 50         perlvars vars;
10 166 50         Scalar my(vars.iv);
11 166           Sv oth_valid(vars.rv), oth_invalid(vars.av);
12              
13 112 50         SECTION("ctor") {
    50          
    50          
    50          
    100          
14 30 50         SECTION("empty") {
    50          
    50          
    50          
    100          
15 2           Scalar obj;
16 1 50         REQUIRE(!obj);
    50          
    50          
    50          
    0          
    0          
17             }
18 49 50         SECTION("SV") {
    50          
    50          
    50          
    100          
19 20 50         SECTION("undef") { Test::ctor(vars.undef, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
20 20 50         SECTION("number") { Test::ctor(vars.iv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
21 20 50         SECTION("string") { Test::ctor(vars.pv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
22 20 50         SECTION("OSV") { Test::ctor(vars.ov, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
23 20 50         SECTION("RV") { Test::ctor(vars.rv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
24 20 50         SECTION("AV") { Test::ctor((SV*)vars.av, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
25 20 50         SECTION("HV") { Test::ctor((SV*)vars.hv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
26 20 50         SECTION("CV") { Test::ctor((SV*)vars.cv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
27 20 50         SECTION("GV") { Test::ctor((SV*)vars.gv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
28 20 50         SECTION("IO") { Test::ctor((SV*)vars.io, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
29             }
30 29 50         SECTION("GV") { Test::ctor(vars.gv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
31              
32 29 50         SECTION("Scalar") { Test::ctor(my, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
33 29 50         SECTION("valid Sv") { Test::ctor(oth_valid, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
34 29 50         SECTION("invalid Sv") { Test::ctor(oth_invalid, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
35             }
36              
37 94 50         SECTION("noinc") {
    50          
    50          
    50          
    100          
38 21 50         SECTION("SV") {
    50          
    50          
    50          
    100          
39 10 50         SECTION("undef") { Test::noinc(vars.undef, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
40 10 50         SECTION("number") { Test::noinc(vars.iv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
41 10 50         SECTION("string") { Test::noinc(vars.pv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
42 10 50         SECTION("OSV") { Test::noinc(vars.ov, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
43 10 50         SECTION("RV") { Test::noinc(vars.rv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
44 10 50         SECTION("AV") { Test::noinc((SV*)vars.av, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
45 10 50         SECTION("HV") { Test::noinc((SV*)vars.hv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
46 10 50         SECTION("CV") { Test::noinc((SV*)vars.cv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
47 10 50         SECTION("GV") { Test::noinc((SV*)vars.gv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
48 10 50         SECTION("IO") { Test::noinc((SV*)vars.io, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
49             }
50 11 50         SECTION("GV") { Test::noinc(vars.gv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
51             }
52              
53 117 50         SECTION("operator=") {
    50          
    50          
    50          
    100          
54 68 50         Scalar o(newSViv(10), Sv::NONE);
    50          
55 54 50         SECTION("SV") {
    50          
    50          
    50          
    100          
56 20 50         SECTION("undef") { Test::assign(o, vars.undef, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
57 20 50         SECTION("number") { Test::assign(o, vars.iv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
58 20 50         SECTION("string") { Test::assign(o, vars.pv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
59 20 50         SECTION("OSV") { Test::assign(o, vars.ov, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
60 20 50         SECTION("RV") { Test::assign(o, vars.rv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
61 20 50         SECTION("AV") { Test::assign(o, (SV*)vars.av, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
62 20 50         SECTION("HV") { Test::assign(o, (SV*)vars.hv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
63 20 50         SECTION("CV") { Test::assign(o, (SV*)vars.cv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
64 20 50         SECTION("GV") { Test::assign(o, (SV*)vars.gv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
65 20 50         SECTION("IO") { Test::assign(o, (SV*)vars.io, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
66             }
67 34 50         SECTION("GV") { Test::assign(o, vars.gv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
68 34 50         SECTION("Scalar") { Test::assign(o, my, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
69 34 50         SECTION("valid Sv") { Test::assign(o, oth_valid, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
70 34 50         SECTION("invalid Sv") { Test::assign(o, oth_invalid, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
71             }
72              
73 85 50         SECTION("set") {
    50          
    50          
    50          
    100          
74 3 50         SECTION("SV") {
    50          
    50          
    50          
    100          
75 2           Scalar o;
76 1 50         o.set((SV*)vars.cv);
77 1 50         REQUIRE(o.get() == (SV*)vars.cv);
    50          
    50          
    50          
    50          
    0          
    0          
78             }
79 3 50         SECTION("GV") {
    50          
    50          
    50          
    100          
80 2           Scalar o;
81 1 50         o.set((GV*)vars.cv);
82 1 50         REQUIRE(o.get() == (SV*)vars.cv);
    50          
    50          
    50          
    50          
    0          
    0          
83             }
84             }
85              
86 85 50         SECTION("cast") {
    50          
    50          
    50          
    100          
87 3 50         SECTION("to SV") {
    50          
    50          
    50          
    100          
88 2 50         Scalar o(vars.iv);
89 1           auto cnt = SvREFCNT(vars.iv);
90 1           SV* r = o;
91 1 50         REQUIRE(r == vars.iv);
    50          
    50          
    50          
    50          
    0          
    0          
92 1 50         REQUIRE(SvREFCNT(vars.iv) == cnt);
    50          
    50          
    50          
    50          
    0          
    0          
93             }
94 3 50         SECTION("to GV") {
    50          
    50          
    50          
    100          
95 2 50         Scalar o(vars.iv);
96 1           auto cnt = SvREFCNT(vars.iv);
97 1 50         GV* r = o;
98 1 50         REQUIRE(r == nullptr);
    50          
    50          
    50          
    50          
    0          
    0          
99 1 50         REQUIRE(SvREFCNT(vars.iv) == cnt);
    50          
    50          
    50          
    50          
    0          
    0          
100             }
101             }
102              
103 85 50         SECTION("get") {
    50          
    50          
    50          
    100          
104 3 50         SECTION("SV") {
    50          
    50          
    50          
    100          
105 2 50         Scalar o(vars.iv);
106 1           auto cnt = SvREFCNT(vars.iv);
107 1 50         REQUIRE(o.get() == vars.iv);
    50          
    50          
    50          
    50          
    0          
    0          
108 1 50         REQUIRE(SvREFCNT(vars.iv) == cnt);
    50          
    50          
    50          
    50          
    0          
    0          
109             }
110 3 50         SECTION("GV") {
    50          
    50          
    50          
    100          
111 2 50         Scalar o(vars.iv);
112 1           auto cnt = SvREFCNT(vars.iv);
113 1 50         REQUIRE(o.get() == (GV*)vars.iv);
    50          
    50          
    50          
    50          
    0          
    0          
114 1 50         REQUIRE(SvREFCNT(vars.iv) == cnt);
    50          
    50          
    50          
    50          
    0          
    0          
115             }
116             }
117              
118 84 50         SECTION("upgrade") {
    50          
    50          
    50          
    100          
119 2 50         Scalar o = Sv::create();
    50          
120 1 50         o.upgrade(SVt_PVMG); // upgrade till PVMG works
121 1 50         REQUIRE(o.type() == SVt_PVMG);
    50          
    50          
    50          
    50          
    0          
    0          
122 1 50         REQUIRE_THROWS(o.upgrade(SVt_PVAV));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
123             }
124              
125 84 50         SECTION("as_string") {
    50          
    50          
    50          
    100          
126 1 50         REQUIRE(Scalar(Simple(111)).as_string() == panda::string("111"));
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
127 1           const char* str = "ebanarot";
128 2 50         Scalar s = Simple(str);
129 1 50         REQUIRE(s.as_string() == str);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
130 1 50         REQUIRE(s.as_string().data() != str);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
131              
132 1 50         REQUIRE(Scalar().as_string() == panda::string());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
133 1 50         REQUIRE(Scalar::undef.as_string() == panda::string());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
134 1 50         REQUIRE_THROWS_AS(Ref::create(Array::create()).as_string(), std::invalid_argument);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
135             }
136              
137 84 50         SECTION("as_number") {
    50          
    50          
    50          
    100          
138 1 50         REQUIRE(Scalar(Simple(111)).as_number() == 111);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
139 1 50         REQUIRE(Scalar(Simple(111.7)).as_number() == 111);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
140 1 50         REQUIRE(Scalar(Simple(111.7)).as_number() == 111.7);
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
141 1 50         REQUIRE(Scalar().as_number() == 0);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
142 1 50         REQUIRE(Scalar::undef.as_number() == 0);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
143 1 50         REQUIRE_THROWS_AS(Ref::create(Array::create()).as_number(), std::invalid_argument);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    0          
    0          
144             }
145 219 50         }
    50