LCOV - code coverage report
Current view: top level - src/univalue/test - object.cpp (source / functions) Hit Total Coverage
Test: fuzz_coverage.info Lines: 0 329 0.0 %
Date: 2023-10-05 15:40:34 Functions: 0 8 0.0 %
Branches: 0 0 -

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

Generated by: LCOV version 1.14