blob: 13fc21df5f6f9e525ff58d87a558d06d2707c8fb [file] [log] [blame]
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001// Copyright 2007-2010 Baptiste Lepilleur
2// Distributed under MIT license, or public domain if desired and
3// recognized in your jurisdiction.
4// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
5
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05006#include "jsontest.h"
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04007#include <json/config.h>
8#include <json/json.h>
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05009#include <stdexcept>
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040010
11// Make numeric limits more convenient to talk about.
12// Assumes int type in 32 bits.
13#define kint32max Json::Value::maxInt
14#define kint32min Json::Value::minInt
15#define kuint32max Json::Value::maxUInt
16#define kint64max Json::Value::maxInt64
17#define kint64min Json::Value::minInt64
18#define kuint64max Json::Value::maxUInt64
19
20static const double kdint64max = double(kint64max);
21static const float kfint64max = float(kint64max);
22static const float kfint32max = float(kint32max);
23static const float kfuint32max = float(kuint32max);
24
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040025// //////////////////////////////////////////////////////////////////
26// //////////////////////////////////////////////////////////////////
27// Json Library test cases
28// //////////////////////////////////////////////////////////////////
29// //////////////////////////////////////////////////////////////////
30
31#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050032static inline double uint64ToDouble(Json::UInt64 value) {
33 return static_cast<double>(value);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040034}
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050035#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
36static inline double uint64ToDouble(Json::UInt64 value) {
37 return static_cast<double>(Json::Int64(value / 2)) * 2.0 +
38 Json::Int64(value & 1);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040039}
40#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
41
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050042struct ValueTest : JsonTest::TestCase {
43 Json::Value null_;
44 Json::Value emptyArray_;
45 Json::Value emptyObject_;
46 Json::Value integer_;
47 Json::Value unsignedInteger_;
48 Json::Value smallUnsignedInteger_;
49 Json::Value real_;
50 Json::Value float_;
51 Json::Value array1_;
52 Json::Value object1_;
53 Json::Value emptyString_;
54 Json::Value string1_;
55 Json::Value string_;
56 Json::Value true_;
57 Json::Value false_;
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040058
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050059 ValueTest()
60 : emptyArray_(Json::arrayValue), emptyObject_(Json::objectValue),
61 integer_(123456789), unsignedInteger_(34567890u),
62 smallUnsignedInteger_(Json::Value::UInt(Json::Value::maxInt)),
63 real_(1234.56789), float_(0.00390625f), emptyString_(""), string1_("a"),
64 string_("sometext with space"), true_(true), false_(false) {
65 array1_.append(1234);
66 object1_["id"] = 1234;
67 }
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040068
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050069 struct IsCheck {
70 /// Initialize all checks to \c false by default.
71 IsCheck();
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040072
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050073 bool isObject_;
74 bool isArray_;
75 bool isBool_;
76 bool isString_;
77 bool isNull_;
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040078
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050079 bool isInt_;
80 bool isInt64_;
81 bool isUInt_;
82 bool isUInt64_;
83 bool isIntegral_;
84 bool isDouble_;
85 bool isNumeric_;
86 };
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040087
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050088 void checkConstMemberCount(const Json::Value& value,
89 unsigned int expectedCount);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040090
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050091 void checkMemberCount(Json::Value& value, unsigned int expectedCount);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040092
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050093 void checkIs(const Json::Value& value, const IsCheck& check);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040094
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050095 void checkIsLess(const Json::Value& x, const Json::Value& y);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040096
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050097 void checkIsEqual(const Json::Value& x, const Json::Value& y);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -040098
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -050099 /// Normalize the representation of floating-point number by stripped leading
100 /// 0 in exponent.
101 static std::string normalizeFloatingPointStr(const std::string& s);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400102};
103
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500104std::string ValueTest::normalizeFloatingPointStr(const std::string& s) {
105 std::string::size_type index = s.find_last_of("eE");
106 if (index != std::string::npos) {
107 std::string::size_type hasSign =
108 (s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
109 std::string::size_type exponentStartIndex = index + 1 + hasSign;
110 std::string normalized = s.substr(0, exponentStartIndex);
111 std::string::size_type indexDigit =
112 s.find_first_not_of('0', exponentStartIndex);
113 std::string exponent = "0";
114 if (indexDigit !=
115 std::string::npos) // There is an exponent different from 0
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400116 {
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500117 exponent = s.substr(indexDigit);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400118 }
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500119 return normalized + exponent;
120 }
121 return s;
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400122}
123
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500124JSONTEST_FIXTURE(ValueTest, checkNormalizeFloatingPointStr) {
125 JSONTEST_ASSERT_STRING_EQUAL("0.0", normalizeFloatingPointStr("0.0"));
126 JSONTEST_ASSERT_STRING_EQUAL("0e0", normalizeFloatingPointStr("0e0"));
127 JSONTEST_ASSERT_STRING_EQUAL("1234.0", normalizeFloatingPointStr("1234.0"));
128 JSONTEST_ASSERT_STRING_EQUAL("1234.0e0",
129 normalizeFloatingPointStr("1234.0e0"));
130 JSONTEST_ASSERT_STRING_EQUAL("1234.0e+0",
131 normalizeFloatingPointStr("1234.0e+0"));
132 JSONTEST_ASSERT_STRING_EQUAL("1234e-1", normalizeFloatingPointStr("1234e-1"));
133 JSONTEST_ASSERT_STRING_EQUAL("1234e10", normalizeFloatingPointStr("1234e10"));
134 JSONTEST_ASSERT_STRING_EQUAL("1234e10",
135 normalizeFloatingPointStr("1234e010"));
136 JSONTEST_ASSERT_STRING_EQUAL("1234e+10",
137 normalizeFloatingPointStr("1234e+010"));
138 JSONTEST_ASSERT_STRING_EQUAL("1234e-10",
139 normalizeFloatingPointStr("1234e-010"));
140 JSONTEST_ASSERT_STRING_EQUAL("1234e+100",
141 normalizeFloatingPointStr("1234e+100"));
142 JSONTEST_ASSERT_STRING_EQUAL("1234e-100",
143 normalizeFloatingPointStr("1234e-100"));
144 JSONTEST_ASSERT_STRING_EQUAL("1234e+1",
145 normalizeFloatingPointStr("1234e+001"));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400146}
147
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500148JSONTEST_FIXTURE(ValueTest, memberCount) {
149 JSONTEST_ASSERT_PRED(checkMemberCount(emptyArray_, 0));
150 JSONTEST_ASSERT_PRED(checkMemberCount(emptyObject_, 0));
151 JSONTEST_ASSERT_PRED(checkMemberCount(array1_, 1));
152 JSONTEST_ASSERT_PRED(checkMemberCount(object1_, 1));
153 JSONTEST_ASSERT_PRED(checkMemberCount(null_, 0));
154 JSONTEST_ASSERT_PRED(checkMemberCount(integer_, 0));
155 JSONTEST_ASSERT_PRED(checkMemberCount(unsignedInteger_, 0));
156 JSONTEST_ASSERT_PRED(checkMemberCount(smallUnsignedInteger_, 0));
157 JSONTEST_ASSERT_PRED(checkMemberCount(real_, 0));
158 JSONTEST_ASSERT_PRED(checkMemberCount(emptyString_, 0));
159 JSONTEST_ASSERT_PRED(checkMemberCount(string_, 0));
160 JSONTEST_ASSERT_PRED(checkMemberCount(true_, 0));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400161}
162
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500163JSONTEST_FIXTURE(ValueTest, objects) {
164 // Types
165 IsCheck checks;
166 checks.isObject_ = true;
167 JSONTEST_ASSERT_PRED(checkIs(emptyObject_, checks));
168 JSONTEST_ASSERT_PRED(checkIs(object1_, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400169
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500170 JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400171
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500172 // Empty object okay
173 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400174
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500175 // Non-empty object not okay
176 JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400177
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500178 // Always okay
179 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400180
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500181 // Never okay
182 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
183 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
184 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
185 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
186 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
187 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400188
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500189 // Access through const reference
190 const Json::Value& constObject = object1_;
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400191
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500192 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
193 JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400194
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500195 // Access through non-const reference
196 JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
197 JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400198
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500199 object1_["some other id"] = "foo";
200 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400201}
202
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500203JSONTEST_FIXTURE(ValueTest, arrays) {
204 const unsigned int index0 = 0;
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400205
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500206 // Types
207 IsCheck checks;
208 checks.isArray_ = true;
209 JSONTEST_ASSERT_PRED(checkIs(emptyArray_, checks));
210 JSONTEST_ASSERT_PRED(checkIs(array1_, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400211
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500212 JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400213
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500214 // Empty array okay
215 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400216
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500217 // Non-empty array not okay
218 JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400219
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500220 // Always okay
221 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400222
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500223 // Never okay
224 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
225 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
226 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
227 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
228 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
229 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400230
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500231 // Access through const reference
232 const Json::Value& constArray = array1_;
233 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
234 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400235
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500236 // Access through non-const reference
237 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
238 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400239
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500240 array1_[2] = Json::Value(17);
241 JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
242 JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400243}
244
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500245JSONTEST_FIXTURE(ValueTest, null) {
246 JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400247
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500248 IsCheck checks;
249 checks.isNull_ = true;
250 JSONTEST_ASSERT_PRED(checkIs(null_, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400251
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500252 JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
253 JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
254 JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
255 JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
256 JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
257 JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
258 JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
259 JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400260
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500261 JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
262 JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
263 JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
264 JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
265 JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
266 JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
267 JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400268}
269
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500270JSONTEST_FIXTURE(ValueTest, strings) {
271 JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400272
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500273 IsCheck checks;
274 checks.isString_ = true;
275 JSONTEST_ASSERT_PRED(checkIs(emptyString_, checks));
276 JSONTEST_ASSERT_PRED(checkIs(string_, checks));
277 JSONTEST_ASSERT_PRED(checkIs(string1_, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400278
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500279 // Empty string okay
280 JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400281
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500282 // Non-empty string not okay
283 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400284
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500285 // Always okay
286 JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400287
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500288 // Never okay
289 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
290 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
291 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
292 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
293 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400294
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500295 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
296 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400297}
298
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500299JSONTEST_FIXTURE(ValueTest, bools) {
300 JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400301
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500302 IsCheck checks;
303 checks.isBool_ = true;
304 JSONTEST_ASSERT_PRED(checkIs(false_, checks));
305 JSONTEST_ASSERT_PRED(checkIs(true_, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400306
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500307 // False okay
308 JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400309
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500310 // True not okay
311 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400312
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500313 // Always okay
314 JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
315 JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
316 JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
317 JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
318 JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400319
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500320 // Never okay
321 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
322 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400323
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500324 JSONTEST_ASSERT_EQUAL(true, true_.asBool());
325 JSONTEST_ASSERT_EQUAL(1, true_.asInt());
326 JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
327 JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
328 JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
329 JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
330 JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400331
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500332 JSONTEST_ASSERT_EQUAL(false, false_.asBool());
333 JSONTEST_ASSERT_EQUAL(0, false_.asInt());
334 JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
335 JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
336 JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
337 JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
338 JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400339}
340
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500341JSONTEST_FIXTURE(ValueTest, integers) {
342 IsCheck checks;
343 Json::Value val;
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400344
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500345 // Conversions that don't depend on the value.
346 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
347 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
348 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
349 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
350 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400351
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500352 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
353 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
354 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
355 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
356 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400357
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500358 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
359 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
360 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
361 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
362 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400363
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500364 // Default int
365 val = Json::Value(Json::intValue);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400366
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500367 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400368
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500369 checks = IsCheck();
370 checks.isInt_ = true;
371 checks.isInt64_ = true;
372 checks.isUInt_ = true;
373 checks.isUInt64_ = true;
374 checks.isIntegral_ = true;
375 checks.isDouble_ = true;
376 checks.isNumeric_ = true;
377 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400378
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500379 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
380 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
381 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400382
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500383 JSONTEST_ASSERT_EQUAL(0, val.asInt());
384 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
385 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
386 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
387 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
388 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
389 JSONTEST_ASSERT_EQUAL(false, val.asBool());
390 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400391
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500392 // Default uint
393 val = Json::Value(Json::uintValue);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400394
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500395 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400396
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500397 checks = IsCheck();
398 checks.isInt_ = true;
399 checks.isInt64_ = true;
400 checks.isUInt_ = true;
401 checks.isUInt64_ = true;
402 checks.isIntegral_ = true;
403 checks.isDouble_ = true;
404 checks.isNumeric_ = true;
405 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400406
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500407 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
408 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
409 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400410
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500411 JSONTEST_ASSERT_EQUAL(0, val.asInt());
412 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
413 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
414 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
415 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
416 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
417 JSONTEST_ASSERT_EQUAL(false, val.asBool());
418 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400419
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500420 // Default real
421 val = Json::Value(Json::realValue);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400422
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500423 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400424
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500425 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
426 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
427 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400428
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500429 checks = IsCheck();
430 checks.isInt_ = true;
431 checks.isInt64_ = true;
432 checks.isUInt_ = true;
433 checks.isUInt64_ = true;
434 checks.isIntegral_ = true;
435 checks.isDouble_ = true;
436 checks.isNumeric_ = true;
437 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400438
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500439 JSONTEST_ASSERT_EQUAL(0, val.asInt());
440 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
441 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
442 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
443 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
444 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
445 JSONTEST_ASSERT_EQUAL(false, val.asBool());
446 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400447
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500448 // Zero (signed constructor arg)
449 val = Json::Value(0);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400450
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500451 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400452
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500453 checks = IsCheck();
454 checks.isInt_ = true;
455 checks.isInt64_ = true;
456 checks.isUInt_ = true;
457 checks.isUInt64_ = true;
458 checks.isIntegral_ = true;
459 checks.isDouble_ = true;
460 checks.isNumeric_ = true;
461 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400462
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500463 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
464 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
465 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400466
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500467 JSONTEST_ASSERT_EQUAL(0, val.asInt());
468 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
469 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
470 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
471 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
472 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
473 JSONTEST_ASSERT_EQUAL(false, val.asBool());
474 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400475
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500476 // Zero (unsigned constructor arg)
477 val = Json::Value(0u);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400478
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500479 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400480
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500481 checks = IsCheck();
482 checks.isInt_ = true;
483 checks.isInt64_ = true;
484 checks.isUInt_ = true;
485 checks.isUInt64_ = true;
486 checks.isIntegral_ = true;
487 checks.isDouble_ = true;
488 checks.isNumeric_ = true;
489 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400490
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500491 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
492 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
493 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400494
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500495 JSONTEST_ASSERT_EQUAL(0, val.asInt());
496 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
497 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
498 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
499 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
500 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
501 JSONTEST_ASSERT_EQUAL(false, val.asBool());
502 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400503
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500504 // Zero (floating-point constructor arg)
505 val = Json::Value(0.0);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400506
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500507 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400508
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500509 checks = IsCheck();
510 checks.isInt_ = true;
511 checks.isInt64_ = true;
512 checks.isUInt_ = true;
513 checks.isUInt64_ = true;
514 checks.isIntegral_ = true;
515 checks.isDouble_ = true;
516 checks.isNumeric_ = true;
517 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400518
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500519 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
520 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
521 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400522
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500523 JSONTEST_ASSERT_EQUAL(0, val.asInt());
524 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
525 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
526 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
527 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
528 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
529 JSONTEST_ASSERT_EQUAL(false, val.asBool());
530 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400531
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500532 // 2^20 (signed constructor arg)
533 val = Json::Value(1 << 20);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400534
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500535 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
536 checks = IsCheck();
537 checks.isInt_ = true;
538 checks.isInt64_ = true;
539 checks.isUInt_ = true;
540 checks.isUInt64_ = true;
541 checks.isIntegral_ = true;
542 checks.isDouble_ = true;
543 checks.isNumeric_ = true;
544 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400545
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500546 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
547 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
548 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400549
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500550 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
551 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
552 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
553 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
554 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
555 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
556 JSONTEST_ASSERT_EQUAL(true, val.asBool());
557 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400558
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500559 // 2^20 (unsigned constructor arg)
560 val = Json::Value(Json::UInt(1 << 20));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400561
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500562 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400563
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500564 checks = IsCheck();
565 checks.isInt_ = true;
566 checks.isInt64_ = true;
567 checks.isUInt_ = true;
568 checks.isUInt64_ = true;
569 checks.isIntegral_ = true;
570 checks.isDouble_ = true;
571 checks.isNumeric_ = true;
572 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400573
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500574 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
575 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
576 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400577
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500578 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
579 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
580 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
581 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
582 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
583 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
584 JSONTEST_ASSERT_EQUAL(true, val.asBool());
585 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400586
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500587 // 2^20 (floating-point constructor arg)
588 val = Json::Value((1 << 20) / 1.0);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400589
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500590 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400591
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500592 checks = IsCheck();
593 checks.isInt_ = true;
594 checks.isInt64_ = true;
595 checks.isUInt_ = true;
596 checks.isUInt64_ = true;
597 checks.isIntegral_ = true;
598 checks.isDouble_ = true;
599 checks.isNumeric_ = true;
600 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400601
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500602 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
603 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
604 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400605
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500606 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
607 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
608 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
609 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
610 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
611 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
612 JSONTEST_ASSERT_EQUAL(true, val.asBool());
613 JSONTEST_ASSERT_STRING_EQUAL("1048576",
614 normalizeFloatingPointStr(val.asString()));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400615
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500616 // -2^20
617 val = Json::Value(-(1 << 20));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400618
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500619 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400620
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500621 checks = IsCheck();
622 checks.isInt_ = true;
623 checks.isInt64_ = true;
624 checks.isIntegral_ = true;
625 checks.isDouble_ = true;
626 checks.isNumeric_ = true;
627 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400628
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500629 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
630 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
631 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400632
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500633 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
634 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
635 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
636 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
637 JSONTEST_ASSERT_EQUAL(true, val.asBool());
638 JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400639
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500640 // int32 max
641 val = Json::Value(kint32max);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400642
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500643 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400644
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500645 checks = IsCheck();
646 checks.isInt_ = true;
647 checks.isInt64_ = true;
648 checks.isUInt_ = true;
649 checks.isUInt64_ = true;
650 checks.isIntegral_ = true;
651 checks.isDouble_ = true;
652 checks.isNumeric_ = true;
653 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400654
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500655 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
656 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
657 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400658
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500659 JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
660 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
661 JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
662 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
663 JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
664 JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
665 JSONTEST_ASSERT_EQUAL(true, val.asBool());
666 JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400667
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500668 // int32 min
669 val = Json::Value(kint32min);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400670
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500671 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400672
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500673 checks = IsCheck();
674 checks.isInt_ = true;
675 checks.isInt64_ = true;
676 checks.isIntegral_ = true;
677 checks.isDouble_ = true;
678 checks.isNumeric_ = true;
679 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400680
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500681 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
682 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
683 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400684
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500685 JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
686 JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
687 JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
688 JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
689 JSONTEST_ASSERT_EQUAL(true, val.asBool());
690 JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400691
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500692 // uint32 max
693 val = Json::Value(kuint32max);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400694
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500695 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400696
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500697 checks = IsCheck();
698 checks.isInt64_ = true;
699 checks.isUInt_ = true;
700 checks.isUInt64_ = true;
701 checks.isIntegral_ = true;
702 checks.isDouble_ = true;
703 checks.isNumeric_ = true;
704 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400705
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500706 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
707 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
708 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400709
710#ifndef JSON_NO_INT64
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500711 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400712#endif
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500713 JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
714 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
715 JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
716 JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
717 JSONTEST_ASSERT_EQUAL(true, val.asBool());
718 JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400719
720#ifdef JSON_NO_INT64
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500721 // int64 max
722 val = Json::Value(double(kint64max));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400723
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500724 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400725
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500726 checks = IsCheck();
727 checks.isDouble_ = true;
728 checks.isNumeric_ = true;
729 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400730
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500731 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
732 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
733 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400734
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500735 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
736 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
737 JSONTEST_ASSERT_EQUAL(true, val.asBool());
738 JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400739
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500740 // int64 min
741 val = Json::Value(double(kint64min));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400742
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500743 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400744
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500745 checks = IsCheck();
746 checks.isDouble_ = true;
747 checks.isNumeric_ = true;
748 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400749
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500750 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
751 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
752 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400753
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500754 JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
755 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
756 JSONTEST_ASSERT_EQUAL(true, val.asBool());
757 JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400758
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500759 // uint64 max
760 val = Json::Value(double(kuint64max));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400761
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500762 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400763
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500764 checks = IsCheck();
765 checks.isDouble_ = true;
766 checks.isNumeric_ = true;
767 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400768
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500769 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
770 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
771 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400772
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500773 JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
774 JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
775 JSONTEST_ASSERT_EQUAL(true, val.asBool());
776 JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
777#else // ifdef JSON_NO_INT64
778 // 2^40 (signed constructor arg)
779 val = Json::Value(Json::Int64(1) << 40);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400780
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500781 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400782
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500783 checks = IsCheck();
784 checks.isInt64_ = true;
785 checks.isUInt64_ = true;
786 checks.isIntegral_ = true;
787 checks.isDouble_ = true;
788 checks.isNumeric_ = true;
789 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400790
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500791 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
792 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
793 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400794
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500795 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
796 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
797 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
798 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
799 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
800 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
801 JSONTEST_ASSERT_EQUAL(true, val.asBool());
802 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400803
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500804 // 2^40 (unsigned constructor arg)
805 val = Json::Value(Json::UInt64(1) << 40);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400806
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500807 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400808
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500809 checks = IsCheck();
810 checks.isInt64_ = true;
811 checks.isUInt64_ = true;
812 checks.isIntegral_ = true;
813 checks.isDouble_ = true;
814 checks.isNumeric_ = true;
815 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400816
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500817 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
818 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
819 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400820
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500821 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
822 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
823 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
824 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
825 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
826 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
827 JSONTEST_ASSERT_EQUAL(true, val.asBool());
828 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400829
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500830 // 2^40 (floating-point constructor arg)
831 val = Json::Value((Json::Int64(1) << 40) / 1.0);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400832
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500833 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400834
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500835 checks = IsCheck();
836 checks.isInt64_ = true;
837 checks.isUInt64_ = true;
838 checks.isIntegral_ = true;
839 checks.isDouble_ = true;
840 checks.isNumeric_ = true;
841 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400842
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500843 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
844 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
845 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400846
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500847 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
848 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
849 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
850 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
851 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
852 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
853 JSONTEST_ASSERT_EQUAL(true, val.asBool());
854 JSONTEST_ASSERT_STRING_EQUAL("1099511627776",
855 normalizeFloatingPointStr(val.asString()));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400856
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500857 // -2^40
858 val = Json::Value(-(Json::Int64(1) << 40));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400859
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500860 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400861
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500862 checks = IsCheck();
863 checks.isInt64_ = true;
864 checks.isIntegral_ = true;
865 checks.isDouble_ = true;
866 checks.isNumeric_ = true;
867 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400868
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500869 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
870 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
871 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400872
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500873 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
874 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
875 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
876 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
877 JSONTEST_ASSERT_EQUAL(true, val.asBool());
878 JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400879
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500880 // int64 max
881 val = Json::Value(Json::Int64(kint64max));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400882
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500883 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400884
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500885 checks = IsCheck();
886 checks.isInt64_ = true;
887 checks.isUInt64_ = true;
888 checks.isIntegral_ = true;
889 checks.isDouble_ = true;
890 checks.isNumeric_ = true;
891 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400892
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500893 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
894 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
895 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400896
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500897 JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
898 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
899 JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
900 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
901 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
902 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
903 JSONTEST_ASSERT_EQUAL(true, val.asBool());
904 JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400905
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500906 // int64 max (floating point constructor). Note that kint64max is not exactly
907 // representable as a double, and will be rounded up to be higher.
908 val = Json::Value(double(kint64max));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400909
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500910 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400911
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500912 checks = IsCheck();
913 checks.isUInt64_ = true;
914 checks.isIntegral_ = true;
915 checks.isDouble_ = true;
916 checks.isNumeric_ = true;
917 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400918
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500919 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
920 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
921 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400922
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500923 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
924 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
925 JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
926 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(Json::UInt64(1) << 63)),
927 val.asFloat());
928 JSONTEST_ASSERT_EQUAL(true, val.asBool());
929 JSONTEST_ASSERT_STRING_EQUAL("9.223372036854776e+18",
930 normalizeFloatingPointStr(val.asString()));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400931
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500932 // int64 min
933 val = Json::Value(Json::Int64(kint64min));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400934
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500935 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400936
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500937 checks = IsCheck();
938 checks.isInt64_ = true;
939 checks.isIntegral_ = true;
940 checks.isDouble_ = true;
941 checks.isNumeric_ = true;
942 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400943
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500944 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
945 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
946 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400947
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500948 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
949 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
950 JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
951 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
952 JSONTEST_ASSERT_EQUAL(true, val.asBool());
953 JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400954
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500955 // int64 min (floating point constructor). Note that kint64min *is* exactly
956 // representable as a double.
957 val = Json::Value(double(kint64min));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400958
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500959 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400960
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500961 checks = IsCheck();
962 checks.isInt64_ = true;
963 checks.isIntegral_ = true;
964 checks.isDouble_ = true;
965 checks.isNumeric_ = true;
966 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400967
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500968 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
969 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
970 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400971
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500972 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
973 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
974 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
975 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
976 JSONTEST_ASSERT_EQUAL(true, val.asBool());
977 JSONTEST_ASSERT_STRING_EQUAL("-9.223372036854776e+18",
978 normalizeFloatingPointStr(val.asString()));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400979
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500980 // 10^19
981 const Json::UInt64 ten_to_19 = static_cast<Json::UInt64>(1e19);
982 val = Json::Value(Json::UInt64(ten_to_19));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400983
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500984 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400985
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500986 checks = IsCheck();
987 checks.isUInt64_ = true;
988 checks.isIntegral_ = true;
989 checks.isDouble_ = true;
990 checks.isNumeric_ = true;
991 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400992
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500993 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
994 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
995 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -0400996
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -0500997 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
998 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
999 JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
1000 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
1001 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1002 JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001003
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001004 // 10^19 (double constructor). Note that 10^19 is not exactly representable
1005 // as a double.
1006 val = Json::Value(uint64ToDouble(ten_to_19));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001007
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001008 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001009
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001010 checks = IsCheck();
1011 checks.isUInt64_ = true;
1012 checks.isIntegral_ = true;
1013 checks.isDouble_ = true;
1014 checks.isNumeric_ = true;
1015 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001016
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001017 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1018 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1019 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001020
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001021 JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
1022 JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
1023 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1024 JSONTEST_ASSERT_STRING_EQUAL("1e+19",
1025 normalizeFloatingPointStr(val.asString()));
1026
1027 // uint64 max
1028 val = Json::Value(Json::UInt64(kuint64max));
1029
1030 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1031
1032 checks = IsCheck();
1033 checks.isUInt64_ = true;
1034 checks.isIntegral_ = true;
1035 checks.isDouble_ = true;
1036 checks.isNumeric_ = true;
1037 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1038
1039 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1040 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1041 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1042
1043 JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
1044 JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
1045 JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
1046 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
1047 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1048 JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
1049
1050 // uint64 max (floating point constructor). Note that kuint64max is not
1051 // exactly representable as a double, and will be rounded up to be higher.
1052 val = Json::Value(uint64ToDouble(kuint64max));
1053
1054 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1055
1056 checks = IsCheck();
1057 checks.isDouble_ = true;
1058 checks.isNumeric_ = true;
1059 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1060
1061 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1062 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1063 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1064
1065 JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
1066 JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
1067 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1068 JSONTEST_ASSERT_STRING_EQUAL("1.844674407370955e+19",
1069 normalizeFloatingPointStr(val.asString()));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001070#endif
1071}
1072
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001073JSONTEST_FIXTURE(ValueTest, nonIntegers) {
1074 IsCheck checks;
1075 Json::Value val;
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001076
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001077 // Small positive number
1078 val = Json::Value(1.5);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001079
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001080 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001081
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001082 checks = IsCheck();
1083 checks.isDouble_ = true;
1084 checks.isNumeric_ = true;
1085 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001086
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001087 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1088 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1089 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1090 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1091 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1092 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1093 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1094 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001095
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001096 JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
1097 JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
1098 JSONTEST_ASSERT_EQUAL(1, val.asInt());
1099 JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
1100 JSONTEST_ASSERT_EQUAL(1, val.asUInt());
1101 JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
1102 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1103 JSONTEST_ASSERT_EQUAL("1.5", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001104
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001105 // Small negative number
1106 val = Json::Value(-1.5);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001107
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001108 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001109
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001110 checks = IsCheck();
1111 checks.isDouble_ = true;
1112 checks.isNumeric_ = true;
1113 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001114
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001115 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1116 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1117 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1118 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1119 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1120 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1121 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1122 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001123
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001124 JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
1125 JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
1126 JSONTEST_ASSERT_EQUAL(-1, val.asInt());
1127 JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
1128 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1129 JSONTEST_ASSERT_EQUAL("-1.5", val.asString());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001130
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001131 // A bit over int32 max
1132 val = Json::Value(kint32max + 0.5);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001133
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001134 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001135
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001136 checks = IsCheck();
1137 checks.isDouble_ = true;
1138 checks.isNumeric_ = true;
1139 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001140
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001141 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1142 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1143 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1144 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1145 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1146 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1147 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1148 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001149
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001150 JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
1151 JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
1152 JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001153#ifdef JSON_HAS_INT64
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001154 JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
1155 JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001156#endif
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001157 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1158 JSONTEST_ASSERT_EQUAL("2147483647.5",
1159 normalizeFloatingPointStr(val.asString()));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001160
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001161 // A bit under int32 min
1162 val = Json::Value(kint32min - 0.5);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001163
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001164 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001165
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001166 checks = IsCheck();
1167 checks.isDouble_ = true;
1168 checks.isNumeric_ = true;
1169 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001170
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001171 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1172 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1173 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1174 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1175 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1176 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1177 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1178 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001179
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001180 JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
1181 JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001182#ifdef JSON_HAS_INT64
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001183 JSONTEST_ASSERT_EQUAL(-Json::Int64(1) << 31, val.asLargestInt());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001184#endif
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001185 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1186 JSONTEST_ASSERT_EQUAL("-2147483648.5",
1187 normalizeFloatingPointStr(val.asString()));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001188
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001189 // A bit over uint32 max
1190 val = Json::Value(kuint32max + 0.5);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001191
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001192 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001193
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001194 checks = IsCheck();
1195 checks.isDouble_ = true;
1196 checks.isNumeric_ = true;
1197 JSONTEST_ASSERT_PRED(checkIs(val, checks));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001198
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001199 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1200 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1201 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1202 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1203 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1204 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1205 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1206 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001207
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001208 JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
1209 JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001210#ifdef JSON_HAS_INT64
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001211 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32) - 1, val.asLargestInt());
1212 JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32) - Json::UInt64(1),
1213 val.asLargestUInt());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001214#endif
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001215 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1216 JSONTEST_ASSERT_EQUAL("4294967295.5",
1217 normalizeFloatingPointStr(val.asString()));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001218
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001219 val = Json::Value(1.2345678901234);
1220 JSONTEST_ASSERT_STRING_EQUAL("1.2345678901234",
1221 normalizeFloatingPointStr(val.asString()));
1222
1223 // A 16-digit floating point number.
1224 val = Json::Value(2199023255552000.0f);
1225 JSONTEST_ASSERT_EQUAL(float(2199023255552000), val.asFloat());
1226 JSONTEST_ASSERT_STRING_EQUAL("2199023255552000",
1227 normalizeFloatingPointStr(val.asString()));
1228
1229 // A very large floating point number.
1230 val = Json::Value(3.402823466385289e38);
1231 JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
1232 JSONTEST_ASSERT_STRING_EQUAL("3.402823466385289e+38",
1233 normalizeFloatingPointStr(val.asString()));
1234
1235 // An even larger floating point number.
1236 val = Json::Value(1.2345678e300);
1237 JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
1238 JSONTEST_ASSERT_STRING_EQUAL("1.2345678e+300",
1239 normalizeFloatingPointStr(val.asString()));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001240}
1241
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001242void ValueTest::checkConstMemberCount(const Json::Value& value,
1243 unsigned int expectedCount) {
1244 unsigned int count = 0;
1245 Json::Value::const_iterator itEnd = value.end();
1246 for (Json::Value::const_iterator it = value.begin(); it != itEnd; ++it) {
1247 ++count;
1248 }
1249 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::const_iterator";
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001250}
1251
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001252void ValueTest::checkMemberCount(Json::Value& value,
1253 unsigned int expectedCount) {
1254 JSONTEST_ASSERT_EQUAL(expectedCount, value.size());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001255
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001256 unsigned int count = 0;
1257 Json::Value::iterator itEnd = value.end();
1258 for (Json::Value::iterator it = value.begin(); it != itEnd; ++it) {
1259 ++count;
1260 }
1261 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::iterator";
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001262
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001263 JSONTEST_ASSERT_PRED(checkConstMemberCount(value, expectedCount));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001264}
1265
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001266ValueTest::IsCheck::IsCheck()
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001267 : isObject_(false), isArray_(false), isBool_(false), isString_(false),
1268 isNull_(false), isInt_(false), isInt64_(false), isUInt_(false),
1269 isUInt64_(false), isIntegral_(false), isDouble_(false),
1270 isNumeric_(false) {}
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001271
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001272void ValueTest::checkIs(const Json::Value& value, const IsCheck& check) {
1273 JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject());
1274 JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray());
1275 JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool());
1276 JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble());
1277 JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt());
1278 JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt());
1279 JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral());
1280 JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric());
1281 JSONTEST_ASSERT_EQUAL(check.isString_, value.isString());
1282 JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001283
1284#ifdef JSON_HAS_INT64
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001285 JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64());
1286 JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001287#else
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001288 JSONTEST_ASSERT_EQUAL(false, value.isInt64());
1289 JSONTEST_ASSERT_EQUAL(false, value.isUInt64());
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001290#endif
1291}
1292
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001293JSONTEST_FIXTURE(ValueTest, compareNull) {
1294 JSONTEST_ASSERT_PRED(checkIsEqual(Json::Value(), Json::Value()));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001295}
1296
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001297JSONTEST_FIXTURE(ValueTest, compareInt) {
1298 JSONTEST_ASSERT_PRED(checkIsLess(0, 10));
1299 JSONTEST_ASSERT_PRED(checkIsEqual(10, 10));
1300 JSONTEST_ASSERT_PRED(checkIsEqual(-10, -10));
1301 JSONTEST_ASSERT_PRED(checkIsLess(-10, 0));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001302}
1303
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001304JSONTEST_FIXTURE(ValueTest, compareUInt) {
1305 JSONTEST_ASSERT_PRED(checkIsLess(0u, 10u));
1306 JSONTEST_ASSERT_PRED(checkIsLess(0u, Json::Value::maxUInt));
1307 JSONTEST_ASSERT_PRED(checkIsEqual(10u, 10u));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001308}
1309
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001310JSONTEST_FIXTURE(ValueTest, compareDouble) {
1311 JSONTEST_ASSERT_PRED(checkIsLess(0.0, 10.0));
1312 JSONTEST_ASSERT_PRED(checkIsEqual(10.0, 10.0));
1313 JSONTEST_ASSERT_PRED(checkIsEqual(-10.0, -10.0));
1314 JSONTEST_ASSERT_PRED(checkIsLess(-10.0, 0.0));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001315}
1316
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001317JSONTEST_FIXTURE(ValueTest, compareString) {
1318 JSONTEST_ASSERT_PRED(checkIsLess("", " "));
1319 JSONTEST_ASSERT_PRED(checkIsLess("", "a"));
1320 JSONTEST_ASSERT_PRED(checkIsLess("abcd", "zyui"));
1321 JSONTEST_ASSERT_PRED(checkIsLess("abc", "abcd"));
1322 JSONTEST_ASSERT_PRED(checkIsEqual("abcd", "abcd"));
1323 JSONTEST_ASSERT_PRED(checkIsEqual(" ", " "));
1324 JSONTEST_ASSERT_PRED(checkIsLess("ABCD", "abcd"));
1325 JSONTEST_ASSERT_PRED(checkIsEqual("ABCD", "ABCD"));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001326}
1327
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001328JSONTEST_FIXTURE(ValueTest, compareBoolean) {
1329 JSONTEST_ASSERT_PRED(checkIsLess(false, true));
1330 JSONTEST_ASSERT_PRED(checkIsEqual(false, false));
1331 JSONTEST_ASSERT_PRED(checkIsEqual(true, true));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001332}
1333
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001334JSONTEST_FIXTURE(ValueTest, compareArray) {
1335 // array compare size then content
1336 Json::Value emptyArray(Json::arrayValue);
1337 Json::Value l1aArray;
1338 l1aArray.append(0);
1339 Json::Value l1bArray;
1340 l1bArray.append(10);
1341 Json::Value l2aArray;
1342 l2aArray.append(0);
1343 l2aArray.append(0);
1344 Json::Value l2bArray;
1345 l2bArray.append(0);
1346 l2bArray.append(10);
1347 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l1aArray));
1348 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l2aArray));
1349 JSONTEST_ASSERT_PRED(checkIsLess(l1aArray, l2aArray));
1350 JSONTEST_ASSERT_PRED(checkIsLess(l2aArray, l2bArray));
1351 JSONTEST_ASSERT_PRED(checkIsEqual(emptyArray, Json::Value(emptyArray)));
1352 JSONTEST_ASSERT_PRED(checkIsEqual(l1aArray, Json::Value(l1aArray)));
1353 JSONTEST_ASSERT_PRED(checkIsEqual(l2bArray, Json::Value(l2bArray)));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001354}
1355
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001356JSONTEST_FIXTURE(ValueTest, compareObject) {
1357 // object compare size then content
1358 Json::Value emptyObject(Json::objectValue);
1359 Json::Value l1aObject;
1360 l1aObject["key1"] = 0;
1361 Json::Value l1bObject;
1362 l1aObject["key1"] = 10;
1363 Json::Value l2aObject;
1364 l2aObject["key1"] = 0;
1365 l2aObject["key2"] = 0;
1366 JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l1aObject));
1367 JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l2aObject));
1368 JSONTEST_ASSERT_PRED(checkIsLess(l1aObject, l2aObject));
1369 JSONTEST_ASSERT_PRED(checkIsEqual(emptyObject, Json::Value(emptyObject)));
1370 JSONTEST_ASSERT_PRED(checkIsEqual(l1aObject, Json::Value(l1aObject)));
1371 JSONTEST_ASSERT_PRED(checkIsEqual(l2aObject, Json::Value(l2aObject)));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001372}
1373
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001374JSONTEST_FIXTURE(ValueTest, compareType) {
1375 // object of different type are ordered according to their type
1376 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(), Json::Value(1)));
1377 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1), Json::Value(1u)));
1378 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1u), Json::Value(1.0)));
1379 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1.0), Json::Value("a")));
1380 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value("a"), Json::Value(true)));
1381 JSONTEST_ASSERT_PRED(
1382 checkIsLess(Json::Value(true), Json::Value(Json::arrayValue)));
1383 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(Json::arrayValue),
1384 Json::Value(Json::objectValue)));
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001385}
1386
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001387void ValueTest::checkIsLess(const Json::Value& x, const Json::Value& y) {
1388 JSONTEST_ASSERT(x < y);
1389 JSONTEST_ASSERT(y > x);
1390 JSONTEST_ASSERT(x <= y);
1391 JSONTEST_ASSERT(y >= x);
1392 JSONTEST_ASSERT(!(x == y));
1393 JSONTEST_ASSERT(!(y == x));
1394 JSONTEST_ASSERT(!(x >= y));
1395 JSONTEST_ASSERT(!(y <= x));
1396 JSONTEST_ASSERT(!(x > y));
1397 JSONTEST_ASSERT(!(y < x));
1398 JSONTEST_ASSERT(x.compare(y) < 0);
1399 JSONTEST_ASSERT(y.compare(x) >= 0);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001400}
1401
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001402void ValueTest::checkIsEqual(const Json::Value& x, const Json::Value& y) {
1403 JSONTEST_ASSERT(x == y);
1404 JSONTEST_ASSERT(y == x);
1405 JSONTEST_ASSERT(x <= y);
1406 JSONTEST_ASSERT(y <= x);
1407 JSONTEST_ASSERT(x >= y);
1408 JSONTEST_ASSERT(y >= x);
1409 JSONTEST_ASSERT(!(x < y));
1410 JSONTEST_ASSERT(!(y < x));
1411 JSONTEST_ASSERT(!(x > y));
1412 JSONTEST_ASSERT(!(y > x));
1413 JSONTEST_ASSERT(x.compare(y) == 0);
1414 JSONTEST_ASSERT(y.compare(x) == 0);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001415}
1416
Derek Sollenberger2eb3b4d2016-01-11 14:41:40 -05001417JSONTEST_FIXTURE(ValueTest, typeChecksThrowExceptions) {
1418#if JSON_USE_EXCEPTION
1419
1420 Json::Value intVal(1);
1421 Json::Value strVal("Test");
1422 Json::Value objVal(Json::objectValue);
1423 Json::Value arrVal(Json::arrayValue);
1424
1425 JSONTEST_ASSERT_THROWS(intVal["test"]);
1426 JSONTEST_ASSERT_THROWS(strVal["test"]);
1427 JSONTEST_ASSERT_THROWS(arrVal["test"]);
1428
1429 JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
1430 JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
1431 JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
1432
1433 JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
1434 JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
1435 JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
1436
1437 JSONTEST_ASSERT_THROWS(intVal[0]);
1438 JSONTEST_ASSERT_THROWS(objVal[0]);
1439 JSONTEST_ASSERT_THROWS(strVal[0]);
1440
1441 JSONTEST_ASSERT_THROWS(intVal.clear());
1442
1443 JSONTEST_ASSERT_THROWS(intVal.resize(1));
1444 JSONTEST_ASSERT_THROWS(strVal.resize(1));
1445 JSONTEST_ASSERT_THROWS(objVal.resize(1));
1446
1447 JSONTEST_ASSERT_THROWS(intVal.asCString());
1448
1449 JSONTEST_ASSERT_THROWS(objVal.asString());
1450 JSONTEST_ASSERT_THROWS(arrVal.asString());
1451
1452 JSONTEST_ASSERT_THROWS(strVal.asInt());
1453 JSONTEST_ASSERT_THROWS(objVal.asInt());
1454 JSONTEST_ASSERT_THROWS(arrVal.asInt());
1455
1456 JSONTEST_ASSERT_THROWS(strVal.asUInt());
1457 JSONTEST_ASSERT_THROWS(objVal.asUInt());
1458 JSONTEST_ASSERT_THROWS(arrVal.asUInt());
1459
1460 JSONTEST_ASSERT_THROWS(strVal.asInt64());
1461 JSONTEST_ASSERT_THROWS(objVal.asInt64());
1462 JSONTEST_ASSERT_THROWS(arrVal.asInt64());
1463
1464 JSONTEST_ASSERT_THROWS(strVal.asUInt64());
1465 JSONTEST_ASSERT_THROWS(objVal.asUInt64());
1466 JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
1467
1468 JSONTEST_ASSERT_THROWS(strVal.asDouble());
1469 JSONTEST_ASSERT_THROWS(objVal.asDouble());
1470 JSONTEST_ASSERT_THROWS(arrVal.asDouble());
1471
1472 JSONTEST_ASSERT_THROWS(strVal.asFloat());
1473 JSONTEST_ASSERT_THROWS(objVal.asFloat());
1474 JSONTEST_ASSERT_THROWS(arrVal.asFloat());
1475
1476 JSONTEST_ASSERT_THROWS(strVal.asBool());
1477 JSONTEST_ASSERT_THROWS(objVal.asBool());
1478 JSONTEST_ASSERT_THROWS(arrVal.asBool());
1479
1480#endif
1481}
1482
1483JSONTEST_FIXTURE(ValueTest, offsetAccessors) {
1484 Json::Value x;
1485 JSONTEST_ASSERT(x.getOffsetStart() == 0);
1486 JSONTEST_ASSERT(x.getOffsetLimit() == 0);
1487 x.setOffsetStart(10);
1488 x.setOffsetLimit(20);
1489 JSONTEST_ASSERT(x.getOffsetStart() == 10);
1490 JSONTEST_ASSERT(x.getOffsetLimit() == 20);
1491 Json::Value y(x);
1492 JSONTEST_ASSERT(y.getOffsetStart() == 10);
1493 JSONTEST_ASSERT(y.getOffsetLimit() == 20);
1494 Json::Value z;
1495 z.swap(y);
1496 JSONTEST_ASSERT(z.getOffsetStart() == 10);
1497 JSONTEST_ASSERT(z.getOffsetLimit() == 20);
1498 JSONTEST_ASSERT(y.getOffsetStart() == 0);
1499 JSONTEST_ASSERT(y.getOffsetLimit() == 0);
1500}
1501
1502struct WriterTest : JsonTest::TestCase {};
1503
1504JSONTEST_FIXTURE(WriterTest, dropNullPlaceholders) {
1505 Json::FastWriter writer;
1506 Json::Value nullValue;
1507 JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
1508
1509 writer.dropNullPlaceholders();
1510 JSONTEST_ASSERT(writer.write(nullValue) == "\n");
1511}
1512
1513struct ReaderTest : JsonTest::TestCase {};
1514
1515JSONTEST_FIXTURE(ReaderTest, parseWithNoErrors) {
1516 Json::Reader reader;
1517 Json::Value root;
1518 bool ok = reader.parse("{ \"property\" : \"value\" }", root);
1519 JSONTEST_ASSERT(ok);
1520 JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
1521 JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
1522}
1523
1524JSONTEST_FIXTURE(ReaderTest, parseWithNoErrorsTestingOffsets) {
1525 Json::Reader reader;
1526 Json::Value root;
1527 bool ok = reader.parse("{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
1528 "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
1529 "null, \"false\" : false }",
1530 root);
1531 JSONTEST_ASSERT(ok);
1532 JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
1533 JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
1534 JSONTEST_ASSERT(root["property"].getOffsetStart() == 15);
1535 JSONTEST_ASSERT(root["property"].getOffsetLimit() == 34);
1536 JSONTEST_ASSERT(root["property"][0].getOffsetStart() == 16);
1537 JSONTEST_ASSERT(root["property"][0].getOffsetLimit() == 23);
1538 JSONTEST_ASSERT(root["property"][1].getOffsetStart() == 25);
1539 JSONTEST_ASSERT(root["property"][1].getOffsetLimit() == 33);
1540 JSONTEST_ASSERT(root["obj"].getOffsetStart() == 44);
1541 JSONTEST_ASSERT(root["obj"].getOffsetLimit() == 76);
1542 JSONTEST_ASSERT(root["obj"]["nested"].getOffsetStart() == 57);
1543 JSONTEST_ASSERT(root["obj"]["nested"].getOffsetLimit() == 60);
1544 JSONTEST_ASSERT(root["obj"]["bool"].getOffsetStart() == 71);
1545 JSONTEST_ASSERT(root["obj"]["bool"].getOffsetLimit() == 75);
1546 JSONTEST_ASSERT(root["null"].getOffsetStart() == 87);
1547 JSONTEST_ASSERT(root["null"].getOffsetLimit() == 91);
1548 JSONTEST_ASSERT(root["false"].getOffsetStart() == 103);
1549 JSONTEST_ASSERT(root["false"].getOffsetLimit() == 108);
1550 JSONTEST_ASSERT(root.getOffsetStart() == 0);
1551 JSONTEST_ASSERT(root.getOffsetLimit() == 110);
1552}
1553
1554JSONTEST_FIXTURE(ReaderTest, parseWithOneError) {
1555 Json::Reader reader;
1556 Json::Value root;
1557 bool ok = reader.parse("{ \"property\" :: \"value\" }", root);
1558 JSONTEST_ASSERT(!ok);
1559 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1560 "* Line 1, Column 15\n Syntax error: value, object or array "
1561 "expected.\n");
1562 std::vector<Json::Reader::StructuredError> errors =
1563 reader.getStructuredErrors();
1564 JSONTEST_ASSERT(errors.size() == 1);
1565 JSONTEST_ASSERT(errors.at(0).offset_start == 14);
1566 JSONTEST_ASSERT(errors.at(0).offset_limit == 15);
1567 JSONTEST_ASSERT(errors.at(0).message ==
1568 "Syntax error: value, object or array expected.");
1569}
1570
1571JSONTEST_FIXTURE(ReaderTest, parseChineseWithOneError) {
1572 Json::Reader reader;
1573 Json::Value root;
1574 bool ok = reader.parse("{ \"pr佐藤erty\" :: \"value\" }", root);
1575 JSONTEST_ASSERT(!ok);
1576 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1577 "* Line 1, Column 19\n Syntax error: value, object or array "
1578 "expected.\n");
1579 std::vector<Json::Reader::StructuredError> errors =
1580 reader.getStructuredErrors();
1581 JSONTEST_ASSERT(errors.size() == 1);
1582 JSONTEST_ASSERT(errors.at(0).offset_start == 18);
1583 JSONTEST_ASSERT(errors.at(0).offset_limit == 19);
1584 JSONTEST_ASSERT(errors.at(0).message ==
1585 "Syntax error: value, object or array expected.");
1586}
1587
1588JSONTEST_FIXTURE(ReaderTest, parseWithDetailError) {
1589 Json::Reader reader;
1590 Json::Value root;
1591 bool ok = reader.parse("{ \"property\" : \"v\\alue\" }", root);
1592 JSONTEST_ASSERT(!ok);
1593 JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1594 "* Line 1, Column 16\n Bad escape sequence in string\nSee "
1595 "Line 1, Column 20 for detail.\n");
1596 std::vector<Json::Reader::StructuredError> errors =
1597 reader.getStructuredErrors();
1598 JSONTEST_ASSERT(errors.size() == 1);
1599 JSONTEST_ASSERT(errors.at(0).offset_start == 15);
1600 JSONTEST_ASSERT(errors.at(0).offset_limit == 23);
1601 JSONTEST_ASSERT(errors.at(0).message == "Bad escape sequence in string");
1602}
1603
1604int main(int argc, const char* argv[]) {
1605 JsonTest::Runner runner;
1606 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, checkNormalizeFloatingPointStr);
1607 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, memberCount);
1608 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, objects);
1609 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrays);
1610 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, null);
1611 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, strings);
1612 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, bools);
1613 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, integers);
1614 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nonIntegers);
1615 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareNull);
1616 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareInt);
1617 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareUInt);
1618 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareDouble);
1619 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareString);
1620 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareBoolean);
1621 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareArray);
1622 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareObject);
1623 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareType);
1624 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, offsetAccessors);
1625 JSONTEST_REGISTER_FIXTURE(runner, ValueTest, typeChecksThrowExceptions);
1626
1627 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithNoErrors);
1628 JSONTEST_REGISTER_FIXTURE(
1629 runner, ReaderTest, parseWithNoErrorsTestingOffsets);
1630 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithOneError);
1631 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseChineseWithOneError);
1632 JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithDetailError);
1633
1634 JSONTEST_REGISTER_FIXTURE(runner, WriterTest, dropNullPlaceholders);
1635
1636 return runner.runCommandLine(argc, argv);
Leon Scroggins IIIf59fb0e2014-05-28 15:19:42 -04001637}