LCOV - code coverage report
Current view: top level - src/univalue/test - object.cpp (source / functions) Coverage Total Hit
Test: test_bitcoin_coverage.info Lines: 100.0 % 331 331
Test Date: 2024-11-04 04:45:35 Functions: 100.0 % 8 8
Branches: 50.0 % 1022 511

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

Generated by: LCOV version 2.0-1