1 // Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
2 // Distributed under MIT license, or public domain if desired and
3 // recognized in your jurisdiction.
4 // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
5
6 #if defined(__GNUC__)
7 #pragma GCC diagnostic push
8 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
9 #elif defined(_MSC_VER)
10 #pragma warning(disable : 4996)
11 #endif
12
13 #include "fuzz.h"
14 #include "jsontest.h"
15 #include <cmath>
16 #include <cstring>
17 #include <functional>
18 #include <iomanip>
19 #include <iostream>
20 #include <iterator>
21 #include <json/config.h>
22 #include <json/json.h>
23 #include <limits>
24 #include <memory>
25 #include <sstream>
26 #include <string>
27
28 using CharReaderPtr = std::unique_ptr<Json::CharReader>;
29
30 // Make numeric limits more convenient to talk about.
31 // Assumes int type in 32 bits.
32 #define kint32max Json::Value::maxInt
33 #define kint32min Json::Value::minInt
34 #define kuint32max Json::Value::maxUInt
35 #define kint64max Json::Value::maxInt64
36 #define kint64min Json::Value::minInt64
37 #define kuint64max Json::Value::maxUInt64
38
39 // static const double kdint64max = double(kint64max);
40 // static const float kfint64max = float(kint64max);
41 static const float kfint32max = float(kint32max);
42 static const float kfuint32max = float(kuint32max);
43
44 // //////////////////////////////////////////////////////////////////
45 // //////////////////////////////////////////////////////////////////
46 // Json Library test cases
47 // //////////////////////////////////////////////////////////////////
48 // //////////////////////////////////////////////////////////////////
49
50 #if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
uint64ToDouble(Json::UInt64 value)51 static inline double uint64ToDouble(Json::UInt64 value) {
52 return static_cast<double>(value);
53 }
54 #else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
uint64ToDouble(Json::UInt64 value)55 static inline double uint64ToDouble(Json::UInt64 value) {
56 return static_cast<double>(Json::Int64(value / 2)) * 2.0 +
57 static_cast<double>(Json::Int64(value & 1));
58 }
59 #endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
60
61 // local_ is the collection for the testcases in this code file.
62 static std::deque<JsonTest::TestCaseFactory> local_;
63 #define JSONTEST_FIXTURE_LOCAL(FixtureType, name) \
64 JSONTEST_FIXTURE_V2(FixtureType, name, local_)
65
66 struct ValueTest : JsonTest::TestCase {
67 Json::Value null_;
68 Json::Value emptyArray_{Json::arrayValue};
69 Json::Value emptyObject_{Json::objectValue};
70 Json::Value integer_{123456789};
71 Json::Value unsignedInteger_{34567890};
72 Json::Value smallUnsignedInteger_{Json::Value::UInt(Json::Value::maxInt)};
73 Json::Value real_{1234.56789};
74 Json::Value float_{0.00390625f};
75 Json::Value array1_;
76 Json::Value object1_;
77 Json::Value emptyString_{""};
78 Json::Value string1_{"a"};
79 Json::Value string_{"sometext with space"};
80 Json::Value true_{true};
81 Json::Value false_{false};
82
ValueTestValueTest83 ValueTest() {
84 array1_.append(1234);
85 object1_["id"] = 1234;
86 }
87
88 struct IsCheck {
89 /// Initialize all checks to \c false by default.
90 IsCheck();
91
92 bool isObject_{false};
93 bool isArray_{false};
94 bool isBool_{false};
95 bool isString_{false};
96 bool isNull_{false};
97
98 bool isInt_{false};
99 bool isInt64_{false};
100 bool isUInt_{false};
101 bool isUInt64_{false};
102 bool isIntegral_{false};
103 bool isDouble_{false};
104 bool isNumeric_{false};
105 };
106
107 void checkConstMemberCount(const Json::Value& value,
108 unsigned int expectedCount);
109
110 void checkMemberCount(Json::Value& value, unsigned int expectedCount);
111
112 void checkIs(const Json::Value& value, const IsCheck& check);
113
114 void checkIsLess(const Json::Value& x, const Json::Value& y);
115
116 void checkIsEqual(const Json::Value& x, const Json::Value& y);
117
118 /// Normalize the representation of floating-point number by stripped leading
119 /// 0 in exponent.
120 static Json::String normalizeFloatingPointStr(const Json::String& s);
121 };
122
normalizeFloatingPointStr(const Json::String & s)123 Json::String ValueTest::normalizeFloatingPointStr(const Json::String& s) {
124 auto index = s.find_last_of("eE");
125 if (index == s.npos)
126 return s;
127 std::size_t signWidth = (s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
128 auto exponentStartIndex = index + 1 + signWidth;
129 Json::String normalized = s.substr(0, exponentStartIndex);
130 auto indexDigit = s.find_first_not_of('0', exponentStartIndex);
131 Json::String exponent = "0";
132 if (indexDigit != s.npos) { // nonzero exponent
133 exponent = s.substr(indexDigit);
134 }
135 return normalized + exponent;
136 }
137
JSONTEST_FIXTURE_LOCAL(ValueTest,checkNormalizeFloatingPointStr)138 JSONTEST_FIXTURE_LOCAL(ValueTest, checkNormalizeFloatingPointStr) {
139 struct TestData {
140 std::string in;
141 std::string out;
142 } const testData[] = {
143 {"0.0", "0.0"},
144 {"0e0", "0e0"},
145 {"1234.0", "1234.0"},
146 {"1234.0e0", "1234.0e0"},
147 {"1234.0e-1", "1234.0e-1"},
148 {"1234.0e+0", "1234.0e+0"},
149 {"1234.0e+001", "1234.0e+1"},
150 {"1234e-1", "1234e-1"},
151 {"1234e+000", "1234e+0"},
152 {"1234e+001", "1234e+1"},
153 {"1234e10", "1234e10"},
154 {"1234e010", "1234e10"},
155 {"1234e+010", "1234e+10"},
156 {"1234e-010", "1234e-10"},
157 {"1234e+100", "1234e+100"},
158 {"1234e-100", "1234e-100"},
159 };
160 for (const auto& td : testData) {
161 JSONTEST_ASSERT_STRING_EQUAL(normalizeFloatingPointStr(td.in), td.out);
162 }
163 }
164
JSONTEST_FIXTURE_LOCAL(ValueTest,memberCount)165 JSONTEST_FIXTURE_LOCAL(ValueTest, memberCount) {
166 JSONTEST_ASSERT_PRED(checkMemberCount(emptyArray_, 0));
167 JSONTEST_ASSERT_PRED(checkMemberCount(emptyObject_, 0));
168 JSONTEST_ASSERT_PRED(checkMemberCount(array1_, 1));
169 JSONTEST_ASSERT_PRED(checkMemberCount(object1_, 1));
170 JSONTEST_ASSERT_PRED(checkMemberCount(null_, 0));
171 JSONTEST_ASSERT_PRED(checkMemberCount(integer_, 0));
172 JSONTEST_ASSERT_PRED(checkMemberCount(unsignedInteger_, 0));
173 JSONTEST_ASSERT_PRED(checkMemberCount(smallUnsignedInteger_, 0));
174 JSONTEST_ASSERT_PRED(checkMemberCount(real_, 0));
175 JSONTEST_ASSERT_PRED(checkMemberCount(emptyString_, 0));
176 JSONTEST_ASSERT_PRED(checkMemberCount(string_, 0));
177 JSONTEST_ASSERT_PRED(checkMemberCount(true_, 0));
178 JSONTEST_ASSERT_PRED(checkMemberCount(false_, 0));
179 JSONTEST_ASSERT_PRED(checkMemberCount(string1_, 0));
180 JSONTEST_ASSERT_PRED(checkMemberCount(float_, 0));
181 }
182
JSONTEST_FIXTURE_LOCAL(ValueTest,objects)183 JSONTEST_FIXTURE_LOCAL(ValueTest, objects) {
184 // Types
185 IsCheck checks;
186 checks.isObject_ = true;
187 JSONTEST_ASSERT_PRED(checkIs(emptyObject_, checks));
188 JSONTEST_ASSERT_PRED(checkIs(object1_, checks));
189
190 JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());
191
192 // Empty object okay
193 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));
194
195 // Non-empty object not okay
196 JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));
197
198 // Always okay
199 JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));
200
201 // Never okay
202 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
203 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
204 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
205 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
206 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
207 JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));
208
209 // Access through const reference
210 const Json::Value& constObject = object1_;
211
212 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
213 JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);
214
215 // Access through find()
216 const char idKey[] = "id";
217 const Json::Value* foundId = object1_.find(idKey, idKey + strlen(idKey));
218 JSONTEST_ASSERT(foundId != nullptr);
219 JSONTEST_ASSERT_EQUAL(Json::Value(1234), *foundId);
220
221 const char unknownIdKey[] = "unknown id";
222 const Json::Value* foundUnknownId =
223 object1_.find(unknownIdKey, unknownIdKey + strlen(unknownIdKey));
224 JSONTEST_ASSERT_EQUAL(nullptr, foundUnknownId);
225
226 // Access through demand()
227 const char yetAnotherIdKey[] = "yet another id";
228 const Json::Value* foundYetAnotherId =
229 object1_.find(yetAnotherIdKey, yetAnotherIdKey + strlen(yetAnotherIdKey));
230 JSONTEST_ASSERT_EQUAL(nullptr, foundYetAnotherId);
231 Json::Value* demandedYetAnotherId = object1_.demand(
232 yetAnotherIdKey, yetAnotherIdKey + strlen(yetAnotherIdKey));
233 JSONTEST_ASSERT(demandedYetAnotherId != nullptr);
234 *demandedYetAnotherId = "baz";
235
236 JSONTEST_ASSERT_EQUAL(Json::Value("baz"), object1_["yet another id"]);
237
238 // Access through non-const reference
239 JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
240 JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
241
242 object1_["some other id"] = "foo";
243 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
244 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
245
246 // Remove.
247 Json::Value got;
248 bool did;
249 did = object1_.removeMember("some other id", &got);
250 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
251 JSONTEST_ASSERT_EQUAL(true, did);
252 got = Json::Value("bar");
253 did = object1_.removeMember("some other id", &got);
254 JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
255 JSONTEST_ASSERT_EQUAL(false, did);
256
257 object1_["some other id"] = "foo";
258 Json::Value* gotPtr = nullptr;
259 did = object1_.removeMember("some other id", gotPtr);
260 JSONTEST_ASSERT_EQUAL(nullptr, gotPtr);
261 JSONTEST_ASSERT_EQUAL(true, did);
262
263 // Using other removeMember interfaces, the test idea is the same as above.
264 object1_["some other id"] = "foo";
265 const Json::String key("some other id");
266 did = object1_.removeMember(key, &got);
267 JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
268 JSONTEST_ASSERT_EQUAL(true, did);
269 got = Json::Value("bar");
270 did = object1_.removeMember(key, &got);
271 JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
272 JSONTEST_ASSERT_EQUAL(false, did);
273
274 object1_["some other id"] = "foo";
275 object1_.removeMember(key);
276 JSONTEST_ASSERT_EQUAL(Json::nullValue, object1_[key]);
277 }
278
JSONTEST_FIXTURE_LOCAL(ValueTest,arrays)279 JSONTEST_FIXTURE_LOCAL(ValueTest, arrays) {
280 const unsigned int index0 = 0;
281
282 // Types
283 IsCheck checks;
284 checks.isArray_ = true;
285 JSONTEST_ASSERT_PRED(checkIs(emptyArray_, checks));
286 JSONTEST_ASSERT_PRED(checkIs(array1_, checks));
287
288 JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
289
290 // Empty array okay
291 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));
292
293 // Non-empty array not okay
294 JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));
295
296 // Always okay
297 JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));
298
299 // Never okay
300 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
301 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
302 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
303 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
304 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
305 JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));
306
307 // Access through const reference
308 const Json::Value& constArray = array1_;
309 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
310 JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
311
312 // Access through non-const reference
313 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
314 JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
315
316 array1_[2] = Json::Value(17);
317 JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
318 JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
319 Json::Value got;
320 JSONTEST_ASSERT_EQUAL(true, array1_.removeIndex(2, &got));
321 JSONTEST_ASSERT_EQUAL(Json::Value(17), got);
322 JSONTEST_ASSERT_EQUAL(false, array1_.removeIndex(2, &got)); // gone now
323 }
JSONTEST_FIXTURE_LOCAL(ValueTest,resizeArray)324 JSONTEST_FIXTURE_LOCAL(ValueTest, resizeArray) {
325 Json::Value array;
326 {
327 for (Json::ArrayIndex i = 0; i < 10; i++)
328 array[i] = i;
329 JSONTEST_ASSERT_EQUAL(array.size(), 10);
330 // The length set is greater than the length of the array.
331 array.resize(15);
332 JSONTEST_ASSERT_EQUAL(array.size(), 15);
333
334 // The length set is less than the length of the array.
335 array.resize(5);
336 JSONTEST_ASSERT_EQUAL(array.size(), 5);
337
338 // The length of the array is set to 0.
339 array.resize(0);
340 JSONTEST_ASSERT_EQUAL(array.size(), 0);
341 }
342 {
343 for (Json::ArrayIndex i = 0; i < 10; i++)
344 array[i] = i;
345 JSONTEST_ASSERT_EQUAL(array.size(), 10);
346 array.clear();
347 JSONTEST_ASSERT_EQUAL(array.size(), 0);
348 }
349 }
JSONTEST_FIXTURE_LOCAL(ValueTest,getArrayValue)350 JSONTEST_FIXTURE_LOCAL(ValueTest, getArrayValue) {
351 Json::Value array;
352 for (Json::ArrayIndex i = 0; i < 5; i++)
353 array[i] = i;
354
355 JSONTEST_ASSERT_EQUAL(array.size(), 5);
356 const Json::Value defaultValue(10);
357 Json::ArrayIndex index = 0;
358 for (; index <= 4; index++)
359 JSONTEST_ASSERT_EQUAL(index, array.get(index, defaultValue).asInt());
360
361 index = 4;
362 JSONTEST_ASSERT_EQUAL(array.isValidIndex(index), true);
363 index = 5;
364 JSONTEST_ASSERT_EQUAL(array.isValidIndex(index), false);
365 JSONTEST_ASSERT_EQUAL(defaultValue, array.get(index, defaultValue));
366 JSONTEST_ASSERT_EQUAL(array.isValidIndex(index), false);
367 }
JSONTEST_FIXTURE_LOCAL(ValueTest,arrayIssue252)368 JSONTEST_FIXTURE_LOCAL(ValueTest, arrayIssue252) {
369 int count = 5;
370 Json::Value root;
371 Json::Value item;
372 root["array"] = Json::Value::nullSingleton();
373 for (int i = 0; i < count; i++) {
374 item["a"] = i;
375 item["b"] = i;
376 root["array"][i] = item;
377 }
378 // JSONTEST_ASSERT_EQUAL(5, root["array"].size());
379 }
380
JSONTEST_FIXTURE_LOCAL(ValueTest,arrayInsertAtRandomIndex)381 JSONTEST_FIXTURE_LOCAL(ValueTest, arrayInsertAtRandomIndex) {
382 Json::Value array;
383 const Json::Value str0("index2");
384 const Json::Value str1("index3");
385 array.append("index0"); // append rvalue
386 array.append("index1");
387 array.append(str0); // append lvalue
388
389 std::vector<Json::Value*> vec; // storage value address for checking
390 for (Json::ArrayIndex i = 0; i < 3; i++) {
391 vec.push_back(&array[i]);
392 }
393 JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array[0]); // check append
394 JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[1]);
395 JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[2]);
396
397 // insert lvalue at the head
398 JSONTEST_ASSERT(array.insert(0, str1));
399 JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array[0]);
400 JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array[1]);
401 JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[2]);
402 JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[3]);
403 // checking address
404 for (Json::ArrayIndex i = 0; i < 3; i++) {
405 JSONTEST_ASSERT_EQUAL(vec[i], &array[i]);
406 }
407 vec.push_back(&array[3]);
408 // insert rvalue at middle
409 JSONTEST_ASSERT(array.insert(2, "index4"));
410 JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array[0]);
411 JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array[1]);
412 JSONTEST_ASSERT_EQUAL(Json::Value("index4"), array[2]);
413 JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[3]);
414 JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[4]);
415 // checking address
416 for (Json::ArrayIndex i = 0; i < 4; i++) {
417 JSONTEST_ASSERT_EQUAL(vec[i], &array[i]);
418 }
419 vec.push_back(&array[4]);
420 // insert rvalue at the tail
421 JSONTEST_ASSERT(array.insert(5, "index5"));
422 JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array[0]);
423 JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array[1]);
424 JSONTEST_ASSERT_EQUAL(Json::Value("index4"), array[2]);
425 JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[3]);
426 JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[4]);
427 JSONTEST_ASSERT_EQUAL(Json::Value("index5"), array[5]);
428 // checking address
429 for (Json::ArrayIndex i = 0; i < 5; i++) {
430 JSONTEST_ASSERT_EQUAL(vec[i], &array[i]);
431 }
432 vec.push_back(&array[5]);
433 // beyond max array size, it should not be allowed to insert into its tail
434 JSONTEST_ASSERT(!array.insert(10, "index10"));
435 }
436
JSONTEST_FIXTURE_LOCAL(ValueTest,null)437 JSONTEST_FIXTURE_LOCAL(ValueTest, null) {
438 JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
439
440 IsCheck checks;
441 checks.isNull_ = true;
442 JSONTEST_ASSERT_PRED(checkIs(null_, checks));
443
444 JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
445 JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
446 JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
447 JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
448 JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
449 JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
450 JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
451 JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));
452
453 JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
454 JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
455 JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
456 JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
457 JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
458 JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
459 JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
460
461 JSONTEST_ASSERT_EQUAL(Json::Value::nullSingleton(), null_);
462
463 // Test using a Value in a boolean context (false iff null)
464 JSONTEST_ASSERT_EQUAL(null_, false);
465 JSONTEST_ASSERT_EQUAL(object1_, true);
466 JSONTEST_ASSERT_EQUAL(!null_, true);
467 JSONTEST_ASSERT_EQUAL(!object1_, false);
468 }
469
JSONTEST_FIXTURE_LOCAL(ValueTest,strings)470 JSONTEST_FIXTURE_LOCAL(ValueTest, strings) {
471 JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
472
473 IsCheck checks;
474 checks.isString_ = true;
475 JSONTEST_ASSERT_PRED(checkIs(emptyString_, checks));
476 JSONTEST_ASSERT_PRED(checkIs(string_, checks));
477 JSONTEST_ASSERT_PRED(checkIs(string1_, checks));
478
479 // Empty string okay
480 JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));
481
482 // Non-empty string not okay
483 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));
484
485 // Always okay
486 JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));
487
488 // Never okay
489 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
490 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
491 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
492 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
493 JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));
494
495 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
496 JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
497 }
498
JSONTEST_FIXTURE_LOCAL(ValueTest,bools)499 JSONTEST_FIXTURE_LOCAL(ValueTest, bools) {
500 JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
501
502 IsCheck checks;
503 checks.isBool_ = true;
504 JSONTEST_ASSERT_PRED(checkIs(false_, checks));
505 JSONTEST_ASSERT_PRED(checkIs(true_, checks));
506
507 // False okay
508 JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));
509
510 // True not okay
511 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));
512
513 // Always okay
514 JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
515 JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
516 JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
517 JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
518 JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));
519
520 // Never okay
521 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
522 JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));
523
524 JSONTEST_ASSERT_EQUAL(true, true_.asBool());
525 JSONTEST_ASSERT_EQUAL(1, true_.asInt());
526 JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
527 JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
528 JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
529 JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
530 JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());
531
532 JSONTEST_ASSERT_EQUAL(false, false_.asBool());
533 JSONTEST_ASSERT_EQUAL(0, false_.asInt());
534 JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
535 JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
536 JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
537 JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
538 JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
539 }
540
JSONTEST_FIXTURE_LOCAL(ValueTest,integers)541 JSONTEST_FIXTURE_LOCAL(ValueTest, integers) {
542 IsCheck checks;
543 Json::Value val;
544
545 // Conversions that don't depend on the value.
546 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
547 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
548 JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
549 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
550 JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));
551
552 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
553 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
554 JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
555 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
556 JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));
557
558 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
559 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
560 JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
561 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
562 JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));
563
564 // Default int
565 val = Json::Value(Json::intValue);
566
567 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
568
569 checks = IsCheck();
570 checks.isInt_ = true;
571 checks.isInt64_ = true;
572 checks.isUInt_ = true;
573 checks.isUInt64_ = true;
574 checks.isIntegral_ = true;
575 checks.isDouble_ = true;
576 checks.isNumeric_ = true;
577 JSONTEST_ASSERT_PRED(checkIs(val, checks));
578
579 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
580 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
581 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
582
583 JSONTEST_ASSERT_EQUAL(0, val.asInt());
584 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
585 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
586 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
587 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
588 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
589 JSONTEST_ASSERT_EQUAL(false, val.asBool());
590 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
591
592 // Default uint
593 val = Json::Value(Json::uintValue);
594
595 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
596
597 checks = IsCheck();
598 checks.isInt_ = true;
599 checks.isInt64_ = true;
600 checks.isUInt_ = true;
601 checks.isUInt64_ = true;
602 checks.isIntegral_ = true;
603 checks.isDouble_ = true;
604 checks.isNumeric_ = true;
605 JSONTEST_ASSERT_PRED(checkIs(val, checks));
606
607 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
608 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
609 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
610
611 JSONTEST_ASSERT_EQUAL(0, val.asInt());
612 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
613 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
614 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
615 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
616 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
617 JSONTEST_ASSERT_EQUAL(false, val.asBool());
618 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
619
620 // Default real
621 val = Json::Value(Json::realValue);
622
623 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
624
625 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
626 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
627 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
628
629 checks = IsCheck();
630 checks.isInt_ = true;
631 checks.isInt64_ = true;
632 checks.isUInt_ = true;
633 checks.isUInt64_ = true;
634 checks.isIntegral_ = true;
635 checks.isDouble_ = true;
636 checks.isNumeric_ = true;
637 JSONTEST_ASSERT_PRED(checkIs(val, checks));
638
639 JSONTEST_ASSERT_EQUAL(0, val.asInt());
640 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
641 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
642 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
643 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
644 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
645 JSONTEST_ASSERT_EQUAL(false, val.asBool());
646 JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
647
648 // Zero (signed constructor arg)
649 val = Json::Value(0);
650
651 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
652
653 checks = IsCheck();
654 checks.isInt_ = true;
655 checks.isInt64_ = true;
656 checks.isUInt_ = true;
657 checks.isUInt64_ = true;
658 checks.isIntegral_ = true;
659 checks.isDouble_ = true;
660 checks.isNumeric_ = true;
661 JSONTEST_ASSERT_PRED(checkIs(val, checks));
662
663 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
664 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
665 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
666
667 JSONTEST_ASSERT_EQUAL(0, val.asInt());
668 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
669 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
670 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
671 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
672 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
673 JSONTEST_ASSERT_EQUAL(false, val.asBool());
674 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
675
676 // Zero (unsigned constructor arg)
677 val = Json::Value(0u);
678
679 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
680
681 checks = IsCheck();
682 checks.isInt_ = true;
683 checks.isInt64_ = true;
684 checks.isUInt_ = true;
685 checks.isUInt64_ = true;
686 checks.isIntegral_ = true;
687 checks.isDouble_ = true;
688 checks.isNumeric_ = true;
689 JSONTEST_ASSERT_PRED(checkIs(val, checks));
690
691 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
692 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
693 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
694
695 JSONTEST_ASSERT_EQUAL(0, val.asInt());
696 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
697 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
698 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
699 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
700 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
701 JSONTEST_ASSERT_EQUAL(false, val.asBool());
702 JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
703
704 // Zero (floating-point constructor arg)
705 val = Json::Value(0.0);
706
707 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
708
709 checks = IsCheck();
710 checks.isInt_ = true;
711 checks.isInt64_ = true;
712 checks.isUInt_ = true;
713 checks.isUInt64_ = true;
714 checks.isIntegral_ = true;
715 checks.isDouble_ = true;
716 checks.isNumeric_ = true;
717 JSONTEST_ASSERT_PRED(checkIs(val, checks));
718
719 JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
720 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
721 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
722
723 JSONTEST_ASSERT_EQUAL(0, val.asInt());
724 JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
725 JSONTEST_ASSERT_EQUAL(0, val.asUInt());
726 JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
727 JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
728 JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
729 JSONTEST_ASSERT_EQUAL(false, val.asBool());
730 JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
731
732 // 2^20 (signed constructor arg)
733 val = Json::Value(1 << 20);
734
735 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
736 checks = IsCheck();
737 checks.isInt_ = true;
738 checks.isInt64_ = true;
739 checks.isUInt_ = true;
740 checks.isUInt64_ = true;
741 checks.isIntegral_ = true;
742 checks.isDouble_ = true;
743 checks.isNumeric_ = true;
744 JSONTEST_ASSERT_PRED(checkIs(val, checks));
745
746 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
747 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
748 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
749
750 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
751 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
752 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
753 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
754 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
755 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
756 JSONTEST_ASSERT_EQUAL(true, val.asBool());
757 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
758
759 // 2^20 (unsigned constructor arg)
760 val = Json::Value(Json::UInt(1 << 20));
761
762 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
763
764 checks = IsCheck();
765 checks.isInt_ = true;
766 checks.isInt64_ = true;
767 checks.isUInt_ = true;
768 checks.isUInt64_ = true;
769 checks.isIntegral_ = true;
770 checks.isDouble_ = true;
771 checks.isNumeric_ = true;
772 JSONTEST_ASSERT_PRED(checkIs(val, checks));
773
774 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
775 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
776 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
777
778 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
779 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
780 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
781 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
782 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
783 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
784 JSONTEST_ASSERT_EQUAL(true, val.asBool());
785 JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
786
787 // 2^20 (floating-point constructor arg)
788 val = Json::Value((1 << 20) / 1.0);
789
790 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
791
792 checks = IsCheck();
793 checks.isInt_ = true;
794 checks.isInt64_ = true;
795 checks.isUInt_ = true;
796 checks.isUInt64_ = true;
797 checks.isIntegral_ = true;
798 checks.isDouble_ = true;
799 checks.isNumeric_ = true;
800 JSONTEST_ASSERT_PRED(checkIs(val, checks));
801
802 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
803 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
804 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
805
806 JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
807 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
808 JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
809 JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
810 JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
811 JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
812 JSONTEST_ASSERT_EQUAL(true, val.asBool());
813 JSONTEST_ASSERT_STRING_EQUAL(
814 "1048576.0",
815 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
816
817 // -2^20
818 val = Json::Value(-(1 << 20));
819
820 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
821
822 checks = IsCheck();
823 checks.isInt_ = true;
824 checks.isInt64_ = true;
825 checks.isIntegral_ = true;
826 checks.isDouble_ = true;
827 checks.isNumeric_ = true;
828 JSONTEST_ASSERT_PRED(checkIs(val, checks));
829
830 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
831 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
832 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
833
834 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
835 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
836 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
837 JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
838 JSONTEST_ASSERT_EQUAL(true, val.asBool());
839 JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
840
841 // int32 max
842 val = Json::Value(kint32max);
843
844 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
845
846 checks = IsCheck();
847 checks.isInt_ = true;
848 checks.isInt64_ = true;
849 checks.isUInt_ = true;
850 checks.isUInt64_ = true;
851 checks.isIntegral_ = true;
852 checks.isDouble_ = true;
853 checks.isNumeric_ = true;
854 JSONTEST_ASSERT_PRED(checkIs(val, checks));
855
856 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
857 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
858 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
859
860 JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
861 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
862 JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
863 JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
864 JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
865 JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
866 JSONTEST_ASSERT_EQUAL(true, val.asBool());
867 JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
868
869 // int32 min
870 val = Json::Value(kint32min);
871
872 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
873
874 checks = IsCheck();
875 checks.isInt_ = true;
876 checks.isInt64_ = true;
877 checks.isIntegral_ = true;
878 checks.isDouble_ = true;
879 checks.isNumeric_ = true;
880 JSONTEST_ASSERT_PRED(checkIs(val, checks));
881
882 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
883 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
884 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
885
886 JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
887 JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
888 JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
889 JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
890 JSONTEST_ASSERT_EQUAL(true, val.asBool());
891 JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
892
893 // uint32 max
894 val = Json::Value(kuint32max);
895
896 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
897
898 checks = IsCheck();
899 checks.isInt64_ = true;
900 checks.isUInt_ = true;
901 checks.isUInt64_ = true;
902 checks.isIntegral_ = true;
903 checks.isDouble_ = true;
904 checks.isNumeric_ = true;
905 JSONTEST_ASSERT_PRED(checkIs(val, checks));
906
907 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
908 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
909 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
910
911 #ifndef JSON_NO_INT64
912 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
913 #endif
914 JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
915 JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
916 JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
917 JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
918 JSONTEST_ASSERT_EQUAL(true, val.asBool());
919 JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
920
921 #ifdef JSON_NO_INT64
922 // int64 max
923 val = Json::Value(double(kint64max));
924
925 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
926
927 checks = IsCheck();
928 checks.isDouble_ = true;
929 checks.isNumeric_ = true;
930 JSONTEST_ASSERT_PRED(checkIs(val, checks));
931
932 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
933 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
934 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
935
936 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
937 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
938 JSONTEST_ASSERT_EQUAL(true, val.asBool());
939 JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
940
941 // int64 min
942 val = Json::Value(double(kint64min));
943
944 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
945
946 checks = IsCheck();
947 checks.isDouble_ = true;
948 checks.isNumeric_ = true;
949 JSONTEST_ASSERT_PRED(checkIs(val, checks));
950
951 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
952 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
953 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
954
955 JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
956 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
957 JSONTEST_ASSERT_EQUAL(true, val.asBool());
958 JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
959
960 // uint64 max
961 val = Json::Value(double(kuint64max));
962
963 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
964
965 checks = IsCheck();
966 checks.isDouble_ = true;
967 checks.isNumeric_ = true;
968 JSONTEST_ASSERT_PRED(checkIs(val, checks));
969
970 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
971 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
972 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
973
974 JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
975 JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
976 JSONTEST_ASSERT_EQUAL(true, val.asBool());
977 JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
978 #else // ifdef JSON_NO_INT64
979 // 2^40 (signed constructor arg)
980 val = Json::Value(Json::Int64(1) << 40);
981
982 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
983
984 checks = IsCheck();
985 checks.isInt64_ = true;
986 checks.isUInt64_ = true;
987 checks.isIntegral_ = true;
988 checks.isDouble_ = true;
989 checks.isNumeric_ = true;
990 JSONTEST_ASSERT_PRED(checkIs(val, checks));
991
992 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
993 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
994 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
995
996 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
997 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
998 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
999 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
1000 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
1001 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
1002 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1003 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
1004
1005 // 2^40 (unsigned constructor arg)
1006 val = Json::Value(Json::UInt64(1) << 40);
1007
1008 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1009
1010 checks = IsCheck();
1011 checks.isInt64_ = true;
1012 checks.isUInt64_ = true;
1013 checks.isIntegral_ = true;
1014 checks.isDouble_ = true;
1015 checks.isNumeric_ = true;
1016 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1017
1018 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1019 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1020 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1021
1022 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
1023 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
1024 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
1025 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
1026 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
1027 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
1028 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1029 JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
1030
1031 // 2^40 (floating-point constructor arg)
1032 val = Json::Value((Json::Int64(1) << 40) / 1.0);
1033
1034 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1035
1036 checks = IsCheck();
1037 checks.isInt64_ = true;
1038 checks.isUInt64_ = true;
1039 checks.isIntegral_ = true;
1040 checks.isDouble_ = true;
1041 checks.isNumeric_ = true;
1042 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1043
1044 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1045 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1046 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1047
1048 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
1049 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
1050 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
1051 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
1052 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
1053 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
1054 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1055 JSONTEST_ASSERT_STRING_EQUAL(
1056 "1099511627776.0",
1057 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1058
1059 // -2^40
1060 val = Json::Value(-(Json::Int64(1) << 40));
1061
1062 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
1063
1064 checks = IsCheck();
1065 checks.isInt64_ = true;
1066 checks.isIntegral_ = true;
1067 checks.isDouble_ = true;
1068 checks.isNumeric_ = true;
1069 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1070
1071 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1072 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1073 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1074
1075 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
1076 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
1077 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
1078 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
1079 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1080 JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
1081
1082 // int64 max
1083 val = Json::Value(Json::Int64(kint64max));
1084
1085 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
1086
1087 checks = IsCheck();
1088 checks.isInt64_ = true;
1089 checks.isUInt64_ = true;
1090 checks.isIntegral_ = true;
1091 checks.isDouble_ = true;
1092 checks.isNumeric_ = true;
1093 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1094
1095 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1096 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1097 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1098
1099 JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
1100 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
1101 JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
1102 JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
1103 JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
1104 JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
1105 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1106 JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
1107
1108 // int64 max (floating point constructor). Note that kint64max is not exactly
1109 // representable as a double, and will be rounded up to be higher.
1110 val = Json::Value(double(kint64max));
1111
1112 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1113
1114 checks = IsCheck();
1115 checks.isUInt64_ = true;
1116 checks.isIntegral_ = true;
1117 checks.isDouble_ = true;
1118 checks.isNumeric_ = true;
1119 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1120
1121 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1122 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1123 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1124
1125 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
1126 JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
1127 JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
1128 JSONTEST_ASSERT_EQUAL(float(Json::UInt64(1) << 63), val.asFloat());
1129
1130 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1131 JSONTEST_ASSERT_STRING_EQUAL(
1132 "9.2233720368547758e+18",
1133 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1134
1135 // int64 min
1136 val = Json::Value(Json::Int64(kint64min));
1137
1138 JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
1139
1140 checks = IsCheck();
1141 checks.isInt64_ = true;
1142 checks.isIntegral_ = true;
1143 checks.isDouble_ = true;
1144 checks.isNumeric_ = true;
1145 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1146
1147 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1148 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1149 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1150
1151 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
1152 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
1153 JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
1154 JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
1155 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1156 JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
1157
1158 // int64 min (floating point constructor). Note that kint64min *is* exactly
1159 // representable as a double.
1160 val = Json::Value(double(kint64min));
1161
1162 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1163
1164 checks = IsCheck();
1165 checks.isInt64_ = true;
1166 checks.isIntegral_ = true;
1167 checks.isDouble_ = true;
1168 checks.isNumeric_ = true;
1169 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1170
1171 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1172 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1173 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1174
1175 JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
1176 JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
1177 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
1178 JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
1179 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1180 JSONTEST_ASSERT_STRING_EQUAL(
1181 "-9.2233720368547758e+18",
1182 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1183
1184 // 10^19
1185 const auto ten_to_19 = static_cast<Json::UInt64>(1e19);
1186 val = Json::Value(Json::UInt64(ten_to_19));
1187
1188 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1189
1190 checks = IsCheck();
1191 checks.isUInt64_ = true;
1192 checks.isIntegral_ = true;
1193 checks.isDouble_ = true;
1194 checks.isNumeric_ = true;
1195 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1196
1197 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1198 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1199 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1200
1201 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
1202 JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
1203 JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
1204 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
1205 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1206 JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
1207
1208 // 10^19 (double constructor). Note that 10^19 is not exactly representable
1209 // as a double.
1210 val = Json::Value(uint64ToDouble(ten_to_19));
1211
1212 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1213
1214 checks = IsCheck();
1215 checks.isUInt64_ = true;
1216 checks.isIntegral_ = true;
1217 checks.isDouble_ = true;
1218 checks.isNumeric_ = true;
1219 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1220
1221 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1222 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1223 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1224
1225 JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
1226 JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
1227 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1228 JSONTEST_ASSERT_STRING_EQUAL(
1229 "1e+19",
1230 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1231
1232 // uint64 max
1233 val = Json::Value(Json::UInt64(kuint64max));
1234
1235 JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1236
1237 checks = IsCheck();
1238 checks.isUInt64_ = true;
1239 checks.isIntegral_ = true;
1240 checks.isDouble_ = true;
1241 checks.isNumeric_ = true;
1242 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1243
1244 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1245 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1246 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1247
1248 JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
1249 JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
1250 JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
1251 JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
1252 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1253 JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
1254
1255 // uint64 max (floating point constructor). Note that kuint64max is not
1256 // exactly representable as a double, and will be rounded up to be higher.
1257 val = Json::Value(uint64ToDouble(kuint64max));
1258
1259 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1260
1261 checks = IsCheck();
1262 checks.isDouble_ = true;
1263 checks.isNumeric_ = true;
1264 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1265
1266 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1267 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1268 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1269
1270 JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
1271 JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
1272 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1273 JSONTEST_ASSERT_STRING_EQUAL(
1274 "1.8446744073709552e+19",
1275 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1276 #endif
1277 }
1278
JSONTEST_FIXTURE_LOCAL(ValueTest,nonIntegers)1279 JSONTEST_FIXTURE_LOCAL(ValueTest, nonIntegers) {
1280 IsCheck checks;
1281 Json::Value val;
1282
1283 // Small positive number
1284 val = Json::Value(1.5);
1285
1286 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1287
1288 checks = IsCheck();
1289 checks.isDouble_ = true;
1290 checks.isNumeric_ = true;
1291 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1292
1293 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1294 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1295 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1296 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1297 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1298 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1299 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1300 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1301
1302 JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
1303 JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
1304 JSONTEST_ASSERT_EQUAL(1, val.asInt());
1305 JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
1306 JSONTEST_ASSERT_EQUAL(1, val.asUInt());
1307 JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
1308 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1309 JSONTEST_ASSERT_EQUAL("1.5", val.asString());
1310
1311 // Small negative number
1312 val = Json::Value(-1.5);
1313
1314 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1315
1316 checks = IsCheck();
1317 checks.isDouble_ = true;
1318 checks.isNumeric_ = true;
1319 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1320
1321 JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1322 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1323 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1324 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1325 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1326 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1327 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1328 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1329
1330 JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
1331 JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
1332 JSONTEST_ASSERT_EQUAL(-1, val.asInt());
1333 JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
1334 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1335 JSONTEST_ASSERT_EQUAL("-1.5", val.asString());
1336
1337 // A bit over int32 max
1338 val = Json::Value(kint32max + 0.5);
1339
1340 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1341
1342 checks = IsCheck();
1343 checks.isDouble_ = true;
1344 checks.isNumeric_ = true;
1345 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1346
1347 JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1348 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1349 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1350 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1351 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1352 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1353 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1354 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1355
1356 JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
1357 JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
1358 JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
1359 #ifdef JSON_HAS_INT64
1360 JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
1361 JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
1362 #endif
1363 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1364 JSONTEST_ASSERT_EQUAL(
1365 "2147483647.5",
1366 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1367
1368 // A bit under int32 min
1369 val = Json::Value(kint32min - 0.5);
1370
1371 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1372
1373 checks = IsCheck();
1374 checks.isDouble_ = true;
1375 checks.isNumeric_ = true;
1376 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1377
1378 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1379 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1380 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1381 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1382 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1383 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1384 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1385 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1386
1387 JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
1388 JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
1389 #ifdef JSON_HAS_INT64
1390 JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 31), val.asLargestInt());
1391 #endif
1392 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1393 JSONTEST_ASSERT_EQUAL(
1394 "-2147483648.5",
1395 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1396
1397 // A bit over uint32 max
1398 val = Json::Value(kuint32max + 0.5);
1399
1400 JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1401
1402 checks = IsCheck();
1403 checks.isDouble_ = true;
1404 checks.isNumeric_ = true;
1405 JSONTEST_ASSERT_PRED(checkIs(val, checks));
1406
1407 JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1408 JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1409 JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1410 JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1411 JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1412 JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1413 JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1414 JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1415
1416 JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
1417 JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
1418 #ifdef JSON_HAS_INT64
1419 JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32) - 1, val.asLargestInt());
1420 JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32) - Json::UInt64(1),
1421 val.asLargestUInt());
1422 #endif
1423 JSONTEST_ASSERT_EQUAL(true, val.asBool());
1424 JSONTEST_ASSERT_EQUAL(
1425 "4294967295.5",
1426 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1427
1428 val = Json::Value(1.2345678901234);
1429 JSONTEST_ASSERT_STRING_EQUAL(
1430 "1.2345678901234001",
1431 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1432
1433 // A 16-digit floating point number.
1434 val = Json::Value(2199023255552000.0f);
1435 JSONTEST_ASSERT_EQUAL(float(2199023255552000.0f), val.asFloat());
1436 JSONTEST_ASSERT_STRING_EQUAL(
1437 "2199023255552000.0",
1438 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1439
1440 // A very large floating point number.
1441 val = Json::Value(3.402823466385289e38);
1442 JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
1443 JSONTEST_ASSERT_STRING_EQUAL(
1444 "3.402823466385289e+38",
1445 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1446
1447 // An even larger floating point number.
1448 val = Json::Value(1.2345678e300);
1449 JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
1450 JSONTEST_ASSERT_STRING_EQUAL(
1451 "1.2345678e+300",
1452 normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1453 }
1454
checkConstMemberCount(const Json::Value & value,unsigned int expectedCount)1455 void ValueTest::checkConstMemberCount(const Json::Value& value,
1456 unsigned int expectedCount) {
1457 unsigned int count = 0;
1458 Json::Value::const_iterator itEnd = value.end();
1459 for (Json::Value::const_iterator it = value.begin(); it != itEnd; ++it) {
1460 ++count;
1461 }
1462 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::const_iterator";
1463 }
1464
checkMemberCount(Json::Value & value,unsigned int expectedCount)1465 void ValueTest::checkMemberCount(Json::Value& value,
1466 unsigned int expectedCount) {
1467 JSONTEST_ASSERT_EQUAL(expectedCount, value.size());
1468
1469 unsigned int count = 0;
1470 Json::Value::iterator itEnd = value.end();
1471 for (Json::Value::iterator it = value.begin(); it != itEnd; ++it) {
1472 ++count;
1473 }
1474 JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::iterator";
1475
1476 JSONTEST_ASSERT_PRED(checkConstMemberCount(value, expectedCount));
1477 }
1478
1479 ValueTest::IsCheck::IsCheck() = default;
1480
checkIs(const Json::Value & value,const IsCheck & check)1481 void ValueTest::checkIs(const Json::Value& value, const IsCheck& check) {
1482 JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject());
1483 JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray());
1484 JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool());
1485 JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble());
1486 JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt());
1487 JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt());
1488 JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral());
1489 JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric());
1490 JSONTEST_ASSERT_EQUAL(check.isString_, value.isString());
1491 JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull());
1492
1493 #ifdef JSON_HAS_INT64
1494 JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64());
1495 JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64());
1496 #else
1497 JSONTEST_ASSERT_EQUAL(false, value.isInt64());
1498 JSONTEST_ASSERT_EQUAL(false, value.isUInt64());
1499 #endif
1500 }
1501
JSONTEST_FIXTURE_LOCAL(ValueTest,compareNull)1502 JSONTEST_FIXTURE_LOCAL(ValueTest, compareNull) {
1503 JSONTEST_ASSERT_PRED(checkIsEqual(Json::Value(), Json::Value()));
1504 JSONTEST_ASSERT_PRED(
1505 checkIsEqual(Json::Value::nullSingleton(), Json::Value()));
1506 JSONTEST_ASSERT_PRED(
1507 checkIsEqual(Json::Value::nullSingleton(), Json::Value::nullSingleton()));
1508 }
1509
JSONTEST_FIXTURE_LOCAL(ValueTest,compareInt)1510 JSONTEST_FIXTURE_LOCAL(ValueTest, compareInt) {
1511 JSONTEST_ASSERT_PRED(checkIsLess(0, 10));
1512 JSONTEST_ASSERT_PRED(checkIsEqual(10, 10));
1513 JSONTEST_ASSERT_PRED(checkIsEqual(-10, -10));
1514 JSONTEST_ASSERT_PRED(checkIsLess(-10, 0));
1515 }
1516
JSONTEST_FIXTURE_LOCAL(ValueTest,compareUInt)1517 JSONTEST_FIXTURE_LOCAL(ValueTest, compareUInt) {
1518 JSONTEST_ASSERT_PRED(checkIsLess(0u, 10u));
1519 JSONTEST_ASSERT_PRED(checkIsLess(0u, Json::Value::maxUInt));
1520 JSONTEST_ASSERT_PRED(checkIsEqual(10u, 10u));
1521 }
1522
JSONTEST_FIXTURE_LOCAL(ValueTest,compareDouble)1523 JSONTEST_FIXTURE_LOCAL(ValueTest, compareDouble) {
1524 JSONTEST_ASSERT_PRED(checkIsLess(0.0, 10.0));
1525 JSONTEST_ASSERT_PRED(checkIsEqual(10.0, 10.0));
1526 JSONTEST_ASSERT_PRED(checkIsEqual(-10.0, -10.0));
1527 JSONTEST_ASSERT_PRED(checkIsLess(-10.0, 0.0));
1528 }
1529
JSONTEST_FIXTURE_LOCAL(ValueTest,compareString)1530 JSONTEST_FIXTURE_LOCAL(ValueTest, compareString) {
1531 JSONTEST_ASSERT_PRED(checkIsLess("", " "));
1532 JSONTEST_ASSERT_PRED(checkIsLess("", "a"));
1533 JSONTEST_ASSERT_PRED(checkIsLess("abcd", "zyui"));
1534 JSONTEST_ASSERT_PRED(checkIsLess("abc", "abcd"));
1535 JSONTEST_ASSERT_PRED(checkIsEqual("abcd", "abcd"));
1536 JSONTEST_ASSERT_PRED(checkIsEqual(" ", " "));
1537 JSONTEST_ASSERT_PRED(checkIsLess("ABCD", "abcd"));
1538 JSONTEST_ASSERT_PRED(checkIsEqual("ABCD", "ABCD"));
1539 }
1540
JSONTEST_FIXTURE_LOCAL(ValueTest,compareBoolean)1541 JSONTEST_FIXTURE_LOCAL(ValueTest, compareBoolean) {
1542 JSONTEST_ASSERT_PRED(checkIsLess(false, true));
1543 JSONTEST_ASSERT_PRED(checkIsEqual(false, false));
1544 JSONTEST_ASSERT_PRED(checkIsEqual(true, true));
1545 }
1546
JSONTEST_FIXTURE_LOCAL(ValueTest,compareArray)1547 JSONTEST_FIXTURE_LOCAL(ValueTest, compareArray) {
1548 // array compare size then content
1549 Json::Value emptyArray(Json::arrayValue);
1550 Json::Value l1aArray;
1551 l1aArray.append(0);
1552 Json::Value l1bArray;
1553 l1bArray.append(10);
1554 Json::Value l2aArray;
1555 l2aArray.append(0);
1556 l2aArray.append(0);
1557 Json::Value l2bArray;
1558 l2bArray.append(0);
1559 l2bArray.append(10);
1560 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l1aArray));
1561 JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l2aArray));
1562 JSONTEST_ASSERT_PRED(checkIsLess(l1aArray, l1bArray));
1563 JSONTEST_ASSERT_PRED(checkIsLess(l1bArray, l2aArray));
1564 JSONTEST_ASSERT_PRED(checkIsLess(l2aArray, l2bArray));
1565 JSONTEST_ASSERT_PRED(checkIsEqual(emptyArray, Json::Value(emptyArray)));
1566 JSONTEST_ASSERT_PRED(checkIsEqual(l1aArray, Json::Value(l1aArray)));
1567 JSONTEST_ASSERT_PRED(checkIsEqual(l1bArray, Json::Value(l1bArray)));
1568 JSONTEST_ASSERT_PRED(checkIsEqual(l2aArray, Json::Value(l2aArray)));
1569 JSONTEST_ASSERT_PRED(checkIsEqual(l2bArray, Json::Value(l2bArray)));
1570 }
1571
JSONTEST_FIXTURE_LOCAL(ValueTest,compareObject)1572 JSONTEST_FIXTURE_LOCAL(ValueTest, compareObject) {
1573 // object compare size then content
1574 Json::Value emptyObject(Json::objectValue);
1575 Json::Value l1aObject;
1576 l1aObject["key1"] = 0;
1577 Json::Value l1bObject;
1578 l1bObject["key1"] = 10;
1579 Json::Value l2aObject;
1580 l2aObject["key1"] = 0;
1581 l2aObject["key2"] = 0;
1582 Json::Value l2bObject;
1583 l2bObject["key1"] = 10;
1584 l2bObject["key2"] = 0;
1585 JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l1aObject));
1586 JSONTEST_ASSERT_PRED(checkIsLess(l1aObject, l1bObject));
1587 JSONTEST_ASSERT_PRED(checkIsLess(l1bObject, l2aObject));
1588 JSONTEST_ASSERT_PRED(checkIsLess(l2aObject, l2bObject));
1589 JSONTEST_ASSERT_PRED(checkIsEqual(emptyObject, Json::Value(emptyObject)));
1590 JSONTEST_ASSERT_PRED(checkIsEqual(l1aObject, Json::Value(l1aObject)));
1591 JSONTEST_ASSERT_PRED(checkIsEqual(l1bObject, Json::Value(l1bObject)));
1592 JSONTEST_ASSERT_PRED(checkIsEqual(l2aObject, Json::Value(l2aObject)));
1593 JSONTEST_ASSERT_PRED(checkIsEqual(l2bObject, Json::Value(l2bObject)));
1594 {
1595 Json::Value aObject;
1596 aObject["a"] = 10;
1597 Json::Value bObject;
1598 bObject["b"] = 0;
1599 Json::Value cObject;
1600 cObject["c"] = 20;
1601 cObject["f"] = 15;
1602 Json::Value dObject;
1603 dObject["d"] = -2;
1604 dObject["e"] = 10;
1605 JSONTEST_ASSERT_PRED(checkIsLess(aObject, bObject));
1606 JSONTEST_ASSERT_PRED(checkIsLess(bObject, cObject));
1607 JSONTEST_ASSERT_PRED(checkIsLess(cObject, dObject));
1608 JSONTEST_ASSERT_PRED(checkIsEqual(aObject, Json::Value(aObject)));
1609 JSONTEST_ASSERT_PRED(checkIsEqual(bObject, Json::Value(bObject)));
1610 JSONTEST_ASSERT_PRED(checkIsEqual(cObject, Json::Value(cObject)));
1611 JSONTEST_ASSERT_PRED(checkIsEqual(dObject, Json::Value(dObject)));
1612 }
1613 }
1614
JSONTEST_FIXTURE_LOCAL(ValueTest,compareType)1615 JSONTEST_FIXTURE_LOCAL(ValueTest, compareType) {
1616 // object of different type are ordered according to their type
1617 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(), Json::Value(1)));
1618 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1), Json::Value(1u)));
1619 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1u), Json::Value(1.0)));
1620 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1.0), Json::Value("a")));
1621 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value("a"), Json::Value(true)));
1622 JSONTEST_ASSERT_PRED(
1623 checkIsLess(Json::Value(true), Json::Value(Json::arrayValue)));
1624 JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(Json::arrayValue),
1625 Json::Value(Json::objectValue)));
1626 }
1627
JSONTEST_FIXTURE_LOCAL(ValueTest,CopyObject)1628 JSONTEST_FIXTURE_LOCAL(ValueTest, CopyObject) {
1629 Json::Value arrayVal;
1630 arrayVal.append("val1");
1631 arrayVal.append("val2");
1632 arrayVal.append("val3");
1633 Json::Value stringVal("string value");
1634 Json::Value copy1, copy2;
1635 {
1636 Json::Value arrayCopy, stringCopy;
1637 arrayCopy.copy(arrayVal);
1638 stringCopy.copy(stringVal);
1639 JSONTEST_ASSERT_PRED(checkIsEqual(arrayCopy, arrayVal));
1640 JSONTEST_ASSERT_PRED(checkIsEqual(stringCopy, stringVal));
1641 arrayCopy.append("val4");
1642 JSONTEST_ASSERT(arrayCopy.size() == 4);
1643 arrayVal.append("new4");
1644 arrayVal.append("new5");
1645 JSONTEST_ASSERT(arrayVal.size() == 5);
1646 JSONTEST_ASSERT(!(arrayCopy == arrayVal));
1647 stringCopy = "another string";
1648 JSONTEST_ASSERT(!(stringCopy == stringVal));
1649 copy1.copy(arrayCopy);
1650 copy2.copy(stringCopy);
1651 }
1652 JSONTEST_ASSERT(arrayVal.size() == 5);
1653 JSONTEST_ASSERT(stringVal == "string value");
1654 JSONTEST_ASSERT(copy1.size() == 4);
1655 JSONTEST_ASSERT(copy2 == "another string");
1656 copy1.copy(stringVal);
1657 JSONTEST_ASSERT(copy1 == "string value");
1658 copy2.copy(arrayVal);
1659 JSONTEST_ASSERT(copy2.size() == 5);
1660 {
1661 Json::Value srcObject, objectCopy, otherObject;
1662 srcObject["key0"] = 10;
1663 objectCopy.copy(srcObject);
1664 JSONTEST_ASSERT(srcObject["key0"] == 10);
1665 JSONTEST_ASSERT(objectCopy["key0"] == 10);
1666 JSONTEST_ASSERT(srcObject.getMemberNames().size() == 1);
1667 JSONTEST_ASSERT(objectCopy.getMemberNames().size() == 1);
1668 otherObject["key1"] = 15;
1669 otherObject["key2"] = 16;
1670 JSONTEST_ASSERT(otherObject.getMemberNames().size() == 2);
1671 objectCopy.copy(otherObject);
1672 JSONTEST_ASSERT(objectCopy["key1"] == 15);
1673 JSONTEST_ASSERT(objectCopy["key2"] == 16);
1674 JSONTEST_ASSERT(objectCopy.getMemberNames().size() == 2);
1675 otherObject["key1"] = 20;
1676 JSONTEST_ASSERT(objectCopy["key1"] == 15);
1677 }
1678 }
1679
checkIsLess(const Json::Value & x,const Json::Value & y)1680 void ValueTest::checkIsLess(const Json::Value& x, const Json::Value& y) {
1681 JSONTEST_ASSERT(x < y);
1682 JSONTEST_ASSERT(y > x);
1683 JSONTEST_ASSERT(x <= y);
1684 JSONTEST_ASSERT(y >= x);
1685 JSONTEST_ASSERT(!(x == y));
1686 JSONTEST_ASSERT(!(y == x));
1687 JSONTEST_ASSERT(!(x >= y));
1688 JSONTEST_ASSERT(!(y <= x));
1689 JSONTEST_ASSERT(!(x > y));
1690 JSONTEST_ASSERT(!(y < x));
1691 JSONTEST_ASSERT(x.compare(y) < 0);
1692 JSONTEST_ASSERT(y.compare(x) >= 0);
1693 }
1694
checkIsEqual(const Json::Value & x,const Json::Value & y)1695 void ValueTest::checkIsEqual(const Json::Value& x, const Json::Value& y) {
1696 JSONTEST_ASSERT(x == y);
1697 JSONTEST_ASSERT(y == x);
1698 JSONTEST_ASSERT(x <= y);
1699 JSONTEST_ASSERT(y <= x);
1700 JSONTEST_ASSERT(x >= y);
1701 JSONTEST_ASSERT(y >= x);
1702 JSONTEST_ASSERT(!(x < y));
1703 JSONTEST_ASSERT(!(y < x));
1704 JSONTEST_ASSERT(!(x > y));
1705 JSONTEST_ASSERT(!(y > x));
1706 JSONTEST_ASSERT(x.compare(y) == 0);
1707 JSONTEST_ASSERT(y.compare(x) == 0);
1708 }
1709
JSONTEST_FIXTURE_LOCAL(ValueTest,typeChecksThrowExceptions)1710 JSONTEST_FIXTURE_LOCAL(ValueTest, typeChecksThrowExceptions) {
1711 #if JSON_USE_EXCEPTION
1712
1713 Json::Value intVal(1);
1714 Json::Value strVal("Test");
1715 Json::Value objVal(Json::objectValue);
1716 Json::Value arrVal(Json::arrayValue);
1717
1718 JSONTEST_ASSERT_THROWS(intVal["test"]);
1719 JSONTEST_ASSERT_THROWS(strVal["test"]);
1720 JSONTEST_ASSERT_THROWS(arrVal["test"]);
1721
1722 JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
1723 JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
1724 JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
1725
1726 JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
1727 JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
1728 JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
1729
1730 JSONTEST_ASSERT_THROWS(intVal[0]);
1731 JSONTEST_ASSERT_THROWS(objVal[0]);
1732 JSONTEST_ASSERT_THROWS(strVal[0]);
1733
1734 JSONTEST_ASSERT_THROWS(intVal.clear());
1735
1736 JSONTEST_ASSERT_THROWS(intVal.resize(1));
1737 JSONTEST_ASSERT_THROWS(strVal.resize(1));
1738 JSONTEST_ASSERT_THROWS(objVal.resize(1));
1739
1740 JSONTEST_ASSERT_THROWS(intVal.asCString());
1741
1742 JSONTEST_ASSERT_THROWS(objVal.asString());
1743 JSONTEST_ASSERT_THROWS(arrVal.asString());
1744
1745 JSONTEST_ASSERT_THROWS(strVal.asInt());
1746 JSONTEST_ASSERT_THROWS(objVal.asInt());
1747 JSONTEST_ASSERT_THROWS(arrVal.asInt());
1748
1749 JSONTEST_ASSERT_THROWS(strVal.asUInt());
1750 JSONTEST_ASSERT_THROWS(objVal.asUInt());
1751 JSONTEST_ASSERT_THROWS(arrVal.asUInt());
1752
1753 JSONTEST_ASSERT_THROWS(strVal.asInt64());
1754 JSONTEST_ASSERT_THROWS(objVal.asInt64());
1755 JSONTEST_ASSERT_THROWS(arrVal.asInt64());
1756
1757 JSONTEST_ASSERT_THROWS(strVal.asUInt64());
1758 JSONTEST_ASSERT_THROWS(objVal.asUInt64());
1759 JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
1760
1761 JSONTEST_ASSERT_THROWS(strVal.asDouble());
1762 JSONTEST_ASSERT_THROWS(objVal.asDouble());
1763 JSONTEST_ASSERT_THROWS(arrVal.asDouble());
1764
1765 JSONTEST_ASSERT_THROWS(strVal.asFloat());
1766 JSONTEST_ASSERT_THROWS(objVal.asFloat());
1767 JSONTEST_ASSERT_THROWS(arrVal.asFloat());
1768
1769 JSONTEST_ASSERT_THROWS(strVal.asBool());
1770 JSONTEST_ASSERT_THROWS(objVal.asBool());
1771 JSONTEST_ASSERT_THROWS(arrVal.asBool());
1772
1773 #endif
1774 }
1775
JSONTEST_FIXTURE_LOCAL(ValueTest,offsetAccessors)1776 JSONTEST_FIXTURE_LOCAL(ValueTest, offsetAccessors) {
1777 Json::Value x;
1778 JSONTEST_ASSERT(x.getOffsetStart() == 0);
1779 JSONTEST_ASSERT(x.getOffsetLimit() == 0);
1780 x.setOffsetStart(10);
1781 x.setOffsetLimit(20);
1782 JSONTEST_ASSERT(x.getOffsetStart() == 10);
1783 JSONTEST_ASSERT(x.getOffsetLimit() == 20);
1784 Json::Value y(x);
1785 JSONTEST_ASSERT(y.getOffsetStart() == 10);
1786 JSONTEST_ASSERT(y.getOffsetLimit() == 20);
1787 Json::Value z;
1788 z.swap(y);
1789 JSONTEST_ASSERT(z.getOffsetStart() == 10);
1790 JSONTEST_ASSERT(z.getOffsetLimit() == 20);
1791 JSONTEST_ASSERT(y.getOffsetStart() == 0);
1792 JSONTEST_ASSERT(y.getOffsetLimit() == 0);
1793 }
1794
JSONTEST_FIXTURE_LOCAL(ValueTest,StaticString)1795 JSONTEST_FIXTURE_LOCAL(ValueTest, StaticString) {
1796 char mutant[] = "hello";
1797 Json::StaticString ss(mutant);
1798 Json::String regular(mutant);
1799 mutant[1] = 'a';
1800 JSONTEST_ASSERT_STRING_EQUAL("hallo", ss.c_str());
1801 JSONTEST_ASSERT_STRING_EQUAL("hello", regular.c_str());
1802 {
1803 Json::Value root;
1804 root["top"] = ss;
1805 JSONTEST_ASSERT_STRING_EQUAL("hallo", root["top"].asString());
1806 mutant[1] = 'u';
1807 JSONTEST_ASSERT_STRING_EQUAL("hullo", root["top"].asString());
1808 }
1809 {
1810 Json::Value root;
1811 root["top"] = regular;
1812 JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
1813 mutant[1] = 'u';
1814 JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
1815 }
1816 }
1817
JSONTEST_FIXTURE_LOCAL(ValueTest,WideString)1818 JSONTEST_FIXTURE_LOCAL(ValueTest, WideString) {
1819 // https://github.com/open-source-parsers/jsoncpp/issues/756
1820 const std::string uni = u8"\u5f0f\uff0c\u8fdb"; // "式,进"
1821 std::string styled;
1822 {
1823 Json::Value v;
1824 v["abc"] = uni;
1825 styled = v.toStyledString();
1826 }
1827 Json::Value root;
1828 {
1829 JSONCPP_STRING errs;
1830 std::istringstream iss(styled);
1831 bool ok = parseFromStream(Json::CharReaderBuilder(), iss, &root, &errs);
1832 JSONTEST_ASSERT(ok);
1833 if (!ok) {
1834 std::cerr << "errs: " << errs << std::endl;
1835 }
1836 }
1837 JSONTEST_ASSERT_STRING_EQUAL(root["abc"].asString(), uni);
1838 }
1839
JSONTEST_FIXTURE_LOCAL(ValueTest,CommentBefore)1840 JSONTEST_FIXTURE_LOCAL(ValueTest, CommentBefore) {
1841 Json::Value val; // fill val
1842 val.setComment(Json::String("// this comment should appear before"),
1843 Json::commentBefore);
1844 Json::StreamWriterBuilder wbuilder;
1845 wbuilder.settings_["commentStyle"] = "All";
1846 {
1847 char const expected[] = "// this comment should appear before\nnull";
1848 Json::String result = Json::writeString(wbuilder, val);
1849 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1850 Json::String res2 = val.toStyledString();
1851 Json::String exp2 = "\n";
1852 exp2 += expected;
1853 exp2 += "\n";
1854 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1855 }
1856 Json::Value other = "hello";
1857 val.swapPayload(other);
1858 {
1859 char const expected[] = "// this comment should appear before\n\"hello\"";
1860 Json::String result = Json::writeString(wbuilder, val);
1861 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1862 Json::String res2 = val.toStyledString();
1863 Json::String exp2 = "\n";
1864 exp2 += expected;
1865 exp2 += "\n";
1866 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1867 JSONTEST_ASSERT_STRING_EQUAL("null\n", other.toStyledString());
1868 }
1869 val = "hello";
1870 // val.setComment("// this comment should appear before",
1871 // Json::CommentPlacement::commentBefore); Assignment over-writes comments.
1872 {
1873 char const expected[] = "\"hello\"";
1874 Json::String result = Json::writeString(wbuilder, val);
1875 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1876 Json::String res2 = val.toStyledString();
1877 Json::String exp2;
1878 exp2 += expected;
1879 exp2 += "\n";
1880 JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1881 }
1882 }
1883
JSONTEST_FIXTURE_LOCAL(ValueTest,zeroes)1884 JSONTEST_FIXTURE_LOCAL(ValueTest, zeroes) {
1885 char const cstr[] = "h\0i";
1886 Json::String binary(cstr, sizeof(cstr)); // include trailing 0
1887 JSONTEST_ASSERT_EQUAL(4U, binary.length());
1888 Json::StreamWriterBuilder b;
1889 {
1890 Json::Value root;
1891 root = binary;
1892 JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
1893 }
1894 {
1895 char const top[] = "top";
1896 Json::Value root;
1897 root[top] = binary;
1898 JSONTEST_ASSERT_STRING_EQUAL(binary, root[top].asString());
1899 Json::Value removed;
1900 bool did;
1901 did = root.removeMember(top, top + sizeof(top) - 1U, &removed);
1902 JSONTEST_ASSERT(did);
1903 JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString());
1904 did = root.removeMember(top, top + sizeof(top) - 1U, &removed);
1905 JSONTEST_ASSERT(!did);
1906 JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString()); // still
1907 }
1908 }
1909
JSONTEST_FIXTURE_LOCAL(ValueTest,zeroesInKeys)1910 JSONTEST_FIXTURE_LOCAL(ValueTest, zeroesInKeys) {
1911 char const cstr[] = "h\0i";
1912 Json::String binary(cstr, sizeof(cstr)); // include trailing 0
1913 JSONTEST_ASSERT_EQUAL(4U, binary.length());
1914 {
1915 Json::Value root;
1916 root[binary] = "there";
1917 JSONTEST_ASSERT_STRING_EQUAL("there", root[binary].asString());
1918 JSONTEST_ASSERT(!root.isMember("h"));
1919 JSONTEST_ASSERT(root.isMember(binary));
1920 JSONTEST_ASSERT_STRING_EQUAL(
1921 "there", root.get(binary, Json::Value::nullSingleton()).asString());
1922 Json::Value removed;
1923 bool did;
1924 did = root.removeMember(binary.data(), binary.data() + binary.length(),
1925 &removed);
1926 JSONTEST_ASSERT(did);
1927 JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString());
1928 did = root.removeMember(binary.data(), binary.data() + binary.length(),
1929 &removed);
1930 JSONTEST_ASSERT(!did);
1931 JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString()); // still
1932 JSONTEST_ASSERT(!root.isMember(binary));
1933 JSONTEST_ASSERT_STRING_EQUAL(
1934 "", root.get(binary, Json::Value::nullSingleton()).asString());
1935 }
1936 }
1937
JSONTEST_FIXTURE_LOCAL(ValueTest,specialFloats)1938 JSONTEST_FIXTURE_LOCAL(ValueTest, specialFloats) {
1939 Json::StreamWriterBuilder b;
1940 b.settings_["useSpecialFloats"] = true;
1941
1942 Json::Value v = std::numeric_limits<double>::quiet_NaN();
1943 Json::String expected = "NaN";
1944 Json::String result = Json::writeString(b, v);
1945 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1946
1947 v = std::numeric_limits<double>::infinity();
1948 expected = "Infinity";
1949 result = Json::writeString(b, v);
1950 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1951
1952 v = -std::numeric_limits<double>::infinity();
1953 expected = "-Infinity";
1954 result = Json::writeString(b, v);
1955 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1956 }
1957
JSONTEST_FIXTURE_LOCAL(ValueTest,precision)1958 JSONTEST_FIXTURE_LOCAL(ValueTest, precision) {
1959 Json::StreamWriterBuilder b;
1960 b.settings_["precision"] = 5;
1961
1962 Json::Value v = 100.0 / 3;
1963 Json::String expected = "33.333";
1964 Json::String result = Json::writeString(b, v);
1965 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1966
1967 v = 0.25000000;
1968 expected = "0.25";
1969 result = Json::writeString(b, v);
1970 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1971
1972 v = 0.2563456;
1973 expected = "0.25635";
1974 result = Json::writeString(b, v);
1975 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1976
1977 b.settings_["precision"] = 1;
1978 expected = "0.3";
1979 result = Json::writeString(b, v);
1980 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1981
1982 b.settings_["precision"] = 17;
1983 v = 1234857476305.256345694873740545068;
1984 expected = "1234857476305.2563";
1985 result = Json::writeString(b, v);
1986 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1987
1988 b.settings_["precision"] = 24;
1989 v = 0.256345694873740545068;
1990 expected = "0.25634569487374054";
1991 result = Json::writeString(b, v);
1992 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1993
1994 b.settings_["precision"] = 5;
1995 b.settings_["precisionType"] = "decimal";
1996 v = 0.256345694873740545068;
1997 expected = "0.25635";
1998 result = Json::writeString(b, v);
1999 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2000
2001 b.settings_["precision"] = 1;
2002 b.settings_["precisionType"] = "decimal";
2003 v = 0.256345694873740545068;
2004 expected = "0.3";
2005 result = Json::writeString(b, v);
2006 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2007
2008 b.settings_["precision"] = 10;
2009 b.settings_["precisionType"] = "decimal";
2010 v = 0.23300000;
2011 expected = "0.233";
2012 result = Json::writeString(b, v);
2013 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2014 }
JSONTEST_FIXTURE_LOCAL(ValueTest,searchValueByPath)2015 JSONTEST_FIXTURE_LOCAL(ValueTest, searchValueByPath) {
2016 Json::Value root, subroot;
2017 root["property1"][0] = 0;
2018 root["property1"][1] = 1;
2019 subroot["object"] = "object";
2020 root["property2"] = subroot;
2021
2022 const Json::Value defaultValue("error");
2023 Json::FastWriter writer;
2024
2025 {
2026 const Json::String expected("{"
2027 "\"property1\":[0,1],"
2028 "\"property2\":{\"object\":\"object\"}"
2029 "}\n");
2030 Json::String outcome = writer.write(root);
2031 JSONTEST_ASSERT_STRING_EQUAL(expected, outcome);
2032
2033 // Array member exists.
2034 const Json::Path path1(".property1.[%]", 1);
2035 Json::Value result = path1.resolve(root);
2036 JSONTEST_ASSERT_EQUAL(Json::Value(1), result);
2037 result = path1.resolve(root, defaultValue);
2038 JSONTEST_ASSERT_EQUAL(Json::Value(1), result);
2039
2040 // Array member does not exist.
2041 const Json::Path path2(".property1.[2]");
2042 result = path2.resolve(root);
2043 JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2044 result = path2.resolve(root, defaultValue);
2045 JSONTEST_ASSERT_EQUAL(defaultValue, result);
2046
2047 // Access array path form error
2048 const Json::Path path3(".property1.0");
2049 result = path3.resolve(root);
2050 JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2051 result = path3.resolve(root, defaultValue);
2052 JSONTEST_ASSERT_EQUAL(defaultValue, result);
2053
2054 // Object member exists.
2055 const Json::Path path4(".property2.%", "object");
2056 result = path4.resolve(root);
2057 JSONTEST_ASSERT_EQUAL(Json::Value("object"), result);
2058 result = path4.resolve(root, defaultValue);
2059 JSONTEST_ASSERT_EQUAL(Json::Value("object"), result);
2060
2061 // Object member does not exist.
2062 const Json::Path path5(".property2.hello");
2063 result = path5.resolve(root);
2064 JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2065 result = path5.resolve(root, defaultValue);
2066 JSONTEST_ASSERT_EQUAL(defaultValue, result);
2067
2068 // Access object path form error
2069 const Json::Path path6(".property2.[0]");
2070 result = path5.resolve(root);
2071 JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2072 result = path6.resolve(root, defaultValue);
2073 JSONTEST_ASSERT_EQUAL(defaultValue, result);
2074
2075 // resolve will not change the value
2076 outcome = writer.write(root);
2077 JSONTEST_ASSERT_STRING_EQUAL(expected, outcome);
2078 }
2079 {
2080 const Json::String expected("{"
2081 "\"property1\":[0,1,null],"
2082 "\"property2\":{"
2083 "\"hello\":null,"
2084 "\"object\":\"object\"}}\n");
2085 Json::Path path1(".property1.[%]", 2);
2086 Json::Value& value1 = path1.make(root);
2087 JSONTEST_ASSERT_EQUAL(Json::nullValue, value1);
2088
2089 Json::Path path2(".property2.%", "hello");
2090 Json::Value& value2 = path2.make(root);
2091 JSONTEST_ASSERT_EQUAL(Json::nullValue, value2);
2092
2093 // make will change the value
2094 const Json::String outcome = writer.write(root);
2095 JSONTEST_ASSERT_STRING_EQUAL(expected, outcome);
2096 }
2097 }
2098 struct FastWriterTest : JsonTest::TestCase {};
2099
JSONTEST_FIXTURE_LOCAL(FastWriterTest,dropNullPlaceholders)2100 JSONTEST_FIXTURE_LOCAL(FastWriterTest, dropNullPlaceholders) {
2101 Json::FastWriter writer;
2102 Json::Value nullValue;
2103 JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
2104
2105 writer.dropNullPlaceholders();
2106 JSONTEST_ASSERT(writer.write(nullValue) == "\n");
2107 }
2108
JSONTEST_FIXTURE_LOCAL(FastWriterTest,enableYAMLCompatibility)2109 JSONTEST_FIXTURE_LOCAL(FastWriterTest, enableYAMLCompatibility) {
2110 Json::FastWriter writer;
2111 Json::Value root;
2112 root["hello"] = "world";
2113
2114 JSONTEST_ASSERT(writer.write(root) == "{\"hello\":\"world\"}\n");
2115
2116 writer.enableYAMLCompatibility();
2117 JSONTEST_ASSERT(writer.write(root) == "{\"hello\": \"world\"}\n");
2118 }
2119
JSONTEST_FIXTURE_LOCAL(FastWriterTest,omitEndingLineFeed)2120 JSONTEST_FIXTURE_LOCAL(FastWriterTest, omitEndingLineFeed) {
2121 Json::FastWriter writer;
2122 Json::Value nullValue;
2123
2124 JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
2125
2126 writer.omitEndingLineFeed();
2127 JSONTEST_ASSERT(writer.write(nullValue) == "null");
2128 }
2129
JSONTEST_FIXTURE_LOCAL(FastWriterTest,writeNumericValue)2130 JSONTEST_FIXTURE_LOCAL(FastWriterTest, writeNumericValue) {
2131 Json::FastWriter writer;
2132 const Json::String expected("{"
2133 "\"emptyValue\":null,"
2134 "\"false\":false,"
2135 "\"null\":\"null\","
2136 "\"number\":-6200000000000000.0,"
2137 "\"real\":1.256,"
2138 "\"uintValue\":17"
2139 "}\n");
2140 Json::Value root;
2141 root["emptyValue"] = Json::nullValue;
2142 root["false"] = false;
2143 root["null"] = "null";
2144 root["number"] = -6.2e+15;
2145 root["real"] = 1.256;
2146 root["uintValue"] = Json::Value(17U);
2147
2148 const Json::String result = writer.write(root);
2149 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2150 }
2151
JSONTEST_FIXTURE_LOCAL(FastWriterTest,writeArrays)2152 JSONTEST_FIXTURE_LOCAL(FastWriterTest, writeArrays) {
2153 Json::FastWriter writer;
2154 const Json::String expected("{"
2155 "\"property1\":[\"value1\",\"value2\"],"
2156 "\"property2\":[]"
2157 "}\n");
2158 Json::Value root;
2159 root["property1"][0] = "value1";
2160 root["property1"][1] = "value2";
2161 root["property2"] = Json::arrayValue;
2162
2163 const Json::String result = writer.write(root);
2164 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2165 }
2166
JSONTEST_FIXTURE_LOCAL(FastWriterTest,writeNestedObjects)2167 JSONTEST_FIXTURE_LOCAL(FastWriterTest, writeNestedObjects) {
2168 Json::FastWriter writer;
2169 const Json::String expected("{"
2170 "\"object1\":{"
2171 "\"bool\":true,"
2172 "\"nested\":123"
2173 "},"
2174 "\"object2\":{}"
2175 "}\n");
2176 Json::Value root, child;
2177 child["nested"] = 123;
2178 child["bool"] = true;
2179 root["object1"] = child;
2180 root["object2"] = Json::objectValue;
2181
2182 const Json::String result = writer.write(root);
2183 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2184 }
2185
2186 struct StyledWriterTest : JsonTest::TestCase {};
2187
JSONTEST_FIXTURE_LOCAL(StyledWriterTest,writeNumericValue)2188 JSONTEST_FIXTURE_LOCAL(StyledWriterTest, writeNumericValue) {
2189 Json::StyledWriter writer;
2190 const Json::String expected("{\n"
2191 " \"emptyValue\" : null,\n"
2192 " \"false\" : false,\n"
2193 " \"null\" : \"null\",\n"
2194 " \"number\" : -6200000000000000.0,\n"
2195 " \"real\" : 1.256,\n"
2196 " \"uintValue\" : 17\n"
2197 "}\n");
2198 Json::Value root;
2199 root["emptyValue"] = Json::nullValue;
2200 root["false"] = false;
2201 root["null"] = "null";
2202 root["number"] = -6.2e+15;
2203 root["real"] = 1.256;
2204 root["uintValue"] = Json::Value(17U);
2205
2206 const Json::String result = writer.write(root);
2207 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2208 }
2209
JSONTEST_FIXTURE_LOCAL(StyledWriterTest,writeArrays)2210 JSONTEST_FIXTURE_LOCAL(StyledWriterTest, writeArrays) {
2211 Json::StyledWriter writer;
2212 const Json::String expected("{\n"
2213 " \"property1\" : [ \"value1\", \"value2\" ],\n"
2214 " \"property2\" : []\n"
2215 "}\n");
2216 Json::Value root;
2217 root["property1"][0] = "value1";
2218 root["property1"][1] = "value2";
2219 root["property2"] = Json::arrayValue;
2220
2221 const Json::String result = writer.write(root);
2222 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2223 }
2224
JSONTEST_FIXTURE_LOCAL(StyledWriterTest,writeNestedObjects)2225 JSONTEST_FIXTURE_LOCAL(StyledWriterTest, writeNestedObjects) {
2226 Json::StyledWriter writer;
2227 const Json::String expected("{\n"
2228 " \"object1\" : {\n"
2229 " \"bool\" : true,\n"
2230 " \"nested\" : 123\n"
2231 " },\n"
2232 " \"object2\" : {}\n"
2233 "}\n");
2234 Json::Value root, child;
2235 child["nested"] = 123;
2236 child["bool"] = true;
2237 root["object1"] = child;
2238 root["object2"] = Json::objectValue;
2239
2240 const Json::String result = writer.write(root);
2241 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2242 }
2243
JSONTEST_FIXTURE_LOCAL(StyledWriterTest,multiLineArray)2244 JSONTEST_FIXTURE_LOCAL(StyledWriterTest, multiLineArray) {
2245 Json::StyledWriter writer;
2246 {
2247 // Array member has more than 20 print effect rendering lines
2248 const Json::String expected("[\n "
2249 "0,\n 1,\n 2,\n "
2250 "3,\n 4,\n 5,\n "
2251 "6,\n 7,\n 8,\n "
2252 "9,\n 10,\n 11,\n "
2253 "12,\n 13,\n 14,\n "
2254 "15,\n 16,\n 17,\n "
2255 "18,\n 19,\n 20\n]\n");
2256 Json::Value root;
2257 for (Json::ArrayIndex i = 0; i < 21; i++)
2258 root[i] = i;
2259 const Json::String result = writer.write(root);
2260 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2261 }
2262 {
2263 // Array members do not exceed 21 print effects to render a single line
2264 const Json::String expected("[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]\n");
2265 Json::Value root;
2266 for (Json::ArrayIndex i = 0; i < 10; i++)
2267 root[i] = i;
2268 const Json::String result = writer.write(root);
2269 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2270 }
2271 }
2272
JSONTEST_FIXTURE_LOCAL(StyledWriterTest,writeValueWithComment)2273 JSONTEST_FIXTURE_LOCAL(StyledWriterTest, writeValueWithComment) {
2274 Json::StyledWriter writer;
2275 {
2276 const Json::String expected("\n//commentBeforeValue\n\"hello\"\n");
2277 Json::Value root = "hello";
2278 root.setComment(Json::String("//commentBeforeValue"), Json::commentBefore);
2279 const Json::String result = writer.write(root);
2280 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2281 }
2282 {
2283 const Json::String expected("\"hello\" //commentAfterValueOnSameLine\n");
2284 Json::Value root = "hello";
2285 root.setComment(Json::String("//commentAfterValueOnSameLine"),
2286 Json::commentAfterOnSameLine);
2287 const Json::String result = writer.write(root);
2288 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2289 }
2290 {
2291 const Json::String expected("\"hello\"\n//commentAfter\n\n");
2292 Json::Value root = "hello";
2293 root.setComment(Json::String("//commentAfter"), Json::commentAfter);
2294 const Json::String result = writer.write(root);
2295 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2296 }
2297 }
2298
2299 struct StyledStreamWriterTest : JsonTest::TestCase {};
2300
JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest,writeNumericValue)2301 JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest, writeNumericValue) {
2302 Json::StyledStreamWriter writer;
2303 const Json::String expected("{\n"
2304 "\t\"emptyValue\" : null,\n"
2305 "\t\"false\" : false,\n"
2306 "\t\"null\" : \"null\",\n"
2307 "\t\"number\" : -6200000000000000.0,\n"
2308 "\t\"real\" : 1.256,\n"
2309 "\t\"uintValue\" : 17\n"
2310 "}\n");
2311
2312 Json::Value root;
2313 root["emptyValue"] = Json::nullValue;
2314 root["false"] = false;
2315 root["null"] = "null";
2316 root["number"] = -6.2e+15; // big float number
2317 root["real"] = 1.256; // float number
2318 root["uintValue"] = Json::Value(17U);
2319
2320 Json::OStringStream sout;
2321 writer.write(sout, root);
2322 const Json::String result = sout.str();
2323 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2324 }
2325
JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest,writeArrays)2326 JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest, writeArrays) {
2327 Json::StyledStreamWriter writer;
2328 const Json::String expected("{\n"
2329 "\t\"property1\" : [ \"value1\", \"value2\" ],\n"
2330 "\t\"property2\" : []\n"
2331 "}\n");
2332 Json::Value root;
2333 root["property1"][0] = "value1";
2334 root["property1"][1] = "value2";
2335 root["property2"] = Json::arrayValue;
2336
2337 Json::OStringStream sout;
2338 writer.write(sout, root);
2339 const Json::String result = sout.str();
2340 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2341 }
2342
JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest,writeNestedObjects)2343 JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest, writeNestedObjects) {
2344 Json::StyledStreamWriter writer;
2345 const Json::String expected("{\n"
2346 "\t\"object1\" : \n"
2347 "\t"
2348 "{\n"
2349 "\t\t\"bool\" : true,\n"
2350 "\t\t\"nested\" : 123\n"
2351 "\t},\n"
2352 "\t\"object2\" : {}\n"
2353 "}\n");
2354 Json::Value root, child;
2355 child["nested"] = 123;
2356 child["bool"] = true;
2357 root["object1"] = child;
2358 root["object2"] = Json::objectValue;
2359
2360 Json::OStringStream sout;
2361 writer.write(sout, root);
2362 const Json::String result = sout.str();
2363 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2364 }
2365
JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest,multiLineArray)2366 JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest, multiLineArray) {
2367 {
2368 // Array member has more than 20 print effect rendering lines
2369 const Json::String expected("[\n\t0,"
2370 "\n\t1,"
2371 "\n\t2,"
2372 "\n\t3,"
2373 "\n\t4,"
2374 "\n\t5,"
2375 "\n\t6,"
2376 "\n\t7,"
2377 "\n\t8,"
2378 "\n\t9,"
2379 "\n\t10,"
2380 "\n\t11,"
2381 "\n\t12,"
2382 "\n\t13,"
2383 "\n\t14,"
2384 "\n\t15,"
2385 "\n\t16,"
2386 "\n\t17,"
2387 "\n\t18,"
2388 "\n\t19,"
2389 "\n\t20\n]\n");
2390 Json::StyledStreamWriter writer;
2391 Json::Value root;
2392 for (Json::ArrayIndex i = 0; i < 21; i++)
2393 root[i] = i;
2394 Json::OStringStream sout;
2395 writer.write(sout, root);
2396 const Json::String result = sout.str();
2397 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2398 }
2399 {
2400 Json::StyledStreamWriter writer;
2401 // Array members do not exceed 21 print effects to render a single line
2402 const Json::String expected("[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]\n");
2403 Json::Value root;
2404 for (Json::ArrayIndex i = 0; i < 10; i++)
2405 root[i] = i;
2406 Json::OStringStream sout;
2407 writer.write(sout, root);
2408 const Json::String result = sout.str();
2409 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2410 }
2411 }
2412
JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest,writeValueWithComment)2413 JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest, writeValueWithComment) {
2414 Json::StyledStreamWriter writer("\t");
2415 {
2416 const Json::String expected("//commentBeforeValue\n\"hello\"\n");
2417 Json::Value root = "hello";
2418 Json::OStringStream sout;
2419 root.setComment(Json::String("//commentBeforeValue"), Json::commentBefore);
2420 writer.write(sout, root);
2421 const Json::String result = sout.str();
2422 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2423 }
2424 {
2425 const Json::String expected("\"hello\" //commentAfterValueOnSameLine\n");
2426 Json::Value root = "hello";
2427 Json::OStringStream sout;
2428 root.setComment(Json::String("//commentAfterValueOnSameLine"),
2429 Json::commentAfterOnSameLine);
2430 writer.write(sout, root);
2431 const Json::String result = sout.str();
2432 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2433 }
2434 {
2435 const Json::String expected("\"hello\"\n//commentAfter\n");
2436 Json::Value root = "hello";
2437 Json::OStringStream sout;
2438 root.setComment(Json::String("//commentAfter"), Json::commentAfter);
2439 writer.write(sout, root);
2440 const Json::String result = sout.str();
2441 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2442 }
2443 }
2444
2445 struct StreamWriterTest : JsonTest::TestCase {};
2446
JSONTEST_FIXTURE_LOCAL(StreamWriterTest,writeNumericValue)2447 JSONTEST_FIXTURE_LOCAL(StreamWriterTest, writeNumericValue) {
2448 Json::StreamWriterBuilder writer;
2449 const Json::String expected("{\n"
2450 "\t\"emptyValue\" : null,\n"
2451 "\t\"false\" : false,\n"
2452 "\t\"null\" : \"null\",\n"
2453 "\t\"number\" : -6200000000000000.0,\n"
2454 "\t\"real\" : 1.256,\n"
2455 "\t\"uintValue\" : 17\n"
2456 "}");
2457 Json::Value root;
2458 root["emptyValue"] = Json::nullValue;
2459 root["false"] = false;
2460 root["null"] = "null";
2461 root["number"] = -6.2e+15;
2462 root["real"] = 1.256;
2463 root["uintValue"] = Json::Value(17U);
2464
2465 const Json::String result = Json::writeString(writer, root);
2466 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2467 }
2468
JSONTEST_FIXTURE_LOCAL(StreamWriterTest,writeArrays)2469 JSONTEST_FIXTURE_LOCAL(StreamWriterTest, writeArrays) {
2470 Json::StreamWriterBuilder writer;
2471 const Json::String expected("{\n"
2472 "\t\"property1\" : \n"
2473 "\t[\n"
2474 "\t\t\"value1\",\n"
2475 "\t\t\"value2\"\n"
2476 "\t],\n"
2477 "\t\"property2\" : []\n"
2478 "}");
2479
2480 Json::Value root;
2481 root["property1"][0] = "value1";
2482 root["property1"][1] = "value2";
2483 root["property2"] = Json::arrayValue;
2484
2485 const Json::String result = Json::writeString(writer, root);
2486 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2487 }
2488
JSONTEST_FIXTURE_LOCAL(StreamWriterTest,writeNestedObjects)2489 JSONTEST_FIXTURE_LOCAL(StreamWriterTest, writeNestedObjects) {
2490 Json::StreamWriterBuilder writer;
2491 const Json::String expected("{\n"
2492 "\t\"object1\" : \n"
2493 "\t{\n"
2494 "\t\t\"bool\" : true,\n"
2495 "\t\t\"nested\" : 123\n"
2496 "\t},\n"
2497 "\t\"object2\" : {}\n"
2498 "}");
2499
2500 Json::Value root, child;
2501 child["nested"] = 123;
2502 child["bool"] = true;
2503 root["object1"] = child;
2504 root["object2"] = Json::objectValue;
2505
2506 const Json::String result = Json::writeString(writer, root);
2507 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2508 }
2509
JSONTEST_FIXTURE_LOCAL(StreamWriterTest,multiLineArray)2510 JSONTEST_FIXTURE_LOCAL(StreamWriterTest, multiLineArray) {
2511 Json::StreamWriterBuilder wb;
2512 wb.settings_["commentStyle"] = "None";
2513 {
2514 // When wb.settings_["commentStyle"] = "None", the effect of
2515 // printing multiple lines will be displayed when there are
2516 // more than 20 array members.
2517 const Json::String expected("[\n\t0,"
2518 "\n\t1,"
2519 "\n\t2,"
2520 "\n\t3,"
2521 "\n\t4,"
2522 "\n\t5,"
2523 "\n\t6,"
2524 "\n\t7,"
2525 "\n\t8,"
2526 "\n\t9,"
2527 "\n\t10,"
2528 "\n\t11,"
2529 "\n\t12,"
2530 "\n\t13,"
2531 "\n\t14,"
2532 "\n\t15,"
2533 "\n\t16,"
2534 "\n\t17,"
2535 "\n\t18,"
2536 "\n\t19,"
2537 "\n\t20\n]");
2538 Json::Value root;
2539 for (Json::ArrayIndex i = 0; i < 21; i++)
2540 root[i] = i;
2541 const Json::String result = Json::writeString(wb, root);
2542 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2543 }
2544 {
2545 // Array members do not exceed 21 print effects to render a single line
2546 const Json::String expected("[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]");
2547 Json::Value root;
2548 for (Json::ArrayIndex i = 0; i < 10; i++)
2549 root[i] = i;
2550 const Json::String result = Json::writeString(wb, root);
2551 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
2552 }
2553 }
2554
JSONTEST_FIXTURE_LOCAL(StreamWriterTest,dropNullPlaceholders)2555 JSONTEST_FIXTURE_LOCAL(StreamWriterTest, dropNullPlaceholders) {
2556 Json::StreamWriterBuilder b;
2557 Json::Value nullValue;
2558 b.settings_["dropNullPlaceholders"] = false;
2559 JSONTEST_ASSERT(Json::writeString(b, nullValue) == "null");
2560 b.settings_["dropNullPlaceholders"] = true;
2561 JSONTEST_ASSERT(Json::writeString(b, nullValue).empty());
2562 }
2563
JSONTEST_FIXTURE_LOCAL(StreamWriterTest,enableYAMLCompatibility)2564 JSONTEST_FIXTURE_LOCAL(StreamWriterTest, enableYAMLCompatibility) {
2565 Json::StreamWriterBuilder b;
2566 Json::Value root;
2567 root["hello"] = "world";
2568
2569 b.settings_["indentation"] = "";
2570 JSONTEST_ASSERT(Json::writeString(b, root) == "{\"hello\":\"world\"}");
2571
2572 b.settings_["enableYAMLCompatibility"] = true;
2573 JSONTEST_ASSERT(Json::writeString(b, root) == "{\"hello\": \"world\"}");
2574
2575 b.settings_["enableYAMLCompatibility"] = false;
2576 JSONTEST_ASSERT(Json::writeString(b, root) == "{\"hello\":\"world\"}");
2577 }
2578
JSONTEST_FIXTURE_LOCAL(StreamWriterTest,indentation)2579 JSONTEST_FIXTURE_LOCAL(StreamWriterTest, indentation) {
2580 Json::StreamWriterBuilder b;
2581 Json::Value root;
2582 root["hello"] = "world";
2583
2584 b.settings_["indentation"] = "";
2585 JSONTEST_ASSERT(Json::writeString(b, root) == "{\"hello\":\"world\"}");
2586
2587 b.settings_["indentation"] = "\t";
2588 JSONTEST_ASSERT(Json::writeString(b, root) ==
2589 "{\n\t\"hello\" : \"world\"\n}");
2590 }
2591
JSONTEST_FIXTURE_LOCAL(StreamWriterTest,writeZeroes)2592 JSONTEST_FIXTURE_LOCAL(StreamWriterTest, writeZeroes) {
2593 Json::String binary("hi", 3); // include trailing 0
2594 JSONTEST_ASSERT_EQUAL(3, binary.length());
2595 Json::String expected(R"("hi\u0000")"); // unicoded zero
2596 Json::StreamWriterBuilder b;
2597 {
2598 Json::Value root;
2599 root = binary;
2600 JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
2601 Json::String out = Json::writeString(b, root);
2602 JSONTEST_ASSERT_EQUAL(expected.size(), out.size());
2603 JSONTEST_ASSERT_STRING_EQUAL(expected, out);
2604 }
2605 {
2606 Json::Value root;
2607 root["top"] = binary;
2608 JSONTEST_ASSERT_STRING_EQUAL(binary, root["top"].asString());
2609 Json::String out = Json::writeString(b, root["top"]);
2610 JSONTEST_ASSERT_STRING_EQUAL(expected, out);
2611 }
2612 }
2613
JSONTEST_FIXTURE_LOCAL(StreamWriterTest,unicode)2614 JSONTEST_FIXTURE_LOCAL(StreamWriterTest, unicode) {
2615 // Create a Json value containing UTF-8 string with some chars that need
2616 // escape (tab,newline).
2617 Json::Value root;
2618 root["test"] = "\t\n\xF0\x91\xA2\xA1\x3D\xC4\xB3\xF0\x9B\x84\x9B\xEF\xBD\xA7";
2619
2620 Json::StreamWriterBuilder b;
2621
2622 // Default settings - should be unicode escaped.
2623 JSONTEST_ASSERT(Json::writeString(b, root) ==
2624 "{\n\t\"test\" : "
2625 "\"\\t\\n\\ud806\\udca1=\\u0133\\ud82c\\udd1b\\uff67\"\n}");
2626
2627 b.settings_["emitUTF8"] = true;
2628
2629 // Should not be unicode escaped.
2630 JSONTEST_ASSERT(
2631 Json::writeString(b, root) ==
2632 "{\n\t\"test\" : "
2633 "\"\\t\\n\xF0\x91\xA2\xA1=\xC4\xB3\xF0\x9B\x84\x9B\xEF\xBD\xA7\"\n}");
2634
2635 b.settings_["emitUTF8"] = false;
2636
2637 // Should be unicode escaped.
2638 JSONTEST_ASSERT(Json::writeString(b, root) ==
2639 "{\n\t\"test\" : "
2640 "\"\\t\\n\\ud806\\udca1=\\u0133\\ud82c\\udd1b\\uff67\"\n}");
2641 }
2642
2643 // Control chars should be escaped regardless of UTF-8 input encoding.
JSONTEST_FIXTURE_LOCAL(StreamWriterTest,escapeControlCharacters)2644 JSONTEST_FIXTURE_LOCAL(StreamWriterTest, escapeControlCharacters) {
2645 auto uEscape = [](unsigned ch) {
2646 static const char h[] = "0123456789abcdef";
2647 std::string r = "\\u";
2648 r += h[(ch >> (3 * 4)) & 0xf];
2649 r += h[(ch >> (2 * 4)) & 0xf];
2650 r += h[(ch >> (1 * 4)) & 0xf];
2651 r += h[(ch >> (0 * 4)) & 0xf];
2652 return r;
2653 };
2654 auto shortEscape = [](unsigned ch) -> const char* {
2655 switch (ch) {
2656 case '\"':
2657 return "\\\"";
2658 case '\\':
2659 return "\\\\";
2660 case '\b':
2661 return "\\b";
2662 case '\f':
2663 return "\\f";
2664 case '\n':
2665 return "\\n";
2666 case '\r':
2667 return "\\r";
2668 case '\t':
2669 return "\\t";
2670 default:
2671 return nullptr;
2672 }
2673 };
2674
2675 Json::StreamWriterBuilder b;
2676
2677 for (bool emitUTF8 : {true, false}) {
2678 b.settings_["emitUTF8"] = emitUTF8;
2679
2680 for (unsigned i = 0; i != 0x100; ++i) {
2681 if (!emitUTF8 && i >= 0x80)
2682 break; // The algorithm would try to parse UTF-8, so stop here.
2683
2684 std::string raw({static_cast<char>(i)});
2685 std::string esc = raw;
2686 if (i < 0x20)
2687 esc = uEscape(i);
2688 if (const char* shEsc = shortEscape(i))
2689 esc = shEsc;
2690
2691 // std::cout << "emit=" << emitUTF8 << ", i=" << std::hex << i << std::dec
2692 // << std::endl;
2693
2694 Json::Value root;
2695 root["test"] = raw;
2696 JSONTEST_ASSERT_STRING_EQUAL(
2697 std::string("{\n\t\"test\" : \"").append(esc).append("\"\n}"),
2698 Json::writeString(b, root))
2699 << ", emit=" << emitUTF8 << ", i=" << i << ", raw=\"" << raw << "\""
2700 << ", esc=\"" << esc << "\"";
2701 }
2702 }
2703 }
2704
2705 #ifdef _WIN32
JSONTEST_FIXTURE_LOCAL(StreamWriterTest,escapeTabCharacterWindows)2706 JSONTEST_FIXTURE_LOCAL(StreamWriterTest, escapeTabCharacterWindows) {
2707 // Get the current locale before changing it
2708 std::string currentLocale = setlocale(LC_ALL, NULL);
2709 setlocale(LC_ALL, "English_United States.1252");
2710
2711 Json::Value root;
2712 root["test"] = "\tTabTesting\t";
2713
2714 Json::StreamWriterBuilder b;
2715
2716 JSONTEST_ASSERT(Json::writeString(b, root) == "{\n\t\"test\" : "
2717 "\"\\tTabTesting\\t\"\n}");
2718
2719 b.settings_["emitUTF8"] = true;
2720 JSONTEST_ASSERT(Json::writeString(b, root) == "{\n\t\"test\" : "
2721 "\"\\tTabTesting\\t\"\n}");
2722
2723 b.settings_["emitUTF8"] = false;
2724 JSONTEST_ASSERT(Json::writeString(b, root) == "{\n\t\"test\" : "
2725 "\"\\tTabTesting\\t\"\n}");
2726
2727 // Restore the locale
2728 if (!currentLocale.empty())
2729 setlocale(LC_ALL, currentLocale.c_str());
2730 }
2731 #endif
2732
2733 struct ReaderTest : JsonTest::TestCase {
setStrictModeReaderTest2734 void setStrictMode() {
2735 reader = std::unique_ptr<Json::Reader>(
2736 new Json::Reader(Json::Features{}.strictMode()));
2737 }
2738
setFeaturesReaderTest2739 void setFeatures(Json::Features& features) {
2740 reader = std::unique_ptr<Json::Reader>(new Json::Reader(features));
2741 }
2742
checkStructuredErrorsReaderTest2743 void checkStructuredErrors(
2744 const std::vector<Json::Reader::StructuredError>& actual,
2745 const std::vector<Json::Reader::StructuredError>& expected) {
2746 JSONTEST_ASSERT_EQUAL(expected.size(), actual.size());
2747 for (size_t i = 0; i < actual.size(); ++i) {
2748 const auto& a = actual[i];
2749 const auto& e = expected[i];
2750 JSONTEST_ASSERT_EQUAL(e.offset_start, a.offset_start) << i;
2751 JSONTEST_ASSERT_EQUAL(e.offset_limit, a.offset_limit) << i;
2752 JSONTEST_ASSERT_EQUAL(e.message, a.message) << i;
2753 }
2754 }
2755
checkParseReaderTest2756 template <typename Input> void checkParse(Input&& input) {
2757 JSONTEST_ASSERT(reader->parse(input, root));
2758 }
2759
2760 template <typename Input>
2761 void
checkParseReaderTest2762 checkParse(Input&& input,
2763 const std::vector<Json::Reader::StructuredError>& structured) {
2764 JSONTEST_ASSERT(!reader->parse(input, root));
2765 checkStructuredErrors(reader->getStructuredErrors(), structured);
2766 }
2767
2768 template <typename Input>
checkParseReaderTest2769 void checkParse(Input&& input,
2770 const std::vector<Json::Reader::StructuredError>& structured,
2771 const std::string& formatted) {
2772 checkParse(input, structured);
2773 JSONTEST_ASSERT_EQUAL(formatted, reader->getFormattedErrorMessages());
2774 }
2775
2776 std::unique_ptr<Json::Reader> reader{new Json::Reader()};
2777 Json::Value root;
2778 };
2779
JSONTEST_FIXTURE_LOCAL(ReaderTest,parseWithNoErrors)2780 JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrors) {
2781 checkParse(R"({ "property" : "value" })");
2782 }
2783
JSONTEST_FIXTURE_LOCAL(ReaderTest,parseObject)2784 JSONTEST_FIXTURE_LOCAL(ReaderTest, parseObject) {
2785 checkParse(R"({"property"})",
2786 {{11, 12, "Missing ':' after object member name"}},
2787 "* Line 1, Column 12\n Missing ':' after object member name\n");
2788 checkParse(
2789 R"({"property" : "value" )",
2790 {{22, 22, "Missing ',' or '}' in object declaration"}},
2791 "* Line 1, Column 23\n Missing ',' or '}' in object declaration\n");
2792 checkParse(R"({"property" : "value", )",
2793 {{23, 23, "Missing '}' or object member name"}},
2794 "* Line 1, Column 24\n Missing '}' or object member name\n");
2795 }
2796
JSONTEST_FIXTURE_LOCAL(ReaderTest,parseArray)2797 JSONTEST_FIXTURE_LOCAL(ReaderTest, parseArray) {
2798 checkParse(
2799 R"([ "value" )", {{10, 10, "Missing ',' or ']' in array declaration"}},
2800 "* Line 1, Column 11\n Missing ',' or ']' in array declaration\n");
2801 checkParse(
2802 R"([ "value1" "value2" ] )",
2803 {{11, 19, "Missing ',' or ']' in array declaration"}},
2804 "* Line 1, Column 12\n Missing ',' or ']' in array declaration\n");
2805 }
2806
JSONTEST_FIXTURE_LOCAL(ReaderTest,parseString)2807 JSONTEST_FIXTURE_LOCAL(ReaderTest, parseString) {
2808 checkParse(R"([ "\u8a2a" ])");
2809 checkParse(
2810 R"([ "\ud801" ])",
2811 {{2, 10,
2812 "additional six characters expected to parse unicode surrogate "
2813 "pair."}},
2814 "* Line 1, Column 3\n"
2815 " additional six characters expected to parse unicode surrogate pair.\n"
2816 "See Line 1, Column 10 for detail.\n");
2817 checkParse(R"([ "\ud801\d1234" ])",
2818 {{2, 16,
2819 "expecting another \\u token to begin the "
2820 "second half of a unicode surrogate pair"}},
2821 "* Line 1, Column 3\n"
2822 " expecting another \\u token to begin the "
2823 "second half of a unicode surrogate pair\n"
2824 "See Line 1, Column 12 for detail.\n");
2825 checkParse(R"([ "\ua3t@" ])",
2826 {{2, 10,
2827 "Bad unicode escape sequence in string: "
2828 "hexadecimal digit expected."}},
2829 "* Line 1, Column 3\n"
2830 " Bad unicode escape sequence in string: "
2831 "hexadecimal digit expected.\n"
2832 "See Line 1, Column 9 for detail.\n");
2833 checkParse(
2834 R"([ "\ua3t" ])",
2835 {{2, 9, "Bad unicode escape sequence in string: four digits expected."}},
2836 "* Line 1, Column 3\n"
2837 " Bad unicode escape sequence in string: four digits expected.\n"
2838 "See Line 1, Column 6 for detail.\n");
2839 }
2840
JSONTEST_FIXTURE_LOCAL(ReaderTest,parseComment)2841 JSONTEST_FIXTURE_LOCAL(ReaderTest, parseComment) {
2842 checkParse(
2843 R"({ /*commentBeforeValue*/ "property" : "value" }//commentAfterValue)"
2844 "\n");
2845 checkParse(" true //comment1\n//comment2\r//comment3\r\n");
2846 }
2847
JSONTEST_FIXTURE_LOCAL(ReaderTest,streamParseWithNoErrors)2848 JSONTEST_FIXTURE_LOCAL(ReaderTest, streamParseWithNoErrors) {
2849 std::string styled = R"({ "property" : "value" })";
2850 std::istringstream iss(styled);
2851 checkParse(iss);
2852 }
2853
JSONTEST_FIXTURE_LOCAL(ReaderTest,parseWithNoErrorsTestingOffsets)2854 JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrorsTestingOffsets) {
2855 checkParse(R"({)"
2856 R"( "property" : ["value", "value2"],)"
2857 R"( "obj" : { "nested" : -6.2e+15, "bool" : true},)"
2858 R"( "null" : null,)"
2859 R"( "false" : false)"
2860 R"( })");
2861 auto checkOffsets = [&](const Json::Value& v, int start, int limit) {
2862 JSONTEST_ASSERT_EQUAL(start, v.getOffsetStart());
2863 JSONTEST_ASSERT_EQUAL(limit, v.getOffsetLimit());
2864 };
2865 checkOffsets(root, 0, 115);
2866 checkOffsets(root["property"], 15, 34);
2867 checkOffsets(root["property"][0], 16, 23);
2868 checkOffsets(root["property"][1], 25, 33);
2869 checkOffsets(root["obj"], 44, 81);
2870 checkOffsets(root["obj"]["nested"], 57, 65);
2871 checkOffsets(root["obj"]["bool"], 76, 80);
2872 checkOffsets(root["null"], 92, 96);
2873 checkOffsets(root["false"], 108, 113);
2874 }
2875
JSONTEST_FIXTURE_LOCAL(ReaderTest,parseWithOneError)2876 JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithOneError) {
2877 checkParse(R"({ "property" :: "value" })",
2878 {{14, 15, "Syntax error: value, object or array expected."}},
2879 "* Line 1, Column 15\n Syntax error: value, object or array "
2880 "expected.\n");
2881 checkParse("s", {{0, 1, "Syntax error: value, object or array expected."}},
2882 "* Line 1, Column 1\n Syntax error: value, object or array "
2883 "expected.\n");
2884 }
2885
JSONTEST_FIXTURE_LOCAL(ReaderTest,parseSpecialFloat)2886 JSONTEST_FIXTURE_LOCAL(ReaderTest, parseSpecialFloat) {
2887 checkParse(R"({ "a" : Infi })",
2888 {{8, 9, "Syntax error: value, object or array expected."}},
2889 "* Line 1, Column 9\n Syntax error: value, object or array "
2890 "expected.\n");
2891 checkParse(R"({ "a" : Infiniaa })",
2892 {{8, 9, "Syntax error: value, object or array expected."}},
2893 "* Line 1, Column 9\n Syntax error: value, object or array "
2894 "expected.\n");
2895 }
2896
JSONTEST_FIXTURE_LOCAL(ReaderTest,strictModeParseNumber)2897 JSONTEST_FIXTURE_LOCAL(ReaderTest, strictModeParseNumber) {
2898 setStrictMode();
2899 checkParse(
2900 "123",
2901 {{0, 3,
2902 "A valid JSON document must be either an array or an object value."}},
2903 "* Line 1, Column 1\n"
2904 " A valid JSON document must be either an array or an object value.\n");
2905 }
2906
JSONTEST_FIXTURE_LOCAL(ReaderTest,parseChineseWithOneError)2907 JSONTEST_FIXTURE_LOCAL(ReaderTest, parseChineseWithOneError) {
2908 checkParse(R"({ "pr)"
2909 u8"\u4f50\u85e4" // 佐藤
2910 R"(erty" :: "value" })",
2911 {{18, 19, "Syntax error: value, object or array expected."}},
2912 "* Line 1, Column 19\n Syntax error: value, object or array "
2913 "expected.\n");
2914 }
2915
JSONTEST_FIXTURE_LOCAL(ReaderTest,parseWithDetailError)2916 JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithDetailError) {
2917 checkParse(R"({ "property" : "v\alue" })",
2918 {{15, 23, "Bad escape sequence in string"}},
2919 "* Line 1, Column 16\n"
2920 " Bad escape sequence in string\n"
2921 "See Line 1, Column 20 for detail.\n");
2922 }
2923
JSONTEST_FIXTURE_LOCAL(ReaderTest,pushErrorTest)2924 JSONTEST_FIXTURE_LOCAL(ReaderTest, pushErrorTest) {
2925 checkParse(R"({ "AUTHOR" : 123 })");
2926 if (!root["AUTHOR"].isString()) {
2927 JSONTEST_ASSERT(
2928 reader->pushError(root["AUTHOR"], "AUTHOR must be a string"));
2929 }
2930 JSONTEST_ASSERT_STRING_EQUAL(reader->getFormattedErrorMessages(),
2931 "* Line 1, Column 14\n"
2932 " AUTHOR must be a string\n");
2933
2934 checkParse(R"({ "AUTHOR" : 123 })");
2935 if (!root["AUTHOR"].isString()) {
2936 JSONTEST_ASSERT(reader->pushError(root["AUTHOR"], "AUTHOR must be a string",
2937 root["AUTHOR"]));
2938 }
2939 JSONTEST_ASSERT_STRING_EQUAL(reader->getFormattedErrorMessages(),
2940 "* Line 1, Column 14\n"
2941 " AUTHOR must be a string\n"
2942 "See Line 1, Column 14 for detail.\n");
2943 }
2944
JSONTEST_FIXTURE_LOCAL(ReaderTest,allowNumericKeysTest)2945 JSONTEST_FIXTURE_LOCAL(ReaderTest, allowNumericKeysTest) {
2946 Json::Features features;
2947 features.allowNumericKeys_ = true;
2948 setFeatures(features);
2949 checkParse(R"({ 123 : "abc" })");
2950 }
2951
2952 struct CharReaderTest : JsonTest::TestCase {};
2953
JSONTEST_FIXTURE_LOCAL(CharReaderTest,parseWithNoErrors)2954 JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithNoErrors) {
2955 Json::CharReaderBuilder b;
2956 CharReaderPtr reader(b.newCharReader());
2957 Json::String errs;
2958 Json::Value root;
2959 char const doc[] = R"({ "property" : "value" })";
2960 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2961 JSONTEST_ASSERT(ok);
2962 JSONTEST_ASSERT(errs.empty());
2963 }
2964
JSONTEST_FIXTURE_LOCAL(CharReaderTest,parseWithNoErrorsTestingOffsets)2965 JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithNoErrorsTestingOffsets) {
2966 Json::CharReaderBuilder b;
2967 CharReaderPtr reader(b.newCharReader());
2968 Json::String errs;
2969 Json::Value root;
2970 char const doc[] = "{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
2971 "{ \"nested\" : -6.2e+15, \"num\" : +123, \"bool\" : "
2972 "true}, \"null\" : null, \"false\" : false }";
2973 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2974 JSONTEST_ASSERT(ok);
2975 JSONTEST_ASSERT(errs.empty());
2976 }
2977
JSONTEST_FIXTURE_LOCAL(CharReaderTest,parseNumber)2978 JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseNumber) {
2979 Json::CharReaderBuilder b;
2980 CharReaderPtr reader(b.newCharReader());
2981 Json::String errs;
2982 Json::Value root;
2983 {
2984 // if intvalue > threshold, treat the number as a double.
2985 // 21 digits
2986 char const doc[] = "[111111111111111111111]";
2987 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2988 JSONTEST_ASSERT(ok);
2989 JSONTEST_ASSERT(errs.empty());
2990 JSONTEST_ASSERT_EQUAL(1.1111111111111111e+020, root[0]);
2991 }
2992 }
2993
JSONTEST_FIXTURE_LOCAL(CharReaderTest,parseString)2994 JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseString) {
2995 Json::CharReaderBuilder b;
2996 CharReaderPtr reader(b.newCharReader());
2997 Json::Value root;
2998 Json::String errs;
2999 {
3000 char const doc[] = "[\"\"]";
3001 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3002 JSONTEST_ASSERT(ok);
3003 JSONTEST_ASSERT(errs.empty());
3004 JSONTEST_ASSERT_EQUAL("", root[0]);
3005 }
3006 {
3007 char const doc[] = R"(["\u8A2a"])";
3008 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3009 JSONTEST_ASSERT(ok);
3010 JSONTEST_ASSERT(errs.empty());
3011 JSONTEST_ASSERT_EQUAL(u8"\u8A2a", root[0].asString()); // "訪"
3012 }
3013 {
3014 char const doc[] = R"([ "\uD801" ])";
3015 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3016 JSONTEST_ASSERT(!ok);
3017 JSONTEST_ASSERT(errs == "* Line 1, Column 3\n"
3018 " additional six characters expected to "
3019 "parse unicode surrogate pair.\n"
3020 "See Line 1, Column 10 for detail.\n");
3021 }
3022 {
3023 char const doc[] = R"([ "\uD801\d1234" ])";
3024 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3025 JSONTEST_ASSERT(!ok);
3026 JSONTEST_ASSERT(errs == "* Line 1, Column 3\n"
3027 " expecting another \\u token to begin the "
3028 "second half of a unicode surrogate pair\n"
3029 "See Line 1, Column 12 for detail.\n");
3030 }
3031 {
3032 char const doc[] = R"([ "\ua3t@" ])";
3033 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3034 JSONTEST_ASSERT(!ok);
3035 JSONTEST_ASSERT(errs == "* Line 1, Column 3\n"
3036 " Bad unicode escape sequence in string: "
3037 "hexadecimal digit expected.\n"
3038 "See Line 1, Column 9 for detail.\n");
3039 }
3040 {
3041 char const doc[] = R"([ "\ua3t" ])";
3042 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3043 JSONTEST_ASSERT(!ok);
3044 JSONTEST_ASSERT(
3045 errs ==
3046 "* Line 1, Column 3\n"
3047 " Bad unicode escape sequence in string: four digits expected.\n"
3048 "See Line 1, Column 6 for detail.\n");
3049 }
3050 {
3051 b.settings_["allowSingleQuotes"] = true;
3052 CharReaderPtr charreader(b.newCharReader());
3053 char const doc[] = R"({'a': 'x\ty', "b":'x\\y'})";
3054 bool ok = charreader->parse(doc, doc + std::strlen(doc), &root, &errs);
3055 JSONTEST_ASSERT(ok);
3056 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3057 JSONTEST_ASSERT_EQUAL(2u, root.size());
3058 JSONTEST_ASSERT_STRING_EQUAL("x\ty", root["a"].asString());
3059 JSONTEST_ASSERT_STRING_EQUAL("x\\y", root["b"].asString());
3060 }
3061 }
3062
JSONTEST_FIXTURE_LOCAL(CharReaderTest,parseComment)3063 JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseComment) {
3064 Json::CharReaderBuilder b;
3065 CharReaderPtr reader(b.newCharReader());
3066 Json::Value root;
3067 Json::String errs;
3068 {
3069 char const doc[] = "//comment1\n { //comment2\n \"property\" :"
3070 " \"value\" //comment3\n } //comment4\n";
3071 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3072 JSONTEST_ASSERT(ok);
3073 JSONTEST_ASSERT(errs.empty());
3074 JSONTEST_ASSERT_EQUAL("value", root["property"]);
3075 }
3076 {
3077 char const doc[] = "{ \"property\" //comment\n : \"value\" }";
3078 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3079 JSONTEST_ASSERT(!ok);
3080 JSONTEST_ASSERT(errs == "* Line 1, Column 14\n"
3081 " Missing ':' after object member name\n");
3082 }
3083 {
3084 char const doc[] = "//comment1\n [ //comment2\n \"value\" //comment3\n,"
3085 " //comment4\n true //comment5\n ] //comment6\n";
3086 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3087 JSONTEST_ASSERT(ok);
3088 JSONTEST_ASSERT(errs.empty());
3089 JSONTEST_ASSERT_EQUAL("value", root[0]);
3090 JSONTEST_ASSERT_EQUAL(true, root[1]);
3091 }
3092 }
3093
JSONTEST_FIXTURE_LOCAL(CharReaderTest,parseObjectWithErrors)3094 JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseObjectWithErrors) {
3095 Json::CharReaderBuilder b;
3096 CharReaderPtr reader(b.newCharReader());
3097 Json::Value root;
3098 Json::String errs;
3099 {
3100 char const doc[] = R"({ "property" : "value" )";
3101 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3102 JSONTEST_ASSERT(!ok);
3103 JSONTEST_ASSERT(errs == "* Line 1, Column 24\n"
3104 " Missing ',' or '}' in object declaration\n");
3105 JSONTEST_ASSERT_EQUAL("value", root["property"]);
3106 }
3107 {
3108 char const doc[] = R"({ "property" : "value" ,)";
3109 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3110 JSONTEST_ASSERT(!ok);
3111 JSONTEST_ASSERT(errs == "* Line 1, Column 25\n"
3112 " Missing '}' or object member name\n");
3113 JSONTEST_ASSERT_EQUAL("value", root["property"]);
3114 }
3115 }
3116
JSONTEST_FIXTURE_LOCAL(CharReaderTest,parseArrayWithErrors)3117 JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseArrayWithErrors) {
3118 Json::CharReaderBuilder b;
3119 CharReaderPtr reader(b.newCharReader());
3120 Json::Value root;
3121 Json::String errs;
3122 {
3123 char const doc[] = "[ \"value\" ";
3124 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3125 JSONTEST_ASSERT(!ok);
3126 JSONTEST_ASSERT(errs == "* Line 1, Column 11\n"
3127 " Missing ',' or ']' in array declaration\n");
3128 JSONTEST_ASSERT_EQUAL("value", root[0]);
3129 }
3130 {
3131 char const doc[] = R"([ "value1" "value2" ])";
3132 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3133 JSONTEST_ASSERT(!ok);
3134 JSONTEST_ASSERT(errs == "* Line 1, Column 12\n"
3135 " Missing ',' or ']' in array declaration\n");
3136 JSONTEST_ASSERT_EQUAL("value1", root[0]);
3137 }
3138 }
3139
JSONTEST_FIXTURE_LOCAL(CharReaderTest,parseWithOneError)3140 JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithOneError) {
3141 Json::CharReaderBuilder b;
3142 CharReaderPtr reader(b.newCharReader());
3143 Json::String errs;
3144 Json::Value root;
3145 char const doc[] = R"({ "property" :: "value" })";
3146 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3147 JSONTEST_ASSERT(!ok);
3148 JSONTEST_ASSERT(errs ==
3149 "* Line 1, Column 15\n Syntax error: value, object or array "
3150 "expected.\n");
3151 }
3152
JSONTEST_FIXTURE_LOCAL(CharReaderTest,parseChineseWithOneError)3153 JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseChineseWithOneError) {
3154 Json::CharReaderBuilder b;
3155 CharReaderPtr reader(b.newCharReader());
3156 Json::String errs;
3157 Json::Value root;
3158 char const doc[] = "{ \"pr佐藤erty\" :: \"value\" }";
3159 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3160 JSONTEST_ASSERT(!ok);
3161 JSONTEST_ASSERT(errs ==
3162 "* Line 1, Column 19\n Syntax error: value, object or array "
3163 "expected.\n");
3164 }
3165
JSONTEST_FIXTURE_LOCAL(CharReaderTest,parseWithDetailError)3166 JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithDetailError) {
3167 Json::CharReaderBuilder b;
3168 CharReaderPtr reader(b.newCharReader());
3169 Json::String errs;
3170 Json::Value root;
3171 char const doc[] = R"({ "property" : "v\alue" })";
3172 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3173 JSONTEST_ASSERT(!ok);
3174 JSONTEST_ASSERT(errs ==
3175 "* Line 1, Column 16\n Bad escape sequence in string\nSee "
3176 "Line 1, Column 20 for detail.\n");
3177 }
3178
JSONTEST_FIXTURE_LOCAL(CharReaderTest,parseWithStackLimit)3179 JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithStackLimit) {
3180 Json::CharReaderBuilder b;
3181 Json::Value root;
3182 char const doc[] = R"({ "property" : "value" })";
3183 {
3184 b.settings_["stackLimit"] = 2;
3185 CharReaderPtr reader(b.newCharReader());
3186 Json::String errs;
3187 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3188 JSONTEST_ASSERT(ok);
3189 JSONTEST_ASSERT(errs.empty());
3190 JSONTEST_ASSERT_EQUAL("value", root["property"]);
3191 }
3192 {
3193 b.settings_["stackLimit"] = 1;
3194 CharReaderPtr reader(b.newCharReader());
3195 Json::String errs;
3196 JSONTEST_ASSERT_THROWS(
3197 reader->parse(doc, doc + std::strlen(doc), &root, &errs));
3198 }
3199 }
3200
JSONTEST_FIXTURE_LOCAL(CharReaderTest,testOperator)3201 JSONTEST_FIXTURE_LOCAL(CharReaderTest, testOperator) {
3202 const std::string styled = R"({ "property" : "value" })";
3203 std::istringstream iss(styled);
3204 Json::Value root;
3205 iss >> root;
3206 JSONTEST_ASSERT_EQUAL("value", root["property"]);
3207 }
3208
3209 struct CharReaderStrictModeTest : JsonTest::TestCase {};
3210
JSONTEST_FIXTURE_LOCAL(CharReaderStrictModeTest,dupKeys)3211 JSONTEST_FIXTURE_LOCAL(CharReaderStrictModeTest, dupKeys) {
3212 Json::CharReaderBuilder b;
3213 Json::Value root;
3214 char const doc[] =
3215 R"({ "property" : "value", "key" : "val1", "key" : "val2" })";
3216 {
3217 b.strictMode(&b.settings_);
3218 CharReaderPtr reader(b.newCharReader());
3219 Json::String errs;
3220 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3221 JSONTEST_ASSERT(!ok);
3222 JSONTEST_ASSERT_STRING_EQUAL("* Line 1, Column 41\n"
3223 " Duplicate key: 'key'\n",
3224 errs);
3225 JSONTEST_ASSERT_EQUAL("val1", root["key"]); // so far
3226 }
3227 }
3228 struct CharReaderFailIfExtraTest : JsonTest::TestCase {};
3229
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest,issue164)3230 JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, issue164) {
3231 // This is interpreted as a string value followed by a colon.
3232 Json::CharReaderBuilder b;
3233 Json::Value root;
3234 char const doc[] = R"( "property" : "value" })";
3235 {
3236 b.settings_["failIfExtra"] = false;
3237 CharReaderPtr reader(b.newCharReader());
3238 Json::String errs;
3239 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3240 JSONTEST_ASSERT(ok);
3241 JSONTEST_ASSERT(errs.empty());
3242 JSONTEST_ASSERT_EQUAL("property", root);
3243 }
3244 {
3245 b.settings_["failIfExtra"] = true;
3246 CharReaderPtr reader(b.newCharReader());
3247 Json::String errs;
3248 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3249 JSONTEST_ASSERT(!ok);
3250 JSONTEST_ASSERT_STRING_EQUAL("* Line 1, Column 13\n"
3251 " Extra non-whitespace after JSON value.\n",
3252 errs);
3253 JSONTEST_ASSERT_EQUAL("property", root);
3254 }
3255 {
3256 b.strictMode(&b.settings_);
3257 CharReaderPtr reader(b.newCharReader());
3258 Json::String errs;
3259 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3260 JSONTEST_ASSERT(!ok);
3261 JSONTEST_ASSERT_STRING_EQUAL("* Line 1, Column 13\n"
3262 " Extra non-whitespace after JSON value.\n",
3263 errs);
3264 JSONTEST_ASSERT_EQUAL("property", root);
3265 }
3266 {
3267 b.strictMode(&b.settings_);
3268 b.settings_["failIfExtra"] = false;
3269 CharReaderPtr reader(b.newCharReader());
3270 Json::String errs;
3271 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3272 JSONTEST_ASSERT(!ok);
3273 JSONTEST_ASSERT_STRING_EQUAL(
3274 "* Line 1, Column 1\n"
3275 " A valid JSON document must be either an array or an object value.\n",
3276 errs);
3277 JSONTEST_ASSERT_EQUAL("property", root);
3278 }
3279 }
3280
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest,issue107)3281 JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, issue107) {
3282 // This is interpreted as an int value followed by a colon.
3283 Json::CharReaderBuilder b;
3284 Json::Value root;
3285 char const doc[] = "1:2:3";
3286 b.settings_["failIfExtra"] = true;
3287 CharReaderPtr reader(b.newCharReader());
3288 Json::String errs;
3289 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3290 JSONTEST_ASSERT(!ok);
3291 JSONTEST_ASSERT_STRING_EQUAL("* Line 1, Column 2\n"
3292 " Extra non-whitespace after JSON value.\n",
3293 errs);
3294 JSONTEST_ASSERT_EQUAL(1, root.asInt());
3295 }
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest,commentAfterObject)3296 JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, commentAfterObject) {
3297 Json::CharReaderBuilder b;
3298 Json::Value root;
3299 {
3300 char const doc[] = "{ \"property\" : \"value\" } //trailing\n//comment\n";
3301 b.settings_["failIfExtra"] = true;
3302 CharReaderPtr reader(b.newCharReader());
3303 Json::String errs;
3304 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3305 JSONTEST_ASSERT(ok);
3306 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3307 JSONTEST_ASSERT_EQUAL("value", root["property"]);
3308 }
3309 }
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest,commentAfterArray)3310 JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, commentAfterArray) {
3311 Json::CharReaderBuilder b;
3312 Json::Value root;
3313 char const doc[] = "[ \"property\" , \"value\" ] //trailing\n//comment\n";
3314 b.settings_["failIfExtra"] = true;
3315 CharReaderPtr reader(b.newCharReader());
3316 Json::String errs;
3317 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3318 JSONTEST_ASSERT(ok);
3319 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3320 JSONTEST_ASSERT_EQUAL("value", root[1u]);
3321 }
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest,commentAfterBool)3322 JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, commentAfterBool) {
3323 Json::CharReaderBuilder b;
3324 Json::Value root;
3325 char const doc[] = " true /*trailing\ncomment*/";
3326 b.settings_["failIfExtra"] = true;
3327 CharReaderPtr reader(b.newCharReader());
3328 Json::String errs;
3329 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3330 JSONTEST_ASSERT(ok);
3331 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3332 JSONTEST_ASSERT_EQUAL(true, root.asBool());
3333 }
3334
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest,parseComment)3335 JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, parseComment) {
3336 Json::CharReaderBuilder b;
3337 b.settings_["failIfExtra"] = true;
3338 CharReaderPtr reader(b.newCharReader());
3339 Json::Value root;
3340 Json::String errs;
3341 {
3342 char const doc[] = " true //comment1\n//comment2\r//comment3\r\n";
3343 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3344 JSONTEST_ASSERT(ok);
3345 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3346 JSONTEST_ASSERT_EQUAL(true, root.asBool());
3347 }
3348 {
3349 char const doc[] = " true //com\rment";
3350 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3351 JSONTEST_ASSERT(!ok);
3352 JSONTEST_ASSERT_STRING_EQUAL("* Line 2, Column 1\n"
3353 " Extra non-whitespace after JSON value.\n",
3354 errs);
3355 JSONTEST_ASSERT_EQUAL(true, root.asBool());
3356 }
3357 {
3358 char const doc[] = " true //com\nment";
3359 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3360 JSONTEST_ASSERT(!ok);
3361 JSONTEST_ASSERT_STRING_EQUAL("* Line 2, Column 1\n"
3362 " Extra non-whitespace after JSON value.\n",
3363 errs);
3364 JSONTEST_ASSERT_EQUAL(true, root.asBool());
3365 }
3366 }
3367
3368 struct CharReaderAllowDropNullTest : JsonTest::TestCase {
3369 using Value = Json::Value;
3370 using ValueCheck = std::function<void(const Value&)>;
3371
3372 Value nullValue = Value{Json::nullValue};
3373 Value emptyArray = Value{Json::arrayValue};
3374
checkEqCharReaderAllowDropNullTest3375 ValueCheck checkEq(const Value& v) {
3376 return [=](const Value& root) { JSONTEST_ASSERT_EQUAL(root, v); };
3377 }
3378
objGetAndCharReaderAllowDropNullTest3379 static ValueCheck objGetAnd(std::string idx, ValueCheck f) {
3380 return [=](const Value& root) { f(root.get(idx, true)); };
3381 }
3382
arrGetAndCharReaderAllowDropNullTest3383 static ValueCheck arrGetAnd(int idx, ValueCheck f) {
3384 return [=](const Value& root) { f(root[idx]); };
3385 }
3386 };
3387
JSONTEST_FIXTURE_LOCAL(CharReaderAllowDropNullTest,issue178)3388 JSONTEST_FIXTURE_LOCAL(CharReaderAllowDropNullTest, issue178) {
3389 struct TestSpec {
3390 int line;
3391 std::string doc;
3392 size_t rootSize;
3393 ValueCheck onRoot;
3394 };
3395 const TestSpec specs[] = {
3396 {__LINE__, R"({"a":,"b":true})", 2, objGetAnd("a", checkEq(nullValue))},
3397 {__LINE__, R"({"a":,"b":true})", 2, objGetAnd("a", checkEq(nullValue))},
3398 {__LINE__, R"({"a":})", 1, objGetAnd("a", checkEq(nullValue))},
3399 {__LINE__, "[]", 0, checkEq(emptyArray)},
3400 {__LINE__, "[null]", 1, nullptr},
3401 {__LINE__, "[,]", 2, nullptr},
3402 {__LINE__, "[,,,]", 4, nullptr},
3403 {__LINE__, "[null,]", 2, nullptr},
3404 {__LINE__, "[,null]", 2, nullptr},
3405 {__LINE__, "[,,]", 3, nullptr},
3406 {__LINE__, "[null,,]", 3, nullptr},
3407 {__LINE__, "[,null,]", 3, nullptr},
3408 {__LINE__, "[,,null]", 3, nullptr},
3409 {__LINE__, "[[],,,]", 4, arrGetAnd(0, checkEq(emptyArray))},
3410 {__LINE__, "[,[],,]", 4, arrGetAnd(1, checkEq(emptyArray))},
3411 {__LINE__, "[,,,[]]", 4, arrGetAnd(3, checkEq(emptyArray))},
3412 };
3413 for (const auto& spec : specs) {
3414 Json::CharReaderBuilder b;
3415 b.settings_["allowDroppedNullPlaceholders"] = true;
3416 std::unique_ptr<Json::CharReader> reader(b.newCharReader());
3417
3418 Json::Value root;
3419 Json::String errs;
3420 bool ok = reader->parse(spec.doc.data(), spec.doc.data() + spec.doc.size(),
3421 &root, &errs);
3422 JSONTEST_ASSERT(ok);
3423 JSONTEST_ASSERT_STRING_EQUAL(errs, "");
3424 if (spec.onRoot) {
3425 spec.onRoot(root);
3426 }
3427 }
3428 }
3429
3430 struct CharReaderAllowNumericKeysTest : JsonTest::TestCase {};
3431
JSONTEST_FIXTURE_LOCAL(CharReaderAllowNumericKeysTest,allowNumericKeys)3432 JSONTEST_FIXTURE_LOCAL(CharReaderAllowNumericKeysTest, allowNumericKeys) {
3433 Json::CharReaderBuilder b;
3434 b.settings_["allowNumericKeys"] = true;
3435 Json::Value root;
3436 Json::String errs;
3437 CharReaderPtr reader(b.newCharReader());
3438 char const doc[] = "{15:true,-16:true,12.01:true}";
3439 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3440 JSONTEST_ASSERT(ok);
3441 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3442 JSONTEST_ASSERT_EQUAL(3u, root.size());
3443 JSONTEST_ASSERT_EQUAL(true, root.get("15", false));
3444 JSONTEST_ASSERT_EQUAL(true, root.get("-16", false));
3445 JSONTEST_ASSERT_EQUAL(true, root.get("12.01", false));
3446 }
3447
3448 struct CharReaderAllowSingleQuotesTest : JsonTest::TestCase {};
3449
JSONTEST_FIXTURE_LOCAL(CharReaderAllowSingleQuotesTest,issue182)3450 JSONTEST_FIXTURE_LOCAL(CharReaderAllowSingleQuotesTest, issue182) {
3451 Json::CharReaderBuilder b;
3452 b.settings_["allowSingleQuotes"] = true;
3453 Json::Value root;
3454 Json::String errs;
3455 CharReaderPtr reader(b.newCharReader());
3456 {
3457 char const doc[] = "{'a':true,\"b\":true}";
3458 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3459 JSONTEST_ASSERT(ok);
3460 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3461 JSONTEST_ASSERT_EQUAL(2u, root.size());
3462 JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
3463 JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
3464 }
3465 {
3466 char const doc[] = "{'a': 'x', \"b\":'y'}";
3467 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3468 JSONTEST_ASSERT(ok);
3469 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3470 JSONTEST_ASSERT_EQUAL(2u, root.size());
3471 JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
3472 JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
3473 }
3474 }
3475
3476 struct CharReaderAllowZeroesTest : JsonTest::TestCase {};
3477
JSONTEST_FIXTURE_LOCAL(CharReaderAllowZeroesTest,issue176)3478 JSONTEST_FIXTURE_LOCAL(CharReaderAllowZeroesTest, issue176) {
3479 Json::CharReaderBuilder b;
3480 b.settings_["allowSingleQuotes"] = true;
3481 Json::Value root;
3482 Json::String errs;
3483 CharReaderPtr reader(b.newCharReader());
3484 {
3485 char const doc[] = "{'a':true,\"b\":true}";
3486 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3487 JSONTEST_ASSERT(ok);
3488 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3489 JSONTEST_ASSERT_EQUAL(2u, root.size());
3490 JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
3491 JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
3492 }
3493 {
3494 char const doc[] = "{'a': 'x', \"b\":'y'}";
3495 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3496 JSONTEST_ASSERT(ok);
3497 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3498 JSONTEST_ASSERT_EQUAL(2u, root.size());
3499 JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
3500 JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
3501 }
3502 }
3503
3504 struct CharReaderAllowSpecialFloatsTest : JsonTest::TestCase {};
3505
JSONTEST_FIXTURE_LOCAL(CharReaderAllowSpecialFloatsTest,specialFloat)3506 JSONTEST_FIXTURE_LOCAL(CharReaderAllowSpecialFloatsTest, specialFloat) {
3507 Json::CharReaderBuilder b;
3508 CharReaderPtr reader(b.newCharReader());
3509 Json::Value root;
3510 Json::String errs;
3511 {
3512 char const doc[] = "{\"a\": NaN}";
3513 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3514 JSONTEST_ASSERT(!ok);
3515 JSONTEST_ASSERT_STRING_EQUAL(
3516 "* Line 1, Column 7\n"
3517 " Syntax error: value, object or array expected.\n",
3518 errs);
3519 }
3520 {
3521 char const doc[] = "{\"a\": Infinity}";
3522 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3523 JSONTEST_ASSERT(!ok);
3524 JSONTEST_ASSERT_STRING_EQUAL(
3525 "* Line 1, Column 7\n"
3526 " Syntax error: value, object or array expected.\n",
3527 errs);
3528 }
3529 }
3530
JSONTEST_FIXTURE_LOCAL(CharReaderAllowSpecialFloatsTest,issue209)3531 JSONTEST_FIXTURE_LOCAL(CharReaderAllowSpecialFloatsTest, issue209) {
3532 Json::CharReaderBuilder b;
3533 b.settings_["allowSpecialFloats"] = true;
3534 Json::Value root;
3535 Json::String errs;
3536 CharReaderPtr reader(b.newCharReader());
3537 {
3538 char const doc[] = R"({"a":NaN,"b":Infinity,"c":-Infinity,"d":+Infinity})";
3539 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3540 JSONTEST_ASSERT(ok);
3541 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3542 JSONTEST_ASSERT_EQUAL(4u, root.size());
3543 double n = root["a"].asDouble();
3544 JSONTEST_ASSERT(std::isnan(n));
3545 JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(),
3546 root.get("b", 0.0));
3547 JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(),
3548 root.get("c", 0.0));
3549 JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(),
3550 root.get("d", 0.0));
3551 }
3552
3553 struct TestData {
3554 int line;
3555 bool ok;
3556 Json::String in;
3557 };
3558 const TestData test_data[] = {
3559 {__LINE__, true, "{\"a\":9}"}, //
3560 {__LINE__, false, "{\"a\":0Infinity}"}, //
3561 {__LINE__, false, "{\"a\":1Infinity}"}, //
3562 {__LINE__, false, "{\"a\":9Infinity}"}, //
3563 {__LINE__, false, "{\"a\":0nfinity}"}, //
3564 {__LINE__, false, "{\"a\":1nfinity}"}, //
3565 {__LINE__, false, "{\"a\":9nfinity}"}, //
3566 {__LINE__, false, "{\"a\":nfinity}"}, //
3567 {__LINE__, false, "{\"a\":.nfinity}"}, //
3568 {__LINE__, false, "{\"a\":9nfinity}"}, //
3569 {__LINE__, false, "{\"a\":-nfinity}"}, //
3570 {__LINE__, true, "{\"a\":Infinity}"}, //
3571 {__LINE__, false, "{\"a\":.Infinity}"}, //
3572 {__LINE__, false, "{\"a\":_Infinity}"}, //
3573 {__LINE__, false, "{\"a\":_nfinity}"}, //
3574 {__LINE__, true, "{\"a\":-Infinity}"}, //
3575 {__LINE__, true, "{\"a\":+Infinity}"} //
3576 };
3577 for (const auto& td : test_data) {
3578 bool ok = reader->parse(&*td.in.begin(), &*td.in.begin() + td.in.size(),
3579 &root, &errs);
3580 JSONTEST_ASSERT(td.ok == ok) << "line:" << td.line << "\n"
3581 << " expected: {"
3582 << "ok:" << td.ok << ", in:\'" << td.in << "\'"
3583 << "}\n"
3584 << " actual: {"
3585 << "ok:" << ok << "}\n";
3586 }
3587
3588 {
3589 char const doc[] = R"({"posInf": +Infinity, "NegInf": -Infinity})";
3590 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3591 JSONTEST_ASSERT(ok);
3592 JSONTEST_ASSERT_STRING_EQUAL("", errs);
3593 JSONTEST_ASSERT_EQUAL(2u, root.size());
3594 JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(),
3595 root["posInf"].asDouble());
3596 JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(),
3597 root["NegInf"].asDouble());
3598 }
3599 }
3600
3601 struct EscapeSequenceTest : JsonTest::TestCase {};
3602
JSONTEST_FIXTURE_LOCAL(EscapeSequenceTest,readerParseEscapeSequence)3603 JSONTEST_FIXTURE_LOCAL(EscapeSequenceTest, readerParseEscapeSequence) {
3604 Json::Reader reader;
3605 Json::Value root;
3606 bool ok = reader.parse("[\"\\\"\",\"\\/\",\"\\\\\",\"\\b\","
3607 "\"\\f\",\"\\n\",\"\\r\",\"\\t\","
3608 "\"\\u0278\",\"\\ud852\\udf62\"]\n",
3609 root);
3610 JSONTEST_ASSERT(ok);
3611 JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty());
3612 JSONTEST_ASSERT(reader.getStructuredErrors().empty());
3613 }
3614
JSONTEST_FIXTURE_LOCAL(EscapeSequenceTest,charReaderParseEscapeSequence)3615 JSONTEST_FIXTURE_LOCAL(EscapeSequenceTest, charReaderParseEscapeSequence) {
3616 Json::CharReaderBuilder b;
3617 CharReaderPtr reader(b.newCharReader());
3618 Json::Value root;
3619 Json::String errs;
3620 char const doc[] = "[\"\\\"\",\"\\/\",\"\\\\\",\"\\b\","
3621 "\"\\f\",\"\\n\",\"\\r\",\"\\t\","
3622 "\"\\u0278\",\"\\ud852\\udf62\"]";
3623 bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
3624 JSONTEST_ASSERT(ok);
3625 JSONTEST_ASSERT(errs.empty());
3626 }
3627
JSONTEST_FIXTURE_LOCAL(EscapeSequenceTest,writeEscapeSequence)3628 JSONTEST_FIXTURE_LOCAL(EscapeSequenceTest, writeEscapeSequence) {
3629 Json::FastWriter writer;
3630 const Json::String expected("[\"\\\"\",\"\\\\\",\"\\b\","
3631 "\"\\f\",\"\\n\",\"\\r\",\"\\t\","
3632 "\"\\u0278\",\"\\ud852\\udf62\"]\n");
3633 Json::Value root;
3634 root[0] = "\"";
3635 root[1] = "\\";
3636 root[2] = "\b";
3637 root[3] = "\f";
3638 root[4] = "\n";
3639 root[5] = "\r";
3640 root[6] = "\t";
3641 root[7] = "ɸ";
3642 root[8] = "";
3643 const Json::String result = writer.write(root);
3644 JSONTEST_ASSERT_STRING_EQUAL(expected, result);
3645 }
3646
3647 struct BuilderTest : JsonTest::TestCase {};
3648
JSONTEST_FIXTURE_LOCAL(BuilderTest,settings)3649 JSONTEST_FIXTURE_LOCAL(BuilderTest, settings) {
3650 {
3651 Json::Value errs;
3652 Json::CharReaderBuilder rb;
3653 JSONTEST_ASSERT_EQUAL(false, rb.settings_.isMember("foo"));
3654 JSONTEST_ASSERT_EQUAL(true, rb.validate(&errs));
3655 rb["foo"] = "bar";
3656 JSONTEST_ASSERT_EQUAL(true, rb.settings_.isMember("foo"));
3657 JSONTEST_ASSERT_EQUAL(false, rb.validate(&errs));
3658 }
3659 {
3660 Json::Value errs;
3661 Json::StreamWriterBuilder wb;
3662 JSONTEST_ASSERT_EQUAL(false, wb.settings_.isMember("foo"));
3663 JSONTEST_ASSERT_EQUAL(true, wb.validate(&errs));
3664 wb["foo"] = "bar";
3665 JSONTEST_ASSERT_EQUAL(true, wb.settings_.isMember("foo"));
3666 JSONTEST_ASSERT_EQUAL(false, wb.validate(&errs));
3667 }
3668 }
3669
3670 struct BomTest : JsonTest::TestCase {};
3671
JSONTEST_FIXTURE_LOCAL(BomTest,skipBom)3672 JSONTEST_FIXTURE_LOCAL(BomTest, skipBom) {
3673 const std::string with_bom = "\xEF\xBB\xBF{\"key\" : \"value\"}";
3674 Json::Value root;
3675 JSONCPP_STRING errs;
3676 std::istringstream iss(with_bom);
3677 bool ok = parseFromStream(Json::CharReaderBuilder(), iss, &root, &errs);
3678 // The default behavior is to skip the BOM, so we can parse it normally.
3679 JSONTEST_ASSERT(ok);
3680 JSONTEST_ASSERT(errs.empty());
3681 JSONTEST_ASSERT_STRING_EQUAL(root["key"].asString(), "value");
3682 }
JSONTEST_FIXTURE_LOCAL(BomTest,notSkipBom)3683 JSONTEST_FIXTURE_LOCAL(BomTest, notSkipBom) {
3684 const std::string with_bom = "\xEF\xBB\xBF{\"key\" : \"value\"}";
3685 Json::Value root;
3686 JSONCPP_STRING errs;
3687 std::istringstream iss(with_bom);
3688 Json::CharReaderBuilder b;
3689 b.settings_["skipBom"] = false;
3690 bool ok = parseFromStream(b, iss, &root, &errs);
3691 // Detect the BOM, and failed on it.
3692 JSONTEST_ASSERT(!ok);
3693 JSONTEST_ASSERT(!errs.empty());
3694 }
3695
3696 struct IteratorTest : JsonTest::TestCase {};
3697
JSONTEST_FIXTURE_LOCAL(IteratorTest,convert)3698 JSONTEST_FIXTURE_LOCAL(IteratorTest, convert) {
3699 Json::Value j;
3700 const Json::Value& cj = j;
3701 auto it = j.begin();
3702 Json::Value::const_iterator cit;
3703 cit = it;
3704 JSONTEST_ASSERT(cit == cj.begin());
3705 }
3706
JSONTEST_FIXTURE_LOCAL(IteratorTest,decrement)3707 JSONTEST_FIXTURE_LOCAL(IteratorTest, decrement) {
3708 Json::Value json;
3709 json["k1"] = "a";
3710 json["k2"] = "b";
3711 std::vector<std::string> values;
3712 for (auto it = json.end(); it != json.begin();) {
3713 --it;
3714 values.push_back(it->asString());
3715 }
3716 JSONTEST_ASSERT((values == std::vector<std::string>{"b", "a"}));
3717 }
3718
JSONTEST_FIXTURE_LOCAL(IteratorTest,reverseIterator)3719 JSONTEST_FIXTURE_LOCAL(IteratorTest, reverseIterator) {
3720 Json::Value json;
3721 json["k1"] = "a";
3722 json["k2"] = "b";
3723 std::vector<std::string> values;
3724 using Iter = decltype(json.begin());
3725 auto re = std::reverse_iterator<Iter>(json.begin());
3726 for (auto it = std::reverse_iterator<Iter>(json.end()); it != re; ++it) {
3727 values.push_back(it->asString());
3728 }
3729 JSONTEST_ASSERT((values == std::vector<std::string>{"b", "a"}));
3730 }
3731
JSONTEST_FIXTURE_LOCAL(IteratorTest,distance)3732 JSONTEST_FIXTURE_LOCAL(IteratorTest, distance) {
3733 {
3734 Json::Value json;
3735 json["k1"] = "a";
3736 json["k2"] = "b";
3737 int i = 0;
3738 auto it = json.begin();
3739 for (;; ++it, ++i) {
3740 auto dist = it - json.begin();
3741 JSONTEST_ASSERT_EQUAL(i, dist);
3742 if (it == json.end())
3743 break;
3744 }
3745 }
3746 {
3747 Json::Value empty;
3748 JSONTEST_ASSERT_EQUAL(0, empty.end() - empty.end());
3749 JSONTEST_ASSERT_EQUAL(0, empty.end() - empty.begin());
3750 }
3751 }
3752
JSONTEST_FIXTURE_LOCAL(IteratorTest,nullValues)3753 JSONTEST_FIXTURE_LOCAL(IteratorTest, nullValues) {
3754 {
3755 Json::Value json;
3756 auto end = json.end();
3757 auto endCopy = end;
3758 JSONTEST_ASSERT(endCopy == end);
3759 endCopy = end;
3760 JSONTEST_ASSERT(endCopy == end);
3761 }
3762 {
3763 // Same test, now with const Value.
3764 const Json::Value json;
3765 auto end = json.end();
3766 auto endCopy = end;
3767 JSONTEST_ASSERT(endCopy == end);
3768 endCopy = end;
3769 JSONTEST_ASSERT(endCopy == end);
3770 }
3771 }
3772
JSONTEST_FIXTURE_LOCAL(IteratorTest,staticStringKey)3773 JSONTEST_FIXTURE_LOCAL(IteratorTest, staticStringKey) {
3774 Json::Value json;
3775 json[Json::StaticString("k1")] = "a";
3776 JSONTEST_ASSERT_EQUAL(Json::Value("k1"), json.begin().key());
3777 }
3778
JSONTEST_FIXTURE_LOCAL(IteratorTest,names)3779 JSONTEST_FIXTURE_LOCAL(IteratorTest, names) {
3780 Json::Value json;
3781 json["k1"] = "a";
3782 json["k2"] = "b";
3783 Json::ValueIterator it = json.begin();
3784 JSONTEST_ASSERT(it != json.end());
3785 JSONTEST_ASSERT_EQUAL(Json::Value("k1"), it.key());
3786 JSONTEST_ASSERT_STRING_EQUAL("k1", it.name());
3787 JSONTEST_ASSERT_STRING_EQUAL("k1", it.memberName());
3788 JSONTEST_ASSERT_EQUAL(-1, it.index());
3789 ++it;
3790 JSONTEST_ASSERT(it != json.end());
3791 JSONTEST_ASSERT_EQUAL(Json::Value("k2"), it.key());
3792 JSONTEST_ASSERT_STRING_EQUAL("k2", it.name());
3793 JSONTEST_ASSERT_STRING_EQUAL("k2", it.memberName());
3794 JSONTEST_ASSERT_EQUAL(-1, it.index());
3795 ++it;
3796 JSONTEST_ASSERT(it == json.end());
3797 }
3798
JSONTEST_FIXTURE_LOCAL(IteratorTest,indexes)3799 JSONTEST_FIXTURE_LOCAL(IteratorTest, indexes) {
3800 Json::Value json;
3801 json[0] = "a";
3802 json[1] = "b";
3803 Json::ValueIterator it = json.begin();
3804 JSONTEST_ASSERT(it != json.end());
3805 JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(0)), it.key());
3806 JSONTEST_ASSERT_STRING_EQUAL("", it.name());
3807 JSONTEST_ASSERT_EQUAL(0, it.index());
3808 ++it;
3809 JSONTEST_ASSERT(it != json.end());
3810 JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(1)), it.key());
3811 JSONTEST_ASSERT_STRING_EQUAL("", it.name());
3812 JSONTEST_ASSERT_EQUAL(1, it.index());
3813 ++it;
3814 JSONTEST_ASSERT(it == json.end());
3815 }
3816
JSONTEST_FIXTURE_LOCAL(IteratorTest,constness)3817 JSONTEST_FIXTURE_LOCAL(IteratorTest, constness) {
3818 Json::Value const v;
3819 JSONTEST_ASSERT_THROWS(
3820 Json::Value::iterator it(v.begin())); // Compile, but throw.
3821
3822 Json::Value value;
3823
3824 for (int i = 9; i < 12; ++i) {
3825 Json::OStringStream out;
3826 out << std::setw(2) << i;
3827 Json::String str = out.str();
3828 value[str] = str;
3829 }
3830
3831 Json::OStringStream out;
3832 // in old code, this will get a compile error
3833 Json::Value::const_iterator iter = value.begin();
3834 for (; iter != value.end(); ++iter) {
3835 out << *iter << ',';
3836 }
3837 Json::String expected = R"(" 9","10","11",)";
3838 JSONTEST_ASSERT_STRING_EQUAL(expected, out.str());
3839 }
3840
3841 struct RValueTest : JsonTest::TestCase {};
3842
JSONTEST_FIXTURE_LOCAL(RValueTest,moveConstruction)3843 JSONTEST_FIXTURE_LOCAL(RValueTest, moveConstruction) {
3844 Json::Value json;
3845 json["key"] = "value";
3846 Json::Value moved = std::move(json);
3847 JSONTEST_ASSERT(moved != json); // Possibly not nullValue; definitely not
3848 // equal.
3849 JSONTEST_ASSERT_EQUAL(Json::objectValue, moved.type());
3850 JSONTEST_ASSERT_EQUAL(Json::stringValue, moved["key"].type());
3851 }
3852
3853 struct FuzzTest : JsonTest::TestCase {};
3854
3855 // Build and run the fuzz test without any fuzzer, so that it's guaranteed not
3856 // go out of date, even if it's never run as an actual fuzz test.
JSONTEST_FIXTURE_LOCAL(FuzzTest,fuzzDoesntCrash)3857 JSONTEST_FIXTURE_LOCAL(FuzzTest, fuzzDoesntCrash) {
3858 const std::string example = "{}";
3859 JSONTEST_ASSERT_EQUAL(
3860 0,
3861 LLVMFuzzerTestOneInput(reinterpret_cast<const uint8_t*>(example.c_str()),
3862 example.size()));
3863 }
3864
main(int argc,const char * argv[])3865 int main(int argc, const char* argv[]) {
3866 JsonTest::Runner runner;
3867
3868 for (auto& local : local_) {
3869 runner.add(local);
3870 }
3871
3872 return runner.runCommandLine(argc, argv);
3873 }
3874
3875 struct MemberTemplateAs : JsonTest::TestCase {
3876 template <typename T, typename F>
EqEvalMemberTemplateAs3877 JsonTest::TestResult& EqEval(T v, F f) const {
3878 const Json::Value j = v;
3879 return JSONTEST_ASSERT_EQUAL(j.as<T>(), f(j));
3880 }
3881 };
3882
JSONTEST_FIXTURE_LOCAL(MemberTemplateAs,BehavesSameAsNamedAs)3883 JSONTEST_FIXTURE_LOCAL(MemberTemplateAs, BehavesSameAsNamedAs) {
3884 const Json::Value jstr = "hello world";
3885 JSONTEST_ASSERT_STRING_EQUAL(jstr.as<const char*>(), jstr.asCString());
3886 JSONTEST_ASSERT_STRING_EQUAL(jstr.as<Json::String>(), jstr.asString());
3887 EqEval(Json::Int(64), [](const Json::Value& j) { return j.asInt(); });
3888 EqEval(Json::UInt(64), [](const Json::Value& j) { return j.asUInt(); });
3889 #if defined(JSON_HAS_INT64)
3890 EqEval(Json::Int64(64), [](const Json::Value& j) { return j.asInt64(); });
3891 EqEval(Json::UInt64(64), [](const Json::Value& j) { return j.asUInt64(); });
3892 #endif // if defined(JSON_HAS_INT64)
3893 EqEval(Json::LargestInt(64),
3894 [](const Json::Value& j) { return j.asLargestInt(); });
3895 EqEval(Json::LargestUInt(64),
3896 [](const Json::Value& j) { return j.asLargestUInt(); });
3897
3898 EqEval(69.69f, [](const Json::Value& j) { return j.asFloat(); });
3899 EqEval(69.69, [](const Json::Value& j) { return j.asDouble(); });
3900 EqEval(false, [](const Json::Value& j) { return j.asBool(); });
3901 EqEval(true, [](const Json::Value& j) { return j.asBool(); });
3902 }
3903
3904 class MemberTemplateIs : public JsonTest::TestCase {};
3905
JSONTEST_FIXTURE_LOCAL(MemberTemplateIs,BehavesSameAsNamedIs)3906 JSONTEST_FIXTURE_LOCAL(MemberTemplateIs, BehavesSameAsNamedIs) {
3907 const Json::Value values[] = {true, 142, 40.63, "hello world"};
3908 for (const Json::Value& j : values) {
3909 JSONTEST_ASSERT_EQUAL(j.is<bool>(), j.isBool());
3910 JSONTEST_ASSERT_EQUAL(j.is<Json::Int>(), j.isInt());
3911 JSONTEST_ASSERT_EQUAL(j.is<Json::Int64>(), j.isInt64());
3912 JSONTEST_ASSERT_EQUAL(j.is<Json::UInt>(), j.isUInt());
3913 JSONTEST_ASSERT_EQUAL(j.is<Json::UInt64>(), j.isUInt64());
3914 JSONTEST_ASSERT_EQUAL(j.is<double>(), j.isDouble());
3915 JSONTEST_ASSERT_EQUAL(j.is<Json::String>(), j.isString());
3916 }
3917 }
3918
3919 #if defined(__GNUC__)
3920 #pragma GCC diagnostic pop
3921 #endif
3922