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

dota17 / jsoncpp / 10821679301

12 Sep 2024 12:14AM UTC coverage: 95.295% (+1.5%) from 93.801%
10821679301

push

github

web-flow
Merge branch 'master' into fix-cmake

189 of 212 new or added lines in 8 files covered. (89.15%)

23 existing lines in 5 files now uncovered.

5306 of 5568 relevant lines covered (95.29%)

11935.1 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 std::string stringIdKey = "id";
2✔
224
  const Json::Value* stringFoundId = object1_.find(stringIdKey);
2✔
225
  JSONTEST_ASSERT(stringFoundId != nullptr);
2✔
226
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), *stringFoundId);
2✔
227

228
  const char unknownIdKey[] = "unknown id";
2✔
229
  const Json::Value* foundUnknownId =
230
      object1_.find(unknownIdKey, unknownIdKey + strlen(unknownIdKey));
2✔
231
  JSONTEST_ASSERT_EQUAL(nullptr, foundUnknownId);
2✔
232

233
  const std::string stringUnknownIdKey = "unknown id";
2✔
234
  const Json::Value* stringFoundUnknownId = object1_.find(stringUnknownIdKey);
2✔
235
  JSONTEST_ASSERT_EQUAL(nullptr, stringFoundUnknownId);
2✔
236

237
  // Access through demand()
238
  const char yetAnotherIdKey[] = "yet another id";
2✔
239
  const Json::Value* foundYetAnotherId =
240
      object1_.find(yetAnotherIdKey, yetAnotherIdKey + strlen(yetAnotherIdKey));
2✔
241
  JSONTEST_ASSERT_EQUAL(nullptr, foundYetAnotherId);
2✔
242
  Json::Value* demandedYetAnotherId = object1_.demand(
2✔
243
      yetAnotherIdKey, yetAnotherIdKey + strlen(yetAnotherIdKey));
244
  JSONTEST_ASSERT(demandedYetAnotherId != nullptr);
2✔
245
  *demandedYetAnotherId = "baz";
2✔
246

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

249
  // Access through non-const reference
250
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
2✔
251
  JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
2✔
252

253
  object1_["some other id"] = "foo";
2✔
254
  JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
2✔
255
  JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
2✔
256

257
  // Remove.
258
  Json::Value got;
2✔
259
  bool did;
260
  did = object1_.removeMember("some other id", &got);
2✔
261
  JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
2✔
262
  JSONTEST_ASSERT_EQUAL(true, did);
2✔
263
  got = Json::Value("bar");
2✔
264
  did = object1_.removeMember("some other id", &got);
2✔
265
  JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
2✔
266
  JSONTEST_ASSERT_EQUAL(false, did);
2✔
267

268
  object1_["some other id"] = "foo";
2✔
269
  Json::Value* gotPtr = nullptr;
270
  did = object1_.removeMember("some other id", gotPtr);
2✔
271
  JSONTEST_ASSERT_EQUAL(nullptr, gotPtr);
2✔
272
  JSONTEST_ASSERT_EQUAL(true, did);
2✔
273

274
  // Using other removeMember interfaces, the test idea is the same as above.
275
  object1_["some other id"] = "foo";
2✔
276
  const Json::String key("some other id");
2✔
277
  did = object1_.removeMember(key, &got);
2✔
278
  JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
2✔
279
  JSONTEST_ASSERT_EQUAL(true, did);
2✔
280
  got = Json::Value("bar");
2✔
281
  did = object1_.removeMember(key, &got);
2✔
282
  JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
2✔
283
  JSONTEST_ASSERT_EQUAL(false, did);
2✔
284

285
  object1_["some other id"] = "foo";
2✔
286
  object1_.removeMember(key);
2✔
287
  JSONTEST_ASSERT_EQUAL(Json::nullValue, object1_[key]);
2✔
288
}
4✔
289

290
JSONTEST_FIXTURE_LOCAL(ValueTest, arrays) {
10✔
291
  const unsigned int index0 = 0;
292

293
  // Types
294
  IsCheck checks;
295
  checks.isArray_ = true;
2✔
296
  JSONTEST_ASSERT_PRED(checkIs(emptyArray_, checks));
2✔
297
  JSONTEST_ASSERT_PRED(checkIs(array1_, checks));
2✔
298

299
  JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
2✔
300

301
  // Empty array okay
302
  JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));
2✔
303

304
  // Non-empty array not okay
305
  JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));
2✔
306

307
  // Always okay
308
  JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));
2✔
309

310
  // Never okay
311
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
2✔
312
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
2✔
313
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
2✔
314
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
2✔
315
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
2✔
316
  JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));
2✔
317

318
  // Access through const reference
319
  const Json::Value& constArray = array1_;
320
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
2✔
321
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
2✔
322
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray.front());
2✔
323
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray.back());
2✔
324

325
  // Access through non-const reference
326
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
2✔
327
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
2✔
328
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_.front());
2✔
329
  JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_.back());
2✔
330

331
  array1_[2] = Json::Value(17);
2✔
332
  JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
2✔
333
  JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
2✔
334
  Json::Value got;
2✔
335
  JSONTEST_ASSERT_EQUAL(true, array1_.removeIndex(2, &got));
2✔
336
  JSONTEST_ASSERT_EQUAL(Json::Value(17), got);
2✔
337
  JSONTEST_ASSERT_EQUAL(false, array1_.removeIndex(2, &got)); // gone now
2✔
338
}
2✔
339
JSONTEST_FIXTURE_LOCAL(ValueTest, resizeArray) {
10✔
340
  Json::Value array;
2✔
341
  {
342
    for (Json::ArrayIndex i = 0; i < 10; i++)
22✔
343
      array[i] = i;
20✔
344
    JSONTEST_ASSERT_EQUAL(array.size(), 10);
2✔
345
    // The length set is greater than the length of the array.
346
    array.resize(15);
2✔
347
    JSONTEST_ASSERT_EQUAL(array.size(), 15);
2✔
348

349
    // The length set is less than the length of the array.
350
    array.resize(5);
2✔
351
    JSONTEST_ASSERT_EQUAL(array.size(), 5);
2✔
352

353
    // The length of the array is set to 0.
354
    array.resize(0);
2✔
355
    JSONTEST_ASSERT_EQUAL(array.size(), 0);
2✔
356
  }
357
  {
358
    for (Json::ArrayIndex i = 0; i < 10; i++)
22✔
359
      array[i] = i;
20✔
360
    JSONTEST_ASSERT_EQUAL(array.size(), 10);
2✔
361
    array.clear();
2✔
362
    JSONTEST_ASSERT_EQUAL(array.size(), 0);
2✔
363
  }
364
}
2✔
365

366
JSONTEST_FIXTURE_LOCAL(ValueTest, resizePopulatesAllMissingElements) {
10✔
367
  Json::ArrayIndex n = 10;
368
  Json::Value v;
2✔
369
  v.resize(n);
2✔
370
  JSONTEST_ASSERT_EQUAL(n, v.size());
2✔
371
  JSONTEST_ASSERT_EQUAL(n, std::distance(v.begin(), v.end()));
2✔
372
  JSONTEST_ASSERT_EQUAL(v.front(), Json::Value{});
4✔
373
  JSONTEST_ASSERT_EQUAL(v.back(), Json::Value{});
2✔
374
  for (const Json::Value& e : v)
24✔
375
    JSONTEST_ASSERT_EQUAL(e, Json::Value{});
20✔
376
}
2✔
377

378
JSONTEST_FIXTURE_LOCAL(ValueTest, getArrayValue) {
10✔
379
  Json::Value array;
2✔
380
  for (Json::ArrayIndex i = 0; i < 5; i++)
12✔
381
    array[i] = i;
10✔
382

383
  JSONTEST_ASSERT_EQUAL(array.size(), 5);
2✔
384
  const Json::Value defaultValue(10);
2✔
385
  Json::ArrayIndex index = 0;
386
  for (; index <= 4; index++)
12✔
387
    JSONTEST_ASSERT_EQUAL(index, array.get(index, defaultValue).asInt());
10✔
388

389
  index = 4;
390
  JSONTEST_ASSERT_EQUAL(array.isValidIndex(index), true);
2✔
391
  index = 5;
392
  JSONTEST_ASSERT_EQUAL(array.isValidIndex(index), false);
2✔
393
  JSONTEST_ASSERT_EQUAL(defaultValue, array.get(index, defaultValue));
2✔
394
  JSONTEST_ASSERT_EQUAL(array.isValidIndex(index), false);
2✔
395
}
2✔
396
JSONTEST_FIXTURE_LOCAL(ValueTest, arrayIssue252) {
10✔
397
  int count = 5;
398
  Json::Value root;
2✔
399
  Json::Value item;
2✔
400
  root["array"] = Json::Value::nullSingleton();
2✔
401
  for (int i = 0; i < count; i++) {
12✔
402
    item["a"] = i;
10✔
403
    item["b"] = i;
10✔
404
    root["array"][i] = item;
10✔
405
  }
406
  // JSONTEST_ASSERT_EQUAL(5, root["array"].size());
407
}
2✔
408

409
JSONTEST_FIXTURE_LOCAL(ValueTest, arrayInsertAtRandomIndex) {
10✔
410
  Json::Value array;
2✔
411
  const Json::Value str0("index2");
2✔
412
  const Json::Value str1("index3");
2✔
413
  array.append("index0"); // append rvalue
2✔
414
  array.append("index1");
2✔
415
  array.append(str0); // append lvalue
2✔
416

417
  std::vector<Json::Value*> vec; // storage value address for checking
418
  for (Json::ArrayIndex i = 0; i < 3; i++) {
8✔
419
    vec.push_back(&array[i]);
6✔
420
  }
421
  JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array[0]); // check append
2✔
422
  JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[1]);
2✔
423
  JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[2]);
2✔
424
  JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array.front());
2✔
425
  JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array.back());
2✔
426

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

473
JSONTEST_FIXTURE_LOCAL(ValueTest, null) {
10✔
474
  JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
2✔
475

476
  IsCheck checks;
477
  checks.isNull_ = true;
2✔
478
  JSONTEST_ASSERT_PRED(checkIs(null_, checks));
2✔
479

480
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
2✔
481
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
2✔
482
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
2✔
483
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
2✔
484
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
2✔
485
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
2✔
486
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
2✔
487
  JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));
2✔
488

489
  JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
2✔
490
  JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
2✔
491
  JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
2✔
492
  JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
2✔
493
  JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
2✔
494
  JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
2✔
495
  JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
4✔
496

497
  JSONTEST_ASSERT_EQUAL(Json::Value::nullSingleton(), null_);
2✔
498

499
  // Test using a Value in a boolean context (false iff null)
500
  JSONTEST_ASSERT_EQUAL(null_, false);
2✔
501
  JSONTEST_ASSERT_EQUAL(object1_, true);
2✔
502
  JSONTEST_ASSERT_EQUAL(!null_, true);
2✔
503
  JSONTEST_ASSERT_EQUAL(!object1_, false);
2✔
504
}
2✔
505

506
JSONTEST_FIXTURE_LOCAL(ValueTest, strings) {
10✔
507
  JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
2✔
508

509
  IsCheck checks;
510
  checks.isString_ = true;
2✔
511
  JSONTEST_ASSERT_PRED(checkIs(emptyString_, checks));
2✔
512
  JSONTEST_ASSERT_PRED(checkIs(string_, checks));
2✔
513
  JSONTEST_ASSERT_PRED(checkIs(string1_, checks));
2✔
514

515
  // Empty string okay
516
  JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));
2✔
517

518
  // Non-empty string not okay
519
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));
2✔
520

521
  // Always okay
522
  JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));
2✔
523

524
  // Never okay
525
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
2✔
526
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
2✔
527
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
2✔
528
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
2✔
529
  JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));
2✔
530

531
  JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
4✔
532
  JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
4✔
533
}
2✔
534

535
JSONTEST_FIXTURE_LOCAL(ValueTest, bools) {
10✔
536
  JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
2✔
537

538
  IsCheck checks;
539
  checks.isBool_ = true;
2✔
540
  JSONTEST_ASSERT_PRED(checkIs(false_, checks));
2✔
541
  JSONTEST_ASSERT_PRED(checkIs(true_, checks));
2✔
542

543
  // False okay
544
  JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));
2✔
545

546
  // True not okay
547
  JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));
2✔
548

549
  // Always okay
550
  JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
2✔
551
  JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
2✔
552
  JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
2✔
553
  JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
2✔
554
  JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));
2✔
555

556
  // Never okay
557
  JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
2✔
558
  JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));
2✔
559

560
  JSONTEST_ASSERT_EQUAL(true, true_.asBool());
2✔
561
  JSONTEST_ASSERT_EQUAL(1, true_.asInt());
2✔
562
  JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
2✔
563
  JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
2✔
564
  JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
2✔
565
  JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
2✔
566
  JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());
2✔
567

568
  JSONTEST_ASSERT_EQUAL(false, false_.asBool());
2✔
569
  JSONTEST_ASSERT_EQUAL(0, false_.asInt());
2✔
570
  JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
2✔
571
  JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
2✔
572
  JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
2✔
573
  JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
2✔
574
  JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
2✔
575
}
2✔
576

577
JSONTEST_FIXTURE_LOCAL(ValueTest, integers) {
10✔
578
  IsCheck checks;
579
  Json::Value val;
2✔
580

581
  // Conversions that don't depend on the value.
582
  JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
2✔
583
  JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
2✔
584
  JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
2✔
585
  JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
2✔
586
  JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));
2✔
587

588
  JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
2✔
589
  JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
2✔
590
  JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
2✔
591
  JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
2✔
592
  JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));
2✔
593

594
  JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
2✔
595
  JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
2✔
596
  JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
2✔
597
  JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
2✔
598
  JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));
2✔
599

600
  // Default int
601
  val = Json::Value(Json::intValue);
2✔
602

603
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
604

605
  checks = IsCheck();
2✔
606
  checks.isInt_ = true;
2✔
607
  checks.isInt64_ = true;
2✔
608
  checks.isUInt_ = true;
2✔
609
  checks.isUInt64_ = true;
2✔
610
  checks.isIntegral_ = true;
2✔
611
  checks.isDouble_ = true;
2✔
612
  checks.isNumeric_ = true;
2✔
613
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
614

615
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
616
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
617
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
618

619
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
620
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
621
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
622
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
623
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
624
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
625
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
626
  JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
4✔
627

628
  // Default uint
629
  val = Json::Value(Json::uintValue);
2✔
630

631
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
632

633
  checks = IsCheck();
2✔
634
  checks.isInt_ = true;
2✔
635
  checks.isInt64_ = true;
2✔
636
  checks.isUInt_ = true;
2✔
637
  checks.isUInt64_ = true;
2✔
638
  checks.isIntegral_ = true;
2✔
639
  checks.isDouble_ = true;
2✔
640
  checks.isNumeric_ = true;
2✔
641
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
642

643
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
644
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
645
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
646

647
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
648
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
649
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
650
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
651
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
652
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
653
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
654
  JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
4✔
655

656
  // Default real
657
  val = Json::Value(Json::realValue);
2✔
658

659
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
660

661
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
662
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
663
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
664

665
  checks = IsCheck();
2✔
666
  checks.isInt_ = true;
2✔
667
  checks.isInt64_ = true;
2✔
668
  checks.isUInt_ = true;
2✔
669
  checks.isUInt64_ = true;
2✔
670
  checks.isIntegral_ = true;
2✔
671
  checks.isDouble_ = true;
2✔
672
  checks.isNumeric_ = true;
2✔
673
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
674

675
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
676
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
677
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
678
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
679
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
680
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
681
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
682
  JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
6✔
683

684
  // Zero (signed constructor arg)
685
  val = Json::Value(0);
2✔
686

687
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
688

689
  checks = IsCheck();
2✔
690
  checks.isInt_ = true;
2✔
691
  checks.isInt64_ = true;
2✔
692
  checks.isUInt_ = true;
2✔
693
  checks.isUInt64_ = true;
2✔
694
  checks.isIntegral_ = true;
2✔
695
  checks.isDouble_ = true;
2✔
696
  checks.isNumeric_ = true;
2✔
697
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
698

699
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
700
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
701
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
702

703
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
704
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
705
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
706
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
707
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
708
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
709
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
710
  JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
4✔
711

712
  // Zero (unsigned constructor arg)
713
  val = Json::Value(0u);
2✔
714

715
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
716

717
  checks = IsCheck();
2✔
718
  checks.isInt_ = true;
2✔
719
  checks.isInt64_ = true;
2✔
720
  checks.isUInt_ = true;
2✔
721
  checks.isUInt64_ = true;
2✔
722
  checks.isIntegral_ = true;
2✔
723
  checks.isDouble_ = true;
2✔
724
  checks.isNumeric_ = true;
2✔
725
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
726

727
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
728
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
729
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
730

731
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
732
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
733
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
734
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
735
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
736
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
737
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
738
  JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
4✔
739

740
  // Zero (floating-point constructor arg)
741
  val = Json::Value(0.0);
2✔
742

743
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
744

745
  checks = IsCheck();
2✔
746
  checks.isInt_ = true;
2✔
747
  checks.isInt64_ = true;
2✔
748
  checks.isUInt_ = true;
2✔
749
  checks.isUInt64_ = true;
2✔
750
  checks.isIntegral_ = true;
2✔
751
  checks.isDouble_ = true;
2✔
752
  checks.isNumeric_ = true;
2✔
753
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
754

755
  JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
2✔
756
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
757
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
758

759
  JSONTEST_ASSERT_EQUAL(0, val.asInt());
2✔
760
  JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
2✔
761
  JSONTEST_ASSERT_EQUAL(0, val.asUInt());
2✔
762
  JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
2✔
763
  JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
2✔
764
  JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
2✔
765
  JSONTEST_ASSERT_EQUAL(false, val.asBool());
2✔
766
  JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
6✔
767

768
  // 2^20 (signed constructor arg)
769
  val = Json::Value(1 << 20);
2✔
770

771
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
772
  checks = IsCheck();
2✔
773
  checks.isInt_ = true;
2✔
774
  checks.isInt64_ = true;
2✔
775
  checks.isUInt_ = true;
2✔
776
  checks.isUInt64_ = true;
2✔
777
  checks.isIntegral_ = true;
2✔
778
  checks.isDouble_ = true;
2✔
779
  checks.isNumeric_ = true;
2✔
780
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
781

782
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
783
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
784
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
785

786
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
2✔
787
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
2✔
788
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
2✔
789
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
2✔
790
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
2✔
791
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
2✔
792
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
793
  JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
4✔
794

795
  // 2^20 (unsigned constructor arg)
796
  val = Json::Value(Json::UInt(1 << 20));
2✔
797

798
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
799

800
  checks = IsCheck();
2✔
801
  checks.isInt_ = true;
2✔
802
  checks.isInt64_ = true;
2✔
803
  checks.isUInt_ = true;
2✔
804
  checks.isUInt64_ = true;
2✔
805
  checks.isIntegral_ = true;
2✔
806
  checks.isDouble_ = true;
2✔
807
  checks.isNumeric_ = true;
2✔
808
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
809

810
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
811
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
812
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
813

814
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
2✔
815
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
2✔
816
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
2✔
817
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
2✔
818
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
2✔
819
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
2✔
820
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
821
  JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
4✔
822

823
  // 2^20 (floating-point constructor arg)
824
  val = Json::Value((1 << 20) / 1.0);
2✔
825

826
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
827

828
  checks = IsCheck();
2✔
829
  checks.isInt_ = true;
2✔
830
  checks.isInt64_ = true;
2✔
831
  checks.isUInt_ = true;
2✔
832
  checks.isUInt64_ = true;
2✔
833
  checks.isIntegral_ = true;
2✔
834
  checks.isDouble_ = true;
2✔
835
  checks.isNumeric_ = true;
2✔
836
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
837

838
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
839
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
840
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
841

842
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
2✔
843
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
2✔
844
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
2✔
845
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
2✔
846
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
2✔
847
  JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
2✔
848
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
849
  JSONTEST_ASSERT_STRING_EQUAL(
6✔
850
      "1048576.0",
851
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
852

853
  // -2^20
854
  val = Json::Value(-(1 << 20));
2✔
855

856
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
857

858
  checks = IsCheck();
2✔
859
  checks.isInt_ = true;
2✔
860
  checks.isInt64_ = true;
2✔
861
  checks.isIntegral_ = true;
2✔
862
  checks.isDouble_ = true;
2✔
863
  checks.isNumeric_ = true;
2✔
864
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
865

866
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
867
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
868
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
869

870
  JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
2✔
871
  JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
2✔
872
  JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
2✔
873
  JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
2✔
874
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
875
  JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
4✔
876

877
  // int32 max
878
  val = Json::Value(kint32max);
2✔
879

880
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
881

882
  checks = IsCheck();
2✔
883
  checks.isInt_ = true;
2✔
884
  checks.isInt64_ = true;
2✔
885
  checks.isUInt_ = true;
2✔
886
  checks.isUInt64_ = true;
2✔
887
  checks.isIntegral_ = true;
2✔
888
  checks.isDouble_ = true;
2✔
889
  checks.isNumeric_ = true;
2✔
890
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
891

892
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
893
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
894
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
895

896
  JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
2✔
897
  JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
2✔
898
  JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
2✔
899
  JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
2✔
900
  JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
2✔
901
  JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
2✔
902
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
903
  JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
4✔
904

905
  // int32 min
906
  val = Json::Value(kint32min);
2✔
907

908
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
909

910
  checks = IsCheck();
2✔
911
  checks.isInt_ = true;
2✔
912
  checks.isInt64_ = true;
2✔
913
  checks.isIntegral_ = true;
2✔
914
  checks.isDouble_ = true;
2✔
915
  checks.isNumeric_ = true;
2✔
916
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
917

918
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
919
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
920
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
921

922
  JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
2✔
923
  JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
2✔
924
  JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
2✔
925
  JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
2✔
926
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
927
  JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
4✔
928

929
  // uint32 max
930
  val = Json::Value(kuint32max);
2✔
931

932
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
933

934
  checks = IsCheck();
2✔
935
  checks.isInt64_ = true;
2✔
936
  checks.isUInt_ = true;
2✔
937
  checks.isUInt64_ = true;
2✔
938
  checks.isIntegral_ = true;
2✔
939
  checks.isDouble_ = true;
2✔
940
  checks.isNumeric_ = true;
2✔
941
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
942

943
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
944
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
945
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
946

947
#ifndef JSON_NO_INT64
948
  JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
2✔
949
#endif
950
  JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
2✔
951
  JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
2✔
952
  JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
2✔
953
  JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
2✔
954
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
955
  JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
4✔
956

957
#ifdef JSON_NO_INT64
958
  // int64 max
959
  val = Json::Value(double(kint64max));
960

961
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
962

963
  checks = IsCheck();
964
  checks.isDouble_ = true;
965
  checks.isNumeric_ = true;
966
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
967

968
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
969
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
970
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
971

972
  JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
973
  JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
974
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
975
  JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
976

977
  // int64 min
978
  val = Json::Value(double(kint64min));
979

980
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
981

982
  checks = IsCheck();
983
  checks.isDouble_ = true;
984
  checks.isNumeric_ = true;
985
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
986

987
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
988
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
989
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
990

991
  JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
992
  JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
993
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
994
  JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
995

996
  // uint64 max
997
  val = Json::Value(double(kuint64max));
998

999
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1000

1001
  checks = IsCheck();
1002
  checks.isDouble_ = true;
1003
  checks.isNumeric_ = true;
1004
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
1005

1006
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1007
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1008
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1009

1010
  JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
1011
  JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
1012
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
1013
  JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
1014
#else // ifdef JSON_NO_INT64
1015
  // 2^40 (signed constructor arg)
1016
  val = Json::Value(Json::Int64(1) << 40);
2✔
1017

1018
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
1019

1020
  checks = IsCheck();
2✔
1021
  checks.isInt64_ = true;
2✔
1022
  checks.isUInt64_ = true;
2✔
1023
  checks.isIntegral_ = true;
2✔
1024
  checks.isDouble_ = true;
2✔
1025
  checks.isNumeric_ = true;
2✔
1026
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1027

1028
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1029
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1030
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1031

1032
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
2✔
1033
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
2✔
1034
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
2✔
1035
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
2✔
1036
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
2✔
1037
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
2✔
1038
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1039
  JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
4✔
1040

1041
  // 2^40 (unsigned constructor arg)
1042
  val = Json::Value(Json::UInt64(1) << 40);
2✔
1043

1044
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
1045

1046
  checks = IsCheck();
2✔
1047
  checks.isInt64_ = true;
2✔
1048
  checks.isUInt64_ = true;
2✔
1049
  checks.isIntegral_ = true;
2✔
1050
  checks.isDouble_ = true;
2✔
1051
  checks.isNumeric_ = true;
2✔
1052
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1053

1054
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1055
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1056
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1057

1058
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
2✔
1059
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
2✔
1060
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
2✔
1061
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
2✔
1062
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
2✔
1063
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
2✔
1064
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1065
  JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
4✔
1066

1067
  // 2^40 (floating-point constructor arg)
1068
  val = Json::Value((Json::Int64(1) << 40) / 1.0);
2✔
1069

1070
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1071

1072
  checks = IsCheck();
2✔
1073
  checks.isInt64_ = true;
2✔
1074
  checks.isUInt64_ = true;
2✔
1075
  checks.isIntegral_ = true;
2✔
1076
  checks.isDouble_ = true;
2✔
1077
  checks.isNumeric_ = true;
2✔
1078
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1079

1080
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1081
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1082
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1083

1084
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
2✔
1085
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
2✔
1086
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
2✔
1087
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
2✔
1088
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
2✔
1089
  JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
2✔
1090
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1091
  JSONTEST_ASSERT_STRING_EQUAL(
6✔
1092
      "1099511627776.0",
1093
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1094

1095
  // -2^40
1096
  val = Json::Value(-(Json::Int64(1) << 40));
2✔
1097

1098
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
1099

1100
  checks = IsCheck();
2✔
1101
  checks.isInt64_ = true;
2✔
1102
  checks.isIntegral_ = true;
2✔
1103
  checks.isDouble_ = true;
2✔
1104
  checks.isNumeric_ = true;
2✔
1105
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1106

1107
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1108
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1109
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1110

1111
  JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
2✔
1112
  JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
2✔
1113
  JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
2✔
1114
  JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
2✔
1115
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1116
  JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
4✔
1117

1118
  // int64 max
1119
  val = Json::Value(Json::Int64(kint64max));
2✔
1120

1121
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
1122

1123
  checks = IsCheck();
2✔
1124
  checks.isInt64_ = true;
2✔
1125
  checks.isUInt64_ = true;
2✔
1126
  checks.isIntegral_ = true;
2✔
1127
  checks.isDouble_ = true;
2✔
1128
  checks.isNumeric_ = true;
2✔
1129
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1130

1131
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1132
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1133
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1134

1135
  JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
2✔
1136
  JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
2✔
1137
  JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
2✔
1138
  JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
2✔
1139
  JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
2✔
1140
  JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
2✔
1141
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1142
  JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
6✔
1143

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

1148
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1149

1150
  checks = IsCheck();
2✔
1151
  checks.isUInt64_ = true;
2✔
1152
  checks.isIntegral_ = true;
2✔
1153
  checks.isDouble_ = true;
2✔
1154
  checks.isNumeric_ = true;
2✔
1155
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1156

1157
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1158
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1159
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1160

1161
  JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
2✔
1162
  JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
2✔
1163
  JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
2✔
1164
  JSONTEST_ASSERT_EQUAL(float(Json::UInt64(1) << 63), val.asFloat());
2✔
1165

1166
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1167
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1168
      "9.2233720368547758e+18",
1169
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1170

1171
  // int64 min
1172
  val = Json::Value(Json::Int64(kint64min));
2✔
1173

1174
  JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
2✔
1175

1176
  checks = IsCheck();
2✔
1177
  checks.isInt64_ = true;
2✔
1178
  checks.isIntegral_ = true;
2✔
1179
  checks.isDouble_ = true;
2✔
1180
  checks.isNumeric_ = true;
2✔
1181
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1182

1183
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1184
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1185
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1186

1187
  JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
2✔
1188
  JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
2✔
1189
  JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
2✔
1190
  JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
2✔
1191
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1192
  JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
6✔
1193

1194
  // int64 min (floating point constructor). Since double values in proximity of
1195
  // kint64min are rounded to kint64min, we don't check for conversion to int64.
1196
  val = Json::Value(double(kint64min));
2✔
1197

1198
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1199

1200
  checks = IsCheck();
2✔
1201
  checks.isDouble_ = true;
2✔
1202
  checks.isNumeric_ = true;
2✔
1203
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1204

1205
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1206
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1207
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1208

1209
  JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
2✔
1210
  JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
2✔
1211
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1212
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1213
      "-9.2233720368547758e+18",
1214
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1215

1216
  // 10^19
1217
  const auto ten_to_19 = static_cast<Json::UInt64>(1e19);
1218
  val = Json::Value(Json::UInt64(ten_to_19));
2✔
1219

1220
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
1221

1222
  checks = IsCheck();
2✔
1223
  checks.isUInt64_ = true;
2✔
1224
  checks.isIntegral_ = true;
2✔
1225
  checks.isDouble_ = true;
2✔
1226
  checks.isNumeric_ = true;
2✔
1227
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1228

1229
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1230
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1231
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1232

1233
  JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
2✔
1234
  JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
2✔
1235
  JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
2✔
1236
  JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
2✔
1237
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1238
  JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
6✔
1239

1240
  // 10^19 (double constructor). Note that 10^19 is not exactly representable
1241
  // as a double.
1242
  val = Json::Value(uint64ToDouble(ten_to_19));
2✔
1243

1244
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1245

1246
  checks = IsCheck();
2✔
1247
  checks.isUInt64_ = true;
2✔
1248
  checks.isIntegral_ = true;
2✔
1249
  checks.isDouble_ = true;
2✔
1250
  checks.isNumeric_ = true;
2✔
1251
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1252

1253
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1254
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1255
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1256

1257
  JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
2✔
1258
  JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
2✔
1259
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1260
  JSONTEST_ASSERT_STRING_EQUAL(
6✔
1261
      "1e+19",
1262
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1263

1264
  // uint64 max
1265
  val = Json::Value(Json::UInt64(kuint64max));
2✔
1266

1267
  JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
2✔
1268

1269
  checks = IsCheck();
2✔
1270
  checks.isUInt64_ = true;
2✔
1271
  checks.isIntegral_ = true;
2✔
1272
  checks.isDouble_ = true;
2✔
1273
  checks.isNumeric_ = true;
2✔
1274
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1275

1276
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1277
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1278
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1279

1280
  JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
2✔
1281
  JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
2✔
1282
  JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
2✔
1283
  JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
2✔
1284
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1285
  JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
6✔
1286

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

1291
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1292

1293
  checks = IsCheck();
2✔
1294
  checks.isDouble_ = true;
2✔
1295
  checks.isNumeric_ = true;
2✔
1296
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1297

1298
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1299
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1300
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1301

1302
  JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
2✔
1303
  JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
2✔
1304
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1305
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1306
      "1.8446744073709552e+19",
1307
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1308
#endif
1309
}
2✔
1310

1311
JSONTEST_FIXTURE_LOCAL(ValueTest, nonIntegers) {
10✔
1312
  IsCheck checks;
1313
  Json::Value val;
2✔
1314

1315
  // Small positive number
1316
  val = Json::Value(1.5);
2✔
1317

1318
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1319

1320
  checks = IsCheck();
2✔
1321
  checks.isDouble_ = true;
2✔
1322
  checks.isNumeric_ = true;
2✔
1323
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1324

1325
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
1326
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
1327
  JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
2✔
1328
  JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
2✔
1329
  JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
2✔
1330
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1331
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
2✔
1332
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
2✔
1333

1334
  JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
2✔
1335
  JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
2✔
1336
  JSONTEST_ASSERT_EQUAL(1, val.asInt());
2✔
1337
  JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
2✔
1338
  JSONTEST_ASSERT_EQUAL(1, val.asUInt());
2✔
1339
  JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
2✔
1340
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1341
  JSONTEST_ASSERT_EQUAL("1.5", val.asString());
2✔
1342

1343
  // Small negative number
1344
  val = Json::Value(-1.5);
2✔
1345

1346
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1347

1348
  checks = IsCheck();
2✔
1349
  checks.isDouble_ = true;
2✔
1350
  checks.isNumeric_ = true;
2✔
1351
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1352

1353
  JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
2✔
1354
  JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
2✔
1355
  JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
2✔
1356
  JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
2✔
1357
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1358
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1359
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
2✔
1360
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
2✔
1361

1362
  JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
2✔
1363
  JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
2✔
1364
  JSONTEST_ASSERT_EQUAL(-1, val.asInt());
2✔
1365
  JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
2✔
1366
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1367
  JSONTEST_ASSERT_EQUAL("-1.5", val.asString());
2✔
1368

1369
  // A bit over int32 max
1370
  val = Json::Value(kint32max + 0.5);
2✔
1371

1372
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1373

1374
  checks = IsCheck();
2✔
1375
  checks.isDouble_ = true;
2✔
1376
  checks.isNumeric_ = true;
2✔
1377
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1378

1379
  JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
2✔
1380
  JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
2✔
1381
  JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
2✔
1382
  JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
2✔
1383
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1384
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1385
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
2✔
1386
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
2✔
1387

1388
  JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
2✔
1389
  JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
2✔
1390
  JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
2✔
1391
#ifdef JSON_HAS_INT64
1392
  JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
2✔
1393
  JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
2✔
1394
#endif
1395
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1396
  JSONTEST_ASSERT_EQUAL(
6✔
1397
      "2147483647.5",
1398
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1399

1400
  // A bit under int32 min
1401
  val = Json::Value(kint32min - 0.5);
2✔
1402

1403
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1404

1405
  checks = IsCheck();
2✔
1406
  checks.isDouble_ = true;
2✔
1407
  checks.isNumeric_ = true;
2✔
1408
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1409

1410
  JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
2✔
1411
  JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
2✔
1412
  JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
2✔
1413
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1414
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1415
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1416
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
2✔
1417
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
2✔
1418

1419
  JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
2✔
1420
  JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
2✔
1421
#ifdef JSON_HAS_INT64
1422
  JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 31), val.asLargestInt());
2✔
1423
#endif
1424
  JSONTEST_ASSERT_EQUAL(true, val.asBool());
2✔
1425
  JSONTEST_ASSERT_EQUAL(
6✔
1426
      "-2147483648.5",
1427
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1428

1429
  // A bit over uint32 max
1430
  val = Json::Value(kuint32max + 0.5);
2✔
1431

1432
  JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
2✔
1433

1434
  checks = IsCheck();
2✔
1435
  checks.isDouble_ = true;
2✔
1436
  checks.isNumeric_ = true;
2✔
1437
  JSONTEST_ASSERT_PRED(checkIs(val, checks));
2✔
1438

1439
  JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
2✔
1440
  JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
2✔
1441
  JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
2✔
1442
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
2✔
1443
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
2✔
1444
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
2✔
1445
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
2✔
1446
  JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
2✔
1447

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

1460
  val = Json::Value(1.2345678901234);
2✔
1461
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1462
      "1.2345678901234001",
1463
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1464

1465
  // A 16-digit floating point number.
1466
  val = Json::Value(2199023255552000.0f);
2✔
1467
  JSONTEST_ASSERT_EQUAL(float(2199023255552000.0f), val.asFloat());
2✔
1468
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1469
      "2199023255552000.0",
1470
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1471

1472
  // A very large floating point number.
1473
  val = Json::Value(3.402823466385289e38);
2✔
1474
  JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
2✔
1475
  JSONTEST_ASSERT_STRING_EQUAL(
8✔
1476
      "3.402823466385289e+38",
1477
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1478

1479
  // An even larger floating point number.
1480
  val = Json::Value(1.2345678e300);
2✔
1481
  JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
2✔
1482
  JSONTEST_ASSERT_STRING_EQUAL(
6✔
1483
      "1.2345678e+300",
1484
      normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1485
}
2✔
1486

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

1497
void ValueTest::checkMemberCount(Json::Value& value,
15✔
1498
                                 unsigned int expectedCount) {
1499
  JSONTEST_ASSERT_EQUAL(expectedCount, value.size());
15✔
1500

1501
  unsigned int count = 0;
1502
  Json::Value::iterator itEnd = value.end();
15✔
1503
  for (Json::Value::iterator it = value.begin(); it != itEnd; ++it) {
32✔
1504
    ++count;
2✔
1505
  }
1506
  JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::iterator";
15✔
1507

1508
  JSONTEST_ASSERT_PRED(checkConstMemberCount(value, expectedCount));
15✔
1509
}
15✔
1510

1511
ValueTest::IsCheck::IsCheck() = default;
7✔
1512

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

1525
#ifdef JSON_HAS_INT64
1526
  JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64());
40✔
1527
  JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64());
40✔
1528
#else
1529
  JSONTEST_ASSERT_EQUAL(false, value.isInt64());
1530
  JSONTEST_ASSERT_EQUAL(false, value.isUInt64());
1531
#endif
1532
}
40✔
1533

1534
JSONTEST_FIXTURE_LOCAL(ValueTest, compareNull) {
10✔
1535
  JSONTEST_ASSERT_PRED(checkIsEqual(Json::Value(), Json::Value()));
2✔
1536
  JSONTEST_ASSERT_PRED(
2✔
1537
      checkIsEqual(Json::Value::nullSingleton(), Json::Value()));
1538
  JSONTEST_ASSERT_PRED(
2✔
1539
      checkIsEqual(Json::Value::nullSingleton(), Json::Value::nullSingleton()));
1540
}
2✔
1541

1542
JSONTEST_FIXTURE_LOCAL(ValueTest, compareInt) {
10✔
1543
  JSONTEST_ASSERT_PRED(checkIsLess(0, 10));
2✔
1544
  JSONTEST_ASSERT_PRED(checkIsEqual(10, 10));
2✔
1545
  JSONTEST_ASSERT_PRED(checkIsEqual(-10, -10));
2✔
1546
  JSONTEST_ASSERT_PRED(checkIsLess(-10, 0));
2✔
1547
}
2✔
1548

1549
JSONTEST_FIXTURE_LOCAL(ValueTest, compareUInt) {
10✔
1550
  JSONTEST_ASSERT_PRED(checkIsLess(0u, 10u));
2✔
1551
  JSONTEST_ASSERT_PRED(checkIsLess(0u, Json::Value::maxUInt));
2✔
1552
  JSONTEST_ASSERT_PRED(checkIsEqual(10u, 10u));
2✔
1553
}
2✔
1554

1555
JSONTEST_FIXTURE_LOCAL(ValueTest, compareDouble) {
10✔
1556
  JSONTEST_ASSERT_PRED(checkIsLess(0.0, 10.0));
2✔
1557
  JSONTEST_ASSERT_PRED(checkIsEqual(10.0, 10.0));
2✔
1558
  JSONTEST_ASSERT_PRED(checkIsEqual(-10.0, -10.0));
2✔
1559
  JSONTEST_ASSERT_PRED(checkIsLess(-10.0, 0.0));
2✔
1560
}
2✔
1561

1562
JSONTEST_FIXTURE_LOCAL(ValueTest, compareString) {
10✔
1563
  JSONTEST_ASSERT_PRED(checkIsLess("", " "));
2✔
1564
  JSONTEST_ASSERT_PRED(checkIsLess("", "a"));
2✔
1565
  JSONTEST_ASSERT_PRED(checkIsLess("abcd", "zyui"));
2✔
1566
  JSONTEST_ASSERT_PRED(checkIsLess("abc", "abcd"));
2✔
1567
  JSONTEST_ASSERT_PRED(checkIsEqual("abcd", "abcd"));
2✔
1568
  JSONTEST_ASSERT_PRED(checkIsEqual(" ", " "));
2✔
1569
  JSONTEST_ASSERT_PRED(checkIsLess("ABCD", "abcd"));
2✔
1570
  JSONTEST_ASSERT_PRED(checkIsEqual("ABCD", "ABCD"));
2✔
1571
}
2✔
1572

1573
JSONTEST_FIXTURE_LOCAL(ValueTest, compareBoolean) {
10✔
1574
  JSONTEST_ASSERT_PRED(checkIsLess(false, true));
2✔
1575
  JSONTEST_ASSERT_PRED(checkIsEqual(false, false));
2✔
1576
  JSONTEST_ASSERT_PRED(checkIsEqual(true, true));
2✔
1577
}
2✔
1578

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

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

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

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

1712
void ValueTest::checkIsLess(const Json::Value& x, const Json::Value& y) {
31✔
1713
  JSONTEST_ASSERT(x < y);
31✔
1714
  JSONTEST_ASSERT(y > x);
31✔
1715
  JSONTEST_ASSERT(x <= y);
31✔
1716
  JSONTEST_ASSERT(y >= x);
31✔
1717
  JSONTEST_ASSERT(!(x == y));
31✔
1718
  JSONTEST_ASSERT(!(y == x));
31✔
1719
  JSONTEST_ASSERT(!(x >= y));
31✔
1720
  JSONTEST_ASSERT(!(y <= x));
31✔
1721
  JSONTEST_ASSERT(!(x > y));
31✔
1722
  JSONTEST_ASSERT(!(y < x));
31✔
1723
  JSONTEST_ASSERT(x.compare(y) < 0);
31✔
1724
  JSONTEST_ASSERT(y.compare(x) >= 0);
31✔
1725
}
31✔
1726

1727
void ValueTest::checkIsEqual(const Json::Value& x, const Json::Value& y) {
29✔
1728
  JSONTEST_ASSERT(x == y);
29✔
1729
  JSONTEST_ASSERT(y == x);
29✔
1730
  JSONTEST_ASSERT(x <= y);
29✔
1731
  JSONTEST_ASSERT(y <= x);
29✔
1732
  JSONTEST_ASSERT(x >= y);
29✔
1733
  JSONTEST_ASSERT(y >= x);
29✔
1734
  JSONTEST_ASSERT(!(x < y));
29✔
1735
  JSONTEST_ASSERT(!(y < x));
29✔
1736
  JSONTEST_ASSERT(!(x > y));
29✔
1737
  JSONTEST_ASSERT(!(y > x));
29✔
1738
  JSONTEST_ASSERT(x.compare(y) == 0);
29✔
1739
  JSONTEST_ASSERT(y.compare(x) == 0);
29✔
1740
}
29✔
1741

1742
JSONTEST_FIXTURE_LOCAL(ValueTest, typeChecksThrowExceptions) {
10✔
1743
#if JSON_USE_EXCEPTION
1744

1745
  Json::Value intVal(1);
2✔
1746
  Json::Value strVal("Test");
2✔
1747
  Json::Value objVal(Json::objectValue);
2✔
1748
  Json::Value arrVal(Json::arrayValue);
2✔
1749

1750
  JSONTEST_ASSERT_THROWS(intVal["test"]);
2✔
1751
  JSONTEST_ASSERT_THROWS(strVal["test"]);
2✔
1752
  JSONTEST_ASSERT_THROWS(arrVal["test"]);
2✔
1753

1754
  JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
2✔
1755
  JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
2✔
1756
  JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
2✔
1757

1758
  JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
2✔
1759
  JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
2✔
1760
  JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
2✔
1761

1762
  JSONTEST_ASSERT_THROWS(intVal[0]);
2✔
1763
  JSONTEST_ASSERT_THROWS(objVal[0]);
2✔
1764
  JSONTEST_ASSERT_THROWS(strVal[0]);
2✔
1765

1766
  JSONTEST_ASSERT_THROWS(intVal.clear());
2✔
1767

1768
  JSONTEST_ASSERT_THROWS(intVal.resize(1));
2✔
1769
  JSONTEST_ASSERT_THROWS(strVal.resize(1));
2✔
1770
  JSONTEST_ASSERT_THROWS(objVal.resize(1));
2✔
1771

1772
  JSONTEST_ASSERT_THROWS(intVal.asCString());
2✔
1773

1774
  JSONTEST_ASSERT_THROWS(objVal.asString());
2✔
1775
  JSONTEST_ASSERT_THROWS(arrVal.asString());
2✔
1776

1777
  JSONTEST_ASSERT_THROWS(strVal.asInt());
2✔
1778
  JSONTEST_ASSERT_THROWS(objVal.asInt());
2✔
1779
  JSONTEST_ASSERT_THROWS(arrVal.asInt());
2✔
1780

1781
  JSONTEST_ASSERT_THROWS(strVal.asUInt());
2✔
1782
  JSONTEST_ASSERT_THROWS(objVal.asUInt());
2✔
1783
  JSONTEST_ASSERT_THROWS(arrVal.asUInt());
2✔
1784

1785
  JSONTEST_ASSERT_THROWS(strVal.asInt64());
2✔
1786
  JSONTEST_ASSERT_THROWS(objVal.asInt64());
2✔
1787
  JSONTEST_ASSERT_THROWS(arrVal.asInt64());
2✔
1788

1789
  JSONTEST_ASSERT_THROWS(strVal.asUInt64());
2✔
1790
  JSONTEST_ASSERT_THROWS(objVal.asUInt64());
2✔
1791
  JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
2✔
1792

1793
  JSONTEST_ASSERT_THROWS(strVal.asDouble());
2✔
1794
  JSONTEST_ASSERT_THROWS(objVal.asDouble());
2✔
1795
  JSONTEST_ASSERT_THROWS(arrVal.asDouble());
2✔
1796

1797
  JSONTEST_ASSERT_THROWS(strVal.asFloat());
2✔
1798
  JSONTEST_ASSERT_THROWS(objVal.asFloat());
2✔
1799
  JSONTEST_ASSERT_THROWS(arrVal.asFloat());
2✔
1800

1801
  JSONTEST_ASSERT_THROWS(strVal.asBool());
2✔
1802
  JSONTEST_ASSERT_THROWS(objVal.asBool());
2✔
1803
  JSONTEST_ASSERT_THROWS(arrVal.asBool());
2✔
1804

1805
#endif
1806
}
2✔
1807

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

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

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

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

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

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

1970
JSONTEST_FIXTURE_LOCAL(ValueTest, specialFloats) {
10✔
1971
  Json::StreamWriterBuilder b;
2✔
1972
  b.settings_["useSpecialFloats"] = true;
2✔
1973

1974
  Json::Value v = std::numeric_limits<double>::quiet_NaN();
2✔
1975
  Json::String expected = "NaN";
2✔
1976
  Json::String result = Json::writeString(b, v);
2✔
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

1984
  v = -std::numeric_limits<double>::infinity();
2✔
1985
  expected = "-Infinity";
1986
  result = Json::writeString(b, v);
4✔
1987
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
1988
}
2✔
1989

1990
JSONTEST_FIXTURE_LOCAL(ValueTest, precision) {
10✔
1991
  Json::StreamWriterBuilder b;
2✔
1992
  b.settings_["precision"] = 5;
2✔
1993

1994
  Json::Value v = 100.0 / 3;
2✔
1995
  Json::String expected = "33.333";
2✔
1996
  Json::String result = Json::writeString(b, v);
2✔
1997
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
1998

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

2004
  v = 0.2563456;
2✔
2005
  expected = "0.25635";
2006
  result = Json::writeString(b, v);
4✔
2007
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2008

2009
  b.settings_["precision"] = 1;
2✔
2010
  expected = "0.3";
2011
  result = Json::writeString(b, v);
4✔
2012
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2013

2014
  b.settings_["precision"] = 17;
2✔
2015
  v = 1234857476305.256345694873740545068;
2✔
2016
  expected = "1234857476305.2563";
2017
  result = Json::writeString(b, v);
4✔
2018
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2019

2020
  b.settings_["precision"] = 24;
2✔
2021
  v = 0.256345694873740545068;
2✔
2022
  expected = "0.25634569487374054";
2023
  result = Json::writeString(b, v);
4✔
2024
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2025

2026
  b.settings_["precision"] = 5;
2✔
2027
  b.settings_["precisionType"] = "decimal";
2✔
2028
  v = 0.256345694873740545068;
2✔
2029
  expected = "0.25635";
2030
  result = Json::writeString(b, v);
4✔
2031
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2032

2033
  b.settings_["precision"] = 1;
2✔
2034
  b.settings_["precisionType"] = "decimal";
2✔
2035
  v = 0.256345694873740545068;
2✔
2036
  expected = "0.3";
2037
  result = Json::writeString(b, v);
4✔
2038
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2039

2040
  b.settings_["precision"] = 0;
2✔
2041
  b.settings_["precisionType"] = "decimal";
2✔
2042
  v = 123.56345694873740545068;
2✔
2043
  expected = "124";
2044
  result = Json::writeString(b, v);
4✔
2045
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2046

2047
  b.settings_["precision"] = 1;
2✔
2048
  b.settings_["precisionType"] = "decimal";
2✔
2049
  v = 1230.001;
2✔
2050
  expected = "1230.0";
2051
  result = Json::writeString(b, v);
4✔
2052
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2053

2054
  b.settings_["precision"] = 0;
2✔
2055
  b.settings_["precisionType"] = "decimal";
2✔
2056
  v = 1230.001;
2✔
2057
  expected = "1230";
2058
  result = Json::writeString(b, v);
4✔
2059
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2060

2061
  b.settings_["precision"] = 0;
2✔
2062
  b.settings_["precisionType"] = "decimal";
2✔
2063
  v = 1231.5;
2✔
2064
  expected = "1232";
2065
  result = Json::writeString(b, v);
4✔
2066
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
6✔
2067

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

2082
  const Json::Value defaultValue("error");
2✔
2083
  Json::FastWriter writer;
2✔
2084

2085
  {
2086
    const Json::String expected("{"
2087
                                "\"property1\":[0,1],"
2088
                                "\"property2\":{\"object\":\"object\"}"
2089
                                "}\n");
2✔
2090
    Json::String outcome = writer.write(root);
2✔
2091
    JSONTEST_ASSERT_STRING_EQUAL(expected, outcome);
8✔
2092

2093
    // Array member exists.
2094
    const Json::Path path1(".property1.[%]", 1);
4✔
2095
    Json::Value result = path1.resolve(root);
2✔
2096
    JSONTEST_ASSERT_EQUAL(Json::Value(1), result);
2✔
2097
    result = path1.resolve(root, defaultValue);
2✔
2098
    JSONTEST_ASSERT_EQUAL(Json::Value(1), result);
2✔
2099

2100
    // Array member does not exist.
2101
    const Json::Path path2(".property1.[2]");
4✔
2102
    result = path2.resolve(root);
2✔
2103
    JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2✔
2104
    result = path2.resolve(root, defaultValue);
2✔
2105
    JSONTEST_ASSERT_EQUAL(defaultValue, result);
2✔
2106

2107
    // Access array path form error
2108
    const Json::Path path3(".property1.0");
4✔
2109
    result = path3.resolve(root);
2✔
2110
    JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2✔
2111
    result = path3.resolve(root, defaultValue);
2✔
2112
    JSONTEST_ASSERT_EQUAL(defaultValue, result);
2✔
2113

2114
    // Object member exists.
2115
    const Json::Path path4(".property2.%", "object");
4✔
2116
    result = path4.resolve(root);
2✔
2117
    JSONTEST_ASSERT_EQUAL(Json::Value("object"), result);
2✔
2118
    result = path4.resolve(root, defaultValue);
2✔
2119
    JSONTEST_ASSERT_EQUAL(Json::Value("object"), result);
2✔
2120

2121
    // Object member does not exist.
2122
    const Json::Path path5(".property2.hello");
4✔
2123
    result = path5.resolve(root);
2✔
2124
    JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2✔
2125
    result = path5.resolve(root, defaultValue);
2✔
2126
    JSONTEST_ASSERT_EQUAL(defaultValue, result);
2✔
2127

2128
    // Access object path form error
2129
    const Json::Path path6(".property2.[0]");
4✔
2130
    result = path5.resolve(root);
2✔
2131
    JSONTEST_ASSERT_EQUAL(Json::nullValue, result);
2✔
2132
    result = path6.resolve(root, defaultValue);
2✔
2133
    JSONTEST_ASSERT_EQUAL(defaultValue, result);
2✔
2134

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

2149
    Json::Path path2(".property2.%", "hello");
4✔
2150
    Json::Value& value2 = path2.make(root);
2✔
2151
    JSONTEST_ASSERT_EQUAL(Json::nullValue, value2);
2✔
2152

2153
    // make will change the value
2154
    const Json::String outcome = writer.write(root);
2✔
2155
    JSONTEST_ASSERT_STRING_EQUAL(expected, outcome);
8✔
2156
  }
2157
}
2✔
2158
struct FastWriterTest : JsonTest::TestCase {};
6✔
2159

2160
JSONTEST_FIXTURE_LOCAL(FastWriterTest, dropNullPlaceholders) {
12✔
2161
  Json::FastWriter writer;
2✔
2162
  Json::Value nullValue;
2✔
2163
  JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
4✔
2164

2165
  writer.dropNullPlaceholders();
2✔
2166
  JSONTEST_ASSERT(writer.write(nullValue) == "\n");
4✔
2167
}
2✔
2168

2169
JSONTEST_FIXTURE_LOCAL(FastWriterTest, enableYAMLCompatibility) {
12✔
2170
  Json::FastWriter writer;
2✔
2171
  Json::Value root;
2✔
2172
  root["hello"] = "world";
2✔
2173

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

2176
  writer.enableYAMLCompatibility();
2✔
2177
  JSONTEST_ASSERT(writer.write(root) == "{\"hello\": \"world\"}\n");
4✔
2178
}
2✔
2179

2180
JSONTEST_FIXTURE_LOCAL(FastWriterTest, omitEndingLineFeed) {
12✔
2181
  Json::FastWriter writer;
2✔
2182
  Json::Value nullValue;
2✔
2183

2184
  JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
4✔
2185

2186
  writer.omitEndingLineFeed();
2✔
2187
  JSONTEST_ASSERT(writer.write(nullValue) == "null");
4✔
2188
}
2✔
2189

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

2208
  const Json::String result = writer.write(root);
2✔
2209
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2210
}
4✔
2211

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

2223
  const Json::String result = writer.write(root);
2✔
2224
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2225
}
4✔
2226

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

2242
  const Json::String result = writer.write(root);
2✔
2243
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2244
}
4✔
2245

2246
struct StyledWriterTest : JsonTest::TestCase {};
5✔
2247

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

2266
  const Json::String result = writer.write(root);
2✔
2267
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2268
}
4✔
2269

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

2281
  const Json::String result = writer.write(root);
2✔
2282
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2283
}
4✔
2284

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

2300
  const Json::String result = writer.write(root);
2✔
2301
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2302
}
4✔
2303

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

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

2359
struct StyledStreamWriterTest : JsonTest::TestCase {};
5✔
2360

2361
JSONTEST_FIXTURE_LOCAL(StyledStreamWriterTest, writeNumericValue) {
12✔
2362
  Json::StyledStreamWriter writer;
2✔
2363
  const Json::String expected("{\n"
2364
                              "\t\"emptyValue\" : null,\n"
2365
                              "\t\"false\" : false,\n"
2366
                              "\t\"null\" : \"null\",\n"
2367
                              "\t\"number\" : -6200000000000000.0,\n"
2368
                              "\t\"real\" : 1.256,\n"
2369
                              "\t\"uintValue\" : 17\n"
2370
                              "}\n");
2✔
2371

2372
  Json::Value root;
2✔
2373
  root["emptyValue"] = Json::nullValue;
2✔
2374
  root["false"] = false;
2✔
2375
  root["null"] = "null";
2✔
2376
  root["number"] = -6.2e+15; // big float number
2✔
2377
  root["real"] = 1.256;      // float number
2✔
2378
  root["uintValue"] = Json::Value(17U);
2✔
2379

2380
  Json::OStringStream sout;
2✔
2381
  writer.write(sout, root);
2✔
2382
  const Json::String result = sout.str();
2383
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2384
}
4✔
2385

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

2397
  Json::OStringStream sout;
2✔
2398
  writer.write(sout, root);
2✔
2399
  const Json::String result = sout.str();
2400
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2401
}
4✔
2402

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

2420
  Json::OStringStream sout;
2✔
2421
  writer.write(sout, root);
2✔
2422
  const Json::String result = sout.str();
2423
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2424
}
4✔
2425

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

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

2505
struct StreamWriterTest : JsonTest::TestCase {};
10✔
2506

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

2525
  const Json::String result = Json::writeString(writer, root);
2✔
2526
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2527
}
4✔
2528

2529
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, writeArrays) {
12✔
2530
  Json::StreamWriterBuilder writer;
2✔
2531
  const Json::String expected("{\n"
2532
                              "\t\"property1\" : \n"
2533
                              "\t[\n"
2534
                              "\t\t\"value1\",\n"
2535
                              "\t\t\"value2\"\n"
2536
                              "\t],\n"
2537
                              "\t\"property2\" : []\n"
2538
                              "}");
2✔
2539

2540
  Json::Value root;
2✔
2541
  root["property1"][0] = "value1";
2✔
2542
  root["property1"][1] = "value2";
2✔
2543
  root["property2"] = Json::arrayValue;
2✔
2544

2545
  const Json::String result = Json::writeString(writer, root);
2✔
2546
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2547
}
4✔
2548

2549
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, writeNestedObjects) {
12✔
2550
  Json::StreamWriterBuilder writer;
2✔
2551
  const Json::String expected("{\n"
2552
                              "\t\"object1\" : \n"
2553
                              "\t{\n"
2554
                              "\t\t\"bool\" : true,\n"
2555
                              "\t\t\"nested\" : 123\n"
2556
                              "\t},\n"
2557
                              "\t\"object2\" : {}\n"
2558
                              "}");
2✔
2559

2560
  Json::Value root, child;
2✔
2561
  child["nested"] = 123;
2✔
2562
  child["bool"] = true;
2✔
2563
  root["object1"] = child;
2✔
2564
  root["object2"] = Json::objectValue;
2✔
2565

2566
  const Json::String result = Json::writeString(writer, root);
2✔
2567
  JSONTEST_ASSERT_STRING_EQUAL(expected, result);
8✔
2568
}
4✔
2569

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

2615
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, dropNullPlaceholders) {
12✔
2616
  Json::StreamWriterBuilder b;
2✔
2617
  Json::Value nullValue;
2✔
2618
  b.settings_["dropNullPlaceholders"] = false;
2✔
2619
  JSONTEST_ASSERT(Json::writeString(b, nullValue) == "null");
4✔
2620
  b.settings_["dropNullPlaceholders"] = true;
2✔
2621
  JSONTEST_ASSERT(Json::writeString(b, nullValue).empty());
4✔
2622
}
2✔
2623

2624
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, enableYAMLCompatibility) {
12✔
2625
  Json::StreamWriterBuilder b;
2✔
2626
  Json::Value root;
2✔
2627
  root["hello"] = "world";
2✔
2628

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

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

2635
  b.settings_["enableYAMLCompatibility"] = false;
2✔
2636
  JSONTEST_ASSERT(Json::writeString(b, root) == "{\"hello\":\"world\"}");
4✔
2637
}
2✔
2638

2639
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, indentation) {
12✔
2640
  Json::StreamWriterBuilder b;
2✔
2641
  Json::Value root;
2✔
2642
  root["hello"] = "world";
2✔
2643

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

2647
  b.settings_["indentation"] = "\t";
2✔
2648
  JSONTEST_ASSERT(Json::writeString(b, root) ==
4✔
2649
                  "{\n\t\"hello\" : \"world\"\n}");
2650
}
2✔
2651

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

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

2680
  Json::StreamWriterBuilder b;
2✔
2681

2682
  // Default settings - should be unicode escaped.
2683
  JSONTEST_ASSERT(Json::writeString(b, root) ==
4✔
2684
                  "{\n\t\"test\" : "
2685
                  "\"\\t\\n\\ud806\\udca1=\\u0133\\ud82c\\udd1b\\uff67\"\n}");
2686

2687
  b.settings_["emitUTF8"] = true;
2✔
2688

2689
  // Should not be unicode escaped.
2690
  JSONTEST_ASSERT(
4✔
2691
      Json::writeString(b, root) ==
2692
      "{\n\t\"test\" : "
2693
      "\"\\t\\n\xF0\x91\xA2\xA1=\xC4\xB3\xF0\x9B\x84\x9B\xEF\xBD\xA7\"\n}");
2694

2695
  b.settings_["emitUTF8"] = false;
2✔
2696

2697
  // Should be unicode escaped.
2698
  JSONTEST_ASSERT(Json::writeString(b, root) ==
4✔
2699
                  "{\n\t\"test\" : "
2700
                  "\"\\t\\n\\ud806\\udca1=\\u0133\\ud82c\\udd1b\\uff67\"\n}");
2701
}
2✔
2702

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

2735
  Json::StreamWriterBuilder b;
2✔
2736

2737
  for (bool emitUTF8 : {true, false}) {
6✔
2738
    b.settings_["emitUTF8"] = emitUTF8;
4✔
2739

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

2744
      std::string raw({static_cast<char>(i)});
1,536✔
2745
      std::string esc = raw;
2746
      if (i < 0x20)
768✔
2747
        esc = uEscape(i);
256✔
2748
      if (const char* shEsc = shortEscape(i))
768✔
2749
        esc = shEsc;
2750

2751
      // std::cout << "emit=" << emitUTF8 << ", i=" << std::hex << i << std::dec
2752
      //          << std::endl;
2753

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

2765
#ifdef _WIN32
2766
JSONTEST_FIXTURE_LOCAL(StreamWriterTest, escapeTabCharacterWindows) {
2767
  // Get the current locale before changing it
2768
  std::string currentLocale = setlocale(LC_ALL, NULL);
2769
  setlocale(LC_ALL, "English_United States.1252");
2770

2771
  Json::Value root;
2772
  root["test"] = "\tTabTesting\t";
2773

2774
  Json::StreamWriterBuilder b;
2775

2776
  JSONTEST_ASSERT(Json::writeString(b, root) == "{\n\t\"test\" : "
2777
                                                "\"\\tTabTesting\\t\"\n}");
2778

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

2783
  b.settings_["emitUTF8"] = false;
2784
  JSONTEST_ASSERT(Json::writeString(b, root) == "{\n\t\"test\" : "
2785
                                                "\"\\tTabTesting\\t\"\n}");
2786

2787
  // Restore the locale
2788
  if (!currentLocale.empty())
2789
    setlocale(LC_ALL, currentLocale.c_str());
2790
}
2791
#endif
2792

2793
struct ReaderTest : JsonTest::TestCase {
2794
  void setStrictMode() {
1✔
2795
    reader = std::unique_ptr<Json::Reader>(
1✔
2796
        new Json::Reader(Json::Features{}.strictMode()));
1✔
2797
  }
1✔
2798

2799
  void setFeatures(Json::Features& features) {
1✔
2800
    reader = std::unique_ptr<Json::Reader>(new Json::Reader(features));
2✔
2801
  }
1✔
2802

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

2816
  template <typename Input> void checkParse(Input&& input) {
18✔
2817
    JSONTEST_ASSERT(reader->parse(input, root));
34✔
2818
  }
18✔
2819

2820
  template <typename Input>
2821
  void
2822
  checkParse(Input&& input,
32✔
2823
             const std::vector<Json::Reader::StructuredError>& structured) {
2824
    JSONTEST_ASSERT(!reader->parse(input, root));
64✔
2825
    checkStructuredErrors(reader->getStructuredErrors(), structured);
32✔
2826
  }
32✔
2827

2828
  template <typename Input>
2829
  void checkParse(Input&& input,
32✔
2830
                  const std::vector<Json::Reader::StructuredError>& structured,
2831
                  const std::string& formatted) {
2832
    checkParse(input, structured);
32✔
2833
    JSONTEST_ASSERT_EQUAL(formatted, reader->getFormattedErrorMessages());
96✔
2834
  }
32✔
2835

2836
  std::unique_ptr<Json::Reader> reader{new Json::Reader()};
2837
  Json::Value root;
2838
};
2839

2840
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseWithNoErrors) {
10✔
2841
  checkParse(R"({ "property" : "value" })");
2✔
2842
}
2✔
2843

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

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

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

2901
JSONTEST_FIXTURE_LOCAL(ReaderTest, parseComment) {
10✔
2902
  checkParse(
2✔
2903
      R"({ /*commentBeforeValue*/ "property" : "value" }//commentAfterValue)"
2904
      "\n");
2905
  checkParse(" true //comment1\n//comment2\r//comment3\r\n");
2✔
2906
}
2✔
2907

2908
JSONTEST_FIXTURE_LOCAL(ReaderTest, streamParseWithNoErrors) {
10✔
2909
  std::string styled = R"({ "property" : "value" })";
2✔
2910
  std::istringstream iss(styled);
2✔
2911
  checkParse(iss);
2✔
2912
}
4✔
2913

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

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

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

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

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

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

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

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

3005
JSONTEST_FIXTURE_LOCAL(ReaderTest, allowNumericKeysTest) {
10✔
3006
  Json::Features features;
2✔
3007
  features.allowNumericKeys_ = true;
2✔
3008
  setFeatures(features);
2✔
3009
  checkParse(R"({ 123 : "abc" })");
2✔
3010
}
2✔
3011

3012
struct CharReaderTest : JsonTest::TestCase {};
12✔
3013

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

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

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

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

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

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

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

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

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

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

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

3261
JSONTEST_FIXTURE_LOCAL(CharReaderTest, testOperator) {
12✔
3262
  const std::string styled = R"({ "property" : "value" })";
2✔
3263
  std::istringstream iss(styled);
2✔
3264
  Json::Value root;
2✔
3265
  iss >> root;
2✔
3266
  JSONTEST_ASSERT_EQUAL("value", root["property"]);
2✔
3267
}
4✔
3268

3269
struct CharReaderStrictModeTest : JsonTest::TestCase {};
1✔
3270

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

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

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

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

3428
struct CharReaderAllowDropNullTest : JsonTest::TestCase {
3429
  using Value = Json::Value;
3430
  using ValueCheck = std::function<void(const Value&)>;
3431

3432
  Value nullValue = Value{Json::nullValue};
3433
  Value emptyArray = Value{Json::arrayValue};
3434

3435
  ValueCheck checkEq(const Value& v) {
7✔
3436
    return [=](const Value& root) { JSONTEST_ASSERT_EQUAL(root, v); };
40✔
3437
  }
3438

3439
  static ValueCheck objGetAnd(std::string idx, ValueCheck f) {
3✔
3440
    return [=](const Value& root) { f(root.get(idx, true)); };
15✔
3441
  }
3442

3443
  static ValueCheck arrGetAnd(int idx, ValueCheck f) {
3✔
3444
    return [=](const Value& root) { f(root[idx]); };
15✔
3445
  }
3446
};
3447

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

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

3490
struct CharReaderAllowNumericKeysTest : JsonTest::TestCase {};
1✔
3491

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

3508
struct CharReaderAllowSingleQuotesTest : JsonTest::TestCase {};
1✔
3509

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

3536
struct CharReaderAllowZeroesTest : JsonTest::TestCase {};
1✔
3537

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

3564
struct CharReaderAllowSpecialFloatsTest : JsonTest::TestCase {};
2✔
3565

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

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

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

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

3661
struct EscapeSequenceTest : JsonTest::TestCase {};
3✔
3662

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

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

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

3707
struct BuilderTest : JsonTest::TestCase {};
1✔
3708

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

3730
struct BomTest : JsonTest::TestCase {};
2✔
3731

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

3756
struct IteratorTest : JsonTest::TestCase {};
9✔
3757

3758
JSONTEST_FIXTURE_LOCAL(IteratorTest, convert) {
12✔
3759
  Json::Value j;
2✔
3760
  const Json::Value& cj = j;
3761
  auto it = j.begin();
2✔
3762
  Json::Value::const_iterator cit;
2✔
3763
  cit = it;
2✔
3764
  JSONTEST_ASSERT(cit == cj.begin());
4✔
3765
}
2✔
3766

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

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

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

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

3833
JSONTEST_FIXTURE_LOCAL(IteratorTest, staticStringKey) {
12✔
3834
  Json::Value json;
2✔
3835
  json[Json::StaticString("k1")] = "a";
2✔
3836
  JSONTEST_ASSERT_EQUAL(Json::Value("k1"), json.begin().key());
2✔
3837
}
2✔
3838

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

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

3877
JSONTEST_FIXTURE_LOCAL(IteratorTest, constness) {
12✔
3878
  Json::Value const v;
2✔
3879
  JSONTEST_ASSERT_THROWS(
2✔
3880
      Json::Value::iterator it(v.begin())); // Compile, but throw.
3881

3882
  Json::Value value;
2✔
3883

3884
  for (int i = 9; i < 12; ++i) {
8✔
3885
    Json::OStringStream out;
6✔
3886
    out << std::setw(2) << i;
6✔
3887
    Json::String str = out.str();
3888
    value[str] = str;
6✔
3889
  }
6✔
3890

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

3901
struct RValueTest : JsonTest::TestCase {};
1✔
3902

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

3913
struct FuzzTest : JsonTest::TestCase {};
1✔
3914

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

3925
struct ParseWithStructuredErrorsTest : JsonTest::TestCase {
2✔
3926
  void testErrors(
2✔
3927
      const std::string& doc, bool success,
3928
      const std::vector<Json::CharReader::StructuredError>& expectedErrors) {
3929
    Json::CharReaderBuilder b;
2✔
3930
    CharReaderPtr reader(b.newCharReader());
2✔
3931
    Json::Value root;
2✔
3932
    JSONTEST_ASSERT_EQUAL(
2✔
3933
        reader->parse(doc.data(), doc.data() + doc.length(), &root, nullptr),
3934
        success);
3935
    auto actualErrors = reader->getStructuredErrors();
2✔
3936
    JSONTEST_ASSERT_EQUAL(expectedErrors.size(), actualErrors.size());
2✔
3937
    for (std::size_t i = 0; i < actualErrors.size(); i++) {
3✔
3938
      const auto& a = actualErrors[i];
1✔
3939
      const auto& e = expectedErrors[i];
1✔
3940
      JSONTEST_ASSERT_EQUAL(a.offset_start, e.offset_start);
1✔
3941
      JSONTEST_ASSERT_EQUAL(a.offset_limit, e.offset_limit);
1✔
3942
      JSONTEST_ASSERT_STRING_EQUAL(a.message, e.message);
4✔
3943
    }
3944
  }
4✔
3945
};
3946

3947
JSONTEST_FIXTURE_LOCAL(ParseWithStructuredErrorsTest, success) {
12✔
3948
  testErrors("{}", true, {});
4✔
3949
}
2✔
3950

3951
JSONTEST_FIXTURE_LOCAL(ParseWithStructuredErrorsTest, singleError) {
12✔
3952
  testErrors("{ 1 : 2 }", false, {{2, 3, "Missing '}' or object member name"}});
6✔
3953
}
2✔
3954

3955
int main(int argc, const char* argv[]) {
1✔
3956
  JsonTest::Runner runner;
1✔
3957

3958
  for (auto& local : local_) {
122✔
3959
    runner.add(local);
121✔
3960
  }
3961

3962
  return runner.runCommandLine(argc, argv);
1✔
3963
}
3964

3965
struct MemberTemplateAs : JsonTest::TestCase {
1✔
3966
  template <typename T, typename F>
3967
  JsonTest::TestResult& EqEval(T v, F f) const {
20✔
3968
    const Json::Value j = v;
20✔
3969
    return JSONTEST_ASSERT_EQUAL(j.as<T>(), f(j));
40✔
3970
  }
20✔
3971
};
3972

3973
JSONTEST_FIXTURE_LOCAL(MemberTemplateAs, BehavesSameAsNamedAs) {
12✔
3974
  const Json::Value jstr = "hello world";
2✔
3975
  JSONTEST_ASSERT_STRING_EQUAL(jstr.as<const char*>(), jstr.asCString());
6✔
3976
  JSONTEST_ASSERT_STRING_EQUAL(jstr.as<Json::String>(), jstr.asString());
6✔
3977
  EqEval(Json::Int(64), [](const Json::Value& j) { return j.asInt(); });
3✔
3978
  EqEval(Json::UInt(64), [](const Json::Value& j) { return j.asUInt(); });
3✔
3979
#if defined(JSON_HAS_INT64)
3980
  EqEval(Json::Int64(64), [](const Json::Value& j) { return j.asInt64(); });
3✔
3981
  EqEval(Json::UInt64(64), [](const Json::Value& j) { return j.asUInt64(); });
3✔
3982
#endif // if defined(JSON_HAS_INT64)
3983
  EqEval(Json::LargestInt(64),
2✔
3984
         [](const Json::Value& j) { return j.asLargestInt(); });
1✔
3985
  EqEval(Json::LargestUInt(64),
2✔
3986
         [](const Json::Value& j) { return j.asLargestUInt(); });
1✔
3987

3988
  EqEval(69.69f, [](const Json::Value& j) { return j.asFloat(); });
3✔
3989
  EqEval(69.69, [](const Json::Value& j) { return j.asDouble(); });
3✔
3990
  EqEval(false, [](const Json::Value& j) { return j.asBool(); });
3✔
3991
  EqEval(true, [](const Json::Value& j) { return j.asBool(); });
3✔
3992
}
2✔
3993

3994
class MemberTemplateIs : public JsonTest::TestCase {};
1✔
3995

3996
JSONTEST_FIXTURE_LOCAL(MemberTemplateIs, BehavesSameAsNamedIs) {
12✔
3997
  const Json::Value values[] = {true, 142, 40.63, "hello world"};
10✔
3998
  for (const Json::Value& j : values) {
10✔
3999
    JSONTEST_ASSERT_EQUAL(j.is<bool>(), j.isBool());
8✔
4000
    JSONTEST_ASSERT_EQUAL(j.is<Json::Int>(), j.isInt());
8✔
4001
    JSONTEST_ASSERT_EQUAL(j.is<Json::Int64>(), j.isInt64());
8✔
4002
    JSONTEST_ASSERT_EQUAL(j.is<Json::UInt>(), j.isUInt());
8✔
4003
    JSONTEST_ASSERT_EQUAL(j.is<Json::UInt64>(), j.isUInt64());
8✔
4004
    JSONTEST_ASSERT_EQUAL(j.is<double>(), j.isDouble());
8✔
4005
    JSONTEST_ASSERT_EQUAL(j.is<Json::String>(), j.isString());
8✔
4006
  }
4007
}
12✔
4008

4009
class VersionTest : public JsonTest::TestCase {};
1✔
4010

4011
JSONTEST_FIXTURE_LOCAL(VersionTest, VersionNumbersMatch) {
12✔
4012
  std::ostringstream vstr;
2✔
4013
  vstr << JSONCPP_VERSION_MAJOR << '.' << JSONCPP_VERSION_MINOR << '.'
4✔
4014
       << JSONCPP_VERSION_PATCH;
2✔
4015
  JSONTEST_ASSERT_EQUAL(vstr.str(), std::string(JSONCPP_VERSION_STRING));
6✔
4016
}
2✔
4017

4018
#if defined(__GNUC__)
4019
#pragma GCC diagnostic pop
4020
#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