LCOV - code coverage report
Current view: top level - src/test - univalue_tests.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 224 224 100.0 %
Date: 2025-02-23 09:33:43 Functions: 12 12 100.0 %

          Line data    Source code
       1             : // Copyright 2014 BitPay, Inc.
       2             : // Copyright (c) 2017-2019 The PIVX Core developers
       3             : // Distributed under the MIT/X11 software license, see the accompanying
       4             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       5             : 
       6             : #include <stdint.h>
       7             : #include <vector>
       8             : #include <string>
       9             : #include <map>
      10             : #include <univalue.h>
      11             : #include "test/test_pivx.h"
      12             : 
      13             : #include <boost/test/unit_test.hpp>
      14             : 
      15             : 
      16             : BOOST_FIXTURE_TEST_SUITE(univalue_tests, BasicTestingSetup)
      17             : 
      18           2 : BOOST_AUTO_TEST_CASE(univalue_constructor)
      19             : {
      20           2 :     UniValue v1;
      21           2 :     BOOST_CHECK(v1.isNull());
      22             : 
      23           2 :     UniValue v2(UniValue::VSTR);
      24           2 :     BOOST_CHECK(v2.isStr());
      25             : 
      26           2 :     UniValue v3(UniValue::VSTR, "foo");
      27           2 :     BOOST_CHECK(v3.isStr());
      28           1 :     BOOST_CHECK_EQUAL(v3.getValStr(), "foo");
      29             : 
      30           2 :     UniValue numTest;
      31           2 :     BOOST_CHECK(numTest.setNumStr("82"));
      32           2 :     BOOST_CHECK(numTest.isNum());
      33           1 :     BOOST_CHECK_EQUAL(numTest.getValStr(), "82");
      34             : 
      35           1 :     uint64_t vu64 = 82;
      36           2 :     UniValue v4(vu64);
      37           2 :     BOOST_CHECK(v4.isNum());
      38           1 :     BOOST_CHECK_EQUAL(v4.getValStr(), "82");
      39             : 
      40           1 :     int64_t vi64 = -82;
      41           2 :     UniValue v5(vi64);
      42           2 :     BOOST_CHECK(v5.isNum());
      43           1 :     BOOST_CHECK_EQUAL(v5.getValStr(), "-82");
      44             : 
      45             :     int vi = -688;
      46           2 :     UniValue v6(vi);
      47           2 :     BOOST_CHECK(v6.isNum());
      48           1 :     BOOST_CHECK_EQUAL(v6.getValStr(), "-688");
      49             : 
      50           1 :     double vd = -7.21;
      51           1 :     UniValue v7(vd);
      52           2 :     BOOST_CHECK(v7.isNum());
      53           1 :     BOOST_CHECK_EQUAL(v7.getValStr(), "-7.21");
      54             : 
      55           2 :     std::string vs("yawn");
      56           2 :     UniValue v8(vs);
      57           2 :     BOOST_CHECK(v8.isStr());
      58           1 :     BOOST_CHECK_EQUAL(v8.getValStr(), "yawn");
      59             : 
      60           1 :     const char *vcs = "zappa";
      61           2 :     UniValue v9(vcs);
      62           2 :     BOOST_CHECK(v9.isStr());
      63           1 :     BOOST_CHECK_EQUAL(v9.getValStr(), "zappa");
      64           1 : }
      65             : 
      66           7 : BOOST_AUTO_TEST_CASE(univalue_typecheck)
      67             : {
      68           2 :     UniValue v1;
      69           2 :     BOOST_CHECK(v1.setNumStr("1"));
      70           2 :     BOOST_CHECK(v1.isNum());
      71           2 :     BOOST_CHECK_THROW(v1.get_bool(), std::runtime_error);
      72             : 
      73           2 :     UniValue v2;
      74           2 :     BOOST_CHECK(v2.setBool(true));
      75           1 :     BOOST_CHECK_EQUAL(v2.get_bool(), true);
      76           2 :     BOOST_CHECK_THROW(v2.get_int(), std::runtime_error);
      77             : 
      78           2 :     UniValue v3;
      79           3 :     BOOST_CHECK(v3.setNumStr("32482348723847471234"));
      80           2 :     BOOST_CHECK_THROW(v3.get_int64(), std::runtime_error);
      81           2 :     BOOST_CHECK(v3.setNumStr("1000"));
      82           1 :     BOOST_CHECK_EQUAL(v3.get_int64(), 1000);
      83             : 
      84           2 :     UniValue v4;
      85           2 :     BOOST_CHECK(v4.setNumStr("2147483648"));
      86           1 :     BOOST_CHECK_EQUAL(v4.get_int64(), 2147483648);
      87           2 :     BOOST_CHECK_THROW(v4.get_int(), std::runtime_error);
      88           2 :     BOOST_CHECK(v4.setNumStr("1000"));
      89           1 :     BOOST_CHECK_EQUAL(v4.get_int(), 1000);
      90           2 :     BOOST_CHECK_THROW(v4.get_str(), std::runtime_error);
      91           1 :     BOOST_CHECK_EQUAL(v4.get_real(), 1000);
      92           2 :     BOOST_CHECK_THROW(v4.get_array(), std::runtime_error);
      93           2 :     BOOST_CHECK_THROW(v4.getKeys(), std::runtime_error);
      94           2 :     BOOST_CHECK_THROW(v4.getValues(), std::runtime_error);
      95           2 :     BOOST_CHECK_THROW(v4.get_obj(), std::runtime_error);
      96             : 
      97           2 :     UniValue v5;
      98           2 :     BOOST_CHECK(v5.read("[true, 10]"));
      99           2 :     BOOST_CHECK_NO_THROW(v5.get_array());
     100           2 :     std::vector<UniValue> vals = v5.getValues();
     101           2 :     BOOST_CHECK_THROW(vals[0].get_int(), std::runtime_error);
     102           1 :     BOOST_CHECK_EQUAL(vals[0].get_bool(), true);
     103             : 
     104           1 :     BOOST_CHECK_EQUAL(vals[1].get_int(), 10);
     105           2 :     BOOST_CHECK_THROW(vals[1].get_bool(), std::runtime_error);
     106           1 : }
     107             : 
     108           2 : BOOST_AUTO_TEST_CASE(univalue_set)
     109             : {
     110           2 :     UniValue v(UniValue::VSTR, "foo");
     111           1 :     v.clear();
     112           2 :     BOOST_CHECK(v.isNull());
     113           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "");
     114             : 
     115           2 :     BOOST_CHECK(v.setObject());
     116           2 :     BOOST_CHECK(v.isObject());
     117           1 :     BOOST_CHECK_EQUAL(v.size(), 0);
     118           1 :     BOOST_CHECK_EQUAL(v.getType(), UniValue::VOBJ);
     119           2 :     BOOST_CHECK(v.empty());
     120             : 
     121           2 :     BOOST_CHECK(v.setArray());
     122           2 :     BOOST_CHECK(v.isArray());
     123           1 :     BOOST_CHECK_EQUAL(v.size(), 0);
     124             : 
     125           2 :     BOOST_CHECK(v.setStr("zum"));
     126           2 :     BOOST_CHECK(v.isStr());
     127           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "zum");
     128             : 
     129           2 :     BOOST_CHECK(v.setFloat(-1.01));
     130           2 :     BOOST_CHECK(v.isNum());
     131           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "-1.01");
     132             : 
     133           2 :     BOOST_CHECK(v.setInt((int)1023));
     134           2 :     BOOST_CHECK(v.isNum());
     135           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "1023");
     136             : 
     137           2 :     BOOST_CHECK(v.setInt((int64_t)-1023LL));
     138           2 :     BOOST_CHECK(v.isNum());
     139           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "-1023");
     140             : 
     141           2 :     BOOST_CHECK(v.setInt((uint64_t)1023ULL));
     142           2 :     BOOST_CHECK(v.isNum());
     143           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "1023");
     144             : 
     145           2 :     BOOST_CHECK(v.setNumStr("-688"));
     146           2 :     BOOST_CHECK(v.isNum());
     147           1 :     BOOST_CHECK_EQUAL(v.getValStr(), "-688");
     148             : 
     149           2 :     BOOST_CHECK(v.setBool(false));
     150           1 :     BOOST_CHECK_EQUAL(v.isBool(), true);
     151           2 :     BOOST_CHECK_EQUAL(v.isTrue(), false);
     152           2 :     BOOST_CHECK_EQUAL(v.isFalse(), true);
     153           2 :     BOOST_CHECK_EQUAL(v.getBool(), false);
     154             : 
     155           2 :     BOOST_CHECK(v.setBool(true));
     156           1 :     BOOST_CHECK_EQUAL(v.isBool(), true);
     157           2 :     BOOST_CHECK_EQUAL(v.isTrue(), true);
     158           2 :     BOOST_CHECK_EQUAL(v.isFalse(), false);
     159           2 :     BOOST_CHECK_EQUAL(v.getBool(), true);
     160             : 
     161           2 :     BOOST_CHECK(!v.setNumStr("zombocom"));
     162             : 
     163           2 :     BOOST_CHECK(v.setNull());
     164           2 :     BOOST_CHECK(v.isNull());
     165           1 : }
     166             : 
     167           2 : BOOST_AUTO_TEST_CASE(univalue_array)
     168             : {
     169           2 :     UniValue arr(UniValue::VARR);
     170             : 
     171           1 :     UniValue v((int64_t)1023LL);
     172           2 :     BOOST_CHECK(arr.push_back(v));
     173             : 
     174           2 :     std::string vStr("zippy");
     175           2 :     BOOST_CHECK(arr.push_back(vStr));
     176             : 
     177           1 :     const char *s = "pippy";
     178           2 :     BOOST_CHECK(arr.push_back(s));
     179             : 
     180           2 :     std::vector<UniValue> vec;
     181           1 :     v.setStr("boing");
     182           1 :     vec.push_back(v);
     183             : 
     184           1 :     v.setStr("going");
     185           1 :     vec.push_back(v);
     186             : 
     187           2 :     BOOST_CHECK(arr.push_backV(vec));
     188             : 
     189           1 :     BOOST_CHECK_EQUAL(arr.empty(), false);
     190           1 :     BOOST_CHECK_EQUAL(arr.size(), 5);
     191             : 
     192           1 :     BOOST_CHECK_EQUAL(arr[0].getValStr(), "1023");
     193           1 :     BOOST_CHECK_EQUAL(arr[1].getValStr(), "zippy");
     194           1 :     BOOST_CHECK_EQUAL(arr[2].getValStr(), "pippy");
     195           1 :     BOOST_CHECK_EQUAL(arr[3].getValStr(), "boing");
     196           1 :     BOOST_CHECK_EQUAL(arr[4].getValStr(), "going");
     197             : 
     198           1 :     BOOST_CHECK_EQUAL(arr[999].getValStr(), "");
     199             : 
     200           1 :     arr.clear();
     201           2 :     BOOST_CHECK(arr.empty());
     202           1 :     BOOST_CHECK_EQUAL(arr.size(), 0);
     203           1 : }
     204             : 
     205           2 : BOOST_AUTO_TEST_CASE(univalue_object)
     206             : {
     207           1 :     UniValue obj(UniValue::VOBJ);
     208           2 :     std::string strKey, strVal;
     209           2 :     UniValue v;
     210             : 
     211           1 :     strKey = "age";
     212           1 :     v.setInt(100);
     213           2 :     BOOST_CHECK(obj.pushKV(strKey, v));
     214             : 
     215           1 :     strKey = "first";
     216           1 :     strVal = "John";
     217           2 :     BOOST_CHECK(obj.pushKV(strKey, strVal));
     218             : 
     219           1 :     strKey = "last";
     220           1 :     const char *cVal = "Smith";
     221           2 :     BOOST_CHECK(obj.pushKV(strKey, cVal));
     222             : 
     223           1 :     strKey = "distance";
     224           2 :     BOOST_CHECK(obj.pushKV(strKey, (int64_t) 25));
     225             : 
     226           1 :     strKey = "time";
     227           2 :     BOOST_CHECK(obj.pushKV(strKey, (uint64_t) 3600));
     228             : 
     229           1 :     strKey = "calories";
     230           2 :     BOOST_CHECK(obj.pushKV(strKey, (int) 12));
     231             : 
     232           1 :     strKey = "temperature";
     233           2 :     BOOST_CHECK(obj.pushKV(strKey, (double) 90.012));
     234             : 
     235           1 :     UniValue obj2(UniValue::VOBJ);
     236           2 :     BOOST_CHECK(obj2.pushKV("cat1", 9000));
     237           2 :     BOOST_CHECK(obj2.pushKV("cat2", 12345));
     238             : 
     239           2 :     BOOST_CHECK(obj.pushKVs(obj2));
     240             : 
     241           1 :     BOOST_CHECK_EQUAL(obj.empty(), false);
     242           1 :     BOOST_CHECK_EQUAL(obj.size(), 9);
     243             : 
     244           1 :     BOOST_CHECK_EQUAL(obj["age"].getValStr(), "100");
     245           1 :     BOOST_CHECK_EQUAL(obj["first"].getValStr(), "John");
     246           1 :     BOOST_CHECK_EQUAL(obj["last"].getValStr(), "Smith");
     247           1 :     BOOST_CHECK_EQUAL(obj["distance"].getValStr(), "25");
     248           1 :     BOOST_CHECK_EQUAL(obj["time"].getValStr(), "3600");
     249           1 :     BOOST_CHECK_EQUAL(obj["calories"].getValStr(), "12");
     250           1 :     BOOST_CHECK_EQUAL(obj["temperature"].getValStr(), "90.012");
     251           1 :     BOOST_CHECK_EQUAL(obj["cat1"].getValStr(), "9000");
     252           1 :     BOOST_CHECK_EQUAL(obj["cat2"].getValStr(), "12345");
     253             : 
     254           1 :     BOOST_CHECK_EQUAL(obj["nyuknyuknyuk"].getValStr(), "");
     255             : 
     256           3 :     BOOST_CHECK(obj.exists("age"));
     257           3 :     BOOST_CHECK(obj.exists("first"));
     258           3 :     BOOST_CHECK(obj.exists("last"));
     259           3 :     BOOST_CHECK(obj.exists("distance"));
     260           3 :     BOOST_CHECK(obj.exists("time"));
     261           3 :     BOOST_CHECK(obj.exists("calories"));
     262           3 :     BOOST_CHECK(obj.exists("temperature"));
     263           3 :     BOOST_CHECK(obj.exists("cat1"));
     264           3 :     BOOST_CHECK(obj.exists("cat2"));
     265             : 
     266           3 :     BOOST_CHECK(!obj.exists("nyuknyuknyuk"));
     267             : 
     268           2 :     std::map<std::string, UniValue::VType> objTypes;
     269           1 :     objTypes["age"] = UniValue::VNUM;
     270           1 :     objTypes["first"] = UniValue::VSTR;
     271           1 :     objTypes["last"] = UniValue::VSTR;
     272           1 :     objTypes["distance"] = UniValue::VNUM;
     273           1 :     objTypes["time"] = UniValue::VNUM;
     274           1 :     objTypes["calories"] = UniValue::VNUM;
     275           1 :     objTypes["temperature"] = UniValue::VNUM;
     276           1 :     objTypes["cat1"] = UniValue::VNUM;
     277           1 :     objTypes["cat2"] = UniValue::VNUM;
     278           2 :     BOOST_CHECK(obj.checkObject(objTypes));
     279             : 
     280           1 :     objTypes["cat2"] = UniValue::VSTR;
     281           2 :     BOOST_CHECK(!obj.checkObject(objTypes));
     282             : 
     283           1 :     obj.clear();
     284           2 :     BOOST_CHECK(obj.empty());
     285           1 :     BOOST_CHECK_EQUAL(obj.size(), 0);
     286           1 : }
     287             : 
     288             : static const char *json1 =
     289             : "[1.10000000,{\"key1\":\"str\",\"key2\":800,\"key3\":{\"name\":\"martian\"}}]";
     290             : 
     291           2 : BOOST_AUTO_TEST_CASE(univalue_readwrite)
     292             : {
     293           1 :     UniValue v;
     294           2 :     BOOST_CHECK(v.read(json1));
     295             : 
     296           2 :     std::string strJson1(json1);
     297           2 :     BOOST_CHECK(v.read(strJson1));
     298             : 
     299           2 :     BOOST_CHECK(v.isArray());
     300           1 :     BOOST_CHECK_EQUAL(v.size(), 2);
     301             : 
     302           1 :     BOOST_CHECK_EQUAL(v[0].getValStr(), "1.10000000");
     303             : 
     304           2 :     UniValue obj = v[1];
     305           2 :     BOOST_CHECK(obj.isObject());
     306           1 :     BOOST_CHECK_EQUAL(obj.size(), 3);
     307             : 
     308           2 :     BOOST_CHECK(obj["key1"].isStr());
     309           1 :     BOOST_CHECK_EQUAL(obj["key1"].getValStr(), "str");
     310           2 :     BOOST_CHECK(obj["key2"].isNum());
     311           1 :     BOOST_CHECK_EQUAL(obj["key2"].getValStr(), "800");
     312           2 :     BOOST_CHECK(obj["key3"].isObject());
     313             : 
     314           2 :     BOOST_CHECK_EQUAL(strJson1, v.write());
     315           1 : }
     316             : 
     317             : BOOST_AUTO_TEST_SUITE_END()
     318             : 

Generated by: LCOV version 1.14