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
6 #pragma GCC diagnostic push
7 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
10 #include <json/config.h>
11 #include <json/json.h>
18 // Make numeric limits more convenient to talk about.
19 // Assumes int type in 32 bits.
20 #define kint32max Json::Value::maxInt
21 #define kint32min Json::Value::minInt
22 #define kuint32max Json::Value::maxUInt
23 #define kint64max Json::Value::maxInt64
24 #define kint64min Json::Value::minInt64
25 #define kuint64max Json::Value::maxUInt64
27 //static const double kdint64max = double(kint64max);
28 //static const float kfint64max = float(kint64max);
29 static const float kfint32max = float(kint32max);
30 static const float kfuint32max = float(kuint32max);
32 // //////////////////////////////////////////////////////////////////
33 // //////////////////////////////////////////////////////////////////
34 // Json Library test cases
35 // //////////////////////////////////////////////////////////////////
36 // //////////////////////////////////////////////////////////////////
38 #if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
39 static inline double uint64ToDouble(Json::UInt64 value) {
40 return static_cast<double>(value);
42 #else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
43 static inline double uint64ToDouble(Json::UInt64 value) {
44 return static_cast<double>(Json::Int64(value / 2)) * 2.0 +
45 static_cast<double>(Json::Int64(value & 1));
47 #endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
49 struct ValueTest : JsonTest::TestCase {
51 Json::Value emptyArray_;
52 Json::Value emptyObject_;
54 Json::Value unsignedInteger_;
55 Json::Value smallUnsignedInteger_;
60 Json::Value emptyString_;
67 : emptyArray_(Json::arrayValue), emptyObject_(Json::objectValue),
68 integer_(123456789), unsignedInteger_(34567890u),
69 smallUnsignedInteger_(Json::Value::UInt(Json::Value::maxInt)),
70 real_(1234.56789), float_(0.00390625f), emptyString_(""), string1_("a"),
71 string_("sometext with space"), true_(true), false_(false) {
73 object1_["id"] = 1234;
77 /// Initialize all checks to \c false by default.
95 void checkConstMemberCount(const Json::Value& value,
96 unsigned int expectedCount);
98 void checkMemberCount(Json::Value& value, unsigned int expectedCount);
100 void checkIs(const Json::Value& value, const IsCheck& check);
102 void checkIsLess(const Json::Value& x, const Json::Value& y);
104 void checkIsEqual(const Json::Value& x, const Json::Value& y);
106 /// Normalize the representation of floating-point number by stripped leading
108 static JSONCPP_STRING normalizeFloatingPointStr(const JSONCPP_STRING& s);
111 JSONCPP_STRING ValueTest::normalizeFloatingPointStr(const JSONCPP_STRING& s) {
112 JSONCPP_STRING::size_type index = s.find_last_of("eE");
113 if (index != JSONCPP_STRING::npos) {
114 JSONCPP_STRING::size_type hasSign =
115 (s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
116 JSONCPP_STRING::size_type exponentStartIndex = index + 1 + hasSign;
117 JSONCPP_STRING normalized = s.substr(0, exponentStartIndex);
118 JSONCPP_STRING::size_type indexDigit =
119 s.find_first_not_of('0', exponentStartIndex);
120 JSONCPP_STRING exponent = "0";
122 JSONCPP_STRING::npos) // There is an exponent different from 0
124 exponent = s.substr(indexDigit);
126 return normalized + exponent;
131 JSONTEST_FIXTURE(ValueTest, checkNormalizeFloatingPointStr) {
132 JSONTEST_ASSERT_STRING_EQUAL("0.0", normalizeFloatingPointStr("0.0"));
133 JSONTEST_ASSERT_STRING_EQUAL("0e0", normalizeFloatingPointStr("0e0"));
134 JSONTEST_ASSERT_STRING_EQUAL("1234.0", normalizeFloatingPointStr("1234.0"));
135 JSONTEST_ASSERT_STRING_EQUAL("1234.0e0",
136 normalizeFloatingPointStr("1234.0e0"));
137 JSONTEST_ASSERT_STRING_EQUAL("1234.0e+0",
138 normalizeFloatingPointStr("1234.0e+0"));
139 JSONTEST_ASSERT_STRING_EQUAL("1234e-1", normalizeFloatingPointStr("1234e-1"));
140 JSONTEST_ASSERT_STRING_EQUAL("1234e10", normalizeFloatingPointStr("1234e10"));
141 JSONTEST_ASSERT_STRING_EQUAL("1234e10",
142 normalizeFloatingPointStr("1234e010"));
143 JSONTEST_ASSERT_STRING_EQUAL("1234e+10",
144 normalizeFloatingPointStr("1234e+010"));
145 JSONTEST_ASSERT_STRING_EQUAL("1234e-10",
146 normalizeFloatingPointStr("1234e-010"));
147 JSONTEST_ASSERT_STRING_EQUAL("1234e+100",
148 normalizeFloatingPointStr("1234e+100"));
149 JSONTEST_ASSERT_STRING_EQUAL("1234e-100",
150 normalizeFloatingPointStr("1234e-100"));
151 JSONTEST_ASSERT_STRING_EQUAL("1234e+1",
152 normalizeFloatingPointStr("1234e+001"));
155 JSONTEST_FIXTURE(ValueTest, memberCount) {
156 JSONTEST_ASSERT_PRED(checkMemberCount(emptyArray_, 0));
157 JSONTEST_ASSERT_PRED(checkMemberCount(emptyObject_, 0));
158 JSONTEST_ASSERT_PRED(checkMemberCount(array1_, 1));
159 JSONTEST_ASSERT_PRED(checkMemberCount(object1_, 1));
160 JSONTEST_ASSERT_PRED(checkMemberCount(null_, 0));
161 JSONTEST_ASSERT_PRED(checkMemberCount(integer_, 0));
162 JSONTEST_ASSERT_PRED(checkMemberCount(unsignedInteger_, 0));
163 JSONTEST_ASSERT_PRED(checkMemberCount(smallUnsignedInteger_, 0));
164 JSONTEST_ASSERT_PRED(checkMemberCount(real_, 0));
165 JSONTEST_ASSERT_PRED(checkMemberCount(emptyString_, 0));
166 JSONTEST_ASSERT_PRED(checkMemberCount(string_, 0));
167 JSONTEST_ASSERT_PRED(checkMemberCount(true_, 0));
170 JSONTEST_FIXTURE(ValueTest, objects) {
173 checks.isObject_ = true;
174 JSONTEST_ASSERT_PRED(checkIs(emptyObject_, checks));
175 JSONTEST_ASSERT_PRED(checkIs(object1_, checks));
177 JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());
180 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));
182 // Non-empty object not okay
183 JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));
186 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));
189 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
190 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
191 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
192 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
193 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
194 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));
196 // Access through const reference
197 const Json::Value& constObject = object1_;
199 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
200 JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);
202 // Access through non-const reference
203 JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
204 JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
206 object1_["some other id"] = "foo";
207 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
208 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
213 did = object1_.removeMember("some other id", &got);
214 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
215 JSONTEST_ASSERT_EQUAL(true, did);
216 got = Json::Value("bar");
217 did = object1_.removeMember("some other id", &got);
218 JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
219 JSONTEST_ASSERT_EQUAL(false, did);
222 JSONTEST_FIXTURE(ValueTest, arrays) {
223 const unsigned int index0 = 0;
227 checks.isArray_ = true;
228 JSONTEST_ASSERT_PRED(checkIs(emptyArray_, checks));
229 JSONTEST_ASSERT_PRED(checkIs(array1_, checks));
231 JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
234 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));
236 // Non-empty array not okay
237 JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));
240 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));
243 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
244 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
245 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
246 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
247 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
248 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));
250 // Access through const reference
251 const Json::Value& constArray = array1_;
252 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
253 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
255 // Access through non-const reference
256 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
257 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
259 array1_[2] = Json::Value(17);
260 JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
261 JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
263 JSONTEST_ASSERT_EQUAL(true, array1_.removeIndex(2, &got));
264 JSONTEST_ASSERT_EQUAL(Json::Value(17), got);
265 JSONTEST_ASSERT_EQUAL(false, array1_.removeIndex(2, &got)); // gone now
267 JSONTEST_FIXTURE(ValueTest, arrayIssue252)
272 root["array"] = Json::Value::nullRef;
273 for (int i = 0; i < count; i++)
277 root["array"][i] = item;
279 //JSONTEST_ASSERT_EQUAL(5, root["array"].size());
282 JSONTEST_FIXTURE(ValueTest, null) {
283 JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
286 checks.isNull_ = true;
287 JSONTEST_ASSERT_PRED(checkIs(null_, checks));
289 JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
290 JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
291 JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
292 JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
293 JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
294 JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
295 JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
296 JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));
298 JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
299 JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
300 JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
301 JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
302 JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
303 JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
304 JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
306 JSONTEST_ASSERT_EQUAL(Json::Value::null, null_);
309 JSONTEST_FIXTURE(ValueTest, strings) {
310 JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
313 checks.isString_ = true;
314 JSONTEST_ASSERT_PRED(checkIs(emptyString_, checks));
315 JSONTEST_ASSERT_PRED(checkIs(string_, checks));
316 JSONTEST_ASSERT_PRED(checkIs(string1_, checks));
319 JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));
321 // Non-empty string not okay
322 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));
325 JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));
328 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
329 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
330 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
331 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
332 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));
334 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
335 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
338 JSONTEST_FIXTURE(ValueTest, bools) {
339 JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
342 checks.isBool_ = true;
343 JSONTEST_ASSERT_PRED(checkIs(false_, checks));
344 JSONTEST_ASSERT_PRED(checkIs(true_, checks));
347 JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));
350 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));
353 JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
354 JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
355 JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
356 JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
357 JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));
360 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
361 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));
363 JSONTEST_ASSERT_EQUAL(true, true_.asBool());
364 JSONTEST_ASSERT_EQUAL(1, true_.asInt());
365 JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
366 JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
367 JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
368 JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
369 JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());
371 JSONTEST_ASSERT_EQUAL(false, false_.asBool());
372 JSONTEST_ASSERT_EQUAL(0, false_.asInt());
373 JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
374 JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
375 JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
376 JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
377 JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
380 JSONTEST_FIXTURE(ValueTest, integers) {
384 // Conversions that don't depend on the value.
385 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
386 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
387 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
388 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
389 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));
391 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
392 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
393 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
394 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
395 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));
397 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
398 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
399 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
400 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
401 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));
404 val = Json::Value(Json::intValue);
406 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
409 checks.isInt_ = true;
410 checks.isInt64_ = true;
411 checks.isUInt_ = true;
412 checks.isUInt64_ = true;
413 checks.isIntegral_ = true;
414 checks.isDouble_ = true;
415 checks.isNumeric_ = true;
416 JSONTEST_ASSERT_PRED(checkIs(val, checks));
418 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
419 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
420 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
422 JSONTEST_ASSERT_EQUAL(0, val.asInt());
423 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
424 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
425 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
426 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
427 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
428 JSONTEST_ASSERT_EQUAL(false, val.asBool());
429 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
432 val = Json::Value(Json::uintValue);
434 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
437 checks.isInt_ = true;
438 checks.isInt64_ = true;
439 checks.isUInt_ = true;
440 checks.isUInt64_ = true;
441 checks.isIntegral_ = true;
442 checks.isDouble_ = true;
443 checks.isNumeric_ = true;
444 JSONTEST_ASSERT_PRED(checkIs(val, checks));
446 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
447 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
448 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
450 JSONTEST_ASSERT_EQUAL(0, val.asInt());
451 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
452 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
453 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
454 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
455 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
456 JSONTEST_ASSERT_EQUAL(false, val.asBool());
457 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
460 val = Json::Value(Json::realValue);
462 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
464 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
465 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
466 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
469 checks.isInt_ = true;
470 checks.isInt64_ = true;
471 checks.isUInt_ = true;
472 checks.isUInt64_ = true;
473 checks.isIntegral_ = true;
474 checks.isDouble_ = true;
475 checks.isNumeric_ = true;
476 JSONTEST_ASSERT_PRED(checkIs(val, checks));
478 JSONTEST_ASSERT_EQUAL(0, val.asInt());
479 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
480 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
481 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
482 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
483 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
484 JSONTEST_ASSERT_EQUAL(false, val.asBool());
485 JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
487 // Zero (signed constructor arg)
488 val = Json::Value(0);
490 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
493 checks.isInt_ = true;
494 checks.isInt64_ = true;
495 checks.isUInt_ = true;
496 checks.isUInt64_ = true;
497 checks.isIntegral_ = true;
498 checks.isDouble_ = true;
499 checks.isNumeric_ = true;
500 JSONTEST_ASSERT_PRED(checkIs(val, checks));
502 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
503 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
504 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
506 JSONTEST_ASSERT_EQUAL(0, val.asInt());
507 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
508 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
509 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
510 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
511 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
512 JSONTEST_ASSERT_EQUAL(false, val.asBool());
513 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
515 // Zero (unsigned constructor arg)
516 val = Json::Value(0u);
518 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
521 checks.isInt_ = true;
522 checks.isInt64_ = true;
523 checks.isUInt_ = true;
524 checks.isUInt64_ = true;
525 checks.isIntegral_ = true;
526 checks.isDouble_ = true;
527 checks.isNumeric_ = true;
528 JSONTEST_ASSERT_PRED(checkIs(val, checks));
530 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
531 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
532 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
534 JSONTEST_ASSERT_EQUAL(0, val.asInt());
535 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
536 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
537 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
538 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
539 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
540 JSONTEST_ASSERT_EQUAL(false, val.asBool());
541 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
543 // Zero (floating-point constructor arg)
544 val = Json::Value(0.0);
546 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
549 checks.isInt_ = true;
550 checks.isInt64_ = true;
551 checks.isUInt_ = true;
552 checks.isUInt64_ = true;
553 checks.isIntegral_ = true;
554 checks.isDouble_ = true;
555 checks.isNumeric_ = true;
556 JSONTEST_ASSERT_PRED(checkIs(val, checks));
558 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
559 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
560 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
562 JSONTEST_ASSERT_EQUAL(0, val.asInt());
563 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
564 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
565 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
566 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
567 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
568 JSONTEST_ASSERT_EQUAL(false, val.asBool());
569 JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
571 // 2^20 (signed constructor arg)
572 val = Json::Value(1 << 20);
574 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
576 checks.isInt_ = true;
577 checks.isInt64_ = true;
578 checks.isUInt_ = true;
579 checks.isUInt64_ = true;
580 checks.isIntegral_ = true;
581 checks.isDouble_ = true;
582 checks.isNumeric_ = true;
583 JSONTEST_ASSERT_PRED(checkIs(val, checks));
585 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
586 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
587 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
589 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
590 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
591 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
592 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
593 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
594 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
595 JSONTEST_ASSERT_EQUAL(true, val.asBool());
596 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
598 // 2^20 (unsigned constructor arg)
599 val = Json::Value(Json::UInt(1 << 20));
601 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
604 checks.isInt_ = true;
605 checks.isInt64_ = true;
606 checks.isUInt_ = true;
607 checks.isUInt64_ = true;
608 checks.isIntegral_ = true;
609 checks.isDouble_ = true;
610 checks.isNumeric_ = true;
611 JSONTEST_ASSERT_PRED(checkIs(val, checks));
613 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
614 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
615 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
617 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
618 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
619 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
620 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
621 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
622 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
623 JSONTEST_ASSERT_EQUAL(true, val.asBool());
624 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
626 // 2^20 (floating-point constructor arg)
627 val = Json::Value((1 << 20) / 1.0);
629 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
632 checks.isInt_ = true;
633 checks.isInt64_ = true;
634 checks.isUInt_ = true;
635 checks.isUInt64_ = true;
636 checks.isIntegral_ = true;
637 checks.isDouble_ = true;
638 checks.isNumeric_ = true;
639 JSONTEST_ASSERT_PRED(checkIs(val, checks));
641 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
642 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
643 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
645 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
646 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
647 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
648 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
649 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
650 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
651 JSONTEST_ASSERT_EQUAL(true, val.asBool());
652 JSONTEST_ASSERT_STRING_EQUAL("1048576.0",
653 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
656 val = Json::Value(-(1 << 20));
658 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
661 checks.isInt_ = true;
662 checks.isInt64_ = true;
663 checks.isIntegral_ = true;
664 checks.isDouble_ = true;
665 checks.isNumeric_ = true;
666 JSONTEST_ASSERT_PRED(checkIs(val, checks));
668 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
669 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
670 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
672 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
673 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
674 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
675 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
676 JSONTEST_ASSERT_EQUAL(true, val.asBool());
677 JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
680 val = Json::Value(kint32max);
682 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
685 checks.isInt_ = true;
686 checks.isInt64_ = true;
687 checks.isUInt_ = true;
688 checks.isUInt64_ = true;
689 checks.isIntegral_ = true;
690 checks.isDouble_ = true;
691 checks.isNumeric_ = true;
692 JSONTEST_ASSERT_PRED(checkIs(val, checks));
694 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
695 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
696 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
698 JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
699 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
700 JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
701 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
702 JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
703 JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
704 JSONTEST_ASSERT_EQUAL(true, val.asBool());
705 JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
708 val = Json::Value(kint32min);
710 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
713 checks.isInt_ = true;
714 checks.isInt64_ = true;
715 checks.isIntegral_ = true;
716 checks.isDouble_ = true;
717 checks.isNumeric_ = true;
718 JSONTEST_ASSERT_PRED(checkIs(val, checks));
720 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
721 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
722 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
724 JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
725 JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
726 JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
727 JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
728 JSONTEST_ASSERT_EQUAL(true, val.asBool());
729 JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
732 val = Json::Value(kuint32max);
734 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
737 checks.isInt64_ = true;
738 checks.isUInt_ = true;
739 checks.isUInt64_ = true;
740 checks.isIntegral_ = true;
741 checks.isDouble_ = true;
742 checks.isNumeric_ = true;
743 JSONTEST_ASSERT_PRED(checkIs(val, checks));
745 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
746 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
747 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
749 #ifndef JSON_NO_INT64
750 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
752 JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
753 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
754 JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
755 JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
756 JSONTEST_ASSERT_EQUAL(true, val.asBool());
757 JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
761 val = Json::Value(double(kint64max));
763 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
766 checks.isDouble_ = true;
767 checks.isNumeric_ = true;
768 JSONTEST_ASSERT_PRED(checkIs(val, checks));
770 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
771 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
772 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
774 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
775 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
776 JSONTEST_ASSERT_EQUAL(true, val.asBool());
777 JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
780 val = Json::Value(double(kint64min));
782 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
785 checks.isDouble_ = true;
786 checks.isNumeric_ = true;
787 JSONTEST_ASSERT_PRED(checkIs(val, checks));
789 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
790 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
791 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
793 JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
794 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
795 JSONTEST_ASSERT_EQUAL(true, val.asBool());
796 JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
799 val = Json::Value(double(kuint64max));
801 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
804 checks.isDouble_ = true;
805 checks.isNumeric_ = true;
806 JSONTEST_ASSERT_PRED(checkIs(val, checks));
808 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
809 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
810 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
812 JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
813 JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
814 JSONTEST_ASSERT_EQUAL(true, val.asBool());
815 JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
816 #else // ifdef JSON_NO_INT64
817 // 2^40 (signed constructor arg)
818 val = Json::Value(Json::Int64(1) << 40);
820 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
823 checks.isInt64_ = true;
824 checks.isUInt64_ = true;
825 checks.isIntegral_ = true;
826 checks.isDouble_ = true;
827 checks.isNumeric_ = true;
828 JSONTEST_ASSERT_PRED(checkIs(val, checks));
830 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
831 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
832 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
834 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
835 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
836 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
837 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
838 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
839 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
840 JSONTEST_ASSERT_EQUAL(true, val.asBool());
841 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
843 // 2^40 (unsigned constructor arg)
844 val = Json::Value(Json::UInt64(1) << 40);
846 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
849 checks.isInt64_ = true;
850 checks.isUInt64_ = true;
851 checks.isIntegral_ = true;
852 checks.isDouble_ = true;
853 checks.isNumeric_ = true;
854 JSONTEST_ASSERT_PRED(checkIs(val, checks));
856 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
857 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
858 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
860 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
861 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
862 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
863 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
864 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
865 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
866 JSONTEST_ASSERT_EQUAL(true, val.asBool());
867 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
869 // 2^40 (floating-point constructor arg)
870 val = Json::Value((Json::Int64(1) << 40) / 1.0);
872 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
875 checks.isInt64_ = true;
876 checks.isUInt64_ = true;
877 checks.isIntegral_ = true;
878 checks.isDouble_ = true;
879 checks.isNumeric_ = true;
880 JSONTEST_ASSERT_PRED(checkIs(val, checks));
882 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
883 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
884 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
886 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
887 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
888 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
889 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
890 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
891 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
892 JSONTEST_ASSERT_EQUAL(true, val.asBool());
893 JSONTEST_ASSERT_STRING_EQUAL("1099511627776.0",
894 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
897 val = Json::Value(-(Json::Int64(1) << 40));
899 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
902 checks.isInt64_ = true;
903 checks.isIntegral_ = true;
904 checks.isDouble_ = true;
905 checks.isNumeric_ = true;
906 JSONTEST_ASSERT_PRED(checkIs(val, checks));
908 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
909 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
910 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
912 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
913 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
914 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
915 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
916 JSONTEST_ASSERT_EQUAL(true, val.asBool());
917 JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
920 val = Json::Value(Json::Int64(kint64max));
922 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
925 checks.isInt64_ = true;
926 checks.isUInt64_ = true;
927 checks.isIntegral_ = true;
928 checks.isDouble_ = true;
929 checks.isNumeric_ = true;
930 JSONTEST_ASSERT_PRED(checkIs(val, checks));
932 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
933 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
934 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
936 JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
937 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
938 JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
939 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
940 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
941 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
942 JSONTEST_ASSERT_EQUAL(true, val.asBool());
943 JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
945 // int64 max (floating point constructor). Note that kint64max is not exactly
946 // representable as a double, and will be rounded up to be higher.
947 val = Json::Value(double(kint64max));
949 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
952 checks.isUInt64_ = true;
953 checks.isIntegral_ = true;
954 checks.isDouble_ = true;
955 checks.isNumeric_ = true;
956 JSONTEST_ASSERT_PRED(checkIs(val, checks));
958 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
959 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
960 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
962 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
963 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
964 JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
965 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(Json::UInt64(1) << 63)),
967 JSONTEST_ASSERT_EQUAL(true, val.asBool());
968 JSONTEST_ASSERT_STRING_EQUAL("9.2233720368547758e+18",
969 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
972 val = Json::Value(Json::Int64(kint64min));
974 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
977 checks.isInt64_ = true;
978 checks.isIntegral_ = true;
979 checks.isDouble_ = true;
980 checks.isNumeric_ = true;
981 JSONTEST_ASSERT_PRED(checkIs(val, checks));
983 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
984 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
985 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
987 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
988 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
989 JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
990 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
991 JSONTEST_ASSERT_EQUAL(true, val.asBool());
992 JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
994 // int64 min (floating point constructor). Note that kint64min *is* exactly
995 // representable as a double.
996 val = Json::Value(double(kint64min));
998 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1001 checks.isInt64_ = true;
1002 checks.isIntegral_ = true;
1003 checks.isDouble_ = true;
1004 checks.isNumeric_ = true;
1005 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1007 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1008 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1009 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1011 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
1012 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
1013 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
1014 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
1015 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1016 JSONTEST_ASSERT_STRING_EQUAL("-9.2233720368547758e+18",
1017 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1020 const Json::UInt64 ten_to_19 = static_cast<Json::UInt64>(1e19);
1021 val = Json::Value(Json::UInt64(ten_to_19));
1023 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1026 checks.isUInt64_ = true;
1027 checks.isIntegral_ = true;
1028 checks.isDouble_ = true;
1029 checks.isNumeric_ = true;
1030 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1032 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1033 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1034 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1036 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
1037 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
1038 JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
1039 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
1040 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1041 JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
1043 // 10^19 (double constructor). Note that 10^19 is not exactly representable
1045 val = Json::Value(uint64ToDouble(ten_to_19));
1047 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1050 checks.isUInt64_ = true;
1051 checks.isIntegral_ = true;
1052 checks.isDouble_ = true;
1053 checks.isNumeric_ = true;
1054 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1056 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1057 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1058 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1060 JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
1061 JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
1062 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1063 JSONTEST_ASSERT_STRING_EQUAL("1e+19",
1064 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1067 val = Json::Value(Json::UInt64(kuint64max));
1069 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1072 checks.isUInt64_ = true;
1073 checks.isIntegral_ = true;
1074 checks.isDouble_ = true;
1075 checks.isNumeric_ = true;
1076 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1078 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1079 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1080 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1082 JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
1083 JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
1084 JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
1085 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
1086 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1087 JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
1089 // uint64 max (floating point constructor). Note that kuint64max is not
1090 // exactly representable as a double, and will be rounded up to be higher.
1091 val = Json::Value(uint64ToDouble(kuint64max));
1093 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1096 checks.isDouble_ = true;
1097 checks.isNumeric_ = true;
1098 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1100 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1101 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1102 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1104 JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
1105 JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
1106 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1107 JSONTEST_ASSERT_STRING_EQUAL("1.8446744073709552e+19",
1108 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1112 JSONTEST_FIXTURE(ValueTest, nonIntegers) {
1116 // Small positive number
1117 val = Json::Value(1.5);
1119 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1122 checks.isDouble_ = true;
1123 checks.isNumeric_ = true;
1124 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1126 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1127 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1128 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1129 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1130 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1131 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1132 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1133 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1135 JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
1136 JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
1137 JSONTEST_ASSERT_EQUAL(1, val.asInt());
1138 JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
1139 JSONTEST_ASSERT_EQUAL(1, val.asUInt());
1140 JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
1141 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1142 JSONTEST_ASSERT_EQUAL("1.5", val.asString());
1144 // Small negative number
1145 val = Json::Value(-1.5);
1147 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1150 checks.isDouble_ = true;
1151 checks.isNumeric_ = true;
1152 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1154 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1155 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1156 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1157 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1158 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1159 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1160 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1161 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1163 JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
1164 JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
1165 JSONTEST_ASSERT_EQUAL(-1, val.asInt());
1166 JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
1167 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1168 JSONTEST_ASSERT_EQUAL("-1.5", val.asString());
1170 // A bit over int32 max
1171 val = Json::Value(kint32max + 0.5);
1173 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1176 checks.isDouble_ = true;
1177 checks.isNumeric_ = true;
1178 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1180 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1181 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1182 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1183 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1184 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1185 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1186 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1187 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1189 JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
1190 JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
1191 JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
1192 #ifdef JSON_HAS_INT64
1193 JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
1194 JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
1196 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1197 JSONTEST_ASSERT_EQUAL("2147483647.5",
1198 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1200 // A bit under int32 min
1201 val = Json::Value(kint32min - 0.5);
1203 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1206 checks.isDouble_ = true;
1207 checks.isNumeric_ = true;
1208 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1210 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1211 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1212 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1213 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1214 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1215 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1216 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1217 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1219 JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
1220 JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
1221 #ifdef JSON_HAS_INT64
1222 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 31), val.asLargestInt());
1224 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1225 JSONTEST_ASSERT_EQUAL("-2147483648.5",
1226 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1228 // A bit over uint32 max
1229 val = Json::Value(kuint32max + 0.5);
1231 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1234 checks.isDouble_ = true;
1235 checks.isNumeric_ = true;
1236 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1238 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1239 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1240 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1241 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1242 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1243 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1244 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1245 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1247 JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
1248 JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
1249 #ifdef JSON_HAS_INT64
1250 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32) - 1, val.asLargestInt());
1251 JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32) - Json::UInt64(1),
1252 val.asLargestUInt());
1254 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1255 JSONTEST_ASSERT_EQUAL("4294967295.5",
1256 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1258 val = Json::Value(1.2345678901234);
1259 JSONTEST_ASSERT_STRING_EQUAL("1.2345678901234001",
1260 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1262 // A 16-digit floating point number.
1263 val = Json::Value(2199023255552000.0f);
1264 JSONTEST_ASSERT_EQUAL(float(2199023255552000.0f), val.asFloat());
1265 JSONTEST_ASSERT_STRING_EQUAL("2199023255552000.0",
1266 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1268 // A very large floating point number.
1269 val = Json::Value(3.402823466385289e38);
1270 JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
1271 JSONTEST_ASSERT_STRING_EQUAL("3.402823466385289e+38",
1272 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1274 // An even larger floating point number.
1275 val = Json::Value(1.2345678e300);
1276 JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
1277 JSONTEST_ASSERT_STRING_EQUAL("1.2345678e+300",
1278 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1281 void ValueTest::checkConstMemberCount(const Json::Value& value,
1282 unsigned int expectedCount) {
1283 unsigned int count = 0;
1284 Json::Value::const_iterator itEnd = value.end();
1285 for (Json::Value::const_iterator it = value.begin(); it != itEnd; ++it) {
1288 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::const_iterator";
1291 void ValueTest::checkMemberCount(Json::Value& value,
1292 unsigned int expectedCount) {
1293 JSONTEST_ASSERT_EQUAL(expectedCount, value.size());
1295 unsigned int count = 0;
1296 Json::Value::iterator itEnd = value.end();
1297 for (Json::Value::iterator it = value.begin(); it != itEnd; ++it) {
1300 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::iterator";
1302 JSONTEST_ASSERT_PRED(checkConstMemberCount(value, expectedCount));
1305 ValueTest::IsCheck::IsCheck()
1306 : isObject_(false), isArray_(false), isBool_(false), isString_(false),
1307 isNull_(false), isInt_(false), isInt64_(false), isUInt_(false),
1308 isUInt64_(false), isIntegral_(false), isDouble_(false),
1309 isNumeric_(false) {}
1311 void ValueTest::checkIs(const Json::Value& value, const IsCheck& check) {
1312 JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject());
1313 JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray());
1314 JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool());
1315 JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble());
1316 JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt());
1317 JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt());
1318 JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral());
1319 JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric());
1320 JSONTEST_ASSERT_EQUAL(check.isString_, value.isString());
1321 JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull());
1323 #ifdef JSON_HAS_INT64
1324 JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64());
1325 JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64());
1327 JSONTEST_ASSERT_EQUAL(false, value.isInt64());
1328 JSONTEST_ASSERT_EQUAL(false, value.isUInt64());
1332 JSONTEST_FIXTURE(ValueTest, compareNull) {
1333 JSONTEST_ASSERT_PRED(checkIsEqual(Json::Value(), Json::Value()));
1336 JSONTEST_FIXTURE(ValueTest, compareInt) {
1337 JSONTEST_ASSERT_PRED(checkIsLess(0, 10));
1338 JSONTEST_ASSERT_PRED(checkIsEqual(10, 10));
1339 JSONTEST_ASSERT_PRED(checkIsEqual(-10, -10));
1340 JSONTEST_ASSERT_PRED(checkIsLess(-10, 0));
1343 JSONTEST_FIXTURE(ValueTest, compareUInt) {
1344 JSONTEST_ASSERT_PRED(checkIsLess(0u, 10u));
1345 JSONTEST_ASSERT_PRED(checkIsLess(0u, Json::Value::maxUInt));
1346 JSONTEST_ASSERT_PRED(checkIsEqual(10u, 10u));
1349 JSONTEST_FIXTURE(ValueTest, compareDouble) {
1350 JSONTEST_ASSERT_PRED(checkIsLess(0.0, 10.0));
1351 JSONTEST_ASSERT_PRED(checkIsEqual(10.0, 10.0));
1352 JSONTEST_ASSERT_PRED(checkIsEqual(-10.0, -10.0));
1353 JSONTEST_ASSERT_PRED(checkIsLess(-10.0, 0.0));
1356 JSONTEST_FIXTURE(ValueTest, compareString) {
1357 JSONTEST_ASSERT_PRED(checkIsLess("", " "));
1358 JSONTEST_ASSERT_PRED(checkIsLess("", "a"));
1359 JSONTEST_ASSERT_PRED(checkIsLess("abcd", "zyui"));
1360 JSONTEST_ASSERT_PRED(checkIsLess("abc", "abcd"));
1361 JSONTEST_ASSERT_PRED(checkIsEqual("abcd", "abcd"));
1362 JSONTEST_ASSERT_PRED(checkIsEqual(" ", " "));
1363 JSONTEST_ASSERT_PRED(checkIsLess("ABCD", "abcd"));
1364 JSONTEST_ASSERT_PRED(checkIsEqual("ABCD", "ABCD"));
1367 JSONTEST_FIXTURE(ValueTest, compareBoolean) {
1368 JSONTEST_ASSERT_PRED(checkIsLess(false, true));
1369 JSONTEST_ASSERT_PRED(checkIsEqual(false, false));
1370 JSONTEST_ASSERT_PRED(checkIsEqual(true, true));
1373 JSONTEST_FIXTURE(ValueTest, compareArray) {
1374 // array compare size then content
1375 Json::Value emptyArray(Json::arrayValue);
1376 Json::Value l1aArray;
1378 Json::Value l1bArray;
1379 l1bArray.append(10);
1380 Json::Value l2aArray;
1383 Json::Value l2bArray;
1385 l2bArray.append(10);
1386 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l1aArray));
1387 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l2aArray));
1388 JSONTEST_ASSERT_PRED(checkIsLess(l1aArray, l2aArray));
1389 JSONTEST_ASSERT_PRED(checkIsLess(l2aArray, l2bArray));
1390 JSONTEST_ASSERT_PRED(checkIsEqual(emptyArray, Json::Value(emptyArray)));
1391 JSONTEST_ASSERT_PRED(checkIsEqual(l1aArray, Json::Value(l1aArray)));
1392 JSONTEST_ASSERT_PRED(checkIsEqual(l2bArray, Json::Value(l2bArray)));
1395 JSONTEST_FIXTURE(ValueTest, compareObject) {
1396 // object compare size then content
1397 Json::Value emptyObject(Json::objectValue);
1398 Json::Value l1aObject;
1399 l1aObject["key1"] = 0;
1400 Json::Value l1bObject;
1401 l1aObject["key1"] = 10;
1402 Json::Value l2aObject;
1403 l2aObject["key1"] = 0;
1404 l2aObject["key2"] = 0;
1405 JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l1aObject));
1406 JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l2aObject));
1407 JSONTEST_ASSERT_PRED(checkIsLess(l1aObject, l2aObject));
1408 JSONTEST_ASSERT_PRED(checkIsEqual(emptyObject, Json::Value(emptyObject)));
1409 JSONTEST_ASSERT_PRED(checkIsEqual(l1aObject, Json::Value(l1aObject)));
1410 JSONTEST_ASSERT_PRED(checkIsEqual(l2aObject, Json::Value(l2aObject)));
1413 JSONTEST_FIXTURE(ValueTest, compareType) {
1414 // object of different type are ordered according to their type
1415 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(), Json::Value(1)));
1416 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1), Json::Value(1u)));
1417 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1u), Json::Value(1.0)));
1418 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1.0), Json::Value("a")));
1419 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value("a"), Json::Value(true)));
1420 JSONTEST_ASSERT_PRED(
1421 checkIsLess(Json::Value(true), Json::Value(Json::arrayValue)));
1422 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(Json::arrayValue),
1423 Json::Value(Json::objectValue)));
1426 void ValueTest::checkIsLess(const Json::Value& x, const Json::Value& y) {
1427 JSONTEST_ASSERT(x < y);
1428 JSONTEST_ASSERT(y > x);
1429 JSONTEST_ASSERT(x <= y);
1430 JSONTEST_ASSERT(y >= x);
1431 JSONTEST_ASSERT(!(x == y));
1432 JSONTEST_ASSERT(!(y == x));
1433 JSONTEST_ASSERT(!(x >= y));
1434 JSONTEST_ASSERT(!(y <= x));
1435 JSONTEST_ASSERT(!(x > y));
1436 JSONTEST_ASSERT(!(y < x));
1437 JSONTEST_ASSERT(x.compare(y) < 0);
1438 JSONTEST_ASSERT(y.compare(x) >= 0);
1441 void ValueTest::checkIsEqual(const Json::Value& x, const Json::Value& y) {
1442 JSONTEST_ASSERT(x == y);
1443 JSONTEST_ASSERT(y == x);
1444 JSONTEST_ASSERT(x <= y);
1445 JSONTEST_ASSERT(y <= x);
1446 JSONTEST_ASSERT(x >= y);
1447 JSONTEST_ASSERT(y >= x);
1448 JSONTEST_ASSERT(!(x < y));
1449 JSONTEST_ASSERT(!(y < x));
1450 JSONTEST_ASSERT(!(x > y));
1451 JSONTEST_ASSERT(!(y > x));
1452 JSONTEST_ASSERT(x.compare(y) == 0);
1453 JSONTEST_ASSERT(y.compare(x) == 0);
1456 JSONTEST_FIXTURE(ValueTest, typeChecksThrowExceptions) {
1457 #if JSON_USE_EXCEPTION
1459 Json::Value intVal(1);
1460 Json::Value strVal("Test");
1461 Json::Value objVal(Json::objectValue);
1462 Json::Value arrVal(Json::arrayValue);
1464 JSONTEST_ASSERT_THROWS(intVal["test"]);
1465 JSONTEST_ASSERT_THROWS(strVal["test"]);
1466 JSONTEST_ASSERT_THROWS(arrVal["test"]);
1468 JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
1469 JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
1470 JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
1472 JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
1473 JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
1474 JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
1476 JSONTEST_ASSERT_THROWS(intVal[0]);
1477 JSONTEST_ASSERT_THROWS(objVal[0]);
1478 JSONTEST_ASSERT_THROWS(strVal[0]);
1480 JSONTEST_ASSERT_THROWS(intVal.clear());
1482 JSONTEST_ASSERT_THROWS(intVal.resize(1));
1483 JSONTEST_ASSERT_THROWS(strVal.resize(1));
1484 JSONTEST_ASSERT_THROWS(objVal.resize(1));
1486 JSONTEST_ASSERT_THROWS(intVal.asCString());
1488 JSONTEST_ASSERT_THROWS(objVal.asString());
1489 JSONTEST_ASSERT_THROWS(arrVal.asString());
1491 JSONTEST_ASSERT_THROWS(strVal.asInt());
1492 JSONTEST_ASSERT_THROWS(objVal.asInt());
1493 JSONTEST_ASSERT_THROWS(arrVal.asInt());
1495 JSONTEST_ASSERT_THROWS(strVal.asUInt());
1496 JSONTEST_ASSERT_THROWS(objVal.asUInt());
1497 JSONTEST_ASSERT_THROWS(arrVal.asUInt());
1499 JSONTEST_ASSERT_THROWS(strVal.asInt64());
1500 JSONTEST_ASSERT_THROWS(objVal.asInt64());
1501 JSONTEST_ASSERT_THROWS(arrVal.asInt64());
1503 JSONTEST_ASSERT_THROWS(strVal.asUInt64());
1504 JSONTEST_ASSERT_THROWS(objVal.asUInt64());
1505 JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
1507 JSONTEST_ASSERT_THROWS(strVal.asDouble());
1508 JSONTEST_ASSERT_THROWS(objVal.asDouble());
1509 JSONTEST_ASSERT_THROWS(arrVal.asDouble());
1511 JSONTEST_ASSERT_THROWS(strVal.asFloat());
1512 JSONTEST_ASSERT_THROWS(objVal.asFloat());
1513 JSONTEST_ASSERT_THROWS(arrVal.asFloat());
1515 JSONTEST_ASSERT_THROWS(strVal.asBool());
1516 JSONTEST_ASSERT_THROWS(objVal.asBool());
1517 JSONTEST_ASSERT_THROWS(arrVal.asBool());
1522 JSONTEST_FIXTURE(ValueTest, offsetAccessors) {
1524 JSONTEST_ASSERT(x.getOffsetStart() == 0);
1525 JSONTEST_ASSERT(x.getOffsetLimit() == 0);
1526 x.setOffsetStart(10);
1527 x.setOffsetLimit(20);
1528 JSONTEST_ASSERT(x.getOffsetStart() == 10);
1529 JSONTEST_ASSERT(x.getOffsetLimit() == 20);
1531 JSONTEST_ASSERT(y.getOffsetStart() == 10);
1532 JSONTEST_ASSERT(y.getOffsetLimit() == 20);
1535 JSONTEST_ASSERT(z.getOffsetStart() == 10);
1536 JSONTEST_ASSERT(z.getOffsetLimit() == 20);
1537 JSONTEST_ASSERT(y.getOffsetStart() == 0);
1538 JSONTEST_ASSERT(y.getOffsetLimit() == 0);
1541 JSONTEST_FIXTURE(ValueTest, StaticString) {
1542 char mutant[] = "hello";
1543 Json::StaticString ss(mutant);
1544 JSONCPP_STRING regular(mutant);
1546 JSONTEST_ASSERT_STRING_EQUAL("hallo", ss.c_str());
1547 JSONTEST_ASSERT_STRING_EQUAL("hello", regular.c_str());
1551 JSONTEST_ASSERT_STRING_EQUAL("hallo", root["top"].asString());
1553 JSONTEST_ASSERT_STRING_EQUAL("hullo", root["top"].asString());
1557 root["top"] = regular;
1558 JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
1560 JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
1564 JSONTEST_FIXTURE(ValueTest, CommentBefore) {
1565 Json::Value val; // fill val
1566 val.setComment(JSONCPP_STRING("// this comment should appear before"), Json::commentBefore);
1567 Json::StreamWriterBuilder wbuilder;
1568 wbuilder.settings_["commentStyle"] = "All";
1570 char const expected[] = "// this comment should appear before\nnull";
1571 JSONCPP_STRING result = Json::writeString(wbuilder, val);
1572 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1573 JSONCPP_STRING res2 = val.toStyledString();
1574 JSONCPP_STRING exp2 = "\n";
1577 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1579 Json::Value other = "hello";
1580 val.swapPayload(other);
1582 char const expected[] = "// this comment should appear before\n\"hello\"";
1583 JSONCPP_STRING result = Json::writeString(wbuilder, val);
1584 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1585 JSONCPP_STRING res2 = val.toStyledString();
1586 JSONCPP_STRING exp2 = "\n";
1589 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1590 JSONTEST_ASSERT_STRING_EQUAL("null\n", other.toStyledString());
1593 // val.setComment("// this comment should appear before", Json::CommentPlacement::commentBefore);
1594 // Assignment over-writes comments.
1596 char const expected[] = "\"hello\"";
1597 JSONCPP_STRING result = Json::writeString(wbuilder, val);
1598 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1599 JSONCPP_STRING res2 = val.toStyledString();
1600 JSONCPP_STRING exp2 = "";
1603 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1607 JSONTEST_FIXTURE(ValueTest, zeroes) {
1608 char const cstr[] = "h\0i";
1609 JSONCPP_STRING binary(cstr, sizeof(cstr)); // include trailing 0
1610 JSONTEST_ASSERT_EQUAL(4U, binary.length());
1611 Json::StreamWriterBuilder b;
1615 JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
1618 char const top[] = "top";
1621 JSONTEST_ASSERT_STRING_EQUAL(binary, root[top].asString());
1622 Json::Value removed;
1624 did = root.removeMember(top, top + sizeof(top) - 1U,
1626 JSONTEST_ASSERT(did);
1627 JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString());
1628 did = root.removeMember(top, top + sizeof(top) - 1U,
1630 JSONTEST_ASSERT(!did);
1631 JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString()); // still
1635 JSONTEST_FIXTURE(ValueTest, zeroesInKeys) {
1636 char const cstr[] = "h\0i";
1637 JSONCPP_STRING binary(cstr, sizeof(cstr)); // include trailing 0
1638 JSONTEST_ASSERT_EQUAL(4U, binary.length());
1641 root[binary] = "there";
1642 JSONTEST_ASSERT_STRING_EQUAL("there", root[binary].asString());
1643 JSONTEST_ASSERT(!root.isMember("h"));
1644 JSONTEST_ASSERT(root.isMember(binary));
1645 JSONTEST_ASSERT_STRING_EQUAL("there", root.get(binary, Json::Value::nullRef).asString());
1646 Json::Value removed;
1648 did = root.removeMember(binary.data(), binary.data() + binary.length(),
1650 JSONTEST_ASSERT(did);
1651 JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString());
1652 did = root.removeMember(binary.data(), binary.data() + binary.length(),
1654 JSONTEST_ASSERT(!did);
1655 JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString()); // still
1656 JSONTEST_ASSERT(!root.isMember(binary));
1657 JSONTEST_ASSERT_STRING_EQUAL("", root.get(binary, Json::Value::nullRef).asString());
1661 JSONTEST_FIXTURE(ValueTest, specialFloats) {
1662 Json::StreamWriterBuilder b;
1663 b.settings_["useSpecialFloats"] = true;
1665 Json::Value v = std::numeric_limits<double>::quiet_NaN();
1666 JSONCPP_STRING expected = "NaN";
1667 JSONCPP_STRING result = Json::writeString(b, v);
1668 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1670 v = std::numeric_limits<double>::infinity();
1671 expected = "Infinity";
1672 result = Json::writeString(b, v);
1673 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1675 v = -std::numeric_limits<double>::infinity();
1676 expected = "-Infinity";
1677 result = Json::writeString(b, v);
1678 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1681 JSONTEST_FIXTURE(ValueTest, precision) {
1682 Json::StreamWriterBuilder b;
1683 b.settings_["precision"] = 5;
1685 Json::Value v = 100.0/3;
1686 JSONCPP_STRING expected = "33.333";
1687 JSONCPP_STRING result = Json::writeString(b, v);
1688 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1692 result = Json::writeString(b, v);
1693 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1696 expected = "0.25635";
1697 result = Json::writeString(b, v);
1698 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1700 b.settings_["precision"] = 1;
1702 result = Json::writeString(b, v);
1703 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1705 b.settings_["precision"] = 17;
1706 v = 1234857476305.256345694873740545068;
1707 expected = "1234857476305.2563";
1708 result = Json::writeString(b, v);
1709 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1711 b.settings_["precision"] = 24;
1712 v = 0.256345694873740545068;
1713 expected = "0.25634569487374054";
1714 result = Json::writeString(b, v);
1715 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1718 struct WriterTest : JsonTest::TestCase {};
1720 JSONTEST_FIXTURE(WriterTest, dropNullPlaceholders) {
1721 Json::FastWriter writer;
1722 Json::Value nullValue;
1723 JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
1725 writer.dropNullPlaceholders();
1726 JSONTEST_ASSERT(writer.write(nullValue) == "\n");
1729 struct StreamWriterTest : JsonTest::TestCase {};
1731 JSONTEST_FIXTURE(StreamWriterTest, dropNullPlaceholders) {
1732 Json::StreamWriterBuilder b;
1733 Json::Value nullValue;
1734 b.settings_["dropNullPlaceholders"] = false;
1735 JSONTEST_ASSERT(Json::writeString(b, nullValue) == "null");
1736 b.settings_["dropNullPlaceholders"] = true;
1737 JSONTEST_ASSERT(Json::writeString(b, nullValue) == "");
1740 JSONTEST_FIXTURE(StreamWriterTest, writeZeroes) {
1741 JSONCPP_STRING binary("hi", 3); // include trailing 0
1742 JSONTEST_ASSERT_EQUAL(3, binary.length());
1743 JSONCPP_STRING expected("\"hi\\u0000\""); // unicoded zero
1744 Json::StreamWriterBuilder b;
1748 JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
1749 JSONCPP_STRING out = Json::writeString(b, root);
1750 JSONTEST_ASSERT_EQUAL(expected.size(), out.size());
1751 JSONTEST_ASSERT_STRING_EQUAL(expected, out);
1755 root["top"] = binary;
1756 JSONTEST_ASSERT_STRING_EQUAL(binary, root["top"].asString());
1757 JSONCPP_STRING out = Json::writeString(b, root["top"]);
1758 JSONTEST_ASSERT_STRING_EQUAL(expected, out);
1762 struct ReaderTest : JsonTest::TestCase {};
1764 JSONTEST_FIXTURE(ReaderTest, parseWithNoErrors) {
1765 Json::Reader reader;
1767 bool ok = reader.parse("{ \"property\" : \"value\" }", root);
1768 JSONTEST_ASSERT(ok);
1769 JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
1770 JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
1773 JSONTEST_FIXTURE(ReaderTest, parseWithNoErrorsTestingOffsets) {
1774 Json::Reader reader;
1776 bool ok = reader.parse("{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
1777 "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
1778 "null, \"false\" : false }",
1780 JSONTEST_ASSERT(ok);
1781 JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
1782 JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
1783 JSONTEST_ASSERT(root["property"].getOffsetStart() == 15);
1784 JSONTEST_ASSERT(root["property"].getOffsetLimit() == 34);
1785 JSONTEST_ASSERT(root["property"][0].getOffsetStart() == 16);
1786 JSONTEST_ASSERT(root["property"][0].getOffsetLimit() == 23);
1787 JSONTEST_ASSERT(root["property"][1].getOffsetStart() == 25);
1788 JSONTEST_ASSERT(root["property"][1].getOffsetLimit() == 33);
1789 JSONTEST_ASSERT(root["obj"].getOffsetStart() == 44);
1790 JSONTEST_ASSERT(root["obj"].getOffsetLimit() == 76);
1791 JSONTEST_ASSERT(root["obj"]["nested"].getOffsetStart() == 57);
1792 JSONTEST_ASSERT(root["obj"]["nested"].getOffsetLimit() == 60);
1793 JSONTEST_ASSERT(root["obj"]["bool"].getOffsetStart() == 71);
1794 JSONTEST_ASSERT(root["obj"]["bool"].getOffsetLimit() == 75);
1795 JSONTEST_ASSERT(root["null"].getOffsetStart() == 87);
1796 JSONTEST_ASSERT(root["null"].getOffsetLimit() == 91);
1797 JSONTEST_ASSERT(root["false"].getOffsetStart() == 103);
1798 JSONTEST_ASSERT(root["false"].getOffsetLimit() == 108);
1799 JSONTEST_ASSERT(root.getOffsetStart() == 0);
1800 JSONTEST_ASSERT(root.getOffsetLimit() == 110);
1803 JSONTEST_FIXTURE(ReaderTest, parseWithOneError) {
1804 Json::Reader reader;
1806 bool ok = reader.parse("{ \"property\" :: \"value\" }", root);
1807 JSONTEST_ASSERT(!ok);
1808 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1809 "* Line 1, Column 15\n Syntax error: value, object or array "
1811 std::vector<Json::Reader::StructuredError> errors =
1812 reader.getStructuredErrors();
1813 JSONTEST_ASSERT(errors.size() == 1);
1814 JSONTEST_ASSERT(errors.at(0).offset_start == 14);
1815 JSONTEST_ASSERT(errors.at(0).offset_limit == 15);
1816 JSONTEST_ASSERT(errors.at(0).message ==
1817 "Syntax error: value, object or array expected.");
1820 JSONTEST_FIXTURE(ReaderTest, parseChineseWithOneError) {
1821 Json::Reader reader;
1823 bool ok = reader.parse("{ \"pr佐藤erty\" :: \"value\" }", root);
1824 JSONTEST_ASSERT(!ok);
1825 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1826 "* Line 1, Column 19\n Syntax error: value, object or array "
1828 std::vector<Json::Reader::StructuredError> errors =
1829 reader.getStructuredErrors();
1830 JSONTEST_ASSERT(errors.size() == 1);
1831 JSONTEST_ASSERT(errors.at(0).offset_start == 18);
1832 JSONTEST_ASSERT(errors.at(0).offset_limit == 19);
1833 JSONTEST_ASSERT(errors.at(0).message ==
1834 "Syntax error: value, object or array expected.");
1837 JSONTEST_FIXTURE(ReaderTest, parseWithDetailError) {
1838 Json::Reader reader;
1840 bool ok = reader.parse("{ \"property\" : \"v\\alue\" }", root);
1841 JSONTEST_ASSERT(!ok);
1842 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1843 "* Line 1, Column 16\n Bad escape sequence in string\nSee "
1844 "Line 1, Column 20 for detail.\n");
1845 std::vector<Json::Reader::StructuredError> errors =
1846 reader.getStructuredErrors();
1847 JSONTEST_ASSERT(errors.size() == 1);
1848 JSONTEST_ASSERT(errors.at(0).offset_start == 15);
1849 JSONTEST_ASSERT(errors.at(0).offset_limit == 23);
1850 JSONTEST_ASSERT(errors.at(0).message == "Bad escape sequence in string");
1853 struct CharReaderTest : JsonTest::TestCase {};
1855 JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrors) {
1856 Json::CharReaderBuilder b;
1857 Json::CharReader* reader(b.newCharReader());
1858 JSONCPP_STRING errs;
1860 char const doc[] = "{ \"property\" : \"value\" }";
1861 bool ok = reader->parse(
1862 doc, doc + std::strlen(doc),
1864 JSONTEST_ASSERT(ok);
1865 JSONTEST_ASSERT(errs.size() == 0);
1869 JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrorsTestingOffsets) {
1870 Json::CharReaderBuilder b;
1871 Json::CharReader* reader(b.newCharReader());
1872 JSONCPP_STRING errs;
1875 "{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
1876 "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
1877 "null, \"false\" : false }";
1878 bool ok = reader->parse(
1879 doc, doc + std::strlen(doc),
1881 JSONTEST_ASSERT(ok);
1882 JSONTEST_ASSERT(errs.size() == 0);
1886 JSONTEST_FIXTURE(CharReaderTest, parseWithOneError) {
1887 Json::CharReaderBuilder b;
1888 Json::CharReader* reader(b.newCharReader());
1889 JSONCPP_STRING errs;
1892 "{ \"property\" :: \"value\" }";
1893 bool ok = reader->parse(
1894 doc, doc + std::strlen(doc),
1896 JSONTEST_ASSERT(!ok);
1897 JSONTEST_ASSERT(errs ==
1898 "* Line 1, Column 15\n Syntax error: value, object or array "
1903 JSONTEST_FIXTURE(CharReaderTest, parseChineseWithOneError) {
1904 Json::CharReaderBuilder b;
1905 Json::CharReader* reader(b.newCharReader());
1906 JSONCPP_STRING errs;
1909 "{ \"pr佐藤erty\" :: \"value\" }";
1910 bool ok = reader->parse(
1911 doc, doc + std::strlen(doc),
1913 JSONTEST_ASSERT(!ok);
1914 JSONTEST_ASSERT(errs ==
1915 "* Line 1, Column 19\n Syntax error: value, object or array "
1920 JSONTEST_FIXTURE(CharReaderTest, parseWithDetailError) {
1921 Json::CharReaderBuilder b;
1922 Json::CharReader* reader(b.newCharReader());
1923 JSONCPP_STRING errs;
1926 "{ \"property\" : \"v\\alue\" }";
1927 bool ok = reader->parse(
1928 doc, doc + std::strlen(doc),
1930 JSONTEST_ASSERT(!ok);
1931 JSONTEST_ASSERT(errs ==
1932 "* Line 1, Column 16\n Bad escape sequence in string\nSee "
1933 "Line 1, Column 20 for detail.\n");
1937 JSONTEST_FIXTURE(CharReaderTest, parseWithStackLimit) {
1938 Json::CharReaderBuilder b;
1941 "{ \"property\" : \"value\" }";
1943 b.settings_["stackLimit"] = 2;
1944 Json::CharReader* reader(b.newCharReader());
1945 JSONCPP_STRING errs;
1946 bool ok = reader->parse(
1947 doc, doc + std::strlen(doc),
1949 JSONTEST_ASSERT(ok);
1950 JSONTEST_ASSERT(errs == "");
1951 JSONTEST_ASSERT_EQUAL("value", root["property"]);
1955 b.settings_["stackLimit"] = 1;
1956 Json::CharReader* reader(b.newCharReader());
1957 JSONCPP_STRING errs;
1958 JSONTEST_ASSERT_THROWS(reader->parse(
1959 doc, doc + std::strlen(doc),
1965 struct CharReaderStrictModeTest : JsonTest::TestCase {};
1967 JSONTEST_FIXTURE(CharReaderStrictModeTest, dupKeys) {
1968 Json::CharReaderBuilder b;
1971 "{ \"property\" : \"value\", \"key\" : \"val1\", \"key\" : \"val2\" }";
1973 b.strictMode(&b.settings_);
1974 Json::CharReader* reader(b.newCharReader());
1975 JSONCPP_STRING errs;
1976 bool ok = reader->parse(
1977 doc, doc + std::strlen(doc),
1979 JSONTEST_ASSERT(!ok);
1980 JSONTEST_ASSERT_STRING_EQUAL(
1981 "* Line 1, Column 41\n"
1982 " Duplicate key: 'key'\n",
1984 JSONTEST_ASSERT_EQUAL("val1", root["key"]); // so far
1988 struct CharReaderFailIfExtraTest : JsonTest::TestCase {};
1990 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue164) {
1991 // This is interpreted as a string value followed by a colon.
1992 Json::CharReaderBuilder b;
1995 " \"property\" : \"value\" }";
1997 b.settings_["failIfExtra"] = false;
1998 Json::CharReader* reader(b.newCharReader());
1999 JSONCPP_STRING errs;
2000 bool ok = reader->parse(
2001 doc, doc + std::strlen(doc),
2003 JSONTEST_ASSERT(ok);
2004 JSONTEST_ASSERT(errs == "");
2005 JSONTEST_ASSERT_EQUAL("property", root);
2009 b.settings_["failIfExtra"] = true;
2010 Json::CharReader* reader(b.newCharReader());
2011 JSONCPP_STRING errs;
2012 bool ok = reader->parse(
2013 doc, doc + std::strlen(doc),
2015 JSONTEST_ASSERT(!ok);
2016 JSONTEST_ASSERT_STRING_EQUAL(errs,
2017 "* Line 1, Column 13\n"
2018 " Extra non-whitespace after JSON value.\n");
2019 JSONTEST_ASSERT_EQUAL("property", root);
2023 b.settings_["failIfExtra"] = false;
2024 b.strictMode(&b.settings_);
2025 Json::CharReader* reader(b.newCharReader());
2026 JSONCPP_STRING errs;
2027 bool ok = reader->parse(
2028 doc, doc + std::strlen(doc),
2030 JSONTEST_ASSERT(!ok);
2031 JSONTEST_ASSERT_STRING_EQUAL(errs,
2032 "* Line 1, Column 13\n"
2033 " Extra non-whitespace after JSON value.\n");
2034 JSONTEST_ASSERT_EQUAL("property", root);
2038 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue107) {
2039 // This is interpretted as an int value followed by a colon.
2040 Json::CharReaderBuilder b;
2044 b.settings_["failIfExtra"] = true;
2045 Json::CharReader* reader(b.newCharReader());
2046 JSONCPP_STRING errs;
2047 bool ok = reader->parse(
2048 doc, doc + std::strlen(doc),
2050 JSONTEST_ASSERT(!ok);
2051 JSONTEST_ASSERT_STRING_EQUAL(
2052 "* Line 1, Column 2\n"
2053 " Extra non-whitespace after JSON value.\n",
2055 JSONTEST_ASSERT_EQUAL(1, root.asInt());
2058 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterObject) {
2059 Json::CharReaderBuilder b;
2063 "{ \"property\" : \"value\" } //trailing\n//comment\n";
2064 b.settings_["failIfExtra"] = true;
2065 Json::CharReader* reader(b.newCharReader());
2066 JSONCPP_STRING errs;
2067 bool ok = reader->parse(
2068 doc, doc + std::strlen(doc),
2070 JSONTEST_ASSERT(ok);
2071 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2072 JSONTEST_ASSERT_EQUAL("value", root["property"]);
2076 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterArray) {
2077 Json::CharReaderBuilder b;
2080 "[ \"property\" , \"value\" ] //trailing\n//comment\n";
2081 b.settings_["failIfExtra"] = true;
2082 Json::CharReader* reader(b.newCharReader());
2083 JSONCPP_STRING errs;
2084 bool ok = reader->parse(
2085 doc, doc + std::strlen(doc),
2087 JSONTEST_ASSERT(ok);
2088 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2089 JSONTEST_ASSERT_EQUAL("value", root[1u]);
2092 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterBool) {
2093 Json::CharReaderBuilder b;
2096 " true /*trailing\ncomment*/";
2097 b.settings_["failIfExtra"] = true;
2098 Json::CharReader* reader(b.newCharReader());
2099 JSONCPP_STRING errs;
2100 bool ok = reader->parse(
2101 doc, doc + std::strlen(doc),
2103 JSONTEST_ASSERT(ok);
2104 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2105 JSONTEST_ASSERT_EQUAL(true, root.asBool());
2108 struct CharReaderAllowDropNullTest : JsonTest::TestCase {};
2110 JSONTEST_FIXTURE(CharReaderAllowDropNullTest, issue178) {
2111 Json::CharReaderBuilder b;
2112 b.settings_["allowDroppedNullPlaceholders"] = true;
2114 JSONCPP_STRING errs;
2115 Json::CharReader* reader(b.newCharReader());
2117 char const doc[] = "{\"a\":,\"b\":true}";
2118 bool ok = reader->parse(
2119 doc, doc + std::strlen(doc),
2121 JSONTEST_ASSERT(ok);
2122 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2123 JSONTEST_ASSERT_EQUAL(2u, root.size());
2124 JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
2127 char const doc[] = "{\"a\":}";
2128 bool ok = reader->parse(
2129 doc, doc + std::strlen(doc),
2131 JSONTEST_ASSERT(ok);
2132 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2133 JSONTEST_ASSERT_EQUAL(1u, root.size());
2134 JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
2137 char const doc[] = "[]";
2138 bool ok = reader->parse(
2139 doc, doc + std::strlen(doc),
2141 JSONTEST_ASSERT(ok);
2142 JSONTEST_ASSERT(errs == "");
2143 JSONTEST_ASSERT_EQUAL(0u, root.size());
2144 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root);
2147 char const doc[] = "[null]";
2148 bool ok = reader->parse(
2149 doc, doc + std::strlen(doc),
2151 JSONTEST_ASSERT(ok);
2152 JSONTEST_ASSERT(errs == "");
2153 JSONTEST_ASSERT_EQUAL(1u, root.size());
2156 char const doc[] = "[,]";
2157 bool ok = reader->parse(
2158 doc, doc + std::strlen(doc),
2160 JSONTEST_ASSERT(ok);
2161 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2162 JSONTEST_ASSERT_EQUAL(2u, root.size());
2165 char const doc[] = "[,,,]";
2166 bool ok = reader->parse(
2167 doc, doc + std::strlen(doc),
2169 JSONTEST_ASSERT(ok);
2170 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2171 JSONTEST_ASSERT_EQUAL(4u, root.size());
2174 char const doc[] = "[null,]";
2175 bool ok = reader->parse(
2176 doc, doc + std::strlen(doc),
2178 JSONTEST_ASSERT(ok);
2179 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2180 JSONTEST_ASSERT_EQUAL(2u, root.size());
2183 char const doc[] = "[,null]";
2184 bool ok = reader->parse(
2185 doc, doc + std::strlen(doc),
2187 JSONTEST_ASSERT(ok);
2188 JSONTEST_ASSERT(errs == "");
2189 JSONTEST_ASSERT_EQUAL(2u, root.size());
2192 char const doc[] = "[,,]";
2193 bool ok = reader->parse(
2194 doc, doc + std::strlen(doc),
2196 JSONTEST_ASSERT(ok);
2197 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2198 JSONTEST_ASSERT_EQUAL(3u, root.size());
2201 char const doc[] = "[null,,]";
2202 bool ok = reader->parse(
2203 doc, doc + std::strlen(doc),
2205 JSONTEST_ASSERT(ok);
2206 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2207 JSONTEST_ASSERT_EQUAL(3u, root.size());
2210 char const doc[] = "[,null,]";
2211 bool ok = reader->parse(
2212 doc, doc + std::strlen(doc),
2214 JSONTEST_ASSERT(ok);
2215 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2216 JSONTEST_ASSERT_EQUAL(3u, root.size());
2219 char const doc[] = "[,,null]";
2220 bool ok = reader->parse(
2221 doc, doc + std::strlen(doc),
2223 JSONTEST_ASSERT(ok);
2224 JSONTEST_ASSERT(errs == "");
2225 JSONTEST_ASSERT_EQUAL(3u, root.size());
2228 char const doc[] = "[[],,,]";
2229 bool ok = reader->parse(
2230 doc, doc + std::strlen(doc),
2232 JSONTEST_ASSERT(ok);
2233 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2234 JSONTEST_ASSERT_EQUAL(4u, root.size());
2235 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[0u]);
2238 char const doc[] = "[,[],,]";
2239 bool ok = reader->parse(
2240 doc, doc + std::strlen(doc),
2242 JSONTEST_ASSERT(ok);
2243 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2244 JSONTEST_ASSERT_EQUAL(4u, root.size());
2245 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[1u]);
2248 char const doc[] = "[,,,[]]";
2249 bool ok = reader->parse(
2250 doc, doc + std::strlen(doc),
2252 JSONTEST_ASSERT(ok);
2253 JSONTEST_ASSERT(errs == "");
2254 JSONTEST_ASSERT_EQUAL(4u, root.size());
2255 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[3u]);
2260 struct CharReaderAllowSingleQuotesTest : JsonTest::TestCase {};
2262 JSONTEST_FIXTURE(CharReaderAllowSingleQuotesTest, issue182) {
2263 Json::CharReaderBuilder b;
2264 b.settings_["allowSingleQuotes"] = true;
2266 JSONCPP_STRING errs;
2267 Json::CharReader* reader(b.newCharReader());
2269 char const doc[] = "{'a':true,\"b\":true}";
2270 bool ok = reader->parse(
2271 doc, doc + std::strlen(doc),
2273 JSONTEST_ASSERT(ok);
2274 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2275 JSONTEST_ASSERT_EQUAL(2u, root.size());
2276 JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
2277 JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
2280 char const doc[] = "{'a': 'x', \"b\":'y'}";
2281 bool ok = reader->parse(
2282 doc, doc + std::strlen(doc),
2284 JSONTEST_ASSERT(ok);
2285 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2286 JSONTEST_ASSERT_EQUAL(2u, root.size());
2287 JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
2288 JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
2293 struct CharReaderAllowZeroesTest : JsonTest::TestCase {};
2295 JSONTEST_FIXTURE(CharReaderAllowZeroesTest, issue176) {
2296 Json::CharReaderBuilder b;
2297 b.settings_["allowSingleQuotes"] = true;
2299 JSONCPP_STRING errs;
2300 Json::CharReader* reader(b.newCharReader());
2302 char const doc[] = "{'a':true,\"b\":true}";
2303 bool ok = reader->parse(
2304 doc, doc + std::strlen(doc),
2306 JSONTEST_ASSERT(ok);
2307 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2308 JSONTEST_ASSERT_EQUAL(2u, root.size());
2309 JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
2310 JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
2313 char const doc[] = "{'a': 'x', \"b\":'y'}";
2314 bool ok = reader->parse(
2315 doc, doc + std::strlen(doc),
2317 JSONTEST_ASSERT(ok);
2318 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2319 JSONTEST_ASSERT_EQUAL(2u, root.size());
2320 JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
2321 JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
2326 struct CharReaderAllowSpecialFloatsTest : JsonTest::TestCase {};
2328 JSONTEST_FIXTURE(CharReaderAllowSpecialFloatsTest, issue209) {
2329 Json::CharReaderBuilder b;
2330 b.settings_["allowSpecialFloats"] = true;
2332 JSONCPP_STRING errs;
2333 Json::CharReader* reader(b.newCharReader());
2335 char const doc[] = "{\"a\":NaN,\"b\":Infinity,\"c\":-Infinity}";
2336 bool ok = reader->parse(
2337 doc, doc + std::strlen(doc),
2339 JSONTEST_ASSERT(ok);
2340 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2341 JSONTEST_ASSERT_EQUAL(3u, root.size());
2342 double n = root["a"].asDouble();
2343 JSONTEST_ASSERT(n != n);
2344 JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(), root.get("b", 0.0));
2345 JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(), root.get("c", 0.0));
2353 const TestData test_data[] = {
2354 {__LINE__, 1, "{\"a\":9}"},
2355 {__LINE__, 0, "{\"a\":0Infinity}"},
2356 {__LINE__, 0, "{\"a\":1Infinity}"},
2357 {__LINE__, 0, "{\"a\":9Infinity}"},
2358 {__LINE__, 0, "{\"a\":0nfinity}"},
2359 {__LINE__, 0, "{\"a\":1nfinity}"},
2360 {__LINE__, 0, "{\"a\":9nfinity}"},
2361 {__LINE__, 0, "{\"a\":nfinity}"},
2362 {__LINE__, 0, "{\"a\":.nfinity}"},
2363 {__LINE__, 0, "{\"a\":9nfinity}"},
2364 {__LINE__, 0, "{\"a\":-nfinity}"},
2365 {__LINE__, 1, "{\"a\":Infinity}"},
2366 {__LINE__, 0, "{\"a\":.Infinity}"},
2367 {__LINE__, 0, "{\"a\":_Infinity}"},
2368 {__LINE__, 0, "{\"a\":_nfinity}"},
2369 {__LINE__, 1, "{\"a\":-Infinity}"}
2371 for (size_t tdi = 0; tdi < sizeof(test_data) / sizeof(*test_data); ++tdi) {
2372 const TestData& td = test_data[tdi];
2373 bool ok = reader->parse(&*td.in.begin(),
2374 &*td.in.begin() + td.in.size(),
2376 JSONTEST_ASSERT(td.ok == ok)
2377 << "line:" << td.line << "\n"
2380 << ", in:\'" << td.in << "\'"
2388 char const doc[] = "{\"posInf\": Infinity, \"NegInf\": -Infinity}";
2389 bool ok = reader->parse(
2390 doc, doc + std::strlen(doc),
2392 JSONTEST_ASSERT(ok);
2393 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2394 JSONTEST_ASSERT_EQUAL(2u, root.size());
2395 JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(), root["posInf"].asDouble());
2396 JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(), root["NegInf"].asDouble());
2401 struct BuilderTest : JsonTest::TestCase {};
2403 JSONTEST_FIXTURE(BuilderTest, settings) {
2406 Json::CharReaderBuilder rb;
2407 JSONTEST_ASSERT_EQUAL(false, rb.settings_.isMember("foo"));
2408 JSONTEST_ASSERT_EQUAL(true, rb.validate(&errs));
2410 JSONTEST_ASSERT_EQUAL(true, rb.settings_.isMember("foo"));
2411 JSONTEST_ASSERT_EQUAL(false, rb.validate(&errs));
2415 Json::StreamWriterBuilder wb;
2416 JSONTEST_ASSERT_EQUAL(false, wb.settings_.isMember("foo"));
2417 JSONTEST_ASSERT_EQUAL(true, wb.validate(&errs));
2419 JSONTEST_ASSERT_EQUAL(true, wb.settings_.isMember("foo"));
2420 JSONTEST_ASSERT_EQUAL(false, wb.validate(&errs));
2424 struct IteratorTest : JsonTest::TestCase {};
2426 JSONTEST_FIXTURE(IteratorTest, distance) {
2432 for (Json::ValueIterator it = json.begin(); it != json.end(); ++it) {
2433 dist = it - json.begin();
2434 str = it->asString().c_str();
2436 JSONTEST_ASSERT_EQUAL(1, dist);
2437 JSONTEST_ASSERT_STRING_EQUAL("b", str);
2440 JSONTEST_FIXTURE(IteratorTest, names) {
2444 Json::ValueIterator it = json.begin();
2445 JSONTEST_ASSERT(it != json.end());
2446 JSONTEST_ASSERT_EQUAL(Json::Value("k1"), it.key());
2447 JSONTEST_ASSERT_STRING_EQUAL("k1", it.name());
2448 JSONTEST_ASSERT_EQUAL(-1, it.index());
2450 JSONTEST_ASSERT(it != json.end());
2451 JSONTEST_ASSERT_EQUAL(Json::Value("k2"), it.key());
2452 JSONTEST_ASSERT_STRING_EQUAL("k2", it.name());
2453 JSONTEST_ASSERT_EQUAL(-1, it.index());
2455 JSONTEST_ASSERT(it == json.end());
2458 JSONTEST_FIXTURE(IteratorTest, indexes) {
2462 Json::ValueIterator it = json.begin();
2463 JSONTEST_ASSERT(it != json.end());
2464 JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(0)), it.key());
2465 JSONTEST_ASSERT_STRING_EQUAL("", it.name());
2466 JSONTEST_ASSERT_EQUAL(0, it.index());
2468 JSONTEST_ASSERT(it != json.end());
2469 JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(1)), it.key());
2470 JSONTEST_ASSERT_STRING_EQUAL("", it.name());
2471 JSONTEST_ASSERT_EQUAL(1, it.index());
2473 JSONTEST_ASSERT(it == json.end());
2476 JSONTEST_FIXTURE(IteratorTest, const) {
2477 Json::Value const v;
2478 JSONTEST_ASSERT_THROWS(
2479 Json::Value::iterator it(v.begin()) // Compile, but throw.
2484 for(int i = 9; i < 12; ++i)
2486 JSONCPP_OSTRINGSTREAM out;
2487 out << std::setw(2) << i;
2488 JSONCPP_STRING str = out.str();
2492 JSONCPP_OSTRINGSTREAM out;
2493 //in old code, this will get a compile error
2494 Json::Value::const_iterator iter = value.begin();
2495 for(; iter != value.end(); ++iter)
2497 out << *iter << ',';
2499 JSONCPP_STRING expected = "\" 9\",\"10\",\"11\",";
2500 JSONTEST_ASSERT_STRING_EQUAL(expected, out.str());
2503 struct RValueTest : JsonTest::TestCase {};
2505 JSONTEST_FIXTURE(RValueTest, moveConstruction) {
2506 #if JSON_HAS_RVALUE_REFERENCES
2508 json["key"] = "value";
2509 Json::Value moved = std::move(json);
2510 JSONTEST_ASSERT(moved != json); // Possibly not nullValue; definitely not equal.
2511 JSONTEST_ASSERT_EQUAL(Json::objectValue, moved.type());
2512 JSONTEST_ASSERT_EQUAL(Json::stringValue, moved["key"].type());
2516 int main(int argc, const char* argv[]) {
2517 JsonTest::Runner runner;
2518 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, checkNormalizeFloatingPointStr);
2519 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, memberCount);
2520 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, objects);
2521 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrays);
2522 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrayIssue252);
2523 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, null);
2524 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, strings);
2525 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, bools);
2526 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, integers);
2527 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nonIntegers);
2528 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareNull);
2529 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareInt);
2530 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareUInt);
2531 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareDouble);
2532 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareString);
2533 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareBoolean);
2534 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareArray);
2535 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareObject);
2536 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareType);
2537 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, offsetAccessors);
2538 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, typeChecksThrowExceptions);
2539 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, StaticString);
2540 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, CommentBefore);
2541 //JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nulls);
2542 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, zeroes);
2543 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, zeroesInKeys);
2544 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, specialFloats);
2545 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, precision);
2547 JSONTEST_REGISTER_FIXTURE(runner, WriterTest, dropNullPlaceholders);
2548 JSONTEST_REGISTER_FIXTURE(runner, StreamWriterTest, dropNullPlaceholders);
2549 JSONTEST_REGISTER_FIXTURE(runner, StreamWriterTest, writeZeroes);
2551 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithNoErrors);
2552 JSONTEST_REGISTER_FIXTURE(
2553 runner, ReaderTest, parseWithNoErrorsTestingOffsets);
2554 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithOneError);
2555 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseChineseWithOneError);
2556 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithDetailError);
2558 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithNoErrors);
2559 JSONTEST_REGISTER_FIXTURE(
2560 runner, CharReaderTest, parseWithNoErrorsTestingOffsets);
2561 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithOneError);
2562 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseChineseWithOneError);
2563 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithDetailError);
2564 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithStackLimit);
2566 JSONTEST_REGISTER_FIXTURE(runner, CharReaderStrictModeTest, dupKeys);
2568 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue164);
2569 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue107);
2570 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterObject);
2571 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterArray);
2572 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterBool);
2574 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowDropNullTest, issue178);
2576 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowSingleQuotesTest, issue182);
2578 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowZeroesTest, issue176);
2580 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowSpecialFloatsTest, issue209);
2582 JSONTEST_REGISTER_FIXTURE(runner, BuilderTest, settings);
2584 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, distance);
2585 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, names);
2586 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, indexes);
2587 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, const);
2589 JSONTEST_REGISTER_FIXTURE(runner, RValueTest, moveConstruction);
2591 return runner.runCommandLine(argc, argv);
2594 #pragma GCC diagnostic pop