• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

open-source-parsers / jsoncpp / 10784089608

10 Sep 2024 01:27AM CUT coverage: 95.383%. First build
10784089608

Pull #1561

github

web-flow
Merge branch 'master' into baylesj-patch-6
Pull Request #1561: Add code coverage

5268 of 5523 relevant lines covered (95.38%)

12029.53 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.88
/src/test_lib_json/main.cpp
1
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
2
// Distributed under MIT license, or public domain if desired and
3
// recognized in your jurisdiction.
4
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
5

6
#if defined(__GNUC__)
7
#pragma GCC diagnostic push
8
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
9
#elif defined(_MSC_VER)
10
#pragma warning(disable : 4996)
11
#endif
12

13
#include "fuzz.h"
14
#include "jsontest.h"
15
#include <algorithm>
16
#include <cmath>
17
#include <cstring>
18
#include <functional>
19
#include <iomanip>
20
#include <iostream>
21
#include <iterator>
22
#include <json/config.h>
23
#include <json/json.h>
24
#include <limits>
25
#include <memory>
26
#include <sstream>
27
#include <string>
28
#include <vector>
29

30
using CharReaderPtr = std::unique_ptr<Json::CharReader>;
31

32
// Make numeric limits more convenient to talk about.
33
// Assumes int type in 32 bits.
34
#define kint32max Json::Value::maxInt
35
#define kint32min Json::Value::minInt
36
#define kuint32max Json::Value::maxUInt
37
#define kint64max Json::Value::maxInt64
38
#define kint64min Json::Value::minInt64
39
#define kuint64max Json::Value::maxUInt64
40

41
// static const double kdint64max = double(kint64max);
42
// static const float kfint64max = float(kint64max);
43
static const float kfint32max = float(kint32max);
44
static const float kfuint32max = float(kuint32max);
45

46
// //////////////////////////////////////////////////////////////////
47
// //////////////////////////////////////////////////////////////////
48
// Json Library test cases
49
// //////////////////////////////////////////////////////////////////
50
// //////////////////////////////////////////////////////////////////
51

52
#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
53
static inline double uint64ToDouble(Json::UInt64 value) {
54
  return static_cast<double>(value);
55
}
56
#else  // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
57
static inline double uint64ToDouble(Json::UInt64 value) {
58
  return static_cast<double>(Json::Int64(value / 2)) * 2.0 +
59
         static_cast<double>(Json::Int64(value & 1));
60
}
61
#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
62

63
// local_ is the collection for the testcases in this code file.
64
static std::deque<JsonTest::TestCaseFactory> local_;
65
#define JSONTEST_FIXTURE_LOCAL(FixtureType, name)                              \
66
  JSONTEST_FIXTURE_V2(FixtureType, name, local_)
67

68
struct ValueTest : JsonTest::TestCase {
69
  Json::Value null_;
70
  Json::Value emptyArray_{Json::arrayValue};
71
  Json::Value emptyObject_{Json::objectValue};
72
  Json::Value integer_{123456789};
73
  Json::Value unsignedInteger_{34567890};
74
  Json::Value smallUnsignedInteger_{Json::Value::UInt(Json::Value::maxInt)};
75
  Json::Value real_{1234.56789};
76
  Json::Value float_{0.00390625f};
77
  Json::Value array1_;
78
  Json::Value object1_;
79
  Json::Value emptyString_{""};
80
  Json::Value string1_{"a"};
81
  Json::Value string_{"sometext with space"};
82
  Json::Value true_{true};
83
  Json::Value false_{false};
84

85
  ValueTest() {
34✔
86
    array1_.append(1234);
34✔
87
    object1_["id"] = 1234;
34✔
88
  }
34✔
89

90
  struct IsCheck {
91
    /// Initialize all checks to \c false by default.
92
    IsCheck();
93

94
    bool isObject_{false};
95
    bool isArray_{false};
96
    bool isBool_{false};
97
    bool isString_{false};
98
    bool isNull_{false};
99

100
    bool isInt_{false};
101
    bool isInt64_{false};
102
    bool isUInt_{false};
103
    bool isUInt64_{false};
104
    bool isIntegral_{false};
105
    bool isDouble_{false};
106
    bool isNumeric_{false};
107
  };
108

109
  void checkConstMemberCount(const Json::Value& value,
110
                             unsigned int expectedCount);
111

112
  void checkMemberCount(Json::Value& value, unsigned int expectedCount);
113

114
  void checkIs(const Json::Value& value, const IsCheck& check);
115

116
  void checkIsLess(const Json::Value& x, const Json::Value& y);
117

118
  void checkIsEqual(const Json::Value& x, const Json::Value& y);
119

120
  /// Normalize the representation of floating-point number by stripped leading
121
  /// 0 in exponent.
122
  static Json::String normalizeFloatingPointStr(const Json::String& s);
123
};
124

125
Json::String ValueTest::normalizeFloatingPointStr(const Json::String& s) {
29✔
126
  auto index = s.find_last_of("eE");
127
  if (index == s.npos)
29✔
128
    return s;
129
  std::size_t signWidth = (s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
20✔
130
  auto exponentStartIndex = index + 1 + signWidth;
20✔
131
  Json::String normalized = s.substr(0, exponentStartIndex);
20✔
132
  auto indexDigit = s.find_first_not_of('0', exponentStartIndex);
133
  Json::String exponent = "0";
20✔
134
  if (indexDigit != s.npos) { // nonzero exponent
20✔
135
    exponent = s.substr(indexDigit);
32✔
136
  }
137
  return normalized + exponent;
20✔
138
}
139

140
JSONTEST_FIXTURE_LOCAL(ValueTest, checkNormalizeFloatingPointStr) {
10✔
141
  struct TestData {
142
    std::string in;
143
    std::string out;
144
  } const testData[] = {
145
      {"0.0", "0.0"},
146
      {"0e0", "0e0"},
147
      {"1234.0", "1234.0"},
148
      {"1234.0e0", "1234.0e0"},
149
      {"1234.0e-1", "1234.0e-1"},
150
      {"1234.0e+0", "1234.0e+0"},
151
      {"1234.0e+001", "1234.0e+1"},
152
      {"1234e-1", "1234e-1"},
153
      {"1234e+000", "1234e+0"},
154
      {"1234e+001", "1234e+1"},
155
      {"1234e10", "1234e10"},
156
      {"1234e010", "1234e10"},
157
      {"1234e+010", "1234e+10"},
158
      {"1234e-010", "1234e-10"},
159
      {"1234e+100", "1234e+100"},
160
      {"1234e-100", "1234e-100"},
161
  };
34✔
162
  for (const auto& td : testData) {
34✔
163
    JSONTEST_ASSERT_STRING_EQUAL(normalizeFloatingPointStr(td.in), td.out);
64✔
164
  }
165
}
36✔
166

167
JSONTEST_FIXTURE_LOCAL(ValueTest, memberCount) {
10✔
168
  JSONTEST_ASSERT_PRED(checkMemberCount(emptyArray_, 0));
2✔
169
  JSONTEST_ASSERT_PRED(checkMemberCount(emptyObject_, 0));
2✔
170
  JSONTEST_ASSERT_PRED(checkMemberCount(array1_, 1));
2✔
171
  JSONTEST_ASSERT_PRED(checkMemberCount(object1_, 1));
2✔
172
  JSONTEST_ASSERT_PRED(checkMemberCount(null_, 0));
2✔
173
  JSONTEST_ASSERT_PRED(checkMemberCount(integer_, 0));
2✔
174
  JSONTEST_ASSERT_PRED(checkMemberCount(unsignedInteger_, 0));
2✔
175
  JSONTEST_ASSERT_PRED(checkMemberCount(smallUnsignedInteger_, 0));
2✔
176
  JSONTEST_ASSERT_PRED(checkMemberCount(real_, 0));
2✔
177
  JSONTEST_ASSERT_PRED(checkMemberCount(emptyString_, 0));
2✔
178
  JSONTEST_ASSERT_PRED(checkMemberCount(string_, 0));
2✔
179
  JSONTEST_ASSERT_PRED(checkMemberCount(true_, 0));
2✔
180
  JSONTEST_ASSERT_PRED(checkMemberCount(false_, 0));
2✔
181
  JSONTEST_ASSERT_PRED(checkMemberCount(string1_, 0));
2✔
182
  JSONTEST_ASSERT_PRED(checkMemberCount(float_, 0));
2✔
183
}
2✔
184

185
JSONTEST_FIXTURE_LOCAL(ValueTest, objects) {
10✔
186
  // Types
187
  IsCheck checks;
188
  checks.isObject_ = true;
2✔
189
  JSONTEST_ASSERT_PRED(checkIs(emptyObject_, checks));
2✔
190
  JSONTEST_ASSERT_PRED(checkIs(object1_, checks));
2✔
191

192
  JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());
2✔
193

194
  // Empty object okay
195
  JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));
2✔
196

197
  // Non-empty object not okay
198
  JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));
2✔
199

200
  // Always okay
201
  JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));
2✔
202

203
  // Never okay
204
  JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
2✔
205
  JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
2✔
206
  JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
2✔
207
  JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
2✔
208
  JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
2✔
209
  JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));
2✔
210

211
  // Access through const reference
212
  const Json::Value& constObject = object1_;
213

214
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
2✔
215
  JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);
2✔
216

217
  // Access through find()
218
  const char idKey[] = "id";
2✔
219
  const Json::Value* foundId = object1_.find(idKey, idKey + strlen(idKey));
2✔
220
  JSONTEST_ASSERT(foundId != nullptr);
2✔
221
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), *foundId);
2✔
222

223
  const char unknownIdKey[] = "unknown id";
2✔
224
  const Json::Value* foundUnknownId =
225
      object1_.find(unknownIdKey, unknownIdKey + strlen(unknownIdKey));
2✔
226
  JSONTEST_ASSERT_EQUAL(nullptr, foundUnknownId);
2✔
227

228
  // Access through demand()
229
  const char yetAnotherIdKey[] = "yet another id";
2✔
230
  const Json::Value* foundYetAnotherId =
231
      object1_.find(yetAnotherIdKey, yetAnotherIdKey + strlen(yetAnotherIdKey));
2✔
232
  JSONTEST_ASSERT_EQUAL(nullptr, foundYetAnotherId);
2✔
233
  Json::Value* demandedYetAnotherId = object1_.demand(
2✔
234
      yetAnotherIdKey, yetAnotherIdKey + strlen(yetAnotherIdKey));
235
  JSONTEST_ASSERT(demandedYetAnotherId != nullptr);
2✔
236
  *demandedYetAnotherId = "baz";
2✔
237

238
  JSONTEST_ASSERT_EQUAL(Json::Value("baz"), object1_["yet another id"]);
2✔
239

240
  // Access through non-const reference
241
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
2✔
242
  JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
2✔
243

244
  object1_["some other id"] = "foo";
2✔
245
  JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
2✔
246
  JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
2✔
247

248
  // Remove.
249
  Json::Value got;
2✔
250
  bool did;
251
  did = object1_.removeMember("some other id", &got);
2✔
252
  JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
2✔
253
  JSONTEST_ASSERT_EQUAL(true, did);
2✔
254
  got = Json::Value("bar");
2✔
255
  did = object1_.removeMember("some other id", &got);
2✔
256
  JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
2✔
257
  JSONTEST_ASSERT_EQUAL(false, did);
2✔
258

259
  object1_["some other id"] = "foo";
2✔
260
  Json::Value* gotPtr = nullptr;
261
  did = object1_.removeMember("some other id", gotPtr);
2✔
262
  JSONTEST_ASSERT_EQUAL(nullptr, gotPtr);
2✔
263
  JSONTEST_ASSERT_EQUAL(true, did);
2✔
264

265
  // Using other removeMember interfaces, the test idea is the same as above.
266
  object1_["some other id"] = "foo";
2✔
267
  const Json::String key("some other id");
2✔
268
  did = object1_.removeMember(key, &got);
2✔
269
  JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
2✔
270
  JSONTEST_ASSERT_EQUAL(true, did);
2✔
271
  got = Json::Value("bar");
2✔
272
  did = object1_.removeMember(key, &got);
2✔
273
  JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
2✔
274
  JSONTEST_ASSERT_EQUAL(false, did);
2✔
275

276
  object1_["some other id"] = "foo";
2✔
277
  object1_.removeMember(key);
2✔
278
  JSONTEST_ASSERT_EQUAL(Json::nullValue, object1_[key]);
2✔
279
}
2✔
280

281
JSONTEST_FIXTURE_LOCAL(ValueTest, arrays) {
10✔
282
  const unsigned int index0 = 0;
283

284
  // Types
285
  IsCheck checks;
286
  checks.isArray_ = true;
2✔
287
  JSONTEST_ASSERT_PRED(checkIs(emptyArray_, checks));
2✔
288
  JSONTEST_ASSERT_PRED(checkIs(array1_, checks));
2✔
289

290
  JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
2✔
291

292
  // Empty array okay
293
  JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));
2✔
294

295
  // Non-empty array not okay
296
  JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));
2✔
297

298
  // Always okay
299
  JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));
2✔
300

301
  // Never okay
302
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
2✔
303
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
2✔
304
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
2✔
305
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
2✔
306
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
2✔
307
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));
2✔
308

309
  // Access through const reference
310
  const Json::Value& constArray = array1_;
311
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
2✔
312
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
2✔
313
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray.front());
2✔
314
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray.back());
2✔
315

316
  // Access through non-const reference
317
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
2✔
318
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
2✔
319
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_.front());
2✔
320
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_.back());
2✔
321

322
  array1_[2] = Json::Value(17);
2✔
323
  JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
2✔
324
  JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
2✔
325
  Json::Value got;
2✔
326
  JSONTEST_ASSERT_EQUAL(true, array1_.removeIndex(2, &got));
2✔
327
  JSONTEST_ASSERT_EQUAL(Json::Value(17), got);
2✔
328
  JSONTEST_ASSERT_EQUAL(false, array1_.removeIndex(2, &got)); // gone now
2✔
329
}
2✔
330
JSONTEST_FIXTURE_LOCAL(ValueTest, resizeArray) {
10✔
331
  Json::Value array;
2✔
332
  {
333
    for (Json::ArrayIndex i = 0; i < 10; i++)
22✔
334
      array[i] = i;
20✔
335
    JSONTEST_ASSERT_EQUAL(array.size(), 10);
2✔
336
    // The length set is greater than the length of the array.
337
    array.resize(15);
2✔
338
    JSONTEST_ASSERT_EQUAL(array.size(), 15);
2✔
339

340
    // The length set is less than the length of the array.
341
    array.resize(5);
2✔
342
    JSONTEST_ASSERT_EQUAL(array.size(), 5);
2✔
343

344
    // The length of the array is set to 0.
345
    array.resize(0);
2✔
346
    JSONTEST_ASSERT_EQUAL(array.size(), 0);
2✔
347
  }
348
  {
349
    for (Json::ArrayIndex i = 0; i < 10; i++)
22✔
350
      array[i] = i;
20✔
351
    JSONTEST_ASSERT_EQUAL(array.size(), 10);
2✔
352
    array.clear();
2✔
353
    JSONTEST_ASSERT_EQUAL(array.size(), 0);
2✔
354
  }
355
}
2✔
356

357
JSONTEST_FIXTURE_LOCAL(ValueTest, resizePopulatesAllMissingElements) {
10✔
358
  Json::ArrayIndex n = 10;
359
  Json::Value v;
2✔
360
  v.resize(n);
2✔
361
  JSONTEST_ASSERT_EQUAL(n, v.size());
2✔
362
  JSONTEST_ASSERT_EQUAL(n, std::distance(v.begin(), v.end()));
2✔
363
  JSONTEST_ASSERT_EQUAL(v.front(), Json::Value{});
4✔
364
  JSONTEST_ASSERT_EQUAL(v.back(), Json::Value{});
2✔
365
  for (const Json::Value& e : v)
24✔
366
    JSONTEST_ASSERT_EQUAL(e, Json::Value{});
20✔
367
}
2✔
368

369
JSONTEST_FIXTURE_LOCAL(ValueTest, getArrayValue) {
10✔
370
  Json::Value array;
2✔
371
  for (Json::ArrayIndex i = 0; i < 5; i++)
12✔
372
    array[i] = i;
10✔
373

374
  JSONTEST_ASSERT_EQUAL(array.size(), 5);
2✔
375
  const Json::Value defaultValue(10);
2✔
376
  Json::ArrayIndex index = 0;
377
  for (; index <= 4; index++)
12✔
378
    JSONTEST_ASSERT_EQUAL(index, array.get(index, defaultValue).asInt());
10✔
379

380
  index = 4;
381
  JSONTEST_ASSERT_EQUAL(array.isValidIndex(index), true);
2✔
382
  index = 5;
383
  JSONTEST_ASSERT_EQUAL(array.isValidIndex(index), false);
2✔
384
  JSONTEST_ASSERT_EQUAL(defaultValue, array.get(index, defaultValue));
2✔
385
  JSONTEST_ASSERT_EQUAL(array.isValidIndex(index), false);
2✔
386
}
2✔
387
JSONTEST_FIXTURE_LOCAL(ValueTest, arrayIssue252) {
10✔
388
  int count = 5;
389
  Json::Value root;
2✔
390
  Json::Value item;
2✔
391
  root["array"] = Json::Value::nullSingleton();
2✔
392
  for (int i = 0; i < count; i++) {
12✔
393
    item["a"] = i;
10✔
394
    item["b"] = i;
10✔
395
    root["array"][i] = item;
10✔
396
  }
397
  // JSONTEST_ASSERT_EQUAL(5, root["array"].size());
398
}
2✔
399

400
JSONTEST_FIXTURE_LOCAL(ValueTest, arrayInsertAtRandomIndex) {
10✔
401
  Json::Value array;
2✔
402
  const Json::Value str0("index2");
2✔
403
  const Json::Value str1("index3");
2✔
404
  array.append("index0"); // append rvalue
2✔
405
  array.append("index1");
2✔
406
  array.append(str0); // append lvalue
2✔
407

408
  std::vector<Json::Value*> vec; // storage value address for checking
409
  for (Json::ArrayIndex i = 0; i < 3; i++) {
8✔
410
    vec.push_back(&array[i]);
6✔
411
  }
412
  JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array[0]); // check append
2✔
413
  JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[1]);
2✔
414
  JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[2]);
2✔
415
  JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array.front());
2✔
416
  JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array.back());
2✔
417

418
  // insert lvalue at the head
419
  JSONTEST_ASSERT(array.insert(0, str1));
2✔
420
  JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array[0]);
2✔
421
  JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array[1]);
2✔
422
  JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[2]);
2✔
423
  JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[3]);
2✔
424
  JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array.front());
2✔
425
  JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array.back());
2✔
426
  // checking address
427
  for (Json::ArrayIndex i = 0; i < 3; i++) {
8✔
428
    JSONTEST_ASSERT_EQUAL(vec[i], &array[i]);
6✔
429
  }
430
  vec.push_back(&array[3]);
2✔
431
  // insert rvalue at middle
432
  JSONTEST_ASSERT(array.insert(2, "index4"));
2✔
433
  JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array[0]);
2✔
434
  JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array[1]);
2✔
435
  JSONTEST_ASSERT_EQUAL(Json::Value("index4"), array[2]);
2✔
436
  JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[3]);
2✔
437
  JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[4]);
2✔
438
  JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array.front());
2✔
439
  JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array.back());
2✔
440
  // checking address
441
  for (Json::ArrayIndex i = 0; i < 4; i++) {
10✔
442
    JSONTEST_ASSERT_EQUAL(vec[i], &array[i]);
8✔
443
  }
444
  vec.push_back(&array[4]);
2✔
445
  // insert rvalue at the tail
446
  JSONTEST_ASSERT(array.insert(5, "index5"));
2✔
447
  JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array[0]);
2✔
448
  JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array[1]);
2✔
449
  JSONTEST_ASSERT_EQUAL(Json::Value("index4"), array[2]);
2✔
450
  JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[3]);
2✔
451
  JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[4]);
2✔
452
  JSONTEST_ASSERT_EQUAL(Json::Value("index5"), array[5]);
2✔
453
  JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array.front());
2✔
454
  JSONTEST_ASSERT_EQUAL(Json::Value("index5"), array.back());
2✔
455
  // checking address
456
  for (Json::ArrayIndex i = 0; i < 5; i++) {
12✔
457
    JSONTEST_ASSERT_EQUAL(vec[i], &array[i]);
10✔
458
  }
459
  vec.push_back(&array[5]);
2✔
460
  // beyond max array size, it should not be allowed to insert into its tail
461
  JSONTEST_ASSERT(!array.insert(10, "index10"));
2✔
462
}
2✔
463

464
JSONTEST_FIXTURE_LOCAL(ValueTest, null) {
10✔
465
  JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
2✔
466

467
  IsCheck checks;
468
  checks.isNull_ = true;
2✔
469
  JSONTEST_ASSERT_PRED(checkIs(null_, checks));
2✔
470

471
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
2✔
472
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
2✔
473
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
2✔
474
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
2✔
475
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
2✔
476
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
2✔
477
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
2✔
478
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));
2✔
479

480
  JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
2✔
481
  JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
2✔
482
  JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
2✔
483
  JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
2✔
484
  JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
2✔
485
  JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
2✔
486
  JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
4✔
487

488
  JSONTEST_ASSERT_EQUAL(Json::Value::nullSingleton(), null_);
2✔
489

490
  // Test using a Value in a boolean context (false iff null)
491
  JSONTEST_ASSERT_EQUAL(null_, false);
2✔
492
  JSONTEST_ASSERT_EQUAL(object1_, true);
2✔
493
  JSONTEST_ASSERT_EQUAL(!null_, true);
2✔
494
  JSONTEST_ASSERT_EQUAL(!object1_, false);
2✔
495
}
2✔
496

497
JSONTEST_FIXTURE_LOCAL(ValueTest, strings) {
10✔
498
  JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
2✔
499

500
  IsCheck checks;
501
  checks.isString_ = true;
2✔
502
  JSONTEST_ASSERT_PRED(checkIs(emptyString_, checks));
2✔
503
  JSONTEST_ASSERT_PRED(checkIs(string_, checks));
2✔
504
  JSONTEST_ASSERT_PRED(checkIs(string1_, checks));
2✔
505

506
  // Empty string okay
507
  JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));
2✔
508

509
  // Non-empty string not okay
510
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));
2✔
511

512
  // Always okay
513
  JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));
2✔
514

515
  // Never okay
516
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
2✔
517
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
2✔
518
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
2✔
519
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
2✔
520
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));
2✔
521

522
  JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
4✔
523
  JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
4✔
524
}
2✔
525

526
JSONTEST_FIXTURE_LOCAL(ValueTest, bools) {
10✔
527
  JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
2✔
528

529
  IsCheck checks;
530
  checks.isBool_ = true;
2✔
531
  JSONTEST_ASSERT_PRED(checkIs(false_, checks));
2✔
532
  JSONTEST_ASSERT_PRED(checkIs(true_, checks));
2✔
533

534
  // False okay
535
  JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));
2✔
536

537
  // True not okay
538
  JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));
2✔
539

540
  // Always okay
541
  JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
2✔
542
  JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
2✔
543
  JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
2✔
544
  JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
2✔
545
  JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));
2✔
546

547
  // Never okay
548
  JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
2✔
549
  JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));
2✔
550

551
  JSONTEST_ASSERT_EQUAL(true, true_.asBool());
2✔
552
  JSONTEST_ASSERT_EQUAL(1, true_.asInt());
2✔
553
  JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
2✔
554
  JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
2✔
555
  JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
2✔
556
  JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
2✔
557
  JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());
2✔
558

559
  JSONTEST_ASSERT_EQUAL(false, false_.asBool());
2✔
560
  JSONTEST_ASSERT_EQUAL(0, false_.asInt());
2✔
561
  JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
2✔
562
  JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
2✔
563
  JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
2✔
564
  JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
2✔
565
  JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
2✔
566
}
2✔
567

568
JSONTEST_FIXTURE_LOCAL(ValueTest, integers) {
10✔
569
  IsCheck checks;
570
  Json::Value val;
2✔
571

572
  // Conversions that don't depend on the value.
573
  JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
2✔
574
  JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
2✔
575
  JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
2✔
576
  JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
2✔
577
  JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));
2✔
578

579
  JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
2✔
580
  JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
2✔
581
  JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
2✔
582
  JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
2✔
583
  JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));
2✔
584

585
  JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
2✔
586
  JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
2✔
587
  JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
2✔
588
  JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
2✔
589
  JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));
2✔
590

591
  // Default int
592
  val = Json::Value(Json::intValue);
2✔
593

594
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
595

596
  checks = IsCheck();
2✔
597
  checks.isInt_ = true;
2✔
598
  checks.isInt64_ = true;
2✔
599
  checks.isUInt_ = true;
2✔
600
  checks.isUInt64_ = true;
2✔
601
  checks.isIntegral_ = true;
2✔
602
  checks.isDouble_ = true;
2✔
603
  checks.isNumeric_ = true;
2✔
604
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
605

606
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
607
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
608
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
609

610
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
611
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
612
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
613
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
614
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
615
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
616
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
617
  JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
4✔
618

619
  // Default uint
620
  val = Json::Value(Json::uintValue);
2✔
621

622
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
623

624
  checks = IsCheck();
2✔
625
  checks.isInt_ = true;
2✔
626
  checks.isInt64_ = true;
2✔
627
  checks.isUInt_ = true;
2✔
628
  checks.isUInt64_ = true;
2✔
629
  checks.isIntegral_ = true;
2✔
630
  checks.isDouble_ = true;
2✔
631
  checks.isNumeric_ = true;
2✔
632
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
633

634
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
635
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
636
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
637

638
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
639
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
640
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
641
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
642
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
643
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
644
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
645
  JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
4✔
646

647
  // Default real
648
  val = Json::Value(Json::realValue);
2✔
649

650
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
651

652
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
653
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
654
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
655

656
  checks = IsCheck();
2✔
657
  checks.isInt_ = true;
2✔
658
  checks.isInt64_ = true;
2✔
659
  checks.isUInt_ = true;
2✔
660
  checks.isUInt64_ = true;
2✔
661
  checks.isIntegral_ = true;
2✔
662
  checks.isDouble_ = true;
2✔
663
  checks.isNumeric_ = true;
2✔
664
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
665

666
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
667
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
668
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
669
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
670
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
671
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
672
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
673
  JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
6✔
674

675
  // Zero (signed constructor arg)
676
  val = Json::Value(0);
2✔
677

678
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
679

680
  checks = IsCheck();
2✔
681
  checks.isInt_ = true;
2✔
682
  checks.isInt64_ = true;
2✔
683
  checks.isUInt_ = true;
2✔
684
  checks.isUInt64_ = true;
2✔
685
  checks.isIntegral_ = true;
2✔
686
  checks.isDouble_ = true;
2✔
687
  checks.isNumeric_ = true;
2✔
688
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
689

690
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
691
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
692
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
693

694
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
695
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
696
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
697
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
698
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
699
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
700
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
701
  JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
4✔
702

703
  // Zero (unsigned constructor arg)
704
  val = Json::Value(0u);
2✔
705

706
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
707

708
  checks = IsCheck();
2✔
709
  checks.isInt_ = true;
2✔
710
  checks.isInt64_ = true;
2✔
711
  checks.isUInt_ = true;
2✔
712
  checks.isUInt64_ = true;
2✔
713
  checks.isIntegral_ = true;
2✔
714
  checks.isDouble_ = true;
2✔
715
  checks.isNumeric_ = true;
2✔
716
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
717

718
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
719
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
720
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
721

722
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
723
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
724
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
725
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
726
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
727
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
728
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
729
  JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
4✔
730

731
  // Zero (floating-point constructor arg)
732
  val = Json::Value(0.0);
2✔
733

734
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
735

736
  checks = IsCheck();
2✔
737
  checks.isInt_ = true;
2✔
738
  checks.isInt64_ = true;
2✔
739
  checks.isUInt_ = true;
2✔
740
  checks.isUInt64_ = true;
2✔
741
  checks.isIntegral_ = true;
2✔
742
  checks.isDouble_ = true;
2✔
743
  checks.isNumeric_ = true;
2✔
744
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
745

746
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
747
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
748
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
749

750
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
751
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
752
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
753
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
754
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
755
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
756
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
757
  JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
6✔
758

759
  // 2^20 (signed constructor arg)
760
  val = Json::Value(1 << 20);
2✔
761

762
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
763
  checks = IsCheck();
2✔
764
  checks.isInt_ = true;
2✔
765
  checks.isInt64_ = true;
2✔
766
  checks.isUInt_ = true;
2✔
767
  checks.isUInt64_ = true;
2✔
768
  checks.isIntegral_ = true;
2✔
769
  checks.isDouble_ = true;
2✔
770
  checks.isNumeric_ = true;
2✔
771
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
772

773
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
774
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
775
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
776

777
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
2✔
778
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
2✔
779
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
2✔
780
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
2✔
781
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
2✔
782
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
2✔
783
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
784
  JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
4✔
785

786
  // 2^20 (unsigned constructor arg)
787
  val = Json::Value(Json::UInt(1 << 20));
2✔
788

789
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
790

791
  checks = IsCheck();
2✔
792
  checks.isInt_ = true;
2✔
793
  checks.isInt64_ = true;
2✔
794
  checks.isUInt_ = true;
2✔
795
  checks.isUInt64_ = true;
2✔
796
  checks.isIntegral_ = true;
2✔
797
  checks.isDouble_ = true;
2✔
798
  checks.isNumeric_ = true;
2✔
799
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
800

801
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
802
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
803
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
804

805
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
2✔
806
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
2✔
807
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
2✔
808
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
2✔
809
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
2✔
810
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
2✔
811
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
812
  JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
4✔
813

814
  // 2^20 (floating-point constructor arg)
815
  val = Json::Value((1 << 20) / 1.0);
2✔
816

817
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
818

819
  checks = IsCheck();
2✔
820
  checks.isInt_ = true;
2✔
821
  checks.isInt64_ = true;
2✔
822
  checks.isUInt_ = true;
2✔
823
  checks.isUInt64_ = true;
2✔
824
  checks.isIntegral_ = true;
2✔
825
  checks.isDouble_ = true;
2✔
826
  checks.isNumeric_ = true;
2✔
827
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
828

829
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
830
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
831
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
832

833
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
2✔
834
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
2✔
835
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
2✔
836
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
2✔
837
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
2✔
838
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
2✔
839
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
840
  JSONTEST_ASSERT_STRING_EQUAL(
6✔
841
      "1048576.0",
842
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
843

844
  // -2^20
845
  val = Json::Value(-(1 << 20));
2✔
846

847
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
848

849
  checks = IsCheck();
2✔
850
  checks.isInt_ = true;
2✔
851
  checks.isInt64_ = true;
2✔
852
  checks.isIntegral_ = true;
2✔
853
  checks.isDouble_ = true;
2✔
854
  checks.isNumeric_ = true;
2✔
855
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
856

857
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
858
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
859
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
860

861
  JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
2✔
862
  JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
2✔
863
  JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
2✔
864
  JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
2✔
865
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
866
  JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
4✔
867

868
  // int32 max
869
  val = Json::Value(kint32max);
2✔
870

871
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
872

873
  checks = IsCheck();
2✔
874
  checks.isInt_ = true;
2✔
875
  checks.isInt64_ = true;
2✔
876
  checks.isUInt_ = true;
2✔
877
  checks.isUInt64_ = true;
2✔
878
  checks.isIntegral_ = true;
2✔
879
  checks.isDouble_ = true;
2✔
880
  checks.isNumeric_ = true;
2✔
881
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
882

883
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
884
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
885
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
886

887
  JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
2✔
888
  JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
2✔
889
  JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
2✔
890
  JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
2✔
891
  JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
2✔
892
  JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
2✔
893
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
894
  JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
4✔
895

896
  // int32 min
897
  val = Json::Value(kint32min);
2✔
898

899
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
900

901
  checks = IsCheck();
2✔
902
  checks.isInt_ = true;
2✔
903
  checks.isInt64_ = true;
2✔
904
  checks.isIntegral_ = true;
2✔
905
  checks.isDouble_ = true;
2✔
906
  checks.isNumeric_ = true;
2✔
907
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
908

909
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
910
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
911
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
912

913
  JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
2✔
914
  JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
2✔
915
  JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
2✔
916
  JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
2✔
917
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
918
  JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
4✔
919

920
  // uint32 max
921
  val = Json::Value(kuint32max);
2✔
922

923
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
924

925
  checks = IsCheck();
2✔
926
  checks.isInt64_ = true;
2✔
927
  checks.isUInt_ = true;
2✔
928
  checks.isUInt64_ = true;
2✔
929
  checks.isIntegral_ = true;
2✔
930
  checks.isDouble_ = true;
2✔
931
  checks.isNumeric_ = true;
2✔
932
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
933

934
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
935
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
936
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
937

938
#ifndef JSON_NO_INT64
939
  JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
2✔
940
#endif
941
  JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
2✔
942
  JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
2✔
943
  JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
2✔
944
  JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
2✔
945
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
946
  JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
4✔
947

948
#ifdef JSON_NO_INT64
949
  // int64 max
950
  val = Json::Value(double(kint64max));
951

952
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
953

954
  checks = IsCheck();
955
  checks.isDouble_ = true;
956
  checks.isNumeric_ = true;
957
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
958

959
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
960
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
961
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
962

963
  JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
964
  JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
965
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
966
  JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
967

968
  // int64 min
969
  val = Json::Value(double(kint64min));
970

971
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
972

973
  checks = IsCheck();
974
  checks.isDouble_ = true;
975
  checks.isNumeric_ = true;
976
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
977

978
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
979
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
980
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
981

982
  JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
983
  JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
984
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
985
  JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
986

987
  // uint64 max
988
  val = Json::Value(double(kuint64max));
989

990
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
991

992
  checks = IsCheck();
993
  checks.isDouble_ = true;
994
  checks.isNumeric_ = true;
995
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
996

997
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
998
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
999
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1000

1001
  JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
1002
  JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
1003
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
1004
  JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
1005
#else // ifdef JSON_NO_INT64
1006
  // 2^40 (signed constructor arg)
1007
  val = Json::Value(Json::Int64(1) << 40);
2✔
1008

1009
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
1010

1011
  checks = IsCheck();
2✔
1012
  checks.isInt64_ = true;
2✔
1013
  checks.isUInt64_ = true;
2✔
1014
  checks.isIntegral_ = true;
2✔
1015
  checks.isDouble_ = true;
2✔
1016
  checks.isNumeric_ = true;
2✔
1017
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1018

1019
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1020
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1021
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1022

1023
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
2✔
1024
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
2✔
1025
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
2✔
1026
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
2✔
1027
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
2✔
1028
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
2✔
1029
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1030
  JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
4✔
1031

1032
  // 2^40 (unsigned constructor arg)
1033
  val = Json::Value(Json::UInt64(1) << 40);
2✔
1034

1035
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
1036

1037
  checks = IsCheck();
2✔
1038
  checks.isInt64_ = true;
2✔
1039
  checks.isUInt64_ = true;
2✔
1040
  checks.isIntegral_ = true;
2✔
1041
  checks.isDouble_ = true;
2✔
1042
  checks.isNumeric_ = true;
2✔
1043
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1044

1045
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1046
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1047
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1048

1049
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
2✔
1050
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
2✔
1051
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
2✔
1052
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
2✔
1053
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
2✔
1054
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
2✔
1055
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1056
  JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
4✔
1057

1058
  // 2^40 (floating-point constructor arg)
1059
  val = Json::Value((Json::Int64(1) << 40) / 1.0);
2✔
1060

1061
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1062

1063
  checks = IsCheck();
2✔
1064
  checks.isInt64_ = true;
2✔
1065
  checks.isUInt64_ = true;
2✔
1066
  checks.isIntegral_ = true;
2✔
1067
  checks.isDouble_ = true;
2✔
1068
  checks.isNumeric_ = true;
2✔
1069
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1070

1071
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1072
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1073
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1074

1075
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
2✔
1076
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
2✔
1077
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
2✔
1078
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
2✔
1079
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
2✔
1080
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
2✔
1081
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1082
  JSONTEST_ASSERT_STRING_EQUAL(
6✔
1083
      "1099511627776.0",
1084
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1085

1086
  // -2^40
1087
  val = Json::Value(-(Json::Int64(1) << 40));
2✔
1088

1089
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
1090

1091
  checks = IsCheck();
2✔
1092
  checks.isInt64_ = true;
2✔
1093
  checks.isIntegral_ = true;
2✔
1094
  checks.isDouble_ = true;
2✔
1095
  checks.isNumeric_ = true;
2✔
1096
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1097

1098
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1099
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1100
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1101

1102
  JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
2✔
1103
  JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
2✔
1104
  JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
2✔
1105
  JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
2✔
1106
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1107
  JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
4✔
1108

1109
  // int64 max
1110
  val = Json::Value(Json::Int64(kint64max));
2✔
1111

1112
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
1113

1114
  checks = IsCheck();
2✔
1115
  checks.isInt64_ = true;
2✔
1116
  checks.isUInt64_ = true;
2✔
1117
  checks.isIntegral_ = true;
2✔
1118
  checks.isDouble_ = true;
2✔
1119
  checks.isNumeric_ = true;
2✔
1120
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1121

1122
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1123
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1124
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1125

1126
  JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
2✔
1127
  JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
2✔
1128
  JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
2✔
1129
  JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
2✔
1130
  JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
2✔
1131
  JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
2✔
1132
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1133
  JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
6✔
1134

1135
  // int64 max (floating point constructor). Note that kint64max is not exactly
1136
  // representable as a double, and will be rounded up to be higher.
1137
  val = Json::Value(double(kint64max));
2✔
1138

1139
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1140

1141
  checks = IsCheck();
2✔
1142
  checks.isUInt64_ = true;
2✔
1143
  checks.isIntegral_ = true;
2✔
1144
  checks.isDouble_ = true;
2✔
1145
  checks.isNumeric_ = true;
2✔
1146
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1147

1148
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1149
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1150
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1151

1152
  JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
2✔
1153
  JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
2✔
1154
  JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
2✔
1155
  JSONTEST_ASSERT_EQUAL(float(Json::UInt64(1) << 63), val.asFloat());
2✔
1156

1157
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1158
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1159
      "9.2233720368547758e+18",
1160
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1161

1162
  // int64 min
1163
  val = Json::Value(Json::Int64(kint64min));
2✔
1164

1165
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
1166

1167
  checks = IsCheck();
2✔
1168
  checks.isInt64_ = true;
2✔
1169
  checks.isIntegral_ = true;
2✔
1170
  checks.isDouble_ = true;
2✔
1171
  checks.isNumeric_ = true;
2✔
1172
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1173

1174
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1175
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1176
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1177

1178
  JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
2✔
1179
  JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
2✔
1180
  JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
2✔
1181
  JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
2✔
1182
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1183
  JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
6✔
1184

1185
  // int64 min (floating point constructor). Note that kint64min *is* exactly
1186
  // representable as a double.
1187
  val = Json::Value(double(kint64min));
2✔
1188

1189
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1190

1191
  checks = IsCheck();
2✔
1192
  checks.isInt64_ = true;
2✔
1193
  checks.isIntegral_ = true;
2✔
1194
  checks.isDouble_ = true;
2✔
1195
  checks.isNumeric_ = true;
2✔
1196
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1197

1198
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1199
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1200
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1201

1202
  JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
2✔
1203
  JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
2✔
1204
  JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
2✔
1205
  JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
2✔
1206
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1207
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1208
      "-9.2233720368547758e+18",
1209
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1210

1211
  // 10^19
1212
  const auto ten_to_19 = static_cast<Json::UInt64>(1e19);
1213
  val = Json::Value(Json::UInt64(ten_to_19));
2✔
1214

1215
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
1216

1217
  checks = IsCheck();
2✔
1218
  checks.isUInt64_ = true;
2✔
1219
  checks.isIntegral_ = true;
2✔
1220
  checks.isDouble_ = true;
2✔
1221
  checks.isNumeric_ = true;
2✔
1222
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1223

1224
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1225
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1226
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1227

1228
  JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
2✔
1229
  JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
2✔
1230
  JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
2✔
1231
  JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
2✔
1232
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1233
  JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
6✔
1234

1235
  // 10^19 (double constructor). Note that 10^19 is not exactly representable
1236
  // as a double.
1237
  val = Json::Value(uint64ToDouble(ten_to_19));
2✔
1238

1239
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1240

1241
  checks = IsCheck();
2✔
1242
  checks.isUInt64_ = true;
2✔
1243
  checks.isIntegral_ = true;
2✔
1244
  checks.isDouble_ = true;
2✔
1245
  checks.isNumeric_ = true;
2✔
1246
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1247

1248
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1249
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1250
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1251

1252
  JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
2✔
1253
  JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
2✔
1254
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1255
  JSONTEST_ASSERT_STRING_EQUAL(
6✔
1256
      "1e+19",
1257
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1258

1259
  // uint64 max
1260
  val = Json::Value(Json::UInt64(kuint64max));
2✔
1261

1262
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
1263

1264
  checks = IsCheck();
2✔
1265
  checks.isUInt64_ = true;
2✔
1266
  checks.isIntegral_ = true;
2✔
1267
  checks.isDouble_ = true;
2✔
1268
  checks.isNumeric_ = true;
2✔
1269
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1270

1271
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1272
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1273
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1274

1275
  JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
2✔
1276
  JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
2✔
1277
  JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
2✔
1278
  JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
2✔
1279
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1280
  JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
6✔
1281

1282
  // uint64 max (floating point constructor). Note that kuint64max is not
1283
  // exactly representable as a double, and will be rounded up to be higher.
1284
  val = Json::Value(uint64ToDouble(kuint64max));
2✔
1285

1286
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1287

1288
  checks = IsCheck();
2✔
1289
  checks.isDouble_ = true;
2✔
1290
  checks.isNumeric_ = true;
2✔
1291
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1292

1293
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1294
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1295
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1296

1297
  JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
2✔
1298
  JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
2✔
1299
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1300
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1301
      "1.8446744073709552e+19",
1302
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1303
#endif
1304
}
2✔
1305

1306
JSONTEST_FIXTURE_LOCAL(ValueTest, nonIntegers) {
10✔
1307
  IsCheck checks;
1308
  Json::Value val;
2✔
1309

1310
  // Small positive number
1311
  val = Json::Value(1.5);
2✔
1312

1313
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1314

1315
  checks = IsCheck();
2✔
1316
  checks.isDouble_ = true;
2✔
1317
  checks.isNumeric_ = true;
2✔
1318
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1319

1320
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
1321
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
1322
  JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
2✔
1323
  JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
2✔
1324
  JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
2✔
1325
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1326
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
2✔
1327
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
2✔
1328

1329
  JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
2✔
1330
  JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
2✔
1331
  JSONTEST_ASSERT_EQUAL(1, val.asInt());
2✔
1332
  JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
2✔
1333
  JSONTEST_ASSERT_EQUAL(1, val.asUInt());
2✔
1334
  JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
2✔
1335
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1336
  JSONTEST_ASSERT_EQUAL("1.5", val.asString());
2✔
1337

1338
  // Small negative number
1339
  val = Json::Value(-1.5);
2✔
1340

1341
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1342

1343
  checks = IsCheck();
2✔
1344
  checks.isDouble_ = true;
2✔
1345
  checks.isNumeric_ = true;
2✔
1346
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1347

1348
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
1349
  JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
2✔
1350
  JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
2✔
1351
  JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
2✔
1352
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1353
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1354
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
2✔
1355
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
2✔
1356

1357
  JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
2✔
1358
  JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
2✔
1359
  JSONTEST_ASSERT_EQUAL(-1, val.asInt());
2✔
1360
  JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
2✔
1361
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1362
  JSONTEST_ASSERT_EQUAL("-1.5", val.asString());
2✔
1363

1364
  // A bit over int32 max
1365
  val = Json::Value(kint32max + 0.5);
2✔
1366

1367
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1368

1369
  checks = IsCheck();
2✔
1370
  checks.isDouble_ = true;
2✔
1371
  checks.isNumeric_ = true;
2✔
1372
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1373

1374
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
1375
  JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
2✔
1376
  JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
2✔
1377
  JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
2✔
1378
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1379
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1380
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
2✔
1381
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
2✔
1382

1383
  JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
2✔
1384
  JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
2✔
1385
  JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
2✔
1386
#ifdef JSON_HAS_INT64
1387
  JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
2✔
1388
  JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
2✔
1389
#endif
1390
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1391
  JSONTEST_ASSERT_EQUAL(
6✔
1392
      "2147483647.5",
1393
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1394

1395
  // A bit under int32 min
1396
  val = Json::Value(kint32min - 0.5);
2✔
1397

1398
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1399

1400
  checks = IsCheck();
2✔
1401
  checks.isDouble_ = true;
2✔
1402
  checks.isNumeric_ = true;
2✔
1403
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1404

1405
  JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
2✔
1406
  JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
2✔
1407
  JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
2✔
1408
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1409
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1410
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1411
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
2✔
1412
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
2✔
1413

1414
  JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
2✔
1415
  JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
2✔
1416
#ifdef JSON_HAS_INT64
1417
  JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 31), val.asLargestInt());
2✔
1418
#endif
1419
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1420
  JSONTEST_ASSERT_EQUAL(
6✔
1421
      "-2147483648.5",
1422
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1423

1424
  // A bit over uint32 max
1425
  val = Json::Value(kuint32max + 0.5);
2✔
1426

1427
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1428

1429
  checks = IsCheck();
2✔
1430
  checks.isDouble_ = true;
2✔
1431
  checks.isNumeric_ = true;
2✔
1432
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1433

1434
  JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
2✔
1435
  JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
2✔
1436
  JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
2✔
1437
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1438
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1439
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1440
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
2✔
1441
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
2✔
1442

1443
  JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
2✔
1444
  JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
2✔
1445
#ifdef JSON_HAS_INT64
1446
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32) - 1, val.asLargestInt());
2✔
1447
  JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32) - Json::UInt64(1),
2✔
1448
                        val.asLargestUInt());
1449
#endif
1450
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1451
  JSONTEST_ASSERT_EQUAL(
6✔
1452
      "4294967295.5",
1453
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1454

1455
  val = Json::Value(1.2345678901234);
2✔
1456
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1457
      "1.2345678901234001",
1458
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1459

1460
  // A 16-digit floating point number.
1461
  val = Json::Value(2199023255552000.0f);
2✔
1462
  JSONTEST_ASSERT_EQUAL(float(2199023255552000.0f), val.asFloat());
2✔
1463
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1464
      "2199023255552000.0",
1465
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1466

1467
  // A very large floating point number.
1468
  val = Json::Value(3.402823466385289e38);
2✔
1469
  JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
2✔
1470
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1471
      "3.402823466385289e+38",
1472
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1473

1474
  // An even larger floating point number.
1475
  val = Json::Value(1.2345678e300);
2✔
1476
  JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
2✔
1477
  JSONTEST_ASSERT_STRING_EQUAL(
6✔
1478
      "1.2345678e+300",
1479
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1480
}
2✔
1481

1482
void ValueTest::checkConstMemberCount(const Json::Value& value,
15✔
1483
                                      unsigned int expectedCount) {
1484
  unsigned int count = 0;
1485
  Json::Value::const_iterator itEnd = value.end();
15✔
1486
  for (Json::Value::const_iterator it = value.begin(); it != itEnd; ++it) {
32✔
1487
    ++count;
2✔
1488
  }
1489
  JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::const_iterator";
15✔
1490
}
15✔
1491

1492
void ValueTest::checkMemberCount(Json::Value& value,
15✔
1493
                                 unsigned int expectedCount) {
1494
  JSONTEST_ASSERT_EQUAL(expectedCount, value.size());
15✔
1495

1496
  unsigned int count = 0;
1497
  Json::Value::iterator itEnd = value.end();
15✔
1498
  for (Json::Value::iterator it = value.begin(); it != itEnd; ++it) {
32✔
1499
    ++count;
2✔
1500
  }
1501
  JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::iterator";
15✔
1502

1503
  JSONTEST_ASSERT_PRED(checkConstMemberCount(value, expectedCount));
15✔
1504
}
15✔
1505

1506
ValueTest::IsCheck::IsCheck() = default;
7✔
1507

1508
void ValueTest::checkIs(const Json::Value& value, const IsCheck& check) {
40✔
1509
  JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject());
40✔
1510
  JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray());
40✔
1511
  JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool());
40✔
1512
  JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble());
40✔
1513
  JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt());
40✔
1514
  JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt());
40✔
1515
  JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral());
40✔
1516
  JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric());
40✔
1517
  JSONTEST_ASSERT_EQUAL(check.isString_, value.isString());
40✔
1518
  JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull());
40✔
1519

1520
#ifdef JSON_HAS_INT64
1521
  JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64());
40✔
1522
  JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64());
40✔
1523
#else
1524
  JSONTEST_ASSERT_EQUAL(false, value.isInt64());
1525
  JSONTEST_ASSERT_EQUAL(false, value.isUInt64());
1526
#endif
1527
}
40✔
1528

1529
JSONTEST_FIXTURE_LOCAL(ValueTest, compareNull) {
10✔
1530
  JSONTEST_ASSERT_PRED(checkIsEqual(Json::Value(), Json::Value()));
2✔
1531
  JSONTEST_ASSERT_PRED(
2✔
1532
      checkIsEqual(Json::Value::nullSingleton(), Json::Value()));
1533
  JSONTEST_ASSERT_PRED(
2✔
1534
      checkIsEqual(Json::Value::nullSingleton(), Json::Value::nullSingleton()));
1535
}
2✔
1536

1537
JSONTEST_FIXTURE_LOCAL(ValueTest, compareInt) {
10✔
1538
  JSONTEST_ASSERT_PRED(checkIsLess(0, 10));
2✔
1539
  JSONTEST_ASSERT_PRED(checkIsEqual(10, 10));
2✔
1540
  JSONTEST_ASSERT_PRED(checkIsEqual(-10, -10));
2✔
1541
  JSONTEST_ASSERT_PRED(checkIsLess(-10, 0));
2✔
1542
}
2✔
1543

1544
JSONTEST_FIXTURE_LOCAL(ValueTest, compareUInt) {
10✔
1545
  JSONTEST_ASSERT_PRED(checkIsLess(0u, 10u));
2✔
1546
  JSONTEST_ASSERT_PRED(checkIsLess(0u, Json::Value::maxUInt));
2✔
1547
  JSONTEST_ASSERT_PRED(checkIsEqual(10u, 10u));
2✔
1548
}
2✔
1549

1550
JSONTEST_FIXTURE_LOCAL(ValueTest, compareDouble) {
10✔
1551
  JSONTEST_ASSERT_PRED(checkIsLess(0.0, 10.0));
2✔
1552
  JSONTEST_ASSERT_PRED(checkIsEqual(10.0, 10.0));
2✔
1553
  JSONTEST_ASSERT_PRED(checkIsEqual(-10.0, -10.0));
2✔
1554
  JSONTEST_ASSERT_PRED(checkIsLess(-10.0, 0.0));
2✔
1555
}
2✔
1556

1557
JSONTEST_FIXTURE_LOCAL(ValueTest, compareString) {
10✔
1558
  JSONTEST_ASSERT_PRED(checkIsLess("", " "));
2✔
1559
  JSONTEST_ASSERT_PRED(checkIsLess("", "a"));
2✔
1560
  JSONTEST_ASSERT_PRED(checkIsLess("abcd", "zyui"));
2✔
1561
  JSONTEST_ASSERT_PRED(checkIsLess("abc", "abcd"));
2✔
1562
  JSONTEST_ASSERT_PRED(checkIsEqual("abcd", "abcd"));
2✔
1563
  JSONTEST_ASSERT_PRED(checkIsEqual(" ", " "));
2✔
1564
  JSONTEST_ASSERT_PRED(checkIsLess("ABCD", "abcd"));
2✔
1565
  JSONTEST_ASSERT_PRED(checkIsEqual("ABCD", "ABCD"));
2✔
1566
}
2✔
1567

1568
JSONTEST_FIXTURE_LOCAL(ValueTest, compareBoolean) {
10✔
1569
  JSONTEST_ASSERT_PRED(checkIsLess(false, true));
2✔
1570
  JSONTEST_ASSERT_PRED(checkIsEqual(false, false));
2✔
1571
  JSONTEST_ASSERT_PRED(checkIsEqual(true, true));
2✔
1572
}
2✔
1573

1574
JSONTEST_FIXTURE_LOCAL(ValueTest, compareArray) {
10✔
1575
  // array compare size then content
1576
  Json::Value emptyArray(Json::arrayValue);
2✔
1577
  Json::Value l1aArray;
2✔
1578
  l1aArray.append(0);
2✔
1579
  Json::Value l1bArray;
2✔
1580
  l1bArray.append(10);
2✔
1581
  Json::Value l2aArray;
2✔
1582
  l2aArray.append(0);
2✔
1583
  l2aArray.append(0);
2✔
1584
  Json::Value l2bArray;
2✔
1585
  l2bArray.append(0);
2✔
1586
  l2bArray.append(10);
2✔
1587
  JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l1aArray));
2✔
1588
  JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l2aArray));
2✔
1589
  JSONTEST_ASSERT_PRED(checkIsLess(l1aArray, l1bArray));
2✔
1590
  JSONTEST_ASSERT_PRED(checkIsLess(l1bArray, l2aArray));
2✔
1591
  JSONTEST_ASSERT_PRED(checkIsLess(l2aArray, l2bArray));
2✔
1592
  JSONTEST_ASSERT_PRED(checkIsEqual(emptyArray, Json::Value(emptyArray)));
2✔
1593
  JSONTEST_ASSERT_PRED(checkIsEqual(l1aArray, Json::Value(l1aArray)));
2✔
1594
  JSONTEST_ASSERT_PRED(checkIsEqual(l1bArray, Json::Value(l1bArray)));
2✔
1595
  JSONTEST_ASSERT_PRED(checkIsEqual(l2aArray, Json::Value(l2aArray)));
2✔
1596
  JSONTEST_ASSERT_PRED(checkIsEqual(l2bArray, Json::Value(l2bArray)));
2✔
1597
}
2✔
1598

1599
JSONTEST_FIXTURE_LOCAL(ValueTest, compareObject) {
10✔
1600
  // object compare size then content
1601
  Json::Value emptyObject(Json::objectValue);
2✔
1602
  Json::Value l1aObject;
2✔
1603
  l1aObject["key1"] = 0;
2✔
1604
  Json::Value l1bObject;
2✔
1605
  l1bObject["key1"] = 10;
2✔
1606
  Json::Value l2aObject;
2✔
1607
  l2aObject["key1"] = 0;
2✔
1608
  l2aObject["key2"] = 0;
2✔
1609
  Json::Value l2bObject;
2✔
1610
  l2bObject["key1"] = 10;
2✔
1611
  l2bObject["key2"] = 0;
2✔
1612
  JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l1aObject));
2✔
1613
  JSONTEST_ASSERT_PRED(checkIsLess(l1aObject, l1bObject));
2✔
1614
  JSONTEST_ASSERT_PRED(checkIsLess(l1bObject, l2aObject));
2✔
1615
  JSONTEST_ASSERT_PRED(checkIsLess(l2aObject, l2bObject));
2✔
1616
  JSONTEST_ASSERT_PRED(checkIsEqual(emptyObject, Json::Value(emptyObject)));
2✔
1617
  JSONTEST_ASSERT_PRED(checkIsEqual(l1aObject, Json::Value(l1aObject)));
2✔
1618
  JSONTEST_ASSERT_PRED(checkIsEqual(l1bObject, Json::Value(l1bObject)));
2✔
1619
  JSONTEST_ASSERT_PRED(checkIsEqual(l2aObject, Json::Value(l2aObject)));
2✔
1620
  JSONTEST_ASSERT_PRED(checkIsEqual(l2bObject, Json::Value(l2bObject)));
2✔
1621
  {
1622
    Json::Value aObject;
2✔
1623
    aObject["a"] = 10;
2✔
1624
    Json::Value bObject;
2✔
1625
    bObject["b"] = 0;
2✔
1626
    Json::Value cObject;
2✔
1627
    cObject["c"] = 20;
2✔
1628
    cObject["f"] = 15;
2✔
1629
    Json::Value dObject;
2✔
1630
    dObject["d"] = -2;
2✔
1631
    dObject["e"] = 10;
2✔
1632
    JSONTEST_ASSERT_PRED(checkIsLess(aObject, bObject));
2✔
1633
    JSONTEST_ASSERT_PRED(checkIsLess(bObject, cObject));
2✔
1634
    JSONTEST_ASSERT_PRED(checkIsLess(cObject, dObject));
2✔
1635
    JSONTEST_ASSERT_PRED(checkIsEqual(aObject, Json::Value(aObject)));
2✔
1636
    JSONTEST_ASSERT_PRED(checkIsEqual(bObject, Json::Value(bObject)));
2✔
1637
    JSONTEST_ASSERT_PRED(checkIsEqual(cObject, Json::Value(cObject)));
2✔
1638
    JSONTEST_ASSERT_PRED(checkIsEqual(dObject, Json::Value(dObject)));
2✔
1639
  }
2✔
1640
}
2✔
1641

1642
JSONTEST_FIXTURE_LOCAL(ValueTest, compareType) {
10✔
1643
  // object of different type are ordered according to their type
1644
  JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(), Json::Value(1)));
2✔
1645
  JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1), Json::Value(1u)));
2✔
1646
  JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1u), Json::Value(1.0)));
2✔
1647
  JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1.0), Json::Value("a")));
2✔
1648
  JSONTEST_ASSERT_PRED(checkIsLess(Json::Value("a"), Json::Value(true)));
2✔
1649
  JSONTEST_ASSERT_PRED(
2✔
1650
      checkIsLess(Json::Value(true), Json::Value(Json::arrayValue)));
1651
  JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(Json::arrayValue),
2✔
1652
                                   Json::Value(Json::objectValue)));
1653
}
2✔
1654

1655
JSONTEST_FIXTURE_LOCAL(ValueTest, CopyObject) {
10✔
1656
  Json::Value arrayVal;
2✔
1657
  arrayVal.append("val1");
2✔
1658
  arrayVal.append("val2");
2✔
1659
  arrayVal.append("val3");
2✔
1660
  Json::Value stringVal("string value");
2✔
1661
  Json::Value copy1, copy2;
2✔
1662
  {
1663
    Json::Value arrayCopy, stringCopy;
2✔
1664
    arrayCopy.copy(arrayVal);
2✔
1665
    stringCopy.copy(stringVal);
2✔
1666
    JSONTEST_ASSERT_PRED(checkIsEqual(arrayCopy, arrayVal));
2✔
1667
    JSONTEST_ASSERT_PRED(checkIsEqual(stringCopy, stringVal));
2✔
1668
    arrayCopy.append("val4");
2✔
1669
    JSONTEST_ASSERT(arrayCopy.size() == 4);
2✔
1670
    arrayVal.append("new4");
2✔
1671
    arrayVal.append("new5");
2✔
1672
    JSONTEST_ASSERT(arrayVal.size() == 5);
2✔
1673
    JSONTEST_ASSERT(!(arrayCopy == arrayVal));
2✔
1674
    stringCopy = "another string";
2✔
1675
    JSONTEST_ASSERT(!(stringCopy == stringVal));
2✔
1676
    copy1.copy(arrayCopy);
2✔
1677
    copy2.copy(stringCopy);
2✔
1678
  }
2✔
1679
  JSONTEST_ASSERT(arrayVal.size() == 5);
2✔
1680
  JSONTEST_ASSERT(stringVal == "string value");
2✔
1681
  JSONTEST_ASSERT(copy1.size() == 4);
2✔
1682
  JSONTEST_ASSERT(copy2 == "another string");
2✔
1683
  copy1.copy(stringVal);
2✔
1684
  JSONTEST_ASSERT(copy1 == "string value");
2✔
1685
  copy2.copy(arrayVal);
2✔
1686
  JSONTEST_ASSERT(copy2.size() == 5);
2✔
1687
  {
1688
    Json::Value srcObject, objectCopy, otherObject;
2✔
1689
    srcObject["key0"] = 10;
2✔
1690
    objectCopy.copy(srcObject);
2✔
1691
    JSONTEST_ASSERT(srcObject["key0"] == 10);
2✔
1692
    JSONTEST_ASSERT(objectCopy["key0"] == 10);
2✔
1693
    JSONTEST_ASSERT(srcObject.getMemberNames().size() == 1);
2✔
1694
    JSONTEST_ASSERT(objectCopy.getMemberNames().size() == 1);
2✔
1695
    otherObject["key1"] = 15;
2✔
1696
    otherObject["key2"] = 16;
2✔
1697
    JSONTEST_ASSERT(otherObject.getMemberNames().size() == 2);
2✔
1698
    objectCopy.copy(otherObject);
2✔
1699
    JSONTEST_ASSERT(objectCopy["key1"] == 15);
2✔
1700
    JSONTEST_ASSERT(objectCopy["key2"] == 16);
2✔
1701
    JSONTEST_ASSERT(objectCopy.getMemberNames().size() == 2);
2✔
1702
    otherObject["key1"] = 20;
2✔
1703
    JSONTEST_ASSERT(objectCopy["key1"] == 15);
2✔
1704
  }
2✔
1705
}
2✔
1706

1707
void ValueTest::checkIsLess(const Json::Value& x, const Json::Value& y) {
31✔
1708
  JSONTEST_ASSERT(x < y);
31✔
1709
  JSONTEST_ASSERT(y > x);
31✔
1710
  JSONTEST_ASSERT(x <= y);
31✔
1711
  JSONTEST_ASSERT(y >= x);
31✔
1712
  JSONTEST_ASSERT(!(x == y));
31✔
1713
  JSONTEST_ASSERT(!(y == x));
31✔
1714
  JSONTEST_ASSERT(!(x >= y));
31✔
1715
  JSONTEST_ASSERT(!(y <= x));
31✔
1716
  JSONTEST_ASSERT(!(x > y));
31✔
1717
  JSONTEST_ASSERT(!(y < x));
31✔
1718
  JSONTEST_ASSERT(x.compare(y) < 0);
31✔
1719
  JSONTEST_ASSERT(y.compare(x) >= 0);
31✔
1720
}
31✔
1721

1722
void ValueTest::checkIsEqual(const Json::Value& x, const Json::Value& y) {
29✔
1723
  JSONTEST_ASSERT(x == y);
29✔
1724
  JSONTEST_ASSERT(y == x);
29✔
1725
  JSONTEST_ASSERT(x <= y);
29✔
1726
  JSONTEST_ASSERT(y <= x);
29✔
1727
  JSONTEST_ASSERT(x >= y);
29✔
1728
  JSONTEST_ASSERT(y >= x);
29✔
1729
  JSONTEST_ASSERT(!(x < y));
29✔
1730
  JSONTEST_ASSERT(!(y < x));
29✔
1731
  JSONTEST_ASSERT(!(x > y));
29✔
1732
  JSONTEST_ASSERT(!(y > x));
29✔
1733
  JSONTEST_ASSERT(x.compare(y) == 0);
29✔
1734
  JSONTEST_ASSERT(y.compare(x) == 0);
29✔
1735
}
29✔
1736

1737
JSONTEST_FIXTURE_LOCAL(ValueTest, typeChecksThrowExceptions) {
10✔
1738
#if JSON_USE_EXCEPTION
1739

1740
  Json::Value intVal(1);
2✔
1741
  Json::Value strVal("Test");
2✔
1742
  Json::Value objVal(Json::objectValue);
2✔
1743
  Json::Value arrVal(Json::arrayValue);
2✔
1744

1745
  JSONTEST_ASSERT_THROWS(intVal["test"]);
2✔
1746
  JSONTEST_ASSERT_THROWS(strVal["test"]);
2✔
1747
  JSONTEST_ASSERT_THROWS(arrVal["test"]);
2✔
1748

1749
  JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
2✔
1750
  JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
2✔
1751
  JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
2✔
1752

1753
  JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
2✔
1754
  JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
2✔
1755
  JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
2✔
1756

1757
  JSONTEST_ASSERT_THROWS(intVal[0]);
2✔
1758
  JSONTEST_ASSERT_THROWS(objVal[0]);
2✔
1759
  JSONTEST_ASSERT_THROWS(strVal[0]);
2✔
1760

1761
  JSONTEST_ASSERT_THROWS(intVal.clear());
2✔
1762

1763
  JSONTEST_ASSERT_THROWS(intVal.resize(1));
2✔
1764
  JSONTEST_ASSERT_THROWS(strVal.resize(1));
2✔
1765
  JSONTEST_ASSERT_THROWS(objVal.resize(1));
2✔
1766

1767
  JSONTEST_ASSERT_THROWS(intVal.asCString());
2✔
1768

1769
  JSONTEST_ASSERT_THROWS(objVal.asString());
2✔
1770
  JSONTEST_ASSERT_THROWS(arrVal.asString());
2✔
1771

1772
  JSONTEST_ASSERT_THROWS(strVal.asInt());
2✔
1773
  JSONTEST_ASSERT_THROWS(objVal.asInt());
2✔
1774
  JSONTEST_ASSERT_THROWS(arrVal.asInt());
2✔
1775

1776
  JSONTEST_ASSERT_THROWS(strVal.asUInt());
2✔
1777
  JSONTEST_ASSERT_THROWS(objVal.asUInt());
2✔
1778
  JSONTEST_ASSERT_THROWS(arrVal.asUInt());
2✔
1779

1780
  JSONTEST_ASSERT_THROWS(strVal.asInt64());
2✔
1781
  JSONTEST_ASSERT_THROWS(objVal.asInt64());
2✔
1782
  JSONTEST_ASSERT_THROWS(arrVal.asInt64());
2✔
1783

1784
  JSONTEST_ASSERT_THROWS(strVal.asUInt64());
2✔
1785
  JSONTEST_ASSERT_THROWS(objVal.asUInt64());
2✔
1786
  JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
2✔
1787

1788
  JSONTEST_ASSERT_THROWS(strVal.asDouble());
2✔
1789
  JSONTEST_ASSERT_THROWS(objVal.asDouble());
2✔
1790
  JSONTEST_ASSERT_THROWS(arrVal.asDouble());
2✔
1791

1792
  JSONTEST_ASSERT_THROWS(strVal.asFloat());
2✔
1793
  JSONTEST_ASSERT_THROWS(objVal.asFloat());
2✔
1794
  JSONTEST_ASSERT_THROWS(arrVal.asFloat());
2✔
1795

1796
  JSONTEST_ASSERT_THROWS(strVal.asBool());
2✔
1797
  JSONTEST_ASSERT_THROWS(objVal.asBool());
2✔
1798
  JSONTEST_ASSERT_THROWS(arrVal.asBool());
2✔
1799

1800
#endif
1801
}
2✔
1802

1803
JSONTEST_FIXTURE_LOCAL(ValueTest, offsetAccessors) {
10✔
1804
  Json::Value x;
2✔
1805
  JSONTEST_ASSERT(x.getOffsetStart() == 0);
2✔
1806
  JSONTEST_ASSERT(x.getOffsetLimit() == 0);
2✔
1807
  x.setOffsetStart(10);
2✔
1808
  x.setOffsetLimit(20);
2✔
1809
  JSONTEST_ASSERT(x.getOffsetStart() == 10);
2✔
1810
  JSONTEST_ASSERT(x.getOffsetLimit() == 20);
2✔
1811
  Json::Value y(x);
2✔
1812
  JSONTEST_ASSERT(y.getOffsetStart() == 10);
2✔
1813
  JSONTEST_ASSERT(y.getOffsetLimit() == 20);
2✔
1814
  Json::Value z;
2✔
1815
  z.swap(y);
2✔
1816
  JSONTEST_ASSERT(z.getOffsetStart() == 10);
2✔
1817
  JSONTEST_ASSERT(z.getOffsetLimit() == 20);
2✔
1818
  JSONTEST_ASSERT(y.getOffsetStart() == 0);
2✔
1819
  JSONTEST_ASSERT(y.getOffsetLimit() == 0);
2✔
1820
}
2✔
1821

1822
JSONTEST_FIXTURE_LOCAL(ValueTest, StaticString) {
10✔
1823
  char mutant[] = "hello";
2✔
1824
  Json::StaticString ss(mutant);
1825
  Json::String regular(mutant);
2✔
1826
  mutant[1] = 'a';
2✔
1827
  JSONTEST_ASSERT_STRING_EQUAL("hallo", ss.c_str());
4✔
1828
  JSONTEST_ASSERT_STRING_EQUAL("hello", regular.c_str());
4✔
1829
  {
1830
    Json::Value root;
2✔
1831
    root["top"] = ss;
2✔
1832
    JSONTEST_ASSERT_STRING_EQUAL("hallo", root["top"].asString());
4✔
1833
    mutant[1] = 'u';
2✔
1834
    JSONTEST_ASSERT_STRING_EQUAL("hullo", root["top"].asString());
4✔
1835
  }
2✔
1836
  {
1837
    Json::Value root;
2✔
1838
    root["top"] = regular;
2✔
1839
    JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
4✔
1840
    mutant[1] = 'u';
2✔
1841
    JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
4✔
1842
  }
2✔
1843
}
2✔
1844

1845
JSONTEST_FIXTURE_LOCAL(ValueTest, WideString) {
10✔
1846
  // https://github.com/open-source-parsers/jsoncpp/issues/756
1847
  const std::string uni = u8"\u5f0f\uff0c\u8fdb"; // "式,进"
2✔
1848
  std::string styled;
1849
  {
1850
    Json::Value v;
2✔
1851
    v["abc"] = uni;
2✔
1852
    styled = v.toStyledString();
2✔
1853
  }
2✔
1854
  Json::Value root;
2✔
1855
  {
1856
    JSONCPP_STRING errs;
1857
    std::istringstream iss(styled);
2✔
1858
    bool ok = parseFromStream(Json::CharReaderBuilder(), iss, &root, &errs);
2✔
1859
    JSONTEST_ASSERT(ok);
2✔
1860
    if (!ok) {
2✔
1861
      std::cerr << "errs: " << errs << std::endl;
1862
    }
1863
  }
2✔
1864
  JSONTEST_ASSERT_STRING_EQUAL(root["abc"].asString(), uni);
4✔
1865
}
4✔
1866

1867
JSONTEST_FIXTURE_LOCAL(ValueTest, CommentBefore) {
10✔
1868
  Json::Value val; // fill val
2✔
1869
  val.setComment(Json::String("// this comment should appear before"),
2✔
1870
                 Json::commentBefore);
1871
  Json::StreamWriterBuilder wbuilder;
2✔
1872
  wbuilder.settings_["commentStyle"] = "All";
2✔
1873
  {
1874
    char const expected[] = "// this comment should appear before\nnull";
2✔
1875
    Json::String result = Json::writeString(wbuilder, val);
2✔
1876
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
1877
    Json::String res2 = val.toStyledString();
2✔
1878
    Json::String exp2 = "\n";
2✔
1879
    exp2 += expected;
1880
    exp2 += "\n";
1881
    JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
8✔
1882
  }
1883
  Json::Value other = "hello";
2✔
1884
  val.swapPayload(other);
2✔
1885
  {
1886
    char const expected[] = "// this comment should appear before\n\"hello\"";
2✔
1887
    Json::String result = Json::writeString(wbuilder, val);
2✔
1888
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
1889
    Json::String res2 = val.toStyledString();
2✔
1890
    Json::String exp2 = "\n";
2✔
1891
    exp2 += expected;
1892
    exp2 += "\n";
1893
    JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
8✔
1894
    JSONTEST_ASSERT_STRING_EQUAL("null\n", other.toStyledString());
4✔
1895
  }
1896
  val = "hello";
2✔
1897
  // val.setComment("// this comment should appear before",
1898
  // Json::CommentPlacement::commentBefore); Assignment over-writes comments.
1899
  {
1900
    char const expected[] = "\"hello\"";
2✔
1901
    Json::String result = Json::writeString(wbuilder, val);
2✔
1902
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
4✔
1903
    Json::String res2 = val.toStyledString();
2✔
1904
    Json::String exp2;
1905
    exp2 += expected;
1906
    exp2 += "\n";
1907
    JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
6✔
1908
  }
1909
}
2✔
1910

1911
JSONTEST_FIXTURE_LOCAL(ValueTest, zeroes) {
10✔
1912
  char const cstr[] = "h\0i";
2✔
1913
  Json::String binary(cstr, sizeof(cstr)); // include trailing 0
1914
  JSONTEST_ASSERT_EQUAL(4U, binary.length());
2✔
1915
  Json::StreamWriterBuilder b;
2✔
1916
  {
1917
    Json::Value root;
2✔
1918
    root = binary;
2✔
1919
    JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
6✔
1920
  }
2✔
1921
  {
1922
    char const top[] = "top";
2✔
1923
    Json::Value root;
2✔
1924
    root[top] = binary;
2✔
1925
    JSONTEST_ASSERT_STRING_EQUAL(binary, root[top].asString());
6✔
1926
    Json::Value removed;
2✔
1927
    bool did;
1928
    did = root.removeMember(top, top + sizeof(top) - 1U, &removed);
2✔
1929
    JSONTEST_ASSERT(did);
2✔
1930
    JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString());
6✔
1931
    did = root.removeMember(top, top + sizeof(top) - 1U, &removed);
2✔
1932
    JSONTEST_ASSERT(!did);
2✔
1933
    JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString()); // still
6✔
1934
  }
2✔
1935
}
4✔
1936

1937
JSONTEST_FIXTURE_LOCAL(ValueTest, zeroesInKeys) {
10✔
1938
  char const cstr[] = "h\0i";
2✔
1939
  Json::String binary(cstr, sizeof(cstr)); // include trailing 0
1940
  JSONTEST_ASSERT_EQUAL(4U, binary.length());
2✔
1941
  {
1942
    Json::Value root;
2✔
1943
    root[binary] = "there";
2✔
1944
    JSONTEST_ASSERT_STRING_EQUAL("there", root[binary].asString());
4✔
1945
    JSONTEST_ASSERT(!root.isMember("h"));
2✔
1946
    JSONTEST_ASSERT(root.isMember(binary));
2✔
1947
    JSONTEST_ASSERT_STRING_EQUAL(
4✔
1948
        "there", root.get(binary, Json::Value::nullSingleton()).asString());
1949
    Json::Value removed;
2✔
1950
    bool did;
1951
    did = root.removeMember(binary.data(), binary.data() + binary.length(),
2✔
1952
                            &removed);
1953
    JSONTEST_ASSERT(did);
2✔
1954
    JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString());
4✔
1955
    did = root.removeMember(binary.data(), binary.data() + binary.length(),
2✔
1956
                            &removed);
1957
    JSONTEST_ASSERT(!did);
2✔
1958
    JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString()); // still
4✔
1959
    JSONTEST_ASSERT(!root.isMember(binary));
2✔
1960
    JSONTEST_ASSERT_STRING_EQUAL(
4✔
1961
        "", root.get(binary, Json::Value::nullSingleton()).asString());
1962
  }
2✔
1963
}
2✔
1964

1965
JSONTEST_FIXTURE_LOCAL(ValueTest, specialFloats) {
10✔
1966
  Json::StreamWriterBuilder b;
2✔
1967
  b.settings_["useSpecialFloats"] = true;
2✔
1968

1969
  Json::Value v = std::numeric_limits<double>::quiet_NaN();
2✔
1970
  Json::String expected = "NaN";
2✔
1971
  Json::String result = Json::writeString(b, v);
2✔
1972
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
1973

1974
  v = std::numeric_limits<double>::infinity();
2✔
1975
  expected = "Infinity";
1976
  result = Json::writeString(b, v);
4✔
1977
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
1978

1979
  v = -std::numeric_limits<double>::infinity();
2✔
1980
  expected = "-Infinity";
1981
  result = Json::writeString(b, v);
4✔
1982
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
1983
}
2✔
1984

1985
JSONTEST_FIXTURE_LOCAL(ValueTest, precision) {
10✔
1986
  Json::StreamWriterBuilder b;
2✔
1987
  b.settings_["precision"] = 5;
2✔
1988

1989
  Json::Value v = 100.0 / 3;
2✔
1990
  Json::String expected = "33.333";
2✔
1991
  Json::String result = Json::writeString(b, v);
2✔
1992
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
1993

1994
  v = 0.25000000;
2✔
1995
  expected = "0.25";
1996
  result = Json::writeString(b, v);
4✔
1997
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
1998

1999
  v = 0.2563456;
2✔
2000
  expected = "0.25635";
2001
  result = Json::writeString(b, v);
4✔
2002
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2003

2004
  b.settings_["precision"] = 1;
2✔
2005
  expected = "0.3";
2006
  result = Json::writeString(b, v);
4✔
2007
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2008

2009
  b.settings_["precision"] = 17;
2✔
2010
  v = 1234857476305.256345694873740545068;
2✔
2011
  expected = "1234857476305.2563";
2012
  result = Json::writeString(b, v);
4✔
2013
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2014

2015
  b.settings_["precision"] = 24;
2✔
2016
  v = 0.256345694873740545068;
2✔
2017
  expected = "0.25634569487374054";
2018
  result = Json::writeString(b, v);
4✔
2019
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2020

2021
  b.settings_["precision"] = 5;
2✔
2022
  b.settings_["precisionType"] = "decimal";
2✔
2023
  v = 0.256345694873740545068;
2✔
2024
  expected = "0.25635";
2025
  result = Json::writeString(b, v);
4✔
2026
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2027

2028
  b.settings_["precision"] = 1;
2✔
2029
  b.settings_["precisionType"] = "decimal";
2✔
2030
  v = 0.256345694873740545068;
2✔
2031
  expected = "0.3";
2032
  result = Json::writeString(b, v);
4✔
2033
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2034

2035
  b.settings_["precision"] = 0;
2✔
2036
  b.settings_["precisionType"] = "decimal";
2✔
2037
  v = 123.56345694873740545068;
2✔
2038
  expected = "124";
2039
  result = Json::writeString(b, v);
4✔
2040
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2041

2042
  b.settings_["precision"] = 1;
2✔
2043
  b.settings_["precisionType"] = "decimal";
2✔
2044
  v = 1230.001;
2✔
2045
  expected = "1230.0";
2046
  result = Json::writeString(b, v);
4✔
2047
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2048

2049
  b.settings_["precision"] = 0;
2✔
2050
  b.settings_["precisionType"] = "decimal";
2✔
2051
  v = 1230.001;
2✔
2052
  expected = "1230";
2053
  result = Json::writeString(b, v);
4✔
2054
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2055

2056
  b.settings_["precision"] = 0;
2✔
2057
  b.settings_["precisionType"] = "decimal";
2✔
2058
  v = 1231.5;
2✔
2059
  expected = "1232";
2060
  result = Json::writeString(b, v);
4✔
2061
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2062

2063
  b.settings_["precision"] = 10;
2✔
2064
  b.settings_["precisionType"] = "decimal";
2✔
2065
  v = 0.23300000;
2✔
2066
  expected = "0.233";
2067
  result = Json::writeString(b, v);
4✔
2068
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2069
}
2✔
2070
JSONTEST_FIXTURE_LOCAL(ValueTest, searchValueByPath) {
10✔
2071
  Json::Value root, subroot;
2✔
2072
  root["property1"][0] = 0;
2✔
2073
  root["property1"][1] = 1;
2✔
2074
  subroot["object"] = "object";
2✔
2075
  root["property2"] = subroot;
2✔
2076

2077
  const Json::Value defaultValue("error");
2✔
2078
  Json::FastWriter writer;
2✔
2079

2080
  {
2081
    const Json::String expected("{"
2082
                                "\"property1\":[0,1],"
2083
                                "\"property2\":{\"object\":\"object\"}"
2084
                                "}\n");
2✔
2085
    Json::String outcome = writer.write(root);
2✔
2086
    JSONTEST_ASSERT_STRING_EQUAL(expected, outcome);
8✔
2087

2088
    // Array member exists.
2089
    const Json::Path path1(".property1.[%]", 1);
4✔
2090
    Json::Value result = path1.resolve(root);
2✔
2091
    JSONTEST_ASSERT_EQUAL(Json::Value(1), result);
2✔
2092
    result = path1.resolve(root, defaultValue);
2✔
2093
    JSONTEST_ASSERT_EQUAL(Json::Value(1), result);
2✔
2094

2095
    // Array member does not exist.
2096
    const Json::Path path2(".property1.[2]");
4✔
2097
    result = path2.resolve(root);
2✔
2098
    JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2✔
2099
    result = path2.resolve(root, defaultValue);
2✔
2100
    JSONTEST_ASSERT_EQUAL(defaultValue, result);
2✔
2101

2102
    // Access array path form error
2103
    const Json::Path path3(".property1.0");
4✔
2104
    result = path3.resolve(root);
2✔
2105
    JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2✔
2106
    result = path3.resolve(root, defaultValue);
2✔
2107
    JSONTEST_ASSERT_EQUAL(defaultValue, result);
2✔
2108

2109
    // Object member exists.
2110
    const Json::Path path4(".property2.%", "object");
4✔
2111
    result = path4.resolve(root);
2✔
2112
    JSONTEST_ASSERT_EQUAL(Json::Value("object"), result);
2✔
2113
    result = path4.resolve(root, defaultValue);
2✔
2114
    JSONTEST_ASSERT_EQUAL(Json::Value("object"), result);
2✔
2115

2116
    // Object member does not exist.
2117
    const Json::Path path5(".property2.hello");
4✔
2118
    result = path5.resolve(root);
2✔
2119
    JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2✔
2120
    result = path5.resolve(root, defaultValue);
2✔
2121
    JSONTEST_ASSERT_EQUAL(defaultValue, result);
2✔
2122

2123
    // Access object path form error
2124
    const Json::Path path6(".property2.[0]");
4✔
2125
    result = path5.resolve(root);
2✔
2126
    JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2✔
2127
    result = path6.resolve(root, defaultValue);
2✔
2128
    JSONTEST_ASSERT_EQUAL(defaultValue, result);
2✔
2129

2130
    // resolve will not change the value
2131
    outcome = writer.write(root);
4✔
2132
    JSONTEST_ASSERT_STRING_EQUAL(expected, outcome);
8✔
2133
  }
2✔
2134
  {
2135
    const Json::String expected("{"
2136
                                "\"property1\":[0,1,null],"
2137
                                "\"property2\":{"
2138
                                "\"hello\":null,"
2139
                                "\"object\":\"object\"}}\n");
2✔
2140
    Json::Path path1(".property1.[%]", 2);
4✔
2141
    Json::Value& value1 = path1.make(root);
2✔
2142
    JSONTEST_ASSERT_EQUAL(Json::nullValue, value1);
2✔
2143

2144
    Json::Path path2(".property2.%", "hello");
4✔
2145
    Json::Value& value2 = path2.make(root);
2✔
2146
    JSONTEST_ASSERT_EQUAL(Json::nullValue, value2);
2✔
2147

2148
    // make will change the value
2149
    const Json::String outcome = writer.write(root);
2✔
2150
    JSONTEST_ASSERT_STRING_EQUAL(expected, outcome);
8✔
2151
  }
2152
}
2✔
2153
struct FastWriterTest : JsonTest::TestCase {};
6✔
2154

2155
JSONTEST_FIXTURE_LOCAL(FastWriterTest, dropNullPlaceholders) {
12✔
2156
  Json::FastWriter writer;
2✔
2157
  Json::Value nullValue;
2✔
2158
  JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
4✔
2159

2160
  writer.dropNullPlaceholders();
2✔
2161
  JSONTEST_ASSERT(writer.write(nullValue) == "\n");
4✔
2162
}
2✔
2163

2164
JSONTEST_FIXTURE_LOCAL(FastWriterTest, enableYAMLCompatibility) {
12✔
2165
  Json::FastWriter writer;
2✔
2166
  Json::Value root;
2✔
2167
  root["hello"] = "world";
2✔
2168

2169
  JSONTEST_ASSERT(writer.write(root) == "{\"hello\":\"world\"}\n");
4✔
2170

2171
  writer.enableYAMLCompatibility();
2✔
2172
  JSONTEST_ASSERT(writer.write(root) == "{\"hello\": \"world\"}\n");
4✔
2173
}
2✔
2174

2175
JSONTEST_FIXTURE_LOCAL(FastWriterTest, omitEndingLineFeed) {
12✔
2176
  Json::FastWriter writer;
2✔
2177
  Json::Value nullValue;
2✔
2178

2179
  JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
4✔
2180

2181
  writer.omitEndingLineFeed();
2✔
2182
  JSONTEST_ASSERT(writer.write(nullValue) == "null");
4✔
2183
}
2✔
2184

2185
JSONTEST_FIXTURE_LOCAL(FastWriterTest, writeNumericValue) {
12✔
2186
  Json::FastWriter writer;
2✔
2187
  const Json::String expected("{"
2188
                              "\"emptyValue\":null,"
2189
                              "\"false\":false,"
2190
                              "\"null\":\"null\","
2191
                              "\"number\":-6200000000000000.0,"
2192
                              "\"real\":1.256,"
2193
                              "\"uintValue\":17"
2194
                              "}\n");
2✔
2195
  Json::Value root;
2✔
2196
  root["emptyValue"] = Json::nullValue;
2✔
2197
  root["false"] = false;
2✔
2198
  root["null"] = "null";
2✔
2199
  root["number"] = -6.2e+15;
2✔
2200
  root["real"] = 1.256;
2✔
2201
  root["uintValue"] = Json::Value(17U);
2✔
2202

2203
  const Json::String result = writer.write(root);
2✔
2204
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2205
}
4✔
2206

2207
JSONTEST_FIXTURE_LOCAL(FastWriterTest, writeArrays) {
12✔
2208
  Json::FastWriter writer;
2✔
2209
  const Json::String expected("{"
2210
                              "\"property1\":[\"value1\",\"value2\"],"
2211
                              "\"property2\":[]"
2212
                              "}\n");
2✔
2213
  Json::Value root;
2✔
2214
  root["property1"][0] = "value1";
2✔
2215
  root["property1"][1] = "value2";
2✔
2216
  root["property2"] = Json::arrayValue;
2✔
2217

2218
  const Json::String result = writer.write(root);
2✔
2219
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2220
}
4✔
2221

2222
JSONTEST_FIXTURE_LOCAL(FastWriterTest, writeNestedObjects) {
12✔
2223
  Json::FastWriter writer;
2✔
2224
  const Json::String expected("{"
2225
                              "\"object1\":{"
2226
                              "\"bool\":true,"
2227
                              "\"nested\":123"
2228
                              "},"
2229
                              "\"object2\":{}"
2230
                              "}\n");
2✔
2231
  Json::Value root, child;
2✔
2232
  child["nested"] = 123;
2✔
2233
  child["bool"] = true;
2✔
2234
  root["object1"] = child;
2✔
2235
  root["object2"] = Json::objectValue;
2✔
2236

2237
  const Json::String result = writer.write(root);
2✔
2238
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2239
}
4✔
2240

2241
struct StyledWriterTest : JsonTest::TestCase {};
5✔
2242

2243
JSONTEST_FIXTURE_LOCAL(StyledWriterTest, writeNumericValue) {
12✔
2244
  Json::StyledWriter writer;
2✔
2245
  const Json::String expected("{\n"
2246
                              "   \"emptyValue\" : null,\n"
2247
                              "   \"false\" : false,\n"
2248
                              "   \"null\" : \"null\",\n"
2249
                              "   \"number\" : -6200000000000000.0,\n"
2250
                              "   \"real\" : 1.256,\n"
2251
                              "   \"uintValue\" : 17\n"
2252
                              "}\n");
2✔
2253
  Json::Value root;
2✔
2254
  root["emptyValue"] = Json::nullValue;
2✔
2255
  root["false"] = false;
2✔
2256
  root["null"] = "null";
2✔
2257
  root["number"] = -6.2e+15;
2✔
2258
  root["real"] = 1.256;
2✔
2259
  root["uintValue"] = Json::Value(17U);
2✔
2260

2261
  const Json::String result = writer.write(root);
2✔
2262
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2263
}
4✔
2264

2265
JSONTEST_FIXTURE_LOCAL(StyledWriterTest, writeArrays) {
12✔
2266
  Json::StyledWriter writer;
2✔
2267
  const Json::String expected("{\n"
2268
                              "   \"property1\" : [ \"value1\", \"value2\" ],\n"
2269
                              "   \"property2\" : []\n"
2270
                              "}\n");
2✔
2271
  Json::Value root;
2✔
2272
  root["property1"][0] = "value1";
2✔
2273
  root["property1"][1] = "value2";
2✔
2274
  root["property2"] = Json::arrayValue;
2✔
2275

2276
  const Json::String result = writer.write(root);
2✔
2277
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2278
}
4✔
2279

2280
JSONTEST_FIXTURE_LOCAL(StyledWriterTest, writeNestedObjects) {
12✔
2281
  Json::StyledWriter writer;
2✔
2282
  const Json::String expected("{\n"
2283
                              "   \"object1\" : {\n"
2284
                              "      \"bool\" : true,\n"
2285
                              "      \"nested\" : 123\n"
2286
                              "   },\n"
2287
                              "   \"object2\" : {}\n"
2288
                              "}\n");
2✔
2289
  Json::Value root, child;
2✔
2290
  child["nested"] = 123;
2✔
2291
  child["bool"] = true;
2✔
2292
  root["object1"] = child;
2✔
2293
  root["object2"] = Json::objectValue;
2✔
2294

2295
  const Json::String result = writer.write(root);
2✔
2296
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2297
}
4✔
2298

2299
JSONTEST_FIXTURE_LOCAL(StyledWriterTest, multiLineArray) {
12✔
2300
  Json::StyledWriter writer;
2✔
2301
  {
2302
    // Array member has more than 20 print effect rendering lines
2303
    const Json::String expected("[\n   "
2304
                                "0,\n   1,\n   2,\n   "
2305
                                "3,\n   4,\n   5,\n   "
2306
                                "6,\n   7,\n   8,\n   "
2307
                                "9,\n   10,\n   11,\n   "
2308
                                "12,\n   13,\n   14,\n   "
2309
                                "15,\n   16,\n   17,\n   "
2310
                                "18,\n   19,\n   20\n]\n");
2✔
2311
    Json::Value root;
2✔
2312
    for (Json::ArrayIndex i = 0; i < 21; i++)
44✔
2313
      root[i] = i;
42✔
2314
    const Json::String result = writer.write(root);
2✔
2315
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2316
  }
2✔
2317
  {
2318
    // Array members do not exceed 21 print effects to render a single line
2319
    const Json::String expected("[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]\n");
2✔
2320
    Json::Value root;
2✔
2321
    for (Json::ArrayIndex i = 0; i < 10; i++)
22✔
2322
      root[i] = i;
20✔
2323
    const Json::String result = writer.write(root);
2✔
2324
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2325
  }
2✔
2326
}
2✔
2327

2328
JSONTEST_FIXTURE_LOCAL(StyledWriterTest, writeValueWithComment) {
12✔
2329
  Json::StyledWriter writer;
2✔
2330
  {
2331
    const Json::String expected("\n//commentBeforeValue\n\"hello\"\n");
2✔
2332
    Json::Value root = "hello";
2✔
2333
    root.setComment(Json::String("//commentBeforeValue"), Json::commentBefore);
2✔
2334
    const Json::String result = writer.write(root);
2✔
2335
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2336
  }
2✔
2337
  {
2338
    const Json::String expected("\"hello\" //commentAfterValueOnSameLine\n");
2✔
2339
    Json::Value root = "hello";
2✔
2340
    root.setComment(Json::String("//commentAfterValueOnSameLine"),
2✔
2341
                    Json::commentAfterOnSameLine);
2342
    const Json::String result = writer.write(root);
2✔
2343
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2344
  }
2✔
2345
  {
2346
    const Json::String expected("\"hello\"\n//commentAfter\n\n");
2✔
2347
    Json::Value root = "hello";
2✔
2348
    root.setComment(Json::String("//commentAfter"), Json::commentAfter);
2✔
2349
    const Json::String result = writer.write(root);
2✔
2350
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2351
  }
2✔
2352
}
2✔
2353

2354
struct StyledStreamWriterTest : JsonTest::TestCase {};
5✔
2355

2356
JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest, writeNumericValue) {
12✔
2357
  Json::StyledStreamWriter writer;
2✔
2358
  const Json::String expected("{\n"
2359
                              "\t\"emptyValue\" : null,\n"
2360
                              "\t\"false\" : false,\n"
2361
                              "\t\"null\" : \"null\",\n"
2362
                              "\t\"number\" : -6200000000000000.0,\n"
2363
                              "\t\"real\" : 1.256,\n"
2364
                              "\t\"uintValue\" : 17\n"
2365
                              "}\n");
2✔
2366

2367
  Json::Value root;
2✔
2368
  root["emptyValue"] = Json::nullValue;
2✔
2369
  root["false"] = false;
2✔
2370
  root["null"] = "null";
2✔
2371
  root["number"] = -6.2e+15; // big float number
2✔
2372
  root["real"] = 1.256;      // float number
2✔
2373
  root["uintValue"] = Json::Value(17U);
2✔
2374

2375
  Json::OStringStream sout;
2✔
2376
  writer.write(sout, root);
2✔
2377
  const Json::String result = sout.str();
2378
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2379
}
4✔
2380

2381
JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest, writeArrays) {
12✔
2382
  Json::StyledStreamWriter writer;
2✔
2383
  const Json::String expected("{\n"
2384
                              "\t\"property1\" : [ \"value1\", \"value2\" ],\n"
2385
                              "\t\"property2\" : []\n"
2386
                              "}\n");
2✔
2387
  Json::Value root;
2✔
2388
  root["property1"][0] = "value1";
2✔
2389
  root["property1"][1] = "value2";
2✔
2390
  root["property2"] = Json::arrayValue;
2✔
2391

2392
  Json::OStringStream sout;
2✔
2393
  writer.write(sout, root);
2✔
2394
  const Json::String result = sout.str();
2395
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2396
}
4✔
2397

2398
JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest, writeNestedObjects) {
12✔
2399
  Json::StyledStreamWriter writer;
2✔
2400
  const Json::String expected("{\n"
2401
                              "\t\"object1\" : \n"
2402
                              "\t"
2403
                              "{\n"
2404
                              "\t\t\"bool\" : true,\n"
2405
                              "\t\t\"nested\" : 123\n"
2406
                              "\t},\n"
2407
                              "\t\"object2\" : {}\n"
2408
                              "}\n");
2✔
2409
  Json::Value root, child;
2✔
2410
  child["nested"] = 123;
2✔
2411
  child["bool"] = true;
2✔
2412
  root["object1"] = child;
2✔
2413
  root["object2"] = Json::objectValue;
2✔
2414

2415
  Json::OStringStream sout;
2✔
2416
  writer.write(sout, root);
2✔
2417
  const Json::String result = sout.str();
2418
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2419
}
4✔
2420

2421
JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest, multiLineArray) {
12✔
2422
  {
2423
    // Array member has more than 20 print effect rendering lines
2424
    const Json::String expected("[\n\t0,"
2425
                                "\n\t1,"
2426
                                "\n\t2,"
2427
                                "\n\t3,"
2428
                                "\n\t4,"
2429
                                "\n\t5,"
2430
                                "\n\t6,"
2431
                                "\n\t7,"
2432
                                "\n\t8,"
2433
                                "\n\t9,"
2434
                                "\n\t10,"
2435
                                "\n\t11,"
2436
                                "\n\t12,"
2437
                                "\n\t13,"
2438
                                "\n\t14,"
2439
                                "\n\t15,"
2440
                                "\n\t16,"
2441
                                "\n\t17,"
2442
                                "\n\t18,"
2443
                                "\n\t19,"
2444
                                "\n\t20\n]\n");
2✔
2445
    Json::StyledStreamWriter writer;
2✔
2446
    Json::Value root;
2✔
2447
    for (Json::ArrayIndex i = 0; i < 21; i++)
44✔
2448
      root[i] = i;
42✔
2449
    Json::OStringStream sout;
2✔
2450
    writer.write(sout, root);
2✔
2451
    const Json::String result = sout.str();
2452
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2453
  }
2✔
2454
  {
2455
    Json::StyledStreamWriter writer;
2✔
2456
    // Array members do not exceed 21 print effects to render a single line
2457
    const Json::String expected("[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]\n");
2✔
2458
    Json::Value root;
2✔
2459
    for (Json::ArrayIndex i = 0; i < 10; i++)
22✔
2460
      root[i] = i;
20✔
2461
    Json::OStringStream sout;
2✔
2462
    writer.write(sout, root);
2✔
2463
    const Json::String result = sout.str();
2464
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2465
  }
4✔
2466
}
2✔
2467

2468
JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest, writeValueWithComment) {
12✔
2469
  Json::StyledStreamWriter writer("\t");
2✔
2470
  {
2471
    const Json::String expected("//commentBeforeValue\n\"hello\"\n");
2✔
2472
    Json::Value root = "hello";
2✔
2473
    Json::OStringStream sout;
2✔
2474
    root.setComment(Json::String("//commentBeforeValue"), Json::commentBefore);
2✔
2475
    writer.write(sout, root);
2✔
2476
    const Json::String result = sout.str();
2477
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2478
  }
2✔
2479
  {
2480
    const Json::String expected("\"hello\" //commentAfterValueOnSameLine\n");
2✔
2481
    Json::Value root = "hello";
2✔
2482
    Json::OStringStream sout;
2✔
2483
    root.setComment(Json::String("//commentAfterValueOnSameLine"),
2✔
2484
                    Json::commentAfterOnSameLine);
2485
    writer.write(sout, root);
2✔
2486
    const Json::String result = sout.str();
2487
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2488
  }
2✔
2489
  {
2490
    const Json::String expected("\"hello\"\n//commentAfter\n");
2✔
2491
    Json::Value root = "hello";
2✔
2492
    Json::OStringStream sout;
2✔
2493
    root.setComment(Json::String("//commentAfter"), Json::commentAfter);
2✔
2494
    writer.write(sout, root);
2✔
2495
    const Json::String result = sout.str();
2496
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2497
  }
2✔
2498
}
2✔
2499

2500
struct StreamWriterTest : JsonTest::TestCase {};
10✔
2501

2502
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, writeNumericValue) {
12✔
2503
  Json::StreamWriterBuilder writer;
2✔
2504
  const Json::String expected("{\n"
2505
                              "\t\"emptyValue\" : null,\n"
2506
                              "\t\"false\" : false,\n"
2507
                              "\t\"null\" : \"null\",\n"
2508
                              "\t\"number\" : -6200000000000000.0,\n"
2509
                              "\t\"real\" : 1.256,\n"
2510
                              "\t\"uintValue\" : 17\n"
2511
                              "}");
2✔
2512
  Json::Value root;
2✔
2513
  root["emptyValue"] = Json::nullValue;
2✔
2514
  root["false"] = false;
2✔
2515
  root["null"] = "null";
2✔
2516
  root["number"] = -6.2e+15;
2✔
2517
  root["real"] = 1.256;
2✔
2518
  root["uintValue"] = Json::Value(17U);
2✔
2519

2520
  const Json::String result = Json::writeString(writer, root);
2✔
2521
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2522
}
4✔
2523

2524
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, writeArrays) {
12✔
2525
  Json::StreamWriterBuilder writer;
2✔
2526
  const Json::String expected("{\n"
2527
                              "\t\"property1\" : \n"
2528
                              "\t[\n"
2529
                              "\t\t\"value1\",\n"
2530
                              "\t\t\"value2\"\n"
2531
                              "\t],\n"
2532
                              "\t\"property2\" : []\n"
2533
                              "}");
2✔
2534

2535
  Json::Value root;
2✔
2536
  root["property1"][0] = "value1";
2✔
2537
  root["property1"][1] = "value2";
2✔
2538
  root["property2"] = Json::arrayValue;
2✔
2539

2540
  const Json::String result = Json::writeString(writer, root);
2✔
2541
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2542
}
4✔
2543

2544
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, writeNestedObjects) {
12✔
2545
  Json::StreamWriterBuilder writer;
2✔
2546
  const Json::String expected("{\n"
2547
                              "\t\"object1\" : \n"
2548
                              "\t{\n"
2549
                              "\t\t\"bool\" : true,\n"
2550
                              "\t\t\"nested\" : 123\n"
2551
                              "\t},\n"
2552
                              "\t\"object2\" : {}\n"
2553
                              "}");
2✔
2554

2555
  Json::Value root, child;
2✔
2556
  child["nested"] = 123;
2✔
2557
  child["bool"] = true;
2✔
2558
  root["object1"] = child;
2✔
2559
  root["object2"] = Json::objectValue;
2✔
2560

2561
  const Json::String result = Json::writeString(writer, root);
2✔
2562
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2563
}
4✔
2564

2565
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, multiLineArray) {
12✔
2566
  Json::StreamWriterBuilder wb;
2✔
2567
  wb.settings_["commentStyle"] = "None";
2✔
2568
  {
2569
    // When wb.settings_["commentStyle"] = "None", the effect of
2570
    // printing multiple lines will be displayed when there are
2571
    // more than 20 array members.
2572
    const Json::String expected("[\n\t0,"
2573
                                "\n\t1,"
2574
                                "\n\t2,"
2575
                                "\n\t3,"
2576
                                "\n\t4,"
2577
                                "\n\t5,"
2578
                                "\n\t6,"
2579
                                "\n\t7,"
2580
                                "\n\t8,"
2581
                                "\n\t9,"
2582
                                "\n\t10,"
2583
                                "\n\t11,"
2584
                                "\n\t12,"
2585
                                "\n\t13,"
2586
                                "\n\t14,"
2587
                                "\n\t15,"
2588
                                "\n\t16,"
2589
                                "\n\t17,"
2590
                                "\n\t18,"
2591
                                "\n\t19,"
2592
                                "\n\t20\n]");
2✔
2593
    Json::Value root;
2✔
2594
    for (Json::ArrayIndex i = 0; i < 21; i++)
44✔
2595
      root[i] = i;
42✔
2596
    const Json::String result = Json::writeString(wb, root);
2✔
2597
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2598
  }
2✔
2599
  {
2600
    // Array members do not exceed 21 print effects to render a single line
2601
    const Json::String expected("[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]");
2✔
2602
    Json::Value root;
2✔
2603
    for (Json::ArrayIndex i = 0; i < 10; i++)
22✔
2604
      root[i] = i;
20✔
2605
    const Json::String result = Json::writeString(wb, root);
2✔
2606
    JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2607
  }
2✔
2608
}
2✔
2609

2610
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, dropNullPlaceholders) {
12✔
2611
  Json::StreamWriterBuilder b;
2✔
2612
  Json::Value nullValue;
2✔
2613
  b.settings_["dropNullPlaceholders"] = false;
2✔
2614
  JSONTEST_ASSERT(Json::writeString(b, nullValue) == "null");
4✔
2615
  b.settings_["dropNullPlaceholders"] = true;
2✔
2616
  JSONTEST_ASSERT(Json::writeString(b, nullValue).empty());
4✔
2617
}
2✔
2618

2619
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, enableYAMLCompatibility) {
12✔
2620
  Json::StreamWriterBuilder b;
2✔
2621
  Json::Value root;
2✔
2622
  root["hello"] = "world";
2✔
2623

2624
  b.settings_["indentation"] = "";
2✔
2625
  JSONTEST_ASSERT(Json::writeString(b, root) == "{\"hello\":\"world\"}");
4✔
2626

2627
  b.settings_["enableYAMLCompatibility"] = true;
2✔
2628
  JSONTEST_ASSERT(Json::writeString(b, root) == "{\"hello\": \"world\"}");
4✔
2629

2630
  b.settings_["enableYAMLCompatibility"] = false;
2✔
2631
  JSONTEST_ASSERT(Json::writeString(b, root) == "{\"hello\":\"world\"}");
4✔
2632
}
2✔
2633

2634
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, indentation) {
12✔
2635
  Json::StreamWriterBuilder b;
2✔
2636
  Json::Value root;
2✔
2637
  root["hello"] = "world";
2✔
2638

2639
  b.settings_["indentation"] = "";
2✔
2640
  JSONTEST_ASSERT(Json::writeString(b, root) == "{\"hello\":\"world\"}");
4✔
2641

2642
  b.settings_["indentation"] = "\t";
2✔
2643
  JSONTEST_ASSERT(Json::writeString(b, root) ==
4✔
2644
                  "{\n\t\"hello\" : \"world\"\n}");
2645
}
2✔
2646

2647
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, writeZeroes) {
12✔
2648
  Json::String binary("hi", 3); // include trailing 0
2649
  JSONTEST_ASSERT_EQUAL(3, binary.length());
2✔
2650
  Json::String expected(R"("hi\u0000")"); // unicoded zero
2✔
2651
  Json::StreamWriterBuilder b;
2✔
2652
  {
2653
    Json::Value root;
2✔
2654
    root = binary;
2✔
2655
    JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
6✔
2656
    Json::String out = Json::writeString(b, root);
2✔
2657
    JSONTEST_ASSERT_EQUAL(expected.size(), out.size());
2✔
2658
    JSONTEST_ASSERT_STRING_EQUAL(expected, out);
6✔
2659
  }
2✔
2660
  {
2661
    Json::Value root;
2✔
2662
    root["top"] = binary;
2✔
2663
    JSONTEST_ASSERT_STRING_EQUAL(binary, root["top"].asString());
6✔
2664
    Json::String out = Json::writeString(b, root["top"]);
2✔
2665
    JSONTEST_ASSERT_STRING_EQUAL(expected, out);
6✔
2666
  }
2✔
2667
}
4✔
2668

2669
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, unicode) {
12✔
2670
  // Create a Json value containing UTF-8 string with some chars that need
2671
  // escape (tab,newline).
2672
  Json::Value root;
2✔
2673
  root["test"] = "\t\n\xF0\x91\xA2\xA1\x3D\xC4\xB3\xF0\x9B\x84\x9B\xEF\xBD\xA7";
2✔
2674

2675
  Json::StreamWriterBuilder b;
2✔
2676

2677
  // Default settings - should be unicode escaped.
2678
  JSONTEST_ASSERT(Json::writeString(b, root) ==
4✔
2679
                  "{\n\t\"test\" : "
2680
                  "\"\\t\\n\\ud806\\udca1=\\u0133\\ud82c\\udd1b\\uff67\"\n}");
2681

2682
  b.settings_["emitUTF8"] = true;
2✔
2683

2684
  // Should not be unicode escaped.
2685
  JSONTEST_ASSERT(
4✔
2686
      Json::writeString(b, root) ==
2687
      "{\n\t\"test\" : "
2688
      "\"\\t\\n\xF0\x91\xA2\xA1=\xC4\xB3\xF0\x9B\x84\x9B\xEF\xBD\xA7\"\n}");
2689

2690
  b.settings_["emitUTF8"] = false;
2✔
2691

2692
  // Should be unicode escaped.
2693
  JSONTEST_ASSERT(Json::writeString(b, root) ==
4✔
2694
                  "{\n\t\"test\" : "
2695
                  "\"\\t\\n\\ud806\\udca1=\\u0133\\ud82c\\udd1b\\uff67\"\n}");
2696
}
2✔
2697

2698
// Control chars should be escaped regardless of UTF-8 input encoding.
2699
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, escapeControlCharacters) {
12✔
2700
  auto uEscape = [](unsigned ch) {
64✔
2701
    static const char h[] = "0123456789abcdef";
2702
    std::string r = "\\u";
64✔
2703
    r += h[(ch >> (3 * 4)) & 0xf];
64✔
2704
    r += h[(ch >> (2 * 4)) & 0xf];
64✔
2705
    r += h[(ch >> (1 * 4)) & 0xf];
64✔
2706
    r += h[(ch >> (0 * 4)) & 0xf];
64✔
2707
    return r;
64✔
2708
  };
2709
  auto shortEscape = [](unsigned ch) -> const char* {
2710
    switch (ch) {
768✔
2711
    case '\"':
2712
      return "\\\"";
2713
    case '\\':
4✔
2714
      return "\\\\";
4✔
2715
    case '\b':
4✔
2716
      return "\\b";
4✔
2717
    case '\f':
4✔
2718
      return "\\f";
4✔
2719
    case '\n':
4✔
2720
      return "\\n";
4✔
2721
    case '\r':
4✔
2722
      return "\\r";
4✔
2723
    case '\t':
4✔
2724
      return "\\t";
4✔
2725
    default:
2726
      return nullptr;
2727
    }
2728
  };
2729

2730
  Json::StreamWriterBuilder b;
2✔
2731

2732
  for (bool emitUTF8 : {true, false}) {
6✔
2733
    b.settings_["emitUTF8"] = emitUTF8;
4✔
2734

2735
    for (unsigned i = 0; i != 0x100; ++i) {
772✔
2736
      if (!emitUTF8 && i >= 0x80)
770✔
2737
        break; // The algorithm would try to parse UTF-8, so stop here.
2738

2739
      std::string raw({static_cast<char>(i)});
1,536✔
2740
      std::string esc = raw;
2741
      if (i < 0x20)
768✔
2742
        esc = uEscape(i);
256✔
2743
      if (const char* shEsc = shortEscape(i))
768✔
2744
        esc = shEsc;
2745

2746
      // std::cout << "emit=" << emitUTF8 << ", i=" << std::hex << i << std::dec
2747
      //          << std::endl;
2748

2749
      Json::Value root;
768✔
2750
      root["test"] = raw;
768✔
2751
      JSONTEST_ASSERT_STRING_EQUAL(
4,608✔
2752
          std::string("{\n\t\"test\" : \"").append(esc).append("\"\n}"),
2753
          Json::writeString(b, root))
2754
          << ", emit=" << emitUTF8 << ", i=" << i << ", raw=\"" << raw << "\""
768✔
2755
          << ", esc=\"" << esc << "\"";
768✔
2756
    }
768✔
2757
  }
2758
}
2✔
2759

2760
#ifdef _WIN32
2761
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, escapeTabCharacterWindows) {
2762
  // Get the current locale before changing it
2763
  std::string currentLocale = setlocale(LC_ALL, NULL);
2764
  setlocale(LC_ALL, "English_United States.1252");
2765

2766
  Json::Value root;
2767
  root["test"] = "\tTabTesting\t";
2768

2769
  Json::StreamWriterBuilder b;
2770

2771
  JSONTEST_ASSERT(Json::writeString(b, root) == "{\n\t\"test\" : "
2772
                                                "\"\\tTabTesting\\t\"\n}");
2773

2774
  b.settings_["emitUTF8"] = true;
2775
  JSONTEST_ASSERT(Json::writeString(b, root) == "{\n\t\"test\" : "
2776
                                                "\"\\tTabTesting\\t\"\n}");
2777

2778
  b.settings_["emitUTF8"] = false;
2779
  JSONTEST_ASSERT(Json::writeString(b, root) == "{\n\t\"test\" : "
2780
                                                "\"\\tTabTesting\\t\"\n}");
2781

2782
  // Restore the locale
2783
  if (!currentLocale.empty())
2784
    setlocale(LC_ALL, currentLocale.c_str());
2785
}
2786
#endif
2787

2788
struct ReaderTest : JsonTest::TestCase {
2789
  void setStrictMode() {
1✔
2790
    reader = std::unique_ptr<Json::Reader>(
1✔
2791
        new Json::Reader(Json::Features{}.strictMode()));
1✔
2792
  }
1✔
2793

2794
  void setFeatures(Json::Features& features) {
1✔
2795
    reader = std::unique_ptr<Json::Reader>(new Json::Reader(features));
2✔
2796
  }
1✔
2797

2798
  void checkStructuredErrors(
16✔
2799
      const std::vector<Json::Reader::StructuredError>& actual,
2800
      const std::vector<Json::Reader::StructuredError>& expected) {
2801
    JSONTEST_ASSERT_EQUAL(expected.size(), actual.size());
16✔
2802
    for (size_t i = 0; i < actual.size(); ++i) {
32✔
2803
      const auto& a = actual[i];
16✔
2804
      const auto& e = expected[i];
16✔
2805
      JSONTEST_ASSERT_EQUAL(e.offset_start, a.offset_start) << i;
16✔
2806
      JSONTEST_ASSERT_EQUAL(e.offset_limit, a.offset_limit) << i;
16✔
2807
      JSONTEST_ASSERT_EQUAL(e.message, a.message) << i;
48✔
2808
    }
2809
  }
16✔
2810

2811
  template <typename Input> void checkParse(Input&& input) {
18✔
2812
    JSONTEST_ASSERT(reader->parse(input, root));
34✔
2813
  }
18✔
2814

2815
  template <typename Input>
2816
  void
2817
  checkParse(Input&& input,
32✔
2818
             const std::vector<Json::Reader::StructuredError>& structured) {
2819
    JSONTEST_ASSERT(!reader->parse(input, root));
64✔
2820
    checkStructuredErrors(reader->getStructuredErrors(), structured);
32✔
2821
  }
32✔
2822

2823
  template <typename Input>
2824
  void checkParse(Input&& input,
32✔
2825
                  const std::vector<Json::Reader::StructuredError>& structured,
2826
                  const std::string& formatted) {
2827
    checkParse(input, structured);
32✔
2828
    JSONTEST_ASSERT_EQUAL(formatted, reader->getFormattedErrorMessages());
96✔
2829
  }
32✔
2830

2831
  std::unique_ptr<Json::Reader> reader{new Json::Reader()};
2832
  Json::Value root;
2833
};
2834

2835
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrors) {
10✔
2836
  checkParse(R"({ "property" : "value" })");
2✔
2837
}
2✔
2838

2839
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseObject) {
10✔
2840
  checkParse(R"({"property"})",
4✔
2841
             {{11, 12, "Missing ':' after object member name"}},
2842
             "* Line 1, Column 12\n  Missing ':' after object member name\n");
2843
  checkParse(
4✔
2844
      R"({"property" : "value" )",
2845
      {{22, 22, "Missing ',' or '}' in object declaration"}},
2846
      "* Line 1, Column 23\n  Missing ',' or '}' in object declaration\n");
2847
  checkParse(R"({"property" : "value", )",
4✔
2848
             {{23, 23, "Missing '}' or object member name"}},
2849
             "* Line 1, Column 24\n  Missing '}' or object member name\n");
2850
}
2✔
2851

2852
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseArray) {
10✔
2853
  checkParse(
4✔
2854
      R"([ "value" )", {{10, 10, "Missing ',' or ']' in array declaration"}},
2855
      "* Line 1, Column 11\n  Missing ',' or ']' in array declaration\n");
2856
  checkParse(
4✔
2857
      R"([ "value1" "value2" ] )",
2858
      {{11, 19, "Missing ',' or ']' in array declaration"}},
2859
      "* Line 1, Column 12\n  Missing ',' or ']' in array declaration\n");
2860
}
2✔
2861

2862
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseString) {
10✔
2863
  checkParse(R"([ "\u8a2a" ])");
2✔
2864
  checkParse(
4✔
2865
      R"([ "\ud801" ])",
2866
      {{2, 10,
2867
        "additional six characters expected to parse unicode surrogate "
2868
        "pair."}},
2869
      "* Line 1, Column 3\n"
2870
      "  additional six characters expected to parse unicode surrogate pair.\n"
2871
      "See Line 1, Column 10 for detail.\n");
2872
  checkParse(R"([ "\ud801\d1234" ])",
4✔
2873
             {{2, 16,
2874
               "expecting another \\u token to begin the "
2875
               "second half of a unicode surrogate pair"}},
2876
             "* Line 1, Column 3\n"
2877
             "  expecting another \\u token to begin the "
2878
             "second half of a unicode surrogate pair\n"
2879
             "See Line 1, Column 12 for detail.\n");
2880
  checkParse(R"([ "\ua3t@" ])",
4✔
2881
             {{2, 10,
2882
               "Bad unicode escape sequence in string: "
2883
               "hexadecimal digit expected."}},
2884
             "* Line 1, Column 3\n"
2885
             "  Bad unicode escape sequence in string: "
2886
             "hexadecimal digit expected.\n"
2887
             "See Line 1, Column 9 for detail.\n");
2888
  checkParse(
4✔
2889
      R"([ "\ua3t" ])",
2890
      {{2, 9, "Bad unicode escape sequence in string: four digits expected."}},
2891
      "* Line 1, Column 3\n"
2892
      "  Bad unicode escape sequence in string: four digits expected.\n"
2893
      "See Line 1, Column 6 for detail.\n");
2894
}
2✔
2895

2896
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseComment) {
10✔
2897
  checkParse(
2✔
2898
      R"({ /*commentBeforeValue*/ "property" : "value" }//commentAfterValue)"
2899
      "\n");
2900
  checkParse(" true //comment1\n//comment2\r//comment3\r\n");
2✔
2901
}
2✔
2902

2903
JSONTEST_FIXTURE_LOCAL(ReaderTest, streamParseWithNoErrors) {
10✔
2904
  std::string styled = R"({ "property" : "value" })";
2✔
2905
  std::istringstream iss(styled);
2✔
2906
  checkParse(iss);
2✔
2907
}
4✔
2908

2909
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrorsTestingOffsets) {
10✔
2910
  checkParse(R"({)"
2✔
2911
             R"( "property" : ["value", "value2"],)"
2912
             R"( "obj" : { "nested" : -6.2e+15, "bool" : true},)"
2913
             R"( "null" : null,)"
2914
             R"( "false" : false)"
2915
             R"( })");
2916
  auto checkOffsets = [&](const Json::Value& v, int start, int limit) {
9✔
2917
    JSONTEST_ASSERT_EQUAL(start, v.getOffsetStart());
9✔
2918
    JSONTEST_ASSERT_EQUAL(limit, v.getOffsetLimit());
9✔
2919
  };
11✔
2920
  checkOffsets(root, 0, 115);
2✔
2921
  checkOffsets(root["property"], 15, 34);
2✔
2922
  checkOffsets(root["property"][0], 16, 23);
2✔
2923
  checkOffsets(root["property"][1], 25, 33);
2✔
2924
  checkOffsets(root["obj"], 44, 81);
2✔
2925
  checkOffsets(root["obj"]["nested"], 57, 65);
2✔
2926
  checkOffsets(root["obj"]["bool"], 76, 80);
2✔
2927
  checkOffsets(root["null"], 92, 96);
2✔
2928
  checkOffsets(root["false"], 108, 113);
2✔
2929
}
2✔
2930

2931
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithOneError) {
10✔
2932
  checkParse(R"({ "property" :: "value" })",
4✔
2933
             {{14, 15, "Syntax error: value, object or array expected."}},
2934
             "* Line 1, Column 15\n  Syntax error: value, object or array "
2935
             "expected.\n");
2936
  checkParse("s", {{0, 1, "Syntax error: value, object or array expected."}},
4✔
2937
             "* Line 1, Column 1\n  Syntax error: value, object or array "
2938
             "expected.\n");
2939
}
2✔
2940

2941
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseSpecialFloat) {
10✔
2942
  checkParse(R"({ "a" : Infi })",
4✔
2943
             {{8, 9, "Syntax error: value, object or array expected."}},
2944
             "* Line 1, Column 9\n  Syntax error: value, object or array "
2945
             "expected.\n");
2946
  checkParse(R"({ "a" : Infiniaa })",
4✔
2947
             {{8, 9, "Syntax error: value, object or array expected."}},
2948
             "* Line 1, Column 9\n  Syntax error: value, object or array "
2949
             "expected.\n");
2950
}
2✔
2951

2952
JSONTEST_FIXTURE_LOCAL(ReaderTest, strictModeParseNumber) {
10✔
2953
  setStrictMode();
2✔
2954
  checkParse(
4✔
2955
      "123",
2956
      {{0, 3,
2957
        "A valid JSON document must be either an array or an object value."}},
2958
      "* Line 1, Column 1\n"
2959
      "  A valid JSON document must be either an array or an object value.\n");
2960
}
2✔
2961

2962
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseChineseWithOneError) {
10✔
2963
  checkParse(R"({ "pr)"
4✔
2964
             u8"\u4f50\u85e4" // 佐藤
2965
             R"(erty" :: "value" })",
2966
             {{18, 19, "Syntax error: value, object or array expected."}},
2967
             "* Line 1, Column 19\n  Syntax error: value, object or array "
2968
             "expected.\n");
2969
}
2✔
2970

2971
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithDetailError) {
10✔
2972
  checkParse(R"({ "property" : "v\alue" })",
4✔
2973
             {{15, 23, "Bad escape sequence in string"}},
2974
             "* Line 1, Column 16\n"
2975
             "  Bad escape sequence in string\n"
2976
             "See Line 1, Column 20 for detail.\n");
2977
}
2✔
2978

2979
JSONTEST_FIXTURE_LOCAL(ReaderTest, pushErrorTest) {
10✔
2980
  checkParse(R"({ "AUTHOR" : 123 })");
2✔
2981
  if (!root["AUTHOR"].isString()) {
2✔
2982
    JSONTEST_ASSERT(
4✔
2983
        reader->pushError(root["AUTHOR"], "AUTHOR must be a string"));
2984
  }
2985
  JSONTEST_ASSERT_STRING_EQUAL(reader->getFormattedErrorMessages(),
4✔
2986
                               "* Line 1, Column 14\n"
2987
                               "  AUTHOR must be a string\n");
2988

2989
  checkParse(R"({ "AUTHOR" : 123 })");
2✔
2990
  if (!root["AUTHOR"].isString()) {
2✔
2991
    JSONTEST_ASSERT(reader->pushError(root["AUTHOR"], "AUTHOR must be a string",
4✔
2992
                                      root["AUTHOR"]));
2993
  }
2994
  JSONTEST_ASSERT_STRING_EQUAL(reader->getFormattedErrorMessages(),
4✔
2995
                               "* Line 1, Column 14\n"
2996
                               "  AUTHOR must be a string\n"
2997
                               "See Line 1, Column 14 for detail.\n");
2998
}
2✔
2999

3000
JSONTEST_FIXTURE_LOCAL(ReaderTest, allowNumericKeysTest) {
10✔
3001
  Json::Features features;
2✔
3002
  features.allowNumericKeys_ = true;
2✔
3003
  setFeatures(features);
2✔
3004
  checkParse(R"({ 123 : "abc" })");
2✔
3005
}
2✔
3006

3007
struct CharReaderTest : JsonTest::TestCase {};
12✔
3008

3009
JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithNoErrors) {
12✔
3010
  Json::CharReaderBuilder b;
2✔
3011
  CharReaderPtr reader(b.newCharReader());
2✔
3012
  Json::String errs;
3013
  Json::Value root;
2✔
3014
  char const doc[] = R"({ "property" : "value" })";
2✔
3015
  bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3016
  JSONTEST_ASSERT(ok);
2✔
3017
  JSONTEST_ASSERT(errs.empty());
2✔
3018
}
4✔
3019

3020
JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithNoErrorsTestingOffsets) {
12✔
3021
  Json::CharReaderBuilder b;
2✔
3022
  CharReaderPtr reader(b.newCharReader());
2✔
3023
  Json::String errs;
3024
  Json::Value root;
2✔
3025
  char const doc[] = "{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
2✔
3026
                     "{ \"nested\" : -6.2e+15, \"num\" : +123, \"bool\" : "
3027
                     "true}, \"null\" : null, \"false\" : false }";
3028
  bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3029
  JSONTEST_ASSERT(ok);
2✔
3030
  JSONTEST_ASSERT(errs.empty());
2✔
3031
}
4✔
3032

3033
JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseNumber) {
12✔
3034
  Json::CharReaderBuilder b;
2✔
3035
  CharReaderPtr reader(b.newCharReader());
2✔
3036
  Json::String errs;
3037
  Json::Value root;
2✔
3038
  {
3039
    // if intvalue > threshold, treat the number as a double.
3040
    // 21 digits
3041
    char const doc[] = "[111111111111111111111]";
2✔
3042
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3043
    JSONTEST_ASSERT(ok);
2✔
3044
    JSONTEST_ASSERT(errs.empty());
2✔
3045
    JSONTEST_ASSERT_EQUAL(1.1111111111111111e+020, root[0]);
2✔
3046
  }
3047
}
4✔
3048

3049
JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseString) {
12✔
3050
  Json::CharReaderBuilder b;
2✔
3051
  CharReaderPtr reader(b.newCharReader());
2✔
3052
  Json::Value root;
2✔
3053
  Json::String errs;
3054
  {
3055
    char const doc[] = "[\"\"]";
2✔
3056
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3057
    JSONTEST_ASSERT(ok);
2✔
3058
    JSONTEST_ASSERT(errs.empty());
2✔
3059
    JSONTEST_ASSERT_EQUAL("", root[0]);
2✔
3060
  }
3061
  {
3062
    char const doc[] = R"(["\u8A2a"])";
2✔
3063
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3064
    JSONTEST_ASSERT(ok);
2✔
3065
    JSONTEST_ASSERT(errs.empty());
2✔
3066
    JSONTEST_ASSERT_EQUAL(u8"\u8A2a", root[0].asString()); // "訪"
2✔
3067
  }
3068
  {
3069
    char const doc[] = R"([ "\uD801" ])";
2✔
3070
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3071
    JSONTEST_ASSERT(!ok);
2✔
3072
    JSONTEST_ASSERT(errs == "* Line 1, Column 3\n"
2✔
3073
                            "  additional six characters expected to "
3074
                            "parse unicode surrogate pair.\n"
3075
                            "See Line 1, Column 10 for detail.\n");
3076
  }
3077
  {
3078
    char const doc[] = R"([ "\uD801\d1234" ])";
2✔
3079
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3080
    JSONTEST_ASSERT(!ok);
2✔
3081
    JSONTEST_ASSERT(errs == "* Line 1, Column 3\n"
2✔
3082
                            "  expecting another \\u token to begin the "
3083
                            "second half of a unicode surrogate pair\n"
3084
                            "See Line 1, Column 12 for detail.\n");
3085
  }
3086
  {
3087
    char const doc[] = R"([ "\ua3t@" ])";
2✔
3088
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3089
    JSONTEST_ASSERT(!ok);
2✔
3090
    JSONTEST_ASSERT(errs == "* Line 1, Column 3\n"
2✔
3091
                            "  Bad unicode escape sequence in string: "
3092
                            "hexadecimal digit expected.\n"
3093
                            "See Line 1, Column 9 for detail.\n");
3094
  }
3095
  {
3096
    char const doc[] = R"([ "\ua3t" ])";
2✔
3097
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3098
    JSONTEST_ASSERT(!ok);
2✔
3099
    JSONTEST_ASSERT(
2✔
3100
        errs ==
3101
        "* Line 1, Column 3\n"
3102
        "  Bad unicode escape sequence in string: four digits expected.\n"
3103
        "See Line 1, Column 6 for detail.\n");
3104
  }
3105
  {
3106
    b.settings_["allowSingleQuotes"] = true;
2✔
3107
    CharReaderPtr charreader(b.newCharReader());
2✔
3108
    char const doc[] = R"({'a': 'x\ty', "b":'x\\y'})";
2✔
3109
    bool ok = charreader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3110
    JSONTEST_ASSERT(ok);
2✔
3111
    JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3112
    JSONTEST_ASSERT_EQUAL(2u, root.size());
2✔
3113
    JSONTEST_ASSERT_STRING_EQUAL("x\ty", root["a"].asString());
4✔
3114
    JSONTEST_ASSERT_STRING_EQUAL("x\\y", root["b"].asString());
4✔
3115
  }
3116
}
4✔
3117

3118
JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseComment) {
12✔
3119
  Json::CharReaderBuilder b;
2✔
3120
  CharReaderPtr reader(b.newCharReader());
2✔
3121
  Json::Value root;
2✔
3122
  Json::String errs;
3123
  {
3124
    char const doc[] = "//comment1\n { //comment2\n \"property\" :"
2✔
3125
                       " \"value\" //comment3\n } //comment4\n";
3126
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3127
    JSONTEST_ASSERT(ok);
2✔
3128
    JSONTEST_ASSERT(errs.empty());
2✔
3129
    JSONTEST_ASSERT_EQUAL("value", root["property"]);
2✔
3130
  }
3131
  {
3132
    char const doc[] = "{ \"property\" //comment\n : \"value\" }";
2✔
3133
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3134
    JSONTEST_ASSERT(!ok);
2✔
3135
    JSONTEST_ASSERT(errs == "* Line 1, Column 14\n"
2✔
3136
                            "  Missing ':' after object member name\n");
3137
  }
3138
  {
3139
    char const doc[] = "//comment1\n [ //comment2\n \"value\" //comment3\n,"
2✔
3140
                       " //comment4\n true //comment5\n ] //comment6\n";
3141
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3142
    JSONTEST_ASSERT(ok);
2✔
3143
    JSONTEST_ASSERT(errs.empty());
2✔
3144
    JSONTEST_ASSERT_EQUAL("value", root[0]);
2✔
3145
    JSONTEST_ASSERT_EQUAL(true, root[1]);
2✔
3146
  }
3147
}
4✔
3148

3149
JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseObjectWithErrors) {
12✔
3150
  Json::CharReaderBuilder b;
2✔
3151
  CharReaderPtr reader(b.newCharReader());
2✔
3152
  Json::Value root;
2✔
3153
  Json::String errs;
3154
  {
3155
    char const doc[] = R"({ "property" : "value" )";
2✔
3156
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3157
    JSONTEST_ASSERT(!ok);
2✔
3158
    JSONTEST_ASSERT(errs == "* Line 1, Column 24\n"
2✔
3159
                            "  Missing ',' or '}' in object declaration\n");
3160
    JSONTEST_ASSERT_EQUAL("value", root["property"]);
2✔
3161
  }
3162
  {
3163
    char const doc[] = R"({ "property" : "value" ,)";
2✔
3164
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3165
    JSONTEST_ASSERT(!ok);
2✔
3166
    JSONTEST_ASSERT(errs == "* Line 1, Column 25\n"
2✔
3167
                            "  Missing '}' or object member name\n");
3168
    JSONTEST_ASSERT_EQUAL("value", root["property"]);
2✔
3169
  }
3170
}
4✔
3171

3172
JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseArrayWithErrors) {
12✔
3173
  Json::CharReaderBuilder b;
2✔
3174
  CharReaderPtr reader(b.newCharReader());
2✔
3175
  Json::Value root;
2✔
3176
  Json::String errs;
3177
  {
3178
    char const doc[] = "[ \"value\" ";
2✔
3179
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3180
    JSONTEST_ASSERT(!ok);
2✔
3181
    JSONTEST_ASSERT(errs == "* Line 1, Column 11\n"
2✔
3182
                            "  Missing ',' or ']' in array declaration\n");
3183
    JSONTEST_ASSERT_EQUAL("value", root[0]);
2✔
3184
  }
3185
  {
3186
    char const doc[] = R"([ "value1" "value2" ])";
2✔
3187
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3188
    JSONTEST_ASSERT(!ok);
2✔
3189
    JSONTEST_ASSERT(errs == "* Line 1, Column 12\n"
2✔
3190
                            "  Missing ',' or ']' in array declaration\n");
3191
    JSONTEST_ASSERT_EQUAL("value1", root[0]);
2✔
3192
  }
3193
}
4✔
3194

3195
JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithOneError) {
12✔
3196
  Json::CharReaderBuilder b;
2✔
3197
  CharReaderPtr reader(b.newCharReader());
2✔
3198
  Json::String errs;
3199
  Json::Value root;
2✔
3200
  char const doc[] = R"({ "property" :: "value" })";
2✔
3201
  bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3202
  JSONTEST_ASSERT(!ok);
2✔
3203
  JSONTEST_ASSERT(errs ==
2✔
3204
                  "* Line 1, Column 15\n  Syntax error: value, object or array "
3205
                  "expected.\n");
3206
}
4✔
3207

3208
JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseChineseWithOneError) {
12✔
3209
  Json::CharReaderBuilder b;
2✔
3210
  CharReaderPtr reader(b.newCharReader());
2✔
3211
  Json::String errs;
3212
  Json::Value root;
2✔
3213
  char const doc[] = "{ \"pr佐藤erty\" :: \"value\" }";
2✔
3214
  bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3215
  JSONTEST_ASSERT(!ok);
2✔
3216
  JSONTEST_ASSERT(errs ==
2✔
3217
                  "* Line 1, Column 19\n  Syntax error: value, object or array "
3218
                  "expected.\n");
3219
}
4✔
3220

3221
JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithDetailError) {
12✔
3222
  Json::CharReaderBuilder b;
2✔
3223
  CharReaderPtr reader(b.newCharReader());
2✔
3224
  Json::String errs;
3225
  Json::Value root;
2✔
3226
  char const doc[] = R"({ "property" : "v\alue" })";
2✔
3227
  bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3228
  JSONTEST_ASSERT(!ok);
2✔
3229
  JSONTEST_ASSERT(errs ==
2✔
3230
                  "* Line 1, Column 16\n  Bad escape sequence in string\nSee "
3231
                  "Line 1, Column 20 for detail.\n");
3232
}
4✔
3233

3234
JSONTEST_FIXTURE_LOCAL(CharReaderTest, parseWithStackLimit) {
12✔
3235
  Json::CharReaderBuilder b;
2✔
3236
  Json::Value root;
2✔
3237
  char const doc[] = R"({ "property" : "value" })";
2✔
3238
  {
3239
    b.settings_["stackLimit"] = 2;
2✔
3240
    CharReaderPtr reader(b.newCharReader());
2✔
3241
    Json::String errs;
3242
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3243
    JSONTEST_ASSERT(ok);
2✔
3244
    JSONTEST_ASSERT(errs.empty());
2✔
3245
    JSONTEST_ASSERT_EQUAL("value", root["property"]);
2✔
3246
  }
3247
  {
3248
    b.settings_["stackLimit"] = 1;
2✔
3249
    CharReaderPtr reader(b.newCharReader());
2✔
3250
    Json::String errs;
3251
    JSONTEST_ASSERT_THROWS(
2✔
3252
        reader->parse(doc, doc + std::strlen(doc), &root, &errs));
3253
  }
3254
}
2✔
3255

3256
JSONTEST_FIXTURE_LOCAL(CharReaderTest, testOperator) {
12✔
3257
  const std::string styled = R"({ "property" : "value" })";
2✔
3258
  std::istringstream iss(styled);
2✔
3259
  Json::Value root;
2✔
3260
  iss >> root;
2✔
3261
  JSONTEST_ASSERT_EQUAL("value", root["property"]);
2✔
3262
}
4✔
3263

3264
struct CharReaderStrictModeTest : JsonTest::TestCase {};
1✔
3265

3266
JSONTEST_FIXTURE_LOCAL(CharReaderStrictModeTest, dupKeys) {
12✔
3267
  Json::CharReaderBuilder b;
2✔
3268
  Json::Value root;
2✔
3269
  char const doc[] =
2✔
3270
      R"({ "property" : "value", "key" : "val1", "key" : "val2" })";
3271
  {
3272
    b.strictMode(&b.settings_);
2✔
3273
    CharReaderPtr reader(b.newCharReader());
2✔
3274
    Json::String errs;
3275
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3276
    JSONTEST_ASSERT(!ok);
2✔
3277
    JSONTEST_ASSERT_STRING_EQUAL("* Line 1, Column 41\n"
6✔
3278
                                 "  Duplicate key: 'key'\n",
3279
                                 errs);
3280
    JSONTEST_ASSERT_EQUAL("val1", root["key"]); // so far
2✔
3281
  }
3282
}
2✔
3283
struct CharReaderFailIfExtraTest : JsonTest::TestCase {};
6✔
3284

3285
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, issue164) {
12✔
3286
  // This is interpreted as a string value followed by a colon.
3287
  Json::CharReaderBuilder b;
2✔
3288
  Json::Value root;
2✔
3289
  char const doc[] = R"( "property" : "value" })";
2✔
3290
  {
3291
    b.settings_["failIfExtra"] = false;
2✔
3292
    CharReaderPtr reader(b.newCharReader());
2✔
3293
    Json::String errs;
3294
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3295
    JSONTEST_ASSERT(ok);
2✔
3296
    JSONTEST_ASSERT(errs.empty());
2✔
3297
    JSONTEST_ASSERT_EQUAL("property", root);
2✔
3298
  }
3299
  {
3300
    b.settings_["failIfExtra"] = true;
2✔
3301
    CharReaderPtr reader(b.newCharReader());
2✔
3302
    Json::String errs;
3303
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3304
    JSONTEST_ASSERT(!ok);
2✔
3305
    JSONTEST_ASSERT_STRING_EQUAL("* Line 1, Column 13\n"
6✔
3306
                                 "  Extra non-whitespace after JSON value.\n",
3307
                                 errs);
3308
    JSONTEST_ASSERT_EQUAL("property", root);
2✔
3309
  }
3310
  {
3311
    b.strictMode(&b.settings_);
2✔
3312
    CharReaderPtr reader(b.newCharReader());
2✔
3313
    Json::String errs;
3314
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3315
    JSONTEST_ASSERT(!ok);
2✔
3316
    JSONTEST_ASSERT_STRING_EQUAL("* Line 1, Column 13\n"
6✔
3317
                                 "  Extra non-whitespace after JSON value.\n",
3318
                                 errs);
3319
    JSONTEST_ASSERT_EQUAL("property", root);
2✔
3320
  }
3321
  {
3322
    b.strictMode(&b.settings_);
2✔
3323
    b.settings_["failIfExtra"] = false;
2✔
3324
    CharReaderPtr reader(b.newCharReader());
2✔
3325
    Json::String errs;
3326
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3327
    JSONTEST_ASSERT(!ok);
2✔
3328
    JSONTEST_ASSERT_STRING_EQUAL(
6✔
3329
        "* Line 1, Column 1\n"
3330
        "  A valid JSON document must be either an array or an object value.\n",
3331
        errs);
3332
    JSONTEST_ASSERT_EQUAL("property", root);
2✔
3333
  }
3334
}
2✔
3335

3336
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, issue107) {
12✔
3337
  // This is interpreted as an int value followed by a colon.
3338
  Json::CharReaderBuilder b;
2✔
3339
  Json::Value root;
2✔
3340
  char const doc[] = "1:2:3";
2✔
3341
  b.settings_["failIfExtra"] = true;
2✔
3342
  CharReaderPtr reader(b.newCharReader());
2✔
3343
  Json::String errs;
3344
  bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3345
  JSONTEST_ASSERT(!ok);
2✔
3346
  JSONTEST_ASSERT_STRING_EQUAL("* Line 1, Column 2\n"
6✔
3347
                               "  Extra non-whitespace after JSON value.\n",
3348
                               errs);
3349
  JSONTEST_ASSERT_EQUAL(1, root.asInt());
2✔
3350
}
2✔
3351
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, commentAfterObject) {
12✔
3352
  Json::CharReaderBuilder b;
2✔
3353
  Json::Value root;
2✔
3354
  {
3355
    char const doc[] = "{ \"property\" : \"value\" } //trailing\n//comment\n";
2✔
3356
    b.settings_["failIfExtra"] = true;
2✔
3357
    CharReaderPtr reader(b.newCharReader());
2✔
3358
    Json::String errs;
3359
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3360
    JSONTEST_ASSERT(ok);
2✔
3361
    JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3362
    JSONTEST_ASSERT_EQUAL("value", root["property"]);
2✔
3363
  }
3364
}
2✔
3365
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, commentAfterArray) {
12✔
3366
  Json::CharReaderBuilder b;
2✔
3367
  Json::Value root;
2✔
3368
  char const doc[] = "[ \"property\" , \"value\" ] //trailing\n//comment\n";
2✔
3369
  b.settings_["failIfExtra"] = true;
2✔
3370
  CharReaderPtr reader(b.newCharReader());
2✔
3371
  Json::String errs;
3372
  bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3373
  JSONTEST_ASSERT(ok);
2✔
3374
  JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3375
  JSONTEST_ASSERT_EQUAL("value", root[1u]);
2✔
3376
}
2✔
3377
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, commentAfterBool) {
12✔
3378
  Json::CharReaderBuilder b;
2✔
3379
  Json::Value root;
2✔
3380
  char const doc[] = " true /*trailing\ncomment*/";
2✔
3381
  b.settings_["failIfExtra"] = true;
2✔
3382
  CharReaderPtr reader(b.newCharReader());
2✔
3383
  Json::String errs;
3384
  bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3385
  JSONTEST_ASSERT(ok);
2✔
3386
  JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3387
  JSONTEST_ASSERT_EQUAL(true, root.asBool());
2✔
3388
}
2✔
3389

3390
JSONTEST_FIXTURE_LOCAL(CharReaderFailIfExtraTest, parseComment) {
12✔
3391
  Json::CharReaderBuilder b;
2✔
3392
  b.settings_["failIfExtra"] = true;
2✔
3393
  CharReaderPtr reader(b.newCharReader());
2✔
3394
  Json::Value root;
2✔
3395
  Json::String errs;
3396
  {
3397
    char const doc[] = " true //comment1\n//comment2\r//comment3\r\n";
2✔
3398
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3399
    JSONTEST_ASSERT(ok);
2✔
3400
    JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3401
    JSONTEST_ASSERT_EQUAL(true, root.asBool());
2✔
3402
  }
3403
  {
3404
    char const doc[] = " true //com\rment";
2✔
3405
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3406
    JSONTEST_ASSERT(!ok);
2✔
3407
    JSONTEST_ASSERT_STRING_EQUAL("* Line 2, Column 1\n"
6✔
3408
                                 "  Extra non-whitespace after JSON value.\n",
3409
                                 errs);
3410
    JSONTEST_ASSERT_EQUAL(true, root.asBool());
2✔
3411
  }
3412
  {
3413
    char const doc[] = " true //com\nment";
2✔
3414
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3415
    JSONTEST_ASSERT(!ok);
2✔
3416
    JSONTEST_ASSERT_STRING_EQUAL("* Line 2, Column 1\n"
6✔
3417
                                 "  Extra non-whitespace after JSON value.\n",
3418
                                 errs);
3419
    JSONTEST_ASSERT_EQUAL(true, root.asBool());
2✔
3420
  }
3421
}
4✔
3422

3423
struct CharReaderAllowDropNullTest : JsonTest::TestCase {
3424
  using Value = Json::Value;
3425
  using ValueCheck = std::function<void(const Value&)>;
3426

3427
  Value nullValue = Value{Json::nullValue};
3428
  Value emptyArray = Value{Json::arrayValue};
3429

3430
  ValueCheck checkEq(const Value& v) {
7✔
3431
    return [=](const Value& root) { JSONTEST_ASSERT_EQUAL(root, v); };
40✔
3432
  }
3433

3434
  static ValueCheck objGetAnd(std::string idx, ValueCheck f) {
3✔
3435
    return [=](const Value& root) { f(root.get(idx, true)); };
15✔
3436
  }
3437

3438
  static ValueCheck arrGetAnd(int idx, ValueCheck f) {
3✔
3439
    return [=](const Value& root) { f(root[idx]); };
15✔
3440
  }
3441
};
3442

3443
JSONTEST_FIXTURE_LOCAL(CharReaderAllowDropNullTest, issue178) {
10✔
3444
  struct TestSpec {
3445
    int line;
3446
    std::string doc;
3447
    size_t rootSize;
3448
    ValueCheck onRoot;
3449
  };
3450
  const TestSpec specs[] = {
3451
      {__LINE__, R"({"a":,"b":true})", 2, objGetAnd("a", checkEq(nullValue))},
4✔
3452
      {__LINE__, R"({"a":,"b":true})", 2, objGetAnd("a", checkEq(nullValue))},
4✔
3453
      {__LINE__, R"({"a":})", 1, objGetAnd("a", checkEq(nullValue))},
4✔
3454
      {__LINE__, "[]", 0, checkEq(emptyArray)},
2✔
3455
      {__LINE__, "[null]", 1, nullptr},
3456
      {__LINE__, "[,]", 2, nullptr},
3457
      {__LINE__, "[,,,]", 4, nullptr},
3458
      {__LINE__, "[null,]", 2, nullptr},
3459
      {__LINE__, "[,null]", 2, nullptr},
3460
      {__LINE__, "[,,]", 3, nullptr},
3461
      {__LINE__, "[null,,]", 3, nullptr},
3462
      {__LINE__, "[,null,]", 3, nullptr},
3463
      {__LINE__, "[,,null]", 3, nullptr},
3464
      {__LINE__, "[[],,,]", 4, arrGetAnd(0, checkEq(emptyArray))},
4✔
3465
      {__LINE__, "[,[],,]", 4, arrGetAnd(1, checkEq(emptyArray))},
4✔
3466
      {__LINE__, "[,,,[]]", 4, arrGetAnd(3, checkEq(emptyArray))},
4✔
3467
  };
50✔
3468
  for (const auto& spec : specs) {
34✔
3469
    Json::CharReaderBuilder b;
32✔
3470
    b.settings_["allowDroppedNullPlaceholders"] = true;
32✔
3471
    std::unique_ptr<Json::CharReader> reader(b.newCharReader());
32✔
3472

3473
    Json::Value root;
32✔
3474
    Json::String errs;
3475
    bool ok = reader->parse(spec.doc.data(), spec.doc.data() + spec.doc.size(),
32✔
3476
                            &root, &errs);
3477
    JSONTEST_ASSERT(ok);
32✔
3478
    JSONTEST_ASSERT_STRING_EQUAL(errs, "");
96✔
3479
    if (spec.onRoot) {
32✔
3480
      spec.onRoot(root);
3481
    }
3482
  }
64✔
3483
}
36✔
3484

3485
struct CharReaderAllowNumericKeysTest : JsonTest::TestCase {};
1✔
3486

3487
JSONTEST_FIXTURE_LOCAL(CharReaderAllowNumericKeysTest, allowNumericKeys) {
12✔
3488
  Json::CharReaderBuilder b;
2✔
3489
  b.settings_["allowNumericKeys"] = true;
2✔
3490
  Json::Value root;
2✔
3491
  Json::String errs;
3492
  CharReaderPtr reader(b.newCharReader());
2✔
3493
  char const doc[] = "{15:true,-16:true,12.01:true}";
2✔
3494
  bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3495
  JSONTEST_ASSERT(ok);
2✔
3496
  JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3497
  JSONTEST_ASSERT_EQUAL(3u, root.size());
2✔
3498
  JSONTEST_ASSERT_EQUAL(true, root.get("15", false));
2✔
3499
  JSONTEST_ASSERT_EQUAL(true, root.get("-16", false));
2✔
3500
  JSONTEST_ASSERT_EQUAL(true, root.get("12.01", false));
2✔
3501
}
2✔
3502

3503
struct CharReaderAllowSingleQuotesTest : JsonTest::TestCase {};
1✔
3504

3505
JSONTEST_FIXTURE_LOCAL(CharReaderAllowSingleQuotesTest, issue182) {
12✔
3506
  Json::CharReaderBuilder b;
2✔
3507
  b.settings_["allowSingleQuotes"] = true;
2✔
3508
  Json::Value root;
2✔
3509
  Json::String errs;
3510
  CharReaderPtr reader(b.newCharReader());
2✔
3511
  {
3512
    char const doc[] = "{'a':true,\"b\":true}";
2✔
3513
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3514
    JSONTEST_ASSERT(ok);
2✔
3515
    JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3516
    JSONTEST_ASSERT_EQUAL(2u, root.size());
2✔
3517
    JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
2✔
3518
    JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
2✔
3519
  }
3520
  {
3521
    char const doc[] = "{'a': 'x', \"b\":'y'}";
2✔
3522
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3523
    JSONTEST_ASSERT(ok);
2✔
3524
    JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3525
    JSONTEST_ASSERT_EQUAL(2u, root.size());
2✔
3526
    JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
4✔
3527
    JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
4✔
3528
  }
3529
}
2✔
3530

3531
struct CharReaderAllowZeroesTest : JsonTest::TestCase {};
1✔
3532

3533
JSONTEST_FIXTURE_LOCAL(CharReaderAllowZeroesTest, issue176) {
12✔
3534
  Json::CharReaderBuilder b;
2✔
3535
  b.settings_["allowSingleQuotes"] = true;
2✔
3536
  Json::Value root;
2✔
3537
  Json::String errs;
3538
  CharReaderPtr reader(b.newCharReader());
2✔
3539
  {
3540
    char const doc[] = "{'a':true,\"b\":true}";
2✔
3541
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3542
    JSONTEST_ASSERT(ok);
2✔
3543
    JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3544
    JSONTEST_ASSERT_EQUAL(2u, root.size());
2✔
3545
    JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
2✔
3546
    JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
2✔
3547
  }
3548
  {
3549
    char const doc[] = "{'a': 'x', \"b\":'y'}";
2✔
3550
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3551
    JSONTEST_ASSERT(ok);
2✔
3552
    JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3553
    JSONTEST_ASSERT_EQUAL(2u, root.size());
2✔
3554
    JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
4✔
3555
    JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
4✔
3556
  }
3557
}
2✔
3558

3559
struct CharReaderAllowSpecialFloatsTest : JsonTest::TestCase {};
2✔
3560

3561
JSONTEST_FIXTURE_LOCAL(CharReaderAllowSpecialFloatsTest, specialFloat) {
12✔
3562
  Json::CharReaderBuilder b;
2✔
3563
  CharReaderPtr reader(b.newCharReader());
2✔
3564
  Json::Value root;
2✔
3565
  Json::String errs;
3566
  {
3567
    char const doc[] = "{\"a\": NaN}";
2✔
3568
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3569
    JSONTEST_ASSERT(!ok);
2✔
3570
    JSONTEST_ASSERT_STRING_EQUAL(
6✔
3571
        "* Line 1, Column 7\n"
3572
        "  Syntax error: value, object or array expected.\n",
3573
        errs);
3574
  }
3575
  {
3576
    char const doc[] = "{\"a\": Infinity}";
2✔
3577
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3578
    JSONTEST_ASSERT(!ok);
2✔
3579
    JSONTEST_ASSERT_STRING_EQUAL(
6✔
3580
        "* Line 1, Column 7\n"
3581
        "  Syntax error: value, object or array expected.\n",
3582
        errs);
3583
  }
3584
}
4✔
3585

3586
JSONTEST_FIXTURE_LOCAL(CharReaderAllowSpecialFloatsTest, issue209) {
12✔
3587
  Json::CharReaderBuilder b;
2✔
3588
  b.settings_["allowSpecialFloats"] = true;
2✔
3589
  Json::Value root;
2✔
3590
  Json::String errs;
3591
  CharReaderPtr reader(b.newCharReader());
2✔
3592
  {
3593
    char const doc[] = R"({"a":NaN,"b":Infinity,"c":-Infinity,"d":+Infinity})";
2✔
3594
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3595
    JSONTEST_ASSERT(ok);
2✔
3596
    JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3597
    JSONTEST_ASSERT_EQUAL(4u, root.size());
2✔
3598
    double n = root["a"].asDouble();
2✔
3599
    JSONTEST_ASSERT(std::isnan(n));
2✔
3600
    JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(),
2✔
3601
                          root.get("b", 0.0));
3602
    JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(),
2✔
3603
                          root.get("c", 0.0));
3604
    JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(),
2✔
3605
                          root.get("d", 0.0));
3606
  }
3607

3608
  struct TestData {
34✔
3609
    int line;
3610
    bool ok;
3611
    Json::String in;
3612
  };
3613
  const TestData test_data[] = {
3614
      {__LINE__, true, "{\"a\":9}"},          //
3615
      {__LINE__, false, "{\"a\":0Infinity}"}, //
3616
      {__LINE__, false, "{\"a\":1Infinity}"}, //
3617
      {__LINE__, false, "{\"a\":9Infinity}"}, //
3618
      {__LINE__, false, "{\"a\":0nfinity}"},  //
3619
      {__LINE__, false, "{\"a\":1nfinity}"},  //
3620
      {__LINE__, false, "{\"a\":9nfinity}"},  //
3621
      {__LINE__, false, "{\"a\":nfinity}"},   //
3622
      {__LINE__, false, "{\"a\":.nfinity}"},  //
3623
      {__LINE__, false, "{\"a\":9nfinity}"},  //
3624
      {__LINE__, false, "{\"a\":-nfinity}"},  //
3625
      {__LINE__, true, "{\"a\":Infinity}"},   //
3626
      {__LINE__, false, "{\"a\":.Infinity}"}, //
3627
      {__LINE__, false, "{\"a\":_Infinity}"}, //
3628
      {__LINE__, false, "{\"a\":_nfinity}"},  //
3629
      {__LINE__, true, "{\"a\":-Infinity}"},  //
3630
      {__LINE__, true, "{\"a\":+Infinity}"}   //
3631
  };
36✔
3632
  for (const auto& td : test_data) {
36✔
3633
    bool ok = reader->parse(&*td.in.begin(), &*td.in.begin() + td.in.size(),
34✔
3634
                            &root, &errs);
3635
    // clang-format off
3636
    JSONTEST_ASSERT(td.ok == ok) <<
34✔
3637
        "line:" << td.line << "\n  " <<
×
3638
        "expected: {ok:" << td.ok << ", in:\'" << td.in << "\'}\n " <<
×
3639
        "actual: {ok:" << ok << "}\n";
×
3640
    // clang-format on
3641
  }
3642

3643
  {
3644
    char const doc[] = R"({"posInf": +Infinity, "NegInf": -Infinity})";
2✔
3645
    bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3646
    JSONTEST_ASSERT(ok);
2✔
3647
    JSONTEST_ASSERT_STRING_EQUAL("", errs);
4✔
3648
    JSONTEST_ASSERT_EQUAL(2u, root.size());
2✔
3649
    JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(),
2✔
3650
                          root["posInf"].asDouble());
3651
    JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(),
2✔
3652
                          root["NegInf"].asDouble());
3653
  }
3654
}
38✔
3655

3656
struct EscapeSequenceTest : JsonTest::TestCase {};
3✔
3657

3658
JSONTEST_FIXTURE_LOCAL(EscapeSequenceTest, readerParseEscapeSequence) {
12✔
3659
  Json::Reader reader;
2✔
3660
  Json::Value root;
2✔
3661
  bool ok = reader.parse("[\"\\\"\",\"\\/\",\"\\\\\",\"\\b\","
2✔
3662
                         "\"\\f\",\"\\n\",\"\\r\",\"\\t\","
3663
                         "\"\\u0278\",\"\\ud852\\udf62\"]\n",
3664
                         root);
3665
  JSONTEST_ASSERT(ok);
2✔
3666
  JSONTEST_ASSERT(reader.getFormattedErrorMessages().empty());
4✔
3667
  JSONTEST_ASSERT(reader.getStructuredErrors().empty());
2✔
3668
}
2✔
3669

3670
JSONTEST_FIXTURE_LOCAL(EscapeSequenceTest, charReaderParseEscapeSequence) {
12✔
3671
  Json::CharReaderBuilder b;
2✔
3672
  CharReaderPtr reader(b.newCharReader());
2✔
3673
  Json::Value root;
2✔
3674
  Json::String errs;
3675
  char const doc[] = "[\"\\\"\",\"\\/\",\"\\\\\",\"\\b\","
2✔
3676
                     "\"\\f\",\"\\n\",\"\\r\",\"\\t\","
3677
                     "\"\\u0278\",\"\\ud852\\udf62\"]";
3678
  bool ok = reader->parse(doc, doc + std::strlen(doc), &root, &errs);
2✔
3679
  JSONTEST_ASSERT(ok);
2✔
3680
  JSONTEST_ASSERT(errs.empty());
2✔
3681
}
4✔
3682

3683
JSONTEST_FIXTURE_LOCAL(EscapeSequenceTest, writeEscapeSequence) {
12✔
3684
  Json::FastWriter writer;
2✔
3685
  const Json::String expected("[\"\\\"\",\"\\\\\",\"\\b\","
3686
                              "\"\\f\",\"\\n\",\"\\r\",\"\\t\","
3687
                              "\"\\u0278\",\"\\ud852\\udf62\"]\n");
2✔
3688
  Json::Value root;
2✔
3689
  root[0] = "\"";
2✔
3690
  root[1] = "\\";
2✔
3691
  root[2] = "\b";
2✔
3692
  root[3] = "\f";
2✔
3693
  root[4] = "\n";
2✔
3694
  root[5] = "\r";
2✔
3695
  root[6] = "\t";
2✔
3696
  root[7] = "ɸ";
2✔
3697
  root[8] = "𤭢";
2✔
3698
  const Json::String result = writer.write(root);
2✔
3699
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
3700
}
4✔
3701

3702
struct BuilderTest : JsonTest::TestCase {};
1✔
3703

3704
JSONTEST_FIXTURE_LOCAL(BuilderTest, settings) {
12✔
3705
  {
3706
    Json::Value errs;
2✔
3707
    Json::CharReaderBuilder rb;
2✔
3708
    JSONTEST_ASSERT_EQUAL(false, rb.settings_.isMember("foo"));
2✔
3709
    JSONTEST_ASSERT_EQUAL(true, rb.validate(&errs));
2✔
3710
    rb["foo"] = "bar";
4✔
3711
    JSONTEST_ASSERT_EQUAL(true, rb.settings_.isMember("foo"));
2✔
3712
    JSONTEST_ASSERT_EQUAL(false, rb.validate(&errs));
2✔
3713
  }
2✔
3714
  {
3715
    Json::Value errs;
2✔
3716
    Json::StreamWriterBuilder wb;
2✔
3717
    JSONTEST_ASSERT_EQUAL(false, wb.settings_.isMember("foo"));
2✔
3718
    JSONTEST_ASSERT_EQUAL(true, wb.validate(&errs));
2✔
3719
    wb["foo"] = "bar";
4✔
3720
    JSONTEST_ASSERT_EQUAL(true, wb.settings_.isMember("foo"));
2✔
3721
    JSONTEST_ASSERT_EQUAL(false, wb.validate(&errs));
2✔
3722
  }
2✔
3723
}
2✔
3724

3725
struct BomTest : JsonTest::TestCase {};
2✔
3726

3727
JSONTEST_FIXTURE_LOCAL(BomTest, skipBom) {
12✔
3728
  const std::string with_bom = "\xEF\xBB\xBF{\"key\" : \"value\"}";
2✔
3729
  Json::Value root;
2✔
3730
  JSONCPP_STRING errs;
3731
  std::istringstream iss(with_bom);
2✔
3732
  bool ok = parseFromStream(Json::CharReaderBuilder(), iss, &root, &errs);
2✔
3733
  // The default behavior is to skip the BOM, so we can parse it normally.
3734
  JSONTEST_ASSERT(ok);
2✔
3735
  JSONTEST_ASSERT(errs.empty());
2✔
3736
  JSONTEST_ASSERT_STRING_EQUAL(root["key"].asString(), "value");
4✔
3737
}
6✔
3738
JSONTEST_FIXTURE_LOCAL(BomTest, notSkipBom) {
12✔
3739
  const std::string with_bom = "\xEF\xBB\xBF{\"key\" : \"value\"}";
2✔
3740
  Json::Value root;
2✔
3741
  JSONCPP_STRING errs;
3742
  std::istringstream iss(with_bom);
2✔
3743
  Json::CharReaderBuilder b;
2✔
3744
  b.settings_["skipBom"] = false;
2✔
3745
  bool ok = parseFromStream(b, iss, &root, &errs);
2✔
3746
  // Detect the BOM, and failed on it.
3747
  JSONTEST_ASSERT(!ok);
2✔
3748
  JSONTEST_ASSERT(!errs.empty());
2✔
3749
}
6✔
3750

3751
struct IteratorTest : JsonTest::TestCase {};
9✔
3752

3753
JSONTEST_FIXTURE_LOCAL(IteratorTest, convert) {
12✔
3754
  Json::Value j;
2✔
3755
  const Json::Value& cj = j;
3756
  auto it = j.begin();
2✔
3757
  Json::Value::const_iterator cit;
2✔
3758
  cit = it;
2✔
3759
  JSONTEST_ASSERT(cit == cj.begin());
4✔
3760
}
2✔
3761

3762
JSONTEST_FIXTURE_LOCAL(IteratorTest, decrement) {
12✔
3763
  Json::Value json;
2✔
3764
  json["k1"] = "a";
2✔
3765
  json["k2"] = "b";
2✔
3766
  std::vector<std::string> values;
3767
  for (auto it = json.end(); it != json.begin();) {
12✔
3768
    --it;
3769
    values.push_back(it->asString());
8✔
3770
  }
3771
  JSONTEST_ASSERT((values == std::vector<std::string>{"b", "a"}));
6✔
3772
}
2✔
3773

3774
JSONTEST_FIXTURE_LOCAL(IteratorTest, reverseIterator) {
12✔
3775
  Json::Value json;
2✔
3776
  json["k1"] = "a";
2✔
3777
  json["k2"] = "b";
2✔
3778
  std::vector<std::string> values;
3779
  using Iter = decltype(json.begin());
3780
  auto re = std::reverse_iterator<Iter>(json.begin());
2✔
3781
  for (auto it = std::reverse_iterator<Iter>(json.end()); it != re; ++it) {
10✔
3782
    values.push_back(it->asString());
8✔
3783
  }
3784
  JSONTEST_ASSERT((values == std::vector<std::string>{"b", "a"}));
6✔
3785
}
2✔
3786

3787
JSONTEST_FIXTURE_LOCAL(IteratorTest, distance) {
12✔
3788
  {
3789
    Json::Value json;
2✔
3790
    json["k1"] = "a";
2✔
3791
    json["k2"] = "b";
2✔
3792
    int i = 0;
3793
    auto it = json.begin();
2✔
3794
    for (;; ++it, ++i) {
4✔
3795
      auto dist = it - json.begin();
6✔
3796
      JSONTEST_ASSERT_EQUAL(i, dist);
6✔
3797
      if (it == json.end())
12✔
3798
        break;
3799
    }
4✔
3800
  }
2✔
3801
  {
3802
    Json::Value empty;
2✔
3803
    JSONTEST_ASSERT_EQUAL(0, empty.end() - empty.end());
4✔
3804
    JSONTEST_ASSERT_EQUAL(0, empty.end() - empty.begin());
4✔
3805
  }
2✔
3806
}
2✔
3807

3808
JSONTEST_FIXTURE_LOCAL(IteratorTest, nullValues) {
12✔
3809
  {
3810
    Json::Value json;
2✔
3811
    auto end = json.end();
2✔
3812
    auto endCopy = end;
2✔
3813
    JSONTEST_ASSERT(endCopy == end);
2✔
3814
    endCopy = end;
2✔
3815
    JSONTEST_ASSERT(endCopy == end);
2✔
3816
  }
2✔
3817
  {
3818
    // Same test, now with const Value.
3819
    const Json::Value json;
2✔
3820
    auto end = json.end();
2✔
3821
    auto endCopy = end;
2✔
3822
    JSONTEST_ASSERT(endCopy == end);
2✔
3823
    endCopy = end;
2✔
3824
    JSONTEST_ASSERT(endCopy == end);
2✔
3825
  }
2✔
3826
}
2✔
3827

3828
JSONTEST_FIXTURE_LOCAL(IteratorTest, staticStringKey) {
12✔
3829
  Json::Value json;
2✔
3830
  json[Json::StaticString("k1")] = "a";
2✔
3831
  JSONTEST_ASSERT_EQUAL(Json::Value("k1"), json.begin().key());
2✔
3832
}
2✔
3833

3834
JSONTEST_FIXTURE_LOCAL(IteratorTest, names) {
12✔
3835
  Json::Value json;
2✔
3836
  json["k1"] = "a";
2✔
3837
  json["k2"] = "b";
2✔
3838
  Json::ValueIterator it = json.begin();
2✔
3839
  JSONTEST_ASSERT(it != json.end());
4✔
3840
  JSONTEST_ASSERT_EQUAL(Json::Value("k1"), it.key());
2✔
3841
  JSONTEST_ASSERT_STRING_EQUAL("k1", it.name());
4✔
3842
  JSONTEST_ASSERT_STRING_EQUAL("k1", it.memberName());
4✔
3843
  JSONTEST_ASSERT_EQUAL(-1, it.index());
2✔
3844
  ++it;
3845
  JSONTEST_ASSERT(it != json.end());
4✔
3846
  JSONTEST_ASSERT_EQUAL(Json::Value("k2"), it.key());
2✔
3847
  JSONTEST_ASSERT_STRING_EQUAL("k2", it.name());
4✔
3848
  JSONTEST_ASSERT_STRING_EQUAL("k2", it.memberName());
4✔
3849
  JSONTEST_ASSERT_EQUAL(-1, it.index());
2✔
3850
  ++it;
3851
  JSONTEST_ASSERT(it == json.end());
4✔
3852
}
2✔
3853

3854
JSONTEST_FIXTURE_LOCAL(IteratorTest, indexes) {
12✔
3855
  Json::Value json;
2✔
3856
  json[0] = "a";
2✔
3857
  json[1] = "b";
2✔
3858
  Json::ValueIterator it = json.begin();
2✔
3859
  JSONTEST_ASSERT(it != json.end());
4✔
3860
  JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(0)), it.key());
2✔
3861
  JSONTEST_ASSERT_STRING_EQUAL("", it.name());
4✔
3862
  JSONTEST_ASSERT_EQUAL(0, it.index());
2✔
3863
  ++it;
3864
  JSONTEST_ASSERT(it != json.end());
4✔
3865
  JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(1)), it.key());
2✔
3866
  JSONTEST_ASSERT_STRING_EQUAL("", it.name());
4✔
3867
  JSONTEST_ASSERT_EQUAL(1, it.index());
2✔
3868
  ++it;
3869
  JSONTEST_ASSERT(it == json.end());
4✔
3870
}
2✔
3871

3872
JSONTEST_FIXTURE_LOCAL(IteratorTest, constness) {
12✔
3873
  Json::Value const v;
2✔
3874
  JSONTEST_ASSERT_THROWS(
2✔
3875
      Json::Value::iterator it(v.begin())); // Compile, but throw.
3876

3877
  Json::Value value;
2✔
3878

3879
  for (int i = 9; i < 12; ++i) {
8✔
3880
    Json::OStringStream out;
6✔
3881
    out << std::setw(2) << i;
6✔
3882
    Json::String str = out.str();
3883
    value[str] = str;
6✔
3884
  }
6✔
3885

3886
  Json::OStringStream out;
2✔
3887
  // in old code, this will get a compile error
3888
  Json::Value::const_iterator iter = value.begin();
2✔
3889
  for (; iter != value.end(); ++iter) {
16✔
3890
    out << *iter << ',';
12✔
3891
  }
3892
  Json::String expected = R"(" 9","10","11",)";
2✔
3893
  JSONTEST_ASSERT_STRING_EQUAL(expected, out.str());
6✔
3894
}
2✔
3895

3896
struct RValueTest : JsonTest::TestCase {};
1✔
3897

3898
JSONTEST_FIXTURE_LOCAL(RValueTest, moveConstruction) {
12✔
3899
  Json::Value json;
2✔
3900
  json["key"] = "value";
2✔
3901
  Json::Value moved = std::move(json);
2✔
3902
  JSONTEST_ASSERT(moved != json); // Possibly not nullValue; definitely not
2✔
3903
                                  // equal.
3904
  JSONTEST_ASSERT_EQUAL(Json::objectValue, moved.type());
2✔
3905
  JSONTEST_ASSERT_EQUAL(Json::stringValue, moved["key"].type());
2✔
3906
}
2✔
3907

3908
struct FuzzTest : JsonTest::TestCase {};
1✔
3909

3910
// Build and run the fuzz test without any fuzzer, so that it's guaranteed not
3911
// go out of date, even if it's never run as an actual fuzz test.
3912
JSONTEST_FIXTURE_LOCAL(FuzzTest, fuzzDoesntCrash) {
12✔
3913
  const std::string example = "{}";
2✔
3914
  JSONTEST_ASSERT_EQUAL(
2✔
3915
      0,
3916
      LLVMFuzzerTestOneInput(reinterpret_cast<const uint8_t*>(example.c_str()),
3917
                             example.size()));
3918
}
2✔
3919

3920
int main(int argc, const char* argv[]) {
1✔
3921
  JsonTest::Runner runner;
1✔
3922

3923
  for (auto& local : local_) {
120✔
3924
    runner.add(local);
119✔
3925
  }
3926

3927
  return runner.runCommandLine(argc, argv);
1✔
3928
}
3929

3930
struct MemberTemplateAs : JsonTest::TestCase {
1✔
3931
  template <typename T, typename F>
3932
  JsonTest::TestResult& EqEval(T v, F f) const {
20✔
3933
    const Json::Value j = v;
20✔
3934
    return JSONTEST_ASSERT_EQUAL(j.as<T>(), f(j));
40✔
3935
  }
20✔
3936
};
3937

3938
JSONTEST_FIXTURE_LOCAL(MemberTemplateAs, BehavesSameAsNamedAs) {
12✔
3939
  const Json::Value jstr = "hello world";
2✔
3940
  JSONTEST_ASSERT_STRING_EQUAL(jstr.as<const char*>(), jstr.asCString());
6✔
3941
  JSONTEST_ASSERT_STRING_EQUAL(jstr.as<Json::String>(), jstr.asString());
6✔
3942
  EqEval(Json::Int(64), [](const Json::Value& j) { return j.asInt(); });
3✔
3943
  EqEval(Json::UInt(64), [](const Json::Value& j) { return j.asUInt(); });
3✔
3944
#if defined(JSON_HAS_INT64)
3945
  EqEval(Json::Int64(64), [](const Json::Value& j) { return j.asInt64(); });
3✔
3946
  EqEval(Json::UInt64(64), [](const Json::Value& j) { return j.asUInt64(); });
3✔
3947
#endif // if defined(JSON_HAS_INT64)
3948
  EqEval(Json::LargestInt(64),
2✔
3949
         [](const Json::Value& j) { return j.asLargestInt(); });
1✔
3950
  EqEval(Json::LargestUInt(64),
2✔
3951
         [](const Json::Value& j) { return j.asLargestUInt(); });
1✔
3952

3953
  EqEval(69.69f, [](const Json::Value& j) { return j.asFloat(); });
3✔
3954
  EqEval(69.69, [](const Json::Value& j) { return j.asDouble(); });
3✔
3955
  EqEval(false, [](const Json::Value& j) { return j.asBool(); });
3✔
3956
  EqEval(true, [](const Json::Value& j) { return j.asBool(); });
3✔
3957
}
2✔
3958

3959
class MemberTemplateIs : public JsonTest::TestCase {};
1✔
3960

3961
JSONTEST_FIXTURE_LOCAL(MemberTemplateIs, BehavesSameAsNamedIs) {
12✔
3962
  const Json::Value values[] = {true, 142, 40.63, "hello world"};
10✔
3963
  for (const Json::Value& j : values) {
10✔
3964
    JSONTEST_ASSERT_EQUAL(j.is<bool>(), j.isBool());
8✔
3965
    JSONTEST_ASSERT_EQUAL(j.is<Json::Int>(), j.isInt());
8✔
3966
    JSONTEST_ASSERT_EQUAL(j.is<Json::Int64>(), j.isInt64());
8✔
3967
    JSONTEST_ASSERT_EQUAL(j.is<Json::UInt>(), j.isUInt());
8✔
3968
    JSONTEST_ASSERT_EQUAL(j.is<Json::UInt64>(), j.isUInt64());
8✔
3969
    JSONTEST_ASSERT_EQUAL(j.is<double>(), j.isDouble());
8✔
3970
    JSONTEST_ASSERT_EQUAL(j.is<Json::String>(), j.isString());
8✔
3971
  }
3972
}
12✔
3973

3974
class VersionTest : public JsonTest::TestCase {};
1✔
3975

3976
JSONTEST_FIXTURE_LOCAL(VersionTest, VersionNumbersMatch) {
12✔
3977
  std::ostringstream vstr;
2✔
3978
  vstr << JSONCPP_VERSION_MAJOR << '.' << JSONCPP_VERSION_MINOR << '.'
4✔
3979
       << JSONCPP_VERSION_PATCH;
2✔
3980
  JSONTEST_ASSERT_EQUAL(vstr.str(), std::string(JSONCPP_VERSION_STRING));
6✔
3981
}
2✔
3982

3983
#if defined(__GNUC__)
3984
#pragma GCC diagnostic pop
3985
#endif
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc