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