File Coverage

t/svapi/simple.cc
Criterion Covered Total %
statement 310 310 100.0
branch 1979 4822 41.0
condition n/a
subroutine n/a
pod n/a
total 2289 5132 44.6


line stmt bran cond sub pod time code
1             #include "test.h"
2              
3             using Test = TestSv;
4             using panda::string_view;
5              
6 40           template typename std::enable_if::value && std::is_signed::value, T>::type getnum (const SV* sv) { return SvIVX(sv); }
7 40           template typename std::enable_if::value && std::is_unsigned::value, T>::type getnum (const SV* sv) { return SvUVX(sv); }
8 20           template typename std::enable_if::value, T>::type getnum (const SV* sv) { return SvNVX(sv); }
9              
10 32           template typename std::enable_if::value && std::is_signed::value, T>::type oknumtype (const SV* sv) { return (bool)SvIOK(sv); }
11 32 100         template typename std::enable_if::value && std::is_unsigned::value, T>::type oknumtype (const SV* sv) { return SvUOK(sv) || SvIOK(sv); }
    50          
    50          
    50          
    50          
    50          
    50          
    50          
12 16 50         template typename std::enable_if::value, T>::type oknumtype (const SV* sv) { return (bool)SvNOK(sv); }
    50          
13              
14             // when policy = INCREMENT, and SV* declined, do nothing (+1 -1)
15             // when policy = NONE and SV* declined, it MUST be decremented
16              
17             template
18 10           static void test_ctor (T val) {
19 20 50         Simple obj(val);
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
20 10 50         REQUIRE(getnum(obj) == val);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
21 10           }
22              
23             template
24 10           static void test_assign (T val) {
25 20           Simple obj;
26 10 50         obj = val;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
27 10 50         REQUIRE(obj);
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
28 10 50         REQUIRE(oknumtype(obj));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
29 10 50         REQUIRE(getnum(obj) == val);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
30 10           SV* _sv = obj;
31              
32 10 50         obj = (T)0;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
33 10 50         REQUIRE(oknumtype(_sv));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
34 10 50         REQUIRE(getnum(obj) == 0);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
35 10 50         REQUIRE((SV*)obj == _sv); // keep same SV
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
36              
37 10 50         SV* _tmp = sv_2mortal(newSVpvs("hello"));
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
38 10 50         obj = _tmp;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
39 10 50         REQUIRE(SvPOK(_tmp));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
40 10 50         obj = val;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
41 10 50         REQUIRE(oknumtype(_tmp));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
42 10 50         REQUIRE(!SvPOK(_tmp));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
43 10 50         REQUIRE(getnum(obj) == val);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
44 10 50         REQUIRE((SV*)obj == _tmp); // keep same SV
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
45 10           }
46              
47             template
48 10           static void test_set (T val) {
49 20 50         Simple obj((T)0);
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
50 10 50         obj.set(val);
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
51 10 50         REQUIRE(obj);
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
52 10 50         REQUIRE(oknumtype(obj));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
53 10 50         REQUIRE(getnum(obj) == val);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
54 10           }
55              
56             template
57 10           static void test_cast (T val) {
58 20           Simple obj;
59 10 50         T r = obj;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
60 10 50         REQUIRE(r == (T)0);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
61              
62 10 50         obj = val;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
63 10 50         r = obj;
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
64 10 50         REQUIRE(r == val);
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
65 10           }
66              
67             template
68 10           static void test_get (T val) {
69 20 50         Simple obj(val);
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
70 10 50         REQUIRE(obj.get() == val);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
71 10           }
72              
73             template
74 3           static void test_as_string () {
75 6           Simple o;
76 3 50         REQUIRE(o.as_string() == T());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
77              
78 3 50         o = Sv::create();
    50          
    50          
    50          
    50          
    50          
79 3 50         REQUIRE(o.as_string() == T());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
80              
81 4 50         T src("epta");
82 3 50         o = string_view(src.data(), src.length());
    50          
    50          
83 3 50         REQUIRE(o.as_string() == src);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
84 3           }
85              
86 133           TEST_CASE("Simple", "[Sv]") {
87 198 50         perlvars vars;
88 198 50         Simple my(vars.iv);
89 198           Sv oth_valid(vars.ov), oth_invalid(vars.av);
90 99 50         int ivsize = Simple(eval_pv("use Config; $Config{ivsize}", 0));
    50          
    50          
91              
92 128 50         SECTION("ctor") {
    50          
    50          
    50          
    100          
93 30 50         SECTION("empty") {
    50          
    50          
    50          
    100          
94 2           Simple obj;
95 1 50         REQUIRE(!obj);
    50          
    50          
    50          
    0          
    0          
96             }
97 49 50         SECTION("SV") {
    50          
    50          
    50          
    100          
98 20 50         SECTION("undef") { Test::ctor(vars.undef, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
99 20 50         SECTION("number") { Test::ctor(vars.iv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
100 20 50         SECTION("string") { Test::ctor(vars.pv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
101 20 50         SECTION("OSV") { Test::ctor(vars.ov, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
102 20 50         SECTION("RV") { Test::ctor(vars.rv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
103 20 50         SECTION("AV") { Test::ctor((SV*)vars.av, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
104 20 50         SECTION("HV") { Test::ctor((SV*)vars.hv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
105 20 50         SECTION("CV") { Test::ctor((SV*)vars.cv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
106 20 50         SECTION("GV") { Test::ctor((SV*)vars.gv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
107 20 50         SECTION("IO") { Test::ctor((SV*)vars.io, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
108             }
109              
110 29 50         SECTION("Simple") { Test::ctor(my, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
111 29 50         SECTION("valid Sv") { Test::ctor(oth_valid, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
112 29 50         SECTION("invalid Sv") { Test::ctor(oth_invalid, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
113              
114 30 50         SECTION("from number") {
    50          
    50          
    50          
    100          
115 1 50         test_ctor((int8_t)-5);
116 1 50         test_ctor((int16_t)-30000);
117 1 50         test_ctor((int32_t)1000000000);
118 1 50         if (ivsize == 8) test_ctor(9223372036854775807L);
    50          
119 1 50         test_ctor((uint8_t)255);
120 1 50         test_ctor((uint16_t)65535);
121 1 50         test_ctor((uint32_t)4000000000);
122 1 50         if (ivsize == 8) test_ctor(18446744073709551615LU);
    50          
123 1 50         test_ctor(5.5f);
124 1 50         test_ctor(222222222.222222);
125             }
126 30 50         SECTION("from string_view") {
    50          
    50          
    50          
    100          
127 2 50         Simple obj(string_view("suka"));
128 1 50         REQUIRE(string_view(SvPVX(obj), 4) == "suka");
    50          
    50          
    50          
    50          
    0          
    0          
129 1 50         REQUIRE(SvCUR(obj) == 4);
    50          
    50          
    50          
    50          
    0          
    0          
130 1 50         REQUIRE(obj.is_string());
    50          
    50          
    50          
    0          
    0          
131             }
132             }
133              
134 109 50         SECTION("noinc") {
    50          
    50          
    50          
    100          
135 10 50         SECTION("undef") { Test::noinc(vars.undef, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
136 10 50         SECTION("number") { Test::noinc(vars.iv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
137 10 50         SECTION("string") { Test::noinc(vars.pv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
138 10 50         SECTION("OSV") { Test::noinc(vars.ov, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
139 10 50         SECTION("RV") { Test::noinc(vars.rv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
140 10 50         SECTION("AV") { Test::noinc((SV*)vars.av, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
141 10 50         SECTION("HV") { Test::noinc((SV*)vars.hv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
142 10 50         SECTION("CV") { Test::noinc((SV*)vars.cv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
143 10 50         SECTION("GV") { Test::noinc((SV*)vars.gv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
144 10 50         SECTION("IO") { Test::noinc((SV*)vars.io, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
145             }
146              
147 100 50         SECTION("format") {
    50          
    50          
    50          
    100          
148 2 50         Simple obj = Simple::format("pi = %0.2f", 3.14157);
149 1 50         REQUIRE(obj.as_string() == "pi = 3.14");
    50          
    50          
    50          
    50          
    50          
    0          
    0          
150             }
151              
152 134 50         SECTION("operator=") {
    50          
    50          
    50          
    100          
153 70 50         Simple o(10);
154 55 50         SECTION("SV") {
    50          
    50          
    50          
    100          
155 20 50         SECTION("undef") { Test::assign(o, vars.undef, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
156 20 50         SECTION("number") { Test::assign(o, vars.iv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
157 20 50         SECTION("string") { Test::assign(o, vars.pv, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
158 20 50         SECTION("OSV") { Test::assign(o, vars.ov, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
159 20 50         SECTION("RV") { Test::assign(o, vars.rv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
160 20 50         SECTION("AV") { Test::assign(o, (SV*)vars.av, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
161 20 50         SECTION("HV") { Test::assign(o, (SV*)vars.hv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
162 20 50         SECTION("CV") { Test::assign(o, (SV*)vars.cv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
163 20 50         SECTION("GV") { Test::assign(o, (SV*)vars.gv, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
164 20 50         SECTION("IO") { Test::assign(o, (SV*)vars.io, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
165             }
166 35 50         SECTION("Simple") { Test::assign(o, my, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
167 35 50         SECTION("valid Sv") { Test::assign(o, oth_valid, behaviour_t::VALID); }
    50          
    50          
    50          
    100          
    50          
168 35 50         SECTION("invalid Sv") { Test::assign(o, oth_invalid, behaviour_t::THROWS); }
    50          
    50          
    50          
    100          
    50          
169 36 50         SECTION("number") {
    50          
    50          
    50          
    100          
170 1 50         test_assign((int8_t)-5);
171 1 50         test_assign((int16_t)-30000);
172 1 50         test_assign((int32_t)1000000000);
173 1 50         if (ivsize == 8) test_assign(9223372036854775807L);
    50          
174 1 50         test_assign((uint8_t)255);
175 1 50         test_assign((uint16_t)65535);
176 1 50         test_assign((uint32_t)4000000000);
177 1 50         if (ivsize == 8) test_assign(18446744073709551615LU);
    50          
178 1 50         test_assign(5.5f);
179 1 50         test_assign(222222222.222222);
180             }
181 36 50         SECTION("char*") {
    50          
    50          
    50          
    100          
182 2 50         Simple obj(vars.iv);
183 1 50         obj = "abcd";
184 1 50         REQUIRE(string_view(SvPVX(obj), 4) == "abcd");
    50          
    50          
    50          
    50          
    0          
    0          
185 1 50         REQUIRE(string_view(SvPVX(vars.iv), 4) == "abcd");
    50          
    50          
    50          
    50          
    0          
    0          
186 1 50         REQUIRE(SvCUR(obj) == 4);
    50          
    50          
    50          
    50          
    0          
    0          
187 1 50         REQUIRE(obj.is_string());
    50          
    50          
    50          
    0          
    0          
188             }
189 36 50         SECTION("string_view") {
    50          
    50          
    50          
    100          
190 2 50         Simple obj(vars.iv);
191 1 50         obj = string_view("abcd");
192 1 50         REQUIRE(string_view(SvPVX(obj), 4) == "abcd");
    50          
    50          
    50          
    50          
    0          
    0          
193 1 50         REQUIRE(string_view(SvPVX(vars.iv), 4) == "abcd");
    50          
    50          
    50          
    50          
    0          
    0          
194 1 50         REQUIRE(SvCUR(obj) == 4);
    50          
    50          
    50          
    50          
    0          
    0          
195 1 50         REQUIRE(obj.is_string());
    50          
    50          
    50          
    0          
    0          
196             }
197             }
198              
199 101 50         SECTION("set") {
    50          
    50          
    50          
    100          
200 3 50         SECTION("number") {
    50          
    50          
    50          
    100          
201 1 50         test_set((int8_t)-5);
202 1 50         test_set((int16_t)-30000);
203 1 50         test_set((int32_t)1000000000);
204 1 50         if (ivsize == 8) test_set(9223372036854775807L);
    50          
205 1 50         test_set((uint8_t)255);
206 1 50         test_set((uint16_t)65535);
207 1 50         test_set((uint32_t)4000000000);
208 1 50         if (ivsize == 8) test_set(18446744073709551615LU);
    50          
209 1 50         test_set(5.5f);
210 1 50         test_set(222222222.222222);
211             }
212 3 50         SECTION("string") {
    50          
    50          
    50          
    100          
213 2 50         Simple o("xxxx");
214 1 50         o.set("abcd");
215 1 50         REQUIRE(o.is_string());
    50          
    50          
    50          
    0          
    0          
216 1 50         REQUIRE(string_view(SvPVX(o), 4) == "abcd");
    50          
    50          
    50          
    50          
    0          
    0          
217 1 50         REQUIRE(SvCUR(o) == 4);
    50          
    50          
    50          
    50          
    0          
    0          
218              
219 1 50         o.set(string_view("suka blya"));
220 1 50         REQUIRE(o.is_string());
    50          
    50          
    50          
    0          
    0          
221 1 50         REQUIRE(string_view(SvPVX(o), 9) == "suka blya");
    50          
    50          
    50          
    50          
    0          
    0          
222 1 50         REQUIRE(SvCUR(o) == 9);
    50          
    50          
    50          
    50          
    0          
    0          
223             }
224             }
225              
226 102 50         SECTION("cast") {
    50          
    50          
    50          
    100          
227 4 50         SECTION("to number") {
    50          
    50          
    50          
    100          
228 1 50         test_cast((int8_t)-5);
229 1 50         test_cast((int16_t)-30000);
230 1 50         test_cast((int32_t)1000000000);
231 1 50         if (ivsize == 8) test_cast(9223372036854775807L);
    50          
232 1 50         test_cast((uint8_t)255);
233 1 50         test_cast((uint16_t)65535);
234 1 50         test_cast((uint32_t)4000000000);
235 1 50         if (ivsize == 8) test_cast(18446744073709551615LU);
    50          
236 1 50         test_cast(5.5f);
237 1 50         test_cast(222222222.222222);
238             }
239 4 50         SECTION("to string_view") {
    50          
    50          
    50          
    100          
240 2           Simple o;
241 1 50         REQUIRE(o.c_str() == nullptr);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
242 1 50         REQUIRE((string_view)o == string_view());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
243              
244 1 50         o = Sv::create();
    50          
245 1 50         REQUIRE(strlen(o.c_str()) == 0);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
246 1 50         REQUIRE((string_view)o == string_view());
    50          
    50          
    50          
    50          
    50          
    0          
    0          
247              
248 1           const char* src = "epta";
249 1 50         o = src;
250 1 50         REQUIRE(strlen(o.c_str()) == 4);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
251 1 50         REQUIRE(!strcmp(o.c_str(), src));
    50          
    50          
    50          
    50          
    0          
    0          
252 1 50         REQUIRE(o.c_str() != src);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
253 1 50         REQUIRE(strlen(o.get()) == 4);
    50          
    50          
    50          
    50          
    0          
    0          
254 1 50         REQUIRE(!strcmp(o.get(), src));
    50          
    50          
    50          
    0          
    0          
255 1 50         REQUIRE(o.get() != src);
    50          
    50          
    50          
    50          
    0          
    0          
256 1 50         REQUIRE((string_view)o == string_view(src));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
257 1 50         REQUIRE(((string_view)o).data() != src);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
258             }
259 4 50         SECTION("to SV") {
    50          
    50          
    50          
    100          
260 2 50         Simple o(vars.iv);
261 1           auto cnt = SvREFCNT(vars.iv);
262 1           SV* r = o;
263 1 50         REQUIRE(r == vars.iv);
    50          
    50          
    50          
    50          
    0          
    0          
264 1 50         REQUIRE(SvREFCNT(vars.iv) == cnt);
    50          
    50          
    50          
    50          
    0          
    0          
265             }
266             }
267              
268 102 50         SECTION("as_string") {
    50          
    50          
    50          
    100          
269 3 50         SECTION("string_view") { test_as_string(); }
    50          
    50          
    50          
    100          
    50          
270 3 50         SECTION("std::string") { test_as_string(); }
    50          
    50          
    50          
    100          
    50          
271 3 50         SECTION("panda::string") { test_as_string(); }
    50          
    50          
    50          
    100          
    50          
272             }
273              
274 102 50         SECTION("get") {
    50          
    50          
    50          
    100          
275 4 50         SECTION("number") {
    50          
    50          
    50          
    100          
276 1 50         test_get((int8_t)-5);
277 1 50         test_get((int16_t)-30000);
278 1 50         test_get((int32_t)1000000000);
279 1 50         if (ivsize == 8) test_get(9223372036854775807L);
    50          
280 1 50         test_get((uint8_t)255);
281 1 50         test_get((uint16_t)65535);
282 1 50         test_get((uint32_t)4000000000);
283 1 50         if (ivsize == 8) test_get(18446744073709551615LU);
    50          
284 1 50         test_get(5.5f);
285 1 50         test_get(222222222.222222);
286             }
287 4 50         SECTION("string") {
    50          
    50          
    50          
    100          
288 2 50         Simple o(vars.pv);
289 1 50         REQUIRE(o.get() == SvPVX(vars.pv));
    50          
    50          
    50          
    50          
    0          
    0          
290 1 50         REQUIRE(o.get() == string_view("hello"));
    50          
    50          
    50          
    50          
    0          
    0          
291 1 50         REQUIRE(o.get().data() == SvPVX(vars.pv));
    50          
    50          
    50          
    50          
    0          
    0          
292             }
293 4 50         SECTION("SV") {
    50          
    50          
    50          
    100          
294 2 50         Simple o(vars.iv);
295 1           auto cnt = SvREFCNT(vars.iv);
296 1 50         REQUIRE(o.get() == vars.iv);
    50          
    50          
    50          
    50          
    0          
    0          
297 1 50         REQUIRE(SvREFCNT(vars.iv) == cnt);
    50          
    50          
    50          
    50          
    0          
    0          
298             }
299             }
300              
301 100 50         SECTION("length") {
    50          
    50          
    50          
    100          
302 2 50         Simple o = vars.pv;
303 1 50         REQUIRE(o.length() == 5);
    50          
    50          
    50          
    50          
    0          
    0          
304 1           o.length(3);
305 1 50         REQUIRE(o.length() == 3);
    50          
    50          
    50          
    50          
    0          
    0          
306 1 50         REQUIRE((string_view)o == "hel");
    50          
    50          
    50          
    50          
    50          
    0          
    0          
307             }
308              
309 100 50         SECTION("upgrade") {
    50          
    50          
    50          
    100          
310 2 50         Simple o = vars.iv;
311 1 50         o.upgrade(SVt_PVMG); // upgrade till PVMG works
312 1 50         REQUIRE(o.type() == SVt_PVMG);
    50          
    50          
    50          
    50          
    0          
    0          
313             }
314              
315 100 50         SECTION("capacity / create with capacity") {
    50          
    50          
    50          
    100          
316 2 50         Simple o = vars.pv;
317 1 50         REQUIRE(o.capacity() >= 6);
    50          
    50          
    50          
    50          
    0          
    0          
318 1 50         o = Simple::create(100);
319 1 50         REQUIRE(o.capacity() >= 100);
    50          
    50          
    50          
    50          
    0          
    0          
320 1 50         REQUIRE(o.length() == 0);
    50          
    50          
    50          
    50          
    0          
    0          
321 1           char* buf = o.get();
322 1           *buf++ = 'j';
323 1           *buf++ = 'o';
324 1           *buf++ = 'p';
325 1           *buf++ = 'a';
326 1           *buf++ = 0;
327 1           o.length(4);
328 1 50         REQUIRE((string_view)o == string_view("jopa"));
    50          
    50          
    50          
    50          
    50          
    0          
    0          
329             }
330              
331 100 50         SECTION("shared") {
    50          
    50          
    50          
    100          
332 2 50         Simple o("str");
333 2 50         Simple o2("str");
334 1 50         REQUIRE(o.get() != o2.get());
    50          
    50          
    50          
    50          
    0          
    0          
335              
336 1 50         o = Simple::shared("str");
337 1 50         o2 = Simple::shared("str");
338 1 50         REQUIRE(o.get() == o2.get());
    50          
    50          
    50          
    50          
    0          
    0          
339             }
340              
341 100 50         SECTION("is_shared") {
    50          
    50          
    50          
    100          
342 2           Simple o;
343 1 50         REQUIRE(!o.is_shared());
    50          
    50          
    50          
    0          
    0          
344 1 50         o = Simple("hello");
345 1 50         REQUIRE(!o.is_shared());
    50          
    50          
    50          
    0          
    0          
346 1 50         o = Simple::shared("hello");
347 1 50         REQUIRE(o.is_shared());
    50          
    50          
    50          
    0          
    0          
348             }
349              
350 100 50         SECTION("hek") {
    50          
    50          
    50          
    100          
351 2 50         auto o = Simple::shared("world");
352 1           auto hek = o.hek();
353 1 50         REQUIRE(string_view(HEK_KEY(hek), HEK_LEN(hek)) == "world");
    50          
    50          
    50          
    50          
    0          
    0          
354             }
355              
356 100 50         SECTION("hash") {
    50          
    50          
    50          
    100          
357 2           Simple o;
358 1 50         REQUIRE(o.hash() == 0);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
359 1 50         o = "mystring";
360             U32 h;
361 1           PERL_HASH(h, "mystring", 8);
362 1 50         REQUIRE(o.hash() == h);
    50          
    50          
    50          
    50          
    50          
    0          
    0          
363             }
364              
365 100 50         SECTION("const operator[]") {
    50          
    50          
    50          
    100          
366 2 50         const Simple o("hello world");
367 1 50         REQUIRE(o[0] == 'h');
    50          
    50          
    50          
    50          
    0          
    0          
368 1 50         REQUIRE(o[10] == 'd');
    50          
    50          
    50          
    50          
    0          
    0          
369             }
370              
371 100 50         SECTION("operator[]") {
    50          
    50          
    50          
    100          
372 2 50         Simple o("hello world");
373 1 50         REQUIRE(o[0] == 'h');
    50          
    50          
    50          
    50          
    0          
    0          
374 1 50         REQUIRE(o[10] == 'd');
    50          
    50          
    50          
    50          
    0          
    0          
375 1           o[10] = 's';
376 1 50         REQUIRE(o[10] == 's');
    50          
    50          
    50          
    50          
    0          
    0          
377 1 50         REQUIRE(o.get() == string_view("hello worls"));
    50          
    50          
    50          
    50          
    0          
    0          
378             }
379              
380 103 50         SECTION("at") {
    50          
    50          
    50          
    100          
381 5 50         SECTION("string") {
    50          
    50          
    50          
    100          
382 2 50         Simple o("hello world");
383 1 50         REQUIRE(o.at(0) == 'h');
    50          
    50          
    50          
    50          
    50          
    0          
    0          
384 1 50         REQUIRE(o.at(10) == 'd');
    50          
    50          
    50          
    50          
    50          
    0          
    0          
385 1 50         REQUIRE_THROWS(o.at(11));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
386             }
387 5 50         SECTION("empty obj") {
    50          
    50          
    50          
    100          
388 2           Simple o;
389 1 50         REQUIRE_THROWS(o.at(0));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
390             }
391 5 50         SECTION("empty string") {
    50          
    50          
    50          
    100          
392 2 50         Simple o("");
393 1 50         REQUIRE_THROWS(o.at(0));
    50          
    50          
    50          
    0          
    0          
    50          
    50          
    50          
394             }
395 5 50         SECTION("number") {
    50          
    50          
    50          
    100          
396 2 50         Simple o(100);
397 1 50         REQUIRE(o.at(0) == '1');
    50          
    50          
    50          
    50          
    50          
    0          
    0          
398             }
399             }
400 235 50         }
    50