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