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 : : }
|