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