// Copyright 2007-2010 Baptiste Lepilleur
// Distributed under MIT license, or public domain if desired and
// recognized in your jurisdiction.
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE

#include <json/config.h>
#include <json/json.h>
#include "jsontest.h"

// Make numeric limits more convenient to talk about.
// Assumes int type in 32 bits.
#define kint32max Json::Value::maxInt
#define kint32min Json::Value::minInt
#define kuint32max Json::Value::maxUInt
#define kint64max Json::Value::maxInt64
#define kint64min Json::Value::minInt64
#define kuint64max Json::Value::maxUInt64

static const double kdint64max = double(kint64max);
static const float kfint64max = float(kint64max);
static const float kfint32max = float(kint32max);
static const float kfuint32max = float(kuint32max);


// //////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////
// Json Library test cases
// //////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////

#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
static inline double uint64ToDouble( Json::UInt64 value )
{
    return static_cast<double>( value );
}
#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
static inline double uint64ToDouble( Json::UInt64 value )
{
    return static_cast<double>( Json::Int64(value/2) ) * 2.0 + Json::Int64(value & 1);
}
#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)

struct ValueTest : JsonTest::TestCase
{
   Json::Value null_;
   Json::Value emptyArray_;
   Json::Value emptyObject_;
   Json::Value integer_;
   Json::Value unsignedInteger_;
   Json::Value smallUnsignedInteger_;
   Json::Value real_;
   Json::Value float_;
   Json::Value array1_;
   Json::Value object1_;
   Json::Value emptyString_;
   Json::Value string1_;
   Json::Value string_;
   Json::Value true_;
   Json::Value false_;


   ValueTest()
      : emptyArray_( Json::arrayValue )
      , emptyObject_( Json::objectValue )
      , integer_( 123456789 )
      , smallUnsignedInteger_( Json::Value::UInt( Json::Value::maxInt ) )
      , unsignedInteger_( 34567890u )
      , real_( 1234.56789 )
      , float_( 0.00390625f )
      , emptyString_( "" )
      , string1_( "a" )
      , string_( "sometext with space" )
      , true_( true )
      , false_( false )
   {
      array1_.append( 1234 );
      object1_["id"] = 1234;
   }

   struct IsCheck
   {
      /// Initialize all checks to \c false by default.
      IsCheck();

      bool isObject_;
      bool isArray_;
      bool isBool_;
      bool isString_;
      bool isNull_;

      bool isInt_;
      bool isInt64_;
      bool isUInt_;
      bool isUInt64_;
      bool isIntegral_;
      bool isDouble_;
      bool isNumeric_;
   };

   void checkConstMemberCount( const Json::Value &value, unsigned int expectedCount );

   void checkMemberCount( Json::Value &value, unsigned int expectedCount );

   void checkIs( const Json::Value &value, const IsCheck &check );

   void checkIsLess( const Json::Value &x, const Json::Value &y );

   void checkIsEqual( const Json::Value &x, const Json::Value &y );

   /// Normalize the representation of floating-point number by stripped leading 0 in exponent.
   static std::string normalizeFloatingPointStr( const std::string &s );
};


std::string 
ValueTest::normalizeFloatingPointStr( const std::string &s )
{
    std::string::size_type index = s.find_last_of( "eE" );
    if ( index != std::string::npos )
    {
        std::string::size_type hasSign = (s[index+1] == '+' || s[index+1] == '-') ? 1 : 0;
        std::string::size_type exponentStartIndex = index + 1 + hasSign;
        std::string normalized = s.substr( 0, exponentStartIndex );
        std::string::size_type indexDigit = s.find_first_not_of( '0', exponentStartIndex );
        std::string exponent = "0";
        if ( indexDigit != std::string::npos ) // There is an exponent different from 0
        {
            exponent = s.substr( indexDigit );
        }
        return normalized + exponent;
    }
    return s;
}


JSONTEST_FIXTURE( ValueTest, checkNormalizeFloatingPointStr )
{
    JSONTEST_ASSERT_STRING_EQUAL( "0.0", normalizeFloatingPointStr("0.0") );
    JSONTEST_ASSERT_STRING_EQUAL( "0e0", normalizeFloatingPointStr("0e0") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234.0", normalizeFloatingPointStr("1234.0") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234.0e0", normalizeFloatingPointStr("1234.0e0") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234.0e+0", normalizeFloatingPointStr("1234.0e+0") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e-1", normalizeFloatingPointStr("1234e-1") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e10", normalizeFloatingPointStr("1234e10") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e10", normalizeFloatingPointStr("1234e010") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e+10", normalizeFloatingPointStr("1234e+010") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e-10", normalizeFloatingPointStr("1234e-010") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e+100", normalizeFloatingPointStr("1234e+100") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e-100", normalizeFloatingPointStr("1234e-100") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e+1", normalizeFloatingPointStr("1234e+001") );
}


JSONTEST_FIXTURE( ValueTest, memberCount )
{
   JSONTEST_ASSERT_PRED( checkMemberCount(emptyArray_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(emptyObject_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(array1_, 1) );
   JSONTEST_ASSERT_PRED( checkMemberCount(object1_, 1) );
   JSONTEST_ASSERT_PRED( checkMemberCount(null_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(integer_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(unsignedInteger_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(smallUnsignedInteger_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(real_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(emptyString_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(string_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(true_, 0) );
}


JSONTEST_FIXTURE( ValueTest, objects )
{
   // Types
   IsCheck checks;
   checks.isObject_ = true;
   JSONTEST_ASSERT_PRED( checkIs( emptyObject_, checks ) );
   JSONTEST_ASSERT_PRED( checkIs( object1_, checks ) );

   JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());

   // Empty object okay
   JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));

   // Non-empty object not okay
   JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));

   // Always okay
   JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));

   // Never okay
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));

   // Access through const reference
   const Json::Value &constObject = object1_;

   JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
   JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);

   // Access through non-const reference
   JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
   JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);

   object1_["some other id"] = "foo";
   JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
}


JSONTEST_FIXTURE( ValueTest, arrays )
{
   const unsigned int index0 = 0;

   // Types
   IsCheck checks;
   checks.isArray_ = true;
   JSONTEST_ASSERT_PRED( checkIs( emptyArray_, checks ) );
   JSONTEST_ASSERT_PRED( checkIs( array1_, checks ) );

   JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());

   // Empty array okay
   JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));

   // Non-empty array not okay
   JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));

   // Always okay
   JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));

   // Never okay
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));

   // Access through const reference
   const Json::Value &constArray = array1_;
   JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
   JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);

   // Access through non-const reference
   JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
   JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);

   array1_[2] = Json::Value(17);
   JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
   JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
}


JSONTEST_FIXTURE( ValueTest, null )
{
   JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());

   IsCheck checks;
   checks.isNull_ = true;
   JSONTEST_ASSERT_PRED( checkIs( null_, checks ) );

   JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
   JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
   JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
   JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
   JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
}


JSONTEST_FIXTURE( ValueTest, strings )
{
   JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());

   IsCheck checks;
   checks.isString_ = true;
   JSONTEST_ASSERT_PRED( checkIs( emptyString_, checks ) );
   JSONTEST_ASSERT_PRED( checkIs( string_, checks ) );
   JSONTEST_ASSERT_PRED( checkIs( string1_, checks ) );

   // Empty string okay
   JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));

   // Non-empty string not okay
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));

   // Always okay
   JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));

   // Never okay
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));

   JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
   JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
}


JSONTEST_FIXTURE( ValueTest, bools )
{
   JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());

   IsCheck checks;
   checks.isBool_ = true;
   JSONTEST_ASSERT_PRED( checkIs( false_, checks ) );
   JSONTEST_ASSERT_PRED( checkIs( true_, checks ) );

   // False okay
   JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));

   // True not okay
   JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));

   // Always okay
   JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));

   // Never okay
   JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(true, true_.asBool());
   JSONTEST_ASSERT_EQUAL(1, true_.asInt());
   JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
   JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
   JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
   JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());

   JSONTEST_ASSERT_EQUAL(false, false_.asBool());
   JSONTEST_ASSERT_EQUAL(0, false_.asInt());
   JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
   JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
}


JSONTEST_FIXTURE( ValueTest, integers )
{
   IsCheck checks;
   Json::Value val;

   // Conversions that don't depend on the value.
   JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));

   // Default int
   val = Json::Value(Json::intValue);

   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());

   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());

   // Default uint
   val = Json::Value(Json::uintValue);

   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());

   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());

   // Default real
   val = Json::Value(Json::realValue);

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());

   // Zero (signed constructor arg)
   val = Json::Value(0);

   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());

   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());

   // Zero (unsigned constructor arg)
   val = Json::Value(0u);

   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());

   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());

   // Zero (floating-point constructor arg)
   val = Json::Value(0.0);

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());

   // 2^20 (signed constructor arg)
   val = Json::Value(1 << 20);

   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());

   // 2^20 (unsigned constructor arg)
   val = Json::Value(Json::UInt(1 << 20));

   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());

   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());

   // 2^20 (floating-point constructor arg)
   val = Json::Value((1 << 20) / 1.0);

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1048576.0", normalizeFloatingPointStr(val.asString()));

   // -2^20
   val = Json::Value(-(1 << 20));

   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());

   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());

   // int32 max
   val = Json::Value(kint32max);

   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());

   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
   JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
   JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
   JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());

   // int32 min
   val = Json::Value(kint32min);

   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());

   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
   JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
   JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());

   // uint32 max
   val = Json::Value(kuint32max);

   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());

   checks = IsCheck();
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

#ifndef JSON_NO_INT64
   JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
#endif
   JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
   JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
   JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());

#ifdef JSON_NO_INT64
   // int64 max
   val = Json::Value(double(kint64max));

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());

   // int64 min
   val = Json::Value(double(kint64min));

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());

   // uint64 max
   val = Json::Value(double(kuint64max));

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
#else  // ifdef JSON_NO_INT64
   // 2^40 (signed constructor arg)
   val = Json::Value(Json::Int64(1) << 40);

   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());

   checks = IsCheck();
   checks.isInt64_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());

   // 2^40 (unsigned constructor arg)
   val = Json::Value(Json::UInt64(1) << 40);

   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());

   checks = IsCheck();
   checks.isInt64_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());

   // 2^40 (floating-point constructor arg)
   val = Json::Value((Json::Int64(1) << 40) / 1.0);

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isInt64_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1099511627776.0", normalizeFloatingPointStr(val.asString()));

   // -2^40
   val = Json::Value(-(Json::Int64(1) << 40));

   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());

   checks = IsCheck();
   checks.isInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());

   // int64 max
   val = Json::Value(Json::Int64(kint64max));

   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());

   checks = IsCheck();
   checks.isInt64_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
   JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
   JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());

   // int64 max (floating point constructor). Note that kint64max is not exactly
   // representable as a double, and will be rounded up to be higher.
   val = Json::Value(double(kint64max));

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
   JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(Json::UInt64(1) << 63)), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("9.223372036854776e+18", normalizeFloatingPointStr(val.asString()));

   // int64 min
   val = Json::Value(Json::Int64(kint64min));

   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());

   checks = IsCheck();
   checks.isInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
   JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());

   // int64 min (floating point constructor). Note that kint64min *is* exactly
   // representable as a double.
   val = Json::Value(double(kint64min));

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
   JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("-9.223372036854776e+18", normalizeFloatingPointStr(val.asString()));

   // uint64 max
   val = Json::Value(Json::UInt64(kuint64max));

   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());

   checks = IsCheck();
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
   JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());

   // uint64 max (floating point constructor). Note that kuint64max is not
   // exactly representable as a double, and will be rounded up to be higher.
   val = Json::Value(uint64ToDouble(kuint64max));

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1.844674407370955e+19", normalizeFloatingPointStr(val.asString()));
#endif
}


JSONTEST_FIXTURE( ValueTest, nonIntegers )
{
   IsCheck checks;
   Json::Value val;

   // Small positive number
   val = Json::Value(1.5);

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
   JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
   JSONTEST_ASSERT_EQUAL(1, val.asInt());
   JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(1, val.asUInt());
   JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_EQUAL("1.50", val.asString());

   // Small negative number
   val = Json::Value(-1.5);

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
   JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
   JSONTEST_ASSERT_EQUAL(-1, val.asInt());
   JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_EQUAL("-1.50", val.asString());

   // A bit over int32 max
   val = Json::Value(kint32max + 0.5);

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
   JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
#ifdef JSON_HAS_INT64
   JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
#endif
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_EQUAL("2147483647.50", normalizeFloatingPointStr(val.asString()));

   // A bit under int32 min
   val = Json::Value(kint32min - 0.5);

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
#ifdef JSON_HAS_INT64
   JSONTEST_ASSERT_EQUAL(-Json::Int64(1)<< 31, val.asLargestInt());
#endif
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_EQUAL("-2147483648.50", normalizeFloatingPointStr(val.asString()));

   // A bit over uint32 max
   val = Json::Value(kuint32max + 0.5);

   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
#ifdef JSON_HAS_INT64
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32)-1, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32)-Json::UInt64(1), val.asLargestUInt());
#endif
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_EQUAL("4294967295.50", normalizeFloatingPointStr(val.asString()));

   val = Json::Value(1.2345678901234);
   JSONTEST_ASSERT_STRING_EQUAL( "1.23456789012340", normalizeFloatingPointStr(val.asString()));
}


void
ValueTest::checkConstMemberCount( const Json::Value &value, unsigned int expectedCount )
{
   unsigned int count = 0;
   Json::Value::const_iterator itEnd = value.end();
   for ( Json::Value::const_iterator it = value.begin(); it != itEnd; ++it )
   {
      ++count;
   }
   JSONTEST_ASSERT_EQUAL( expectedCount, count ) << "Json::Value::const_iterator";
}

void
ValueTest::checkMemberCount( Json::Value &value, unsigned int expectedCount )
{
   JSONTEST_ASSERT_EQUAL(expectedCount, value.size() );

   unsigned int count = 0;
   Json::Value::iterator itEnd = value.end();
   for ( Json::Value::iterator it = value.begin(); it != itEnd; ++it )
   {
      ++count;
   }
   JSONTEST_ASSERT_EQUAL( expectedCount, count ) << "Json::Value::iterator";

   JSONTEST_ASSERT_PRED( checkConstMemberCount(value, expectedCount) );
}


ValueTest::IsCheck::IsCheck()
   : isObject_( false )
   , isArray_( false )
   , isBool_( false )
   , isString_( false )
   , isNull_( false )
   , isInt_( false )
   , isInt64_( false )
   , isUInt_( false )
   , isUInt64_( false )
   , isIntegral_( false )
   , isDouble_( false )
   , isNumeric_( false )
{
}


void 
ValueTest::checkIs( const Json::Value &value, const IsCheck &check )
{
   JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject() );
   JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray() );
   JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool() );
   JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble() );
   JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt() );
   JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt() );
   JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral() );
   JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric() );
   JSONTEST_ASSERT_EQUAL(check.isString_, value.isString() );
   JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull() );

#ifdef JSON_HAS_INT64
   JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64() );
   JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64() );
#else
   JSONTEST_ASSERT_EQUAL(false, value.isInt64() );
   JSONTEST_ASSERT_EQUAL(false, value.isUInt64() );
#endif
}

JSONTEST_FIXTURE( ValueTest, compareNull )
{
    JSONTEST_ASSERT_PRED( checkIsEqual( Json::Value(), Json::Value() ) );
}


JSONTEST_FIXTURE( ValueTest, compareInt )
{
    JSONTEST_ASSERT_PRED( checkIsLess( 0, 10 ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( 10, 10 ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( -10, -10 ) );
    JSONTEST_ASSERT_PRED( checkIsLess( -10, 0 ) );
}


JSONTEST_FIXTURE( ValueTest, compareUInt )
{
    JSONTEST_ASSERT_PRED( checkIsLess( 0u, 10u ) );
    JSONTEST_ASSERT_PRED( checkIsLess( 0u, Json::Value::maxUInt ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( 10u, 10u ) );
}


JSONTEST_FIXTURE( ValueTest, compareDouble )
{
    JSONTEST_ASSERT_PRED( checkIsLess( 0.0, 10.0 ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( 10.0, 10.0 ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( -10.0, -10.0 ) );
    JSONTEST_ASSERT_PRED( checkIsLess( -10.0, 0.0 ) );
}


JSONTEST_FIXTURE( ValueTest, compareString )
{
    JSONTEST_ASSERT_PRED( checkIsLess( "", " " ) );
    JSONTEST_ASSERT_PRED( checkIsLess( "", "a" ) );
    JSONTEST_ASSERT_PRED( checkIsLess( "abcd", "zyui" ) );
    JSONTEST_ASSERT_PRED( checkIsLess( "abc", "abcd" ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( "abcd", "abcd" ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( " ", " " ) );
    JSONTEST_ASSERT_PRED( checkIsLess( "ABCD", "abcd" ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( "ABCD", "ABCD" ) );
}


JSONTEST_FIXTURE( ValueTest, compareBoolean )
{
    JSONTEST_ASSERT_PRED( checkIsLess( false, true ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( false, false ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( true, true ) );
}


JSONTEST_FIXTURE( ValueTest, compareArray )
{
    // array compare size then content
    Json::Value emptyArray(Json::arrayValue);
    Json::Value l1aArray;
    l1aArray.append( 0 );
    Json::Value l1bArray;
    l1bArray.append( 10 );
    Json::Value l2aArray;
    l2aArray.append( 0 );
    l2aArray.append( 0 );
    Json::Value l2bArray;
    l2bArray.append( 0 );
    l2bArray.append( 10 );
    JSONTEST_ASSERT_PRED( checkIsLess( emptyArray, l1aArray ) );
    JSONTEST_ASSERT_PRED( checkIsLess( emptyArray, l2aArray ) );
    JSONTEST_ASSERT_PRED( checkIsLess( l1aArray, l2aArray ) );
    JSONTEST_ASSERT_PRED( checkIsLess( l2aArray, l2bArray ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( emptyArray, Json::Value( emptyArray ) ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( l1aArray, Json::Value( l1aArray) ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( l2bArray, Json::Value( l2bArray) ) );
}


JSONTEST_FIXTURE( ValueTest, compareObject )
{
    // object compare size then content
    Json::Value emptyObject(Json::objectValue);
    Json::Value l1aObject;
    l1aObject["key1"] = 0;
    Json::Value l1bObject;
    l1aObject["key1"] = 10;
    Json::Value l2aObject;
    l2aObject["key1"] = 0;
    l2aObject["key2"] = 0;
    JSONTEST_ASSERT_PRED( checkIsLess( emptyObject, l1aObject ) );
    JSONTEST_ASSERT_PRED( checkIsLess( emptyObject, l2aObject ) );
    JSONTEST_ASSERT_PRED( checkIsLess( l1aObject, l2aObject ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( emptyObject, Json::Value( emptyObject ) ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( l1aObject, Json::Value( l1aObject ) ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( l2aObject, Json::Value( l2aObject ) ) );
}


JSONTEST_FIXTURE( ValueTest, compareType )
{
    // object of different type are ordered according to their type
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(), Json::Value(1) ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(1), Json::Value(1u) ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(1u), Json::Value(1.0) ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(1.0), Json::Value("a") ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value("a"), Json::Value(true) ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(true), Json::Value(Json::arrayValue) ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(Json::arrayValue), Json::Value(Json::objectValue) ) );
}


void 
ValueTest::checkIsLess( const Json::Value &x, const Json::Value &y )
{
    JSONTEST_ASSERT( x < y );
    JSONTEST_ASSERT( y > x );
    JSONTEST_ASSERT( x <= y );
    JSONTEST_ASSERT( y >= x );
    JSONTEST_ASSERT( !(x == y) );
    JSONTEST_ASSERT( !(y == x) );
    JSONTEST_ASSERT( !(x >= y) );
    JSONTEST_ASSERT( !(y <= x) );
    JSONTEST_ASSERT( !(x > y) );
    JSONTEST_ASSERT( !(y < x) );
    JSONTEST_ASSERT( x.compare( y ) < 0 );
    JSONTEST_ASSERT( y.compare( x ) >= 0 );
}


void 
ValueTest::checkIsEqual( const Json::Value &x, const Json::Value &y )
{
    JSONTEST_ASSERT( x == y );
    JSONTEST_ASSERT( y == x );
    JSONTEST_ASSERT( x <= y );
    JSONTEST_ASSERT( y <= x );
    JSONTEST_ASSERT( x >= y );
    JSONTEST_ASSERT( y >= x );
    JSONTEST_ASSERT( !(x < y) );
    JSONTEST_ASSERT( !(y < x) );
    JSONTEST_ASSERT( !(x > y) );
    JSONTEST_ASSERT( !(y > x) );
    JSONTEST_ASSERT( x.compare( y ) == 0 );
    JSONTEST_ASSERT( y.compare( x ) == 0 );
}

int main( int argc, const char *argv[] )
{
   JsonTest::Runner runner;
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, checkNormalizeFloatingPointStr );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, memberCount );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, objects );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, arrays );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, null );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, strings );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, bools );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, integers );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, nonIntegers );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareNull );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareInt );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareUInt );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareDouble );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareString );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareBoolean );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareArray );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareObject );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareType );
   return runner.runCommandLine( argc, argv );
}
