LCOV - code coverage report
Current view: top level - src/univalue/test - object.cpp (source / functions) Coverage Total Hit
Test: total_coverage.info Lines: 100.0 % 331 331
Test Date: 2026-02-04 05:05:50 Functions: 100.0 % 8 8
Branches: 50.0 % 1034 517

             Branch data     Line data    Source code
       1                 :             : // Copyright (c) 2014 BitPay Inc.
       2                 :             : // Copyright (c) 2014-present The Bitcoin Core developers
       3                 :             : // Distributed under the MIT software license, see the accompanying
       4                 :             : // file COPYING or https://opensource.org/licenses/mit-license.php.
       5                 :             : 
       6                 :             : #include <univalue.h>
       7                 :             : 
       8                 :             : #include <cassert>
       9                 :             : #include <cstdint>
      10                 :             : #include <map>
      11                 :             : #include <stdexcept>
      12                 :             : #include <string>
      13                 :             : #include <string_view>
      14                 :             : #include <vector>
      15                 :             : 
      16                 :             : #define BOOST_CHECK(expr) assert(expr)
      17                 :             : #define BOOST_CHECK_EQUAL(v1, v2) assert((v1) == (v2))
      18                 :             : #define BOOST_CHECK_THROW(stmt, excMatch) { \
      19                 :             :         try { \
      20                 :             :             (stmt); \
      21                 :             :             assert(0 && "No exception caught"); \
      22                 :             :         } catch (excMatch&) { \
      23                 :             :         } catch (...) { \
      24                 :             :             assert(0 && "Wrong exception caught"); \
      25                 :             :         } \
      26                 :             :     }
      27                 :             : #define BOOST_CHECK_NO_THROW(stmt) { \
      28                 :             :         try { \
      29                 :             :             (stmt); \
      30                 :             :         } catch (...) { \
      31                 :             :             assert(0); \
      32                 :             :         } \
      33                 :             :     }
      34                 :             : 
      35                 :           1 : void univalue_constructor()
      36                 :             : {
      37                 :           1 :     UniValue v1;
      38                 :           1 :     BOOST_CHECK(v1.isNull());
      39                 :             : 
      40                 :           1 :     UniValue v2(UniValue::VSTR);
      41         [ -  + ]:           1 :     BOOST_CHECK(v2.isStr());
      42                 :             : 
      43         [ +  - ]:           2 :     UniValue v3(UniValue::VSTR, "foo");
      44         [ -  + ]:           1 :     BOOST_CHECK(v3.isStr());
      45         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v3.getValStr(), "foo");
      46                 :             : 
      47         [ +  - ]:           1 :     UniValue numTest;
      48   [ +  -  +  - ]:           1 :     numTest.setNumStr("82");
      49         [ -  + ]:           1 :     BOOST_CHECK(numTest.isNum());
      50         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(numTest.getValStr(), "82");
      51                 :             : 
      52                 :           1 :     uint64_t vu64 = 82;
      53         [ +  - ]:           1 :     UniValue v4(vu64);
      54         [ -  + ]:           1 :     BOOST_CHECK(v4.isNum());
      55         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v4.getValStr(), "82");
      56                 :             : 
      57                 :           1 :     int64_t vi64 = -82;
      58         [ +  - ]:           1 :     UniValue v5(vi64);
      59         [ -  + ]:           1 :     BOOST_CHECK(v5.isNum());
      60         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v5.getValStr(), "-82");
      61                 :             : 
      62                 :           1 :     int vi = -688;
      63         [ +  - ]:           1 :     UniValue v6(vi);
      64         [ -  + ]:           1 :     BOOST_CHECK(v6.isNum());
      65         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v6.getValStr(), "-688");
      66                 :             : 
      67                 :           1 :     double vd = -7.21;
      68         [ +  - ]:           1 :     UniValue v7(vd);
      69         [ -  + ]:           1 :     BOOST_CHECK(v7.isNum());
      70         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v7.getValStr(), "-7.21");
      71                 :             : 
      72         [ +  - ]:           1 :     std::string vs("yawn");
      73         [ +  - ]:           1 :     UniValue v8(vs);
      74         [ -  + ]:           1 :     BOOST_CHECK(v8.isStr());
      75         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v8.getValStr(), "yawn");
      76                 :             : 
      77                 :           1 :     const char *vcs = "zappa";
      78         [ +  - ]:           1 :     UniValue v9(vcs);
      79         [ -  + ]:           1 :     BOOST_CHECK(v9.isStr());
      80         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v9.getValStr(), "zappa");
      81                 :           1 : }
      82                 :             : 
      83                 :           1 : void univalue_push_throw()
      84                 :             : {
      85         [ +  - ]:           1 :     UniValue j;
      86   [ +  -  -  +  :           2 :     BOOST_CHECK_THROW(j.push_back(1), std::runtime_error);
                   +  - ]
      87   [ +  -  -  +  :           4 :     BOOST_CHECK_THROW(j.push_backV({1}), std::runtime_error);
          -  -  +  +  +  
                      - ]
      88   [ +  -  -  +  :           3 :     BOOST_CHECK_THROW(j.pushKVEnd("k", 1), std::runtime_error);
             +  -  +  - ]
      89   [ +  -  -  +  :           3 :     BOOST_CHECK_THROW(j.pushKV("k", 1), std::runtime_error);
             +  -  +  - ]
      90   [ -  +  +  - ]:           2 :     BOOST_CHECK_THROW(j.pushKVs({}), std::runtime_error);
      91         [ +  - ]:           2 : }
      92                 :             : 
      93                 :           1 : void univalue_typecheck()
      94                 :             : {
      95         [ +  - ]:           1 :     UniValue v1;
      96   [ +  -  +  - ]:           1 :     v1.setNumStr("1");
      97         [ -  + ]:           1 :     BOOST_CHECK(v1.isNum());
      98   [ -  +  +  - ]:           1 :     BOOST_CHECK_THROW(v1.get_bool(), std::runtime_error);
      99                 :             : 
     100                 :           1 :     {
     101         [ +  - ]:           1 :         UniValue v_negative;
     102   [ +  -  +  - ]:           1 :         v_negative.setNumStr("-1");
     103   [ -  +  +  - ]:           1 :         BOOST_CHECK_THROW(v_negative.getInt<uint8_t>(), std::runtime_error);
     104   [ -  +  +  - ]:           1 :         BOOST_CHECK_EQUAL(v_negative.getInt<int8_t>(), -1);
     105                 :           1 :     }
     106                 :             : 
     107         [ +  - ]:           1 :     UniValue v2;
     108         [ +  - ]:           1 :     v2.setBool(true);
     109   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(v2.get_bool(), true);
     110   [ -  +  +  - ]:           1 :     BOOST_CHECK_THROW(v2.getInt<int>(), std::runtime_error);
     111                 :             : 
     112         [ +  - ]:           1 :     UniValue v3;
     113   [ +  -  +  - ]:           1 :     v3.setNumStr("32482348723847471234");
     114   [ -  +  +  - ]:           1 :     BOOST_CHECK_THROW(v3.getInt<int64_t>(), std::runtime_error);
     115   [ +  -  +  - ]:           1 :     v3.setNumStr("1000");
     116   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(v3.getInt<int64_t>(), 1000);
     117                 :             : 
     118         [ +  - ]:           1 :     UniValue v4;
     119   [ +  -  +  - ]:           1 :     v4.setNumStr("2147483648");
     120   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(v4.getInt<int64_t>(), 2147483648);
     121   [ -  +  +  - ]:           1 :     BOOST_CHECK_THROW(v4.getInt<int>(), std::runtime_error);
     122   [ +  -  +  - ]:           1 :     v4.setNumStr("1000");
     123   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(v4.getInt<int>(), 1000);
     124   [ -  +  +  - ]:           1 :     BOOST_CHECK_THROW(v4.get_str(), std::runtime_error);
     125   [ -  +  +  - ]:           1 :     BOOST_CHECK_EQUAL(v4.get_real(), 1000);
     126   [ -  +  +  - ]:           1 :     BOOST_CHECK_THROW(v4.get_array(), std::runtime_error);
     127   [ -  +  +  - ]:           1 :     BOOST_CHECK_THROW(v4.getKeys(), std::runtime_error);
     128   [ -  +  +  - ]:           1 :     BOOST_CHECK_THROW(v4.getValues(), std::runtime_error);
     129   [ -  +  +  - ]:           1 :     BOOST_CHECK_THROW(v4.get_obj(), std::runtime_error);
     130                 :             : 
     131         [ +  - ]:           1 :     UniValue v5;
     132   [ -  +  +  - ]:           1 :     BOOST_CHECK(v5.read("[true, 10]"));
     133         [ +  - ]:           1 :     BOOST_CHECK_NO_THROW(v5.get_array());
     134   [ +  -  +  - ]:           1 :     std::vector<UniValue> vals = v5.getValues();
     135   [ -  +  +  - ]:           1 :     BOOST_CHECK_THROW(vals[0].getInt<int>(), std::runtime_error);
     136   [ -  +  +  - ]:           1 :     BOOST_CHECK_EQUAL(vals[0].get_bool(), true);
     137                 :             : 
     138   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(vals[1].getInt<int>(), 10);
     139   [ -  +  +  - ]:           1 :     BOOST_CHECK_THROW(vals[1].get_bool(), std::runtime_error);
     140                 :           1 : }
     141                 :             : 
     142                 :           1 : void univalue_set()
     143                 :             : {
     144                 :           2 :     UniValue v(UniValue::VSTR, "foo");
     145         [ +  - ]:           1 :     v.clear();
     146         [ -  + ]:           1 :     BOOST_CHECK(v.isNull());
     147         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "");
     148                 :             : 
     149         [ +  - ]:           1 :     v.setObject();
     150         [ -  + ]:           1 :     BOOST_CHECK(v.isObject());
     151   [ -  +  -  + ]:           1 :     BOOST_CHECK_EQUAL(v.size(), 0);
     152                 :           1 :     BOOST_CHECK_EQUAL(v.getType(), UniValue::VOBJ);
     153         [ +  - ]:           1 :     BOOST_CHECK(v.empty());
     154                 :             : 
     155         [ +  - ]:           1 :     v.setArray();
     156         [ -  + ]:           1 :     BOOST_CHECK(v.isArray());
     157   [ -  +  -  + ]:           1 :     BOOST_CHECK_EQUAL(v.size(), 0);
     158                 :             : 
     159   [ +  -  +  - ]:           1 :     v.setStr("zum");
     160         [ -  + ]:           1 :     BOOST_CHECK(v.isStr());
     161         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "zum");
     162                 :             : 
     163                 :           1 :     {
     164                 :           1 :         std::string_view sv{"ab\0c", 4};
     165         [ +  - ]:           1 :         UniValue j{sv};
     166         [ -  + ]:           1 :         BOOST_CHECK(j.isStr());
     167   [ -  +  -  + ]:           1 :         BOOST_CHECK_EQUAL(j.getValStr(), sv);
     168   [ +  -  -  + ]:           1 :         BOOST_CHECK_EQUAL(j.write(), "\"ab\\u0000c\"");
     169                 :           1 :     }
     170                 :             : 
     171         [ +  - ]:           1 :     v.setFloat(-1.01);
     172         [ -  + ]:           1 :     BOOST_CHECK(v.isNum());
     173         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "-1.01");
     174                 :             : 
     175         [ +  - ]:           1 :     v.setInt(int{1023});
     176         [ -  + ]:           1 :     BOOST_CHECK(v.isNum());
     177         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "1023");
     178                 :             : 
     179         [ +  - ]:           1 :     v.setInt(int64_t{-1023LL});
     180         [ -  + ]:           1 :     BOOST_CHECK(v.isNum());
     181         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "-1023");
     182                 :             : 
     183         [ +  - ]:           1 :     v.setInt(uint64_t{1023ULL});
     184         [ -  + ]:           1 :     BOOST_CHECK(v.isNum());
     185         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "1023");
     186                 :             : 
     187   [ +  -  +  - ]:           1 :     v.setNumStr("-688");
     188         [ -  + ]:           1 :     BOOST_CHECK(v.isNum());
     189         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "-688");
     190                 :             : 
     191         [ +  - ]:           1 :     v.setBool(false);
     192         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.isBool(), true);
     193         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.isTrue(), false);
     194         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.isFalse(), true);
     195   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(v.get_bool(), false);
     196                 :             : 
     197         [ +  - ]:           1 :     v.setBool(true);
     198         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.isBool(), true);
     199         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.isTrue(), true);
     200         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(v.isFalse(), false);
     201   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(v.get_bool(), true);
     202                 :             : 
     203   [ +  -  -  +  :           2 :     BOOST_CHECK_THROW(v.setNumStr("zombocom"), std::runtime_error);
                   +  - ]
     204                 :             : 
     205         [ +  - ]:           1 :     v.setNull();
     206         [ -  + ]:           1 :     BOOST_CHECK(v.isNull());
     207                 :           1 : }
     208                 :             : 
     209                 :           1 : void univalue_array()
     210                 :             : {
     211                 :           1 :     UniValue arr(UniValue::VARR);
     212                 :             : 
     213         [ +  - ]:           1 :     UniValue v((int64_t)1023LL);
     214   [ +  -  +  - ]:           1 :     arr.push_back(v);
     215                 :             : 
     216         [ +  - ]:           1 :     std::string vStr("zippy");
     217   [ +  -  +  - ]:           1 :     arr.push_back(vStr);
     218                 :             : 
     219                 :           1 :     const char *s = "pippy";
     220   [ +  -  +  - ]:           1 :     arr.push_back(s);
     221                 :             : 
     222                 :           1 :     std::vector<UniValue> vec;
     223   [ +  -  +  - ]:           1 :     v.setStr("boing");
     224         [ +  - ]:           1 :     vec.push_back(v);
     225                 :             : 
     226   [ +  -  +  - ]:           1 :     v.setStr("going");
     227         [ +  - ]:           1 :     vec.push_back(v);
     228                 :             : 
     229         [ +  - ]:           1 :     arr.push_backV(vec);
     230                 :             : 
     231   [ +  -  +  - ]:           1 :     arr.push_back(uint64_t{400ULL});
     232   [ +  -  +  - ]:           1 :     arr.push_back(int64_t{-400LL});
     233   [ +  -  +  - ]:           1 :     arr.push_back(int{-401});
     234   [ +  -  +  - ]:           1 :     arr.push_back(-40.1);
     235   [ +  -  +  - ]:           1 :     arr.push_back(true);
     236                 :             : 
     237   [ -  +  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr.empty(), false);
     238         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(arr.size(), 10);
     239                 :             : 
     240   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[0].getValStr(), "1023");
     241   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[0].getType(), UniValue::VNUM);
     242   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[1].getValStr(), "zippy");
     243   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[1].getType(), UniValue::VSTR);
     244   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[2].getValStr(), "pippy");
     245   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[2].getType(), UniValue::VSTR);
     246   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[3].getValStr(), "boing");
     247   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[3].getType(), UniValue::VSTR);
     248   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[4].getValStr(), "going");
     249   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[4].getType(), UniValue::VSTR);
     250   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[5].getValStr(), "400");
     251   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[5].getType(), UniValue::VNUM);
     252   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[6].getValStr(), "-400");
     253   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[6].getType(), UniValue::VNUM);
     254   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[7].getValStr(), "-401");
     255   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[7].getType(), UniValue::VNUM);
     256   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[8].getValStr(), "-40.1");
     257   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[8].getType(), UniValue::VNUM);
     258   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[9].getValStr(), "1");
     259   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[9].getType(), UniValue::VBOOL);
     260                 :             : 
     261   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(arr[999].getValStr(), "");
     262                 :             : 
     263         [ +  - ]:           1 :     arr.clear();
     264   [ -  +  -  + ]:           1 :     BOOST_CHECK(arr.empty());
     265                 :           1 :     BOOST_CHECK_EQUAL(arr.size(), 0);
     266                 :           1 : }
     267                 :             : 
     268                 :           1 : void univalue_object()
     269                 :             : {
     270                 :           1 :     UniValue obj(UniValue::VOBJ);
     271         [ +  - ]:           1 :     std::string strKey, strVal;
     272         [ +  - ]:           1 :     UniValue v;
     273                 :             : 
     274         [ +  - ]:           1 :     strKey = "age";
     275         [ +  - ]:           1 :     v.setInt(100);
     276   [ +  -  +  - ]:           3 :     obj.pushKV(strKey, v);
     277                 :             : 
     278         [ +  - ]:           1 :     strKey = "first";
     279         [ +  - ]:           1 :     strVal = "John";
     280   [ +  -  +  - ]:           3 :     obj.pushKV(strKey, strVal);
     281                 :             : 
     282         [ +  - ]:           1 :     strKey = "last";
     283                 :           1 :     const char* cVal = "Smith";
     284   [ +  -  +  - ]:           3 :     obj.pushKV(strKey, cVal);
     285                 :             : 
     286         [ +  - ]:           1 :     strKey = "distance";
     287   [ +  -  +  - ]:           3 :     obj.pushKV(strKey, int64_t{25});
     288                 :             : 
     289         [ +  - ]:           1 :     strKey = "time";
     290   [ +  -  +  - ]:           3 :     obj.pushKV(strKey, uint64_t{3600});
     291                 :             : 
     292         [ +  - ]:           1 :     strKey = "calories";
     293   [ +  -  +  - ]:           3 :     obj.pushKV(strKey, int{12});
     294                 :             : 
     295         [ +  - ]:           1 :     strKey = "temperature";
     296   [ +  -  +  - ]:           3 :     obj.pushKV(strKey, double{90.012});
     297                 :             : 
     298         [ +  - ]:           1 :     strKey = "moon";
     299   [ +  -  +  - ]:           3 :     obj.pushKV(strKey, true);
     300                 :             : 
     301         [ +  - ]:           1 :     strKey = "spoon";
     302   [ +  -  +  - ]:           3 :     obj.pushKV(strKey, false);
     303                 :             : 
     304                 :           1 :     UniValue obj2(UniValue::VOBJ);
     305   [ +  -  +  -  :           2 :     obj2.pushKV("cat1", 9000);
                   +  - ]
     306   [ +  -  +  -  :           2 :     obj2.pushKV("cat2", 12345);
                   +  - ]
     307                 :             : 
     308   [ +  -  +  - ]:           1 :     obj.pushKVs(obj2);
     309                 :             : 
     310   [ -  +  -  + ]:           1 :     BOOST_CHECK_EQUAL(obj.empty(), false);
     311         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(obj.size(), 11);
     312                 :             : 
     313   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["age"].getValStr(), "100");
                   -  + ]
     314   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["first"].getValStr(), "John");
                   -  + ]
     315   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["last"].getValStr(), "Smith");
                   -  + ]
     316   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["distance"].getValStr(), "25");
                   -  + ]
     317   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["time"].getValStr(), "3600");
                   -  + ]
     318   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["calories"].getValStr(), "12");
                   -  + ]
     319   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["temperature"].getValStr(), "90.012");
                   -  + ]
     320   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["moon"].getValStr(), "1");
                   -  + ]
     321   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["spoon"].getValStr(), "");
                   -  + ]
     322   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["cat1"].getValStr(), "9000");
                   -  + ]
     323   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["cat2"].getValStr(), "12345");
                   -  + ]
     324                 :             : 
     325   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["nyuknyuknyuk"].getValStr(), "");
                   -  + ]
     326                 :             : 
     327   [ +  -  -  + ]:           2 :     BOOST_CHECK(obj.exists("age"));
     328   [ +  -  -  + ]:           2 :     BOOST_CHECK(obj.exists("first"));
     329   [ +  -  -  + ]:           2 :     BOOST_CHECK(obj.exists("last"));
     330   [ +  -  -  + ]:           2 :     BOOST_CHECK(obj.exists("distance"));
     331   [ +  -  -  + ]:           2 :     BOOST_CHECK(obj.exists("time"));
     332   [ +  -  -  + ]:           2 :     BOOST_CHECK(obj.exists("calories"));
     333   [ +  -  -  + ]:           2 :     BOOST_CHECK(obj.exists("temperature"));
     334   [ +  -  -  + ]:           2 :     BOOST_CHECK(obj.exists("moon"));
     335   [ +  -  -  + ]:           2 :     BOOST_CHECK(obj.exists("spoon"));
     336   [ +  -  -  + ]:           2 :     BOOST_CHECK(obj.exists("cat1"));
     337   [ +  -  -  + ]:           2 :     BOOST_CHECK(obj.exists("cat2"));
     338                 :             : 
     339   [ +  -  -  + ]:           2 :     BOOST_CHECK(!obj.exists("nyuknyuknyuk"));
     340                 :             : 
     341         [ +  - ]:           1 :     std::map<std::string, UniValue::VType> objTypes;
     342   [ +  -  +  - ]:           1 :     objTypes["age"] = UniValue::VNUM;
     343   [ +  -  +  - ]:           1 :     objTypes["first"] = UniValue::VSTR;
     344   [ +  -  +  - ]:           1 :     objTypes["last"] = UniValue::VSTR;
     345   [ +  -  +  - ]:           1 :     objTypes["distance"] = UniValue::VNUM;
     346   [ +  -  +  - ]:           1 :     objTypes["time"] = UniValue::VNUM;
     347   [ +  -  +  - ]:           1 :     objTypes["calories"] = UniValue::VNUM;
     348   [ +  -  +  - ]:           1 :     objTypes["temperature"] = UniValue::VNUM;
     349   [ +  -  +  - ]:           1 :     objTypes["moon"] = UniValue::VBOOL;
     350   [ +  -  +  - ]:           1 :     objTypes["spoon"] = UniValue::VBOOL;
     351   [ +  -  +  - ]:           1 :     objTypes["cat1"] = UniValue::VNUM;
     352   [ +  -  +  - ]:           1 :     objTypes["cat2"] = UniValue::VNUM;
     353   [ +  -  -  + ]:           1 :     BOOST_CHECK(obj.checkObject(objTypes));
     354                 :             : 
     355   [ +  -  +  - ]:           1 :     objTypes["cat2"] = UniValue::VSTR;
     356   [ +  -  -  + ]:           1 :     BOOST_CHECK(!obj.checkObject(objTypes));
     357                 :             : 
     358         [ +  - ]:           1 :     obj.clear();
     359   [ -  +  -  + ]:           1 :     BOOST_CHECK(obj.empty());
     360         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(obj.size(), 0);
     361         [ -  + ]:           1 :     BOOST_CHECK_EQUAL(obj.getType(), UniValue::VNULL);
     362                 :             : 
     363         [ +  - ]:           1 :     obj.setObject();
     364         [ +  - ]:           1 :     UniValue uv;
     365         [ +  - ]:           1 :     uv.setInt(42);
     366   [ +  -  +  -  :           2 :     obj.pushKVEnd("age", uv);
                   +  - ]
     367   [ -  +  -  + ]:           1 :     BOOST_CHECK_EQUAL(obj.size(), 1);
     368   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["age"].getValStr(), "42");
                   -  + ]
     369                 :             : 
     370         [ +  - ]:           1 :     uv.setInt(43);
     371   [ +  -  +  -  :           2 :     obj.pushKV("age", uv);
                   +  - ]
     372   [ -  +  -  + ]:           1 :     BOOST_CHECK_EQUAL(obj.size(), 1);
     373   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["age"].getValStr(), "43");
                   -  + ]
     374                 :             : 
     375   [ +  -  +  -  :           2 :     obj.pushKV("name", "foo bar");
                   +  - ]
     376                 :             : 
     377         [ +  - ]:           1 :     std::map<std::string,UniValue> kv;
     378         [ +  - ]:           1 :     obj.getObjMap(kv);
     379   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(kv["age"].getValStr(), "43");
                   -  + ]
     380   [ +  -  +  -  :           2 :     BOOST_CHECK_EQUAL(kv["name"].getValStr(), "foo bar");
                   -  + ]
     381                 :             : 
     382                 :           1 : }
     383                 :             : 
     384                 :             : static const char *json1 =
     385                 :             : "[1.10000000,{\"key1\":\"str\\u0000\",\"key2\":800,\"key3\":{\"name\":\"martian http://test.com\"}}]";
     386                 :             : 
     387                 :           1 : void univalue_readwrite()
     388                 :             : {
     389         [ +  - ]:           1 :     UniValue v;
     390   [ +  -  -  + ]:           1 :     BOOST_CHECK(v.read(json1));
     391                 :             : 
     392         [ +  - ]:           1 :     std::string strJson1(json1);
     393   [ -  +  +  -  :           1 :     BOOST_CHECK(v.read(strJson1));
                   -  + ]
     394                 :             : 
     395         [ -  + ]:           1 :     BOOST_CHECK(v.isArray());
     396   [ -  +  -  + ]:           1 :     BOOST_CHECK_EQUAL(v.size(), 2);
     397                 :             : 
     398   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(v[0].getValStr(), "1.10000000");
     399                 :             : 
     400   [ +  -  +  - ]:           1 :     UniValue obj = v[1];
     401         [ -  + ]:           1 :     BOOST_CHECK(obj.isObject());
     402   [ -  +  -  + ]:           1 :     BOOST_CHECK_EQUAL(obj.size(), 3);
     403                 :             : 
     404   [ +  -  +  -  :           1 :     BOOST_CHECK(obj["key1"].isStr());
                   -  + ]
     405         [ +  - ]:           1 :     std::string correctValue("str");
     406         [ +  - ]:           1 :     correctValue.push_back('\0');
     407   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["key1"].getValStr(), correctValue);
                   -  + ]
     408   [ +  -  +  -  :           1 :     BOOST_CHECK(obj["key2"].isNum());
                   -  + ]
     409   [ +  -  +  -  :           1 :     BOOST_CHECK_EQUAL(obj["key2"].getValStr(), "800");
                   -  + ]
     410   [ +  -  +  -  :           1 :     BOOST_CHECK(obj["key3"].isObject());
                   -  + ]
     411                 :             : 
     412   [ +  -  -  + ]:           1 :     BOOST_CHECK_EQUAL(strJson1, v.write());
     413                 :             : 
     414                 :             :     // Valid
     415   [ +  -  +  -  :           1 :     BOOST_CHECK(v.read("1.0") && (v.get_real() == 1.0));
             +  -  -  + ]
     416   [ +  -  +  -  :           1 :     BOOST_CHECK(v.read("true") && v.get_bool());
             +  -  -  + ]
     417   [ +  -  +  -  :           1 :     BOOST_CHECK(v.read("[false]") && !v[0].get_bool());
          +  -  +  -  -  
                      + ]
     418   [ +  -  +  -  :           1 :     BOOST_CHECK(v.read("{\"a\": true}") && v["a"].get_bool());
          +  -  +  -  +  
                -  -  + ]
     419   [ +  -  +  -  :           1 :     BOOST_CHECK(v.read("{\"1\": \"true\"}") && (v["1"].get_str() == "true"));
          +  -  +  -  +  
                -  -  + ]
     420                 :             :     // Valid, with leading or trailing whitespace
     421   [ +  -  +  -  :           1 :     BOOST_CHECK(v.read(" 1.0") && (v.get_real() == 1.0));
             +  -  -  + ]
     422   [ +  -  +  -  :           1 :     BOOST_CHECK(v.read("1.0 ") && (v.get_real() == 1.0));
             +  -  -  + ]
     423   [ +  -  -  + ]:           1 :     BOOST_CHECK(v.read("0.00000000000000000000000000000000000001e+30 "));
     424                 :             : 
     425   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read(".19e-6")); //should fail, missing leading 0, therefore invalid JSON
     426                 :             :     // Invalid, initial garbage
     427   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("[1.0"));
     428   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("a1.0"));
     429                 :             :     // Invalid, trailing garbage
     430   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("1.0sds"));
     431   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("1.0]"));
     432                 :             :     // Invalid, keys have to be names
     433   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("{1: \"true\"}"));
     434   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("{true: 1}"));
     435   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("{[1]: 1}"));
     436   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("{{\"a\": \"a\"}: 1}"));
     437                 :             :     // BTC addresses should fail parsing
     438   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"));
     439   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("3J98t1WpEZ73CNmQviecrnyiWrnqRhWNL"));
     440                 :             : 
     441                 :             :     /* Check for (correctly reporting) a parsing error if the initial
     442                 :             :        JSON construct is followed by more stuff.  Note that whitespace
     443                 :             :        is, of course, exempt.  */
     444                 :             : 
     445   [ +  -  -  + ]:           1 :     BOOST_CHECK(v.read("  {}\n  "));
     446         [ -  + ]:           1 :     BOOST_CHECK(v.isObject());
     447   [ +  -  -  + ]:           1 :     BOOST_CHECK(v.read("  []\n  "));
     448         [ -  + ]:           1 :     BOOST_CHECK(v.isArray());
     449                 :             : 
     450   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("@{}"));
     451   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("{} garbage"));
     452   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("[]{}"));
     453   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("{}[]"));
     454   [ +  -  -  + ]:           1 :     BOOST_CHECK(!v.read("{} 42"));
     455                 :           1 : }
     456                 :             : 
     457                 :           1 : int main(int argc, char* argv[])
     458                 :             : {
     459                 :           1 :     univalue_constructor();
     460                 :           1 :     univalue_push_throw();
     461                 :           1 :     univalue_typecheck();
     462                 :           1 :     univalue_set();
     463                 :           1 :     univalue_array();
     464                 :           1 :     univalue_object();
     465                 :           1 :     univalue_readwrite();
     466                 :           1 :     return 0;
     467                 :             : }
        

Generated by: LCOV version 2.0-1