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
7 #include <json/config.h>
15 // Make numeric limits more convenient to talk about.
16 // Assumes int type in 32 bits.
17 #define kint32max Json::Value::maxInt
18 #define kint32min Json::Value::minInt
19 #define kuint32max Json::Value::maxUInt
20 #define kint64max Json::Value::maxInt64
21 #define kint64min Json::Value::minInt64
22 #define kuint64max Json::Value::maxUInt64
24 //static const double kdint64max = double(kint64max);
25 //static const float kfint64max = float(kint64max);
26 static const float kfint32max = float(kint32max);
27 static const float kfuint32max = float(kuint32max);
29 // //////////////////////////////////////////////////////////////////
30 // //////////////////////////////////////////////////////////////////
31 // Json Library test cases
32 // //////////////////////////////////////////////////////////////////
33 // //////////////////////////////////////////////////////////////////
35 #if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
36 static inline double uint64ToDouble(Json::UInt64 value) {
37 return static_cast<double>(value);
39 #else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
40 static inline double uint64ToDouble(Json::UInt64 value) {
41 return static_cast<double>(Json::Int64(value / 2)) * 2.0 +
42 static_cast<double>(Json::Int64(value & 1));
44 #endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
46 struct ValueTest : JsonTest::TestCase {
48 Json::Value emptyArray_;
49 Json::Value emptyObject_;
51 Json::Value unsignedInteger_;
52 Json::Value smallUnsignedInteger_;
57 Json::Value emptyString_;
64 : emptyArray_(Json::arrayValue), emptyObject_(Json::objectValue),
65 integer_(123456789), unsignedInteger_(34567890u),
66 smallUnsignedInteger_(Json::Value::UInt(Json::Value::maxInt)),
67 real_(1234.56789), float_(0.00390625f), emptyString_(""), string1_("a"),
68 string_("sometext with space"), true_(true), false_(false) {
70 object1_["id"] = 1234;
74 /// Initialize all checks to \c false by default.
92 void checkConstMemberCount(const Json::Value& value,
93 unsigned int expectedCount);
95 void checkMemberCount(Json::Value& value, unsigned int expectedCount);
97 void checkIs(const Json::Value& value, const IsCheck& check);
99 void checkIsLess(const Json::Value& x, const Json::Value& y);
101 void checkIsEqual(const Json::Value& x, const Json::Value& y);
103 /// Normalize the representation of floating-point number by stripped leading
105 static JSONCPP_STRING normalizeFloatingPointStr(const JSONCPP_STRING& s);
108 JSONCPP_STRING ValueTest::normalizeFloatingPointStr(const JSONCPP_STRING& s) {
109 JSONCPP_STRING::size_type index = s.find_last_of("eE");
110 if (index != JSONCPP_STRING::npos) {
111 JSONCPP_STRING::size_type hasSign =
112 (s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
113 JSONCPP_STRING::size_type exponentStartIndex = index + 1 + hasSign;
114 JSONCPP_STRING normalized = s.substr(0, exponentStartIndex);
115 JSONCPP_STRING::size_type indexDigit =
116 s.find_first_not_of('0', exponentStartIndex);
117 JSONCPP_STRING exponent = "0";
119 JSONCPP_STRING::npos) // There is an exponent different from 0
121 exponent = s.substr(indexDigit);
123 return normalized + exponent;
128 JSONTEST_FIXTURE(ValueTest, checkNormalizeFloatingPointStr) {
129 JSONTEST_ASSERT_STRING_EQUAL("0.0", normalizeFloatingPointStr("0.0"));
130 JSONTEST_ASSERT_STRING_EQUAL("0e0", normalizeFloatingPointStr("0e0"));
131 JSONTEST_ASSERT_STRING_EQUAL("1234.0", normalizeFloatingPointStr("1234.0"));
132 JSONTEST_ASSERT_STRING_EQUAL("1234.0e0",
133 normalizeFloatingPointStr("1234.0e0"));
134 JSONTEST_ASSERT_STRING_EQUAL("1234.0e+0",
135 normalizeFloatingPointStr("1234.0e+0"));
136 JSONTEST_ASSERT_STRING_EQUAL("1234e-1", normalizeFloatingPointStr("1234e-1"));
137 JSONTEST_ASSERT_STRING_EQUAL("1234e10", normalizeFloatingPointStr("1234e10"));
138 JSONTEST_ASSERT_STRING_EQUAL("1234e10",
139 normalizeFloatingPointStr("1234e010"));
140 JSONTEST_ASSERT_STRING_EQUAL("1234e+10",
141 normalizeFloatingPointStr("1234e+010"));
142 JSONTEST_ASSERT_STRING_EQUAL("1234e-10",
143 normalizeFloatingPointStr("1234e-010"));
144 JSONTEST_ASSERT_STRING_EQUAL("1234e+100",
145 normalizeFloatingPointStr("1234e+100"));
146 JSONTEST_ASSERT_STRING_EQUAL("1234e-100",
147 normalizeFloatingPointStr("1234e-100"));
148 JSONTEST_ASSERT_STRING_EQUAL("1234e+1",
149 normalizeFloatingPointStr("1234e+001"));
152 JSONTEST_FIXTURE(ValueTest, memberCount) {
153 JSONTEST_ASSERT_PRED(checkMemberCount(emptyArray_, 0));
154 JSONTEST_ASSERT_PRED(checkMemberCount(emptyObject_, 0));
155 JSONTEST_ASSERT_PRED(checkMemberCount(array1_, 1));
156 JSONTEST_ASSERT_PRED(checkMemberCount(object1_, 1));
157 JSONTEST_ASSERT_PRED(checkMemberCount(null_, 0));
158 JSONTEST_ASSERT_PRED(checkMemberCount(integer_, 0));
159 JSONTEST_ASSERT_PRED(checkMemberCount(unsignedInteger_, 0));
160 JSONTEST_ASSERT_PRED(checkMemberCount(smallUnsignedInteger_, 0));
161 JSONTEST_ASSERT_PRED(checkMemberCount(real_, 0));
162 JSONTEST_ASSERT_PRED(checkMemberCount(emptyString_, 0));
163 JSONTEST_ASSERT_PRED(checkMemberCount(string_, 0));
164 JSONTEST_ASSERT_PRED(checkMemberCount(true_, 0));
167 JSONTEST_FIXTURE(ValueTest, objects) {
170 checks.isObject_ = true;
171 JSONTEST_ASSERT_PRED(checkIs(emptyObject_, checks));
172 JSONTEST_ASSERT_PRED(checkIs(object1_, checks));
174 JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());
177 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));
179 // Non-empty object not okay
180 JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));
183 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));
186 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
187 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
188 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
189 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
190 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
191 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));
193 // Access through const reference
194 const Json::Value& constObject = object1_;
196 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
197 JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);
199 // Access through non-const reference
200 JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
201 JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
203 object1_["some other id"] = "foo";
204 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
205 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
210 did = object1_.removeMember("some other id", &got);
211 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
212 JSONTEST_ASSERT_EQUAL(true, did);
213 got = Json::Value("bar");
214 did = object1_.removeMember("some other id", &got);
215 JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
216 JSONTEST_ASSERT_EQUAL(false, did);
219 JSONTEST_FIXTURE(ValueTest, arrays) {
220 const unsigned int index0 = 0;
224 checks.isArray_ = true;
225 JSONTEST_ASSERT_PRED(checkIs(emptyArray_, checks));
226 JSONTEST_ASSERT_PRED(checkIs(array1_, checks));
228 JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
231 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));
233 // Non-empty array not okay
234 JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));
237 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));
240 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
241 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
242 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
243 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
244 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
245 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));
247 // Access through const reference
248 const Json::Value& constArray = array1_;
249 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
250 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
252 // Access through non-const reference
253 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
254 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
256 array1_[2] = Json::Value(17);
257 JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
258 JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
260 JSONTEST_ASSERT_EQUAL(true, array1_.removeIndex(2, &got));
261 JSONTEST_ASSERT_EQUAL(Json::Value(17), got);
262 JSONTEST_ASSERT_EQUAL(false, array1_.removeIndex(2, &got)); // gone now
264 JSONTEST_FIXTURE(ValueTest, arrayIssue252)
269 root["array"] = Json::Value::nullRef;
270 for (int i = 0; i < count; i++)
274 root["array"][i] = item;
276 //JSONTEST_ASSERT_EQUAL(5, root["array"].size());
279 JSONTEST_FIXTURE(ValueTest, null) {
280 JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
283 checks.isNull_ = true;
284 JSONTEST_ASSERT_PRED(checkIs(null_, checks));
286 JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
287 JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
288 JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
289 JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
290 JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
291 JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
292 JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
293 JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));
295 JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
296 JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
297 JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
298 JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
299 JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
300 JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
301 JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
303 JSONTEST_ASSERT_EQUAL(Json::Value::null, null_);
306 JSONTEST_FIXTURE(ValueTest, strings) {
307 JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
310 checks.isString_ = true;
311 JSONTEST_ASSERT_PRED(checkIs(emptyString_, checks));
312 JSONTEST_ASSERT_PRED(checkIs(string_, checks));
313 JSONTEST_ASSERT_PRED(checkIs(string1_, checks));
316 JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));
318 // Non-empty string not okay
319 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));
322 JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));
325 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
326 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
327 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
328 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
329 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));
331 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
332 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
335 JSONTEST_FIXTURE(ValueTest, bools) {
336 JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
339 checks.isBool_ = true;
340 JSONTEST_ASSERT_PRED(checkIs(false_, checks));
341 JSONTEST_ASSERT_PRED(checkIs(true_, checks));
344 JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));
347 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));
350 JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
351 JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
352 JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
353 JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
354 JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));
357 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
358 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));
360 JSONTEST_ASSERT_EQUAL(true, true_.asBool());
361 JSONTEST_ASSERT_EQUAL(1, true_.asInt());
362 JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
363 JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
364 JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
365 JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
366 JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());
368 JSONTEST_ASSERT_EQUAL(false, false_.asBool());
369 JSONTEST_ASSERT_EQUAL(0, false_.asInt());
370 JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
371 JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
372 JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
373 JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
374 JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
377 JSONTEST_FIXTURE(ValueTest, integers) {
381 // Conversions that don't depend on the value.
382 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
383 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
384 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
385 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
386 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));
388 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
389 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
390 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
391 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
392 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));
394 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
395 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
396 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
397 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
398 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));
401 val = Json::Value(Json::intValue);
403 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
406 checks.isInt_ = true;
407 checks.isInt64_ = true;
408 checks.isUInt_ = true;
409 checks.isUInt64_ = true;
410 checks.isIntegral_ = true;
411 checks.isDouble_ = true;
412 checks.isNumeric_ = true;
413 JSONTEST_ASSERT_PRED(checkIs(val, checks));
415 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
416 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
417 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
419 JSONTEST_ASSERT_EQUAL(0, val.asInt());
420 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
421 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
422 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
423 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
424 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
425 JSONTEST_ASSERT_EQUAL(false, val.asBool());
426 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
429 val = Json::Value(Json::uintValue);
431 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
434 checks.isInt_ = true;
435 checks.isInt64_ = true;
436 checks.isUInt_ = true;
437 checks.isUInt64_ = true;
438 checks.isIntegral_ = true;
439 checks.isDouble_ = true;
440 checks.isNumeric_ = true;
441 JSONTEST_ASSERT_PRED(checkIs(val, checks));
443 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
444 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
445 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
447 JSONTEST_ASSERT_EQUAL(0, val.asInt());
448 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
449 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
450 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
451 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
452 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
453 JSONTEST_ASSERT_EQUAL(false, val.asBool());
454 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
457 val = Json::Value(Json::realValue);
459 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
461 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
462 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
463 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
466 checks.isInt_ = true;
467 checks.isInt64_ = true;
468 checks.isUInt_ = true;
469 checks.isUInt64_ = true;
470 checks.isIntegral_ = true;
471 checks.isDouble_ = true;
472 checks.isNumeric_ = true;
473 JSONTEST_ASSERT_PRED(checkIs(val, checks));
475 JSONTEST_ASSERT_EQUAL(0, val.asInt());
476 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
477 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
478 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
479 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
480 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
481 JSONTEST_ASSERT_EQUAL(false, val.asBool());
482 JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
484 // Zero (signed constructor arg)
485 val = Json::Value(0);
487 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
490 checks.isInt_ = true;
491 checks.isInt64_ = true;
492 checks.isUInt_ = true;
493 checks.isUInt64_ = true;
494 checks.isIntegral_ = true;
495 checks.isDouble_ = true;
496 checks.isNumeric_ = true;
497 JSONTEST_ASSERT_PRED(checkIs(val, checks));
499 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
500 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
501 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
503 JSONTEST_ASSERT_EQUAL(0, val.asInt());
504 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
505 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
506 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
507 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
508 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
509 JSONTEST_ASSERT_EQUAL(false, val.asBool());
510 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
512 // Zero (unsigned constructor arg)
513 val = Json::Value(0u);
515 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
518 checks.isInt_ = true;
519 checks.isInt64_ = true;
520 checks.isUInt_ = true;
521 checks.isUInt64_ = true;
522 checks.isIntegral_ = true;
523 checks.isDouble_ = true;
524 checks.isNumeric_ = true;
525 JSONTEST_ASSERT_PRED(checkIs(val, checks));
527 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
528 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
529 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
531 JSONTEST_ASSERT_EQUAL(0, val.asInt());
532 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
533 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
534 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
535 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
536 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
537 JSONTEST_ASSERT_EQUAL(false, val.asBool());
538 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
540 // Zero (floating-point constructor arg)
541 val = Json::Value(0.0);
543 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
546 checks.isInt_ = true;
547 checks.isInt64_ = true;
548 checks.isUInt_ = true;
549 checks.isUInt64_ = true;
550 checks.isIntegral_ = true;
551 checks.isDouble_ = true;
552 checks.isNumeric_ = true;
553 JSONTEST_ASSERT_PRED(checkIs(val, checks));
555 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
556 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
557 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
559 JSONTEST_ASSERT_EQUAL(0, val.asInt());
560 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
561 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
562 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
563 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
564 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
565 JSONTEST_ASSERT_EQUAL(false, val.asBool());
566 JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
568 // 2^20 (signed constructor arg)
569 val = Json::Value(1 << 20);
571 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
573 checks.isInt_ = true;
574 checks.isInt64_ = true;
575 checks.isUInt_ = true;
576 checks.isUInt64_ = true;
577 checks.isIntegral_ = true;
578 checks.isDouble_ = true;
579 checks.isNumeric_ = true;
580 JSONTEST_ASSERT_PRED(checkIs(val, checks));
582 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
583 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
584 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
586 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
587 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
588 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
589 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
590 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
591 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
592 JSONTEST_ASSERT_EQUAL(true, val.asBool());
593 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
595 // 2^20 (unsigned constructor arg)
596 val = Json::Value(Json::UInt(1 << 20));
598 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
601 checks.isInt_ = true;
602 checks.isInt64_ = true;
603 checks.isUInt_ = true;
604 checks.isUInt64_ = true;
605 checks.isIntegral_ = true;
606 checks.isDouble_ = true;
607 checks.isNumeric_ = true;
608 JSONTEST_ASSERT_PRED(checkIs(val, checks));
610 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
611 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
612 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
614 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
615 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
616 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
617 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
618 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
619 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
620 JSONTEST_ASSERT_EQUAL(true, val.asBool());
621 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
623 // 2^20 (floating-point constructor arg)
624 val = Json::Value((1 << 20) / 1.0);
626 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
629 checks.isInt_ = true;
630 checks.isInt64_ = true;
631 checks.isUInt_ = true;
632 checks.isUInt64_ = true;
633 checks.isIntegral_ = true;
634 checks.isDouble_ = true;
635 checks.isNumeric_ = true;
636 JSONTEST_ASSERT_PRED(checkIs(val, checks));
638 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
639 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
640 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
642 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
643 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
644 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
645 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
646 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
647 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
648 JSONTEST_ASSERT_EQUAL(true, val.asBool());
649 JSONTEST_ASSERT_STRING_EQUAL("1048576.0",
650 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
653 val = Json::Value(-(1 << 20));
655 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
658 checks.isInt_ = true;
659 checks.isInt64_ = true;
660 checks.isIntegral_ = true;
661 checks.isDouble_ = true;
662 checks.isNumeric_ = true;
663 JSONTEST_ASSERT_PRED(checkIs(val, checks));
665 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
666 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
667 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
669 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
670 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
671 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
672 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
673 JSONTEST_ASSERT_EQUAL(true, val.asBool());
674 JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
677 val = Json::Value(kint32max);
679 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
682 checks.isInt_ = true;
683 checks.isInt64_ = true;
684 checks.isUInt_ = true;
685 checks.isUInt64_ = true;
686 checks.isIntegral_ = true;
687 checks.isDouble_ = true;
688 checks.isNumeric_ = true;
689 JSONTEST_ASSERT_PRED(checkIs(val, checks));
691 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
692 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
693 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
695 JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
696 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
697 JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
698 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
699 JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
700 JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
701 JSONTEST_ASSERT_EQUAL(true, val.asBool());
702 JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
705 val = Json::Value(kint32min);
707 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
710 checks.isInt_ = true;
711 checks.isInt64_ = true;
712 checks.isIntegral_ = true;
713 checks.isDouble_ = true;
714 checks.isNumeric_ = true;
715 JSONTEST_ASSERT_PRED(checkIs(val, checks));
717 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
718 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
719 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
721 JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
722 JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
723 JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
724 JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
725 JSONTEST_ASSERT_EQUAL(true, val.asBool());
726 JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
729 val = Json::Value(kuint32max);
731 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
734 checks.isInt64_ = true;
735 checks.isUInt_ = true;
736 checks.isUInt64_ = true;
737 checks.isIntegral_ = true;
738 checks.isDouble_ = true;
739 checks.isNumeric_ = true;
740 JSONTEST_ASSERT_PRED(checkIs(val, checks));
742 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
743 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
744 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
746 #ifndef JSON_NO_INT64
747 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
749 JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
750 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
751 JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
752 JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
753 JSONTEST_ASSERT_EQUAL(true, val.asBool());
754 JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
758 val = Json::Value(double(kint64max));
760 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
763 checks.isDouble_ = true;
764 checks.isNumeric_ = true;
765 JSONTEST_ASSERT_PRED(checkIs(val, checks));
767 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
768 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
769 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
771 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
772 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
773 JSONTEST_ASSERT_EQUAL(true, val.asBool());
774 JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
777 val = Json::Value(double(kint64min));
779 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
782 checks.isDouble_ = true;
783 checks.isNumeric_ = true;
784 JSONTEST_ASSERT_PRED(checkIs(val, checks));
786 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
787 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
788 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
790 JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
791 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
792 JSONTEST_ASSERT_EQUAL(true, val.asBool());
793 JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
796 val = Json::Value(double(kuint64max));
798 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
801 checks.isDouble_ = true;
802 checks.isNumeric_ = true;
803 JSONTEST_ASSERT_PRED(checkIs(val, checks));
805 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
806 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
807 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
809 JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
810 JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
811 JSONTEST_ASSERT_EQUAL(true, val.asBool());
812 JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
813 #else // ifdef JSON_NO_INT64
814 // 2^40 (signed constructor arg)
815 val = Json::Value(Json::Int64(1) << 40);
817 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
820 checks.isInt64_ = true;
821 checks.isUInt64_ = true;
822 checks.isIntegral_ = true;
823 checks.isDouble_ = true;
824 checks.isNumeric_ = true;
825 JSONTEST_ASSERT_PRED(checkIs(val, checks));
827 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
828 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
829 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
831 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
832 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
833 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
834 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
835 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
836 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
837 JSONTEST_ASSERT_EQUAL(true, val.asBool());
838 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
840 // 2^40 (unsigned constructor arg)
841 val = Json::Value(Json::UInt64(1) << 40);
843 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
846 checks.isInt64_ = true;
847 checks.isUInt64_ = true;
848 checks.isIntegral_ = true;
849 checks.isDouble_ = true;
850 checks.isNumeric_ = true;
851 JSONTEST_ASSERT_PRED(checkIs(val, checks));
853 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
854 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
855 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
857 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
858 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
859 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
860 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
861 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
862 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
863 JSONTEST_ASSERT_EQUAL(true, val.asBool());
864 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
866 // 2^40 (floating-point constructor arg)
867 val = Json::Value((Json::Int64(1) << 40) / 1.0);
869 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
872 checks.isInt64_ = true;
873 checks.isUInt64_ = true;
874 checks.isIntegral_ = true;
875 checks.isDouble_ = true;
876 checks.isNumeric_ = true;
877 JSONTEST_ASSERT_PRED(checkIs(val, checks));
879 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
880 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
881 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
883 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
884 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
885 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
886 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
887 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
888 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
889 JSONTEST_ASSERT_EQUAL(true, val.asBool());
890 JSONTEST_ASSERT_STRING_EQUAL("1099511627776.0",
891 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
894 val = Json::Value(-(Json::Int64(1) << 40));
896 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
899 checks.isInt64_ = true;
900 checks.isIntegral_ = true;
901 checks.isDouble_ = true;
902 checks.isNumeric_ = true;
903 JSONTEST_ASSERT_PRED(checkIs(val, checks));
905 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
906 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
907 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
909 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
910 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
911 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
912 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
913 JSONTEST_ASSERT_EQUAL(true, val.asBool());
914 JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
917 val = Json::Value(Json::Int64(kint64max));
919 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
922 checks.isInt64_ = true;
923 checks.isUInt64_ = true;
924 checks.isIntegral_ = true;
925 checks.isDouble_ = true;
926 checks.isNumeric_ = true;
927 JSONTEST_ASSERT_PRED(checkIs(val, checks));
929 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
930 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
931 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
933 JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
934 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
935 JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
936 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
937 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
938 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
939 JSONTEST_ASSERT_EQUAL(true, val.asBool());
940 JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
942 // int64 max (floating point constructor). Note that kint64max is not exactly
943 // representable as a double, and will be rounded up to be higher.
944 val = Json::Value(double(kint64max));
946 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
949 checks.isUInt64_ = true;
950 checks.isIntegral_ = true;
951 checks.isDouble_ = true;
952 checks.isNumeric_ = true;
953 JSONTEST_ASSERT_PRED(checkIs(val, checks));
955 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
956 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
957 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
959 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
960 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
961 JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
962 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(Json::UInt64(1) << 63)),
964 JSONTEST_ASSERT_EQUAL(true, val.asBool());
965 JSONTEST_ASSERT_STRING_EQUAL("9.2233720368547758e+18",
966 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
969 val = Json::Value(Json::Int64(kint64min));
971 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
974 checks.isInt64_ = true;
975 checks.isIntegral_ = true;
976 checks.isDouble_ = true;
977 checks.isNumeric_ = true;
978 JSONTEST_ASSERT_PRED(checkIs(val, checks));
980 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
981 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
982 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
984 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
985 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
986 JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
987 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
988 JSONTEST_ASSERT_EQUAL(true, val.asBool());
989 JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
991 // int64 min (floating point constructor). Note that kint64min *is* exactly
992 // representable as a double.
993 val = Json::Value(double(kint64min));
995 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
998 checks.isInt64_ = true;
999 checks.isIntegral_ = true;
1000 checks.isDouble_ = true;
1001 checks.isNumeric_ = true;
1002 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1004 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1005 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1006 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1008 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
1009 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
1010 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
1011 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
1012 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1013 JSONTEST_ASSERT_STRING_EQUAL("-9.2233720368547758e+18",
1014 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1017 const Json::UInt64 ten_to_19 = static_cast<Json::UInt64>(1e19);
1018 val = Json::Value(Json::UInt64(ten_to_19));
1020 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1023 checks.isUInt64_ = true;
1024 checks.isIntegral_ = true;
1025 checks.isDouble_ = true;
1026 checks.isNumeric_ = true;
1027 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1029 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1030 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1031 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1033 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
1034 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
1035 JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
1036 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
1037 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1038 JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
1040 // 10^19 (double constructor). Note that 10^19 is not exactly representable
1042 val = Json::Value(uint64ToDouble(ten_to_19));
1044 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1047 checks.isUInt64_ = true;
1048 checks.isIntegral_ = true;
1049 checks.isDouble_ = true;
1050 checks.isNumeric_ = true;
1051 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1053 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1054 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1055 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1057 JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
1058 JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
1059 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1060 JSONTEST_ASSERT_STRING_EQUAL("1e+19",
1061 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1064 val = Json::Value(Json::UInt64(kuint64max));
1066 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1069 checks.isUInt64_ = true;
1070 checks.isIntegral_ = true;
1071 checks.isDouble_ = true;
1072 checks.isNumeric_ = true;
1073 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1075 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1076 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1077 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1079 JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
1080 JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
1081 JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
1082 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
1083 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1084 JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
1086 // uint64 max (floating point constructor). Note that kuint64max is not
1087 // exactly representable as a double, and will be rounded up to be higher.
1088 val = Json::Value(uint64ToDouble(kuint64max));
1090 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1093 checks.isDouble_ = true;
1094 checks.isNumeric_ = true;
1095 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1097 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1098 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1099 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1101 JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
1102 JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
1103 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1104 JSONTEST_ASSERT_STRING_EQUAL("1.8446744073709552e+19",
1105 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1109 JSONTEST_FIXTURE(ValueTest, nonIntegers) {
1113 // Small positive number
1114 val = Json::Value(1.5);
1116 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1119 checks.isDouble_ = true;
1120 checks.isNumeric_ = true;
1121 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1123 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1124 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1125 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1126 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1127 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1128 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1129 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1130 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1132 JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
1133 JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
1134 JSONTEST_ASSERT_EQUAL(1, val.asInt());
1135 JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
1136 JSONTEST_ASSERT_EQUAL(1, val.asUInt());
1137 JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
1138 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1139 JSONTEST_ASSERT_EQUAL("1.5", val.asString());
1141 // Small negative number
1142 val = Json::Value(-1.5);
1144 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1147 checks.isDouble_ = true;
1148 checks.isNumeric_ = true;
1149 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1151 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1152 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1153 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1154 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1155 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1156 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1157 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1158 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1160 JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
1161 JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
1162 JSONTEST_ASSERT_EQUAL(-1, val.asInt());
1163 JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
1164 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1165 JSONTEST_ASSERT_EQUAL("-1.5", val.asString());
1167 // A bit over int32 max
1168 val = Json::Value(kint32max + 0.5);
1170 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1173 checks.isDouble_ = true;
1174 checks.isNumeric_ = true;
1175 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1177 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1178 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1179 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1180 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1181 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1182 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1183 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1184 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1186 JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
1187 JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
1188 JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
1189 #ifdef JSON_HAS_INT64
1190 JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
1191 JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
1193 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1194 JSONTEST_ASSERT_EQUAL("2147483647.5",
1195 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1197 // A bit under int32 min
1198 val = Json::Value(kint32min - 0.5);
1200 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1203 checks.isDouble_ = true;
1204 checks.isNumeric_ = true;
1205 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1207 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1208 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1209 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1210 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1211 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1212 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1213 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1214 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1216 JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
1217 JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
1218 #ifdef JSON_HAS_INT64
1219 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 31), val.asLargestInt());
1221 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1222 JSONTEST_ASSERT_EQUAL("-2147483648.5",
1223 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1225 // A bit over uint32 max
1226 val = Json::Value(kuint32max + 0.5);
1228 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1231 checks.isDouble_ = true;
1232 checks.isNumeric_ = true;
1233 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1235 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1236 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1237 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1238 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1239 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1240 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1241 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1242 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1244 JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
1245 JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
1246 #ifdef JSON_HAS_INT64
1247 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32) - 1, val.asLargestInt());
1248 JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32) - Json::UInt64(1),
1249 val.asLargestUInt());
1251 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1252 JSONTEST_ASSERT_EQUAL("4294967295.5",
1253 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1255 val = Json::Value(1.2345678901234);
1256 JSONTEST_ASSERT_STRING_EQUAL("1.2345678901234001",
1257 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1259 // A 16-digit floating point number.
1260 val = Json::Value(2199023255552000.0f);
1261 JSONTEST_ASSERT_EQUAL(float(2199023255552000.0f), val.asFloat());
1262 JSONTEST_ASSERT_STRING_EQUAL("2199023255552000.0",
1263 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1265 // A very large floating point number.
1266 val = Json::Value(3.402823466385289e38);
1267 JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
1268 JSONTEST_ASSERT_STRING_EQUAL("3.402823466385289e+38",
1269 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1271 // An even larger floating point number.
1272 val = Json::Value(1.2345678e300);
1273 JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
1274 JSONTEST_ASSERT_STRING_EQUAL("1.2345678e+300",
1275 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1278 void ValueTest::checkConstMemberCount(const Json::Value& value,
1279 unsigned int expectedCount) {
1280 unsigned int count = 0;
1281 Json::Value::const_iterator itEnd = value.end();
1282 for (Json::Value::const_iterator it = value.begin(); it != itEnd; ++it) {
1285 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::const_iterator";
1288 void ValueTest::checkMemberCount(Json::Value& value,
1289 unsigned int expectedCount) {
1290 JSONTEST_ASSERT_EQUAL(expectedCount, value.size());
1292 unsigned int count = 0;
1293 Json::Value::iterator itEnd = value.end();
1294 for (Json::Value::iterator it = value.begin(); it != itEnd; ++it) {
1297 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::iterator";
1299 JSONTEST_ASSERT_PRED(checkConstMemberCount(value, expectedCount));
1302 ValueTest::IsCheck::IsCheck()
1303 : isObject_(false), isArray_(false), isBool_(false), isString_(false),
1304 isNull_(false), isInt_(false), isInt64_(false), isUInt_(false),
1305 isUInt64_(false), isIntegral_(false), isDouble_(false),
1306 isNumeric_(false) {}
1308 void ValueTest::checkIs(const Json::Value& value, const IsCheck& check) {
1309 JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject());
1310 JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray());
1311 JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool());
1312 JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble());
1313 JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt());
1314 JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt());
1315 JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral());
1316 JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric());
1317 JSONTEST_ASSERT_EQUAL(check.isString_, value.isString());
1318 JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull());
1320 #ifdef JSON_HAS_INT64
1321 JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64());
1322 JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64());
1324 JSONTEST_ASSERT_EQUAL(false, value.isInt64());
1325 JSONTEST_ASSERT_EQUAL(false, value.isUInt64());
1329 JSONTEST_FIXTURE(ValueTest, compareNull) {
1330 JSONTEST_ASSERT_PRED(checkIsEqual(Json::Value(), Json::Value()));
1333 JSONTEST_FIXTURE(ValueTest, compareInt) {
1334 JSONTEST_ASSERT_PRED(checkIsLess(0, 10));
1335 JSONTEST_ASSERT_PRED(checkIsEqual(10, 10));
1336 JSONTEST_ASSERT_PRED(checkIsEqual(-10, -10));
1337 JSONTEST_ASSERT_PRED(checkIsLess(-10, 0));
1340 JSONTEST_FIXTURE(ValueTest, compareUInt) {
1341 JSONTEST_ASSERT_PRED(checkIsLess(0u, 10u));
1342 JSONTEST_ASSERT_PRED(checkIsLess(0u, Json::Value::maxUInt));
1343 JSONTEST_ASSERT_PRED(checkIsEqual(10u, 10u));
1346 JSONTEST_FIXTURE(ValueTest, compareDouble) {
1347 JSONTEST_ASSERT_PRED(checkIsLess(0.0, 10.0));
1348 JSONTEST_ASSERT_PRED(checkIsEqual(10.0, 10.0));
1349 JSONTEST_ASSERT_PRED(checkIsEqual(-10.0, -10.0));
1350 JSONTEST_ASSERT_PRED(checkIsLess(-10.0, 0.0));
1353 JSONTEST_FIXTURE(ValueTest, compareString) {
1354 JSONTEST_ASSERT_PRED(checkIsLess("", " "));
1355 JSONTEST_ASSERT_PRED(checkIsLess("", "a"));
1356 JSONTEST_ASSERT_PRED(checkIsLess("abcd", "zyui"));
1357 JSONTEST_ASSERT_PRED(checkIsLess("abc", "abcd"));
1358 JSONTEST_ASSERT_PRED(checkIsEqual("abcd", "abcd"));
1359 JSONTEST_ASSERT_PRED(checkIsEqual(" ", " "));
1360 JSONTEST_ASSERT_PRED(checkIsLess("ABCD", "abcd"));
1361 JSONTEST_ASSERT_PRED(checkIsEqual("ABCD", "ABCD"));
1364 JSONTEST_FIXTURE(ValueTest, compareBoolean) {
1365 JSONTEST_ASSERT_PRED(checkIsLess(false, true));
1366 JSONTEST_ASSERT_PRED(checkIsEqual(false, false));
1367 JSONTEST_ASSERT_PRED(checkIsEqual(true, true));
1370 JSONTEST_FIXTURE(ValueTest, compareArray) {
1371 // array compare size then content
1372 Json::Value emptyArray(Json::arrayValue);
1373 Json::Value l1aArray;
1375 Json::Value l1bArray;
1376 l1bArray.append(10);
1377 Json::Value l2aArray;
1380 Json::Value l2bArray;
1382 l2bArray.append(10);
1383 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l1aArray));
1384 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l2aArray));
1385 JSONTEST_ASSERT_PRED(checkIsLess(l1aArray, l2aArray));
1386 JSONTEST_ASSERT_PRED(checkIsLess(l2aArray, l2bArray));
1387 JSONTEST_ASSERT_PRED(checkIsEqual(emptyArray, Json::Value(emptyArray)));
1388 JSONTEST_ASSERT_PRED(checkIsEqual(l1aArray, Json::Value(l1aArray)));
1389 JSONTEST_ASSERT_PRED(checkIsEqual(l2bArray, Json::Value(l2bArray)));
1392 JSONTEST_FIXTURE(ValueTest, compareObject) {
1393 // object compare size then content
1394 Json::Value emptyObject(Json::objectValue);
1395 Json::Value l1aObject;
1396 l1aObject["key1"] = 0;
1397 Json::Value l1bObject;
1398 l1aObject["key1"] = 10;
1399 Json::Value l2aObject;
1400 l2aObject["key1"] = 0;
1401 l2aObject["key2"] = 0;
1402 JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l1aObject));
1403 JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l2aObject));
1404 JSONTEST_ASSERT_PRED(checkIsLess(l1aObject, l2aObject));
1405 JSONTEST_ASSERT_PRED(checkIsEqual(emptyObject, Json::Value(emptyObject)));
1406 JSONTEST_ASSERT_PRED(checkIsEqual(l1aObject, Json::Value(l1aObject)));
1407 JSONTEST_ASSERT_PRED(checkIsEqual(l2aObject, Json::Value(l2aObject)));
1410 JSONTEST_FIXTURE(ValueTest, compareType) {
1411 // object of different type are ordered according to their type
1412 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(), Json::Value(1)));
1413 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1), Json::Value(1u)));
1414 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1u), Json::Value(1.0)));
1415 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1.0), Json::Value("a")));
1416 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value("a"), Json::Value(true)));
1417 JSONTEST_ASSERT_PRED(
1418 checkIsLess(Json::Value(true), Json::Value(Json::arrayValue)));
1419 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(Json::arrayValue),
1420 Json::Value(Json::objectValue)));
1423 void ValueTest::checkIsLess(const Json::Value& x, const Json::Value& y) {
1424 JSONTEST_ASSERT(x < y);
1425 JSONTEST_ASSERT(y > x);
1426 JSONTEST_ASSERT(x <= y);
1427 JSONTEST_ASSERT(y >= x);
1428 JSONTEST_ASSERT(!(x == y));
1429 JSONTEST_ASSERT(!(y == x));
1430 JSONTEST_ASSERT(!(x >= y));
1431 JSONTEST_ASSERT(!(y <= x));
1432 JSONTEST_ASSERT(!(x > y));
1433 JSONTEST_ASSERT(!(y < x));
1434 JSONTEST_ASSERT(x.compare(y) < 0);
1435 JSONTEST_ASSERT(y.compare(x) >= 0);
1438 void ValueTest::checkIsEqual(const Json::Value& x, const Json::Value& y) {
1439 JSONTEST_ASSERT(x == y);
1440 JSONTEST_ASSERT(y == x);
1441 JSONTEST_ASSERT(x <= y);
1442 JSONTEST_ASSERT(y <= x);
1443 JSONTEST_ASSERT(x >= y);
1444 JSONTEST_ASSERT(y >= x);
1445 JSONTEST_ASSERT(!(x < y));
1446 JSONTEST_ASSERT(!(y < x));
1447 JSONTEST_ASSERT(!(x > y));
1448 JSONTEST_ASSERT(!(y > x));
1449 JSONTEST_ASSERT(x.compare(y) == 0);
1450 JSONTEST_ASSERT(y.compare(x) == 0);
1453 JSONTEST_FIXTURE(ValueTest, typeChecksThrowExceptions) {
1454 #if JSON_USE_EXCEPTION
1456 Json::Value intVal(1);
1457 Json::Value strVal("Test");
1458 Json::Value objVal(Json::objectValue);
1459 Json::Value arrVal(Json::arrayValue);
1461 JSONTEST_ASSERT_THROWS(intVal["test"]);
1462 JSONTEST_ASSERT_THROWS(strVal["test"]);
1463 JSONTEST_ASSERT_THROWS(arrVal["test"]);
1465 JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
1466 JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
1467 JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
1469 JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
1470 JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
1471 JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
1473 JSONTEST_ASSERT_THROWS(intVal[0]);
1474 JSONTEST_ASSERT_THROWS(objVal[0]);
1475 JSONTEST_ASSERT_THROWS(strVal[0]);
1477 JSONTEST_ASSERT_THROWS(intVal.clear());
1479 JSONTEST_ASSERT_THROWS(intVal.resize(1));
1480 JSONTEST_ASSERT_THROWS(strVal.resize(1));
1481 JSONTEST_ASSERT_THROWS(objVal.resize(1));
1483 JSONTEST_ASSERT_THROWS(intVal.asCString());
1485 JSONTEST_ASSERT_THROWS(objVal.asString());
1486 JSONTEST_ASSERT_THROWS(arrVal.asString());
1488 JSONTEST_ASSERT_THROWS(strVal.asInt());
1489 JSONTEST_ASSERT_THROWS(objVal.asInt());
1490 JSONTEST_ASSERT_THROWS(arrVal.asInt());
1492 JSONTEST_ASSERT_THROWS(strVal.asUInt());
1493 JSONTEST_ASSERT_THROWS(objVal.asUInt());
1494 JSONTEST_ASSERT_THROWS(arrVal.asUInt());
1496 JSONTEST_ASSERT_THROWS(strVal.asInt64());
1497 JSONTEST_ASSERT_THROWS(objVal.asInt64());
1498 JSONTEST_ASSERT_THROWS(arrVal.asInt64());
1500 JSONTEST_ASSERT_THROWS(strVal.asUInt64());
1501 JSONTEST_ASSERT_THROWS(objVal.asUInt64());
1502 JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
1504 JSONTEST_ASSERT_THROWS(strVal.asDouble());
1505 JSONTEST_ASSERT_THROWS(objVal.asDouble());
1506 JSONTEST_ASSERT_THROWS(arrVal.asDouble());
1508 JSONTEST_ASSERT_THROWS(strVal.asFloat());
1509 JSONTEST_ASSERT_THROWS(objVal.asFloat());
1510 JSONTEST_ASSERT_THROWS(arrVal.asFloat());
1512 JSONTEST_ASSERT_THROWS(strVal.asBool());
1513 JSONTEST_ASSERT_THROWS(objVal.asBool());
1514 JSONTEST_ASSERT_THROWS(arrVal.asBool());
1519 JSONTEST_FIXTURE(ValueTest, offsetAccessors) {
1521 JSONTEST_ASSERT(x.getOffsetStart() == 0);
1522 JSONTEST_ASSERT(x.getOffsetLimit() == 0);
1523 x.setOffsetStart(10);
1524 x.setOffsetLimit(20);
1525 JSONTEST_ASSERT(x.getOffsetStart() == 10);
1526 JSONTEST_ASSERT(x.getOffsetLimit() == 20);
1528 JSONTEST_ASSERT(y.getOffsetStart() == 10);
1529 JSONTEST_ASSERT(y.getOffsetLimit() == 20);
1532 JSONTEST_ASSERT(z.getOffsetStart() == 10);
1533 JSONTEST_ASSERT(z.getOffsetLimit() == 20);
1534 JSONTEST_ASSERT(y.getOffsetStart() == 0);
1535 JSONTEST_ASSERT(y.getOffsetLimit() == 0);
1538 JSONTEST_FIXTURE(ValueTest, StaticString) {
1539 char mutant[] = "hello";
1540 Json::StaticString ss(mutant);
1541 JSONCPP_STRING regular(mutant);
1543 JSONTEST_ASSERT_STRING_EQUAL("hallo", ss.c_str());
1544 JSONTEST_ASSERT_STRING_EQUAL("hello", regular.c_str());
1548 JSONTEST_ASSERT_STRING_EQUAL("hallo", root["top"].asString());
1550 JSONTEST_ASSERT_STRING_EQUAL("hullo", root["top"].asString());
1554 root["top"] = regular;
1555 JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
1557 JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
1561 JSONTEST_FIXTURE(ValueTest, CommentBefore) {
1562 Json::Value val; // fill val
1563 val.setComment(JSONCPP_STRING("// this comment should appear before"), Json::commentBefore);
1564 Json::StreamWriterBuilder wbuilder;
1565 wbuilder.settings_["commentStyle"] = "All";
1567 char const expected[] = "// this comment should appear before\nnull";
1568 JSONCPP_STRING result = Json::writeString(wbuilder, val);
1569 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1570 JSONCPP_STRING res2 = val.toStyledString();
1571 JSONCPP_STRING exp2 = "\n";
1574 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1576 Json::Value other = "hello";
1577 val.swapPayload(other);
1579 char const expected[] = "// this comment should appear before\n\"hello\"";
1580 JSONCPP_STRING result = Json::writeString(wbuilder, val);
1581 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1582 JSONCPP_STRING res2 = val.toStyledString();
1583 JSONCPP_STRING exp2 = "\n";
1586 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1587 JSONTEST_ASSERT_STRING_EQUAL("null\n", other.toStyledString());
1590 // val.setComment("// this comment should appear before", Json::CommentPlacement::commentBefore);
1591 // Assignment over-writes comments.
1593 char const expected[] = "\"hello\"";
1594 JSONCPP_STRING result = Json::writeString(wbuilder, val);
1595 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1596 JSONCPP_STRING res2 = val.toStyledString();
1597 JSONCPP_STRING exp2 = "";
1600 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1604 JSONTEST_FIXTURE(ValueTest, zeroes) {
1605 char const cstr[] = "h\0i";
1606 JSONCPP_STRING binary(cstr, sizeof(cstr)); // include trailing 0
1607 JSONTEST_ASSERT_EQUAL(4U, binary.length());
1608 Json::StreamWriterBuilder b;
1612 JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
1615 char const top[] = "top";
1618 JSONTEST_ASSERT_STRING_EQUAL(binary, root[top].asString());
1619 Json::Value removed;
1621 did = root.removeMember(top, top + sizeof(top) - 1U,
1623 JSONTEST_ASSERT(did);
1624 JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString());
1625 did = root.removeMember(top, top + sizeof(top) - 1U,
1627 JSONTEST_ASSERT(!did);
1628 JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString()); // still
1632 JSONTEST_FIXTURE(ValueTest, zeroesInKeys) {
1633 char const cstr[] = "h\0i";
1634 JSONCPP_STRING binary(cstr, sizeof(cstr)); // include trailing 0
1635 JSONTEST_ASSERT_EQUAL(4U, binary.length());
1638 root[binary] = "there";
1639 JSONTEST_ASSERT_STRING_EQUAL("there", root[binary].asString());
1640 JSONTEST_ASSERT(!root.isMember("h"));
1641 JSONTEST_ASSERT(root.isMember(binary));
1642 JSONTEST_ASSERT_STRING_EQUAL("there", root.get(binary, Json::Value::nullRef).asString());
1643 Json::Value removed;
1645 did = root.removeMember(binary.data(), binary.data() + binary.length(),
1647 JSONTEST_ASSERT(did);
1648 JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString());
1649 did = root.removeMember(binary.data(), binary.data() + binary.length(),
1651 JSONTEST_ASSERT(!did);
1652 JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString()); // still
1653 JSONTEST_ASSERT(!root.isMember(binary));
1654 JSONTEST_ASSERT_STRING_EQUAL("", root.get(binary, Json::Value::nullRef).asString());
1658 JSONTEST_FIXTURE(ValueTest, specialFloats) {
1659 Json::StreamWriterBuilder b;
1660 b.settings_["useSpecialFloats"] = true;
1662 Json::Value v = std::numeric_limits<double>::quiet_NaN();
1663 JSONCPP_STRING expected = "NaN";
1664 JSONCPP_STRING result = Json::writeString(b, v);
1665 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1667 v = std::numeric_limits<double>::infinity();
1668 expected = "Infinity";
1669 result = Json::writeString(b, v);
1670 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1672 v = -std::numeric_limits<double>::infinity();
1673 expected = "-Infinity";
1674 result = Json::writeString(b, v);
1675 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1678 JSONTEST_FIXTURE(ValueTest, precision) {
1679 Json::StreamWriterBuilder b;
1680 b.settings_["precision"] = 5;
1682 Json::Value v = 100.0/3;
1683 JSONCPP_STRING expected = "33.333";
1684 JSONCPP_STRING result = Json::writeString(b, v);
1685 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1689 result = Json::writeString(b, v);
1690 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1693 expected = "0.25635";
1694 result = Json::writeString(b, v);
1695 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1697 b.settings_["precision"] = 1;
1699 result = Json::writeString(b, v);
1700 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1702 b.settings_["precision"] = 17;
1703 v = 1234857476305.256345694873740545068;
1704 expected = "1234857476305.2563";
1705 result = Json::writeString(b, v);
1706 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1708 b.settings_["precision"] = 24;
1709 v = 0.256345694873740545068;
1710 expected = "0.25634569487374054";
1711 result = Json::writeString(b, v);
1712 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1715 struct WriterTest : JsonTest::TestCase {};
1717 JSONTEST_FIXTURE(WriterTest, dropNullPlaceholders) {
1718 Json::FastWriter writer;
1719 Json::Value nullValue;
1720 JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
1722 writer.dropNullPlaceholders();
1723 JSONTEST_ASSERT(writer.write(nullValue) == "\n");
1726 struct StreamWriterTest : JsonTest::TestCase {};
1728 JSONTEST_FIXTURE(StreamWriterTest, dropNullPlaceholders) {
1729 Json::StreamWriterBuilder b;
1730 Json::Value nullValue;
1731 b.settings_["dropNullPlaceholders"] = false;
1732 JSONTEST_ASSERT(Json::writeString(b, nullValue) == "null");
1733 b.settings_["dropNullPlaceholders"] = true;
1734 JSONTEST_ASSERT(Json::writeString(b, nullValue) == "");
1737 JSONTEST_FIXTURE(StreamWriterTest, writeZeroes) {
1738 JSONCPP_STRING binary("hi", 3); // include trailing 0
1739 JSONTEST_ASSERT_EQUAL(3, binary.length());
1740 JSONCPP_STRING expected("\"hi\\u0000\""); // unicoded zero
1741 Json::StreamWriterBuilder b;
1745 JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
1746 JSONCPP_STRING out = Json::writeString(b, root);
1747 JSONTEST_ASSERT_EQUAL(expected.size(), out.size());
1748 JSONTEST_ASSERT_STRING_EQUAL(expected, out);
1752 root["top"] = binary;
1753 JSONTEST_ASSERT_STRING_EQUAL(binary, root["top"].asString());
1754 JSONCPP_STRING out = Json::writeString(b, root["top"]);
1755 JSONTEST_ASSERT_STRING_EQUAL(expected, out);
1759 struct ReaderTest : JsonTest::TestCase {};
1761 JSONTEST_FIXTURE(ReaderTest, parseWithNoErrors) {
1762 Json::Reader reader;
1764 bool ok = reader.parse("{ \"property\" : \"value\" }", root);
1765 JSONTEST_ASSERT(ok);
1766 JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
1767 JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
1770 JSONTEST_FIXTURE(ReaderTest, parseWithNoErrorsTestingOffsets) {
1771 Json::Reader reader;
1773 bool ok = reader.parse("{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
1774 "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
1775 "null, \"false\" : false }",
1777 JSONTEST_ASSERT(ok);
1778 JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
1779 JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
1780 JSONTEST_ASSERT(root["property"].getOffsetStart() == 15);
1781 JSONTEST_ASSERT(root["property"].getOffsetLimit() == 34);
1782 JSONTEST_ASSERT(root["property"][0].getOffsetStart() == 16);
1783 JSONTEST_ASSERT(root["property"][0].getOffsetLimit() == 23);
1784 JSONTEST_ASSERT(root["property"][1].getOffsetStart() == 25);
1785 JSONTEST_ASSERT(root["property"][1].getOffsetLimit() == 33);
1786 JSONTEST_ASSERT(root["obj"].getOffsetStart() == 44);
1787 JSONTEST_ASSERT(root["obj"].getOffsetLimit() == 76);
1788 JSONTEST_ASSERT(root["obj"]["nested"].getOffsetStart() == 57);
1789 JSONTEST_ASSERT(root["obj"]["nested"].getOffsetLimit() == 60);
1790 JSONTEST_ASSERT(root["obj"]["bool"].getOffsetStart() == 71);
1791 JSONTEST_ASSERT(root["obj"]["bool"].getOffsetLimit() == 75);
1792 JSONTEST_ASSERT(root["null"].getOffsetStart() == 87);
1793 JSONTEST_ASSERT(root["null"].getOffsetLimit() == 91);
1794 JSONTEST_ASSERT(root["false"].getOffsetStart() == 103);
1795 JSONTEST_ASSERT(root["false"].getOffsetLimit() == 108);
1796 JSONTEST_ASSERT(root.getOffsetStart() == 0);
1797 JSONTEST_ASSERT(root.getOffsetLimit() == 110);
1800 JSONTEST_FIXTURE(ReaderTest, parseWithOneError) {
1801 Json::Reader reader;
1803 bool ok = reader.parse("{ \"property\" :: \"value\" }", root);
1804 JSONTEST_ASSERT(!ok);
1805 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1806 "* Line 1, Column 15\n Syntax error: value, object or array "
1808 std::vector<Json::Reader::StructuredError> errors =
1809 reader.getStructuredErrors();
1810 JSONTEST_ASSERT(errors.size() == 1);
1811 JSONTEST_ASSERT(errors.at(0).offset_start == 14);
1812 JSONTEST_ASSERT(errors.at(0).offset_limit == 15);
1813 JSONTEST_ASSERT(errors.at(0).message ==
1814 "Syntax error: value, object or array expected.");
1817 JSONTEST_FIXTURE(ReaderTest, parseChineseWithOneError) {
1818 Json::Reader reader;
1820 bool ok = reader.parse("{ \"pr佐藤erty\" :: \"value\" }", root);
1821 JSONTEST_ASSERT(!ok);
1822 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1823 "* Line 1, Column 19\n Syntax error: value, object or array "
1825 std::vector<Json::Reader::StructuredError> errors =
1826 reader.getStructuredErrors();
1827 JSONTEST_ASSERT(errors.size() == 1);
1828 JSONTEST_ASSERT(errors.at(0).offset_start == 18);
1829 JSONTEST_ASSERT(errors.at(0).offset_limit == 19);
1830 JSONTEST_ASSERT(errors.at(0).message ==
1831 "Syntax error: value, object or array expected.");
1834 JSONTEST_FIXTURE(ReaderTest, parseWithDetailError) {
1835 Json::Reader reader;
1837 bool ok = reader.parse("{ \"property\" : \"v\\alue\" }", root);
1838 JSONTEST_ASSERT(!ok);
1839 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1840 "* Line 1, Column 16\n Bad escape sequence in string\nSee "
1841 "Line 1, Column 20 for detail.\n");
1842 std::vector<Json::Reader::StructuredError> errors =
1843 reader.getStructuredErrors();
1844 JSONTEST_ASSERT(errors.size() == 1);
1845 JSONTEST_ASSERT(errors.at(0).offset_start == 15);
1846 JSONTEST_ASSERT(errors.at(0).offset_limit == 23);
1847 JSONTEST_ASSERT(errors.at(0).message == "Bad escape sequence in string");
1850 struct CharReaderTest : JsonTest::TestCase {};
1852 JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrors) {
1853 Json::CharReaderBuilder b;
1854 Json::CharReader* reader(b.newCharReader());
1855 JSONCPP_STRING errs;
1857 char const doc[] = "{ \"property\" : \"value\" }";
1858 bool ok = reader->parse(
1859 doc, doc + std::strlen(doc),
1861 JSONTEST_ASSERT(ok);
1862 JSONTEST_ASSERT(errs.size() == 0);
1866 JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrorsTestingOffsets) {
1867 Json::CharReaderBuilder b;
1868 Json::CharReader* reader(b.newCharReader());
1869 JSONCPP_STRING errs;
1872 "{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
1873 "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
1874 "null, \"false\" : false }";
1875 bool ok = reader->parse(
1876 doc, doc + std::strlen(doc),
1878 JSONTEST_ASSERT(ok);
1879 JSONTEST_ASSERT(errs.size() == 0);
1883 JSONTEST_FIXTURE(CharReaderTest, parseWithOneError) {
1884 Json::CharReaderBuilder b;
1885 Json::CharReader* reader(b.newCharReader());
1886 JSONCPP_STRING errs;
1889 "{ \"property\" :: \"value\" }";
1890 bool ok = reader->parse(
1891 doc, doc + std::strlen(doc),
1893 JSONTEST_ASSERT(!ok);
1894 JSONTEST_ASSERT(errs ==
1895 "* Line 1, Column 15\n Syntax error: value, object or array "
1900 JSONTEST_FIXTURE(CharReaderTest, parseChineseWithOneError) {
1901 Json::CharReaderBuilder b;
1902 Json::CharReader* reader(b.newCharReader());
1903 JSONCPP_STRING errs;
1906 "{ \"pr佐藤erty\" :: \"value\" }";
1907 bool ok = reader->parse(
1908 doc, doc + std::strlen(doc),
1910 JSONTEST_ASSERT(!ok);
1911 JSONTEST_ASSERT(errs ==
1912 "* Line 1, Column 19\n Syntax error: value, object or array "
1917 JSONTEST_FIXTURE(CharReaderTest, parseWithDetailError) {
1918 Json::CharReaderBuilder b;
1919 Json::CharReader* reader(b.newCharReader());
1920 JSONCPP_STRING errs;
1923 "{ \"property\" : \"v\\alue\" }";
1924 bool ok = reader->parse(
1925 doc, doc + std::strlen(doc),
1927 JSONTEST_ASSERT(!ok);
1928 JSONTEST_ASSERT(errs ==
1929 "* Line 1, Column 16\n Bad escape sequence in string\nSee "
1930 "Line 1, Column 20 for detail.\n");
1934 JSONTEST_FIXTURE(CharReaderTest, parseWithStackLimit) {
1935 Json::CharReaderBuilder b;
1938 "{ \"property\" : \"value\" }";
1940 b.settings_["stackLimit"] = 2;
1941 Json::CharReader* reader(b.newCharReader());
1942 JSONCPP_STRING errs;
1943 bool ok = reader->parse(
1944 doc, doc + std::strlen(doc),
1946 JSONTEST_ASSERT(ok);
1947 JSONTEST_ASSERT(errs == "");
1948 JSONTEST_ASSERT_EQUAL("value", root["property"]);
1952 b.settings_["stackLimit"] = 1;
1953 Json::CharReader* reader(b.newCharReader());
1954 JSONCPP_STRING errs;
1955 JSONTEST_ASSERT_THROWS(reader->parse(
1956 doc, doc + std::strlen(doc),
1962 struct CharReaderStrictModeTest : JsonTest::TestCase {};
1964 JSONTEST_FIXTURE(CharReaderStrictModeTest, dupKeys) {
1965 Json::CharReaderBuilder b;
1968 "{ \"property\" : \"value\", \"key\" : \"val1\", \"key\" : \"val2\" }";
1970 b.strictMode(&b.settings_);
1971 Json::CharReader* reader(b.newCharReader());
1972 JSONCPP_STRING errs;
1973 bool ok = reader->parse(
1974 doc, doc + std::strlen(doc),
1976 JSONTEST_ASSERT(!ok);
1977 JSONTEST_ASSERT_STRING_EQUAL(
1978 "* Line 1, Column 41\n"
1979 " Duplicate key: 'key'\n",
1981 JSONTEST_ASSERT_EQUAL("val1", root["key"]); // so far
1985 struct CharReaderFailIfExtraTest : JsonTest::TestCase {};
1987 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue164) {
1988 // This is interpreted as a string value followed by a colon.
1989 Json::CharReaderBuilder b;
1992 " \"property\" : \"value\" }";
1994 b.settings_["failIfExtra"] = false;
1995 Json::CharReader* reader(b.newCharReader());
1996 JSONCPP_STRING errs;
1997 bool ok = reader->parse(
1998 doc, doc + std::strlen(doc),
2000 JSONTEST_ASSERT(ok);
2001 JSONTEST_ASSERT(errs == "");
2002 JSONTEST_ASSERT_EQUAL("property", root);
2006 b.settings_["failIfExtra"] = true;
2007 Json::CharReader* reader(b.newCharReader());
2008 JSONCPP_STRING errs;
2009 bool ok = reader->parse(
2010 doc, doc + std::strlen(doc),
2012 JSONTEST_ASSERT(!ok);
2013 JSONTEST_ASSERT_STRING_EQUAL(errs,
2014 "* Line 1, Column 13\n"
2015 " Extra non-whitespace after JSON value.\n");
2016 JSONTEST_ASSERT_EQUAL("property", root);
2020 b.settings_["failIfExtra"] = false;
2021 b.strictMode(&b.settings_);
2022 Json::CharReader* reader(b.newCharReader());
2023 JSONCPP_STRING errs;
2024 bool ok = reader->parse(
2025 doc, doc + std::strlen(doc),
2027 JSONTEST_ASSERT(!ok);
2028 JSONTEST_ASSERT_STRING_EQUAL(errs,
2029 "* Line 1, Column 13\n"
2030 " Extra non-whitespace after JSON value.\n");
2031 JSONTEST_ASSERT_EQUAL("property", root);
2035 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue107) {
2036 // This is interpretted as an int value followed by a colon.
2037 Json::CharReaderBuilder b;
2041 b.settings_["failIfExtra"] = true;
2042 Json::CharReader* reader(b.newCharReader());
2043 JSONCPP_STRING errs;
2044 bool ok = reader->parse(
2045 doc, doc + std::strlen(doc),
2047 JSONTEST_ASSERT(!ok);
2048 JSONTEST_ASSERT_STRING_EQUAL(
2049 "* Line 1, Column 2\n"
2050 " Extra non-whitespace after JSON value.\n",
2052 JSONTEST_ASSERT_EQUAL(1, root.asInt());
2055 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterObject) {
2056 Json::CharReaderBuilder b;
2060 "{ \"property\" : \"value\" } //trailing\n//comment\n";
2061 b.settings_["failIfExtra"] = true;
2062 Json::CharReader* reader(b.newCharReader());
2063 JSONCPP_STRING errs;
2064 bool ok = reader->parse(
2065 doc, doc + std::strlen(doc),
2067 JSONTEST_ASSERT(ok);
2068 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2069 JSONTEST_ASSERT_EQUAL("value", root["property"]);
2073 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterArray) {
2074 Json::CharReaderBuilder b;
2077 "[ \"property\" , \"value\" ] //trailing\n//comment\n";
2078 b.settings_["failIfExtra"] = true;
2079 Json::CharReader* reader(b.newCharReader());
2080 JSONCPP_STRING errs;
2081 bool ok = reader->parse(
2082 doc, doc + std::strlen(doc),
2084 JSONTEST_ASSERT(ok);
2085 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2086 JSONTEST_ASSERT_EQUAL("value", root[1u]);
2089 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterBool) {
2090 Json::CharReaderBuilder b;
2093 " true /*trailing\ncomment*/";
2094 b.settings_["failIfExtra"] = true;
2095 Json::CharReader* reader(b.newCharReader());
2096 JSONCPP_STRING errs;
2097 bool ok = reader->parse(
2098 doc, doc + std::strlen(doc),
2100 JSONTEST_ASSERT(ok);
2101 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2102 JSONTEST_ASSERT_EQUAL(true, root.asBool());
2105 struct CharReaderAllowDropNullTest : JsonTest::TestCase {};
2107 JSONTEST_FIXTURE(CharReaderAllowDropNullTest, issue178) {
2108 Json::CharReaderBuilder b;
2109 b.settings_["allowDroppedNullPlaceholders"] = true;
2111 JSONCPP_STRING errs;
2112 Json::CharReader* reader(b.newCharReader());
2114 char const doc[] = "{\"a\":,\"b\":true}";
2115 bool ok = reader->parse(
2116 doc, doc + std::strlen(doc),
2118 JSONTEST_ASSERT(ok);
2119 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2120 JSONTEST_ASSERT_EQUAL(2u, root.size());
2121 JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
2124 char const doc[] = "{\"a\":}";
2125 bool ok = reader->parse(
2126 doc, doc + std::strlen(doc),
2128 JSONTEST_ASSERT(ok);
2129 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2130 JSONTEST_ASSERT_EQUAL(1u, root.size());
2131 JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
2134 char const doc[] = "[]";
2135 bool ok = reader->parse(
2136 doc, doc + std::strlen(doc),
2138 JSONTEST_ASSERT(ok);
2139 JSONTEST_ASSERT(errs == "");
2140 JSONTEST_ASSERT_EQUAL(0u, root.size());
2141 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root);
2144 char const doc[] = "[null]";
2145 bool ok = reader->parse(
2146 doc, doc + std::strlen(doc),
2148 JSONTEST_ASSERT(ok);
2149 JSONTEST_ASSERT(errs == "");
2150 JSONTEST_ASSERT_EQUAL(1u, root.size());
2153 char const doc[] = "[,]";
2154 bool ok = reader->parse(
2155 doc, doc + std::strlen(doc),
2157 JSONTEST_ASSERT(ok);
2158 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2159 JSONTEST_ASSERT_EQUAL(2u, root.size());
2162 char const doc[] = "[,,,]";
2163 bool ok = reader->parse(
2164 doc, doc + std::strlen(doc),
2166 JSONTEST_ASSERT(ok);
2167 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2168 JSONTEST_ASSERT_EQUAL(4u, root.size());
2171 char const doc[] = "[null,]";
2172 bool ok = reader->parse(
2173 doc, doc + std::strlen(doc),
2175 JSONTEST_ASSERT(ok);
2176 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2177 JSONTEST_ASSERT_EQUAL(2u, root.size());
2180 char const doc[] = "[,null]";
2181 bool ok = reader->parse(
2182 doc, doc + std::strlen(doc),
2184 JSONTEST_ASSERT(ok);
2185 JSONTEST_ASSERT(errs == "");
2186 JSONTEST_ASSERT_EQUAL(2u, root.size());
2189 char const doc[] = "[,,]";
2190 bool ok = reader->parse(
2191 doc, doc + std::strlen(doc),
2193 JSONTEST_ASSERT(ok);
2194 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2195 JSONTEST_ASSERT_EQUAL(3u, root.size());
2198 char const doc[] = "[null,,]";
2199 bool ok = reader->parse(
2200 doc, doc + std::strlen(doc),
2202 JSONTEST_ASSERT(ok);
2203 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2204 JSONTEST_ASSERT_EQUAL(3u, root.size());
2207 char const doc[] = "[,null,]";
2208 bool ok = reader->parse(
2209 doc, doc + std::strlen(doc),
2211 JSONTEST_ASSERT(ok);
2212 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2213 JSONTEST_ASSERT_EQUAL(3u, root.size());
2216 char const doc[] = "[,,null]";
2217 bool ok = reader->parse(
2218 doc, doc + std::strlen(doc),
2220 JSONTEST_ASSERT(ok);
2221 JSONTEST_ASSERT(errs == "");
2222 JSONTEST_ASSERT_EQUAL(3u, root.size());
2225 char const doc[] = "[[],,,]";
2226 bool ok = reader->parse(
2227 doc, doc + std::strlen(doc),
2229 JSONTEST_ASSERT(ok);
2230 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2231 JSONTEST_ASSERT_EQUAL(4u, root.size());
2232 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[0u]);
2235 char const doc[] = "[,[],,]";
2236 bool ok = reader->parse(
2237 doc, doc + std::strlen(doc),
2239 JSONTEST_ASSERT(ok);
2240 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2241 JSONTEST_ASSERT_EQUAL(4u, root.size());
2242 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[1u]);
2245 char const doc[] = "[,,,[]]";
2246 bool ok = reader->parse(
2247 doc, doc + std::strlen(doc),
2249 JSONTEST_ASSERT(ok);
2250 JSONTEST_ASSERT(errs == "");
2251 JSONTEST_ASSERT_EQUAL(4u, root.size());
2252 JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[3u]);
2257 struct CharReaderAllowSingleQuotesTest : JsonTest::TestCase {};
2259 JSONTEST_FIXTURE(CharReaderAllowSingleQuotesTest, issue182) {
2260 Json::CharReaderBuilder b;
2261 b.settings_["allowSingleQuotes"] = true;
2263 JSONCPP_STRING errs;
2264 Json::CharReader* reader(b.newCharReader());
2266 char const doc[] = "{'a':true,\"b\":true}";
2267 bool ok = reader->parse(
2268 doc, doc + std::strlen(doc),
2270 JSONTEST_ASSERT(ok);
2271 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2272 JSONTEST_ASSERT_EQUAL(2u, root.size());
2273 JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
2274 JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
2277 char const doc[] = "{'a': 'x', \"b\":'y'}";
2278 bool ok = reader->parse(
2279 doc, doc + std::strlen(doc),
2281 JSONTEST_ASSERT(ok);
2282 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2283 JSONTEST_ASSERT_EQUAL(2u, root.size());
2284 JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
2285 JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
2290 struct CharReaderAllowZeroesTest : JsonTest::TestCase {};
2292 JSONTEST_FIXTURE(CharReaderAllowZeroesTest, issue176) {
2293 Json::CharReaderBuilder b;
2294 b.settings_["allowSingleQuotes"] = true;
2296 JSONCPP_STRING errs;
2297 Json::CharReader* reader(b.newCharReader());
2299 char const doc[] = "{'a':true,\"b\":true}";
2300 bool ok = reader->parse(
2301 doc, doc + std::strlen(doc),
2303 JSONTEST_ASSERT(ok);
2304 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2305 JSONTEST_ASSERT_EQUAL(2u, root.size());
2306 JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
2307 JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
2310 char const doc[] = "{'a': 'x', \"b\":'y'}";
2311 bool ok = reader->parse(
2312 doc, doc + std::strlen(doc),
2314 JSONTEST_ASSERT(ok);
2315 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2316 JSONTEST_ASSERT_EQUAL(2u, root.size());
2317 JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
2318 JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
2323 struct CharReaderAllowSpecialFloatsTest : JsonTest::TestCase {};
2325 JSONTEST_FIXTURE(CharReaderAllowSpecialFloatsTest, issue209) {
2326 Json::CharReaderBuilder b;
2327 b.settings_["allowSpecialFloats"] = true;
2329 JSONCPP_STRING errs;
2330 Json::CharReader* reader(b.newCharReader());
2332 char const doc[] = "{\"a\":NaN,\"b\":Infinity,\"c\":-Infinity}";
2333 bool ok = reader->parse(
2334 doc, doc + std::strlen(doc),
2336 JSONTEST_ASSERT(ok);
2337 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2338 JSONTEST_ASSERT_EQUAL(3u, root.size());
2339 double n = root["a"].asDouble();
2340 JSONTEST_ASSERT(n != n);
2341 JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(), root.get("b", 0.0));
2342 JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(), root.get("c", 0.0));
2350 const TestData test_data[] = {
2351 {__LINE__, 1, "{\"a\":9}"},
2352 {__LINE__, 0, "{\"a\":0Infinity}"},
2353 {__LINE__, 0, "{\"a\":1Infinity}"},
2354 {__LINE__, 0, "{\"a\":9Infinity}"},
2355 {__LINE__, 0, "{\"a\":0nfinity}"},
2356 {__LINE__, 0, "{\"a\":1nfinity}"},
2357 {__LINE__, 0, "{\"a\":9nfinity}"},
2358 {__LINE__, 0, "{\"a\":nfinity}"},
2359 {__LINE__, 0, "{\"a\":.nfinity}"},
2360 {__LINE__, 0, "{\"a\":9nfinity}"},
2361 {__LINE__, 0, "{\"a\":-nfinity}"},
2362 {__LINE__, 1, "{\"a\":Infinity}"},
2363 {__LINE__, 0, "{\"a\":.Infinity}"},
2364 {__LINE__, 0, "{\"a\":_Infinity}"},
2365 {__LINE__, 0, "{\"a\":_nfinity}"},
2366 {__LINE__, 1, "{\"a\":-Infinity}"}
2368 for (size_t tdi = 0; tdi < sizeof(test_data) / sizeof(*test_data); ++tdi) {
2369 const TestData& td = test_data[tdi];
2370 bool ok = reader->parse(&*td.in.begin(),
2371 &*td.in.begin() + td.in.size(),
2373 JSONTEST_ASSERT(td.ok == ok)
2374 << "line:" << td.line << "\n"
2377 << ", in:\'" << td.in << "\'"
2385 char const doc[] = "{\"posInf\": Infinity, \"NegInf\": -Infinity}";
2386 bool ok = reader->parse(
2387 doc, doc + std::strlen(doc),
2389 JSONTEST_ASSERT(ok);
2390 JSONTEST_ASSERT_STRING_EQUAL("", errs);
2391 JSONTEST_ASSERT_EQUAL(2u, root.size());
2392 JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(), root["posInf"].asDouble());
2393 JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(), root["NegInf"].asDouble());
2398 struct BuilderTest : JsonTest::TestCase {};
2400 JSONTEST_FIXTURE(BuilderTest, settings) {
2403 Json::CharReaderBuilder rb;
2404 JSONTEST_ASSERT_EQUAL(false, rb.settings_.isMember("foo"));
2405 JSONTEST_ASSERT_EQUAL(true, rb.validate(&errs));
2407 JSONTEST_ASSERT_EQUAL(true, rb.settings_.isMember("foo"));
2408 JSONTEST_ASSERT_EQUAL(false, rb.validate(&errs));
2412 Json::StreamWriterBuilder wb;
2413 JSONTEST_ASSERT_EQUAL(false, wb.settings_.isMember("foo"));
2414 JSONTEST_ASSERT_EQUAL(true, wb.validate(&errs));
2416 JSONTEST_ASSERT_EQUAL(true, wb.settings_.isMember("foo"));
2417 JSONTEST_ASSERT_EQUAL(false, wb.validate(&errs));
2421 struct IteratorTest : JsonTest::TestCase {};
2423 JSONTEST_FIXTURE(IteratorTest, distance) {
2429 for (Json::ValueIterator it = json.begin(); it != json.end(); ++it) {
2430 dist = it - json.begin();
2431 str = it->asString().c_str();
2433 JSONTEST_ASSERT_EQUAL(1, dist);
2434 JSONTEST_ASSERT_STRING_EQUAL("b", str);
2437 JSONTEST_FIXTURE(IteratorTest, names) {
2441 Json::ValueIterator it = json.begin();
2442 JSONTEST_ASSERT(it != json.end());
2443 JSONTEST_ASSERT_EQUAL(Json::Value("k1"), it.key());
2444 JSONTEST_ASSERT_STRING_EQUAL("k1", it.name());
2445 JSONTEST_ASSERT_EQUAL(-1, it.index());
2447 JSONTEST_ASSERT(it != json.end());
2448 JSONTEST_ASSERT_EQUAL(Json::Value("k2"), it.key());
2449 JSONTEST_ASSERT_STRING_EQUAL("k2", it.name());
2450 JSONTEST_ASSERT_EQUAL(-1, it.index());
2452 JSONTEST_ASSERT(it == json.end());
2455 JSONTEST_FIXTURE(IteratorTest, indexes) {
2459 Json::ValueIterator it = json.begin();
2460 JSONTEST_ASSERT(it != json.end());
2461 JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(0)), it.key());
2462 JSONTEST_ASSERT_STRING_EQUAL("", it.name());
2463 JSONTEST_ASSERT_EQUAL(0, it.index());
2465 JSONTEST_ASSERT(it != json.end());
2466 JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(1)), it.key());
2467 JSONTEST_ASSERT_STRING_EQUAL("", it.name());
2468 JSONTEST_ASSERT_EQUAL(1, it.index());
2470 JSONTEST_ASSERT(it == json.end());
2473 JSONTEST_FIXTURE(IteratorTest, const) {
2474 Json::Value const v;
2475 JSONTEST_ASSERT_THROWS(
2476 Json::Value::iterator it(v.begin()) // Compile, but throw.
2481 for(int i = 9; i < 12; ++i)
2483 JSONCPP_OSTRINGSTREAM out;
2484 out << std::setw(2) << i;
2485 JSONCPP_STRING str = out.str();
2489 JSONCPP_OSTRINGSTREAM out;
2490 //in old code, this will get a compile error
2491 Json::Value::const_iterator iter = value.begin();
2492 for(; iter != value.end(); ++iter)
2494 out << *iter << ',';
2496 JSONCPP_STRING expected = "\" 9\",\"10\",\"11\",";
2497 JSONTEST_ASSERT_STRING_EQUAL(expected, out.str());
2500 struct RValueTest : JsonTest::TestCase {};
2502 JSONTEST_FIXTURE(RValueTest, moveConstruction) {
2503 #if JSON_HAS_RVALUE_REFERENCES
2505 json["key"] = "value";
2506 Json::Value moved = std::move(json);
2507 JSONTEST_ASSERT(moved != json); // Possibly not nullValue; definitely not equal.
2508 JSONTEST_ASSERT_EQUAL(Json::objectValue, moved.type());
2509 JSONTEST_ASSERT_EQUAL(Json::stringValue, moved["key"].type());
2513 int main(int argc, const char* argv[]) {
2514 JsonTest::Runner runner;
2515 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, checkNormalizeFloatingPointStr);
2516 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, memberCount);
2517 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, objects);
2518 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrays);
2519 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrayIssue252);
2520 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, null);
2521 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, strings);
2522 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, bools);
2523 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, integers);
2524 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nonIntegers);
2525 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareNull);
2526 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareInt);
2527 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareUInt);
2528 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareDouble);
2529 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareString);
2530 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareBoolean);
2531 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareArray);
2532 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareObject);
2533 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareType);
2534 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, offsetAccessors);
2535 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, typeChecksThrowExceptions);
2536 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, StaticString);
2537 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, CommentBefore);
2538 //JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nulls);
2539 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, zeroes);
2540 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, zeroesInKeys);
2541 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, specialFloats);
2542 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, precision);
2544 JSONTEST_REGISTER_FIXTURE(runner, WriterTest, dropNullPlaceholders);
2545 JSONTEST_REGISTER_FIXTURE(runner, StreamWriterTest, dropNullPlaceholders);
2546 JSONTEST_REGISTER_FIXTURE(runner, StreamWriterTest, writeZeroes);
2548 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithNoErrors);
2549 JSONTEST_REGISTER_FIXTURE(
2550 runner, ReaderTest, parseWithNoErrorsTestingOffsets);
2551 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithOneError);
2552 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseChineseWithOneError);
2553 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithDetailError);
2555 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithNoErrors);
2556 JSONTEST_REGISTER_FIXTURE(
2557 runner, CharReaderTest, parseWithNoErrorsTestingOffsets);
2558 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithOneError);
2559 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseChineseWithOneError);
2560 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithDetailError);
2561 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithStackLimit);
2563 JSONTEST_REGISTER_FIXTURE(runner, CharReaderStrictModeTest, dupKeys);
2565 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue164);
2566 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue107);
2567 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterObject);
2568 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterArray);
2569 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterBool);
2571 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowDropNullTest, issue178);
2573 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowSingleQuotesTest, issue182);
2575 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowZeroesTest, issue176);
2577 JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowSpecialFloatsTest, issue209);
2579 JSONTEST_REGISTER_FIXTURE(runner, BuilderTest, settings);
2581 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, distance);
2582 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, names);
2583 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, indexes);
2584 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, const);
2586 JSONTEST_REGISTER_FIXTURE(runner, RValueTest, moveConstruction);
2588 return runner.runCommandLine(argc, argv);