Home | History | Annotate | Download | only in test_lib_json
      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
      5 
      6 #include "jsontest.h"
      7 #include <json/config.h>
      8 #include <json/json.h>
      9 #include <stdexcept>
     10 
     11 // Make numeric limits more convenient to talk about.
     12 // Assumes int type in 32 bits.
     13 #define kint32max Json::Value::maxInt
     14 #define kint32min Json::Value::minInt
     15 #define kuint32max Json::Value::maxUInt
     16 #define kint64max Json::Value::maxInt64
     17 #define kint64min Json::Value::minInt64
     18 #define kuint64max Json::Value::maxUInt64
     19 
     20 static const double kdint64max = double(kint64max);
     21 static const float kfint64max = float(kint64max);
     22 static const float kfint32max = float(kint32max);
     23 static const float kfuint32max = float(kuint32max);
     24 
     25 // //////////////////////////////////////////////////////////////////
     26 // //////////////////////////////////////////////////////////////////
     27 // Json Library test cases
     28 // //////////////////////////////////////////////////////////////////
     29 // //////////////////////////////////////////////////////////////////
     30 
     31 #if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
     32 static inline double uint64ToDouble(Json::UInt64 value) {
     33   return static_cast<double>(value);
     34 }
     35 #else  // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
     36 static inline double uint64ToDouble(Json::UInt64 value) {
     37   return static_cast<double>(Json::Int64(value / 2)) * 2.0 +
     38          Json::Int64(value & 1);
     39 }
     40 #endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
     41 
     42 struct ValueTest : JsonTest::TestCase {
     43   Json::Value null_;
     44   Json::Value emptyArray_;
     45   Json::Value emptyObject_;
     46   Json::Value integer_;
     47   Json::Value unsignedInteger_;
     48   Json::Value smallUnsignedInteger_;
     49   Json::Value real_;
     50   Json::Value float_;
     51   Json::Value array1_;
     52   Json::Value object1_;
     53   Json::Value emptyString_;
     54   Json::Value string1_;
     55   Json::Value string_;
     56   Json::Value true_;
     57   Json::Value false_;
     58 
     59   ValueTest()
     60       : emptyArray_(Json::arrayValue), emptyObject_(Json::objectValue),
     61         integer_(123456789), unsignedInteger_(34567890u),
     62         smallUnsignedInteger_(Json::Value::UInt(Json::Value::maxInt)),
     63         real_(1234.56789), float_(0.00390625f), emptyString_(""), string1_("a"),
     64         string_("sometext with space"), true_(true), false_(false) {
     65     array1_.append(1234);
     66     object1_["id"] = 1234;
     67   }
     68 
     69   struct IsCheck {
     70     /// Initialize all checks to \c false by default.
     71     IsCheck();
     72 
     73     bool isObject_;
     74     bool isArray_;
     75     bool isBool_;
     76     bool isString_;
     77     bool isNull_;
     78 
     79     bool isInt_;
     80     bool isInt64_;
     81     bool isUInt_;
     82     bool isUInt64_;
     83     bool isIntegral_;
     84     bool isDouble_;
     85     bool isNumeric_;
     86   };
     87 
     88   void checkConstMemberCount(const Json::Value& value,
     89                              unsigned int expectedCount);
     90 
     91   void checkMemberCount(Json::Value& value, unsigned int expectedCount);
     92 
     93   void checkIs(const Json::Value& value, const IsCheck& check);
     94 
     95   void checkIsLess(const Json::Value& x, const Json::Value& y);
     96 
     97   void checkIsEqual(const Json::Value& x, const Json::Value& y);
     98 
     99   /// Normalize the representation of floating-point number by stripped leading
    100   /// 0 in exponent.
    101   static std::string normalizeFloatingPointStr(const std::string& s);
    102 };
    103 
    104 std::string ValueTest::normalizeFloatingPointStr(const std::string& s) {
    105   std::string::size_type index = s.find_last_of("eE");
    106   if (index != std::string::npos) {
    107     std::string::size_type hasSign =
    108         (s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
    109     std::string::size_type exponentStartIndex = index + 1 + hasSign;
    110     std::string normalized = s.substr(0, exponentStartIndex);
    111     std::string::size_type indexDigit =
    112         s.find_first_not_of('0', exponentStartIndex);
    113     std::string exponent = "0";
    114     if (indexDigit !=
    115         std::string::npos) // There is an exponent different from 0
    116     {
    117       exponent = s.substr(indexDigit);
    118     }
    119     return normalized + exponent;
    120   }
    121   return s;
    122 }
    123 
    124 JSONTEST_FIXTURE(ValueTest, checkNormalizeFloatingPointStr) {
    125   JSONTEST_ASSERT_STRING_EQUAL("0.0", normalizeFloatingPointStr("0.0"));
    126   JSONTEST_ASSERT_STRING_EQUAL("0e0", normalizeFloatingPointStr("0e0"));
    127   JSONTEST_ASSERT_STRING_EQUAL("1234.0", normalizeFloatingPointStr("1234.0"));
    128   JSONTEST_ASSERT_STRING_EQUAL("1234.0e0",
    129                                normalizeFloatingPointStr("1234.0e0"));
    130   JSONTEST_ASSERT_STRING_EQUAL("1234.0e+0",
    131                                normalizeFloatingPointStr("1234.0e+0"));
    132   JSONTEST_ASSERT_STRING_EQUAL("1234e-1", normalizeFloatingPointStr("1234e-1"));
    133   JSONTEST_ASSERT_STRING_EQUAL("1234e10", normalizeFloatingPointStr("1234e10"));
    134   JSONTEST_ASSERT_STRING_EQUAL("1234e10",
    135                                normalizeFloatingPointStr("1234e010"));
    136   JSONTEST_ASSERT_STRING_EQUAL("1234e+10",
    137                                normalizeFloatingPointStr("1234e+010"));
    138   JSONTEST_ASSERT_STRING_EQUAL("1234e-10",
    139                                normalizeFloatingPointStr("1234e-010"));
    140   JSONTEST_ASSERT_STRING_EQUAL("1234e+100",
    141                                normalizeFloatingPointStr("1234e+100"));
    142   JSONTEST_ASSERT_STRING_EQUAL("1234e-100",
    143                                normalizeFloatingPointStr("1234e-100"));
    144   JSONTEST_ASSERT_STRING_EQUAL("1234e+1",
    145                                normalizeFloatingPointStr("1234e+001"));
    146 }
    147 
    148 JSONTEST_FIXTURE(ValueTest, memberCount) {
    149   JSONTEST_ASSERT_PRED(checkMemberCount(emptyArray_, 0));
    150   JSONTEST_ASSERT_PRED(checkMemberCount(emptyObject_, 0));
    151   JSONTEST_ASSERT_PRED(checkMemberCount(array1_, 1));
    152   JSONTEST_ASSERT_PRED(checkMemberCount(object1_, 1));
    153   JSONTEST_ASSERT_PRED(checkMemberCount(null_, 0));
    154   JSONTEST_ASSERT_PRED(checkMemberCount(integer_, 0));
    155   JSONTEST_ASSERT_PRED(checkMemberCount(unsignedInteger_, 0));
    156   JSONTEST_ASSERT_PRED(checkMemberCount(smallUnsignedInteger_, 0));
    157   JSONTEST_ASSERT_PRED(checkMemberCount(real_, 0));
    158   JSONTEST_ASSERT_PRED(checkMemberCount(emptyString_, 0));
    159   JSONTEST_ASSERT_PRED(checkMemberCount(string_, 0));
    160   JSONTEST_ASSERT_PRED(checkMemberCount(true_, 0));
    161 }
    162 
    163 JSONTEST_FIXTURE(ValueTest, objects) {
    164   // Types
    165   IsCheck checks;
    166   checks.isObject_ = true;
    167   JSONTEST_ASSERT_PRED(checkIs(emptyObject_, checks));
    168   JSONTEST_ASSERT_PRED(checkIs(object1_, checks));
    169 
    170   JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());
    171 
    172   // Empty object okay
    173   JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));
    174 
    175   // Non-empty object not okay
    176   JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));
    177 
    178   // Always okay
    179   JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));
    180 
    181   // Never okay
    182   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
    183   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
    184   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
    185   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
    186   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
    187   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));
    188 
    189   // Access through const reference
    190   const Json::Value& constObject = object1_;
    191 
    192   JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
    193   JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);
    194 
    195   // Access through non-const reference
    196   JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
    197   JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
    198 
    199   object1_["some other id"] = "foo";
    200   JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
    201 }
    202 
    203 JSONTEST_FIXTURE(ValueTest, arrays) {
    204   const unsigned int index0 = 0;
    205 
    206   // Types
    207   IsCheck checks;
    208   checks.isArray_ = true;
    209   JSONTEST_ASSERT_PRED(checkIs(emptyArray_, checks));
    210   JSONTEST_ASSERT_PRED(checkIs(array1_, checks));
    211 
    212   JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
    213 
    214   // Empty array okay
    215   JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));
    216 
    217   // Non-empty array not okay
    218   JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));
    219 
    220   // Always okay
    221   JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));
    222 
    223   // Never okay
    224   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
    225   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
    226   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
    227   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
    228   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
    229   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));
    230 
    231   // Access through const reference
    232   const Json::Value& constArray = array1_;
    233   JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
    234   JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
    235 
    236   // Access through non-const reference
    237   JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
    238   JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
    239 
    240   array1_[2] = Json::Value(17);
    241   JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
    242   JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
    243 }
    244 
    245 JSONTEST_FIXTURE(ValueTest, null) {
    246   JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
    247 
    248   IsCheck checks;
    249   checks.isNull_ = true;
    250   JSONTEST_ASSERT_PRED(checkIs(null_, checks));
    251 
    252   JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
    253   JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
    254   JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
    255   JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
    256   JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
    257   JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
    258   JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
    259   JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));
    260 
    261   JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
    262   JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
    263   JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
    264   JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
    265   JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
    266   JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
    267   JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
    268 }
    269 
    270 JSONTEST_FIXTURE(ValueTest, strings) {
    271   JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
    272 
    273   IsCheck checks;
    274   checks.isString_ = true;
    275   JSONTEST_ASSERT_PRED(checkIs(emptyString_, checks));
    276   JSONTEST_ASSERT_PRED(checkIs(string_, checks));
    277   JSONTEST_ASSERT_PRED(checkIs(string1_, checks));
    278 
    279   // Empty string okay
    280   JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));
    281 
    282   // Non-empty string not okay
    283   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));
    284 
    285   // Always okay
    286   JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));
    287 
    288   // Never okay
    289   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
    290   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
    291   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
    292   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
    293   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));
    294 
    295   JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
    296   JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
    297 }
    298 
    299 JSONTEST_FIXTURE(ValueTest, bools) {
    300   JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
    301 
    302   IsCheck checks;
    303   checks.isBool_ = true;
    304   JSONTEST_ASSERT_PRED(checkIs(false_, checks));
    305   JSONTEST_ASSERT_PRED(checkIs(true_, checks));
    306 
    307   // False okay
    308   JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));
    309 
    310   // True not okay
    311   JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));
    312 
    313   // Always okay
    314   JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
    315   JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
    316   JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
    317   JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
    318   JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));
    319 
    320   // Never okay
    321   JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
    322   JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));
    323 
    324   JSONTEST_ASSERT_EQUAL(true, true_.asBool());
    325   JSONTEST_ASSERT_EQUAL(1, true_.asInt());
    326   JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
    327   JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
    328   JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
    329   JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
    330   JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());
    331 
    332   JSONTEST_ASSERT_EQUAL(false, false_.asBool());
    333   JSONTEST_ASSERT_EQUAL(0, false_.asInt());
    334   JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
    335   JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
    336   JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
    337   JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
    338   JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
    339 }
    340 
    341 JSONTEST_FIXTURE(ValueTest, integers) {
    342   IsCheck checks;
    343   Json::Value val;
    344 
    345   // Conversions that don't depend on the value.
    346   JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
    347   JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
    348   JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
    349   JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
    350   JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));
    351 
    352   JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
    353   JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
    354   JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
    355   JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
    356   JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));
    357 
    358   JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
    359   JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
    360   JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
    361   JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
    362   JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));
    363 
    364   // Default int
    365   val = Json::Value(Json::intValue);
    366 
    367   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
    368 
    369   checks = IsCheck();
    370   checks.isInt_ = true;
    371   checks.isInt64_ = true;
    372   checks.isUInt_ = true;
    373   checks.isUInt64_ = true;
    374   checks.isIntegral_ = true;
    375   checks.isDouble_ = true;
    376   checks.isNumeric_ = true;
    377   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    378 
    379   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
    380   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    381   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
    382 
    383   JSONTEST_ASSERT_EQUAL(0, val.asInt());
    384   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
    385   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
    386   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
    387   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
    388   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
    389   JSONTEST_ASSERT_EQUAL(false, val.asBool());
    390   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
    391 
    392   // Default uint
    393   val = Json::Value(Json::uintValue);
    394 
    395   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
    396 
    397   checks = IsCheck();
    398   checks.isInt_ = true;
    399   checks.isInt64_ = true;
    400   checks.isUInt_ = true;
    401   checks.isUInt64_ = true;
    402   checks.isIntegral_ = true;
    403   checks.isDouble_ = true;
    404   checks.isNumeric_ = true;
    405   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    406 
    407   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
    408   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    409   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
    410 
    411   JSONTEST_ASSERT_EQUAL(0, val.asInt());
    412   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
    413   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
    414   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
    415   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
    416   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
    417   JSONTEST_ASSERT_EQUAL(false, val.asBool());
    418   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
    419 
    420   // Default real
    421   val = Json::Value(Json::realValue);
    422 
    423   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
    424 
    425   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
    426   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    427   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
    428 
    429   checks = IsCheck();
    430   checks.isInt_ = true;
    431   checks.isInt64_ = true;
    432   checks.isUInt_ = true;
    433   checks.isUInt64_ = true;
    434   checks.isIntegral_ = true;
    435   checks.isDouble_ = true;
    436   checks.isNumeric_ = true;
    437   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    438 
    439   JSONTEST_ASSERT_EQUAL(0, val.asInt());
    440   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
    441   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
    442   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
    443   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
    444   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
    445   JSONTEST_ASSERT_EQUAL(false, val.asBool());
    446   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
    447 
    448   // Zero (signed constructor arg)
    449   val = Json::Value(0);
    450 
    451   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
    452 
    453   checks = IsCheck();
    454   checks.isInt_ = true;
    455   checks.isInt64_ = true;
    456   checks.isUInt_ = true;
    457   checks.isUInt64_ = true;
    458   checks.isIntegral_ = true;
    459   checks.isDouble_ = true;
    460   checks.isNumeric_ = true;
    461   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    462 
    463   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
    464   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    465   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
    466 
    467   JSONTEST_ASSERT_EQUAL(0, val.asInt());
    468   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
    469   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
    470   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
    471   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
    472   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
    473   JSONTEST_ASSERT_EQUAL(false, val.asBool());
    474   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
    475 
    476   // Zero (unsigned constructor arg)
    477   val = Json::Value(0u);
    478 
    479   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
    480 
    481   checks = IsCheck();
    482   checks.isInt_ = true;
    483   checks.isInt64_ = true;
    484   checks.isUInt_ = true;
    485   checks.isUInt64_ = true;
    486   checks.isIntegral_ = true;
    487   checks.isDouble_ = true;
    488   checks.isNumeric_ = true;
    489   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    490 
    491   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
    492   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    493   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
    494 
    495   JSONTEST_ASSERT_EQUAL(0, val.asInt());
    496   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
    497   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
    498   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
    499   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
    500   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
    501   JSONTEST_ASSERT_EQUAL(false, val.asBool());
    502   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
    503 
    504   // Zero (floating-point constructor arg)
    505   val = Json::Value(0.0);
    506 
    507   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
    508 
    509   checks = IsCheck();
    510   checks.isInt_ = true;
    511   checks.isInt64_ = true;
    512   checks.isUInt_ = true;
    513   checks.isUInt64_ = true;
    514   checks.isIntegral_ = true;
    515   checks.isDouble_ = true;
    516   checks.isNumeric_ = true;
    517   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    518 
    519   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
    520   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    521   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
    522 
    523   JSONTEST_ASSERT_EQUAL(0, val.asInt());
    524   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
    525   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
    526   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
    527   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
    528   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
    529   JSONTEST_ASSERT_EQUAL(false, val.asBool());
    530   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
    531 
    532   // 2^20 (signed constructor arg)
    533   val = Json::Value(1 << 20);
    534 
    535   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
    536   checks = IsCheck();
    537   checks.isInt_ = true;
    538   checks.isInt64_ = true;
    539   checks.isUInt_ = true;
    540   checks.isUInt64_ = true;
    541   checks.isIntegral_ = true;
    542   checks.isDouble_ = true;
    543   checks.isNumeric_ = true;
    544   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    545 
    546   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    547   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    548   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
    549 
    550   JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
    551   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
    552   JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
    553   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
    554   JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
    555   JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
    556   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    557   JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
    558 
    559   // 2^20 (unsigned constructor arg)
    560   val = Json::Value(Json::UInt(1 << 20));
    561 
    562   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
    563 
    564   checks = IsCheck();
    565   checks.isInt_ = true;
    566   checks.isInt64_ = true;
    567   checks.isUInt_ = true;
    568   checks.isUInt64_ = true;
    569   checks.isIntegral_ = true;
    570   checks.isDouble_ = true;
    571   checks.isNumeric_ = true;
    572   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    573 
    574   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    575   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    576   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
    577 
    578   JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
    579   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
    580   JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
    581   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
    582   JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
    583   JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
    584   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    585   JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
    586 
    587   // 2^20 (floating-point constructor arg)
    588   val = Json::Value((1 << 20) / 1.0);
    589 
    590   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
    591 
    592   checks = IsCheck();
    593   checks.isInt_ = true;
    594   checks.isInt64_ = true;
    595   checks.isUInt_ = true;
    596   checks.isUInt64_ = true;
    597   checks.isIntegral_ = true;
    598   checks.isDouble_ = true;
    599   checks.isNumeric_ = true;
    600   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    601 
    602   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    603   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    604   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
    605 
    606   JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
    607   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
    608   JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
    609   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
    610   JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
    611   JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
    612   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    613   JSONTEST_ASSERT_STRING_EQUAL("1048576",
    614                                normalizeFloatingPointStr(val.asString()));
    615 
    616   // -2^20
    617   val = Json::Value(-(1 << 20));
    618 
    619   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
    620 
    621   checks = IsCheck();
    622   checks.isInt_ = true;
    623   checks.isInt64_ = true;
    624   checks.isIntegral_ = true;
    625   checks.isDouble_ = true;
    626   checks.isNumeric_ = true;
    627   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    628 
    629   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    630   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    631   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    632 
    633   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
    634   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
    635   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
    636   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
    637   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    638   JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
    639 
    640   // int32 max
    641   val = Json::Value(kint32max);
    642 
    643   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
    644 
    645   checks = IsCheck();
    646   checks.isInt_ = true;
    647   checks.isInt64_ = true;
    648   checks.isUInt_ = true;
    649   checks.isUInt64_ = true;
    650   checks.isIntegral_ = true;
    651   checks.isDouble_ = true;
    652   checks.isNumeric_ = true;
    653   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    654 
    655   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    656   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    657   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
    658 
    659   JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
    660   JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
    661   JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
    662   JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
    663   JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
    664   JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
    665   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    666   JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
    667 
    668   // int32 min
    669   val = Json::Value(kint32min);
    670 
    671   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
    672 
    673   checks = IsCheck();
    674   checks.isInt_ = true;
    675   checks.isInt64_ = true;
    676   checks.isIntegral_ = true;
    677   checks.isDouble_ = true;
    678   checks.isNumeric_ = true;
    679   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    680 
    681   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    682   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
    683   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    684 
    685   JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
    686   JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
    687   JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
    688   JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
    689   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    690   JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
    691 
    692   // uint32 max
    693   val = Json::Value(kuint32max);
    694 
    695   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
    696 
    697   checks = IsCheck();
    698   checks.isInt64_ = true;
    699   checks.isUInt_ = true;
    700   checks.isUInt64_ = true;
    701   checks.isIntegral_ = true;
    702   checks.isDouble_ = true;
    703   checks.isNumeric_ = true;
    704   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    705 
    706   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    707   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    708   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
    709 
    710 #ifndef JSON_NO_INT64
    711   JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
    712 #endif
    713   JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
    714   JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
    715   JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
    716   JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
    717   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    718   JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
    719 
    720 #ifdef JSON_NO_INT64
    721   // int64 max
    722   val = Json::Value(double(kint64max));
    723 
    724   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
    725 
    726   checks = IsCheck();
    727   checks.isDouble_ = true;
    728   checks.isNumeric_ = true;
    729   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    730 
    731   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    732   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    733   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    734 
    735   JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
    736   JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
    737   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    738   JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
    739 
    740   // int64 min
    741   val = Json::Value(double(kint64min));
    742 
    743   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
    744 
    745   checks = IsCheck();
    746   checks.isDouble_ = true;
    747   checks.isNumeric_ = true;
    748   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    749 
    750   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    751   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    752   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    753 
    754   JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
    755   JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
    756   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    757   JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
    758 
    759   // uint64 max
    760   val = Json::Value(double(kuint64max));
    761 
    762   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
    763 
    764   checks = IsCheck();
    765   checks.isDouble_ = true;
    766   checks.isNumeric_ = true;
    767   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    768 
    769   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    770   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    771   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    772 
    773   JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
    774   JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
    775   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    776   JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
    777 #else // ifdef JSON_NO_INT64
    778   // 2^40 (signed constructor arg)
    779   val = Json::Value(Json::Int64(1) << 40);
    780 
    781   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
    782 
    783   checks = IsCheck();
    784   checks.isInt64_ = true;
    785   checks.isUInt64_ = true;
    786   checks.isIntegral_ = true;
    787   checks.isDouble_ = true;
    788   checks.isNumeric_ = true;
    789   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    790 
    791   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    792   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    793   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    794 
    795   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
    796   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
    797   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
    798   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
    799   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
    800   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
    801   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    802   JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
    803 
    804   // 2^40 (unsigned constructor arg)
    805   val = Json::Value(Json::UInt64(1) << 40);
    806 
    807   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
    808 
    809   checks = IsCheck();
    810   checks.isInt64_ = true;
    811   checks.isUInt64_ = true;
    812   checks.isIntegral_ = true;
    813   checks.isDouble_ = true;
    814   checks.isNumeric_ = true;
    815   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    816 
    817   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    818   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    819   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    820 
    821   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
    822   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
    823   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
    824   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
    825   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
    826   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
    827   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    828   JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
    829 
    830   // 2^40 (floating-point constructor arg)
    831   val = Json::Value((Json::Int64(1) << 40) / 1.0);
    832 
    833   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
    834 
    835   checks = IsCheck();
    836   checks.isInt64_ = true;
    837   checks.isUInt64_ = true;
    838   checks.isIntegral_ = true;
    839   checks.isDouble_ = true;
    840   checks.isNumeric_ = true;
    841   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    842 
    843   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    844   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    845   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    846 
    847   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
    848   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
    849   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
    850   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
    851   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
    852   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
    853   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    854   JSONTEST_ASSERT_STRING_EQUAL("1099511627776",
    855                                normalizeFloatingPointStr(val.asString()));
    856 
    857   // -2^40
    858   val = Json::Value(-(Json::Int64(1) << 40));
    859 
    860   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
    861 
    862   checks = IsCheck();
    863   checks.isInt64_ = true;
    864   checks.isIntegral_ = true;
    865   checks.isDouble_ = true;
    866   checks.isNumeric_ = true;
    867   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    868 
    869   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    870   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    871   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    872 
    873   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
    874   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
    875   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
    876   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
    877   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    878   JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
    879 
    880   // int64 max
    881   val = Json::Value(Json::Int64(kint64max));
    882 
    883   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
    884 
    885   checks = IsCheck();
    886   checks.isInt64_ = true;
    887   checks.isUInt64_ = true;
    888   checks.isIntegral_ = true;
    889   checks.isDouble_ = true;
    890   checks.isNumeric_ = true;
    891   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    892 
    893   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    894   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    895   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    896 
    897   JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
    898   JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
    899   JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
    900   JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
    901   JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
    902   JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
    903   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    904   JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
    905 
    906   // int64 max (floating point constructor). Note that kint64max is not exactly
    907   // representable as a double, and will be rounded up to be higher.
    908   val = Json::Value(double(kint64max));
    909 
    910   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
    911 
    912   checks = IsCheck();
    913   checks.isUInt64_ = true;
    914   checks.isIntegral_ = true;
    915   checks.isDouble_ = true;
    916   checks.isNumeric_ = true;
    917   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    918 
    919   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    920   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    921   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    922 
    923   JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
    924   JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
    925   JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
    926   JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(Json::UInt64(1) << 63)),
    927                         val.asFloat());
    928   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    929   JSONTEST_ASSERT_STRING_EQUAL("9.223372036854776e+18",
    930                                normalizeFloatingPointStr(val.asString()));
    931 
    932   // int64 min
    933   val = Json::Value(Json::Int64(kint64min));
    934 
    935   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
    936 
    937   checks = IsCheck();
    938   checks.isInt64_ = true;
    939   checks.isIntegral_ = true;
    940   checks.isDouble_ = true;
    941   checks.isNumeric_ = true;
    942   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    943 
    944   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    945   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    946   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    947 
    948   JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
    949   JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
    950   JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
    951   JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
    952   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    953   JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
    954 
    955   // int64 min (floating point constructor). Note that kint64min *is* exactly
    956   // representable as a double.
    957   val = Json::Value(double(kint64min));
    958 
    959   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
    960 
    961   checks = IsCheck();
    962   checks.isInt64_ = true;
    963   checks.isIntegral_ = true;
    964   checks.isDouble_ = true;
    965   checks.isNumeric_ = true;
    966   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    967 
    968   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    969   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    970   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    971 
    972   JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
    973   JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
    974   JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
    975   JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
    976   JSONTEST_ASSERT_EQUAL(true, val.asBool());
    977   JSONTEST_ASSERT_STRING_EQUAL("-9.223372036854776e+18",
    978                                normalizeFloatingPointStr(val.asString()));
    979 
    980   // 10^19
    981   const Json::UInt64 ten_to_19 = static_cast<Json::UInt64>(1e19);
    982   val = Json::Value(Json::UInt64(ten_to_19));
    983 
    984   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
    985 
    986   checks = IsCheck();
    987   checks.isUInt64_ = true;
    988   checks.isIntegral_ = true;
    989   checks.isDouble_ = true;
    990   checks.isNumeric_ = true;
    991   JSONTEST_ASSERT_PRED(checkIs(val, checks));
    992 
    993   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
    994   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
    995   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
    996 
    997   JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
    998   JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
    999   JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
   1000   JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
   1001   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   1002   JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
   1003 
   1004   // 10^19 (double constructor). Note that 10^19 is not exactly representable
   1005   // as a double.
   1006   val = Json::Value(uint64ToDouble(ten_to_19));
   1007 
   1008   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
   1009 
   1010   checks = IsCheck();
   1011   checks.isUInt64_ = true;
   1012   checks.isIntegral_ = true;
   1013   checks.isDouble_ = true;
   1014   checks.isNumeric_ = true;
   1015   JSONTEST_ASSERT_PRED(checkIs(val, checks));
   1016 
   1017   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   1018   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   1019   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   1020 
   1021   JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
   1022   JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
   1023   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   1024   JSONTEST_ASSERT_STRING_EQUAL("1e+19",
   1025                                normalizeFloatingPointStr(val.asString()));
   1026 
   1027   // uint64 max
   1028   val = Json::Value(Json::UInt64(kuint64max));
   1029 
   1030   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
   1031 
   1032   checks = IsCheck();
   1033   checks.isUInt64_ = true;
   1034   checks.isIntegral_ = true;
   1035   checks.isDouble_ = true;
   1036   checks.isNumeric_ = true;
   1037   JSONTEST_ASSERT_PRED(checkIs(val, checks));
   1038 
   1039   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   1040   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   1041   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   1042 
   1043   JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
   1044   JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
   1045   JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
   1046   JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
   1047   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   1048   JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
   1049 
   1050   // uint64 max (floating point constructor). Note that kuint64max is not
   1051   // exactly representable as a double, and will be rounded up to be higher.
   1052   val = Json::Value(uint64ToDouble(kuint64max));
   1053 
   1054   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
   1055 
   1056   checks = IsCheck();
   1057   checks.isDouble_ = true;
   1058   checks.isNumeric_ = true;
   1059   JSONTEST_ASSERT_PRED(checkIs(val, checks));
   1060 
   1061   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   1062   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   1063   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   1064 
   1065   JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
   1066   JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
   1067   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   1068   JSONTEST_ASSERT_STRING_EQUAL("1.844674407370955e+19",
   1069                                normalizeFloatingPointStr(val.asString()));
   1070 #endif
   1071 }
   1072 
   1073 JSONTEST_FIXTURE(ValueTest, nonIntegers) {
   1074   IsCheck checks;
   1075   Json::Value val;
   1076 
   1077   // Small positive number
   1078   val = Json::Value(1.5);
   1079 
   1080   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
   1081 
   1082   checks = IsCheck();
   1083   checks.isDouble_ = true;
   1084   checks.isNumeric_ = true;
   1085   JSONTEST_ASSERT_PRED(checkIs(val, checks));
   1086 
   1087   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   1088   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
   1089   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   1090   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   1091   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   1092   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   1093   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   1094   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
   1095 
   1096   JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
   1097   JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
   1098   JSONTEST_ASSERT_EQUAL(1, val.asInt());
   1099   JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
   1100   JSONTEST_ASSERT_EQUAL(1, val.asUInt());
   1101   JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
   1102   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   1103   JSONTEST_ASSERT_EQUAL("1.5", val.asString());
   1104 
   1105   // Small negative number
   1106   val = Json::Value(-1.5);
   1107 
   1108   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
   1109 
   1110   checks = IsCheck();
   1111   checks.isDouble_ = true;
   1112   checks.isNumeric_ = true;
   1113   JSONTEST_ASSERT_PRED(checkIs(val, checks));
   1114 
   1115   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   1116   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   1117   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   1118   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   1119   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   1120   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   1121   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   1122   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
   1123 
   1124   JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
   1125   JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
   1126   JSONTEST_ASSERT_EQUAL(-1, val.asInt());
   1127   JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
   1128   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   1129   JSONTEST_ASSERT_EQUAL("-1.5", val.asString());
   1130 
   1131   // A bit over int32 max
   1132   val = Json::Value(kint32max + 0.5);
   1133 
   1134   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
   1135 
   1136   checks = IsCheck();
   1137   checks.isDouble_ = true;
   1138   checks.isNumeric_ = true;
   1139   JSONTEST_ASSERT_PRED(checkIs(val, checks));
   1140 
   1141   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
   1142   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   1143   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   1144   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   1145   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   1146   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   1147   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   1148   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
   1149 
   1150   JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
   1151   JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
   1152   JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
   1153 #ifdef JSON_HAS_INT64
   1154   JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
   1155   JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
   1156 #endif
   1157   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   1158   JSONTEST_ASSERT_EQUAL("2147483647.5",
   1159                         normalizeFloatingPointStr(val.asString()));
   1160 
   1161   // A bit under int32 min
   1162   val = Json::Value(kint32min - 0.5);
   1163 
   1164   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
   1165 
   1166   checks = IsCheck();
   1167   checks.isDouble_ = true;
   1168   checks.isNumeric_ = true;
   1169   JSONTEST_ASSERT_PRED(checkIs(val, checks));
   1170 
   1171   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   1172   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   1173   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   1174   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   1175   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   1176   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   1177   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   1178   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
   1179 
   1180   JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
   1181   JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
   1182 #ifdef JSON_HAS_INT64
   1183   JSONTEST_ASSERT_EQUAL(-Json::Int64(1) << 31, val.asLargestInt());
   1184 #endif
   1185   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   1186   JSONTEST_ASSERT_EQUAL("-2147483648.5",
   1187                         normalizeFloatingPointStr(val.asString()));
   1188 
   1189   // A bit over uint32 max
   1190   val = Json::Value(kuint32max + 0.5);
   1191 
   1192   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
   1193 
   1194   checks = IsCheck();
   1195   checks.isDouble_ = true;
   1196   checks.isNumeric_ = true;
   1197   JSONTEST_ASSERT_PRED(checkIs(val, checks));
   1198 
   1199   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   1200   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   1201   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   1202   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   1203   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   1204   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   1205   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   1206   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
   1207 
   1208   JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
   1209   JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
   1210 #ifdef JSON_HAS_INT64
   1211   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32) - 1, val.asLargestInt());
   1212   JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32) - Json::UInt64(1),
   1213                         val.asLargestUInt());
   1214 #endif
   1215   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   1216   JSONTEST_ASSERT_EQUAL("4294967295.5",
   1217                         normalizeFloatingPointStr(val.asString()));
   1218 
   1219   val = Json::Value(1.2345678901234);
   1220   JSONTEST_ASSERT_STRING_EQUAL("1.2345678901234",
   1221                                normalizeFloatingPointStr(val.asString()));
   1222 
   1223   // A 16-digit floating point number.
   1224   val = Json::Value(2199023255552000.0f);
   1225   JSONTEST_ASSERT_EQUAL(float(2199023255552000), val.asFloat());
   1226   JSONTEST_ASSERT_STRING_EQUAL("2199023255552000",
   1227                                normalizeFloatingPointStr(val.asString()));
   1228 
   1229   // A very large floating point number.
   1230   val = Json::Value(3.402823466385289e38);
   1231   JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
   1232   JSONTEST_ASSERT_STRING_EQUAL("3.402823466385289e+38",
   1233                                normalizeFloatingPointStr(val.asString()));
   1234 
   1235   // An even larger floating point number.
   1236   val = Json::Value(1.2345678e300);
   1237   JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
   1238   JSONTEST_ASSERT_STRING_EQUAL("1.2345678e+300",
   1239                                normalizeFloatingPointStr(val.asString()));
   1240 }
   1241 
   1242 void ValueTest::checkConstMemberCount(const Json::Value& value,
   1243                                       unsigned int expectedCount) {
   1244   unsigned int count = 0;
   1245   Json::Value::const_iterator itEnd = value.end();
   1246   for (Json::Value::const_iterator it = value.begin(); it != itEnd; ++it) {
   1247     ++count;
   1248   }
   1249   JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::const_iterator";
   1250 }
   1251 
   1252 void ValueTest::checkMemberCount(Json::Value& value,
   1253                                  unsigned int expectedCount) {
   1254   JSONTEST_ASSERT_EQUAL(expectedCount, value.size());
   1255 
   1256   unsigned int count = 0;
   1257   Json::Value::iterator itEnd = value.end();
   1258   for (Json::Value::iterator it = value.begin(); it != itEnd; ++it) {
   1259     ++count;
   1260   }
   1261   JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::iterator";
   1262 
   1263   JSONTEST_ASSERT_PRED(checkConstMemberCount(value, expectedCount));
   1264 }
   1265 
   1266 ValueTest::IsCheck::IsCheck()
   1267     : isObject_(false), isArray_(false), isBool_(false), isString_(false),
   1268       isNull_(false), isInt_(false), isInt64_(false), isUInt_(false),
   1269       isUInt64_(false), isIntegral_(false), isDouble_(false),
   1270       isNumeric_(false) {}
   1271 
   1272 void ValueTest::checkIs(const Json::Value& value, const IsCheck& check) {
   1273   JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject());
   1274   JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray());
   1275   JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool());
   1276   JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble());
   1277   JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt());
   1278   JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt());
   1279   JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral());
   1280   JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric());
   1281   JSONTEST_ASSERT_EQUAL(check.isString_, value.isString());
   1282   JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull());
   1283 
   1284 #ifdef JSON_HAS_INT64
   1285   JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64());
   1286   JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64());
   1287 #else
   1288   JSONTEST_ASSERT_EQUAL(false, value.isInt64());
   1289   JSONTEST_ASSERT_EQUAL(false, value.isUInt64());
   1290 #endif
   1291 }
   1292 
   1293 JSONTEST_FIXTURE(ValueTest, compareNull) {
   1294   JSONTEST_ASSERT_PRED(checkIsEqual(Json::Value(), Json::Value()));
   1295 }
   1296 
   1297 JSONTEST_FIXTURE(ValueTest, compareInt) {
   1298   JSONTEST_ASSERT_PRED(checkIsLess(0, 10));
   1299   JSONTEST_ASSERT_PRED(checkIsEqual(10, 10));
   1300   JSONTEST_ASSERT_PRED(checkIsEqual(-10, -10));
   1301   JSONTEST_ASSERT_PRED(checkIsLess(-10, 0));
   1302 }
   1303 
   1304 JSONTEST_FIXTURE(ValueTest, compareUInt) {
   1305   JSONTEST_ASSERT_PRED(checkIsLess(0u, 10u));
   1306   JSONTEST_ASSERT_PRED(checkIsLess(0u, Json::Value::maxUInt));
   1307   JSONTEST_ASSERT_PRED(checkIsEqual(10u, 10u));
   1308 }
   1309 
   1310 JSONTEST_FIXTURE(ValueTest, compareDouble) {
   1311   JSONTEST_ASSERT_PRED(checkIsLess(0.0, 10.0));
   1312   JSONTEST_ASSERT_PRED(checkIsEqual(10.0, 10.0));
   1313   JSONTEST_ASSERT_PRED(checkIsEqual(-10.0, -10.0));
   1314   JSONTEST_ASSERT_PRED(checkIsLess(-10.0, 0.0));
   1315 }
   1316 
   1317 JSONTEST_FIXTURE(ValueTest, compareString) {
   1318   JSONTEST_ASSERT_PRED(checkIsLess("", " "));
   1319   JSONTEST_ASSERT_PRED(checkIsLess("", "a"));
   1320   JSONTEST_ASSERT_PRED(checkIsLess("abcd", "zyui"));
   1321   JSONTEST_ASSERT_PRED(checkIsLess("abc", "abcd"));
   1322   JSONTEST_ASSERT_PRED(checkIsEqual("abcd", "abcd"));
   1323   JSONTEST_ASSERT_PRED(checkIsEqual(" ", " "));
   1324   JSONTEST_ASSERT_PRED(checkIsLess("ABCD", "abcd"));
   1325   JSONTEST_ASSERT_PRED(checkIsEqual("ABCD", "ABCD"));
   1326 }
   1327 
   1328 JSONTEST_FIXTURE(ValueTest, compareBoolean) {
   1329   JSONTEST_ASSERT_PRED(checkIsLess(false, true));
   1330   JSONTEST_ASSERT_PRED(checkIsEqual(false, false));
   1331   JSONTEST_ASSERT_PRED(checkIsEqual(true, true));
   1332 }
   1333 
   1334 JSONTEST_FIXTURE(ValueTest, compareArray) {
   1335   // array compare size then content
   1336   Json::Value emptyArray(Json::arrayValue);
   1337   Json::Value l1aArray;
   1338   l1aArray.append(0);
   1339   Json::Value l1bArray;
   1340   l1bArray.append(10);
   1341   Json::Value l2aArray;
   1342   l2aArray.append(0);
   1343   l2aArray.append(0);
   1344   Json::Value l2bArray;
   1345   l2bArray.append(0);
   1346   l2bArray.append(10);
   1347   JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l1aArray));
   1348   JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l2aArray));
   1349   JSONTEST_ASSERT_PRED(checkIsLess(l1aArray, l2aArray));
   1350   JSONTEST_ASSERT_PRED(checkIsLess(l2aArray, l2bArray));
   1351   JSONTEST_ASSERT_PRED(checkIsEqual(emptyArray, Json::Value(emptyArray)));
   1352   JSONTEST_ASSERT_PRED(checkIsEqual(l1aArray, Json::Value(l1aArray)));
   1353   JSONTEST_ASSERT_PRED(checkIsEqual(l2bArray, Json::Value(l2bArray)));
   1354 }
   1355 
   1356 JSONTEST_FIXTURE(ValueTest, compareObject) {
   1357   // object compare size then content
   1358   Json::Value emptyObject(Json::objectValue);
   1359   Json::Value l1aObject;
   1360   l1aObject["key1"] = 0;
   1361   Json::Value l1bObject;
   1362   l1aObject["key1"] = 10;
   1363   Json::Value l2aObject;
   1364   l2aObject["key1"] = 0;
   1365   l2aObject["key2"] = 0;
   1366   JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l1aObject));
   1367   JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l2aObject));
   1368   JSONTEST_ASSERT_PRED(checkIsLess(l1aObject, l2aObject));
   1369   JSONTEST_ASSERT_PRED(checkIsEqual(emptyObject, Json::Value(emptyObject)));
   1370   JSONTEST_ASSERT_PRED(checkIsEqual(l1aObject, Json::Value(l1aObject)));
   1371   JSONTEST_ASSERT_PRED(checkIsEqual(l2aObject, Json::Value(l2aObject)));
   1372 }
   1373 
   1374 JSONTEST_FIXTURE(ValueTest, compareType) {
   1375   // object of different type are ordered according to their type
   1376   JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(), Json::Value(1)));
   1377   JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1), Json::Value(1u)));
   1378   JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1u), Json::Value(1.0)));
   1379   JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1.0), Json::Value("a")));
   1380   JSONTEST_ASSERT_PRED(checkIsLess(Json::Value("a"), Json::Value(true)));
   1381   JSONTEST_ASSERT_PRED(
   1382       checkIsLess(Json::Value(true), Json::Value(Json::arrayValue)));
   1383   JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(Json::arrayValue),
   1384                                    Json::Value(Json::objectValue)));
   1385 }
   1386 
   1387 void ValueTest::checkIsLess(const Json::Value& x, const Json::Value& y) {
   1388   JSONTEST_ASSERT(x < y);
   1389   JSONTEST_ASSERT(y > x);
   1390   JSONTEST_ASSERT(x <= y);
   1391   JSONTEST_ASSERT(y >= x);
   1392   JSONTEST_ASSERT(!(x == y));
   1393   JSONTEST_ASSERT(!(y == x));
   1394   JSONTEST_ASSERT(!(x >= y));
   1395   JSONTEST_ASSERT(!(y <= x));
   1396   JSONTEST_ASSERT(!(x > y));
   1397   JSONTEST_ASSERT(!(y < x));
   1398   JSONTEST_ASSERT(x.compare(y) < 0);
   1399   JSONTEST_ASSERT(y.compare(x) >= 0);
   1400 }
   1401 
   1402 void ValueTest::checkIsEqual(const Json::Value& x, const Json::Value& y) {
   1403   JSONTEST_ASSERT(x == y);
   1404   JSONTEST_ASSERT(y == x);
   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.compare(y) == 0);
   1414   JSONTEST_ASSERT(y.compare(x) == 0);
   1415 }
   1416 
   1417 JSONTEST_FIXTURE(ValueTest, typeChecksThrowExceptions) {
   1418 #if JSON_USE_EXCEPTION
   1419 
   1420   Json::Value intVal(1);
   1421   Json::Value strVal("Test");
   1422   Json::Value objVal(Json::objectValue);
   1423   Json::Value arrVal(Json::arrayValue);
   1424 
   1425   JSONTEST_ASSERT_THROWS(intVal["test"]);
   1426   JSONTEST_ASSERT_THROWS(strVal["test"]);
   1427   JSONTEST_ASSERT_THROWS(arrVal["test"]);
   1428 
   1429   JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
   1430   JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
   1431   JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
   1432 
   1433   JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
   1434   JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
   1435   JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
   1436 
   1437   JSONTEST_ASSERT_THROWS(intVal[0]);
   1438   JSONTEST_ASSERT_THROWS(objVal[0]);
   1439   JSONTEST_ASSERT_THROWS(strVal[0]);
   1440 
   1441   JSONTEST_ASSERT_THROWS(intVal.clear());
   1442 
   1443   JSONTEST_ASSERT_THROWS(intVal.resize(1));
   1444   JSONTEST_ASSERT_THROWS(strVal.resize(1));
   1445   JSONTEST_ASSERT_THROWS(objVal.resize(1));
   1446 
   1447   JSONTEST_ASSERT_THROWS(intVal.asCString());
   1448 
   1449   JSONTEST_ASSERT_THROWS(objVal.asString());
   1450   JSONTEST_ASSERT_THROWS(arrVal.asString());
   1451 
   1452   JSONTEST_ASSERT_THROWS(strVal.asInt());
   1453   JSONTEST_ASSERT_THROWS(objVal.asInt());
   1454   JSONTEST_ASSERT_THROWS(arrVal.asInt());
   1455 
   1456   JSONTEST_ASSERT_THROWS(strVal.asUInt());
   1457   JSONTEST_ASSERT_THROWS(objVal.asUInt());
   1458   JSONTEST_ASSERT_THROWS(arrVal.asUInt());
   1459 
   1460   JSONTEST_ASSERT_THROWS(strVal.asInt64());
   1461   JSONTEST_ASSERT_THROWS(objVal.asInt64());
   1462   JSONTEST_ASSERT_THROWS(arrVal.asInt64());
   1463 
   1464   JSONTEST_ASSERT_THROWS(strVal.asUInt64());
   1465   JSONTEST_ASSERT_THROWS(objVal.asUInt64());
   1466   JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
   1467 
   1468   JSONTEST_ASSERT_THROWS(strVal.asDouble());
   1469   JSONTEST_ASSERT_THROWS(objVal.asDouble());
   1470   JSONTEST_ASSERT_THROWS(arrVal.asDouble());
   1471 
   1472   JSONTEST_ASSERT_THROWS(strVal.asFloat());
   1473   JSONTEST_ASSERT_THROWS(objVal.asFloat());
   1474   JSONTEST_ASSERT_THROWS(arrVal.asFloat());
   1475 
   1476   JSONTEST_ASSERT_THROWS(strVal.asBool());
   1477   JSONTEST_ASSERT_THROWS(objVal.asBool());
   1478   JSONTEST_ASSERT_THROWS(arrVal.asBool());
   1479 
   1480 #endif
   1481 }
   1482 
   1483 JSONTEST_FIXTURE(ValueTest, offsetAccessors) {
   1484   Json::Value x;
   1485   JSONTEST_ASSERT(x.getOffsetStart() == 0);
   1486   JSONTEST_ASSERT(x.getOffsetLimit() == 0);
   1487   x.setOffsetStart(10);
   1488   x.setOffsetLimit(20);
   1489   JSONTEST_ASSERT(x.getOffsetStart() == 10);
   1490   JSONTEST_ASSERT(x.getOffsetLimit() == 20);
   1491   Json::Value y(x);
   1492   JSONTEST_ASSERT(y.getOffsetStart() == 10);
   1493   JSONTEST_ASSERT(y.getOffsetLimit() == 20);
   1494   Json::Value z;
   1495   z.swap(y);
   1496   JSONTEST_ASSERT(z.getOffsetStart() == 10);
   1497   JSONTEST_ASSERT(z.getOffsetLimit() == 20);
   1498   JSONTEST_ASSERT(y.getOffsetStart() == 0);
   1499   JSONTEST_ASSERT(y.getOffsetLimit() == 0);
   1500 }
   1501 
   1502 struct WriterTest : JsonTest::TestCase {};
   1503 
   1504 JSONTEST_FIXTURE(WriterTest, dropNullPlaceholders) {
   1505   Json::FastWriter writer;
   1506   Json::Value nullValue;
   1507   JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
   1508 
   1509   writer.dropNullPlaceholders();
   1510   JSONTEST_ASSERT(writer.write(nullValue) == "\n");
   1511 }
   1512 
   1513 struct ReaderTest : JsonTest::TestCase {};
   1514 
   1515 JSONTEST_FIXTURE(ReaderTest, parseWithNoErrors) {
   1516   Json::Reader reader;
   1517   Json::Value root;
   1518   bool ok = reader.parse("{ \"property\" : \"value\" }", root);
   1519   JSONTEST_ASSERT(ok);
   1520   JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
   1521   JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
   1522 }
   1523 
   1524 JSONTEST_FIXTURE(ReaderTest, parseWithNoErrorsTestingOffsets) {
   1525   Json::Reader reader;
   1526   Json::Value root;
   1527   bool ok = reader.parse("{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
   1528                          "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
   1529                          "null, \"false\" : false }",
   1530                          root);
   1531   JSONTEST_ASSERT(ok);
   1532   JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
   1533   JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
   1534   JSONTEST_ASSERT(root["property"].getOffsetStart() == 15);
   1535   JSONTEST_ASSERT(root["property"].getOffsetLimit() == 34);
   1536   JSONTEST_ASSERT(root["property"][0].getOffsetStart() == 16);
   1537   JSONTEST_ASSERT(root["property"][0].getOffsetLimit() == 23);
   1538   JSONTEST_ASSERT(root["property"][1].getOffsetStart() == 25);
   1539   JSONTEST_ASSERT(root["property"][1].getOffsetLimit() == 33);
   1540   JSONTEST_ASSERT(root["obj"].getOffsetStart() == 44);
   1541   JSONTEST_ASSERT(root["obj"].getOffsetLimit() == 76);
   1542   JSONTEST_ASSERT(root["obj"]["nested"].getOffsetStart() == 57);
   1543   JSONTEST_ASSERT(root["obj"]["nested"].getOffsetLimit() == 60);
   1544   JSONTEST_ASSERT(root["obj"]["bool"].getOffsetStart() == 71);
   1545   JSONTEST_ASSERT(root["obj"]["bool"].getOffsetLimit() == 75);
   1546   JSONTEST_ASSERT(root["null"].getOffsetStart() == 87);
   1547   JSONTEST_ASSERT(root["null"].getOffsetLimit() == 91);
   1548   JSONTEST_ASSERT(root["false"].getOffsetStart() == 103);
   1549   JSONTEST_ASSERT(root["false"].getOffsetLimit() == 108);
   1550   JSONTEST_ASSERT(root.getOffsetStart() == 0);
   1551   JSONTEST_ASSERT(root.getOffsetLimit() == 110);
   1552 }
   1553 
   1554 JSONTEST_FIXTURE(ReaderTest, parseWithOneError) {
   1555   Json::Reader reader;
   1556   Json::Value root;
   1557   bool ok = reader.parse("{ \"property\" :: \"value\" }", root);
   1558   JSONTEST_ASSERT(!ok);
   1559   JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
   1560                   "* Line 1, Column 15\n  Syntax error: value, object or array "
   1561                   "expected.\n");
   1562   std::vector<Json::Reader::StructuredError> errors =
   1563       reader.getStructuredErrors();
   1564   JSONTEST_ASSERT(errors.size() == 1);
   1565   JSONTEST_ASSERT(errors.at(0).offset_start == 14);
   1566   JSONTEST_ASSERT(errors.at(0).offset_limit == 15);
   1567   JSONTEST_ASSERT(errors.at(0).message ==
   1568                   "Syntax error: value, object or array expected.");
   1569 }
   1570 
   1571 JSONTEST_FIXTURE(ReaderTest, parseChineseWithOneError) {
   1572   Json::Reader reader;
   1573   Json::Value root;
   1574   bool ok = reader.parse("{ \"prerty\" :: \"value\" }", root);
   1575   JSONTEST_ASSERT(!ok);
   1576   JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
   1577                   "* Line 1, Column 19\n  Syntax error: value, object or array "
   1578                   "expected.\n");
   1579   std::vector<Json::Reader::StructuredError> errors =
   1580       reader.getStructuredErrors();
   1581   JSONTEST_ASSERT(errors.size() == 1);
   1582   JSONTEST_ASSERT(errors.at(0).offset_start == 18);
   1583   JSONTEST_ASSERT(errors.at(0).offset_limit == 19);
   1584   JSONTEST_ASSERT(errors.at(0).message ==
   1585                   "Syntax error: value, object or array expected.");
   1586 }
   1587 
   1588 JSONTEST_FIXTURE(ReaderTest, parseWithDetailError) {
   1589   Json::Reader reader;
   1590   Json::Value root;
   1591   bool ok = reader.parse("{ \"property\" : \"v\\alue\" }", root);
   1592   JSONTEST_ASSERT(!ok);
   1593   JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
   1594                   "* Line 1, Column 16\n  Bad escape sequence in string\nSee "
   1595                   "Line 1, Column 20 for detail.\n");
   1596   std::vector<Json::Reader::StructuredError> errors =
   1597       reader.getStructuredErrors();
   1598   JSONTEST_ASSERT(errors.size() == 1);
   1599   JSONTEST_ASSERT(errors.at(0).offset_start == 15);
   1600   JSONTEST_ASSERT(errors.at(0).offset_limit == 23);
   1601   JSONTEST_ASSERT(errors.at(0).message == "Bad escape sequence in string");
   1602 }
   1603 
   1604 int main(int argc, const char* argv[]) {
   1605   JsonTest::Runner runner;
   1606   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, checkNormalizeFloatingPointStr);
   1607   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, memberCount);
   1608   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, objects);
   1609   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrays);
   1610   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, null);
   1611   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, strings);
   1612   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, bools);
   1613   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, integers);
   1614   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nonIntegers);
   1615   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareNull);
   1616   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareInt);
   1617   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareUInt);
   1618   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareDouble);
   1619   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareString);
   1620   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareBoolean);
   1621   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareArray);
   1622   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareObject);
   1623   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareType);
   1624   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, offsetAccessors);
   1625   JSONTEST_REGISTER_FIXTURE(runner, ValueTest, typeChecksThrowExceptions);
   1626 
   1627   JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithNoErrors);
   1628   JSONTEST_REGISTER_FIXTURE(
   1629       runner, ReaderTest, parseWithNoErrorsTestingOffsets);
   1630   JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithOneError);
   1631   JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseChineseWithOneError);
   1632   JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithDetailError);
   1633 
   1634   JSONTEST_REGISTER_FIXTURE(runner, WriterTest, dropNullPlaceholders);
   1635 
   1636   return runner.runCommandLine(argc, argv);
   1637 }
   1638