From 4f081b50e6d786c187d71ccaa97d45c3b69b18eb Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Wed, 25 May 2011 03:16:49 +0000 Subject: [PATCH] Fixed bugs in asInt64 and asUInt64. --- src/lib_json/json_value.cpp | 4 +-- src/test_lib_json/main.cpp | 61 +++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp index 7c450ba..0819f3e 100644 --- a/src/lib_json/json_value.cpp +++ b/src/lib_json/json_value.cpp @@ -766,7 +766,7 @@ Value::asInt64() const return value_.uint_; case realValue: JSON_ASSERT_MESSAGE( value_.real_ >= minInt64 && value_.real_ <= maxInt64, "Real out of Int64 range" ); - return Int( value_.real_ ); + return Int64( value_.real_ ); case booleanValue: return value_.bool_ ? 1 : 0; case stringValue: @@ -794,7 +794,7 @@ Value::asUInt64() const return value_.uint_; case realValue: JSON_ASSERT_MESSAGE( value_.real_ >= 0 && value_.real_ <= maxUInt64, "Real out of UInt64 range" ); - return UInt( value_.real_ ); + return UInt64( value_.real_ ); case booleanValue: return value_.bool_ ? 1 : 0; case stringValue: diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp index 37393c8..07b1495 100644 --- a/src/test_lib_json/main.cpp +++ b/src/test_lib_json/main.cpp @@ -427,6 +427,67 @@ JSONTEST_FIXTURE( ValueTest, integers ) JSONTEST_ASSERT( double(kuint64max) == val.asDouble()); JSONTEST_ASSERT( float(kuint64max) == val.asFloat()); #else // ifdef JSON_NO_INT64 + // 2^40 (signed constructor arg) + val = Json::Value(1LL << 40); + + checks = IsCheck(); + checks.isInt_ = true; + checks.isNumeric_ = true; + checks.isIntegral_ = true; + JSONTEST_ASSERT_PRED( checkIs( val, checks ) ); + + JSONTEST_ASSERT( (1LL << 40) == val.asInt64()); + JSONTEST_ASSERT( (1LL << 40) == val.asLargestInt()); + JSONTEST_ASSERT( (1LL << 40) == val.asUInt64()); + JSONTEST_ASSERT( (1LL << 40) == val.asLargestUInt()); + JSONTEST_ASSERT( (1LL << 40) == val.asDouble()); + JSONTEST_ASSERT( (1LL << 40) == val.asFloat()); + + // 2^40 (unsigned constructor arg) + val = Json::Value(1ULL << 40); + + checks = IsCheck(); + checks.isUInt_ = true; + checks.isNumeric_ = true; + checks.isIntegral_ = true; + JSONTEST_ASSERT_PRED( checkIs( val, checks ) ); + + JSONTEST_ASSERT( (1LL << 40) == val.asInt64()); + JSONTEST_ASSERT( (1LL << 40) == val.asLargestInt()); + JSONTEST_ASSERT( (1LL << 40) == val.asUInt64()); + JSONTEST_ASSERT( (1LL << 40) == val.asLargestUInt()); + JSONTEST_ASSERT( (1LL << 40) == val.asDouble()); + JSONTEST_ASSERT( (1LL << 40) == val.asFloat()); + + // 2^40 (floating-point constructor arg) + val = Json::Value((1LL << 40) / 1.0); + + checks = IsCheck(); + checks.isDouble_ = true; + checks.isNumeric_ = true; + JSONTEST_ASSERT_PRED( checkIs( val, checks ) ); + + JSONTEST_ASSERT( (1LL << 40) == val.asInt64()); + JSONTEST_ASSERT( (1LL << 40) == val.asLargestInt()); + JSONTEST_ASSERT( (1LL << 40) == val.asUInt64()); + JSONTEST_ASSERT( (1LL << 40) == val.asLargestUInt()); + JSONTEST_ASSERT( (1LL << 40) == val.asDouble()); + JSONTEST_ASSERT( (1LL << 40) == val.asFloat()); + + // -2^40 + val = Json::Value(-(1LL << 40)); + + checks = IsCheck(); + checks.isInt_ = true; + checks.isNumeric_ = true; + checks.isIntegral_ = true; + JSONTEST_ASSERT_PRED( checkIs( val, checks ) ); + + JSONTEST_ASSERT( -(1LL << 40) == val.asInt64()); + JSONTEST_ASSERT( -(1LL << 40) == val.asLargestInt()); + JSONTEST_ASSERT( -(1LL << 40) == val.asDouble()); + JSONTEST_ASSERT( -(1LL << 40) == val.asFloat()); + // int64 max val = Json::Value(Json::Int64(kint64max));