mirror of
https://github.com/open-source-parsers/jsoncpp.git
synced 2025-04-06 10:55:57 +02:00

See #98. http://stackoverflow.com/questions/747470/what-is-the-meaning-of-numeric-limitsdoubledigits10/16941784#16941784
1638 lines
60 KiB
C++
1638 lines
60 KiB
C++
// 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 "jsontest.h"
|
|
#include <json/config.h>
|
|
#include <json/json.h>
|
|
#include <stdexcept>
|
|
|
|
// 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), unsignedInteger_(34567890u),
|
|
smallUnsignedInteger_(Json::Value::UInt(Json::Value::maxInt)),
|
|
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", 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", 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",
|
|
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",
|
|
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.2233720368547758e+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.2233720368547758e+18",
|
|
normalizeFloatingPointStr(val.asString()));
|
|
|
|
// 10^19
|
|
const Json::UInt64 ten_to_19 = static_cast<Json::UInt64>(1e19);
|
|
val = Json::Value(Json::UInt64(ten_to_19));
|
|
|
|
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(ten_to_19, val.asUInt64());
|
|
JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
|
|
JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
|
|
JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
|
|
JSONTEST_ASSERT_EQUAL(true, val.asBool());
|
|
JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
|
|
|
|
// 10^19 (double constructor). Note that 10^19 is not exactly representable
|
|
// as a double.
|
|
val = Json::Value(uint64ToDouble(ten_to_19));
|
|
|
|
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(1e19, val.asDouble());
|
|
JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
|
|
JSONTEST_ASSERT_EQUAL(true, val.asBool());
|
|
JSONTEST_ASSERT_STRING_EQUAL("1e+19",
|
|
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.8446744073709552e+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.5", 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.5", 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.5",
|
|
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.5",
|
|
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.5",
|
|
normalizeFloatingPointStr(val.asString()));
|
|
|
|
val = Json::Value(1.2345678901234);
|
|
JSONTEST_ASSERT_STRING_EQUAL("1.2345678901234001",
|
|
normalizeFloatingPointStr(val.asString()));
|
|
|
|
// A 16-digit floating point number.
|
|
val = Json::Value(2199023255552000.0f);
|
|
JSONTEST_ASSERT_EQUAL(float(2199023255552000), val.asFloat());
|
|
JSONTEST_ASSERT_STRING_EQUAL("2199023255552000",
|
|
normalizeFloatingPointStr(val.asString()));
|
|
|
|
// A very large floating point number.
|
|
val = Json::Value(3.402823466385289e38);
|
|
JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
|
|
JSONTEST_ASSERT_STRING_EQUAL("3.402823466385289e+38",
|
|
normalizeFloatingPointStr(val.asString()));
|
|
|
|
// An even larger floating point number.
|
|
val = Json::Value(1.2345678e300);
|
|
JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
|
|
JSONTEST_ASSERT_STRING_EQUAL("1.2345678e+300",
|
|
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);
|
|
}
|
|
|
|
JSONTEST_FIXTURE(ValueTest, typeChecksThrowExceptions) {
|
|
#if JSON_USE_EXCEPTION
|
|
|
|
Json::Value intVal(1);
|
|
Json::Value strVal("Test");
|
|
Json::Value objVal(Json::objectValue);
|
|
Json::Value arrVal(Json::arrayValue);
|
|
|
|
JSONTEST_ASSERT_THROWS(intVal["test"]);
|
|
JSONTEST_ASSERT_THROWS(strVal["test"]);
|
|
JSONTEST_ASSERT_THROWS(arrVal["test"]);
|
|
|
|
JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
|
|
JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
|
|
JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
|
|
|
|
JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
|
|
JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
|
|
JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
|
|
|
|
JSONTEST_ASSERT_THROWS(intVal[0]);
|
|
JSONTEST_ASSERT_THROWS(objVal[0]);
|
|
JSONTEST_ASSERT_THROWS(strVal[0]);
|
|
|
|
JSONTEST_ASSERT_THROWS(intVal.clear());
|
|
|
|
JSONTEST_ASSERT_THROWS(intVal.resize(1));
|
|
JSONTEST_ASSERT_THROWS(strVal.resize(1));
|
|
JSONTEST_ASSERT_THROWS(objVal.resize(1));
|
|
|
|
JSONTEST_ASSERT_THROWS(intVal.asCString());
|
|
|
|
JSONTEST_ASSERT_THROWS(objVal.asString());
|
|
JSONTEST_ASSERT_THROWS(arrVal.asString());
|
|
|
|
JSONTEST_ASSERT_THROWS(strVal.asInt());
|
|
JSONTEST_ASSERT_THROWS(objVal.asInt());
|
|
JSONTEST_ASSERT_THROWS(arrVal.asInt());
|
|
|
|
JSONTEST_ASSERT_THROWS(strVal.asUInt());
|
|
JSONTEST_ASSERT_THROWS(objVal.asUInt());
|
|
JSONTEST_ASSERT_THROWS(arrVal.asUInt());
|
|
|
|
JSONTEST_ASSERT_THROWS(strVal.asInt64());
|
|
JSONTEST_ASSERT_THROWS(objVal.asInt64());
|
|
JSONTEST_ASSERT_THROWS(arrVal.asInt64());
|
|
|
|
JSONTEST_ASSERT_THROWS(strVal.asUInt64());
|
|
JSONTEST_ASSERT_THROWS(objVal.asUInt64());
|
|
JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
|
|
|
|
JSONTEST_ASSERT_THROWS(strVal.asDouble());
|
|
JSONTEST_ASSERT_THROWS(objVal.asDouble());
|
|
JSONTEST_ASSERT_THROWS(arrVal.asDouble());
|
|
|
|
JSONTEST_ASSERT_THROWS(strVal.asFloat());
|
|
JSONTEST_ASSERT_THROWS(objVal.asFloat());
|
|
JSONTEST_ASSERT_THROWS(arrVal.asFloat());
|
|
|
|
JSONTEST_ASSERT_THROWS(strVal.asBool());
|
|
JSONTEST_ASSERT_THROWS(objVal.asBool());
|
|
JSONTEST_ASSERT_THROWS(arrVal.asBool());
|
|
|
|
#endif
|
|
}
|
|
|
|
JSONTEST_FIXTURE(ValueTest, offsetAccessors) {
|
|
Json::Value x;
|
|
JSONTEST_ASSERT(x.getOffsetStart() == 0);
|
|
JSONTEST_ASSERT(x.getOffsetLimit() == 0);
|
|
x.setOffsetStart(10);
|
|
x.setOffsetLimit(20);
|
|
JSONTEST_ASSERT(x.getOffsetStart() == 10);
|
|
JSONTEST_ASSERT(x.getOffsetLimit() == 20);
|
|
Json::Value y(x);
|
|
JSONTEST_ASSERT(y.getOffsetStart() == 10);
|
|
JSONTEST_ASSERT(y.getOffsetLimit() == 20);
|
|
Json::Value z;
|
|
z.swap(y);
|
|
JSONTEST_ASSERT(z.getOffsetStart() == 10);
|
|
JSONTEST_ASSERT(z.getOffsetLimit() == 20);
|
|
JSONTEST_ASSERT(y.getOffsetStart() == 0);
|
|
JSONTEST_ASSERT(y.getOffsetLimit() == 0);
|
|
}
|
|
|
|
struct WriterTest : JsonTest::TestCase {};
|
|
|
|
JSONTEST_FIXTURE(WriterTest, dropNullPlaceholders) {
|
|
Json::FastWriter writer;
|
|
Json::Value nullValue;
|
|
JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
|
|
|
|
writer.dropNullPlaceholders();
|
|
JSONTEST_ASSERT(writer.write(nullValue) == "\n");
|
|
}
|
|
|
|
struct ReaderTest : JsonTest::TestCase {};
|
|
|
|
JSONTEST_FIXTURE(ReaderTest, parseWithNoErrors) {
|
|
Json::Reader reader;
|
|
Json::Value root;
|
|
bool ok = reader.parse("{ \"property\" : \"value\" }", root);
|
|
JSONTEST_ASSERT(ok);
|
|
JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
|
|
JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
|
|
}
|
|
|
|
JSONTEST_FIXTURE(ReaderTest, parseWithNoErrorsTestingOffsets) {
|
|
Json::Reader reader;
|
|
Json::Value root;
|
|
bool ok = reader.parse("{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
|
|
"{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
|
|
"null, \"false\" : false }",
|
|
root);
|
|
JSONTEST_ASSERT(ok);
|
|
JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
|
|
JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
|
|
JSONTEST_ASSERT(root["property"].getOffsetStart() == 15);
|
|
JSONTEST_ASSERT(root["property"].getOffsetLimit() == 34);
|
|
JSONTEST_ASSERT(root["property"][0].getOffsetStart() == 16);
|
|
JSONTEST_ASSERT(root["property"][0].getOffsetLimit() == 23);
|
|
JSONTEST_ASSERT(root["property"][1].getOffsetStart() == 25);
|
|
JSONTEST_ASSERT(root["property"][1].getOffsetLimit() == 33);
|
|
JSONTEST_ASSERT(root["obj"].getOffsetStart() == 44);
|
|
JSONTEST_ASSERT(root["obj"].getOffsetLimit() == 76);
|
|
JSONTEST_ASSERT(root["obj"]["nested"].getOffsetStart() == 57);
|
|
JSONTEST_ASSERT(root["obj"]["nested"].getOffsetLimit() == 60);
|
|
JSONTEST_ASSERT(root["obj"]["bool"].getOffsetStart() == 71);
|
|
JSONTEST_ASSERT(root["obj"]["bool"].getOffsetLimit() == 75);
|
|
JSONTEST_ASSERT(root["null"].getOffsetStart() == 87);
|
|
JSONTEST_ASSERT(root["null"].getOffsetLimit() == 91);
|
|
JSONTEST_ASSERT(root["false"].getOffsetStart() == 103);
|
|
JSONTEST_ASSERT(root["false"].getOffsetLimit() == 108);
|
|
JSONTEST_ASSERT(root.getOffsetStart() == 0);
|
|
JSONTEST_ASSERT(root.getOffsetLimit() == 110);
|
|
}
|
|
|
|
JSONTEST_FIXTURE(ReaderTest, parseWithOneError) {
|
|
Json::Reader reader;
|
|
Json::Value root;
|
|
bool ok = reader.parse("{ \"property\" :: \"value\" }", root);
|
|
JSONTEST_ASSERT(!ok);
|
|
JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
|
|
"* Line 1, Column 15\n Syntax error: value, object or array "
|
|
"expected.\n");
|
|
std::vector<Json::Reader::StructuredError> errors =
|
|
reader.getStructuredErrors();
|
|
JSONTEST_ASSERT(errors.size() == 1);
|
|
JSONTEST_ASSERT(errors.at(0).offset_start == 14);
|
|
JSONTEST_ASSERT(errors.at(0).offset_limit == 15);
|
|
JSONTEST_ASSERT(errors.at(0).message ==
|
|
"Syntax error: value, object or array expected.");
|
|
}
|
|
|
|
JSONTEST_FIXTURE(ReaderTest, parseChineseWithOneError) {
|
|
Json::Reader reader;
|
|
Json::Value root;
|
|
bool ok = reader.parse("{ \"pr佐藤erty\" :: \"value\" }", root);
|
|
JSONTEST_ASSERT(!ok);
|
|
JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
|
|
"* Line 1, Column 19\n Syntax error: value, object or array "
|
|
"expected.\n");
|
|
std::vector<Json::Reader::StructuredError> errors =
|
|
reader.getStructuredErrors();
|
|
JSONTEST_ASSERT(errors.size() == 1);
|
|
JSONTEST_ASSERT(errors.at(0).offset_start == 18);
|
|
JSONTEST_ASSERT(errors.at(0).offset_limit == 19);
|
|
JSONTEST_ASSERT(errors.at(0).message ==
|
|
"Syntax error: value, object or array expected.");
|
|
}
|
|
|
|
JSONTEST_FIXTURE(ReaderTest, parseWithDetailError) {
|
|
Json::Reader reader;
|
|
Json::Value root;
|
|
bool ok = reader.parse("{ \"property\" : \"v\\alue\" }", root);
|
|
JSONTEST_ASSERT(!ok);
|
|
JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
|
|
"* Line 1, Column 16\n Bad escape sequence in string\nSee "
|
|
"Line 1, Column 20 for detail.\n");
|
|
std::vector<Json::Reader::StructuredError> errors =
|
|
reader.getStructuredErrors();
|
|
JSONTEST_ASSERT(errors.size() == 1);
|
|
JSONTEST_ASSERT(errors.at(0).offset_start == 15);
|
|
JSONTEST_ASSERT(errors.at(0).offset_limit == 23);
|
|
JSONTEST_ASSERT(errors.at(0).message == "Bad escape sequence in string");
|
|
}
|
|
|
|
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);
|
|
JSONTEST_REGISTER_FIXTURE(runner, ValueTest, offsetAccessors);
|
|
JSONTEST_REGISTER_FIXTURE(runner, ValueTest, typeChecksThrowExceptions);
|
|
|
|
JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithNoErrors);
|
|
JSONTEST_REGISTER_FIXTURE(
|
|
runner, ReaderTest, parseWithNoErrorsTestingOffsets);
|
|
JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithOneError);
|
|
JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseChineseWithOneError);
|
|
JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithDetailError);
|
|
|
|
JSONTEST_REGISTER_FIXTURE(runner, WriterTest, dropNullPlaceholders);
|
|
|
|
return runner.runCommandLine(argc, argv);
|
|
}
|