1 // Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
2 // Distributed under MIT license, or public domain if desired and
3 // recognized in your jurisdiction.
4 // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
5
6 #if defined(__GNUC__)
7 #pragma GCC diagnostic push
8 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
9 #elif defined(_MSC_VER)
10 #pragma warning(disable : 4996)
11 #endif
12
13 #include "fuzz.h"
14 #include "jsontest.h"
15 #include <cmath>
16 #include <cstring>
17 #include <iomanip>
18 #include <iostream>
19 #include <json/config.h>
20 #include <json/json.h>
21 #include <limits>
22 #include <sstream>
23 #include <string>
24
25 // Make numeric limits more convenient to talk about.
26 // Assumes int type in 32 bits.
27 #define kint32max Json::Value::maxInt
28 #define kint32min Json::Value::minInt
29 #define kuint32max Json::Value::maxUInt
30 #define kint64max Json::Value::maxInt64
31 #define kint64min Json::Value::minInt64
32 #define kuint64max Json::Value::maxUInt64
33
34 // static const double kdint64max = double(kint64max);
35 // static const float kfint64max = float(kint64max);
36 static const float kfint32max = float(kint32max);
37 static const float kfuint32max = float(kuint32max);
38
39 // //////////////////////////////////////////////////////////////////
40 // //////////////////////////////////////////////////////////////////
41 // Json Library test cases
42 // //////////////////////////////////////////////////////////////////
43 // //////////////////////////////////////////////////////////////////
44
45 #if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
uint64ToDouble(Json::UInt64 value)46 static inline double uint64ToDouble(Json::UInt64 value) {
47 return static_cast<double>(value);
48 }
49 #else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
uint64ToDouble(Json::UInt64 value)50 static inline double uint64ToDouble(Json::UInt64 value) {
51 return static_cast<double>(Json::Int64(value / 2)) * 2.0 +
52 static_cast<double>(Json::Int64(value & 1));
53 }
54 #endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
55
56 struct ValueTest : JsonTest::TestCase {
57 Json::Value null_;
58 Json::Value emptyArray_;
59 Json::Value emptyObject_;
60 Json::Value integer_;
61 Json::Value unsignedInteger_;
62 Json::Value smallUnsignedInteger_;
63 Json::Value real_;
64 Json::Value float_;
65 Json::Value array1_;
66 Json::Value object1_;
67 Json::Value emptyString_;
68 Json::Value string1_;
69 Json::Value string_;
70 Json::Value true_;
71 Json::Value false_;
72
ValueTestValueTest73 ValueTest()
74 : emptyArray_(Json::arrayValue), emptyObject_(Json::objectValue),
75 integer_(123456789), unsignedInteger_(34567890u),
76 smallUnsignedInteger_(Json::Value::UInt(Json::Value::maxInt)),
77 real_(1234.56789), float_(0.00390625f), emptyString_(""), string1_("a"),
78 string_("sometext with space"), true_(true), false_(false) {
79 array1_.append(1234);
80 object1_["id"] = 1234;
81 }
82
83 struct IsCheck {
84 /// Initialize all checks to \c false by default.
85 IsCheck();
86
87 bool isObject_{false};
88 bool isArray_{false};
89 bool isBool_{false};
90 bool isString_{false};
91 bool isNull_{false};
92
93 bool isInt_{false};
94 bool isInt64_{false};
95 bool isUInt_{false};
96 bool isUInt64_{false};
97 bool isIntegral_{false};
98 bool isDouble_{false};
99 bool isNumeric_{false};
100 };
101
102 void checkConstMemberCount(const Json::Value& value,
103 unsigned int expectedCount);
104
105 void checkMemberCount(Json::Value& value, unsigned int expectedCount);
106
107 void checkIs(const Json::Value& value, const IsCheck& check);
108
109 void checkIsLess(const Json::Value& x, const Json::Value& y);
110
111 void checkIsEqual(const Json::Value& x, const Json::Value& y);
112
113 /// Normalize the representation of floating-point number by stripped leading
114 /// 0 in exponent.
115 static Json::String normalizeFloatingPointStr(const Json::String& s);
116 };
117
normalizeFloatingPointStr(const Json::String & s)118 Json::String ValueTest::normalizeFloatingPointStr(const Json::String& s) {
119 Json::String::size_type index = s.find_last_of("eE");
120 if (index != Json::String::npos) {
121 Json::String::size_type hasSign =
122 (s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
123 Json::String::size_type exponentStartIndex = index + 1 + hasSign;
124 Json::String normalized = s.substr(0, exponentStartIndex);
125 Json::String::size_type indexDigit =
126 s.find_first_not_of('0', exponentStartIndex);
127 Json::String exponent = "0";
128 if (indexDigit != Json::String::npos) // There is an exponent different
129 // from 0
130 {
131 exponent = s.substr(indexDigit);
132 }
133 return normalized + exponent;
134 }
135 return s;
136 }
137
JSONTEST_FIXTURE(ValueTest,checkNormalizeFloatingPointStr)138 JSONTEST_FIXTURE(ValueTest, checkNormalizeFloatingPointStr) {
139 JSONTEST_ASSERT_STRING_EQUAL("0.0", normalizeFloatingPointStr("0.0"));
140 JSONTEST_ASSERT_STRING_EQUAL("0e0", normalizeFloatingPointStr("0e0"));
141 JSONTEST_ASSERT_STRING_EQUAL("1234.0", normalizeFloatingPointStr("1234.0"));
142 JSONTEST_ASSERT_STRING_EQUAL("1234.0e0",
143 normalizeFloatingPointStr("1234.0e0"));
144 JSONTEST_ASSERT_STRING_EQUAL("1234.0e+0",
145 normalizeFloatingPointStr("1234.0e+0"));
146 JSONTEST_ASSERT_STRING_EQUAL("1234e-1", normalizeFloatingPointStr("1234e-1"));
147 JSONTEST_ASSERT_STRING_EQUAL("1234e10", normalizeFloatingPointStr("1234e10"));
148 JSONTEST_ASSERT_STRING_EQUAL("1234e10",
149 normalizeFloatingPointStr("1234e010"));
150 JSONTEST_ASSERT_STRING_EQUAL("1234e+10",
151 normalizeFloatingPointStr("1234e+010"));
152 JSONTEST_ASSERT_STRING_EQUAL("1234e-10",
153 normalizeFloatingPointStr("1234e-010"));
154 JSONTEST_ASSERT_STRING_EQUAL("1234e+100",
155 normalizeFloatingPointStr("1234e+100"));
156 JSONTEST_ASSERT_STRING_EQUAL("1234e-100",
157 normalizeFloatingPointStr("1234e-100"));
158 JSONTEST_ASSERT_STRING_EQUAL("1234e+1",
159 normalizeFloatingPointStr("1234e+001"));
160 }
161
JSONTEST_FIXTURE(ValueTest,memberCount)162 JSONTEST_FIXTURE(ValueTest, memberCount) {
163 JSONTEST_ASSERT_PRED(checkMemberCount(emptyArray_, 0));
164 JSONTEST_ASSERT_PRED(checkMemberCount(emptyObject_, 0));
165 JSONTEST_ASSERT_PRED(checkMemberCount(array1_, 1));
166 JSONTEST_ASSERT_PRED(checkMemberCount(object1_, 1));
167 JSONTEST_ASSERT_PRED(checkMemberCount(null_, 0));
168 JSONTEST_ASSERT_PRED(checkMemberCount(integer_, 0));
169 JSONTEST_ASSERT_PRED(checkMemberCount(unsignedInteger_, 0));
170 JSONTEST_ASSERT_PRED(checkMemberCount(smallUnsignedInteger_, 0));
171 JSONTEST_ASSERT_PRED(checkMemberCount(real_, 0));
172 JSONTEST_ASSERT_PRED(checkMemberCount(emptyString_, 0));
173 JSONTEST_ASSERT_PRED(checkMemberCount(string_, 0));
174 JSONTEST_ASSERT_PRED(checkMemberCount(true_, 0));
175 }
176
JSONTEST_FIXTURE(ValueTest,objects)177 JSONTEST_FIXTURE(ValueTest, objects) {
178 // Types
179 IsCheck checks;
180 checks.isObject_ = true;
181 JSONTEST_ASSERT_PRED(checkIs(emptyObject_, checks));
182 JSONTEST_ASSERT_PRED(checkIs(object1_, checks));
183
184 JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());
185
186 // Empty object okay
187 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));
188
189 // Non-empty object not okay
190 JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));
191
192 // Always okay
193 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));
194
195 // Never okay
196 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
197 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
198 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
199 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
200 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
201 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));
202
203 // Access through const reference
204 const Json::Value& constObject = object1_;
205
206 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
207 JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);
208
209 // Access through find()
210 const char idKey[] = "id";
211 const Json::Value* foundId = object1_.find(idKey, idKey + strlen(idKey));
212 JSONTEST_ASSERT(foundId != nullptr);
213 JSONTEST_ASSERT_EQUAL(Json::Value(1234), *foundId);
214
215 const char unknownIdKey[] = "unknown id";
216 const Json::Value* foundUnknownId =
217 object1_.find(unknownIdKey, unknownIdKey + strlen(unknownIdKey));
218 JSONTEST_ASSERT_EQUAL(nullptr, foundUnknownId);
219
220 // Access through demand()
221 const char yetAnotherIdKey[] = "yet another id";
222 const Json::Value* foundYetAnotherId =
223 object1_.find(yetAnotherIdKey, yetAnotherIdKey + strlen(yetAnotherIdKey));
224 JSONTEST_ASSERT_EQUAL(nullptr, foundYetAnotherId);
225 Json::Value* demandedYetAnotherId = object1_.demand(
226 yetAnotherIdKey, yetAnotherIdKey + strlen(yetAnotherIdKey));
227 JSONTEST_ASSERT(demandedYetAnotherId != nullptr);
228 *demandedYetAnotherId = "baz";
229
230 JSONTEST_ASSERT_EQUAL(Json::Value("baz"), object1_["yet another id"]);
231
232 // Access through non-const reference
233 JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
234 JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
235
236 object1_["some other id"] = "foo";
237 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
238 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
239
240 // Remove.
241 Json::Value got;
242 bool did;
243 did = object1_.removeMember("some other id", &got);
244 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
245 JSONTEST_ASSERT_EQUAL(true, did);
246 got = Json::Value("bar");
247 did = object1_.removeMember("some other id", &got);
248 JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
249 JSONTEST_ASSERT_EQUAL(false, did);
250
251 object1_["some other id"] = "foo";
252 Json::Value* gotPtr = nullptr;
253 did = object1_.removeMember("some other id", gotPtr);
254 JSONTEST_ASSERT_EQUAL(nullptr, gotPtr);
255 JSONTEST_ASSERT_EQUAL(true, did);
256 }
257
JSONTEST_FIXTURE(ValueTest,arrays)258 JSONTEST_FIXTURE(ValueTest, arrays) {
259 const unsigned int index0 = 0;
260
261 // Types
262 IsCheck checks;
263 checks.isArray_ = true;
264 JSONTEST_ASSERT_PRED(checkIs(emptyArray_, checks));
265 JSONTEST_ASSERT_PRED(checkIs(array1_, checks));
266
267 JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
268
269 // Empty array okay
270 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));
271
272 // Non-empty array not okay
273 JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));
274
275 // Always okay
276 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));
277
278 // Never okay
279 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
280 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
281 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
282 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
283 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
284 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));
285
286 // Access through const reference
287 const Json::Value& constArray = array1_;
288 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
289 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
290
291 // Access through non-const reference
292 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
293 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
294
295 array1_[2] = Json::Value(17);
296 JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
297 JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
298 Json::Value got;
299 JSONTEST_ASSERT_EQUAL(true, array1_.removeIndex(2, &got));
300 JSONTEST_ASSERT_EQUAL(Json::Value(17), got);
301 JSONTEST_ASSERT_EQUAL(false, array1_.removeIndex(2, &got)); // gone now
302 }
JSONTEST_FIXTURE(ValueTest,arrayIssue252)303 JSONTEST_FIXTURE(ValueTest, arrayIssue252) {
304 int count = 5;
305 Json::Value root;
306 Json::Value item;
307 root["array"] = Json::Value::nullRef;
308 for (int i = 0; i < count; i++) {
309 item["a"] = i;
310 item["b"] = i;
311 root["array"][i] = item;
312 }
313 // JSONTEST_ASSERT_EQUAL(5, root["array"].size());
314 }
315
JSONTEST_FIXTURE(ValueTest,null)316 JSONTEST_FIXTURE(ValueTest, null) {
317 JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
318
319 IsCheck checks;
320 checks.isNull_ = true;
321 JSONTEST_ASSERT_PRED(checkIs(null_, checks));
322
323 JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
324 JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
325 JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
326 JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
327 JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
328 JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
329 JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
330 JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));
331
332 JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
333 JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
334 JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
335 JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
336 JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
337 JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
338 JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
339
340 JSONTEST_ASSERT_EQUAL(Json::Value::null, null_);
341
342 // Test using a Value in a boolean context (false iff null)
343 JSONTEST_ASSERT_EQUAL(null_, false);
344 JSONTEST_ASSERT_EQUAL(object1_, true);
345 JSONTEST_ASSERT_EQUAL(!null_, true);
346 JSONTEST_ASSERT_EQUAL(!object1_, false);
347 }
348
JSONTEST_FIXTURE(ValueTest,strings)349 JSONTEST_FIXTURE(ValueTest, strings) {
350 JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
351
352 IsCheck checks;
353 checks.isString_ = true;
354 JSONTEST_ASSERT_PRED(checkIs(emptyString_, checks));
355 JSONTEST_ASSERT_PRED(checkIs(string_, checks));
356 JSONTEST_ASSERT_PRED(checkIs(string1_, checks));
357
358 // Empty string okay
359 JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));
360
361 // Non-empty string not okay
362 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));
363
364 // Always okay
365 JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));
366
367 // Never okay
368 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
369 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
370 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
371 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
372 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));
373
374 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
375 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
376 }
377
JSONTEST_FIXTURE(ValueTest,bools)378 JSONTEST_FIXTURE(ValueTest, bools) {
379 JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
380
381 IsCheck checks;
382 checks.isBool_ = true;
383 JSONTEST_ASSERT_PRED(checkIs(false_, checks));
384 JSONTEST_ASSERT_PRED(checkIs(true_, checks));
385
386 // False okay
387 JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));
388
389 // True not okay
390 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));
391
392 // Always okay
393 JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
394 JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
395 JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
396 JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
397 JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));
398
399 // Never okay
400 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
401 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));
402
403 JSONTEST_ASSERT_EQUAL(true, true_.asBool());
404 JSONTEST_ASSERT_EQUAL(1, true_.asInt());
405 JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
406 JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
407 JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
408 JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
409 JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());
410
411 JSONTEST_ASSERT_EQUAL(false, false_.asBool());
412 JSONTEST_ASSERT_EQUAL(0, false_.asInt());
413 JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
414 JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
415 JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
416 JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
417 JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
418 }
419
JSONTEST_FIXTURE(ValueTest,integers)420 JSONTEST_FIXTURE(ValueTest, integers) {
421 IsCheck checks;
422 Json::Value val;
423
424 // Conversions that don't depend on the value.
425 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
426 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
427 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
428 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
429 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));
430
431 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
432 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
433 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
434 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
435 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));
436
437 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
438 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
439 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
440 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
441 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));
442
443 // Default int
444 val = Json::Value(Json::intValue);
445
446 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
447
448 checks = IsCheck();
449 checks.isInt_ = true;
450 checks.isInt64_ = true;
451 checks.isUInt_ = true;
452 checks.isUInt64_ = true;
453 checks.isIntegral_ = true;
454 checks.isDouble_ = true;
455 checks.isNumeric_ = true;
456 JSONTEST_ASSERT_PRED(checkIs(val, checks));
457
458 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
459 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
460 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
461
462 JSONTEST_ASSERT_EQUAL(0, val.asInt());
463 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
464 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
465 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
466 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
467 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
468 JSONTEST_ASSERT_EQUAL(false, val.asBool());
469 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
470
471 // Default uint
472 val = Json::Value(Json::uintValue);
473
474 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
475
476 checks = IsCheck();
477 checks.isInt_ = true;
478 checks.isInt64_ = true;
479 checks.isUInt_ = true;
480 checks.isUInt64_ = true;
481 checks.isIntegral_ = true;
482 checks.isDouble_ = true;
483 checks.isNumeric_ = true;
484 JSONTEST_ASSERT_PRED(checkIs(val, checks));
485
486 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
487 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
488 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
489
490 JSONTEST_ASSERT_EQUAL(0, val.asInt());
491 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
492 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
493 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
494 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
495 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
496 JSONTEST_ASSERT_EQUAL(false, val.asBool());
497 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
498
499 // Default real
500 val = Json::Value(Json::realValue);
501
502 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
503
504 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
505 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
506 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
507
508 checks = IsCheck();
509 checks.isInt_ = true;
510 checks.isInt64_ = true;
511 checks.isUInt_ = true;
512 checks.isUInt64_ = true;
513 checks.isIntegral_ = true;
514 checks.isDouble_ = true;
515 checks.isNumeric_ = true;
516 JSONTEST_ASSERT_PRED(checkIs(val, checks));
517
518 JSONTEST_ASSERT_EQUAL(0, val.asInt());
519 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
520 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
521 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
522 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
523 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
524 JSONTEST_ASSERT_EQUAL(false, val.asBool());
525 JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
526
527 // Zero (signed constructor arg)
528 val = Json::Value(0);
529
530 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
531
532 checks = IsCheck();
533 checks.isInt_ = true;
534 checks.isInt64_ = true;
535 checks.isUInt_ = true;
536 checks.isUInt64_ = true;
537 checks.isIntegral_ = true;
538 checks.isDouble_ = true;
539 checks.isNumeric_ = true;
540 JSONTEST_ASSERT_PRED(checkIs(val, checks));
541
542 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
543 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
544 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
545
546 JSONTEST_ASSERT_EQUAL(0, val.asInt());
547 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
548 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
549 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
550 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
551 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
552 JSONTEST_ASSERT_EQUAL(false, val.asBool());
553 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
554
555 // Zero (unsigned constructor arg)
556 val = Json::Value(0u);
557
558 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
559
560 checks = IsCheck();
561 checks.isInt_ = true;
562 checks.isInt64_ = true;
563 checks.isUInt_ = true;
564 checks.isUInt64_ = true;
565 checks.isIntegral_ = true;
566 checks.isDouble_ = true;
567 checks.isNumeric_ = true;
568 JSONTEST_ASSERT_PRED(checkIs(val, checks));
569
570 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
571 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
572 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
573
574 JSONTEST_ASSERT_EQUAL(0, val.asInt());
575 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
576 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
577 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
578 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
579 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
580 JSONTEST_ASSERT_EQUAL(false, val.asBool());
581 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
582
583 // Zero (floating-point constructor arg)
584 val = Json::Value(0.0);
585
586 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
587
588 checks = IsCheck();
589 checks.isInt_ = true;
590 checks.isInt64_ = true;
591 checks.isUInt_ = true;
592 checks.isUInt64_ = true;
593 checks.isIntegral_ = true;
594 checks.isDouble_ = true;
595 checks.isNumeric_ = true;
596 JSONTEST_ASSERT_PRED(checkIs(val, checks));
597
598 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
599 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
600 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
601
602 JSONTEST_ASSERT_EQUAL(0, val.asInt());
603 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
604 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
605 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
606 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
607 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
608 JSONTEST_ASSERT_EQUAL(false, val.asBool());
609 JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
610
611 // 2^20 (signed constructor arg)
612 val = Json::Value(1 << 20);
613
614 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
615 checks = IsCheck();
616 checks.isInt_ = true;
617 checks.isInt64_ = true;
618 checks.isUInt_ = true;
619 checks.isUInt64_ = true;
620 checks.isIntegral_ = true;
621 checks.isDouble_ = true;
622 checks.isNumeric_ = true;
623 JSONTEST_ASSERT_PRED(checkIs(val, checks));
624
625 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
626 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
627 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
628
629 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
630 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
631 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
632 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
633 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
634 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
635 JSONTEST_ASSERT_EQUAL(true, val.asBool());
636 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
637
638 // 2^20 (unsigned constructor arg)
639 val = Json::Value(Json::UInt(1 << 20));
640
641 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
642
643 checks = IsCheck();
644 checks.isInt_ = true;
645 checks.isInt64_ = true;
646 checks.isUInt_ = true;
647 checks.isUInt64_ = true;
648 checks.isIntegral_ = true;
649 checks.isDouble_ = true;
650 checks.isNumeric_ = true;
651 JSONTEST_ASSERT_PRED(checkIs(val, checks));
652
653 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
654 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
655 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
656
657 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
658 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
659 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
660 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
661 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
662 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
663 JSONTEST_ASSERT_EQUAL(true, val.asBool());
664 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
665
666 // 2^20 (floating-point constructor arg)
667 val = Json::Value((1 << 20) / 1.0);
668
669 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
670
671 checks = IsCheck();
672 checks.isInt_ = true;
673 checks.isInt64_ = true;
674 checks.isUInt_ = true;
675 checks.isUInt64_ = true;
676 checks.isIntegral_ = true;
677 checks.isDouble_ = true;
678 checks.isNumeric_ = true;
679 JSONTEST_ASSERT_PRED(checkIs(val, checks));
680
681 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
682 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
683 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
684
685 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
686 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
687 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
688 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
689 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
690 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
691 JSONTEST_ASSERT_EQUAL(true, val.asBool());
692 JSONTEST_ASSERT_STRING_EQUAL(
693 "1048576.0",
694 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
695
696 // -2^20
697 val = Json::Value(-(1 << 20));
698
699 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
700
701 checks = IsCheck();
702 checks.isInt_ = true;
703 checks.isInt64_ = true;
704 checks.isIntegral_ = true;
705 checks.isDouble_ = true;
706 checks.isNumeric_ = true;
707 JSONTEST_ASSERT_PRED(checkIs(val, checks));
708
709 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
710 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
711 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
712
713 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
714 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
715 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
716 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
717 JSONTEST_ASSERT_EQUAL(true, val.asBool());
718 JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
719
720 // int32 max
721 val = Json::Value(kint32max);
722
723 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
724
725 checks = IsCheck();
726 checks.isInt_ = true;
727 checks.isInt64_ = true;
728 checks.isUInt_ = true;
729 checks.isUInt64_ = true;
730 checks.isIntegral_ = true;
731 checks.isDouble_ = true;
732 checks.isNumeric_ = true;
733 JSONTEST_ASSERT_PRED(checkIs(val, checks));
734
735 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
736 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
737 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
738
739 JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
740 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
741 JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
742 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
743 JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
744 JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
745 JSONTEST_ASSERT_EQUAL(true, val.asBool());
746 JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
747
748 // int32 min
749 val = Json::Value(kint32min);
750
751 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
752
753 checks = IsCheck();
754 checks.isInt_ = true;
755 checks.isInt64_ = true;
756 checks.isIntegral_ = true;
757 checks.isDouble_ = true;
758 checks.isNumeric_ = true;
759 JSONTEST_ASSERT_PRED(checkIs(val, checks));
760
761 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
762 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
763 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
764
765 JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
766 JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
767 JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
768 JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
769 JSONTEST_ASSERT_EQUAL(true, val.asBool());
770 JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
771
772 // uint32 max
773 val = Json::Value(kuint32max);
774
775 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
776
777 checks = IsCheck();
778 checks.isInt64_ = true;
779 checks.isUInt_ = true;
780 checks.isUInt64_ = true;
781 checks.isIntegral_ = true;
782 checks.isDouble_ = true;
783 checks.isNumeric_ = true;
784 JSONTEST_ASSERT_PRED(checkIs(val, checks));
785
786 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
787 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
788 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
789
790 #ifndef JSON_NO_INT64
791 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
792 #endif
793 JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
794 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
795 JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
796 JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
797 JSONTEST_ASSERT_EQUAL(true, val.asBool());
798 JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
799
800 #ifdef JSON_NO_INT64
801 // int64 max
802 val = Json::Value(double(kint64max));
803
804 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
805
806 checks = IsCheck();
807 checks.isDouble_ = true;
808 checks.isNumeric_ = true;
809 JSONTEST_ASSERT_PRED(checkIs(val, checks));
810
811 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
812 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
813 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
814
815 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
816 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
817 JSONTEST_ASSERT_EQUAL(true, val.asBool());
818 JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
819
820 // int64 min
821 val = Json::Value(double(kint64min));
822
823 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
824
825 checks = IsCheck();
826 checks.isDouble_ = true;
827 checks.isNumeric_ = true;
828 JSONTEST_ASSERT_PRED(checkIs(val, checks));
829
830 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
831 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
832 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
833
834 JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
835 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
836 JSONTEST_ASSERT_EQUAL(true, val.asBool());
837 JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
838
839 // uint64 max
840 val = Json::Value(double(kuint64max));
841
842 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
843
844 checks = IsCheck();
845 checks.isDouble_ = true;
846 checks.isNumeric_ = true;
847 JSONTEST_ASSERT_PRED(checkIs(val, checks));
848
849 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
850 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
851 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
852
853 JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
854 JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
855 JSONTEST_ASSERT_EQUAL(true, val.asBool());
856 JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
857 #else // ifdef JSON_NO_INT64
858 // 2^40 (signed constructor arg)
859 val = Json::Value(Json::Int64(1) << 40);
860
861 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
862
863 checks = IsCheck();
864 checks.isInt64_ = true;
865 checks.isUInt64_ = true;
866 checks.isIntegral_ = true;
867 checks.isDouble_ = true;
868 checks.isNumeric_ = true;
869 JSONTEST_ASSERT_PRED(checkIs(val, checks));
870
871 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
872 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
873 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
874
875 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
876 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
877 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
878 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
879 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
880 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
881 JSONTEST_ASSERT_EQUAL(true, val.asBool());
882 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
883
884 // 2^40 (unsigned constructor arg)
885 val = Json::Value(Json::UInt64(1) << 40);
886
887 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
888
889 checks = IsCheck();
890 checks.isInt64_ = true;
891 checks.isUInt64_ = true;
892 checks.isIntegral_ = true;
893 checks.isDouble_ = true;
894 checks.isNumeric_ = true;
895 JSONTEST_ASSERT_PRED(checkIs(val, checks));
896
897 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
898 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
899 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
900
901 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
902 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
903 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
904 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
905 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
906 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
907 JSONTEST_ASSERT_EQUAL(true, val.asBool());
908 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
909
910 // 2^40 (floating-point constructor arg)
911 val = Json::Value((Json::Int64(1) << 40) / 1.0);
912
913 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
914
915 checks = IsCheck();
916 checks.isInt64_ = true;
917 checks.isUInt64_ = true;
918 checks.isIntegral_ = true;
919 checks.isDouble_ = true;
920 checks.isNumeric_ = true;
921 JSONTEST_ASSERT_PRED(checkIs(val, checks));
922
923 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
924 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
925 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
926
927 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
928 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
929 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
930 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
931 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
932 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
933 JSONTEST_ASSERT_EQUAL(true, val.asBool());
934 JSONTEST_ASSERT_STRING_EQUAL(
935 "1099511627776.0",
936 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
937
938 // -2^40
939 val = Json::Value(-(Json::Int64(1) << 40));
940
941 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
942
943 checks = IsCheck();
944 checks.isInt64_ = true;
945 checks.isIntegral_ = true;
946 checks.isDouble_ = true;
947 checks.isNumeric_ = true;
948 JSONTEST_ASSERT_PRED(checkIs(val, checks));
949
950 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
951 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
952 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
953
954 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
955 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
956 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
957 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
958 JSONTEST_ASSERT_EQUAL(true, val.asBool());
959 JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
960
961 // int64 max
962 val = Json::Value(Json::Int64(kint64max));
963
964 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
965
966 checks = IsCheck();
967 checks.isInt64_ = true;
968 checks.isUInt64_ = true;
969 checks.isIntegral_ = true;
970 checks.isDouble_ = true;
971 checks.isNumeric_ = true;
972 JSONTEST_ASSERT_PRED(checkIs(val, checks));
973
974 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
975 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
976 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
977
978 JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
979 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
980 JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
981 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
982 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
983 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
984 JSONTEST_ASSERT_EQUAL(true, val.asBool());
985 JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
986
987 // int64 max (floating point constructor). Note that kint64max is not exactly
988 // representable as a double, and will be rounded up to be higher.
989 val = Json::Value(double(kint64max));
990
991 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
992
993 checks = IsCheck();
994 checks.isUInt64_ = true;
995 checks.isIntegral_ = true;
996 checks.isDouble_ = true;
997 checks.isNumeric_ = true;
998 JSONTEST_ASSERT_PRED(checkIs(val, checks));
999
1000 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1001 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1002 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1003
1004 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
1005 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
1006 JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
1007 JSONTEST_ASSERT_EQUAL(float(Json::UInt64(1) << 63), val.asFloat());
1008
1009 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1010 JSONTEST_ASSERT_STRING_EQUAL(
1011 "9.2233720368547758e+18",
1012 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1013
1014 // int64 min
1015 val = Json::Value(Json::Int64(kint64min));
1016
1017 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
1018
1019 checks = IsCheck();
1020 checks.isInt64_ = true;
1021 checks.isIntegral_ = true;
1022 checks.isDouble_ = true;
1023 checks.isNumeric_ = true;
1024 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1025
1026 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1027 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1028 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1029
1030 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
1031 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
1032 JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
1033 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
1034 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1035 JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
1036
1037 // int64 min (floating point constructor). Note that kint64min *is* exactly
1038 // representable as a double.
1039 val = Json::Value(double(kint64min));
1040
1041 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1042
1043 checks = IsCheck();
1044 checks.isInt64_ = true;
1045 checks.isIntegral_ = true;
1046 checks.isDouble_ = true;
1047 checks.isNumeric_ = true;
1048 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1049
1050 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1051 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1052 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1053
1054 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
1055 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
1056 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
1057 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
1058 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1059 JSONTEST_ASSERT_STRING_EQUAL(
1060 "-9.2233720368547758e+18",
1061 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1062
1063 // 10^19
1064 const auto ten_to_19 = static_cast<Json::UInt64>(1e19);
1065 val = Json::Value(Json::UInt64(ten_to_19));
1066
1067 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1068
1069 checks = IsCheck();
1070 checks.isUInt64_ = true;
1071 checks.isIntegral_ = true;
1072 checks.isDouble_ = true;
1073 checks.isNumeric_ = true;
1074 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1075
1076 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1077 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1078 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1079
1080 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
1081 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
1082 JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
1083 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
1084 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1085 JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
1086
1087 // 10^19 (double constructor). Note that 10^19 is not exactly representable
1088 // as a double.
1089 val = Json::Value(uint64ToDouble(ten_to_19));
1090
1091 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1092
1093 checks = IsCheck();
1094 checks.isUInt64_ = true;
1095 checks.isIntegral_ = true;
1096 checks.isDouble_ = true;
1097 checks.isNumeric_ = true;
1098 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1099
1100 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1101 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1102 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1103
1104 JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
1105 JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
1106 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1107 JSONTEST_ASSERT_STRING_EQUAL(
1108 "1e+19",
1109 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1110
1111 // uint64 max
1112 val = Json::Value(Json::UInt64(kuint64max));
1113
1114 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1115
1116 checks = IsCheck();
1117 checks.isUInt64_ = true;
1118 checks.isIntegral_ = true;
1119 checks.isDouble_ = true;
1120 checks.isNumeric_ = true;
1121 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1122
1123 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1124 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1125 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1126
1127 JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
1128 JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
1129 JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
1130 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
1131 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1132 JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
1133
1134 // uint64 max (floating point constructor). Note that kuint64max is not
1135 // exactly representable as a double, and will be rounded up to be higher.
1136 val = Json::Value(uint64ToDouble(kuint64max));
1137
1138 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1139
1140 checks = IsCheck();
1141 checks.isDouble_ = true;
1142 checks.isNumeric_ = true;
1143 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1144
1145 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1146 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1147 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1148
1149 JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
1150 JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
1151 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1152 JSONTEST_ASSERT_STRING_EQUAL(
1153 "1.8446744073709552e+19",
1154 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1155 #endif
1156 }
1157
JSONTEST_FIXTURE(ValueTest,nonIntegers)1158 JSONTEST_FIXTURE(ValueTest, nonIntegers) {
1159 IsCheck checks;
1160 Json::Value val;
1161
1162 // Small positive number
1163 val = Json::Value(1.5);
1164
1165 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1166
1167 checks = IsCheck();
1168 checks.isDouble_ = true;
1169 checks.isNumeric_ = true;
1170 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1171
1172 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1173 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1174 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1175 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1176 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1177 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1178 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1179 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1180
1181 JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
1182 JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
1183 JSONTEST_ASSERT_EQUAL(1, val.asInt());
1184 JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
1185 JSONTEST_ASSERT_EQUAL(1, val.asUInt());
1186 JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
1187 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1188 JSONTEST_ASSERT_EQUAL("1.5", val.asString());
1189
1190 // Small negative number
1191 val = Json::Value(-1.5);
1192
1193 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1194
1195 checks = IsCheck();
1196 checks.isDouble_ = true;
1197 checks.isNumeric_ = true;
1198 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1199
1200 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1201 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1202 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1203 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1204 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1205 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1206 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1207 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1208
1209 JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
1210 JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
1211 JSONTEST_ASSERT_EQUAL(-1, val.asInt());
1212 JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
1213 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1214 JSONTEST_ASSERT_EQUAL("-1.5", val.asString());
1215
1216 // A bit over int32 max
1217 val = Json::Value(kint32max + 0.5);
1218
1219 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1220
1221 checks = IsCheck();
1222 checks.isDouble_ = true;
1223 checks.isNumeric_ = true;
1224 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1225
1226 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1227 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1228 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1229 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1230 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1231 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1232 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1233 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1234
1235 JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
1236 JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
1237 JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
1238 #ifdef JSON_HAS_INT64
1239 JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
1240 JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
1241 #endif
1242 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1243 JSONTEST_ASSERT_EQUAL(
1244 "2147483647.5",
1245 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1246
1247 // A bit under int32 min
1248 val = Json::Value(kint32min - 0.5);
1249
1250 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1251
1252 checks = IsCheck();
1253 checks.isDouble_ = true;
1254 checks.isNumeric_ = true;
1255 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1256
1257 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1258 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1259 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1260 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1261 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1262 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1263 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1264 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1265
1266 JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
1267 JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
1268 #ifdef JSON_HAS_INT64
1269 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 31), val.asLargestInt());
1270 #endif
1271 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1272 JSONTEST_ASSERT_EQUAL(
1273 "-2147483648.5",
1274 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1275
1276 // A bit over uint32 max
1277 val = Json::Value(kuint32max + 0.5);
1278
1279 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1280
1281 checks = IsCheck();
1282 checks.isDouble_ = true;
1283 checks.isNumeric_ = true;
1284 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1285
1286 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1287 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1288 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1289 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1290 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1291 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1292 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1293 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1294
1295 JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
1296 JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
1297 #ifdef JSON_HAS_INT64
1298 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32) - 1, val.asLargestInt());
1299 JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32) - Json::UInt64(1),
1300 val.asLargestUInt());
1301 #endif
1302 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1303 JSONTEST_ASSERT_EQUAL(
1304 "4294967295.5",
1305 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1306
1307 val = Json::Value(1.2345678901234);
1308 JSONTEST_ASSERT_STRING_EQUAL(
1309 "1.2345678901234001",
1310 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1311
1312 // A 16-digit floating point number.
1313 val = Json::Value(2199023255552000.0f);
1314 JSONTEST_ASSERT_EQUAL(float(2199023255552000.0f), val.asFloat());
1315 JSONTEST_ASSERT_STRING_EQUAL(
1316 "2199023255552000.0",
1317 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1318
1319 // A very large floating point number.
1320 val = Json::Value(3.402823466385289e38);
1321 JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
1322 JSONTEST_ASSERT_STRING_EQUAL(
1323 "3.402823466385289e+38",
1324 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1325
1326 // An even larger floating point number.
1327 val = Json::Value(1.2345678e300);
1328 JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
1329 JSONTEST_ASSERT_STRING_EQUAL(
1330 "1.2345678e+300",
1331 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1332 }
1333
checkConstMemberCount(const Json::Value & value,unsigned int expectedCount)1334 void ValueTest::checkConstMemberCount(const Json::Value& value,
1335 unsigned int expectedCount) {
1336 unsigned int count = 0;
1337 Json::Value::const_iterator itEnd = value.end();
1338 for (Json::Value::const_iterator it = value.begin(); it != itEnd; ++it) {
1339 ++count;
1340 }
1341 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::const_iterator";
1342 }
1343
checkMemberCount(Json::Value & value,unsigned int expectedCount)1344 void ValueTest::checkMemberCount(Json::Value& value,
1345 unsigned int expectedCount) {
1346 JSONTEST_ASSERT_EQUAL(expectedCount, value.size());
1347
1348 unsigned int count = 0;
1349 Json::Value::iterator itEnd = value.end();
1350 for (Json::Value::iterator it = value.begin(); it != itEnd; ++it) {
1351 ++count;
1352 }
1353 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::iterator";
1354
1355 JSONTEST_ASSERT_PRED(checkConstMemberCount(value, expectedCount));
1356 }
1357
1358 ValueTest::IsCheck::IsCheck()
1359
1360 = default;
1361
checkIs(const Json::Value & value,const IsCheck & check)1362 void ValueTest::checkIs(const Json::Value& value, const IsCheck& check) {
1363 JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject());
1364 JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray());
1365 JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool());
1366 JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble());
1367 JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt());
1368 JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt());
1369 JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral());
1370 JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric());
1371 JSONTEST_ASSERT_EQUAL(check.isString_, value.isString());
1372 JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull());
1373
1374 #ifdef JSON_HAS_INT64
1375 JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64());
1376 JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64());
1377 #else
1378 JSONTEST_ASSERT_EQUAL(false, value.isInt64());
1379 JSONTEST_ASSERT_EQUAL(false, value.isUInt64());
1380 #endif
1381 }
1382
JSONTEST_FIXTURE(ValueTest,compareNull)1383 JSONTEST_FIXTURE(ValueTest, compareNull) {
1384 JSONTEST_ASSERT_PRED(checkIsEqual(Json::Value(), Json::Value()));
1385 }
1386
JSONTEST_FIXTURE(ValueTest,compareInt)1387 JSONTEST_FIXTURE(ValueTest, compareInt) {
1388 JSONTEST_ASSERT_PRED(checkIsLess(0, 10));
1389 JSONTEST_ASSERT_PRED(checkIsEqual(10, 10));
1390 JSONTEST_ASSERT_PRED(checkIsEqual(-10, -10));
1391 JSONTEST_ASSERT_PRED(checkIsLess(-10, 0));
1392 }
1393
JSONTEST_FIXTURE(ValueTest,compareUInt)1394 JSONTEST_FIXTURE(ValueTest, compareUInt) {
1395 JSONTEST_ASSERT_PRED(checkIsLess(0u, 10u));
1396 JSONTEST_ASSERT_PRED(checkIsLess(0u, Json::Value::maxUInt));
1397 JSONTEST_ASSERT_PRED(checkIsEqual(10u, 10u));
1398 }
1399
JSONTEST_FIXTURE(ValueTest,compareDouble)1400 JSONTEST_FIXTURE(ValueTest, compareDouble) {
1401 JSONTEST_ASSERT_PRED(checkIsLess(0.0, 10.0));
1402 JSONTEST_ASSERT_PRED(checkIsEqual(10.0, 10.0));
1403 JSONTEST_ASSERT_PRED(checkIsEqual(-10.0, -10.0));
1404 JSONTEST_ASSERT_PRED(checkIsLess(-10.0, 0.0));
1405 }
1406
JSONTEST_FIXTURE(ValueTest,compareString)1407 JSONTEST_FIXTURE(ValueTest, compareString) {
1408 JSONTEST_ASSERT_PRED(checkIsLess("", " "));
1409 JSONTEST_ASSERT_PRED(checkIsLess("", "a"));
1410 JSONTEST_ASSERT_PRED(checkIsLess("abcd", "zyui"));
1411 JSONTEST_ASSERT_PRED(checkIsLess("abc", "abcd"));
1412 JSONTEST_ASSERT_PRED(checkIsEqual("abcd", "abcd"));
1413 JSONTEST_ASSERT_PRED(checkIsEqual(" ", " "));
1414 JSONTEST_ASSERT_PRED(checkIsLess("ABCD", "abcd"));
1415 JSONTEST_ASSERT_PRED(checkIsEqual("ABCD", "ABCD"));
1416 }
1417
JSONTEST_FIXTURE(ValueTest,compareBoolean)1418 JSONTEST_FIXTURE(ValueTest, compareBoolean) {
1419 JSONTEST_ASSERT_PRED(checkIsLess(false, true));
1420 JSONTEST_ASSERT_PRED(checkIsEqual(false, false));
1421 JSONTEST_ASSERT_PRED(checkIsEqual(true, true));
1422 }
1423
JSONTEST_FIXTURE(ValueTest,compareArray)1424 JSONTEST_FIXTURE(ValueTest, compareArray) {
1425 // array compare size then content
1426 Json::Value emptyArray(Json::arrayValue);
1427 Json::Value l1aArray;
1428 l1aArray.append(0);
1429 Json::Value l1bArray;
1430 l1bArray.append(10);
1431 Json::Value l2aArray;
1432 l2aArray.append(0);
1433 l2aArray.append(0);
1434 Json::Value l2bArray;
1435 l2bArray.append(0);
1436 l2bArray.append(10);
1437 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l1aArray));
1438 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l2aArray));
1439 JSONTEST_ASSERT_PRED(checkIsLess(l1aArray, l2aArray));
1440 JSONTEST_ASSERT_PRED(checkIsLess(l2aArray, l2bArray));
1441 JSONTEST_ASSERT_PRED(checkIsEqual(emptyArray, Json::Value(emptyArray)));
1442 JSONTEST_ASSERT_PRED(checkIsEqual(l1aArray, Json::Value(l1aArray)));
1443 JSONTEST_ASSERT_PRED(checkIsEqual(l2bArray, Json::Value(l2bArray)));
1444 }
1445
JSONTEST_FIXTURE(ValueTest,compareObject)1446 JSONTEST_FIXTURE(ValueTest, compareObject) {
1447 // object compare size then content
1448 Json::Value emptyObject(Json::objectValue);
1449 Json::Value l1aObject;
1450 l1aObject["key1"] = 0;
1451 Json::Value l1bObject;
1452 l1aObject["key1"] = 10;
1453 Json::Value l2aObject;
1454 l2aObject["key1"] = 0;
1455 l2aObject["key2"] = 0;
1456 JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l1aObject));
1457 JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l2aObject));
1458 JSONTEST_ASSERT_PRED(checkIsLess(l1aObject, l2aObject));
1459 JSONTEST_ASSERT_PRED(checkIsEqual(emptyObject, Json::Value(emptyObject)));
1460 JSONTEST_ASSERT_PRED(checkIsEqual(l1aObject, Json::Value(l1aObject)));
1461 JSONTEST_ASSERT_PRED(checkIsEqual(l2aObject, Json::Value(l2aObject)));
1462 }
1463
JSONTEST_FIXTURE(ValueTest,compareType)1464 JSONTEST_FIXTURE(ValueTest, compareType) {
1465 // object of different type are ordered according to their type
1466 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(), Json::Value(1)));
1467 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1), Json::Value(1u)));
1468 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1u), Json::Value(1.0)));
1469 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1.0), Json::Value("a")));
1470 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value("a"), Json::Value(true)));
1471 JSONTEST_ASSERT_PRED(
1472 checkIsLess(Json::Value(true), Json::Value(Json::arrayValue)));
1473 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(Json::arrayValue),
1474 Json::Value(Json::objectValue)));
1475 }
1476
JSONTEST_FIXTURE(ValueTest,CopyObject)1477 JSONTEST_FIXTURE(ValueTest, CopyObject) {
1478 Json::Value arrayVal;
1479 arrayVal.append("val1");
1480 arrayVal.append("val2");
1481 arrayVal.append("val3");
1482 Json::Value stringVal("string value");
1483 Json::Value copy1, copy2;
1484 {
1485 Json::Value arrayCopy, stringCopy;
1486 arrayCopy.copy(arrayVal);
1487 stringCopy.copy(stringVal);
1488 JSONTEST_ASSERT_PRED(checkIsEqual(arrayCopy, arrayVal));
1489 JSONTEST_ASSERT_PRED(checkIsEqual(stringCopy, stringVal));
1490 arrayCopy.append("val4");
1491 JSONTEST_ASSERT(arrayCopy.size() == 4);
1492 arrayVal.append("new4");
1493 arrayVal.append("new5");
1494 JSONTEST_ASSERT(arrayVal.size() == 5);
1495 JSONTEST_ASSERT(!(arrayCopy == arrayVal));
1496 stringCopy = "another string";
1497 JSONTEST_ASSERT(!(stringCopy == stringVal));
1498 copy1.copy(arrayCopy);
1499 copy2.copy(stringCopy);
1500 }
1501 JSONTEST_ASSERT(arrayVal.size() == 5);
1502 JSONTEST_ASSERT(stringVal == "string value");
1503 JSONTEST_ASSERT(copy1.size() == 4);
1504 JSONTEST_ASSERT(copy2 == "another string");
1505 copy1.copy(stringVal);
1506 JSONTEST_ASSERT(copy1 == "string value");
1507 copy2.copy(arrayVal);
1508 JSONTEST_ASSERT(copy2.size() == 5);
1509 }
1510
checkIsLess(const Json::Value & x,const Json::Value & y)1511 void ValueTest::checkIsLess(const Json::Value& x, const Json::Value& y) {
1512 JSONTEST_ASSERT(x < y);
1513 JSONTEST_ASSERT(y > x);
1514 JSONTEST_ASSERT(x <= y);
1515 JSONTEST_ASSERT(y >= x);
1516 JSONTEST_ASSERT(!(x == y));
1517 JSONTEST_ASSERT(!(y == x));
1518 JSONTEST_ASSERT(!(x >= y));
1519 JSONTEST_ASSERT(!(y <= x));
1520 JSONTEST_ASSERT(!(x > y));
1521 JSONTEST_ASSERT(!(y < x));
1522 JSONTEST_ASSERT(x.compare(y) < 0);
1523 JSONTEST_ASSERT(y.compare(x) >= 0);
1524 }
1525
checkIsEqual(const Json::Value & x,const Json::Value & y)1526 void ValueTest::checkIsEqual(const Json::Value& x, const Json::Value& y) {
1527 JSONTEST_ASSERT(x == y);
1528 JSONTEST_ASSERT(y == x);
1529 JSONTEST_ASSERT(x <= y);
1530 JSONTEST_ASSERT(y <= x);
1531 JSONTEST_ASSERT(x >= y);
1532 JSONTEST_ASSERT(y >= x);
1533 JSONTEST_ASSERT(!(x < y));
1534 JSONTEST_ASSERT(!(y < x));
1535 JSONTEST_ASSERT(!(x > y));
1536 JSONTEST_ASSERT(!(y > x));
1537 JSONTEST_ASSERT(x.compare(y) == 0);
1538 JSONTEST_ASSERT(y.compare(x) == 0);
1539 }
1540
JSONTEST_FIXTURE(ValueTest,typeChecksThrowExceptions)1541 JSONTEST_FIXTURE(ValueTest, typeChecksThrowExceptions) {
1542 #if JSON_USE_EXCEPTION
1543
1544 Json::Value intVal(1);
1545 Json::Value strVal("Test");
1546 Json::Value objVal(Json::objectValue);
1547 Json::Value arrVal(Json::arrayValue);
1548
1549 JSONTEST_ASSERT_THROWS(intVal["test"]);
1550 JSONTEST_ASSERT_THROWS(strVal["test"]);
1551 JSONTEST_ASSERT_THROWS(arrVal["test"]);
1552
1553 JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
1554 JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
1555 JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
1556
1557 JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
1558 JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
1559 JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
1560
1561 JSONTEST_ASSERT_THROWS(intVal[0]);
1562 JSONTEST_ASSERT_THROWS(objVal[0]);
1563 JSONTEST_ASSERT_THROWS(strVal[0]);
1564
1565 JSONTEST_ASSERT_THROWS(intVal.clear());
1566
1567 JSONTEST_ASSERT_THROWS(intVal.resize(1));
1568 JSONTEST_ASSERT_THROWS(strVal.resize(1));
1569 JSONTEST_ASSERT_THROWS(objVal.resize(1));
1570
1571 JSONTEST_ASSERT_THROWS(intVal.asCString());
1572
1573 JSONTEST_ASSERT_THROWS(objVal.asString());
1574 JSONTEST_ASSERT_THROWS(arrVal.asString());
1575
1576 JSONTEST_ASSERT_THROWS(strVal.asInt());
1577 JSONTEST_ASSERT_THROWS(objVal.asInt());
1578 JSONTEST_ASSERT_THROWS(arrVal.asInt());
1579
1580 JSONTEST_ASSERT_THROWS(strVal.asUInt());
1581 JSONTEST_ASSERT_THROWS(objVal.asUInt());
1582 JSONTEST_ASSERT_THROWS(arrVal.asUInt());
1583
1584 JSONTEST_ASSERT_THROWS(strVal.asInt64());
1585 JSONTEST_ASSERT_THROWS(objVal.asInt64());
1586 JSONTEST_ASSERT_THROWS(arrVal.asInt64());
1587
1588 JSONTEST_ASSERT_THROWS(strVal.asUInt64());
1589 JSONTEST_ASSERT_THROWS(objVal.asUInt64());
1590 JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
1591
1592 JSONTEST_ASSERT_THROWS(strVal.asDouble());
1593 JSONTEST_ASSERT_THROWS(objVal.asDouble());
1594 JSONTEST_ASSERT_THROWS(arrVal.asDouble());
1595
1596 JSONTEST_ASSERT_THROWS(strVal.asFloat());
1597 JSONTEST_ASSERT_THROWS(objVal.asFloat());
1598 JSONTEST_ASSERT_THROWS(arrVal.asFloat());
1599
1600 JSONTEST_ASSERT_THROWS(strVal.asBool());
1601 JSONTEST_ASSERT_THROWS(objVal.asBool());
1602 JSONTEST_ASSERT_THROWS(arrVal.asBool());
1603
1604 #endif
1605 }
1606
JSONTEST_FIXTURE(ValueTest,offsetAccessors)1607 JSONTEST_FIXTURE(ValueTest, offsetAccessors) {
1608 Json::Value x;
1609 JSONTEST_ASSERT(x.getOffsetStart() == 0);
1610 JSONTEST_ASSERT(x.getOffsetLimit() == 0);
1611 x.setOffsetStart(10);
1612 x.setOffsetLimit(20);
1613 JSONTEST_ASSERT(x.getOffsetStart() == 10);
1614 JSONTEST_ASSERT(x.getOffsetLimit() == 20);
1615 Json::Value y(x);
1616 JSONTEST_ASSERT(y.getOffsetStart() == 10);
1617 JSONTEST_ASSERT(y.getOffsetLimit() == 20);
1618 Json::Value z;
1619 z.swap(y);
1620 JSONTEST_ASSERT(z.getOffsetStart() == 10);
1621 JSONTEST_ASSERT(z.getOffsetLimit() == 20);
1622 JSONTEST_ASSERT(y.getOffsetStart() == 0);
1623 JSONTEST_ASSERT(y.getOffsetLimit() == 0);
1624 }
1625
JSONTEST_FIXTURE(ValueTest,StaticString)1626 JSONTEST_FIXTURE(ValueTest, StaticString) {
1627 char mutant[] = "hello";
1628 Json::StaticString ss(mutant);
1629 Json::String regular(mutant);
1630 mutant[1] = 'a';
1631 JSONTEST_ASSERT_STRING_EQUAL("hallo", ss.c_str());
1632 JSONTEST_ASSERT_STRING_EQUAL("hello", regular.c_str());
1633 {
1634 Json::Value root;
1635 root["top"] = ss;
1636 JSONTEST_ASSERT_STRING_EQUAL("hallo", root["top"].asString());
1637 mutant[1] = 'u';
1638 JSONTEST_ASSERT_STRING_EQUAL("hullo", root["top"].asString());
1639 }
1640 {
1641 Json::Value root;
1642 root["top"] = regular;
1643 JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
1644 mutant[1] = 'u';
1645 JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
1646 }
1647 }
1648
JSONTEST_FIXTURE(ValueTest,WideString)1649 JSONTEST_FIXTURE(ValueTest, WideString) {
1650 // https://github.com/open-source-parsers/jsoncpp/issues/756
1651 const std::string uni = u8"式,进"; // "\u5f0f\uff0c\u8fdb"
1652 std::string styled;
1653 {
1654 Json::Value v;
1655 v["abc"] = uni;
1656 styled = v.toStyledString();
1657 }
1658 Json::Value root;
1659 {
1660 JSONCPP_STRING errs;
1661 std::istringstream iss(styled);
1662 bool ok = parseFromStream(Json::CharReaderBuilder(), iss, &root, &errs);
1663 JSONTEST_ASSERT(ok);
1664 if (!ok) {
1665 std::cerr << "errs: " << errs << std::endl;
1666 }
1667 }
1668 JSONTEST_ASSERT_STRING_EQUAL(root["abc"].asString(), uni);
1669 }
1670
JSONTEST_FIXTURE(ValueTest,CommentBefore)1671 JSONTEST_FIXTURE(ValueTest, CommentBefore) {
1672 Json::Value val; // fill val
1673 val.setComment(Json::String("// this comment should appear before"),
1674 Json::commentBefore);
1675 Json::StreamWriterBuilder wbuilder;
1676 wbuilder.settings_["commentStyle"] = "All";
1677 {
1678 char const expected[] = "// this comment should appear before\nnull";
1679 Json::String result = Json::writeString(wbuilder, val);
1680 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1681 Json::String res2 = val.toStyledString();
1682 Json::String exp2 = "\n";
1683 exp2 += expected;
1684 exp2 += "\n";
1685 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1686 }
1687 Json::Value other = "hello";
1688 val.swapPayload(other);
1689 {
1690 char const expected[] = "// this comment should appear before\n\"hello\"";
1691 Json::String result = Json::writeString(wbuilder, val);
1692 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1693 Json::String res2 = val.toStyledString();
1694 Json::String exp2 = "\n";
1695 exp2 += expected;
1696 exp2 += "\n";
1697 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1698 JSONTEST_ASSERT_STRING_EQUAL("null\n", other.toStyledString());
1699 }
1700 val = "hello";
1701 // val.setComment("// this comment should appear before",
1702 // Json::CommentPlacement::commentBefore); Assignment over-writes comments.
1703 {
1704 char const expected[] = "\"hello\"";
1705 Json::String result = Json::writeString(wbuilder, val);
1706 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1707 Json::String res2 = val.toStyledString();
1708 Json::String exp2 = "";
1709 exp2 += expected;
1710 exp2 += "\n";
1711 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1712 }
1713 }
1714
JSONTEST_FIXTURE(ValueTest,zeroes)1715 JSONTEST_FIXTURE(ValueTest, zeroes) {
1716 char const cstr[] = "h\0i";
1717 Json::String binary(cstr, sizeof(cstr)); // include trailing 0
1718 JSONTEST_ASSERT_EQUAL(4U, binary.length());
1719 Json::StreamWriterBuilder b;
1720 {
1721 Json::Value root;
1722 root = binary;
1723 JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
1724 }
1725 {
1726 char const top[] = "top";
1727 Json::Value root;
1728 root[top] = binary;
1729 JSONTEST_ASSERT_STRING_EQUAL(binary, root[top].asString());
1730 Json::Value removed;
1731 bool did;
1732 did = root.removeMember(top, top + sizeof(top) - 1U, &removed);
1733 JSONTEST_ASSERT(did);
1734 JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString());
1735 did = root.removeMember(top, top + sizeof(top) - 1U, &removed);
1736 JSONTEST_ASSERT(!did);
1737 JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString()); // still
1738 }
1739 }
1740
JSONTEST_FIXTURE(ValueTest,zeroesInKeys)1741 JSONTEST_FIXTURE(ValueTest, zeroesInKeys) {
1742 char const cstr[] = "h\0i";
1743 Json::String binary(cstr, sizeof(cstr)); // include trailing 0
1744 JSONTEST_ASSERT_EQUAL(4U, binary.length());
1745 {
1746 Json::Value root;
1747 root[binary] = "there";
1748 JSONTEST_ASSERT_STRING_EQUAL("there", root[binary].asString());
1749 JSONTEST_ASSERT(!root.isMember("h"));
1750 JSONTEST_ASSERT(root.isMember(binary));
1751 JSONTEST_ASSERT_STRING_EQUAL(
1752 "there", root.get(binary, Json::Value::nullRef).asString());
1753 Json::Value removed;
1754 bool did;
1755 did = root.removeMember(binary.data(), binary.data() + binary.length(),
1756 &removed);
1757 JSONTEST_ASSERT(did);
1758 JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString());
1759 did = root.removeMember(binary.data(), binary.data() + binary.length(),
1760 &removed);
1761 JSONTEST_ASSERT(!did);
1762 JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString()); // still
1763 JSONTEST_ASSERT(!root.isMember(binary));
1764 JSONTEST_ASSERT_STRING_EQUAL(
1765 "", root.get(binary, Json::Value::nullRef).asString());
1766 }
1767 }
1768
JSONTEST_FIXTURE(ValueTest,specialFloats)1769 JSONTEST_FIXTURE(ValueTest, specialFloats) {
1770 Json::StreamWriterBuilder b;
1771 b.settings_["useSpecialFloats"] = true;
1772
1773 Json::Value v = std::numeric_limits<double>::quiet_NaN();
1774 Json::String expected = "NaN";
1775 Json::String result = Json::writeString(b, v);
1776 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1777
1778 v = std::numeric_limits<double>::infinity();
1779 expected = "Infinity";
1780 result = Json::writeString(b, v);
1781 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1782
1783 v = -std::numeric_limits<double>::infinity();
1784 expected = "-Infinity";
1785 result = Json::writeString(b, v);
1786 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1787 }
1788
JSONTEST_FIXTURE(ValueTest,precision)1789 JSONTEST_FIXTURE(ValueTest, precision) {
1790 Json::StreamWriterBuilder b;
1791 b.settings_["precision"] = 5;
1792
1793 Json::Value v = 100.0 / 3;
1794 Json::String expected = "33.333";
1795 Json::String result = Json::writeString(b, v);
1796 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1797
1798 v = 0.25000000;
1799 expected = "0.25";
1800 result = Json::writeString(b, v);
1801 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1802
1803 v = 0.2563456;
1804 expected = "0.25635";
1805 result = Json::writeString(b, v);
1806 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1807
1808 b.settings_["precision"] = 1;
1809 expected = "0.3";
1810 result = Json::writeString(b, v);
1811 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1812
1813 b.settings_["precision"] = 17;
1814 v = 1234857476305.256345694873740545068;
1815 expected = "1234857476305.2563";
1816 result = Json::writeString(b, v);
1817 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1818
1819 b.settings_["precision"] = 24;
1820 v = 0.256345694873740545068;
1821 expected = "0.25634569487374054";
1822 result = Json::writeString(b, v);
1823 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1824
1825 b.settings_["precision"] = 5;
1826 b.settings_["precisionType"] = "decimal";
1827 v = 0.256345694873740545068;
1828 expected = "0.25635";
1829 result = Json::writeString(b, v);
1830 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1831
1832 b.settings_["precision"] = 1;
1833 b.settings_["precisionType"] = "decimal";
1834 v = 0.256345694873740545068;
1835 expected = "0.3";
1836 result = Json::writeString(b, v);
1837 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1838
1839 b.settings_["precision"] = 10;
1840 b.settings_["precisionType"] = "decimal";
1841 v = 0.23300000;
1842 expected = "0.233";
1843 result = Json::writeString(b, v);
1844 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1845 }
1846
1847 struct WriterTest : JsonTest::TestCase {};
1848
JSONTEST_FIXTURE(WriterTest,dropNullPlaceholders)1849 JSONTEST_FIXTURE(WriterTest, dropNullPlaceholders) {
1850 Json::FastWriter writer;
1851 Json::Value nullValue;
1852 JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
1853
1854 writer.dropNullPlaceholders();
1855 JSONTEST_ASSERT(writer.write(nullValue) == "\n");
1856 }
1857
1858 struct StreamWriterTest : JsonTest::TestCase {};
1859
JSONTEST_FIXTURE(StreamWriterTest,dropNullPlaceholders)1860 JSONTEST_FIXTURE(StreamWriterTest, dropNullPlaceholders) {
1861 Json::StreamWriterBuilder b;
1862 Json::Value nullValue;
1863 b.settings_["dropNullPlaceholders"] = false;
1864 JSONTEST_ASSERT(Json::writeString(b, nullValue) == "null");
1865 b.settings_["dropNullPlaceholders"] = true;
1866 JSONTEST_ASSERT(Json::writeString(b, nullValue).empty());
1867 }
1868
JSONTEST_FIXTURE(StreamWriterTest,writeZeroes)1869 JSONTEST_FIXTURE(StreamWriterTest, writeZeroes) {
1870 Json::String binary("hi", 3); // include trailing 0
1871 JSONTEST_ASSERT_EQUAL(3, binary.length());
1872 Json::String expected("\"hi\\u0000\""); // unicoded zero
1873 Json::StreamWriterBuilder b;
1874 {
1875 Json::Value root;
1876 root = binary;
1877 JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
1878 Json::String out = Json::writeString(b, root);
1879 JSONTEST_ASSERT_EQUAL(expected.size(), out.size());
1880 JSONTEST_ASSERT_STRING_EQUAL(expected, out);
1881 }
1882 {
1883 Json::Value root;
1884 root["top"] = binary;
1885 JSONTEST_ASSERT_STRING_EQUAL(binary, root["top"].asString());
1886 Json::String out = Json::writeString(b, root["top"]);
1887 JSONTEST_ASSERT_STRING_EQUAL(expected, out);
1888 }
1889 }
1890
1891 struct ReaderTest : JsonTest::TestCase {};
1892
JSONTEST_FIXTURE(ReaderTest,parseWithNoErrors)1893 JSONTEST_FIXTURE(ReaderTest, parseWithNoErrors) {
1894 Json::Reader reader;
1895 Json::Value root;
1896 bool ok = reader.parse("{ \"property\" : \"value\" }", root);
1897 JSONTEST_ASSERT(ok);
1898 JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty());
1899 JSONTEST_ASSERT(reader.getStructuredErrors().empty());
1900 }
1901
JSONTEST_FIXTURE(ReaderTest,parseWithNoErrorsTestingOffsets)1902 JSONTEST_FIXTURE(ReaderTest, parseWithNoErrorsTestingOffsets) {
1903 Json::Reader reader;
1904 Json::Value root;
1905 bool ok = reader.parse("{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
1906 "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
1907 "null, \"false\" : false }",
1908 root);
1909 JSONTEST_ASSERT(ok);
1910 JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty());
1911 JSONTEST_ASSERT(reader.getStructuredErrors().empty());
1912 JSONTEST_ASSERT(root["property"].getOffsetStart() == 15);
1913 JSONTEST_ASSERT(root["property"].getOffsetLimit() == 34);
1914 JSONTEST_ASSERT(root["property"][0].getOffsetStart() == 16);
1915 JSONTEST_ASSERT(root["property"][0].getOffsetLimit() == 23);
1916 JSONTEST_ASSERT(root["property"][1].getOffsetStart() == 25);
1917 JSONTEST_ASSERT(root["property"][1].getOffsetLimit() == 33);
1918 JSONTEST_ASSERT(root["obj"].getOffsetStart() == 44);
1919 JSONTEST_ASSERT(root["obj"].getOffsetLimit() == 76);
1920 JSONTEST_ASSERT(root["obj"]["nested"].getOffsetStart() == 57);
1921 JSONTEST_ASSERT(root["obj"]["nested"].getOffsetLimit() == 60);
1922 JSONTEST_ASSERT(root["obj"]["bool"].getOffsetStart() == 71);
1923 JSONTEST_ASSERT(root["obj"]["bool"].getOffsetLimit() == 75);
1924 JSONTEST_ASSERT(root["null"].getOffsetStart() == 87);
1925 JSONTEST_ASSERT(root["null"].getOffsetLimit() == 91);
1926 JSONTEST_ASSERT(root["false"].getOffsetStart() == 103);
1927 JSONTEST_ASSERT(root["false"].getOffsetLimit() == 108);
1928 JSONTEST_ASSERT(root.getOffsetStart() == 0);
1929 JSONTEST_ASSERT(root.getOffsetLimit() == 110);
1930 }
1931
JSONTEST_FIXTURE(ReaderTest,parseWithOneError)1932 JSONTEST_FIXTURE(ReaderTest, parseWithOneError) {
1933 Json::Reader reader;
1934 Json::Value root;
1935 bool ok = reader.parse("{ \"property\" :: \"value\" }", root);
1936 JSONTEST_ASSERT(!ok);
1937 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1938 "* Line 1, Column 15\n Syntax error: value, object or array "
1939 "expected.\n");
1940 std::vector<Json::Reader::StructuredError> errors =
1941 reader.getStructuredErrors();
1942 JSONTEST_ASSERT(errors.size() == 1);
1943 JSONTEST_ASSERT(errors.at(0).offset_start == 14);
1944 JSONTEST_ASSERT(errors.at(0).offset_limit == 15);
1945 JSONTEST_ASSERT(errors.at(0).message ==
1946 "Syntax error: value, object or array expected.");
1947 }
1948
JSONTEST_FIXTURE(ReaderTest,parseChineseWithOneError)1949 JSONTEST_FIXTURE(ReaderTest, parseChineseWithOneError) {
1950 Json::Reader reader;
1951 Json::Value root;
1952 bool ok = reader.parse("{ \"pr佐藤erty\" :: \"value\" }", root);
1953 JSONTEST_ASSERT(!ok);
1954 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1955 "* Line 1, Column 19\n Syntax error: value, object or array "
1956 "expected.\n");
1957 std::vector<Json::Reader::StructuredError> errors =
1958 reader.getStructuredErrors();
1959 JSONTEST_ASSERT(errors.size() == 1);
1960 JSONTEST_ASSERT(errors.at(0).offset_start == 18);
1961 JSONTEST_ASSERT(errors.at(0).offset_limit == 19);
1962 JSONTEST_ASSERT(errors.at(0).message ==
1963 "Syntax error: value, object or array expected.");
1964 }
1965
JSONTEST_FIXTURE(ReaderTest,parseWithDetailError)1966 JSONTEST_FIXTURE(ReaderTest, parseWithDetailError) {
1967 Json::Reader reader;
1968 Json::Value root;
1969 bool ok = reader.parse("{ \"property\" : \"v\\alue\" }", root);
1970 JSONTEST_ASSERT(!ok);
1971 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1972 "* Line 1, Column 16\n Bad escape sequence in string\nSee "
1973 "Line 1, Column 20 for detail.\n");
1974 std::vector<Json::Reader::StructuredError> errors =
1975 reader.getStructuredErrors();
1976 JSONTEST_ASSERT(errors.size() == 1);
1977 JSONTEST_ASSERT(errors.at(0).offset_start == 15);
1978 JSONTEST_ASSERT(errors.at(0).offset_limit == 23);
1979 JSONTEST_ASSERT(errors.at(0).message == "Bad escape sequence in string");
1980 }
1981
1982 struct CharReaderTest : JsonTest::TestCase {};
1983
JSONTEST_FIXTURE(CharReaderTest,parseWithNoErrors)1984 JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrors) {
1985 Json::CharReaderBuilder b;
1986 Json::CharReader* reader(b.newCharReader());
1987 Json::String errs;
1988 Json::Value root;
1989 char const doc[] = "{ \"property\" : \"value\" }";
1990 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
1991 JSONTEST_ASSERT(ok);
1992 JSONTEST_ASSERT(errs.empty());
1993 delete reader;
1994 }
1995
JSONTEST_FIXTURE(CharReaderTest,parseWithNoErrorsTestingOffsets)1996 JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrorsTestingOffsets) {
1997 Json::CharReaderBuilder b;
1998 Json::CharReader* reader(b.newCharReader());
1999 Json::String errs;
2000 Json::Value root;
2001 char const doc[] = "{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
2002 "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
2003 "null, \"false\" : false }";
2004 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2005 JSONTEST_ASSERT(ok);
2006 JSONTEST_ASSERT(errs.empty());
2007 delete reader;
2008 }
2009
JSONTEST_FIXTURE(CharReaderTest,parseWithOneError)2010 JSONTEST_FIXTURE(CharReaderTest, parseWithOneError) {
2011 Json::CharReaderBuilder b;
2012 Json::CharReader* reader(b.newCharReader());
2013 Json::String errs;
2014 Json::Value root;
2015 char const doc[] = "{ \"property\" :: \"value\" }";
2016 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2017 JSONTEST_ASSERT(!ok);
2018 JSONTEST_ASSERT(errs ==
2019 "* Line 1, Column 15\n Syntax error: value, object or array "
2020 "expected.\n");
2021 delete reader;
2022 }
2023
JSONTEST_FIXTURE(CharReaderTest,parseChineseWithOneError)2024 JSONTEST_FIXTURE(CharReaderTest, parseChineseWithOneError) {
2025 Json::CharReaderBuilder b;
2026 Json::CharReader* reader(b.newCharReader());
2027 Json::String errs;
2028 Json::Value root;
2029 char const doc[] = "{ \"pr佐藤erty\" :: \"value\" }";
2030 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2031 JSONTEST_ASSERT(!ok);
2032 JSONTEST_ASSERT(errs ==
2033 "* Line 1, Column 19\n Syntax error: value, object or array "
2034 "expected.\n");
2035 delete reader;
2036 }
2037
JSONTEST_FIXTURE(CharReaderTest,parseWithDetailError)2038 JSONTEST_FIXTURE(CharReaderTest, parseWithDetailError) {
2039 Json::CharReaderBuilder b;
2040 Json::CharReader* reader(b.newCharReader());
2041 Json::String errs;
2042 Json::Value root;
2043 char const doc[] = "{ \"property\" : \"v\\alue\" }";
2044 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2045 JSONTEST_ASSERT(!ok);
2046 JSONTEST_ASSERT(errs ==
2047 "* Line 1, Column 16\n Bad escape sequence in string\nSee "
2048 "Line 1, Column 20 for detail.\n");
2049 delete reader;
2050 }
2051
JSONTEST_FIXTURE(CharReaderTest,parseWithStackLimit)2052 JSONTEST_FIXTURE(CharReaderTest, parseWithStackLimit) {
2053 Json::CharReaderBuilder b;
2054 Json::Value root;
2055 char const doc[] = "{ \"property\" : \"value\" }";
2056 {
2057 b.settings_["stackLimit"] = 2;
2058 Json::CharReader* reader(b.newCharReader());
2059 Json::String errs;
2060 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2061 JSONTEST_ASSERT(ok);
2062 JSONTEST_ASSERT(errs.empty());
2063 JSONTEST_ASSERT_EQUAL("value", root["property"]);
2064 delete reader;
2065 }
2066 {
2067 b.settings_["stackLimit"] = 1;
2068 Json::CharReader* reader(b.newCharReader());
2069 Json::String errs;
2070 JSONTEST_ASSERT_THROWS(
2071 reader->parse(doc, doc + std::strlen(doc), &root, &errs));
2072 delete reader;
2073 }
2074 }
2075
2076 struct CharReaderStrictModeTest : JsonTest::TestCase {};
2077
JSONTEST_FIXTURE(CharReaderStrictModeTest,dupKeys)2078 JSONTEST_FIXTURE(CharReaderStrictModeTest, dupKeys) {
2079 Json::CharReaderBuilder b;
2080 Json::Value root;
2081 char const doc[] =
2082 "{ \"property\" : \"value\", \"key\" : \"val1\", \"key\" : \"val2\" }";
2083 {
2084 b.strictMode(&b.settings_);
2085 Json::CharReader* reader(b.newCharReader());
2086 Json::String errs;
2087 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2088 JSONTEST_ASSERT(!ok);
2089 JSONTEST_ASSERT_STRING_EQUAL("* Line 1, Column 41\n"
2090 " Duplicate key: 'key'\n",
2091 errs);
2092 JSONTEST_ASSERT_EQUAL("val1", root["key"]); // so far
2093 delete reader;
2094 }
2095 }
2096 struct CharReaderFailIfExtraTest : JsonTest::TestCase {};
2097
JSONTEST_FIXTURE(CharReaderFailIfExtraTest,issue164)2098 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue164) {
2099 // This is interpreted as a string value followed by a colon.
2100 Json::CharReaderBuilder b;
2101 Json::Value root;
2102 char const doc[] = " \"property\" : \"value\" }";
2103 {
2104 b.settings_["failIfExtra"] = false;
2105 Json::CharReader* reader(b.newCharReader());
2106 Json::String errs;
2107 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2108 JSONTEST_ASSERT(ok);
2109 JSONTEST_ASSERT(errs.empty());
2110 JSONTEST_ASSERT_EQUAL("property", root);
2111 delete reader;
2112 }
2113 {
2114 b.settings_["failIfExtra"] = true;
2115 Json::CharReader* reader(b.newCharReader());
2116 Json::String errs;
2117 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2118 JSONTEST_ASSERT(!ok);
2119 JSONTEST_ASSERT_STRING_EQUAL(errs,
2120 "* Line 1, Column 13\n"
2121 " Extra non-whitespace after JSON value.\n");
2122 JSONTEST_ASSERT_EQUAL("property", root);
2123 delete reader;
2124 }
2125 {
2126 b.settings_["failIfExtra"] = false;
2127 b.strictMode(&b.settings_);
2128 Json::CharReader* reader(b.newCharReader());
2129 Json::String errs;
2130 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2131 JSONTEST_ASSERT(!ok);
2132 JSONTEST_ASSERT_STRING_EQUAL(errs,
2133 "* Line 1, Column 13\n"
2134 " Extra non-whitespace after JSON value.\n");
2135 JSONTEST_ASSERT_EQUAL("property", root);
2136 delete reader;
2137 }
2138 }
JSONTEST_FIXTURE(CharReaderFailIfExtraTest,issue107)2139 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue107) {
2140 // This is interpreted as an int value followed by a colon.
2141 Json::CharReaderBuilder b;
2142 Json::Value root;
2143 char const doc[] = "1:2:3";
2144 b.settings_["failIfExtra"] = true;
2145 Json::CharReader* reader(b.newCharReader());
2146 Json::String errs;
2147 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2148 JSONTEST_ASSERT(!ok);
2149 JSONTEST_ASSERT_STRING_EQUAL("* Line 1, Column 2\n"
2150 " Extra non-whitespace after JSON value.\n",
2151 errs);
2152 JSONTEST_ASSERT_EQUAL(1, root.asInt());
2153 delete reader;
2154 }
JSONTEST_FIXTURE(CharReaderFailIfExtraTest,commentAfterObject)2155 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterObject) {
2156 Json::CharReaderBuilder b;
2157 Json::Value root;
2158 {
2159 char const doc[] = "{ \"property\" : \"value\" } //trailing\n//comment\n";
2160 b.settings_["failIfExtra"] = true;
2161 Json::CharReader* reader(b.newCharReader());
2162 Json::String errs;
2163 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2164 JSONTEST_ASSERT(ok);
2165 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2166 JSONTEST_ASSERT_EQUAL("value", root["property"]);
2167 delete reader;
2168 }
2169 }
JSONTEST_FIXTURE(CharReaderFailIfExtraTest,commentAfterArray)2170 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterArray) {
2171 Json::CharReaderBuilder b;
2172 Json::Value root;
2173 char const doc[] = "[ \"property\" , \"value\" ] //trailing\n//comment\n";
2174 b.settings_["failIfExtra"] = true;
2175 Json::CharReader* reader(b.newCharReader());
2176 Json::String errs;
2177 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2178 JSONTEST_ASSERT(ok);
2179 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2180 JSONTEST_ASSERT_EQUAL("value", root[1u]);
2181 delete reader;
2182 }
JSONTEST_FIXTURE(CharReaderFailIfExtraTest,commentAfterBool)2183 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterBool) {
2184 Json::CharReaderBuilder b;
2185 Json::Value root;
2186 char const doc[] = " true /*trailing\ncomment*/";
2187 b.settings_["failIfExtra"] = true;
2188 Json::CharReader* reader(b.newCharReader());
2189 Json::String errs;
2190 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2191 JSONTEST_ASSERT(ok);
2192 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2193 JSONTEST_ASSERT_EQUAL(true, root.asBool());
2194 delete reader;
2195 }
2196 struct CharReaderAllowDropNullTest : JsonTest::TestCase {};
2197
JSONTEST_FIXTURE(CharReaderAllowDropNullTest,issue178)2198 JSONTEST_FIXTURE(CharReaderAllowDropNullTest, issue178) {
2199 Json::CharReaderBuilder b;
2200 b.settings_["allowDroppedNullPlaceholders"] = true;
2201 Json::Value root;
2202 Json::String errs;
2203 Json::CharReader* reader(b.newCharReader());
2204 {
2205 char const doc[] = "{\"a\":,\"b\":true}";
2206 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2207 JSONTEST_ASSERT(ok);
2208 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2209 JSONTEST_ASSERT_EQUAL(2u, root.size());
2210 JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
2211 }
2212 {
2213 char const doc[] = "{\"a\":}";
2214 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2215 JSONTEST_ASSERT(ok);
2216 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2217 JSONTEST_ASSERT_EQUAL(1u, root.size());
2218 JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
2219 }
2220 {
2221 char const doc[] = "[]";
2222 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2223 JSONTEST_ASSERT(ok);
2224 JSONTEST_ASSERT(errs.empty());
2225 JSONTEST_ASSERT_EQUAL(0u, root.size());
2226 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root);
2227 }
2228 {
2229 char const doc[] = "[null]";
2230 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2231 JSONTEST_ASSERT(ok);
2232 JSONTEST_ASSERT(errs.empty());
2233 JSONTEST_ASSERT_EQUAL(1u, root.size());
2234 }
2235 {
2236 char const doc[] = "[,]";
2237 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2238 JSONTEST_ASSERT(ok);
2239 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2240 JSONTEST_ASSERT_EQUAL(2u, root.size());
2241 }
2242 {
2243 char const doc[] = "[,,,]";
2244 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2245 JSONTEST_ASSERT(ok);
2246 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2247 JSONTEST_ASSERT_EQUAL(4u, root.size());
2248 }
2249 {
2250 char const doc[] = "[null,]";
2251 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2252 JSONTEST_ASSERT(ok);
2253 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2254 JSONTEST_ASSERT_EQUAL(2u, root.size());
2255 }
2256 {
2257 char const doc[] = "[,null]";
2258 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2259 JSONTEST_ASSERT(ok);
2260 JSONTEST_ASSERT(errs.empty());
2261 JSONTEST_ASSERT_EQUAL(2u, root.size());
2262 }
2263 {
2264 char const doc[] = "[,,]";
2265 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2266 JSONTEST_ASSERT(ok);
2267 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2268 JSONTEST_ASSERT_EQUAL(3u, root.size());
2269 }
2270 {
2271 char const doc[] = "[null,,]";
2272 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2273 JSONTEST_ASSERT(ok);
2274 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2275 JSONTEST_ASSERT_EQUAL(3u, root.size());
2276 }
2277 {
2278 char const doc[] = "[,null,]";
2279 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2280 JSONTEST_ASSERT(ok);
2281 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2282 JSONTEST_ASSERT_EQUAL(3u, root.size());
2283 }
2284 {
2285 char const doc[] = "[,,null]";
2286 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2287 JSONTEST_ASSERT(ok);
2288 JSONTEST_ASSERT(errs.empty());
2289 JSONTEST_ASSERT_EQUAL(3u, root.size());
2290 }
2291 {
2292 char const doc[] = "[[],,,]";
2293 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2294 JSONTEST_ASSERT(ok);
2295 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2296 JSONTEST_ASSERT_EQUAL(4u, root.size());
2297 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[0u]);
2298 }
2299 {
2300 char const doc[] = "[,[],,]";
2301 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2302 JSONTEST_ASSERT(ok);
2303 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2304 JSONTEST_ASSERT_EQUAL(4u, root.size());
2305 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[1u]);
2306 }
2307 {
2308 char const doc[] = "[,,,[]]";
2309 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2310 JSONTEST_ASSERT(ok);
2311 JSONTEST_ASSERT(errs.empty());
2312 JSONTEST_ASSERT_EQUAL(4u, root.size());
2313 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[3u]);
2314 }
2315 delete reader;
2316 }
2317
2318 struct CharReaderAllowSingleQuotesTest : JsonTest::TestCase {};
2319
JSONTEST_FIXTURE(CharReaderAllowSingleQuotesTest,issue182)2320 JSONTEST_FIXTURE(CharReaderAllowSingleQuotesTest, issue182) {
2321 Json::CharReaderBuilder b;
2322 b.settings_["allowSingleQuotes"] = true;
2323 Json::Value root;
2324 Json::String errs;
2325 Json::CharReader* reader(b.newCharReader());
2326 {
2327 char const doc[] = "{'a':true,\"b\":true}";
2328 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2329 JSONTEST_ASSERT(ok);
2330 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2331 JSONTEST_ASSERT_EQUAL(2u, root.size());
2332 JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
2333 JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
2334 }
2335 {
2336 char const doc[] = "{'a': 'x', \"b\":'y'}";
2337 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2338 JSONTEST_ASSERT(ok);
2339 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2340 JSONTEST_ASSERT_EQUAL(2u, root.size());
2341 JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
2342 JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
2343 }
2344 delete reader;
2345 }
2346
2347 struct CharReaderAllowZeroesTest : JsonTest::TestCase {};
2348
JSONTEST_FIXTURE(CharReaderAllowZeroesTest,issue176)2349 JSONTEST_FIXTURE(CharReaderAllowZeroesTest, issue176) {
2350 Json::CharReaderBuilder b;
2351 b.settings_["allowSingleQuotes"] = true;
2352 Json::Value root;
2353 Json::String errs;
2354 Json::CharReader* reader(b.newCharReader());
2355 {
2356 char const doc[] = "{'a':true,\"b\":true}";
2357 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2358 JSONTEST_ASSERT(ok);
2359 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2360 JSONTEST_ASSERT_EQUAL(2u, root.size());
2361 JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
2362 JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
2363 }
2364 {
2365 char const doc[] = "{'a': 'x', \"b\":'y'}";
2366 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2367 JSONTEST_ASSERT(ok);
2368 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2369 JSONTEST_ASSERT_EQUAL(2u, root.size());
2370 JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
2371 JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
2372 }
2373 delete reader;
2374 }
2375
2376 struct CharReaderAllowSpecialFloatsTest : JsonTest::TestCase {};
2377
JSONTEST_FIXTURE(CharReaderAllowSpecialFloatsTest,issue209)2378 JSONTEST_FIXTURE(CharReaderAllowSpecialFloatsTest, issue209) {
2379 Json::CharReaderBuilder b;
2380 b.settings_["allowSpecialFloats"] = true;
2381 Json::Value root;
2382 Json::String errs;
2383 Json::CharReader* reader(b.newCharReader());
2384 {
2385 char const doc[] = "{\"a\":NaN,\"b\":Infinity,\"c\":-Infinity}";
2386 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2387 JSONTEST_ASSERT(ok);
2388 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2389 JSONTEST_ASSERT_EQUAL(3u, root.size());
2390 double n = root["a"].asDouble();
2391 JSONTEST_ASSERT(std::isnan(n));
2392 JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(),
2393 root.get("b", 0.0));
2394 JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(),
2395 root.get("c", 0.0));
2396 }
2397
2398 struct TestData {
2399 int line;
2400 bool ok;
2401 Json::String in;
2402 };
2403 const TestData test_data[] = {
2404 {__LINE__, true, "{\"a\":9}"}, //
2405 {__LINE__, false, "{\"a\":0Infinity}"}, //
2406 {__LINE__, false, "{\"a\":1Infinity}"}, //
2407 {__LINE__, false, "{\"a\":9Infinity}"}, //
2408 {__LINE__, false, "{\"a\":0nfinity}"}, //
2409 {__LINE__, false, "{\"a\":1nfinity}"}, //
2410 {__LINE__, false, "{\"a\":9nfinity}"}, //
2411 {__LINE__, false, "{\"a\":nfinity}"}, //
2412 {__LINE__, false, "{\"a\":.nfinity}"}, //
2413 {__LINE__, false, "{\"a\":9nfinity}"}, //
2414 {__LINE__, false, "{\"a\":-nfinity}"}, //
2415 {__LINE__, true, "{\"a\":Infinity}"}, //
2416 {__LINE__, false, "{\"a\":.Infinity}"}, //
2417 {__LINE__, false, "{\"a\":_Infinity}"}, //
2418 {__LINE__, false, "{\"a\":_nfinity}"}, //
2419 {__LINE__, true, "{\"a\":-Infinity}"} //
2420 };
2421 for (const auto& td : test_data) {
2422 bool ok = reader->parse(&*td.in.begin(), &*td.in.begin() + td.in.size(),
2423 &root, &errs);
2424 JSONTEST_ASSERT(td.ok == ok) << "line:" << td.line << "\n"
2425 << " expected: {"
2426 << "ok:" << td.ok << ", in:\'" << td.in << "\'"
2427 << "}\n"
2428 << " actual: {"
2429 << "ok:" << ok << "}\n";
2430 }
2431
2432 {
2433 char const doc[] = "{\"posInf\": Infinity, \"NegInf\": -Infinity}";
2434 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2435 JSONTEST_ASSERT(ok);
2436 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2437 JSONTEST_ASSERT_EQUAL(2u, root.size());
2438 JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(),
2439 root["posInf"].asDouble());
2440 JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(),
2441 root["NegInf"].asDouble());
2442 }
2443 delete reader;
2444 }
2445
2446 struct BuilderTest : JsonTest::TestCase {};
2447
JSONTEST_FIXTURE(BuilderTest,settings)2448 JSONTEST_FIXTURE(BuilderTest, settings) {
2449 {
2450 Json::Value errs;
2451 Json::CharReaderBuilder rb;
2452 JSONTEST_ASSERT_EQUAL(false, rb.settings_.isMember("foo"));
2453 JSONTEST_ASSERT_EQUAL(true, rb.validate(&errs));
2454 rb["foo"] = "bar";
2455 JSONTEST_ASSERT_EQUAL(true, rb.settings_.isMember("foo"));
2456 JSONTEST_ASSERT_EQUAL(false, rb.validate(&errs));
2457 }
2458 {
2459 Json::Value errs;
2460 Json::StreamWriterBuilder wb;
2461 JSONTEST_ASSERT_EQUAL(false, wb.settings_.isMember("foo"));
2462 JSONTEST_ASSERT_EQUAL(true, wb.validate(&errs));
2463 wb["foo"] = "bar";
2464 JSONTEST_ASSERT_EQUAL(true, wb.settings_.isMember("foo"));
2465 JSONTEST_ASSERT_EQUAL(false, wb.validate(&errs));
2466 }
2467 }
2468
2469 struct IteratorTest : JsonTest::TestCase {};
2470
JSONTEST_FIXTURE(IteratorTest,distance)2471 JSONTEST_FIXTURE(IteratorTest, distance) {
2472 Json::Value json;
2473 json["k1"] = "a";
2474 json["k2"] = "b";
2475 int dist = 0;
2476 Json::String str;
2477 for (Json::ValueIterator it = json.begin(); it != json.end(); ++it) {
2478 dist = it - json.begin();
2479 str = it->asString().c_str();
2480 }
2481 JSONTEST_ASSERT_EQUAL(1, dist);
2482 JSONTEST_ASSERT_STRING_EQUAL("b", str);
2483 }
2484
JSONTEST_FIXTURE(IteratorTest,names)2485 JSONTEST_FIXTURE(IteratorTest, names) {
2486 Json::Value json;
2487 json["k1"] = "a";
2488 json["k2"] = "b";
2489 Json::ValueIterator it = json.begin();
2490 JSONTEST_ASSERT(it != json.end());
2491 JSONTEST_ASSERT_EQUAL(Json::Value("k1"), it.key());
2492 JSONTEST_ASSERT_STRING_EQUAL("k1", it.name());
2493 JSONTEST_ASSERT_EQUAL(-1, it.index());
2494 ++it;
2495 JSONTEST_ASSERT(it != json.end());
2496 JSONTEST_ASSERT_EQUAL(Json::Value("k2"), it.key());
2497 JSONTEST_ASSERT_STRING_EQUAL("k2", it.name());
2498 JSONTEST_ASSERT_EQUAL(-1, it.index());
2499 ++it;
2500 JSONTEST_ASSERT(it == json.end());
2501 }
2502
JSONTEST_FIXTURE(IteratorTest,indexes)2503 JSONTEST_FIXTURE(IteratorTest, indexes) {
2504 Json::Value json;
2505 json[0] = "a";
2506 json[1] = "b";
2507 Json::ValueIterator it = json.begin();
2508 JSONTEST_ASSERT(it != json.end());
2509 JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(0)), it.key());
2510 JSONTEST_ASSERT_STRING_EQUAL("", it.name());
2511 JSONTEST_ASSERT_EQUAL(0, it.index());
2512 ++it;
2513 JSONTEST_ASSERT(it != json.end());
2514 JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(1)), it.key());
2515 JSONTEST_ASSERT_STRING_EQUAL("", it.name());
2516 JSONTEST_ASSERT_EQUAL(1, it.index());
2517 ++it;
2518 JSONTEST_ASSERT(it == json.end());
2519 }
2520
JSONTEST_FIXTURE(IteratorTest,const)2521 JSONTEST_FIXTURE(IteratorTest, const) {
2522 Json::Value const v;
2523 JSONTEST_ASSERT_THROWS(
2524 Json::Value::iterator it(v.begin()) // Compile, but throw.
2525 );
2526
2527 Json::Value value;
2528
2529 for (int i = 9; i < 12; ++i) {
2530 Json::OStringStream out;
2531 out << std::setw(2) << i;
2532 Json::String str = out.str();
2533 value[str] = str;
2534 }
2535
2536 Json::OStringStream out;
2537 // in old code, this will get a compile error
2538 Json::Value::const_iterator iter = value.begin();
2539 for (; iter != value.end(); ++iter) {
2540 out << *iter << ',';
2541 }
2542 Json::String expected = "\" 9\",\"10\",\"11\",";
2543 JSONTEST_ASSERT_STRING_EQUAL(expected, out.str());
2544 }
2545
2546 struct RValueTest : JsonTest::TestCase {};
2547
JSONTEST_FIXTURE(RValueTest,moveConstruction)2548 JSONTEST_FIXTURE(RValueTest, moveConstruction) {
2549 Json::Value json;
2550 json["key"] = "value";
2551 Json::Value moved = std::move(json);
2552 JSONTEST_ASSERT(moved != json); // Possibly not nullValue; definitely not
2553 // equal.
2554 JSONTEST_ASSERT_EQUAL(Json::objectValue, moved.type());
2555 JSONTEST_ASSERT_EQUAL(Json::stringValue, moved["key"].type());
2556 }
2557
2558 struct FuzzTest : JsonTest::TestCase {};
2559
2560 // Build and run the fuzz test without any fuzzer, so that it's guaranteed not
2561 // go out of date, even if it's never run as an actual fuzz test.
JSONTEST_FIXTURE(FuzzTest,fuzzDoesntCrash)2562 JSONTEST_FIXTURE(FuzzTest, fuzzDoesntCrash) {
2563 const std::string example = "{}";
2564 JSONTEST_ASSERT_EQUAL(
2565 0,
2566 LLVMFuzzerTestOneInput(reinterpret_cast<const uint8_t*>(example.c_str()),
2567 example.size()));
2568 }
2569
main(int argc,const char * argv[])2570 int main(int argc, const char* argv[]) {
2571 JsonTest::Runner runner;
2572 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, checkNormalizeFloatingPointStr);
2573 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, memberCount);
2574 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, objects);
2575 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrays);
2576 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrayIssue252);
2577 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, null);
2578 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, strings);
2579 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, bools);
2580 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, integers);
2581 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nonIntegers);
2582 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareNull);
2583 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareInt);
2584 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareUInt);
2585 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareDouble);
2586 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareString);
2587 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareBoolean);
2588 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareArray);
2589 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareObject);
2590 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareType);
2591 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, CopyObject);
2592 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, offsetAccessors);
2593 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, typeChecksThrowExceptions);
2594 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, StaticString);
2595 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, WideString);
2596 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, CommentBefore);
2597 // JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nulls);
2598 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, zeroes);
2599 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, zeroesInKeys);
2600 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, specialFloats);
2601 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, precision);
2602
2603 JSONTEST_REGISTER_FIXTURE(runner, WriterTest, dropNullPlaceholders);
2604 JSONTEST_REGISTER_FIXTURE(runner, StreamWriterTest, dropNullPlaceholders);
2605 JSONTEST_REGISTER_FIXTURE(runner, StreamWriterTest, writeZeroes);
2606
2607 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithNoErrors);
2608 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest,
2609 parseWithNoErrorsTestingOffsets);
2610 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithOneError);
2611 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseChineseWithOneError);
2612 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithDetailError);
2613
2614 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithNoErrors);
2615 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest,
2616 parseWithNoErrorsTestingOffsets);
2617 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithOneError);
2618 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseChineseWithOneError);
2619 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithDetailError);
2620 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithStackLimit);
2621
2622 JSONTEST_REGISTER_FIXTURE(runner, CharReaderStrictModeTest, dupKeys);
2623
2624 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue164);
2625 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue107);
2626 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest,
2627 commentAfterObject);
2628 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest,
2629 commentAfterArray);
2630 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest,
2631 commentAfterBool);
2632
2633 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowDropNullTest, issue178);
2634
2635 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowSingleQuotesTest, issue182);
2636
2637 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowZeroesTest, issue176);
2638
2639 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowSpecialFloatsTest, issue209);
2640
2641 JSONTEST_REGISTER_FIXTURE(runner, BuilderTest, settings);
2642
2643 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, distance);
2644 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, names);
2645 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, indexes);
2646 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, const);
2647
2648 JSONTEST_REGISTER_FIXTURE(runner, RValueTest, moveConstruction);
2649
2650 JSONTEST_REGISTER_FIXTURE(runner, FuzzTest, fuzzDoesntCrash);
2651
2652 return runner.runCommandLine(argc, argv);
2653 }
2654
2655 #if defined(__GNUC__)
2656 #pragma GCC diagnostic pop
2657 #endif
2658