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