1 // Copyright 2007-2010 Baptiste Lepilleur
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>
12 // Make numeric limits more convenient to talk about.
13 // Assumes int type in 32 bits.
14 #define kint32max Json::Value::maxInt
15 #define kint32min Json::Value::minInt
16 #define kuint32max Json::Value::maxUInt
17 #define kint64max Json::Value::maxInt64
18 #define kint64min Json::Value::minInt64
19 #define kuint64max Json::Value::maxUInt64
21 //static const double kdint64max = double(kint64max);
22 //static const float kfint64max = float(kint64max);
23 static const float kfint32max = float(kint32max);
24 static const float kfuint32max = float(kuint32max);
26 // //////////////////////////////////////////////////////////////////
27 // //////////////////////////////////////////////////////////////////
28 // Json Library test cases
29 // //////////////////////////////////////////////////////////////////
30 // //////////////////////////////////////////////////////////////////
32 #if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
33 static inline double uint64ToDouble(Json::UInt64 value) {
34 return static_cast<double>(value);
36 #else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
37 static inline double uint64ToDouble(Json::UInt64 value) {
38 return static_cast<double>(Json::Int64(value / 2)) * 2.0 +
39 Json::Int64(value & 1);
41 #endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
43 struct ValueTest : JsonTest::TestCase {
45 Json::Value emptyArray_;
46 Json::Value emptyObject_;
48 Json::Value unsignedInteger_;
49 Json::Value smallUnsignedInteger_;
54 Json::Value emptyString_;
61 : emptyArray_(Json::arrayValue), emptyObject_(Json::objectValue),
62 integer_(123456789), unsignedInteger_(34567890u),
63 smallUnsignedInteger_(Json::Value::UInt(Json::Value::maxInt)),
64 real_(1234.56789), float_(0.00390625f), emptyString_(""), string1_("a"),
65 string_("sometext with space"), true_(true), false_(false) {
67 object1_["id"] = 1234;
71 /// Initialize all checks to \c false by default.
89 void checkConstMemberCount(const Json::Value& value,
90 unsigned int expectedCount);
92 void checkMemberCount(Json::Value& value, unsigned int expectedCount);
94 void checkIs(const Json::Value& value, const IsCheck& check);
96 void checkIsLess(const Json::Value& x, const Json::Value& y);
98 void checkIsEqual(const Json::Value& x, const Json::Value& y);
100 /// Normalize the representation of floating-point number by stripped leading
102 static std::string normalizeFloatingPointStr(const std::string& s);
105 std::string ValueTest::normalizeFloatingPointStr(const std::string& s) {
106 std::string::size_type index = s.find_last_of("eE");
107 if (index != std::string::npos) {
108 std::string::size_type hasSign =
109 (s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
110 std::string::size_type exponentStartIndex = index + 1 + hasSign;
111 std::string normalized = s.substr(0, exponentStartIndex);
112 std::string::size_type indexDigit =
113 s.find_first_not_of('0', exponentStartIndex);
114 std::string exponent = "0";
116 std::string::npos) // There is an exponent different from 0
118 exponent = s.substr(indexDigit);
120 return normalized + exponent;
125 JSONTEST_FIXTURE(ValueTest, checkNormalizeFloatingPointStr) {
126 JSONTEST_ASSERT_STRING_EQUAL("0.0", normalizeFloatingPointStr("0.0"));
127 JSONTEST_ASSERT_STRING_EQUAL("0e0", normalizeFloatingPointStr("0e0"));
128 JSONTEST_ASSERT_STRING_EQUAL("1234.0", normalizeFloatingPointStr("1234.0"));
129 JSONTEST_ASSERT_STRING_EQUAL("1234.0e0",
130 normalizeFloatingPointStr("1234.0e0"));
131 JSONTEST_ASSERT_STRING_EQUAL("1234.0e+0",
132 normalizeFloatingPointStr("1234.0e+0"));
133 JSONTEST_ASSERT_STRING_EQUAL("1234e-1", normalizeFloatingPointStr("1234e-1"));
134 JSONTEST_ASSERT_STRING_EQUAL("1234e10", normalizeFloatingPointStr("1234e10"));
135 JSONTEST_ASSERT_STRING_EQUAL("1234e10",
136 normalizeFloatingPointStr("1234e010"));
137 JSONTEST_ASSERT_STRING_EQUAL("1234e+10",
138 normalizeFloatingPointStr("1234e+010"));
139 JSONTEST_ASSERT_STRING_EQUAL("1234e-10",
140 normalizeFloatingPointStr("1234e-010"));
141 JSONTEST_ASSERT_STRING_EQUAL("1234e+100",
142 normalizeFloatingPointStr("1234e+100"));
143 JSONTEST_ASSERT_STRING_EQUAL("1234e-100",
144 normalizeFloatingPointStr("1234e-100"));
145 JSONTEST_ASSERT_STRING_EQUAL("1234e+1",
146 normalizeFloatingPointStr("1234e+001"));
149 JSONTEST_FIXTURE(ValueTest, memberCount) {
150 JSONTEST_ASSERT_PRED(checkMemberCount(emptyArray_, 0));
151 JSONTEST_ASSERT_PRED(checkMemberCount(emptyObject_, 0));
152 JSONTEST_ASSERT_PRED(checkMemberCount(array1_, 1));
153 JSONTEST_ASSERT_PRED(checkMemberCount(object1_, 1));
154 JSONTEST_ASSERT_PRED(checkMemberCount(null_, 0));
155 JSONTEST_ASSERT_PRED(checkMemberCount(integer_, 0));
156 JSONTEST_ASSERT_PRED(checkMemberCount(unsignedInteger_, 0));
157 JSONTEST_ASSERT_PRED(checkMemberCount(smallUnsignedInteger_, 0));
158 JSONTEST_ASSERT_PRED(checkMemberCount(real_, 0));
159 JSONTEST_ASSERT_PRED(checkMemberCount(emptyString_, 0));
160 JSONTEST_ASSERT_PRED(checkMemberCount(string_, 0));
161 JSONTEST_ASSERT_PRED(checkMemberCount(true_, 0));
164 JSONTEST_FIXTURE(ValueTest, objects) {
167 checks.isObject_ = true;
168 JSONTEST_ASSERT_PRED(checkIs(emptyObject_, checks));
169 JSONTEST_ASSERT_PRED(checkIs(object1_, checks));
171 JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());
174 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));
176 // Non-empty object not okay
177 JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));
180 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));
183 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
184 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
185 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
186 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
187 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
188 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));
190 // Access through const reference
191 const Json::Value& constObject = object1_;
193 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
194 JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);
196 // Access through non-const reference
197 JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
198 JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
200 object1_["some other id"] = "foo";
201 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
202 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
207 did = object1_.removeMember("some other id", &got);
208 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
209 JSONTEST_ASSERT_EQUAL(true, did);
210 got = Json::Value("bar");
211 did = object1_.removeMember("some other id", &got);
212 JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
213 JSONTEST_ASSERT_EQUAL(false, did);
216 JSONTEST_FIXTURE(ValueTest, arrays) {
217 const unsigned int index0 = 0;
221 checks.isArray_ = true;
222 JSONTEST_ASSERT_PRED(checkIs(emptyArray_, checks));
223 JSONTEST_ASSERT_PRED(checkIs(array1_, checks));
225 JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
228 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));
230 // Non-empty array not okay
231 JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));
234 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));
237 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
238 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
239 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
240 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
241 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
242 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));
244 // Access through const reference
245 const Json::Value& constArray = array1_;
246 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
247 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
249 // Access through non-const reference
250 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
251 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
253 array1_[2] = Json::Value(17);
254 JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
255 JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
257 JSONTEST_ASSERT_EQUAL(true, array1_.removeIndex(2, &got));
258 JSONTEST_ASSERT_EQUAL(Json::Value(17), got);
259 JSONTEST_ASSERT_EQUAL(false, array1_.removeIndex(2, &got)); // gone now
262 JSONTEST_FIXTURE(ValueTest, null) {
263 JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
266 checks.isNull_ = true;
267 JSONTEST_ASSERT_PRED(checkIs(null_, checks));
269 JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
270 JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
271 JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
272 JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
273 JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
274 JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
275 JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
276 JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));
278 JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
279 JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
280 JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
281 JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
282 JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
283 JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
284 JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
287 JSONTEST_FIXTURE(ValueTest, strings) {
288 JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
291 checks.isString_ = true;
292 JSONTEST_ASSERT_PRED(checkIs(emptyString_, checks));
293 JSONTEST_ASSERT_PRED(checkIs(string_, checks));
294 JSONTEST_ASSERT_PRED(checkIs(string1_, checks));
297 JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));
299 // Non-empty string not okay
300 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));
303 JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));
306 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
307 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
308 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
309 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
310 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));
312 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
313 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
316 JSONTEST_FIXTURE(ValueTest, bools) {
317 JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
320 checks.isBool_ = true;
321 JSONTEST_ASSERT_PRED(checkIs(false_, checks));
322 JSONTEST_ASSERT_PRED(checkIs(true_, checks));
325 JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));
328 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));
331 JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
332 JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
333 JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
334 JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
335 JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));
338 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
339 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));
341 JSONTEST_ASSERT_EQUAL(true, true_.asBool());
342 JSONTEST_ASSERT_EQUAL(1, true_.asInt());
343 JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
344 JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
345 JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
346 JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
347 JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());
349 JSONTEST_ASSERT_EQUAL(false, false_.asBool());
350 JSONTEST_ASSERT_EQUAL(0, false_.asInt());
351 JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
352 JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
353 JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
354 JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
355 JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
358 JSONTEST_FIXTURE(ValueTest, integers) {
362 // Conversions that don't depend on the value.
363 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
364 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
365 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
366 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
367 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));
369 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
370 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
371 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
372 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
373 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));
375 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
376 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
377 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
378 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
379 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));
382 val = Json::Value(Json::intValue);
384 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
387 checks.isInt_ = true;
388 checks.isInt64_ = true;
389 checks.isUInt_ = true;
390 checks.isUInt64_ = true;
391 checks.isIntegral_ = true;
392 checks.isDouble_ = true;
393 checks.isNumeric_ = true;
394 JSONTEST_ASSERT_PRED(checkIs(val, checks));
396 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
397 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
398 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
400 JSONTEST_ASSERT_EQUAL(0, val.asInt());
401 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
402 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
403 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
404 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
405 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
406 JSONTEST_ASSERT_EQUAL(false, val.asBool());
407 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
410 val = Json::Value(Json::uintValue);
412 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
415 checks.isInt_ = true;
416 checks.isInt64_ = true;
417 checks.isUInt_ = true;
418 checks.isUInt64_ = true;
419 checks.isIntegral_ = true;
420 checks.isDouble_ = true;
421 checks.isNumeric_ = true;
422 JSONTEST_ASSERT_PRED(checkIs(val, checks));
424 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
425 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
426 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
428 JSONTEST_ASSERT_EQUAL(0, val.asInt());
429 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
430 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
431 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
432 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
433 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
434 JSONTEST_ASSERT_EQUAL(false, val.asBool());
435 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
438 val = Json::Value(Json::realValue);
440 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
442 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
443 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
444 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
447 checks.isInt_ = true;
448 checks.isInt64_ = true;
449 checks.isUInt_ = true;
450 checks.isUInt64_ = true;
451 checks.isIntegral_ = true;
452 checks.isDouble_ = true;
453 checks.isNumeric_ = true;
454 JSONTEST_ASSERT_PRED(checkIs(val, checks));
456 JSONTEST_ASSERT_EQUAL(0, val.asInt());
457 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
458 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
459 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
460 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
461 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
462 JSONTEST_ASSERT_EQUAL(false, val.asBool());
463 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
465 // Zero (signed constructor arg)
466 val = Json::Value(0);
468 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
471 checks.isInt_ = true;
472 checks.isInt64_ = true;
473 checks.isUInt_ = true;
474 checks.isUInt64_ = true;
475 checks.isIntegral_ = true;
476 checks.isDouble_ = true;
477 checks.isNumeric_ = true;
478 JSONTEST_ASSERT_PRED(checkIs(val, checks));
480 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
481 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
482 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
484 JSONTEST_ASSERT_EQUAL(0, val.asInt());
485 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
486 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
487 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
488 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
489 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
490 JSONTEST_ASSERT_EQUAL(false, val.asBool());
491 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
493 // Zero (unsigned constructor arg)
494 val = Json::Value(0u);
496 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
499 checks.isInt_ = true;
500 checks.isInt64_ = true;
501 checks.isUInt_ = true;
502 checks.isUInt64_ = true;
503 checks.isIntegral_ = true;
504 checks.isDouble_ = true;
505 checks.isNumeric_ = true;
506 JSONTEST_ASSERT_PRED(checkIs(val, checks));
508 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
509 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
510 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
512 JSONTEST_ASSERT_EQUAL(0, val.asInt());
513 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
514 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
515 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
516 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
517 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
518 JSONTEST_ASSERT_EQUAL(false, val.asBool());
519 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
521 // Zero (floating-point constructor arg)
522 val = Json::Value(0.0);
524 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
527 checks.isInt_ = true;
528 checks.isInt64_ = true;
529 checks.isUInt_ = true;
530 checks.isUInt64_ = true;
531 checks.isIntegral_ = true;
532 checks.isDouble_ = true;
533 checks.isNumeric_ = true;
534 JSONTEST_ASSERT_PRED(checkIs(val, checks));
536 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
537 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
538 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
540 JSONTEST_ASSERT_EQUAL(0, val.asInt());
541 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
542 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
543 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
544 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
545 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
546 JSONTEST_ASSERT_EQUAL(false, val.asBool());
547 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
549 // 2^20 (signed constructor arg)
550 val = Json::Value(1 << 20);
552 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
554 checks.isInt_ = true;
555 checks.isInt64_ = true;
556 checks.isUInt_ = true;
557 checks.isUInt64_ = true;
558 checks.isIntegral_ = true;
559 checks.isDouble_ = true;
560 checks.isNumeric_ = true;
561 JSONTEST_ASSERT_PRED(checkIs(val, checks));
563 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
564 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
565 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
567 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
568 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
569 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
570 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
571 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
572 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
573 JSONTEST_ASSERT_EQUAL(true, val.asBool());
574 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
576 // 2^20 (unsigned constructor arg)
577 val = Json::Value(Json::UInt(1 << 20));
579 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
582 checks.isInt_ = true;
583 checks.isInt64_ = true;
584 checks.isUInt_ = true;
585 checks.isUInt64_ = true;
586 checks.isIntegral_ = true;
587 checks.isDouble_ = true;
588 checks.isNumeric_ = true;
589 JSONTEST_ASSERT_PRED(checkIs(val, checks));
591 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
592 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
593 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
595 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
596 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
597 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
598 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
599 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
600 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
601 JSONTEST_ASSERT_EQUAL(true, val.asBool());
602 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
604 // 2^20 (floating-point constructor arg)
605 val = Json::Value((1 << 20) / 1.0);
607 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
610 checks.isInt_ = true;
611 checks.isInt64_ = true;
612 checks.isUInt_ = true;
613 checks.isUInt64_ = true;
614 checks.isIntegral_ = true;
615 checks.isDouble_ = true;
616 checks.isNumeric_ = true;
617 JSONTEST_ASSERT_PRED(checkIs(val, checks));
619 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
620 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
621 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
623 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
624 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
625 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
626 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
627 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
628 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
629 JSONTEST_ASSERT_EQUAL(true, val.asBool());
630 JSONTEST_ASSERT_STRING_EQUAL("1048576",
631 normalizeFloatingPointStr(val.asString()));
634 val = Json::Value(-(1 << 20));
636 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
639 checks.isInt_ = true;
640 checks.isInt64_ = true;
641 checks.isIntegral_ = true;
642 checks.isDouble_ = true;
643 checks.isNumeric_ = true;
644 JSONTEST_ASSERT_PRED(checkIs(val, checks));
646 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
647 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
648 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
650 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
651 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
652 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
653 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
654 JSONTEST_ASSERT_EQUAL(true, val.asBool());
655 JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
658 val = Json::Value(kint32max);
660 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
663 checks.isInt_ = true;
664 checks.isInt64_ = true;
665 checks.isUInt_ = true;
666 checks.isUInt64_ = true;
667 checks.isIntegral_ = true;
668 checks.isDouble_ = true;
669 checks.isNumeric_ = true;
670 JSONTEST_ASSERT_PRED(checkIs(val, checks));
672 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
673 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
674 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
676 JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
677 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
678 JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
679 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
680 JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
681 JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
682 JSONTEST_ASSERT_EQUAL(true, val.asBool());
683 JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
686 val = Json::Value(kint32min);
688 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
691 checks.isInt_ = true;
692 checks.isInt64_ = true;
693 checks.isIntegral_ = true;
694 checks.isDouble_ = true;
695 checks.isNumeric_ = true;
696 JSONTEST_ASSERT_PRED(checkIs(val, checks));
698 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
699 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
700 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
702 JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
703 JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
704 JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
705 JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
706 JSONTEST_ASSERT_EQUAL(true, val.asBool());
707 JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
710 val = Json::Value(kuint32max);
712 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
715 checks.isInt64_ = true;
716 checks.isUInt_ = true;
717 checks.isUInt64_ = true;
718 checks.isIntegral_ = true;
719 checks.isDouble_ = true;
720 checks.isNumeric_ = true;
721 JSONTEST_ASSERT_PRED(checkIs(val, checks));
723 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
724 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
725 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
727 #ifndef JSON_NO_INT64
728 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
730 JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
731 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
732 JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
733 JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
734 JSONTEST_ASSERT_EQUAL(true, val.asBool());
735 JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
739 val = Json::Value(double(kint64max));
741 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
744 checks.isDouble_ = true;
745 checks.isNumeric_ = true;
746 JSONTEST_ASSERT_PRED(checkIs(val, checks));
748 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
749 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
750 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
752 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
753 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
754 JSONTEST_ASSERT_EQUAL(true, val.asBool());
755 JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
758 val = Json::Value(double(kint64min));
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(kint64min), val.asDouble());
772 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
773 JSONTEST_ASSERT_EQUAL(true, val.asBool());
774 JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
777 val = Json::Value(double(kuint64max));
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(kuint64max), val.asDouble());
791 JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
792 JSONTEST_ASSERT_EQUAL(true, val.asBool());
793 JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
794 #else // ifdef JSON_NO_INT64
795 // 2^40 (signed constructor arg)
796 val = Json::Value(Json::Int64(1) << 40);
798 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
801 checks.isInt64_ = true;
802 checks.isUInt64_ = true;
803 checks.isIntegral_ = true;
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((Json::Int64(1) << 40), val.asInt64());
813 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
814 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
815 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
816 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
817 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
818 JSONTEST_ASSERT_EQUAL(true, val.asBool());
819 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
821 // 2^40 (unsigned constructor arg)
822 val = Json::Value(Json::UInt64(1) << 40);
824 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
827 checks.isInt64_ = true;
828 checks.isUInt64_ = true;
829 checks.isIntegral_ = true;
830 checks.isDouble_ = true;
831 checks.isNumeric_ = true;
832 JSONTEST_ASSERT_PRED(checkIs(val, checks));
834 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
835 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
836 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
838 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
839 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
840 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
841 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
842 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
843 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
844 JSONTEST_ASSERT_EQUAL(true, val.asBool());
845 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
847 // 2^40 (floating-point constructor arg)
848 val = Json::Value((Json::Int64(1) << 40) / 1.0);
850 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
853 checks.isInt64_ = true;
854 checks.isUInt64_ = true;
855 checks.isIntegral_ = true;
856 checks.isDouble_ = true;
857 checks.isNumeric_ = true;
858 JSONTEST_ASSERT_PRED(checkIs(val, checks));
860 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
861 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
862 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
864 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
865 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
866 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
867 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
868 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
869 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
870 JSONTEST_ASSERT_EQUAL(true, val.asBool());
871 JSONTEST_ASSERT_STRING_EQUAL("1099511627776",
872 normalizeFloatingPointStr(val.asString()));
875 val = Json::Value(-(Json::Int64(1) << 40));
877 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
880 checks.isInt64_ = true;
881 checks.isIntegral_ = true;
882 checks.isDouble_ = true;
883 checks.isNumeric_ = true;
884 JSONTEST_ASSERT_PRED(checkIs(val, checks));
886 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
887 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
888 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
890 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
891 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
892 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
893 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
894 JSONTEST_ASSERT_EQUAL(true, val.asBool());
895 JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
898 val = Json::Value(Json::Int64(kint64max));
900 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
903 checks.isInt64_ = true;
904 checks.isUInt64_ = true;
905 checks.isIntegral_ = true;
906 checks.isDouble_ = true;
907 checks.isNumeric_ = true;
908 JSONTEST_ASSERT_PRED(checkIs(val, checks));
910 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
911 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
912 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
914 JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
915 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
916 JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
917 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
918 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
919 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
920 JSONTEST_ASSERT_EQUAL(true, val.asBool());
921 JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
923 // int64 max (floating point constructor). Note that kint64max is not exactly
924 // representable as a double, and will be rounded up to be higher.
925 val = Json::Value(double(kint64max));
927 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
930 checks.isUInt64_ = true;
931 checks.isIntegral_ = true;
932 checks.isDouble_ = true;
933 checks.isNumeric_ = true;
934 JSONTEST_ASSERT_PRED(checkIs(val, checks));
936 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
937 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
938 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
940 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
941 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
942 JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
943 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(Json::UInt64(1) << 63)),
945 JSONTEST_ASSERT_EQUAL(true, val.asBool());
946 JSONTEST_ASSERT_STRING_EQUAL("9.2233720368547758e+18",
947 normalizeFloatingPointStr(val.asString()));
950 val = Json::Value(Json::Int64(kint64min));
952 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
955 checks.isInt64_ = true;
956 checks.isIntegral_ = true;
957 checks.isDouble_ = true;
958 checks.isNumeric_ = true;
959 JSONTEST_ASSERT_PRED(checkIs(val, checks));
961 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
962 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
963 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
965 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
966 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
967 JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
968 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
969 JSONTEST_ASSERT_EQUAL(true, val.asBool());
970 JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
972 // int64 min (floating point constructor). Note that kint64min *is* exactly
973 // representable as a double.
974 val = Json::Value(double(kint64min));
976 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
979 checks.isInt64_ = true;
980 checks.isIntegral_ = true;
981 checks.isDouble_ = true;
982 checks.isNumeric_ = true;
983 JSONTEST_ASSERT_PRED(checkIs(val, checks));
985 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
986 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
987 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
989 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
990 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
991 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
992 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
993 JSONTEST_ASSERT_EQUAL(true, val.asBool());
994 JSONTEST_ASSERT_STRING_EQUAL("-9.2233720368547758e+18",
995 normalizeFloatingPointStr(val.asString()));
998 const Json::UInt64 ten_to_19 = static_cast<Json::UInt64>(1e19);
999 val = Json::Value(Json::UInt64(ten_to_19));
1001 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1004 checks.isUInt64_ = true;
1005 checks.isIntegral_ = true;
1006 checks.isDouble_ = true;
1007 checks.isNumeric_ = true;
1008 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1010 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1011 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1012 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1014 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
1015 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
1016 JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
1017 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
1018 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1019 JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
1021 // 10^19 (double constructor). Note that 10^19 is not exactly representable
1023 val = Json::Value(uint64ToDouble(ten_to_19));
1025 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1028 checks.isUInt64_ = true;
1029 checks.isIntegral_ = true;
1030 checks.isDouble_ = true;
1031 checks.isNumeric_ = true;
1032 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1034 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1035 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1036 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1038 JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
1039 JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
1040 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1041 JSONTEST_ASSERT_STRING_EQUAL("1e+19",
1042 normalizeFloatingPointStr(val.asString()));
1045 val = Json::Value(Json::UInt64(kuint64max));
1047 JSONTEST_ASSERT_EQUAL(Json::uintValue, 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(kuint64max, val.asUInt64());
1061 JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
1062 JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
1063 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
1064 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1065 JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
1067 // uint64 max (floating point constructor). Note that kuint64max is not
1068 // exactly representable as a double, and will be rounded up to be higher.
1069 val = Json::Value(uint64ToDouble(kuint64max));
1071 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
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(18446744073709551616.0, val.asDouble());
1083 JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
1084 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1085 JSONTEST_ASSERT_STRING_EQUAL("1.8446744073709552e+19",
1086 normalizeFloatingPointStr(val.asString()));
1090 JSONTEST_FIXTURE(ValueTest, nonIntegers) {
1094 // Small positive number
1095 val = Json::Value(1.5);
1097 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1100 checks.isDouble_ = true;
1101 checks.isNumeric_ = true;
1102 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1104 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1105 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1106 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1107 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1108 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1109 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1110 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1111 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1113 JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
1114 JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
1115 JSONTEST_ASSERT_EQUAL(1, val.asInt());
1116 JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
1117 JSONTEST_ASSERT_EQUAL(1, val.asUInt());
1118 JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
1119 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1120 JSONTEST_ASSERT_EQUAL("1.5", val.asString());
1122 // Small negative number
1123 val = Json::Value(-1.5);
1125 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1128 checks.isDouble_ = true;
1129 checks.isNumeric_ = true;
1130 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1132 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1133 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1134 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1135 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1136 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1137 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1138 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1139 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1141 JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
1142 JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
1143 JSONTEST_ASSERT_EQUAL(-1, val.asInt());
1144 JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
1145 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1146 JSONTEST_ASSERT_EQUAL("-1.5", val.asString());
1148 // A bit over int32 max
1149 val = Json::Value(kint32max + 0.5);
1151 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1154 checks.isDouble_ = true;
1155 checks.isNumeric_ = true;
1156 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1158 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1159 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1160 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1161 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1162 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1163 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1164 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1165 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1167 JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
1168 JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
1169 JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
1170 #ifdef JSON_HAS_INT64
1171 JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
1172 JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
1174 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1175 JSONTEST_ASSERT_EQUAL("2147483647.5",
1176 normalizeFloatingPointStr(val.asString()));
1178 // A bit under int32 min
1179 val = Json::Value(kint32min - 0.5);
1181 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1184 checks.isDouble_ = true;
1185 checks.isNumeric_ = true;
1186 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1188 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1189 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1190 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1191 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1192 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1193 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1194 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1195 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1197 JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
1198 JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
1199 #ifdef JSON_HAS_INT64
1200 JSONTEST_ASSERT_EQUAL(-Json::Int64(1) << 31, val.asLargestInt());
1202 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1203 JSONTEST_ASSERT_EQUAL("-2147483648.5",
1204 normalizeFloatingPointStr(val.asString()));
1206 // A bit over uint32 max
1207 val = Json::Value(kuint32max + 0.5);
1209 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1212 checks.isDouble_ = true;
1213 checks.isNumeric_ = true;
1214 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1216 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1217 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1218 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1219 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1220 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1221 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1222 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1223 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1225 JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
1226 JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
1227 #ifdef JSON_HAS_INT64
1228 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32) - 1, val.asLargestInt());
1229 JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32) - Json::UInt64(1),
1230 val.asLargestUInt());
1232 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1233 JSONTEST_ASSERT_EQUAL("4294967295.5",
1234 normalizeFloatingPointStr(val.asString()));
1236 val = Json::Value(1.2345678901234);
1237 JSONTEST_ASSERT_STRING_EQUAL("1.2345678901234001",
1238 normalizeFloatingPointStr(val.asString()));
1240 // A 16-digit floating point number.
1241 val = Json::Value(2199023255552000.0f);
1242 JSONTEST_ASSERT_EQUAL(float(2199023255552000), val.asFloat());
1243 JSONTEST_ASSERT_STRING_EQUAL("2199023255552000",
1244 normalizeFloatingPointStr(val.asString()));
1246 // A very large floating point number.
1247 val = Json::Value(3.402823466385289e38);
1248 JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
1249 JSONTEST_ASSERT_STRING_EQUAL("3.402823466385289e+38",
1250 normalizeFloatingPointStr(val.asString()));
1252 // An even larger floating point number.
1253 val = Json::Value(1.2345678e300);
1254 JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
1255 JSONTEST_ASSERT_STRING_EQUAL("1.2345678e+300",
1256 normalizeFloatingPointStr(val.asString()));
1259 void ValueTest::checkConstMemberCount(const Json::Value& value,
1260 unsigned int expectedCount) {
1261 unsigned int count = 0;
1262 Json::Value::const_iterator itEnd = value.end();
1263 for (Json::Value::const_iterator it = value.begin(); it != itEnd; ++it) {
1266 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::const_iterator";
1269 void ValueTest::checkMemberCount(Json::Value& value,
1270 unsigned int expectedCount) {
1271 JSONTEST_ASSERT_EQUAL(expectedCount, value.size());
1273 unsigned int count = 0;
1274 Json::Value::iterator itEnd = value.end();
1275 for (Json::Value::iterator it = value.begin(); it != itEnd; ++it) {
1278 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::iterator";
1280 JSONTEST_ASSERT_PRED(checkConstMemberCount(value, expectedCount));
1283 ValueTest::IsCheck::IsCheck()
1284 : isObject_(false), isArray_(false), isBool_(false), isString_(false),
1285 isNull_(false), isInt_(false), isInt64_(false), isUInt_(false),
1286 isUInt64_(false), isIntegral_(false), isDouble_(false),
1287 isNumeric_(false) {}
1289 void ValueTest::checkIs(const Json::Value& value, const IsCheck& check) {
1290 JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject());
1291 JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray());
1292 JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool());
1293 JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble());
1294 JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt());
1295 JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt());
1296 JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral());
1297 JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric());
1298 JSONTEST_ASSERT_EQUAL(check.isString_, value.isString());
1299 JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull());
1301 #ifdef JSON_HAS_INT64
1302 JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64());
1303 JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64());
1305 JSONTEST_ASSERT_EQUAL(false, value.isInt64());
1306 JSONTEST_ASSERT_EQUAL(false, value.isUInt64());
1310 JSONTEST_FIXTURE(ValueTest, compareNull) {
1311 JSONTEST_ASSERT_PRED(checkIsEqual(Json::Value(), Json::Value()));
1314 JSONTEST_FIXTURE(ValueTest, compareInt) {
1315 JSONTEST_ASSERT_PRED(checkIsLess(0, 10));
1316 JSONTEST_ASSERT_PRED(checkIsEqual(10, 10));
1317 JSONTEST_ASSERT_PRED(checkIsEqual(-10, -10));
1318 JSONTEST_ASSERT_PRED(checkIsLess(-10, 0));
1321 JSONTEST_FIXTURE(ValueTest, compareUInt) {
1322 JSONTEST_ASSERT_PRED(checkIsLess(0u, 10u));
1323 JSONTEST_ASSERT_PRED(checkIsLess(0u, Json::Value::maxUInt));
1324 JSONTEST_ASSERT_PRED(checkIsEqual(10u, 10u));
1327 JSONTEST_FIXTURE(ValueTest, compareDouble) {
1328 JSONTEST_ASSERT_PRED(checkIsLess(0.0, 10.0));
1329 JSONTEST_ASSERT_PRED(checkIsEqual(10.0, 10.0));
1330 JSONTEST_ASSERT_PRED(checkIsEqual(-10.0, -10.0));
1331 JSONTEST_ASSERT_PRED(checkIsLess(-10.0, 0.0));
1334 JSONTEST_FIXTURE(ValueTest, compareString) {
1335 JSONTEST_ASSERT_PRED(checkIsLess("", " "));
1336 JSONTEST_ASSERT_PRED(checkIsLess("", "a"));
1337 JSONTEST_ASSERT_PRED(checkIsLess("abcd", "zyui"));
1338 JSONTEST_ASSERT_PRED(checkIsLess("abc", "abcd"));
1339 JSONTEST_ASSERT_PRED(checkIsEqual("abcd", "abcd"));
1340 JSONTEST_ASSERT_PRED(checkIsEqual(" ", " "));
1341 JSONTEST_ASSERT_PRED(checkIsLess("ABCD", "abcd"));
1342 JSONTEST_ASSERT_PRED(checkIsEqual("ABCD", "ABCD"));
1345 JSONTEST_FIXTURE(ValueTest, compareBoolean) {
1346 JSONTEST_ASSERT_PRED(checkIsLess(false, true));
1347 JSONTEST_ASSERT_PRED(checkIsEqual(false, false));
1348 JSONTEST_ASSERT_PRED(checkIsEqual(true, true));
1351 JSONTEST_FIXTURE(ValueTest, compareArray) {
1352 // array compare size then content
1353 Json::Value emptyArray(Json::arrayValue);
1354 Json::Value l1aArray;
1356 Json::Value l1bArray;
1357 l1bArray.append(10);
1358 Json::Value l2aArray;
1361 Json::Value l2bArray;
1363 l2bArray.append(10);
1364 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l1aArray));
1365 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l2aArray));
1366 JSONTEST_ASSERT_PRED(checkIsLess(l1aArray, l2aArray));
1367 JSONTEST_ASSERT_PRED(checkIsLess(l2aArray, l2bArray));
1368 JSONTEST_ASSERT_PRED(checkIsEqual(emptyArray, Json::Value(emptyArray)));
1369 JSONTEST_ASSERT_PRED(checkIsEqual(l1aArray, Json::Value(l1aArray)));
1370 JSONTEST_ASSERT_PRED(checkIsEqual(l2bArray, Json::Value(l2bArray)));
1373 JSONTEST_FIXTURE(ValueTest, compareObject) {
1374 // object compare size then content
1375 Json::Value emptyObject(Json::objectValue);
1376 Json::Value l1aObject;
1377 l1aObject["key1"] = 0;
1378 Json::Value l1bObject;
1379 l1aObject["key1"] = 10;
1380 Json::Value l2aObject;
1381 l2aObject["key1"] = 0;
1382 l2aObject["key2"] = 0;
1383 JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l1aObject));
1384 JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l2aObject));
1385 JSONTEST_ASSERT_PRED(checkIsLess(l1aObject, l2aObject));
1386 JSONTEST_ASSERT_PRED(checkIsEqual(emptyObject, Json::Value(emptyObject)));
1387 JSONTEST_ASSERT_PRED(checkIsEqual(l1aObject, Json::Value(l1aObject)));
1388 JSONTEST_ASSERT_PRED(checkIsEqual(l2aObject, Json::Value(l2aObject)));
1391 JSONTEST_FIXTURE(ValueTest, compareType) {
1392 // object of different type are ordered according to their type
1393 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(), Json::Value(1)));
1394 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1), Json::Value(1u)));
1395 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1u), Json::Value(1.0)));
1396 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1.0), Json::Value("a")));
1397 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value("a"), Json::Value(true)));
1398 JSONTEST_ASSERT_PRED(
1399 checkIsLess(Json::Value(true), Json::Value(Json::arrayValue)));
1400 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(Json::arrayValue),
1401 Json::Value(Json::objectValue)));
1404 void ValueTest::checkIsLess(const Json::Value& x, const Json::Value& y) {
1405 JSONTEST_ASSERT(x < y);
1406 JSONTEST_ASSERT(y > x);
1407 JSONTEST_ASSERT(x <= y);
1408 JSONTEST_ASSERT(y >= x);
1409 JSONTEST_ASSERT(!(x == y));
1410 JSONTEST_ASSERT(!(y == x));
1411 JSONTEST_ASSERT(!(x >= y));
1412 JSONTEST_ASSERT(!(y <= x));
1413 JSONTEST_ASSERT(!(x > y));
1414 JSONTEST_ASSERT(!(y < x));
1415 JSONTEST_ASSERT(x.compare(y) < 0);
1416 JSONTEST_ASSERT(y.compare(x) >= 0);
1419 void ValueTest::checkIsEqual(const Json::Value& x, const Json::Value& y) {
1420 JSONTEST_ASSERT(x == y);
1421 JSONTEST_ASSERT(y == x);
1422 JSONTEST_ASSERT(x <= y);
1423 JSONTEST_ASSERT(y <= x);
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.compare(y) == 0);
1431 JSONTEST_ASSERT(y.compare(x) == 0);
1434 JSONTEST_FIXTURE(ValueTest, typeChecksThrowExceptions) {
1435 #if JSON_USE_EXCEPTION
1437 Json::Value intVal(1);
1438 Json::Value strVal("Test");
1439 Json::Value objVal(Json::objectValue);
1440 Json::Value arrVal(Json::arrayValue);
1442 JSONTEST_ASSERT_THROWS(intVal["test"]);
1443 JSONTEST_ASSERT_THROWS(strVal["test"]);
1444 JSONTEST_ASSERT_THROWS(arrVal["test"]);
1446 JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
1447 JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
1448 JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
1450 JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
1451 JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
1452 JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
1454 JSONTEST_ASSERT_THROWS(intVal[0]);
1455 JSONTEST_ASSERT_THROWS(objVal[0]);
1456 JSONTEST_ASSERT_THROWS(strVal[0]);
1458 JSONTEST_ASSERT_THROWS(intVal.clear());
1460 JSONTEST_ASSERT_THROWS(intVal.resize(1));
1461 JSONTEST_ASSERT_THROWS(strVal.resize(1));
1462 JSONTEST_ASSERT_THROWS(objVal.resize(1));
1464 JSONTEST_ASSERT_THROWS(intVal.asCString());
1466 JSONTEST_ASSERT_THROWS(objVal.asString());
1467 JSONTEST_ASSERT_THROWS(arrVal.asString());
1469 JSONTEST_ASSERT_THROWS(strVal.asInt());
1470 JSONTEST_ASSERT_THROWS(objVal.asInt());
1471 JSONTEST_ASSERT_THROWS(arrVal.asInt());
1473 JSONTEST_ASSERT_THROWS(strVal.asUInt());
1474 JSONTEST_ASSERT_THROWS(objVal.asUInt());
1475 JSONTEST_ASSERT_THROWS(arrVal.asUInt());
1477 JSONTEST_ASSERT_THROWS(strVal.asInt64());
1478 JSONTEST_ASSERT_THROWS(objVal.asInt64());
1479 JSONTEST_ASSERT_THROWS(arrVal.asInt64());
1481 JSONTEST_ASSERT_THROWS(strVal.asUInt64());
1482 JSONTEST_ASSERT_THROWS(objVal.asUInt64());
1483 JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
1485 JSONTEST_ASSERT_THROWS(strVal.asDouble());
1486 JSONTEST_ASSERT_THROWS(objVal.asDouble());
1487 JSONTEST_ASSERT_THROWS(arrVal.asDouble());
1489 JSONTEST_ASSERT_THROWS(strVal.asFloat());
1490 JSONTEST_ASSERT_THROWS(objVal.asFloat());
1491 JSONTEST_ASSERT_THROWS(arrVal.asFloat());
1493 JSONTEST_ASSERT_THROWS(strVal.asBool());
1494 JSONTEST_ASSERT_THROWS(objVal.asBool());
1495 JSONTEST_ASSERT_THROWS(arrVal.asBool());
1500 JSONTEST_FIXTURE(ValueTest, offsetAccessors) {
1502 JSONTEST_ASSERT(x.getOffsetStart() == 0);
1503 JSONTEST_ASSERT(x.getOffsetLimit() == 0);
1504 x.setOffsetStart(10);
1505 x.setOffsetLimit(20);
1506 JSONTEST_ASSERT(x.getOffsetStart() == 10);
1507 JSONTEST_ASSERT(x.getOffsetLimit() == 20);
1509 JSONTEST_ASSERT(y.getOffsetStart() == 10);
1510 JSONTEST_ASSERT(y.getOffsetLimit() == 20);
1513 JSONTEST_ASSERT(z.getOffsetStart() == 10);
1514 JSONTEST_ASSERT(z.getOffsetLimit() == 20);
1515 JSONTEST_ASSERT(y.getOffsetStart() == 0);
1516 JSONTEST_ASSERT(y.getOffsetLimit() == 0);
1519 struct WriterTest : JsonTest::TestCase {};
1521 JSONTEST_FIXTURE(WriterTest, dropNullPlaceholders) {
1522 Json::FastWriter writer;
1523 Json::Value nullValue;
1524 JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
1526 writer.dropNullPlaceholders();
1527 JSONTEST_ASSERT(writer.write(nullValue) == "\n");
1530 struct StreamWriterTest : JsonTest::TestCase {};
1532 JSONTEST_FIXTURE(StreamWriterTest, dropNullPlaceholders) {
1533 Json::StreamWriterBuilder b;
1534 Json::Value nullValue;
1535 b.settings_["dropNullPlaceholders"] = false;
1536 JSONTEST_ASSERT(Json::writeString(b, nullValue) == "null");
1537 b.settings_["dropNullPlaceholders"] = true;
1538 JSONTEST_ASSERT(Json::writeString(b, nullValue) == "");
1541 struct ReaderTest : JsonTest::TestCase {};
1543 JSONTEST_FIXTURE(ReaderTest, parseWithNoErrors) {
1544 Json::Reader reader;
1546 bool ok = reader.parse("{ \"property\" : \"value\" }", root);
1547 JSONTEST_ASSERT(ok);
1548 JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
1549 JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
1552 JSONTEST_FIXTURE(ReaderTest, parseWithNoErrorsTestingOffsets) {
1553 Json::Reader reader;
1555 bool ok = reader.parse("{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
1556 "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
1557 "null, \"false\" : false }",
1559 JSONTEST_ASSERT(ok);
1560 JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
1561 JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
1562 JSONTEST_ASSERT(root["property"].getOffsetStart() == 15);
1563 JSONTEST_ASSERT(root["property"].getOffsetLimit() == 34);
1564 JSONTEST_ASSERT(root["property"][0].getOffsetStart() == 16);
1565 JSONTEST_ASSERT(root["property"][0].getOffsetLimit() == 23);
1566 JSONTEST_ASSERT(root["property"][1].getOffsetStart() == 25);
1567 JSONTEST_ASSERT(root["property"][1].getOffsetLimit() == 33);
1568 JSONTEST_ASSERT(root["obj"].getOffsetStart() == 44);
1569 JSONTEST_ASSERT(root["obj"].getOffsetLimit() == 76);
1570 JSONTEST_ASSERT(root["obj"]["nested"].getOffsetStart() == 57);
1571 JSONTEST_ASSERT(root["obj"]["nested"].getOffsetLimit() == 60);
1572 JSONTEST_ASSERT(root["obj"]["bool"].getOffsetStart() == 71);
1573 JSONTEST_ASSERT(root["obj"]["bool"].getOffsetLimit() == 75);
1574 JSONTEST_ASSERT(root["null"].getOffsetStart() == 87);
1575 JSONTEST_ASSERT(root["null"].getOffsetLimit() == 91);
1576 JSONTEST_ASSERT(root["false"].getOffsetStart() == 103);
1577 JSONTEST_ASSERT(root["false"].getOffsetLimit() == 108);
1578 JSONTEST_ASSERT(root.getOffsetStart() == 0);
1579 JSONTEST_ASSERT(root.getOffsetLimit() == 110);
1582 JSONTEST_FIXTURE(ReaderTest, parseWithOneError) {
1583 Json::Reader reader;
1585 bool ok = reader.parse("{ \"property\" :: \"value\" }", root);
1586 JSONTEST_ASSERT(!ok);
1587 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1588 "* Line 1, Column 15\n Syntax error: value, object or array "
1590 std::vector<Json::Reader::StructuredError> errors =
1591 reader.getStructuredErrors();
1592 JSONTEST_ASSERT(errors.size() == 1);
1593 JSONTEST_ASSERT(errors.at(0).offset_start == 14);
1594 JSONTEST_ASSERT(errors.at(0).offset_limit == 15);
1595 JSONTEST_ASSERT(errors.at(0).message ==
1596 "Syntax error: value, object or array expected.");
1599 JSONTEST_FIXTURE(ReaderTest, parseChineseWithOneError) {
1600 Json::Reader reader;
1602 bool ok = reader.parse("{ \"pr佐藤erty\" :: \"value\" }", root);
1603 JSONTEST_ASSERT(!ok);
1604 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1605 "* Line 1, Column 19\n Syntax error: value, object or array "
1607 std::vector<Json::Reader::StructuredError> errors =
1608 reader.getStructuredErrors();
1609 JSONTEST_ASSERT(errors.size() == 1);
1610 JSONTEST_ASSERT(errors.at(0).offset_start == 18);
1611 JSONTEST_ASSERT(errors.at(0).offset_limit == 19);
1612 JSONTEST_ASSERT(errors.at(0).message ==
1613 "Syntax error: value, object or array expected.");
1616 JSONTEST_FIXTURE(ReaderTest, parseWithDetailError) {
1617 Json::Reader reader;
1619 bool ok = reader.parse("{ \"property\" : \"v\\alue\" }", root);
1620 JSONTEST_ASSERT(!ok);
1621 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1622 "* Line 1, Column 16\n Bad escape sequence in string\nSee "
1623 "Line 1, Column 20 for detail.\n");
1624 std::vector<Json::Reader::StructuredError> errors =
1625 reader.getStructuredErrors();
1626 JSONTEST_ASSERT(errors.size() == 1);
1627 JSONTEST_ASSERT(errors.at(0).offset_start == 15);
1628 JSONTEST_ASSERT(errors.at(0).offset_limit == 23);
1629 JSONTEST_ASSERT(errors.at(0).message == "Bad escape sequence in string");
1632 struct CharReaderTest : JsonTest::TestCase {};
1634 JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrors) {
1635 Json::CharReaderBuilder b;
1636 Json::CharReader* reader(b.newCharReader());
1639 char const doc[] = "{ \"property\" : \"value\" }";
1640 bool ok = reader->parse(
1641 doc, doc + std::strlen(doc),
1643 JSONTEST_ASSERT(ok);
1644 JSONTEST_ASSERT(errs.size() == 0);
1648 JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrorsTestingOffsets) {
1649 Json::CharReaderBuilder b;
1650 Json::CharReader* reader(b.newCharReader());
1654 "{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
1655 "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
1656 "null, \"false\" : false }";
1657 bool ok = reader->parse(
1658 doc, doc + std::strlen(doc),
1660 JSONTEST_ASSERT(ok);
1661 JSONTEST_ASSERT(errs.size() == 0);
1665 JSONTEST_FIXTURE(CharReaderTest, parseWithOneError) {
1666 Json::CharReaderBuilder b;
1667 Json::CharReader* reader(b.newCharReader());
1671 "{ \"property\" :: \"value\" }";
1672 bool ok = reader->parse(
1673 doc, doc + std::strlen(doc),
1675 JSONTEST_ASSERT(!ok);
1676 JSONTEST_ASSERT(errs ==
1677 "* Line 1, Column 15\n Syntax error: value, object or array "
1682 JSONTEST_FIXTURE(CharReaderTest, parseChineseWithOneError) {
1683 Json::CharReaderBuilder b;
1684 Json::CharReader* reader(b.newCharReader());
1688 "{ \"pr佐藤erty\" :: \"value\" }";
1689 bool ok = reader->parse(
1690 doc, doc + std::strlen(doc),
1692 JSONTEST_ASSERT(!ok);
1693 JSONTEST_ASSERT(errs ==
1694 "* Line 1, Column 19\n Syntax error: value, object or array "
1699 JSONTEST_FIXTURE(CharReaderTest, parseWithDetailError) {
1700 Json::CharReaderBuilder b;
1701 Json::CharReader* reader(b.newCharReader());
1705 "{ \"property\" : \"v\\alue\" }";
1706 bool ok = reader->parse(
1707 doc, doc + std::strlen(doc),
1709 JSONTEST_ASSERT(!ok);
1710 JSONTEST_ASSERT(errs ==
1711 "* Line 1, Column 16\n Bad escape sequence in string\nSee "
1712 "Line 1, Column 20 for detail.\n");
1716 JSONTEST_FIXTURE(CharReaderTest, parseWithStackLimit) {
1717 Json::CharReaderBuilder b;
1720 "{ \"property\" : \"value\" }";
1722 b.settings_["stackLimit"] = 2;
1723 Json::CharReader* reader(b.newCharReader());
1725 bool ok = reader->parse(
1726 doc, doc + std::strlen(doc),
1728 JSONTEST_ASSERT(ok);
1729 JSONTEST_ASSERT(errs == "");
1730 JSONTEST_ASSERT_EQUAL("value", root["property"]);
1734 b.settings_["stackLimit"] = 1;
1735 Json::CharReader* reader(b.newCharReader());
1737 JSONTEST_ASSERT_THROWS(reader->parse(
1738 doc, doc + std::strlen(doc),
1744 struct CharReaderFailIfExtraTest : JsonTest::TestCase {};
1746 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue164) {
1747 // This is interpretted as a string value followed by a colon.
1748 Json::CharReaderBuilder b;
1751 " \"property\" : \"value\" }";
1753 b.settings_["failIfExtra"] = false;
1754 Json::CharReader* reader(b.newCharReader());
1756 bool ok = reader->parse(
1757 doc, doc + std::strlen(doc),
1759 JSONTEST_ASSERT(ok);
1760 JSONTEST_ASSERT(errs == "");
1761 JSONTEST_ASSERT_EQUAL("property", root);
1765 b.settings_["failIfExtra"] = true;
1766 Json::CharReader* reader(b.newCharReader());
1768 bool ok = reader->parse(
1769 doc, doc + std::strlen(doc),
1771 JSONTEST_ASSERT(!ok);
1772 JSONTEST_ASSERT_STRING_EQUAL(errs,
1773 "* Line 1, Column 13\n"
1774 " Extra non-whitespace after JSON value.\n");
1775 JSONTEST_ASSERT_EQUAL("property", root);
1779 b.settings_["failIfExtra"] = false;
1780 b.strictMode(&b.settings_);
1781 Json::CharReader* reader(b.newCharReader());
1783 bool ok = reader->parse(
1784 doc, doc + std::strlen(doc),
1786 JSONTEST_ASSERT(!ok);
1787 JSONTEST_ASSERT_STRING_EQUAL(errs,
1788 "* Line 1, Column 13\n"
1789 " Extra non-whitespace after JSON value.\n");
1790 JSONTEST_ASSERT_EQUAL("property", root);
1794 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue107) {
1795 // This is interpretted as an int value followed by a colon.
1796 Json::CharReaderBuilder b;
1800 b.settings_["failIfExtra"] = true;
1801 Json::CharReader* reader(b.newCharReader());
1803 bool ok = reader->parse(
1804 doc, doc + std::strlen(doc),
1806 JSONTEST_ASSERT(!ok);
1807 JSONTEST_ASSERT_STRING_EQUAL(
1808 "* Line 1, Column 2\n"
1809 " Extra non-whitespace after JSON value.\n",
1811 JSONTEST_ASSERT_EQUAL(1, root.asInt());
1814 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterObject) {
1815 Json::CharReaderBuilder b;
1819 "{ \"property\" : \"value\" } //trailing\n//comment\n";
1820 b.settings_["failIfExtra"] = true;
1821 Json::CharReader* reader(b.newCharReader());
1823 bool ok = reader->parse(
1824 doc, doc + std::strlen(doc),
1826 JSONTEST_ASSERT(ok);
1827 JSONTEST_ASSERT_STRING_EQUAL("", errs);
1828 JSONTEST_ASSERT_EQUAL("value", root["property"]);
1832 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterArray) {
1833 Json::CharReaderBuilder b;
1836 "[ \"property\" , \"value\" ] //trailing\n//comment\n";
1837 b.settings_["failIfExtra"] = true;
1838 Json::CharReader* reader(b.newCharReader());
1840 bool ok = reader->parse(
1841 doc, doc + std::strlen(doc),
1843 JSONTEST_ASSERT(ok);
1844 JSONTEST_ASSERT_STRING_EQUAL("", errs);
1845 JSONTEST_ASSERT_EQUAL("value", root[1u]);
1848 JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterBool) {
1849 Json::CharReaderBuilder b;
1852 " true /*trailing\ncomment*/";
1853 b.settings_["failIfExtra"] = true;
1854 Json::CharReader* reader(b.newCharReader());
1856 bool ok = reader->parse(
1857 doc, doc + std::strlen(doc),
1859 JSONTEST_ASSERT(ok);
1860 JSONTEST_ASSERT_STRING_EQUAL("", errs);
1861 JSONTEST_ASSERT_EQUAL(true, root.asBool());
1865 struct IteratorTest : JsonTest::TestCase {};
1867 JSONTEST_FIXTURE(IteratorTest, distance) {
1873 for (Json::ValueIterator it = json.begin(); it != json.end(); ++it) {
1874 dist = it - json.begin();
1875 str = it->asString().c_str();
1877 JSONTEST_ASSERT_EQUAL(1, dist);
1878 JSONTEST_ASSERT_STRING_EQUAL("b", str);
1881 int main(int argc, const char* argv[]) {
1882 JsonTest::Runner runner;
1883 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, checkNormalizeFloatingPointStr);
1884 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, memberCount);
1885 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, objects);
1886 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrays);
1887 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, null);
1888 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, strings);
1889 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, bools);
1890 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, integers);
1891 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nonIntegers);
1892 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareNull);
1893 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareInt);
1894 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareUInt);
1895 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareDouble);
1896 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareString);
1897 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareBoolean);
1898 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareArray);
1899 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareObject);
1900 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareType);
1901 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, offsetAccessors);
1902 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, typeChecksThrowExceptions);
1904 JSONTEST_REGISTER_FIXTURE(runner, WriterTest, dropNullPlaceholders);
1905 JSONTEST_REGISTER_FIXTURE(runner, StreamWriterTest, dropNullPlaceholders);
1907 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithNoErrors);
1908 JSONTEST_REGISTER_FIXTURE(
1909 runner, ReaderTest, parseWithNoErrorsTestingOffsets);
1910 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithOneError);
1911 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseChineseWithOneError);
1912 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithDetailError);
1914 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithNoErrors);
1915 JSONTEST_REGISTER_FIXTURE(
1916 runner, CharReaderTest, parseWithNoErrorsTestingOffsets);
1917 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithOneError);
1918 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseChineseWithOneError);
1919 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithDetailError);
1920 JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithStackLimit);
1922 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue164);
1923 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue107);
1924 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterObject);
1925 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterArray);
1926 JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterBool);
1928 JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, distance);
1930 return runner.runCommandLine(argc, argv);