@digitalshieldfe/react-native-backup-card-sdk 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +17 -25
  2. package/android/build.gradle +49 -4
  3. package/android/consumer-rules.pro +0 -0
  4. package/android/proguard-rules.pro +21 -0
  5. package/android/src/main/AndroidManifest.xml +4 -1
  6. package/android/src/main/java/com/ziancube/backupcardsdk/BackupCardSdk.kt +478 -0
  7. package/android/src/main/java/com/ziancube/backupcardsdk/GPChannelNatives.java +41 -0
  8. package/android/src/main/java/com/ziancube/backupcardsdk/listener/ApiAsyncListener.java +13 -0
  9. package/android/src/main/java/com/ziancube/backupcardsdk/nfc/ApiNfc.java +173 -0
  10. package/android/src/main/java/com/ziancube/backupcardsdk/nfc/ImplNfc.java +39 -0
  11. package/android/src/main/java/com/ziancube/backupcardsdk/nfc/NfcComm.java +115 -0
  12. package/android/src/main/java/com/ziancube/backupcardsdk/utils/ApduParam.java +67 -0
  13. package/android/src/main/java/com/ziancube/backupcardsdk/utils/CommList.java +41 -0
  14. package/android/src/main/java/com/ziancube/backupcardsdk/utils/Utils.java +109 -0
  15. package/android/src/main/java/com/ziancube/reactnativebackupcardsdk/BackupCardSdkModule.kt +49 -81
  16. package/android/src/main/jni/CMakeLists.txt +60 -0
  17. package/android/src/main/jni/GPChannel/include/GPChannelSDK.h +306 -0
  18. package/android/src/main/jni/GPChannel/include/context/BaseContext.h +56 -0
  19. package/android/src/main/jni/GPChannel/include/device/ApduBuilder.hpp +72 -0
  20. package/android/src/main/jni/GPChannel/include/utility/Apdu.hpp +166 -0
  21. package/android/src/main/jni/GPChannel/include/utility/Debug.hpp +59 -0
  22. package/android/src/main/jni/GPChannel/include/utility/Singleton.h +34 -0
  23. package/android/src/main/jni/GPChannel/include/utility/mutex.h +24 -0
  24. package/android/src/main/jni/GPChannel/include/utility/trim.hpp +155 -0
  25. package/android/src/main/jni/GPChannel/include/utility/util.h +104 -0
  26. package/android/src/main/jni/GPChannel/include/utility/xFactory.hpp +26 -0
  27. package/android/src/main/jni/GPChannel/include/utility/xManager.hpp +84 -0
  28. package/android/src/main/jni/GPChannel/src/arm64-v8a/libJUB_GPC_APDU_SDK.a +0 -0
  29. package/android/src/main/jni/GPChannel/src/arm64-v8a/libTrezorCrypto.a +0 -0
  30. package/android/src/main/jni/GPChannel/src/armeabi-v7a/libJUB_GPC_APDU_SDK.a +0 -0
  31. package/android/src/main/jni/GPChannel/src/armeabi-v7a/libTrezorCrypto.a +0 -0
  32. package/android/src/main/jni/GPChannel/src/x86/libJUB_GPC_APDU_SDK.a +0 -0
  33. package/android/src/main/jni/GPChannel/src/x86/libTrezorCrypto.a +0 -0
  34. package/android/src/main/jni/src/implJni.cpp +313 -0
  35. package/android/src/main/jni/src/implJni.h +9 -0
  36. package/android/src/main/jni/utils/jsoncpp/AUTHORS +111 -0
  37. package/android/src/main/jni/utils/jsoncpp/CMakeLists.txt +159 -0
  38. package/android/src/main/jni/utils/jsoncpp/LICENSE +55 -0
  39. package/android/src/main/jni/utils/jsoncpp/README.md +135 -0
  40. package/android/src/main/jni/utils/jsoncpp/amalgamate.py +155 -0
  41. package/android/src/main/jni/utils/jsoncpp/appveyor.yml +22 -0
  42. package/android/src/main/jni/utils/jsoncpp/dev.makefile +35 -0
  43. package/android/src/main/jni/utils/jsoncpp/devtools/__init__.py +6 -0
  44. package/android/src/main/jni/utils/jsoncpp/devtools/agent_vmw7.json +33 -0
  45. package/android/src/main/jni/utils/jsoncpp/devtools/agent_vmxp.json +26 -0
  46. package/android/src/main/jni/utils/jsoncpp/devtools/antglob.py +205 -0
  47. package/android/src/main/jni/utils/jsoncpp/devtools/batchbuild.py +278 -0
  48. package/android/src/main/jni/utils/jsoncpp/devtools/fixeol.py +70 -0
  49. package/android/src/main/jni/utils/jsoncpp/devtools/licenseupdater.py +94 -0
  50. package/android/src/main/jni/utils/jsoncpp/devtools/tarball.py +52 -0
  51. package/android/src/main/jni/utils/jsoncpp/doxybuild.py +189 -0
  52. package/android/src/main/jni/utils/jsoncpp/include/CMakeLists.txt +2 -0
  53. package/android/src/main/jni/utils/jsoncpp/include/json/allocator.h +98 -0
  54. package/android/src/main/jni/utils/jsoncpp/include/json/assertions.h +54 -0
  55. package/android/src/main/jni/utils/jsoncpp/include/json/autolink.h +25 -0
  56. package/android/src/main/jni/utils/jsoncpp/include/json/config.h +187 -0
  57. package/android/src/main/jni/utils/jsoncpp/include/json/features.h +61 -0
  58. package/android/src/main/jni/utils/jsoncpp/include/json/forwards.h +37 -0
  59. package/android/src/main/jni/utils/jsoncpp/include/json/json.h +15 -0
  60. package/android/src/main/jni/utils/jsoncpp/include/json/reader.h +411 -0
  61. package/android/src/main/jni/utils/jsoncpp/include/json/value.h +888 -0
  62. package/android/src/main/jni/utils/jsoncpp/include/json/version.h +20 -0
  63. package/android/src/main/jni/utils/jsoncpp/include/json/writer.h +357 -0
  64. package/android/src/main/jni/utils/jsoncpp/makefiles/vs71/jsontest.vcproj +119 -0
  65. package/android/src/main/jni/utils/jsoncpp/makefiles/vs71/lib_json.vcproj +205 -0
  66. package/android/src/main/jni/utils/jsoncpp/makefiles/vs71/test_lib_json.vcproj +130 -0
  67. package/android/src/main/jni/utils/jsoncpp/makerelease.py +390 -0
  68. package/android/src/main/jni/utils/jsoncpp/meson.build +103 -0
  69. package/android/src/main/jni/utils/jsoncpp/pkg-config/jsoncpp.pc.in +9 -0
  70. package/android/src/main/jni/utils/jsoncpp/src/CMakeLists.txt +5 -0
  71. package/android/src/main/jni/utils/jsoncpp/src/jsontestrunner/CMakeLists.txt +25 -0
  72. package/android/src/main/jni/utils/jsoncpp/src/jsontestrunner/main.cpp +333 -0
  73. package/android/src/main/jni/utils/jsoncpp/src/lib_json/CMakeLists.txt +117 -0
  74. package/android/src/main/jni/utils/jsoncpp/src/lib_json/json_reader.cpp +2060 -0
  75. package/android/src/main/jni/utils/jsoncpp/src/lib_json/json_tool.h +114 -0
  76. package/android/src/main/jni/utils/jsoncpp/src/lib_json/json_value.cpp +1661 -0
  77. package/android/src/main/jni/utils/jsoncpp/src/lib_json/json_valueiterator.inl +167 -0
  78. package/android/src/main/jni/utils/jsoncpp/src/lib_json/json_writer.cpp +1233 -0
  79. package/android/src/main/jni/utils/jsoncpp/src/lib_json/version.h.in +20 -0
  80. package/android/src/main/jni/utils/jsoncpp/src/test_lib_json/CMakeLists.txt +38 -0
  81. package/android/src/main/jni/utils/jsoncpp/src/test_lib_json/jsontest.cpp +457 -0
  82. package/android/src/main/jni/utils/jsoncpp/src/test_lib_json/jsontest.h +286 -0
  83. package/android/src/main/jni/utils/jsoncpp/src/test_lib_json/main.cpp +2606 -0
  84. package/android/src/main/jni/utils/jsoncpp/travis.sh +23 -0
  85. package/android/src/main/jni/utils/jsoncpp/version +1 -0
  86. package/android/src/main/jni/utils/jsoncpp/version.in +1 -0
  87. package/android/src/main/jni/utils/logUtils.cpp +108 -0
  88. package/android/src/main/jni/utils/logUtils.h +87 -0
  89. package/android/src/main/jni/utils/mSIGNA/stdutils/uchar_vector.h +614 -0
  90. package/package.json +2 -3
  91. package/android/libs/backupcardsdk-1.0.0.aar +0 -0
@@ -0,0 +1,2606 @@
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 "jsontest.h"
14
+ #include <json/config.h>
15
+ #include <json/json.h>
16
+ #include <cstring>
17
+ #include <limits>
18
+ #include <sstream>
19
+ #include <string>
20
+ #include <iomanip>
21
+
22
+ // Make numeric limits more convenient to talk about.
23
+ // Assumes int type in 32 bits.
24
+ #define kint32max Json::Value::maxInt
25
+ #define kint32min Json::Value::minInt
26
+ #define kuint32max Json::Value::maxUInt
27
+ #define kint64max Json::Value::maxInt64
28
+ #define kint64min Json::Value::minInt64
29
+ #define kuint64max Json::Value::maxUInt64
30
+
31
+ //static const double kdint64max = double(kint64max);
32
+ //static const float kfint64max = float(kint64max);
33
+ static const float kfint32max = float(kint32max);
34
+ static const float kfuint32max = float(kuint32max);
35
+
36
+ // //////////////////////////////////////////////////////////////////
37
+ // //////////////////////////////////////////////////////////////////
38
+ // Json Library test cases
39
+ // //////////////////////////////////////////////////////////////////
40
+ // //////////////////////////////////////////////////////////////////
41
+
42
+ #if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
43
+ static inline double uint64ToDouble(Json::UInt64 value) {
44
+ return static_cast<double>(value);
45
+ }
46
+ #else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
47
+ static inline double uint64ToDouble(Json::UInt64 value) {
48
+ return static_cast<double>(Json::Int64(value / 2)) * 2.0 +
49
+ static_cast<double>(Json::Int64(value & 1));
50
+ }
51
+ #endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
52
+
53
+ struct ValueTest : JsonTest::TestCase {
54
+ Json::Value null_;
55
+ Json::Value emptyArray_;
56
+ Json::Value emptyObject_;
57
+ Json::Value integer_;
58
+ Json::Value unsignedInteger_;
59
+ Json::Value smallUnsignedInteger_;
60
+ Json::Value real_;
61
+ Json::Value float_;
62
+ Json::Value array1_;
63
+ Json::Value object1_;
64
+ Json::Value emptyString_;
65
+ Json::Value string1_;
66
+ Json::Value string_;
67
+ Json::Value true_;
68
+ Json::Value false_;
69
+
70
+ ValueTest()
71
+ : emptyArray_(Json::arrayValue), emptyObject_(Json::objectValue),
72
+ integer_(123456789), unsignedInteger_(34567890u),
73
+ smallUnsignedInteger_(Json::Value::UInt(Json::Value::maxInt)),
74
+ real_(1234.56789), float_(0.00390625f), emptyString_(""), string1_("a"),
75
+ string_("sometext with space"), true_(true), false_(false) {
76
+ array1_.append(1234);
77
+ object1_["id"] = 1234;
78
+ }
79
+
80
+ struct IsCheck {
81
+ /// Initialize all checks to \c false by default.
82
+ IsCheck();
83
+
84
+ bool isObject_;
85
+ bool isArray_;
86
+ bool isBool_;
87
+ bool isString_;
88
+ bool isNull_;
89
+
90
+ bool isInt_;
91
+ bool isInt64_;
92
+ bool isUInt_;
93
+ bool isUInt64_;
94
+ bool isIntegral_;
95
+ bool isDouble_;
96
+ bool isNumeric_;
97
+ };
98
+
99
+ void checkConstMemberCount(const Json::Value& value,
100
+ unsigned int expectedCount);
101
+
102
+ void checkMemberCount(Json::Value& value, unsigned int expectedCount);
103
+
104
+ void checkIs(const Json::Value& value, const IsCheck& check);
105
+
106
+ void checkIsLess(const Json::Value& x, const Json::Value& y);
107
+
108
+ void checkIsEqual(const Json::Value& x, const Json::Value& y);
109
+
110
+ /// Normalize the representation of floating-point number by stripped leading
111
+ /// 0 in exponent.
112
+ static JSONCPP_STRING normalizeFloatingPointStr(const JSONCPP_STRING& s);
113
+ };
114
+
115
+ JSONCPP_STRING ValueTest::normalizeFloatingPointStr(const JSONCPP_STRING& s) {
116
+ JSONCPP_STRING::size_type index = s.find_last_of("eE");
117
+ if (index != JSONCPP_STRING::npos) {
118
+ JSONCPP_STRING::size_type hasSign =
119
+ (s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
120
+ JSONCPP_STRING::size_type exponentStartIndex = index + 1 + hasSign;
121
+ JSONCPP_STRING normalized = s.substr(0, exponentStartIndex);
122
+ JSONCPP_STRING::size_type indexDigit =
123
+ s.find_first_not_of('0', exponentStartIndex);
124
+ JSONCPP_STRING exponent = "0";
125
+ if (indexDigit !=
126
+ JSONCPP_STRING::npos) // There is an exponent different from 0
127
+ {
128
+ exponent = s.substr(indexDigit);
129
+ }
130
+ return normalized + exponent;
131
+ }
132
+ return s;
133
+ }
134
+
135
+ JSONTEST_FIXTURE(ValueTest, checkNormalizeFloatingPointStr) {
136
+ JSONTEST_ASSERT_STRING_EQUAL("0.0", normalizeFloatingPointStr("0.0"));
137
+ JSONTEST_ASSERT_STRING_EQUAL("0e0", normalizeFloatingPointStr("0e0"));
138
+ JSONTEST_ASSERT_STRING_EQUAL("1234.0", normalizeFloatingPointStr("1234.0"));
139
+ JSONTEST_ASSERT_STRING_EQUAL("1234.0e0",
140
+ normalizeFloatingPointStr("1234.0e0"));
141
+ JSONTEST_ASSERT_STRING_EQUAL("1234.0e+0",
142
+ normalizeFloatingPointStr("1234.0e+0"));
143
+ JSONTEST_ASSERT_STRING_EQUAL("1234e-1", normalizeFloatingPointStr("1234e-1"));
144
+ JSONTEST_ASSERT_STRING_EQUAL("1234e10", normalizeFloatingPointStr("1234e10"));
145
+ JSONTEST_ASSERT_STRING_EQUAL("1234e10",
146
+ normalizeFloatingPointStr("1234e010"));
147
+ JSONTEST_ASSERT_STRING_EQUAL("1234e+10",
148
+ normalizeFloatingPointStr("1234e+010"));
149
+ JSONTEST_ASSERT_STRING_EQUAL("1234e-10",
150
+ normalizeFloatingPointStr("1234e-010"));
151
+ JSONTEST_ASSERT_STRING_EQUAL("1234e+100",
152
+ normalizeFloatingPointStr("1234e+100"));
153
+ JSONTEST_ASSERT_STRING_EQUAL("1234e-100",
154
+ normalizeFloatingPointStr("1234e-100"));
155
+ JSONTEST_ASSERT_STRING_EQUAL("1234e+1",
156
+ normalizeFloatingPointStr("1234e+001"));
157
+ }
158
+
159
+ JSONTEST_FIXTURE(ValueTest, memberCount) {
160
+ JSONTEST_ASSERT_PRED(checkMemberCount(emptyArray_, 0));
161
+ JSONTEST_ASSERT_PRED(checkMemberCount(emptyObject_, 0));
162
+ JSONTEST_ASSERT_PRED(checkMemberCount(array1_, 1));
163
+ JSONTEST_ASSERT_PRED(checkMemberCount(object1_, 1));
164
+ JSONTEST_ASSERT_PRED(checkMemberCount(null_, 0));
165
+ JSONTEST_ASSERT_PRED(checkMemberCount(integer_, 0));
166
+ JSONTEST_ASSERT_PRED(checkMemberCount(unsignedInteger_, 0));
167
+ JSONTEST_ASSERT_PRED(checkMemberCount(smallUnsignedInteger_, 0));
168
+ JSONTEST_ASSERT_PRED(checkMemberCount(real_, 0));
169
+ JSONTEST_ASSERT_PRED(checkMemberCount(emptyString_, 0));
170
+ JSONTEST_ASSERT_PRED(checkMemberCount(string_, 0));
171
+ JSONTEST_ASSERT_PRED(checkMemberCount(true_, 0));
172
+ }
173
+
174
+ JSONTEST_FIXTURE(ValueTest, objects) {
175
+ // Types
176
+ IsCheck checks;
177
+ checks.isObject_ = true;
178
+ JSONTEST_ASSERT_PRED(checkIs(emptyObject_, checks));
179
+ JSONTEST_ASSERT_PRED(checkIs(object1_, checks));
180
+
181
+ JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());
182
+
183
+ // Empty object okay
184
+ JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));
185
+
186
+ // Non-empty object not okay
187
+ JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));
188
+
189
+ // Always okay
190
+ JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));
191
+
192
+ // Never okay
193
+ JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
194
+ JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
195
+ JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
196
+ JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
197
+ JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
198
+ JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));
199
+
200
+ // Access through const reference
201
+ const Json::Value& constObject = object1_;
202
+
203
+ JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
204
+ JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);
205
+
206
+ // Access through non-const reference
207
+ JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
208
+ JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
209
+
210
+ object1_["some other id"] = "foo";
211
+ JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
212
+ JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
213
+
214
+ // Remove.
215
+ Json::Value got;
216
+ bool did;
217
+ did = object1_.removeMember("some other id", &got);
218
+ JSONTEST_ASSERT_EQUAL(Json::Value("foo"), got);
219
+ JSONTEST_ASSERT_EQUAL(true, did);
220
+ got = Json::Value("bar");
221
+ did = object1_.removeMember("some other id", &got);
222
+ JSONTEST_ASSERT_EQUAL(Json::Value("bar"), got);
223
+ JSONTEST_ASSERT_EQUAL(false, did);
224
+ }
225
+
226
+ JSONTEST_FIXTURE(ValueTest, arrays) {
227
+ const unsigned int index0 = 0;
228
+
229
+ // Types
230
+ IsCheck checks;
231
+ checks.isArray_ = true;
232
+ JSONTEST_ASSERT_PRED(checkIs(emptyArray_, checks));
233
+ JSONTEST_ASSERT_PRED(checkIs(array1_, checks));
234
+
235
+ JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
236
+
237
+ // Empty array okay
238
+ JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));
239
+
240
+ // Non-empty array not okay
241
+ JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));
242
+
243
+ // Always okay
244
+ JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));
245
+
246
+ // Never okay
247
+ JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
248
+ JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
249
+ JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
250
+ JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
251
+ JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
252
+ JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));
253
+
254
+ // Access through const reference
255
+ const Json::Value& constArray = array1_;
256
+ JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
257
+ JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
258
+
259
+ // Access through non-const reference
260
+ JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
261
+ JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
262
+
263
+ array1_[2] = Json::Value(17);
264
+ JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
265
+ JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
266
+ Json::Value got;
267
+ JSONTEST_ASSERT_EQUAL(true, array1_.removeIndex(2, &got));
268
+ JSONTEST_ASSERT_EQUAL(Json::Value(17), got);
269
+ JSONTEST_ASSERT_EQUAL(false, array1_.removeIndex(2, &got)); // gone now
270
+ }
271
+ JSONTEST_FIXTURE(ValueTest, arrayIssue252)
272
+ {
273
+ int count = 5;
274
+ Json::Value root;
275
+ Json::Value item;
276
+ root["array"] = Json::Value::nullRef;
277
+ for (int i = 0; i < count; i++)
278
+ {
279
+ item["a"] = i;
280
+ item["b"] = i;
281
+ root["array"][i] = item;
282
+ }
283
+ //JSONTEST_ASSERT_EQUAL(5, root["array"].size());
284
+ }
285
+
286
+ JSONTEST_FIXTURE(ValueTest, null) {
287
+ JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
288
+
289
+ IsCheck checks;
290
+ checks.isNull_ = true;
291
+ JSONTEST_ASSERT_PRED(checkIs(null_, checks));
292
+
293
+ JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
294
+ JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
295
+ JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
296
+ JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
297
+ JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
298
+ JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
299
+ JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
300
+ JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));
301
+
302
+ JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
303
+ JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
304
+ JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
305
+ JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
306
+ JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
307
+ JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
308
+ JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
309
+
310
+ JSONTEST_ASSERT_EQUAL(Json::Value::null, null_);
311
+
312
+ // Test using a Value in a boolean context (false iff null)
313
+ JSONTEST_ASSERT_EQUAL(null_,false);
314
+ JSONTEST_ASSERT_EQUAL(object1_,true);
315
+ JSONTEST_ASSERT_EQUAL(!null_,true);
316
+ JSONTEST_ASSERT_EQUAL(!object1_,false);
317
+ }
318
+
319
+ JSONTEST_FIXTURE(ValueTest, strings) {
320
+ JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
321
+
322
+ IsCheck checks;
323
+ checks.isString_ = true;
324
+ JSONTEST_ASSERT_PRED(checkIs(emptyString_, checks));
325
+ JSONTEST_ASSERT_PRED(checkIs(string_, checks));
326
+ JSONTEST_ASSERT_PRED(checkIs(string1_, checks));
327
+
328
+ // Empty string okay
329
+ JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));
330
+
331
+ // Non-empty string not okay
332
+ JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));
333
+
334
+ // Always okay
335
+ JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));
336
+
337
+ // Never okay
338
+ JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
339
+ JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
340
+ JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
341
+ JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
342
+ JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));
343
+
344
+ JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
345
+ JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
346
+ }
347
+
348
+ JSONTEST_FIXTURE(ValueTest, bools) {
349
+ JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
350
+
351
+ IsCheck checks;
352
+ checks.isBool_ = true;
353
+ JSONTEST_ASSERT_PRED(checkIs(false_, checks));
354
+ JSONTEST_ASSERT_PRED(checkIs(true_, checks));
355
+
356
+ // False okay
357
+ JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));
358
+
359
+ // True not okay
360
+ JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));
361
+
362
+ // Always okay
363
+ JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
364
+ JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
365
+ JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
366
+ JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
367
+ JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));
368
+
369
+ // Never okay
370
+ JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
371
+ JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));
372
+
373
+ JSONTEST_ASSERT_EQUAL(true, true_.asBool());
374
+ JSONTEST_ASSERT_EQUAL(1, true_.asInt());
375
+ JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
376
+ JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
377
+ JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
378
+ JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
379
+ JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());
380
+
381
+ JSONTEST_ASSERT_EQUAL(false, false_.asBool());
382
+ JSONTEST_ASSERT_EQUAL(0, false_.asInt());
383
+ JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
384
+ JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
385
+ JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
386
+ JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
387
+ JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
388
+ }
389
+
390
+ JSONTEST_FIXTURE(ValueTest, integers) {
391
+ IsCheck checks;
392
+ Json::Value val;
393
+
394
+ // Conversions that don't depend on the value.
395
+ JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
396
+ JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
397
+ JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
398
+ JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
399
+ JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));
400
+
401
+ JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
402
+ JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
403
+ JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
404
+ JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
405
+ JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));
406
+
407
+ JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
408
+ JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
409
+ JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
410
+ JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
411
+ JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));
412
+
413
+ // Default int
414
+ val = Json::Value(Json::intValue);
415
+
416
+ JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
417
+
418
+ checks = IsCheck();
419
+ checks.isInt_ = true;
420
+ checks.isInt64_ = true;
421
+ checks.isUInt_ = true;
422
+ checks.isUInt64_ = true;
423
+ checks.isIntegral_ = true;
424
+ checks.isDouble_ = true;
425
+ checks.isNumeric_ = true;
426
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
427
+
428
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
429
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
430
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
431
+
432
+ JSONTEST_ASSERT_EQUAL(0, val.asInt());
433
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
434
+ JSONTEST_ASSERT_EQUAL(0, val.asUInt());
435
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
436
+ JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
437
+ JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
438
+ JSONTEST_ASSERT_EQUAL(false, val.asBool());
439
+ JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
440
+
441
+ // Default uint
442
+ val = Json::Value(Json::uintValue);
443
+
444
+ JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
445
+
446
+ checks = IsCheck();
447
+ checks.isInt_ = true;
448
+ checks.isInt64_ = true;
449
+ checks.isUInt_ = true;
450
+ checks.isUInt64_ = true;
451
+ checks.isIntegral_ = true;
452
+ checks.isDouble_ = true;
453
+ checks.isNumeric_ = true;
454
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
455
+
456
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
457
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
458
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
459
+
460
+ JSONTEST_ASSERT_EQUAL(0, val.asInt());
461
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
462
+ JSONTEST_ASSERT_EQUAL(0, val.asUInt());
463
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
464
+ JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
465
+ JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
466
+ JSONTEST_ASSERT_EQUAL(false, val.asBool());
467
+ JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
468
+
469
+ // Default real
470
+ val = Json::Value(Json::realValue);
471
+
472
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
473
+
474
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
475
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
476
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
477
+
478
+ checks = IsCheck();
479
+ checks.isInt_ = true;
480
+ checks.isInt64_ = true;
481
+ checks.isUInt_ = true;
482
+ checks.isUInt64_ = true;
483
+ checks.isIntegral_ = true;
484
+ checks.isDouble_ = true;
485
+ checks.isNumeric_ = true;
486
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
487
+
488
+ JSONTEST_ASSERT_EQUAL(0, val.asInt());
489
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
490
+ JSONTEST_ASSERT_EQUAL(0, val.asUInt());
491
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
492
+ JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
493
+ JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
494
+ JSONTEST_ASSERT_EQUAL(false, val.asBool());
495
+ JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
496
+
497
+ // Zero (signed constructor arg)
498
+ val = Json::Value(0);
499
+
500
+ JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
501
+
502
+ checks = IsCheck();
503
+ checks.isInt_ = true;
504
+ checks.isInt64_ = true;
505
+ checks.isUInt_ = true;
506
+ checks.isUInt64_ = true;
507
+ checks.isIntegral_ = true;
508
+ checks.isDouble_ = true;
509
+ checks.isNumeric_ = true;
510
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
511
+
512
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
513
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
514
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
515
+
516
+ JSONTEST_ASSERT_EQUAL(0, val.asInt());
517
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
518
+ JSONTEST_ASSERT_EQUAL(0, val.asUInt());
519
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
520
+ JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
521
+ JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
522
+ JSONTEST_ASSERT_EQUAL(false, val.asBool());
523
+ JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
524
+
525
+ // Zero (unsigned constructor arg)
526
+ val = Json::Value(0u);
527
+
528
+ JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
529
+
530
+ checks = IsCheck();
531
+ checks.isInt_ = true;
532
+ checks.isInt64_ = true;
533
+ checks.isUInt_ = true;
534
+ checks.isUInt64_ = true;
535
+ checks.isIntegral_ = true;
536
+ checks.isDouble_ = true;
537
+ checks.isNumeric_ = true;
538
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
539
+
540
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
541
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
542
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
543
+
544
+ JSONTEST_ASSERT_EQUAL(0, val.asInt());
545
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
546
+ JSONTEST_ASSERT_EQUAL(0, val.asUInt());
547
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
548
+ JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
549
+ JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
550
+ JSONTEST_ASSERT_EQUAL(false, val.asBool());
551
+ JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
552
+
553
+ // Zero (floating-point constructor arg)
554
+ val = Json::Value(0.0);
555
+
556
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
557
+
558
+ checks = IsCheck();
559
+ checks.isInt_ = true;
560
+ checks.isInt64_ = true;
561
+ checks.isUInt_ = true;
562
+ checks.isUInt64_ = true;
563
+ checks.isIntegral_ = true;
564
+ checks.isDouble_ = true;
565
+ checks.isNumeric_ = true;
566
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
567
+
568
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
569
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
570
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
571
+
572
+ JSONTEST_ASSERT_EQUAL(0, val.asInt());
573
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
574
+ JSONTEST_ASSERT_EQUAL(0, val.asUInt());
575
+ JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
576
+ JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
577
+ JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
578
+ JSONTEST_ASSERT_EQUAL(false, val.asBool());
579
+ JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
580
+
581
+ // 2^20 (signed constructor arg)
582
+ val = Json::Value(1 << 20);
583
+
584
+ JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
585
+ checks = IsCheck();
586
+ checks.isInt_ = true;
587
+ checks.isInt64_ = true;
588
+ checks.isUInt_ = true;
589
+ checks.isUInt64_ = true;
590
+ checks.isIntegral_ = true;
591
+ checks.isDouble_ = true;
592
+ checks.isNumeric_ = true;
593
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
594
+
595
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
596
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
597
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
598
+
599
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
600
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
601
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
602
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
603
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
604
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
605
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
606
+ JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
607
+
608
+ // 2^20 (unsigned constructor arg)
609
+ val = Json::Value(Json::UInt(1 << 20));
610
+
611
+ JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
612
+
613
+ checks = IsCheck();
614
+ checks.isInt_ = true;
615
+ checks.isInt64_ = true;
616
+ checks.isUInt_ = true;
617
+ checks.isUInt64_ = true;
618
+ checks.isIntegral_ = true;
619
+ checks.isDouble_ = true;
620
+ checks.isNumeric_ = true;
621
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
622
+
623
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
624
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
625
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
626
+
627
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
628
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
629
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
630
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
631
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
632
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
633
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
634
+ JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
635
+
636
+ // 2^20 (floating-point constructor arg)
637
+ val = Json::Value((1 << 20) / 1.0);
638
+
639
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
640
+
641
+ checks = IsCheck();
642
+ checks.isInt_ = true;
643
+ checks.isInt64_ = true;
644
+ checks.isUInt_ = true;
645
+ checks.isUInt64_ = true;
646
+ checks.isIntegral_ = true;
647
+ checks.isDouble_ = true;
648
+ checks.isNumeric_ = true;
649
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
650
+
651
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
652
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
653
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
654
+
655
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
656
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
657
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
658
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
659
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
660
+ JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
661
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
662
+ JSONTEST_ASSERT_STRING_EQUAL("1048576.0",
663
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
664
+
665
+ // -2^20
666
+ val = Json::Value(-(1 << 20));
667
+
668
+ JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
669
+
670
+ checks = IsCheck();
671
+ checks.isInt_ = true;
672
+ checks.isInt64_ = true;
673
+ checks.isIntegral_ = true;
674
+ checks.isDouble_ = true;
675
+ checks.isNumeric_ = true;
676
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
677
+
678
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
679
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
680
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
681
+
682
+ JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
683
+ JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
684
+ JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
685
+ JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
686
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
687
+ JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
688
+
689
+ // int32 max
690
+ val = Json::Value(kint32max);
691
+
692
+ JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
693
+
694
+ checks = IsCheck();
695
+ checks.isInt_ = true;
696
+ checks.isInt64_ = true;
697
+ checks.isUInt_ = true;
698
+ checks.isUInt64_ = true;
699
+ checks.isIntegral_ = true;
700
+ checks.isDouble_ = true;
701
+ checks.isNumeric_ = true;
702
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
703
+
704
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
705
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
706
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
707
+
708
+ JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
709
+ JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
710
+ JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
711
+ JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
712
+ JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
713
+ JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
714
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
715
+ JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
716
+
717
+ // int32 min
718
+ val = Json::Value(kint32min);
719
+
720
+ JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
721
+
722
+ checks = IsCheck();
723
+ checks.isInt_ = true;
724
+ checks.isInt64_ = true;
725
+ checks.isIntegral_ = true;
726
+ checks.isDouble_ = true;
727
+ checks.isNumeric_ = true;
728
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
729
+
730
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
731
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
732
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
733
+
734
+ JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
735
+ JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
736
+ JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
737
+ JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
738
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
739
+ JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
740
+
741
+ // uint32 max
742
+ val = Json::Value(kuint32max);
743
+
744
+ JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
745
+
746
+ checks = IsCheck();
747
+ checks.isInt64_ = true;
748
+ checks.isUInt_ = true;
749
+ checks.isUInt64_ = true;
750
+ checks.isIntegral_ = true;
751
+ checks.isDouble_ = true;
752
+ checks.isNumeric_ = true;
753
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
754
+
755
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
756
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
757
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
758
+
759
+ #ifndef JSON_NO_INT64
760
+ JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
761
+ #endif
762
+ JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
763
+ JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
764
+ JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
765
+ JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
766
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
767
+ JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
768
+
769
+ #ifdef JSON_NO_INT64
770
+ // int64 max
771
+ val = Json::Value(double(kint64max));
772
+
773
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
774
+
775
+ checks = IsCheck();
776
+ checks.isDouble_ = true;
777
+ checks.isNumeric_ = true;
778
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
779
+
780
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
781
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
782
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
783
+
784
+ JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
785
+ JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
786
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
787
+ JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
788
+
789
+ // int64 min
790
+ val = Json::Value(double(kint64min));
791
+
792
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
793
+
794
+ checks = IsCheck();
795
+ checks.isDouble_ = true;
796
+ checks.isNumeric_ = true;
797
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
798
+
799
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
800
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
801
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
802
+
803
+ JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
804
+ JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
805
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
806
+ JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
807
+
808
+ // uint64 max
809
+ val = Json::Value(double(kuint64max));
810
+
811
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
812
+
813
+ checks = IsCheck();
814
+ checks.isDouble_ = true;
815
+ checks.isNumeric_ = true;
816
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
817
+
818
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
819
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
820
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
821
+
822
+ JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
823
+ JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
824
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
825
+ JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
826
+ #else // ifdef JSON_NO_INT64
827
+ // 2^40 (signed constructor arg)
828
+ val = Json::Value(Json::Int64(1) << 40);
829
+
830
+ JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
831
+
832
+ checks = IsCheck();
833
+ checks.isInt64_ = true;
834
+ checks.isUInt64_ = true;
835
+ checks.isIntegral_ = true;
836
+ checks.isDouble_ = true;
837
+ checks.isNumeric_ = true;
838
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
839
+
840
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
841
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
842
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
843
+
844
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
845
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
846
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
847
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
848
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
849
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
850
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
851
+ JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
852
+
853
+ // 2^40 (unsigned constructor arg)
854
+ val = Json::Value(Json::UInt64(1) << 40);
855
+
856
+ JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
857
+
858
+ checks = IsCheck();
859
+ checks.isInt64_ = true;
860
+ checks.isUInt64_ = true;
861
+ checks.isIntegral_ = true;
862
+ checks.isDouble_ = true;
863
+ checks.isNumeric_ = true;
864
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
865
+
866
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
867
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
868
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
869
+
870
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
871
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
872
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
873
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
874
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
875
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
876
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
877
+ JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
878
+
879
+ // 2^40 (floating-point constructor arg)
880
+ val = Json::Value((Json::Int64(1) << 40) / 1.0);
881
+
882
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
883
+
884
+ checks = IsCheck();
885
+ checks.isInt64_ = true;
886
+ checks.isUInt64_ = true;
887
+ checks.isIntegral_ = true;
888
+ checks.isDouble_ = true;
889
+ checks.isNumeric_ = true;
890
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
891
+
892
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
893
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
894
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
895
+
896
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
897
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
898
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
899
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
900
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
901
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
902
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
903
+ JSONTEST_ASSERT_STRING_EQUAL("1099511627776.0",
904
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
905
+
906
+ // -2^40
907
+ val = Json::Value(-(Json::Int64(1) << 40));
908
+
909
+ JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
910
+
911
+ checks = IsCheck();
912
+ checks.isInt64_ = true;
913
+ checks.isIntegral_ = true;
914
+ checks.isDouble_ = true;
915
+ checks.isNumeric_ = true;
916
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
917
+
918
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
919
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
920
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
921
+
922
+ JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
923
+ JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
924
+ JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
925
+ JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
926
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
927
+ JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
928
+
929
+ // int64 max
930
+ val = Json::Value(Json::Int64(kint64max));
931
+
932
+ JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
933
+
934
+ checks = IsCheck();
935
+ checks.isInt64_ = true;
936
+ checks.isUInt64_ = true;
937
+ checks.isIntegral_ = true;
938
+ checks.isDouble_ = true;
939
+ checks.isNumeric_ = true;
940
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
941
+
942
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
943
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
944
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
945
+
946
+ JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
947
+ JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
948
+ JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
949
+ JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
950
+ JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
951
+ JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
952
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
953
+ JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
954
+
955
+ // int64 max (floating point constructor). Note that kint64max is not exactly
956
+ // representable as a double, and will be rounded up to be higher.
957
+ val = Json::Value(double(kint64max));
958
+
959
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
960
+
961
+ checks = IsCheck();
962
+ checks.isUInt64_ = true;
963
+ checks.isIntegral_ = true;
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(Json::UInt64(1) << 63, val.asUInt64());
973
+ JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
974
+ JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
975
+ JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(Json::UInt64(1) << 63)),
976
+ val.asFloat());
977
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
978
+ JSONTEST_ASSERT_STRING_EQUAL("9.2233720368547758e+18",
979
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
980
+
981
+ // int64 min
982
+ val = Json::Value(Json::Int64(kint64min));
983
+
984
+ JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
985
+
986
+ checks = IsCheck();
987
+ checks.isInt64_ = true;
988
+ checks.isIntegral_ = true;
989
+ checks.isDouble_ = true;
990
+ checks.isNumeric_ = true;
991
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
992
+
993
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
994
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
995
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
996
+
997
+ JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
998
+ JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
999
+ JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
1000
+ JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
1001
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
1002
+ JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
1003
+
1004
+ // int64 min (floating point constructor). Note that kint64min *is* exactly
1005
+ // representable as a double.
1006
+ val = Json::Value(double(kint64min));
1007
+
1008
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1009
+
1010
+ checks = IsCheck();
1011
+ checks.isInt64_ = true;
1012
+ checks.isIntegral_ = true;
1013
+ checks.isDouble_ = true;
1014
+ checks.isNumeric_ = true;
1015
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
1016
+
1017
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1018
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1019
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1020
+
1021
+ JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
1022
+ JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
1023
+ JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
1024
+ JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
1025
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
1026
+ JSONTEST_ASSERT_STRING_EQUAL("-9.2233720368547758e+18",
1027
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1028
+
1029
+ // 10^19
1030
+ const Json::UInt64 ten_to_19 = static_cast<Json::UInt64>(1e19);
1031
+ val = Json::Value(Json::UInt64(ten_to_19));
1032
+
1033
+ JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1034
+
1035
+ checks = IsCheck();
1036
+ checks.isUInt64_ = true;
1037
+ checks.isIntegral_ = true;
1038
+ checks.isDouble_ = true;
1039
+ checks.isNumeric_ = true;
1040
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
1041
+
1042
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1043
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1044
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1045
+
1046
+ JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
1047
+ JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
1048
+ JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
1049
+ JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
1050
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
1051
+ JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());
1052
+
1053
+ // 10^19 (double constructor). Note that 10^19 is not exactly representable
1054
+ // as a double.
1055
+ val = Json::Value(uint64ToDouble(ten_to_19));
1056
+
1057
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1058
+
1059
+ checks = IsCheck();
1060
+ checks.isUInt64_ = true;
1061
+ checks.isIntegral_ = true;
1062
+ checks.isDouble_ = true;
1063
+ checks.isNumeric_ = true;
1064
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
1065
+
1066
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1067
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1068
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1069
+
1070
+ JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
1071
+ JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
1072
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
1073
+ JSONTEST_ASSERT_STRING_EQUAL("1e+19",
1074
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1075
+
1076
+ // uint64 max
1077
+ val = Json::Value(Json::UInt64(kuint64max));
1078
+
1079
+ JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1080
+
1081
+ checks = IsCheck();
1082
+ checks.isUInt64_ = true;
1083
+ checks.isIntegral_ = true;
1084
+ checks.isDouble_ = true;
1085
+ checks.isNumeric_ = true;
1086
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
1087
+
1088
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1089
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1090
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1091
+
1092
+ JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
1093
+ JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
1094
+ JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
1095
+ JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
1096
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
1097
+ JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
1098
+
1099
+ // uint64 max (floating point constructor). Note that kuint64max is not
1100
+ // exactly representable as a double, and will be rounded up to be higher.
1101
+ val = Json::Value(uint64ToDouble(kuint64max));
1102
+
1103
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1104
+
1105
+ checks = IsCheck();
1106
+ checks.isDouble_ = true;
1107
+ checks.isNumeric_ = true;
1108
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
1109
+
1110
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1111
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1112
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1113
+
1114
+ JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
1115
+ JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
1116
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
1117
+ JSONTEST_ASSERT_STRING_EQUAL("1.8446744073709552e+19",
1118
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1119
+ #endif
1120
+ }
1121
+
1122
+ JSONTEST_FIXTURE(ValueTest, nonIntegers) {
1123
+ IsCheck checks;
1124
+ Json::Value val;
1125
+
1126
+ // Small positive number
1127
+ val = Json::Value(1.5);
1128
+
1129
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1130
+
1131
+ checks = IsCheck();
1132
+ checks.isDouble_ = true;
1133
+ checks.isNumeric_ = true;
1134
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
1135
+
1136
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1137
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1138
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1139
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1140
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1141
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1142
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1143
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1144
+
1145
+ JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
1146
+ JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
1147
+ JSONTEST_ASSERT_EQUAL(1, val.asInt());
1148
+ JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
1149
+ JSONTEST_ASSERT_EQUAL(1, val.asUInt());
1150
+ JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
1151
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
1152
+ JSONTEST_ASSERT_EQUAL("1.5", val.asString());
1153
+
1154
+ // Small negative number
1155
+ val = Json::Value(-1.5);
1156
+
1157
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1158
+
1159
+ checks = IsCheck();
1160
+ checks.isDouble_ = true;
1161
+ checks.isNumeric_ = true;
1162
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
1163
+
1164
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
1165
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1166
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1167
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1168
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1169
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1170
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1171
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1172
+
1173
+ JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
1174
+ JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
1175
+ JSONTEST_ASSERT_EQUAL(-1, val.asInt());
1176
+ JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
1177
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
1178
+ JSONTEST_ASSERT_EQUAL("-1.5", val.asString());
1179
+
1180
+ // A bit over int32 max
1181
+ val = Json::Value(kint32max + 0.5);
1182
+
1183
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1184
+
1185
+ checks = IsCheck();
1186
+ checks.isDouble_ = true;
1187
+ checks.isNumeric_ = true;
1188
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
1189
+
1190
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
1191
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1192
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1193
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1194
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1195
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1196
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1197
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1198
+
1199
+ JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
1200
+ JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
1201
+ JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
1202
+ #ifdef JSON_HAS_INT64
1203
+ JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
1204
+ JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
1205
+ #endif
1206
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
1207
+ JSONTEST_ASSERT_EQUAL("2147483647.5",
1208
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1209
+
1210
+ // A bit under int32 min
1211
+ val = Json::Value(kint32min - 0.5);
1212
+
1213
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1214
+
1215
+ checks = IsCheck();
1216
+ checks.isDouble_ = true;
1217
+ checks.isNumeric_ = true;
1218
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
1219
+
1220
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1221
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1222
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1223
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1224
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1225
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1226
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1227
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1228
+
1229
+ JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
1230
+ JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
1231
+ #ifdef JSON_HAS_INT64
1232
+ JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 31), val.asLargestInt());
1233
+ #endif
1234
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
1235
+ JSONTEST_ASSERT_EQUAL("-2147483648.5",
1236
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1237
+
1238
+ // A bit over uint32 max
1239
+ val = Json::Value(kuint32max + 0.5);
1240
+
1241
+ JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1242
+
1243
+ checks = IsCheck();
1244
+ checks.isDouble_ = true;
1245
+ checks.isNumeric_ = true;
1246
+ JSONTEST_ASSERT_PRED(checkIs(val, checks));
1247
+
1248
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
1249
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
1250
+ JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
1251
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
1252
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
1253
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
1254
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
1255
+ JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));
1256
+
1257
+ JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
1258
+ JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
1259
+ #ifdef JSON_HAS_INT64
1260
+ JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32) - 1, val.asLargestInt());
1261
+ JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32) - Json::UInt64(1),
1262
+ val.asLargestUInt());
1263
+ #endif
1264
+ JSONTEST_ASSERT_EQUAL(true, val.asBool());
1265
+ JSONTEST_ASSERT_EQUAL("4294967295.5",
1266
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1267
+
1268
+ val = Json::Value(1.2345678901234);
1269
+ JSONTEST_ASSERT_STRING_EQUAL("1.2345678901234001",
1270
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1271
+
1272
+ // A 16-digit floating point number.
1273
+ val = Json::Value(2199023255552000.0f);
1274
+ JSONTEST_ASSERT_EQUAL(float(2199023255552000.0f), val.asFloat());
1275
+ JSONTEST_ASSERT_STRING_EQUAL("2199023255552000.0",
1276
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1277
+
1278
+ // A very large floating point number.
1279
+ val = Json::Value(3.402823466385289e38);
1280
+ JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
1281
+ JSONTEST_ASSERT_STRING_EQUAL("3.402823466385289e+38",
1282
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1283
+
1284
+ // An even larger floating point number.
1285
+ val = Json::Value(1.2345678e300);
1286
+ JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
1287
+ JSONTEST_ASSERT_STRING_EQUAL("1.2345678e+300",
1288
+ normalizeFloatingPointStr(JsonTest::ToJsonString(val.asString())));
1289
+ }
1290
+
1291
+ void ValueTest::checkConstMemberCount(const Json::Value& value,
1292
+ unsigned int expectedCount) {
1293
+ unsigned int count = 0;
1294
+ Json::Value::const_iterator itEnd = value.end();
1295
+ for (Json::Value::const_iterator it = value.begin(); it != itEnd; ++it) {
1296
+ ++count;
1297
+ }
1298
+ JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::const_iterator";
1299
+ }
1300
+
1301
+ void ValueTest::checkMemberCount(Json::Value& value,
1302
+ unsigned int expectedCount) {
1303
+ JSONTEST_ASSERT_EQUAL(expectedCount, value.size());
1304
+
1305
+ unsigned int count = 0;
1306
+ Json::Value::iterator itEnd = value.end();
1307
+ for (Json::Value::iterator it = value.begin(); it != itEnd; ++it) {
1308
+ ++count;
1309
+ }
1310
+ JSONTEST_ASSERT_EQUAL(expectedCount, count) << "Json::Value::iterator";
1311
+
1312
+ JSONTEST_ASSERT_PRED(checkConstMemberCount(value, expectedCount));
1313
+ }
1314
+
1315
+ ValueTest::IsCheck::IsCheck()
1316
+ : isObject_(false), isArray_(false), isBool_(false), isString_(false),
1317
+ isNull_(false), isInt_(false), isInt64_(false), isUInt_(false),
1318
+ isUInt64_(false), isIntegral_(false), isDouble_(false),
1319
+ isNumeric_(false) {}
1320
+
1321
+ void ValueTest::checkIs(const Json::Value& value, const IsCheck& check) {
1322
+ JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject());
1323
+ JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray());
1324
+ JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool());
1325
+ JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble());
1326
+ JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt());
1327
+ JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt());
1328
+ JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral());
1329
+ JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric());
1330
+ JSONTEST_ASSERT_EQUAL(check.isString_, value.isString());
1331
+ JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull());
1332
+
1333
+ #ifdef JSON_HAS_INT64
1334
+ JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64());
1335
+ JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64());
1336
+ #else
1337
+ JSONTEST_ASSERT_EQUAL(false, value.isInt64());
1338
+ JSONTEST_ASSERT_EQUAL(false, value.isUInt64());
1339
+ #endif
1340
+ }
1341
+
1342
+ JSONTEST_FIXTURE(ValueTest, compareNull) {
1343
+ JSONTEST_ASSERT_PRED(checkIsEqual(Json::Value(), Json::Value()));
1344
+ }
1345
+
1346
+ JSONTEST_FIXTURE(ValueTest, compareInt) {
1347
+ JSONTEST_ASSERT_PRED(checkIsLess(0, 10));
1348
+ JSONTEST_ASSERT_PRED(checkIsEqual(10, 10));
1349
+ JSONTEST_ASSERT_PRED(checkIsEqual(-10, -10));
1350
+ JSONTEST_ASSERT_PRED(checkIsLess(-10, 0));
1351
+ }
1352
+
1353
+ JSONTEST_FIXTURE(ValueTest, compareUInt) {
1354
+ JSONTEST_ASSERT_PRED(checkIsLess(0u, 10u));
1355
+ JSONTEST_ASSERT_PRED(checkIsLess(0u, Json::Value::maxUInt));
1356
+ JSONTEST_ASSERT_PRED(checkIsEqual(10u, 10u));
1357
+ }
1358
+
1359
+ JSONTEST_FIXTURE(ValueTest, compareDouble) {
1360
+ JSONTEST_ASSERT_PRED(checkIsLess(0.0, 10.0));
1361
+ JSONTEST_ASSERT_PRED(checkIsEqual(10.0, 10.0));
1362
+ JSONTEST_ASSERT_PRED(checkIsEqual(-10.0, -10.0));
1363
+ JSONTEST_ASSERT_PRED(checkIsLess(-10.0, 0.0));
1364
+ }
1365
+
1366
+ JSONTEST_FIXTURE(ValueTest, compareString) {
1367
+ JSONTEST_ASSERT_PRED(checkIsLess("", " "));
1368
+ JSONTEST_ASSERT_PRED(checkIsLess("", "a"));
1369
+ JSONTEST_ASSERT_PRED(checkIsLess("abcd", "zyui"));
1370
+ JSONTEST_ASSERT_PRED(checkIsLess("abc", "abcd"));
1371
+ JSONTEST_ASSERT_PRED(checkIsEqual("abcd", "abcd"));
1372
+ JSONTEST_ASSERT_PRED(checkIsEqual(" ", " "));
1373
+ JSONTEST_ASSERT_PRED(checkIsLess("ABCD", "abcd"));
1374
+ JSONTEST_ASSERT_PRED(checkIsEqual("ABCD", "ABCD"));
1375
+ }
1376
+
1377
+ JSONTEST_FIXTURE(ValueTest, compareBoolean) {
1378
+ JSONTEST_ASSERT_PRED(checkIsLess(false, true));
1379
+ JSONTEST_ASSERT_PRED(checkIsEqual(false, false));
1380
+ JSONTEST_ASSERT_PRED(checkIsEqual(true, true));
1381
+ }
1382
+
1383
+ JSONTEST_FIXTURE(ValueTest, compareArray) {
1384
+ // array compare size then content
1385
+ Json::Value emptyArray(Json::arrayValue);
1386
+ Json::Value l1aArray;
1387
+ l1aArray.append(0);
1388
+ Json::Value l1bArray;
1389
+ l1bArray.append(10);
1390
+ Json::Value l2aArray;
1391
+ l2aArray.append(0);
1392
+ l2aArray.append(0);
1393
+ Json::Value l2bArray;
1394
+ l2bArray.append(0);
1395
+ l2bArray.append(10);
1396
+ JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l1aArray));
1397
+ JSONTEST_ASSERT_PRED(checkIsLess(emptyArray, l2aArray));
1398
+ JSONTEST_ASSERT_PRED(checkIsLess(l1aArray, l2aArray));
1399
+ JSONTEST_ASSERT_PRED(checkIsLess(l2aArray, l2bArray));
1400
+ JSONTEST_ASSERT_PRED(checkIsEqual(emptyArray, Json::Value(emptyArray)));
1401
+ JSONTEST_ASSERT_PRED(checkIsEqual(l1aArray, Json::Value(l1aArray)));
1402
+ JSONTEST_ASSERT_PRED(checkIsEqual(l2bArray, Json::Value(l2bArray)));
1403
+ }
1404
+
1405
+ JSONTEST_FIXTURE(ValueTest, compareObject) {
1406
+ // object compare size then content
1407
+ Json::Value emptyObject(Json::objectValue);
1408
+ Json::Value l1aObject;
1409
+ l1aObject["key1"] = 0;
1410
+ Json::Value l1bObject;
1411
+ l1aObject["key1"] = 10;
1412
+ Json::Value l2aObject;
1413
+ l2aObject["key1"] = 0;
1414
+ l2aObject["key2"] = 0;
1415
+ JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l1aObject));
1416
+ JSONTEST_ASSERT_PRED(checkIsLess(emptyObject, l2aObject));
1417
+ JSONTEST_ASSERT_PRED(checkIsLess(l1aObject, l2aObject));
1418
+ JSONTEST_ASSERT_PRED(checkIsEqual(emptyObject, Json::Value(emptyObject)));
1419
+ JSONTEST_ASSERT_PRED(checkIsEqual(l1aObject, Json::Value(l1aObject)));
1420
+ JSONTEST_ASSERT_PRED(checkIsEqual(l2aObject, Json::Value(l2aObject)));
1421
+ }
1422
+
1423
+ JSONTEST_FIXTURE(ValueTest, compareType) {
1424
+ // object of different type are ordered according to their type
1425
+ JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(), Json::Value(1)));
1426
+ JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1), Json::Value(1u)));
1427
+ JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1u), Json::Value(1.0)));
1428
+ JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(1.0), Json::Value("a")));
1429
+ JSONTEST_ASSERT_PRED(checkIsLess(Json::Value("a"), Json::Value(true)));
1430
+ JSONTEST_ASSERT_PRED(
1431
+ checkIsLess(Json::Value(true), Json::Value(Json::arrayValue)));
1432
+ JSONTEST_ASSERT_PRED(checkIsLess(Json::Value(Json::arrayValue),
1433
+ Json::Value(Json::objectValue)));
1434
+ }
1435
+
1436
+ void ValueTest::checkIsLess(const Json::Value& x, const Json::Value& y) {
1437
+ JSONTEST_ASSERT(x < y);
1438
+ JSONTEST_ASSERT(y > x);
1439
+ JSONTEST_ASSERT(x <= y);
1440
+ JSONTEST_ASSERT(y >= x);
1441
+ JSONTEST_ASSERT(!(x == y));
1442
+ JSONTEST_ASSERT(!(y == x));
1443
+ JSONTEST_ASSERT(!(x >= y));
1444
+ JSONTEST_ASSERT(!(y <= x));
1445
+ JSONTEST_ASSERT(!(x > y));
1446
+ JSONTEST_ASSERT(!(y < x));
1447
+ JSONTEST_ASSERT(x.compare(y) < 0);
1448
+ JSONTEST_ASSERT(y.compare(x) >= 0);
1449
+ }
1450
+
1451
+ void ValueTest::checkIsEqual(const Json::Value& x, const Json::Value& y) {
1452
+ JSONTEST_ASSERT(x == y);
1453
+ JSONTEST_ASSERT(y == x);
1454
+ JSONTEST_ASSERT(x <= y);
1455
+ JSONTEST_ASSERT(y <= x);
1456
+ JSONTEST_ASSERT(x >= y);
1457
+ JSONTEST_ASSERT(y >= x);
1458
+ JSONTEST_ASSERT(!(x < y));
1459
+ JSONTEST_ASSERT(!(y < x));
1460
+ JSONTEST_ASSERT(!(x > y));
1461
+ JSONTEST_ASSERT(!(y > x));
1462
+ JSONTEST_ASSERT(x.compare(y) == 0);
1463
+ JSONTEST_ASSERT(y.compare(x) == 0);
1464
+ }
1465
+
1466
+ JSONTEST_FIXTURE(ValueTest, typeChecksThrowExceptions) {
1467
+ #if JSON_USE_EXCEPTION
1468
+
1469
+ Json::Value intVal(1);
1470
+ Json::Value strVal("Test");
1471
+ Json::Value objVal(Json::objectValue);
1472
+ Json::Value arrVal(Json::arrayValue);
1473
+
1474
+ JSONTEST_ASSERT_THROWS(intVal["test"]);
1475
+ JSONTEST_ASSERT_THROWS(strVal["test"]);
1476
+ JSONTEST_ASSERT_THROWS(arrVal["test"]);
1477
+
1478
+ JSONTEST_ASSERT_THROWS(intVal.removeMember("test"));
1479
+ JSONTEST_ASSERT_THROWS(strVal.removeMember("test"));
1480
+ JSONTEST_ASSERT_THROWS(arrVal.removeMember("test"));
1481
+
1482
+ JSONTEST_ASSERT_THROWS(intVal.getMemberNames());
1483
+ JSONTEST_ASSERT_THROWS(strVal.getMemberNames());
1484
+ JSONTEST_ASSERT_THROWS(arrVal.getMemberNames());
1485
+
1486
+ JSONTEST_ASSERT_THROWS(intVal[0]);
1487
+ JSONTEST_ASSERT_THROWS(objVal[0]);
1488
+ JSONTEST_ASSERT_THROWS(strVal[0]);
1489
+
1490
+ JSONTEST_ASSERT_THROWS(intVal.clear());
1491
+
1492
+ JSONTEST_ASSERT_THROWS(intVal.resize(1));
1493
+ JSONTEST_ASSERT_THROWS(strVal.resize(1));
1494
+ JSONTEST_ASSERT_THROWS(objVal.resize(1));
1495
+
1496
+ JSONTEST_ASSERT_THROWS(intVal.asCString());
1497
+
1498
+ JSONTEST_ASSERT_THROWS(objVal.asString());
1499
+ JSONTEST_ASSERT_THROWS(arrVal.asString());
1500
+
1501
+ JSONTEST_ASSERT_THROWS(strVal.asInt());
1502
+ JSONTEST_ASSERT_THROWS(objVal.asInt());
1503
+ JSONTEST_ASSERT_THROWS(arrVal.asInt());
1504
+
1505
+ JSONTEST_ASSERT_THROWS(strVal.asUInt());
1506
+ JSONTEST_ASSERT_THROWS(objVal.asUInt());
1507
+ JSONTEST_ASSERT_THROWS(arrVal.asUInt());
1508
+
1509
+ JSONTEST_ASSERT_THROWS(strVal.asInt64());
1510
+ JSONTEST_ASSERT_THROWS(objVal.asInt64());
1511
+ JSONTEST_ASSERT_THROWS(arrVal.asInt64());
1512
+
1513
+ JSONTEST_ASSERT_THROWS(strVal.asUInt64());
1514
+ JSONTEST_ASSERT_THROWS(objVal.asUInt64());
1515
+ JSONTEST_ASSERT_THROWS(arrVal.asUInt64());
1516
+
1517
+ JSONTEST_ASSERT_THROWS(strVal.asDouble());
1518
+ JSONTEST_ASSERT_THROWS(objVal.asDouble());
1519
+ JSONTEST_ASSERT_THROWS(arrVal.asDouble());
1520
+
1521
+ JSONTEST_ASSERT_THROWS(strVal.asFloat());
1522
+ JSONTEST_ASSERT_THROWS(objVal.asFloat());
1523
+ JSONTEST_ASSERT_THROWS(arrVal.asFloat());
1524
+
1525
+ JSONTEST_ASSERT_THROWS(strVal.asBool());
1526
+ JSONTEST_ASSERT_THROWS(objVal.asBool());
1527
+ JSONTEST_ASSERT_THROWS(arrVal.asBool());
1528
+
1529
+ #endif
1530
+ }
1531
+
1532
+ JSONTEST_FIXTURE(ValueTest, offsetAccessors) {
1533
+ Json::Value x;
1534
+ JSONTEST_ASSERT(x.getOffsetStart() == 0);
1535
+ JSONTEST_ASSERT(x.getOffsetLimit() == 0);
1536
+ x.setOffsetStart(10);
1537
+ x.setOffsetLimit(20);
1538
+ JSONTEST_ASSERT(x.getOffsetStart() == 10);
1539
+ JSONTEST_ASSERT(x.getOffsetLimit() == 20);
1540
+ Json::Value y(x);
1541
+ JSONTEST_ASSERT(y.getOffsetStart() == 10);
1542
+ JSONTEST_ASSERT(y.getOffsetLimit() == 20);
1543
+ Json::Value z;
1544
+ z.swap(y);
1545
+ JSONTEST_ASSERT(z.getOffsetStart() == 10);
1546
+ JSONTEST_ASSERT(z.getOffsetLimit() == 20);
1547
+ JSONTEST_ASSERT(y.getOffsetStart() == 0);
1548
+ JSONTEST_ASSERT(y.getOffsetLimit() == 0);
1549
+ }
1550
+
1551
+ JSONTEST_FIXTURE(ValueTest, StaticString) {
1552
+ char mutant[] = "hello";
1553
+ Json::StaticString ss(mutant);
1554
+ JSONCPP_STRING regular(mutant);
1555
+ mutant[1] = 'a';
1556
+ JSONTEST_ASSERT_STRING_EQUAL("hallo", ss.c_str());
1557
+ JSONTEST_ASSERT_STRING_EQUAL("hello", regular.c_str());
1558
+ {
1559
+ Json::Value root;
1560
+ root["top"] = ss;
1561
+ JSONTEST_ASSERT_STRING_EQUAL("hallo", root["top"].asString());
1562
+ mutant[1] = 'u';
1563
+ JSONTEST_ASSERT_STRING_EQUAL("hullo", root["top"].asString());
1564
+ }
1565
+ {
1566
+ Json::Value root;
1567
+ root["top"] = regular;
1568
+ JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
1569
+ mutant[1] = 'u';
1570
+ JSONTEST_ASSERT_STRING_EQUAL("hello", root["top"].asString());
1571
+ }
1572
+ }
1573
+
1574
+ JSONTEST_FIXTURE(ValueTest, CommentBefore) {
1575
+ Json::Value val; // fill val
1576
+ val.setComment(JSONCPP_STRING("// this comment should appear before"), Json::commentBefore);
1577
+ Json::StreamWriterBuilder wbuilder;
1578
+ wbuilder.settings_["commentStyle"] = "All";
1579
+ {
1580
+ char const expected[] = "// this comment should appear before\nnull";
1581
+ JSONCPP_STRING result = Json::writeString(wbuilder, val);
1582
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1583
+ JSONCPP_STRING res2 = val.toStyledString();
1584
+ JSONCPP_STRING exp2 = "\n";
1585
+ exp2 += expected;
1586
+ exp2 += "\n";
1587
+ JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1588
+ }
1589
+ Json::Value other = "hello";
1590
+ val.swapPayload(other);
1591
+ {
1592
+ char const expected[] = "// this comment should appear before\n\"hello\"";
1593
+ JSONCPP_STRING result = Json::writeString(wbuilder, val);
1594
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1595
+ JSONCPP_STRING res2 = val.toStyledString();
1596
+ JSONCPP_STRING exp2 = "\n";
1597
+ exp2 += expected;
1598
+ exp2 += "\n";
1599
+ JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1600
+ JSONTEST_ASSERT_STRING_EQUAL("null\n", other.toStyledString());
1601
+ }
1602
+ val = "hello";
1603
+ // val.setComment("// this comment should appear before", Json::CommentPlacement::commentBefore);
1604
+ // Assignment over-writes comments.
1605
+ {
1606
+ char const expected[] = "\"hello\"";
1607
+ JSONCPP_STRING result = Json::writeString(wbuilder, val);
1608
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1609
+ JSONCPP_STRING res2 = val.toStyledString();
1610
+ JSONCPP_STRING exp2 = "";
1611
+ exp2 += expected;
1612
+ exp2 += "\n";
1613
+ JSONTEST_ASSERT_STRING_EQUAL(exp2, res2);
1614
+ }
1615
+ }
1616
+
1617
+ JSONTEST_FIXTURE(ValueTest, zeroes) {
1618
+ char const cstr[] = "h\0i";
1619
+ JSONCPP_STRING binary(cstr, sizeof(cstr)); // include trailing 0
1620
+ JSONTEST_ASSERT_EQUAL(4U, binary.length());
1621
+ Json::StreamWriterBuilder b;
1622
+ {
1623
+ Json::Value root;
1624
+ root = binary;
1625
+ JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
1626
+ }
1627
+ {
1628
+ char const top[] = "top";
1629
+ Json::Value root;
1630
+ root[top] = binary;
1631
+ JSONTEST_ASSERT_STRING_EQUAL(binary, root[top].asString());
1632
+ Json::Value removed;
1633
+ bool did;
1634
+ did = root.removeMember(top, top + sizeof(top) - 1U,
1635
+ &removed);
1636
+ JSONTEST_ASSERT(did);
1637
+ JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString());
1638
+ did = root.removeMember(top, top + sizeof(top) - 1U,
1639
+ &removed);
1640
+ JSONTEST_ASSERT(!did);
1641
+ JSONTEST_ASSERT_STRING_EQUAL(binary, removed.asString()); // still
1642
+ }
1643
+ }
1644
+
1645
+ JSONTEST_FIXTURE(ValueTest, zeroesInKeys) {
1646
+ char const cstr[] = "h\0i";
1647
+ JSONCPP_STRING binary(cstr, sizeof(cstr)); // include trailing 0
1648
+ JSONTEST_ASSERT_EQUAL(4U, binary.length());
1649
+ {
1650
+ Json::Value root;
1651
+ root[binary] = "there";
1652
+ JSONTEST_ASSERT_STRING_EQUAL("there", root[binary].asString());
1653
+ JSONTEST_ASSERT(!root.isMember("h"));
1654
+ JSONTEST_ASSERT(root.isMember(binary));
1655
+ JSONTEST_ASSERT_STRING_EQUAL("there", root.get(binary, Json::Value::nullRef).asString());
1656
+ Json::Value removed;
1657
+ bool did;
1658
+ did = root.removeMember(binary.data(), binary.data() + binary.length(),
1659
+ &removed);
1660
+ JSONTEST_ASSERT(did);
1661
+ JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString());
1662
+ did = root.removeMember(binary.data(), binary.data() + binary.length(),
1663
+ &removed);
1664
+ JSONTEST_ASSERT(!did);
1665
+ JSONTEST_ASSERT_STRING_EQUAL("there", removed.asString()); // still
1666
+ JSONTEST_ASSERT(!root.isMember(binary));
1667
+ JSONTEST_ASSERT_STRING_EQUAL("", root.get(binary, Json::Value::nullRef).asString());
1668
+ }
1669
+ }
1670
+
1671
+ JSONTEST_FIXTURE(ValueTest, specialFloats) {
1672
+ Json::StreamWriterBuilder b;
1673
+ b.settings_["useSpecialFloats"] = true;
1674
+
1675
+ Json::Value v = std::numeric_limits<double>::quiet_NaN();
1676
+ JSONCPP_STRING expected = "NaN";
1677
+ JSONCPP_STRING result = Json::writeString(b, v);
1678
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1679
+
1680
+ v = std::numeric_limits<double>::infinity();
1681
+ expected = "Infinity";
1682
+ result = Json::writeString(b, v);
1683
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1684
+
1685
+ v = -std::numeric_limits<double>::infinity();
1686
+ expected = "-Infinity";
1687
+ result = Json::writeString(b, v);
1688
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1689
+ }
1690
+
1691
+ JSONTEST_FIXTURE(ValueTest, precision) {
1692
+ Json::StreamWriterBuilder b;
1693
+ b.settings_["precision"] = 5;
1694
+
1695
+ Json::Value v = 100.0/3;
1696
+ JSONCPP_STRING expected = "33.333";
1697
+ JSONCPP_STRING result = Json::writeString(b, v);
1698
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1699
+
1700
+ v = 0.25000000;
1701
+ expected = "0.25";
1702
+ result = Json::writeString(b, v);
1703
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1704
+
1705
+ v = 0.2563456;
1706
+ expected = "0.25635";
1707
+ result = Json::writeString(b, v);
1708
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1709
+
1710
+ b.settings_["precision"] = 1;
1711
+ expected = "0.3";
1712
+ result = Json::writeString(b, v);
1713
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1714
+
1715
+ b.settings_["precision"] = 17;
1716
+ v = 1234857476305.256345694873740545068;
1717
+ expected = "1234857476305.2563";
1718
+ result = Json::writeString(b, v);
1719
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1720
+
1721
+ b.settings_["precision"] = 24;
1722
+ v = 0.256345694873740545068;
1723
+ expected = "0.25634569487374054";
1724
+ result = Json::writeString(b, v);
1725
+ JSONTEST_ASSERT_STRING_EQUAL(expected, result);
1726
+ }
1727
+
1728
+ struct WriterTest : JsonTest::TestCase {};
1729
+
1730
+ JSONTEST_FIXTURE(WriterTest, dropNullPlaceholders) {
1731
+ Json::FastWriter writer;
1732
+ Json::Value nullValue;
1733
+ JSONTEST_ASSERT(writer.write(nullValue) == "null\n");
1734
+
1735
+ writer.dropNullPlaceholders();
1736
+ JSONTEST_ASSERT(writer.write(nullValue) == "\n");
1737
+ }
1738
+
1739
+ struct StreamWriterTest : JsonTest::TestCase {};
1740
+
1741
+ JSONTEST_FIXTURE(StreamWriterTest, dropNullPlaceholders) {
1742
+ Json::StreamWriterBuilder b;
1743
+ Json::Value nullValue;
1744
+ b.settings_["dropNullPlaceholders"] = false;
1745
+ JSONTEST_ASSERT(Json::writeString(b, nullValue) == "null");
1746
+ b.settings_["dropNullPlaceholders"] = true;
1747
+ JSONTEST_ASSERT(Json::writeString(b, nullValue) == "");
1748
+ }
1749
+
1750
+ JSONTEST_FIXTURE(StreamWriterTest, writeZeroes) {
1751
+ JSONCPP_STRING binary("hi", 3); // include trailing 0
1752
+ JSONTEST_ASSERT_EQUAL(3, binary.length());
1753
+ JSONCPP_STRING expected("\"hi\\u0000\""); // unicoded zero
1754
+ Json::StreamWriterBuilder b;
1755
+ {
1756
+ Json::Value root;
1757
+ root = binary;
1758
+ JSONTEST_ASSERT_STRING_EQUAL(binary, root.asString());
1759
+ JSONCPP_STRING out = Json::writeString(b, root);
1760
+ JSONTEST_ASSERT_EQUAL(expected.size(), out.size());
1761
+ JSONTEST_ASSERT_STRING_EQUAL(expected, out);
1762
+ }
1763
+ {
1764
+ Json::Value root;
1765
+ root["top"] = binary;
1766
+ JSONTEST_ASSERT_STRING_EQUAL(binary, root["top"].asString());
1767
+ JSONCPP_STRING out = Json::writeString(b, root["top"]);
1768
+ JSONTEST_ASSERT_STRING_EQUAL(expected, out);
1769
+ }
1770
+ }
1771
+
1772
+ struct ReaderTest : JsonTest::TestCase {};
1773
+
1774
+ JSONTEST_FIXTURE(ReaderTest, parseWithNoErrors) {
1775
+ Json::Reader reader;
1776
+ Json::Value root;
1777
+ bool ok = reader.parse("{ \"property\" : \"value\" }", root);
1778
+ JSONTEST_ASSERT(ok);
1779
+ JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
1780
+ JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
1781
+ }
1782
+
1783
+ JSONTEST_FIXTURE(ReaderTest, parseWithNoErrorsTestingOffsets) {
1784
+ Json::Reader reader;
1785
+ Json::Value root;
1786
+ bool ok = reader.parse("{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
1787
+ "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
1788
+ "null, \"false\" : false }",
1789
+ root);
1790
+ JSONTEST_ASSERT(ok);
1791
+ JSONTEST_ASSERT(reader.getFormattedErrorMessages().size() == 0);
1792
+ JSONTEST_ASSERT(reader.getStructuredErrors().size() == 0);
1793
+ JSONTEST_ASSERT(root["property"].getOffsetStart() == 15);
1794
+ JSONTEST_ASSERT(root["property"].getOffsetLimit() == 34);
1795
+ JSONTEST_ASSERT(root["property"][0].getOffsetStart() == 16);
1796
+ JSONTEST_ASSERT(root["property"][0].getOffsetLimit() == 23);
1797
+ JSONTEST_ASSERT(root["property"][1].getOffsetStart() == 25);
1798
+ JSONTEST_ASSERT(root["property"][1].getOffsetLimit() == 33);
1799
+ JSONTEST_ASSERT(root["obj"].getOffsetStart() == 44);
1800
+ JSONTEST_ASSERT(root["obj"].getOffsetLimit() == 76);
1801
+ JSONTEST_ASSERT(root["obj"]["nested"].getOffsetStart() == 57);
1802
+ JSONTEST_ASSERT(root["obj"]["nested"].getOffsetLimit() == 60);
1803
+ JSONTEST_ASSERT(root["obj"]["bool"].getOffsetStart() == 71);
1804
+ JSONTEST_ASSERT(root["obj"]["bool"].getOffsetLimit() == 75);
1805
+ JSONTEST_ASSERT(root["null"].getOffsetStart() == 87);
1806
+ JSONTEST_ASSERT(root["null"].getOffsetLimit() == 91);
1807
+ JSONTEST_ASSERT(root["false"].getOffsetStart() == 103);
1808
+ JSONTEST_ASSERT(root["false"].getOffsetLimit() == 108);
1809
+ JSONTEST_ASSERT(root.getOffsetStart() == 0);
1810
+ JSONTEST_ASSERT(root.getOffsetLimit() == 110);
1811
+ }
1812
+
1813
+ JSONTEST_FIXTURE(ReaderTest, parseWithOneError) {
1814
+ Json::Reader reader;
1815
+ Json::Value root;
1816
+ bool ok = reader.parse("{ \"property\" :: \"value\" }", root);
1817
+ JSONTEST_ASSERT(!ok);
1818
+ JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1819
+ "* Line 1, Column 15\n Syntax error: value, object or array "
1820
+ "expected.\n");
1821
+ std::vector<Json::Reader::StructuredError> errors =
1822
+ reader.getStructuredErrors();
1823
+ JSONTEST_ASSERT(errors.size() == 1);
1824
+ JSONTEST_ASSERT(errors.at(0).offset_start == 14);
1825
+ JSONTEST_ASSERT(errors.at(0).offset_limit == 15);
1826
+ JSONTEST_ASSERT(errors.at(0).message ==
1827
+ "Syntax error: value, object or array expected.");
1828
+ }
1829
+
1830
+ JSONTEST_FIXTURE(ReaderTest, parseChineseWithOneError) {
1831
+ Json::Reader reader;
1832
+ Json::Value root;
1833
+ bool ok = reader.parse("{ \"pr佐藤erty\" :: \"value\" }", root);
1834
+ JSONTEST_ASSERT(!ok);
1835
+ JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1836
+ "* Line 1, Column 19\n Syntax error: value, object or array "
1837
+ "expected.\n");
1838
+ std::vector<Json::Reader::StructuredError> errors =
1839
+ reader.getStructuredErrors();
1840
+ JSONTEST_ASSERT(errors.size() == 1);
1841
+ JSONTEST_ASSERT(errors.at(0).offset_start == 18);
1842
+ JSONTEST_ASSERT(errors.at(0).offset_limit == 19);
1843
+ JSONTEST_ASSERT(errors.at(0).message ==
1844
+ "Syntax error: value, object or array expected.");
1845
+ }
1846
+
1847
+ JSONTEST_FIXTURE(ReaderTest, parseWithDetailError) {
1848
+ Json::Reader reader;
1849
+ Json::Value root;
1850
+ bool ok = reader.parse("{ \"property\" : \"v\\alue\" }", root);
1851
+ JSONTEST_ASSERT(!ok);
1852
+ JSONTEST_ASSERT(reader.getFormattedErrorMessages() ==
1853
+ "* Line 1, Column 16\n Bad escape sequence in string\nSee "
1854
+ "Line 1, Column 20 for detail.\n");
1855
+ std::vector<Json::Reader::StructuredError> errors =
1856
+ reader.getStructuredErrors();
1857
+ JSONTEST_ASSERT(errors.size() == 1);
1858
+ JSONTEST_ASSERT(errors.at(0).offset_start == 15);
1859
+ JSONTEST_ASSERT(errors.at(0).offset_limit == 23);
1860
+ JSONTEST_ASSERT(errors.at(0).message == "Bad escape sequence in string");
1861
+ }
1862
+
1863
+ struct CharReaderTest : JsonTest::TestCase {};
1864
+
1865
+ JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrors) {
1866
+ Json::CharReaderBuilder b;
1867
+ Json::CharReader* reader(b.newCharReader());
1868
+ JSONCPP_STRING errs;
1869
+ Json::Value root;
1870
+ char const doc[] = "{ \"property\" : \"value\" }";
1871
+ bool ok = reader->parse(
1872
+ doc, doc + std::strlen(doc),
1873
+ &root, &errs);
1874
+ JSONTEST_ASSERT(ok);
1875
+ JSONTEST_ASSERT(errs.size() == 0);
1876
+ delete reader;
1877
+ }
1878
+
1879
+ JSONTEST_FIXTURE(CharReaderTest, parseWithNoErrorsTestingOffsets) {
1880
+ Json::CharReaderBuilder b;
1881
+ Json::CharReader* reader(b.newCharReader());
1882
+ JSONCPP_STRING errs;
1883
+ Json::Value root;
1884
+ char const doc[] =
1885
+ "{ \"property\" : [\"value\", \"value2\"], \"obj\" : "
1886
+ "{ \"nested\" : 123, \"bool\" : true}, \"null\" : "
1887
+ "null, \"false\" : false }";
1888
+ bool ok = reader->parse(
1889
+ doc, doc + std::strlen(doc),
1890
+ &root, &errs);
1891
+ JSONTEST_ASSERT(ok);
1892
+ JSONTEST_ASSERT(errs.size() == 0);
1893
+ delete reader;
1894
+ }
1895
+
1896
+ JSONTEST_FIXTURE(CharReaderTest, parseWithOneError) {
1897
+ Json::CharReaderBuilder b;
1898
+ Json::CharReader* reader(b.newCharReader());
1899
+ JSONCPP_STRING errs;
1900
+ Json::Value root;
1901
+ char const doc[] =
1902
+ "{ \"property\" :: \"value\" }";
1903
+ bool ok = reader->parse(
1904
+ doc, doc + std::strlen(doc),
1905
+ &root, &errs);
1906
+ JSONTEST_ASSERT(!ok);
1907
+ JSONTEST_ASSERT(errs ==
1908
+ "* Line 1, Column 15\n Syntax error: value, object or array "
1909
+ "expected.\n");
1910
+ delete reader;
1911
+ }
1912
+
1913
+ JSONTEST_FIXTURE(CharReaderTest, parseChineseWithOneError) {
1914
+ Json::CharReaderBuilder b;
1915
+ Json::CharReader* reader(b.newCharReader());
1916
+ JSONCPP_STRING errs;
1917
+ Json::Value root;
1918
+ char const doc[] =
1919
+ "{ \"pr佐藤erty\" :: \"value\" }";
1920
+ bool ok = reader->parse(
1921
+ doc, doc + std::strlen(doc),
1922
+ &root, &errs);
1923
+ JSONTEST_ASSERT(!ok);
1924
+ JSONTEST_ASSERT(errs ==
1925
+ "* Line 1, Column 19\n Syntax error: value, object or array "
1926
+ "expected.\n");
1927
+ delete reader;
1928
+ }
1929
+
1930
+ JSONTEST_FIXTURE(CharReaderTest, parseWithDetailError) {
1931
+ Json::CharReaderBuilder b;
1932
+ Json::CharReader* reader(b.newCharReader());
1933
+ JSONCPP_STRING errs;
1934
+ Json::Value root;
1935
+ char const doc[] =
1936
+ "{ \"property\" : \"v\\alue\" }";
1937
+ bool ok = reader->parse(
1938
+ doc, doc + std::strlen(doc),
1939
+ &root, &errs);
1940
+ JSONTEST_ASSERT(!ok);
1941
+ JSONTEST_ASSERT(errs ==
1942
+ "* Line 1, Column 16\n Bad escape sequence in string\nSee "
1943
+ "Line 1, Column 20 for detail.\n");
1944
+ delete reader;
1945
+ }
1946
+
1947
+ JSONTEST_FIXTURE(CharReaderTest, parseWithStackLimit) {
1948
+ Json::CharReaderBuilder b;
1949
+ Json::Value root;
1950
+ char const doc[] =
1951
+ "{ \"property\" : \"value\" }";
1952
+ {
1953
+ b.settings_["stackLimit"] = 2;
1954
+ Json::CharReader* reader(b.newCharReader());
1955
+ JSONCPP_STRING errs;
1956
+ bool ok = reader->parse(
1957
+ doc, doc + std::strlen(doc),
1958
+ &root, &errs);
1959
+ JSONTEST_ASSERT(ok);
1960
+ JSONTEST_ASSERT(errs == "");
1961
+ JSONTEST_ASSERT_EQUAL("value", root["property"]);
1962
+ delete reader;
1963
+ }
1964
+ {
1965
+ b.settings_["stackLimit"] = 1;
1966
+ Json::CharReader* reader(b.newCharReader());
1967
+ JSONCPP_STRING errs;
1968
+ JSONTEST_ASSERT_THROWS(reader->parse(
1969
+ doc, doc + std::strlen(doc),
1970
+ &root, &errs));
1971
+ delete reader;
1972
+ }
1973
+ }
1974
+
1975
+ struct CharReaderStrictModeTest : JsonTest::TestCase {};
1976
+
1977
+ JSONTEST_FIXTURE(CharReaderStrictModeTest, dupKeys) {
1978
+ Json::CharReaderBuilder b;
1979
+ Json::Value root;
1980
+ char const doc[] =
1981
+ "{ \"property\" : \"value\", \"key\" : \"val1\", \"key\" : \"val2\" }";
1982
+ {
1983
+ b.strictMode(&b.settings_);
1984
+ Json::CharReader* reader(b.newCharReader());
1985
+ JSONCPP_STRING errs;
1986
+ bool ok = reader->parse(
1987
+ doc, doc + std::strlen(doc),
1988
+ &root, &errs);
1989
+ JSONTEST_ASSERT(!ok);
1990
+ JSONTEST_ASSERT_STRING_EQUAL(
1991
+ "* Line 1, Column 41\n"
1992
+ " Duplicate key: 'key'\n",
1993
+ errs);
1994
+ JSONTEST_ASSERT_EQUAL("val1", root["key"]); // so far
1995
+ delete reader;
1996
+ }
1997
+ }
1998
+ struct CharReaderFailIfExtraTest : JsonTest::TestCase {};
1999
+
2000
+ JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue164) {
2001
+ // This is interpreted as a string value followed by a colon.
2002
+ Json::CharReaderBuilder b;
2003
+ Json::Value root;
2004
+ char const doc[] =
2005
+ " \"property\" : \"value\" }";
2006
+ {
2007
+ b.settings_["failIfExtra"] = false;
2008
+ Json::CharReader* reader(b.newCharReader());
2009
+ JSONCPP_STRING errs;
2010
+ bool ok = reader->parse(
2011
+ doc, doc + std::strlen(doc),
2012
+ &root, &errs);
2013
+ JSONTEST_ASSERT(ok);
2014
+ JSONTEST_ASSERT(errs == "");
2015
+ JSONTEST_ASSERT_EQUAL("property", root);
2016
+ delete reader;
2017
+ }
2018
+ {
2019
+ b.settings_["failIfExtra"] = true;
2020
+ Json::CharReader* reader(b.newCharReader());
2021
+ JSONCPP_STRING errs;
2022
+ bool ok = reader->parse(
2023
+ doc, doc + std::strlen(doc),
2024
+ &root, &errs);
2025
+ JSONTEST_ASSERT(!ok);
2026
+ JSONTEST_ASSERT_STRING_EQUAL(errs,
2027
+ "* Line 1, Column 13\n"
2028
+ " Extra non-whitespace after JSON value.\n");
2029
+ JSONTEST_ASSERT_EQUAL("property", root);
2030
+ delete reader;
2031
+ }
2032
+ {
2033
+ b.settings_["failIfExtra"] = false;
2034
+ b.strictMode(&b.settings_);
2035
+ Json::CharReader* reader(b.newCharReader());
2036
+ JSONCPP_STRING errs;
2037
+ bool ok = reader->parse(
2038
+ doc, doc + std::strlen(doc),
2039
+ &root, &errs);
2040
+ JSONTEST_ASSERT(!ok);
2041
+ JSONTEST_ASSERT_STRING_EQUAL(errs,
2042
+ "* Line 1, Column 13\n"
2043
+ " Extra non-whitespace after JSON value.\n");
2044
+ JSONTEST_ASSERT_EQUAL("property", root);
2045
+ delete reader;
2046
+ }
2047
+ }
2048
+ JSONTEST_FIXTURE(CharReaderFailIfExtraTest, issue107) {
2049
+ // This is interpreted as an int value followed by a colon.
2050
+ Json::CharReaderBuilder b;
2051
+ Json::Value root;
2052
+ char const doc[] =
2053
+ "1:2:3";
2054
+ b.settings_["failIfExtra"] = true;
2055
+ Json::CharReader* reader(b.newCharReader());
2056
+ JSONCPP_STRING errs;
2057
+ bool ok = reader->parse(
2058
+ doc, doc + std::strlen(doc),
2059
+ &root, &errs);
2060
+ JSONTEST_ASSERT(!ok);
2061
+ JSONTEST_ASSERT_STRING_EQUAL(
2062
+ "* Line 1, Column 2\n"
2063
+ " Extra non-whitespace after JSON value.\n",
2064
+ errs);
2065
+ JSONTEST_ASSERT_EQUAL(1, root.asInt());
2066
+ delete reader;
2067
+ }
2068
+ JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterObject) {
2069
+ Json::CharReaderBuilder b;
2070
+ Json::Value root;
2071
+ {
2072
+ char const doc[] =
2073
+ "{ \"property\" : \"value\" } //trailing\n//comment\n";
2074
+ b.settings_["failIfExtra"] = true;
2075
+ Json::CharReader* reader(b.newCharReader());
2076
+ JSONCPP_STRING errs;
2077
+ bool ok = reader->parse(
2078
+ doc, doc + std::strlen(doc),
2079
+ &root, &errs);
2080
+ JSONTEST_ASSERT(ok);
2081
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2082
+ JSONTEST_ASSERT_EQUAL("value", root["property"]);
2083
+ delete reader;
2084
+ }
2085
+ }
2086
+ JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterArray) {
2087
+ Json::CharReaderBuilder b;
2088
+ Json::Value root;
2089
+ char const doc[] =
2090
+ "[ \"property\" , \"value\" ] //trailing\n//comment\n";
2091
+ b.settings_["failIfExtra"] = true;
2092
+ Json::CharReader* reader(b.newCharReader());
2093
+ JSONCPP_STRING errs;
2094
+ bool ok = reader->parse(
2095
+ doc, doc + std::strlen(doc),
2096
+ &root, &errs);
2097
+ JSONTEST_ASSERT(ok);
2098
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2099
+ JSONTEST_ASSERT_EQUAL("value", root[1u]);
2100
+ delete reader;
2101
+ }
2102
+ JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterBool) {
2103
+ Json::CharReaderBuilder b;
2104
+ Json::Value root;
2105
+ char const doc[] =
2106
+ " true /*trailing\ncomment*/";
2107
+ b.settings_["failIfExtra"] = true;
2108
+ Json::CharReader* reader(b.newCharReader());
2109
+ JSONCPP_STRING errs;
2110
+ bool ok = reader->parse(
2111
+ doc, doc + std::strlen(doc),
2112
+ &root, &errs);
2113
+ JSONTEST_ASSERT(ok);
2114
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2115
+ JSONTEST_ASSERT_EQUAL(true, root.asBool());
2116
+ delete reader;
2117
+ }
2118
+ struct CharReaderAllowDropNullTest : JsonTest::TestCase {};
2119
+
2120
+ JSONTEST_FIXTURE(CharReaderAllowDropNullTest, issue178) {
2121
+ Json::CharReaderBuilder b;
2122
+ b.settings_["allowDroppedNullPlaceholders"] = true;
2123
+ Json::Value root;
2124
+ JSONCPP_STRING errs;
2125
+ Json::CharReader* reader(b.newCharReader());
2126
+ {
2127
+ char const doc[] = "{\"a\":,\"b\":true}";
2128
+ bool ok = reader->parse(
2129
+ doc, doc + std::strlen(doc),
2130
+ &root, &errs);
2131
+ JSONTEST_ASSERT(ok);
2132
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2133
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
2134
+ JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
2135
+ }
2136
+ {
2137
+ char const doc[] = "{\"a\":}";
2138
+ bool ok = reader->parse(
2139
+ doc, doc + std::strlen(doc),
2140
+ &root, &errs);
2141
+ JSONTEST_ASSERT(ok);
2142
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2143
+ JSONTEST_ASSERT_EQUAL(1u, root.size());
2144
+ JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
2145
+ }
2146
+ {
2147
+ char const doc[] = "[]";
2148
+ bool ok = reader->parse(
2149
+ doc, doc + std::strlen(doc),
2150
+ &root, &errs);
2151
+ JSONTEST_ASSERT(ok);
2152
+ JSONTEST_ASSERT(errs == "");
2153
+ JSONTEST_ASSERT_EQUAL(0u, root.size());
2154
+ JSONTEST_ASSERT_EQUAL(Json::arrayValue, root);
2155
+ }
2156
+ {
2157
+ char const doc[] = "[null]";
2158
+ bool ok = reader->parse(
2159
+ doc, doc + std::strlen(doc),
2160
+ &root, &errs);
2161
+ JSONTEST_ASSERT(ok);
2162
+ JSONTEST_ASSERT(errs == "");
2163
+ JSONTEST_ASSERT_EQUAL(1u, root.size());
2164
+ }
2165
+ {
2166
+ char const doc[] = "[,]";
2167
+ bool ok = reader->parse(
2168
+ doc, doc + std::strlen(doc),
2169
+ &root, &errs);
2170
+ JSONTEST_ASSERT(ok);
2171
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2172
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
2173
+ }
2174
+ {
2175
+ char const doc[] = "[,,,]";
2176
+ bool ok = reader->parse(
2177
+ doc, doc + std::strlen(doc),
2178
+ &root, &errs);
2179
+ JSONTEST_ASSERT(ok);
2180
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2181
+ JSONTEST_ASSERT_EQUAL(4u, root.size());
2182
+ }
2183
+ {
2184
+ char const doc[] = "[null,]";
2185
+ bool ok = reader->parse(
2186
+ doc, doc + std::strlen(doc),
2187
+ &root, &errs);
2188
+ JSONTEST_ASSERT(ok);
2189
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2190
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
2191
+ }
2192
+ {
2193
+ char const doc[] = "[,null]";
2194
+ bool ok = reader->parse(
2195
+ doc, doc + std::strlen(doc),
2196
+ &root, &errs);
2197
+ JSONTEST_ASSERT(ok);
2198
+ JSONTEST_ASSERT(errs == "");
2199
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
2200
+ }
2201
+ {
2202
+ char const doc[] = "[,,]";
2203
+ bool ok = reader->parse(
2204
+ doc, doc + std::strlen(doc),
2205
+ &root, &errs);
2206
+ JSONTEST_ASSERT(ok);
2207
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2208
+ JSONTEST_ASSERT_EQUAL(3u, root.size());
2209
+ }
2210
+ {
2211
+ char const doc[] = "[null,,]";
2212
+ bool ok = reader->parse(
2213
+ doc, doc + std::strlen(doc),
2214
+ &root, &errs);
2215
+ JSONTEST_ASSERT(ok);
2216
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2217
+ JSONTEST_ASSERT_EQUAL(3u, root.size());
2218
+ }
2219
+ {
2220
+ char const doc[] = "[,null,]";
2221
+ bool ok = reader->parse(
2222
+ doc, doc + std::strlen(doc),
2223
+ &root, &errs);
2224
+ JSONTEST_ASSERT(ok);
2225
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2226
+ JSONTEST_ASSERT_EQUAL(3u, root.size());
2227
+ }
2228
+ {
2229
+ char const doc[] = "[,,null]";
2230
+ bool ok = reader->parse(
2231
+ doc, doc + std::strlen(doc),
2232
+ &root, &errs);
2233
+ JSONTEST_ASSERT(ok);
2234
+ JSONTEST_ASSERT(errs == "");
2235
+ JSONTEST_ASSERT_EQUAL(3u, root.size());
2236
+ }
2237
+ {
2238
+ char const doc[] = "[[],,,]";
2239
+ bool ok = reader->parse(
2240
+ doc, doc + std::strlen(doc),
2241
+ &root, &errs);
2242
+ JSONTEST_ASSERT(ok);
2243
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2244
+ JSONTEST_ASSERT_EQUAL(4u, root.size());
2245
+ JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[0u]);
2246
+ }
2247
+ {
2248
+ char const doc[] = "[,[],,]";
2249
+ bool ok = reader->parse(
2250
+ doc, doc + std::strlen(doc),
2251
+ &root, &errs);
2252
+ JSONTEST_ASSERT(ok);
2253
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2254
+ JSONTEST_ASSERT_EQUAL(4u, root.size());
2255
+ JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[1u]);
2256
+ }
2257
+ {
2258
+ char const doc[] = "[,,,[]]";
2259
+ bool ok = reader->parse(
2260
+ doc, doc + std::strlen(doc),
2261
+ &root, &errs);
2262
+ JSONTEST_ASSERT(ok);
2263
+ JSONTEST_ASSERT(errs == "");
2264
+ JSONTEST_ASSERT_EQUAL(4u, root.size());
2265
+ JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[3u]);
2266
+ }
2267
+ delete reader;
2268
+ }
2269
+
2270
+ struct CharReaderAllowSingleQuotesTest : JsonTest::TestCase {};
2271
+
2272
+ JSONTEST_FIXTURE(CharReaderAllowSingleQuotesTest, issue182) {
2273
+ Json::CharReaderBuilder b;
2274
+ b.settings_["allowSingleQuotes"] = true;
2275
+ Json::Value root;
2276
+ JSONCPP_STRING errs;
2277
+ Json::CharReader* reader(b.newCharReader());
2278
+ {
2279
+ char const doc[] = "{'a':true,\"b\":true}";
2280
+ bool ok = reader->parse(
2281
+ doc, doc + std::strlen(doc),
2282
+ &root, &errs);
2283
+ JSONTEST_ASSERT(ok);
2284
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2285
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
2286
+ JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
2287
+ JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
2288
+ }
2289
+ {
2290
+ char const doc[] = "{'a': 'x', \"b\":'y'}";
2291
+ bool ok = reader->parse(
2292
+ doc, doc + std::strlen(doc),
2293
+ &root, &errs);
2294
+ JSONTEST_ASSERT(ok);
2295
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2296
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
2297
+ JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
2298
+ JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
2299
+ }
2300
+ delete reader;
2301
+ }
2302
+
2303
+ struct CharReaderAllowZeroesTest : JsonTest::TestCase {};
2304
+
2305
+ JSONTEST_FIXTURE(CharReaderAllowZeroesTest, issue176) {
2306
+ Json::CharReaderBuilder b;
2307
+ b.settings_["allowSingleQuotes"] = true;
2308
+ Json::Value root;
2309
+ JSONCPP_STRING errs;
2310
+ Json::CharReader* reader(b.newCharReader());
2311
+ {
2312
+ char const doc[] = "{'a':true,\"b\":true}";
2313
+ bool ok = reader->parse(
2314
+ doc, doc + std::strlen(doc),
2315
+ &root, &errs);
2316
+ JSONTEST_ASSERT(ok);
2317
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2318
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
2319
+ JSONTEST_ASSERT_EQUAL(true, root.get("a", false));
2320
+ JSONTEST_ASSERT_EQUAL(true, root.get("b", false));
2321
+ }
2322
+ {
2323
+ char const doc[] = "{'a': 'x', \"b\":'y'}";
2324
+ bool ok = reader->parse(
2325
+ doc, doc + std::strlen(doc),
2326
+ &root, &errs);
2327
+ JSONTEST_ASSERT(ok);
2328
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2329
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
2330
+ JSONTEST_ASSERT_STRING_EQUAL("x", root["a"].asString());
2331
+ JSONTEST_ASSERT_STRING_EQUAL("y", root["b"].asString());
2332
+ }
2333
+ delete reader;
2334
+ }
2335
+
2336
+ struct CharReaderAllowSpecialFloatsTest : JsonTest::TestCase {};
2337
+
2338
+ JSONTEST_FIXTURE(CharReaderAllowSpecialFloatsTest, issue209) {
2339
+ Json::CharReaderBuilder b;
2340
+ b.settings_["allowSpecialFloats"] = true;
2341
+ Json::Value root;
2342
+ JSONCPP_STRING errs;
2343
+ Json::CharReader* reader(b.newCharReader());
2344
+ {
2345
+ char const doc[] = "{\"a\":NaN,\"b\":Infinity,\"c\":-Infinity}";
2346
+ bool ok = reader->parse(
2347
+ doc, doc + std::strlen(doc),
2348
+ &root, &errs);
2349
+ JSONTEST_ASSERT(ok);
2350
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2351
+ JSONTEST_ASSERT_EQUAL(3u, root.size());
2352
+ double n = root["a"].asDouble();
2353
+ JSONTEST_ASSERT(n != n);
2354
+ JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(), root.get("b", 0.0));
2355
+ JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(), root.get("c", 0.0));
2356
+ }
2357
+
2358
+ struct TestData {
2359
+ int line;
2360
+ bool ok;
2361
+ JSONCPP_STRING in;
2362
+ };
2363
+ const TestData test_data[] = {
2364
+ {__LINE__, 1, "{\"a\":9}"},
2365
+ {__LINE__, 0, "{\"a\":0Infinity}"},
2366
+ {__LINE__, 0, "{\"a\":1Infinity}"},
2367
+ {__LINE__, 0, "{\"a\":9Infinity}"},
2368
+ {__LINE__, 0, "{\"a\":0nfinity}"},
2369
+ {__LINE__, 0, "{\"a\":1nfinity}"},
2370
+ {__LINE__, 0, "{\"a\":9nfinity}"},
2371
+ {__LINE__, 0, "{\"a\":nfinity}"},
2372
+ {__LINE__, 0, "{\"a\":.nfinity}"},
2373
+ {__LINE__, 0, "{\"a\":9nfinity}"},
2374
+ {__LINE__, 0, "{\"a\":-nfinity}"},
2375
+ {__LINE__, 1, "{\"a\":Infinity}"},
2376
+ {__LINE__, 0, "{\"a\":.Infinity}"},
2377
+ {__LINE__, 0, "{\"a\":_Infinity}"},
2378
+ {__LINE__, 0, "{\"a\":_nfinity}"},
2379
+ {__LINE__, 1, "{\"a\":-Infinity}"}
2380
+ };
2381
+ for (size_t tdi = 0; tdi < sizeof(test_data) / sizeof(*test_data); ++tdi) {
2382
+ const TestData& td = test_data[tdi];
2383
+ bool ok = reader->parse(&*td.in.begin(),
2384
+ &*td.in.begin() + td.in.size(),
2385
+ &root, &errs);
2386
+ JSONTEST_ASSERT(td.ok == ok)
2387
+ << "line:" << td.line << "\n"
2388
+ << " expected: {"
2389
+ << "ok:" << td.ok
2390
+ << ", in:\'" << td.in << "\'"
2391
+ << "}\n"
2392
+ << " actual: {"
2393
+ << "ok:" << ok
2394
+ << "}\n";
2395
+ }
2396
+
2397
+ {
2398
+ char const doc[] = "{\"posInf\": Infinity, \"NegInf\": -Infinity}";
2399
+ bool ok = reader->parse(
2400
+ doc, doc + std::strlen(doc),
2401
+ &root, &errs);
2402
+ JSONTEST_ASSERT(ok);
2403
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
2404
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
2405
+ JSONTEST_ASSERT_EQUAL(std::numeric_limits<double>::infinity(), root["posInf"].asDouble());
2406
+ JSONTEST_ASSERT_EQUAL(-std::numeric_limits<double>::infinity(), root["NegInf"].asDouble());
2407
+ }
2408
+ delete reader;
2409
+ }
2410
+
2411
+ struct BuilderTest : JsonTest::TestCase {};
2412
+
2413
+ JSONTEST_FIXTURE(BuilderTest, settings) {
2414
+ {
2415
+ Json::Value errs;
2416
+ Json::CharReaderBuilder rb;
2417
+ JSONTEST_ASSERT_EQUAL(false, rb.settings_.isMember("foo"));
2418
+ JSONTEST_ASSERT_EQUAL(true, rb.validate(&errs));
2419
+ rb["foo"] = "bar";
2420
+ JSONTEST_ASSERT_EQUAL(true, rb.settings_.isMember("foo"));
2421
+ JSONTEST_ASSERT_EQUAL(false, rb.validate(&errs));
2422
+ }
2423
+ {
2424
+ Json::Value errs;
2425
+ Json::StreamWriterBuilder wb;
2426
+ JSONTEST_ASSERT_EQUAL(false, wb.settings_.isMember("foo"));
2427
+ JSONTEST_ASSERT_EQUAL(true, wb.validate(&errs));
2428
+ wb["foo"] = "bar";
2429
+ JSONTEST_ASSERT_EQUAL(true, wb.settings_.isMember("foo"));
2430
+ JSONTEST_ASSERT_EQUAL(false, wb.validate(&errs));
2431
+ }
2432
+ }
2433
+
2434
+ struct IteratorTest : JsonTest::TestCase {};
2435
+
2436
+ JSONTEST_FIXTURE(IteratorTest, distance) {
2437
+ Json::Value json;
2438
+ json["k1"] = "a";
2439
+ json["k2"] = "b";
2440
+ int dist = 0;
2441
+ JSONCPP_STRING str;
2442
+ for (Json::ValueIterator it = json.begin(); it != json.end(); ++it) {
2443
+ dist = it - json.begin();
2444
+ str = it->asString().c_str();
2445
+ }
2446
+ JSONTEST_ASSERT_EQUAL(1, dist);
2447
+ JSONTEST_ASSERT_STRING_EQUAL("b", str);
2448
+ }
2449
+
2450
+ JSONTEST_FIXTURE(IteratorTest, names) {
2451
+ Json::Value json;
2452
+ json["k1"] = "a";
2453
+ json["k2"] = "b";
2454
+ Json::ValueIterator it = json.begin();
2455
+ JSONTEST_ASSERT(it != json.end());
2456
+ JSONTEST_ASSERT_EQUAL(Json::Value("k1"), it.key());
2457
+ JSONTEST_ASSERT_STRING_EQUAL("k1", it.name());
2458
+ JSONTEST_ASSERT_EQUAL(-1, it.index());
2459
+ ++it;
2460
+ JSONTEST_ASSERT(it != json.end());
2461
+ JSONTEST_ASSERT_EQUAL(Json::Value("k2"), it.key());
2462
+ JSONTEST_ASSERT_STRING_EQUAL("k2", it.name());
2463
+ JSONTEST_ASSERT_EQUAL(-1, it.index());
2464
+ ++it;
2465
+ JSONTEST_ASSERT(it == json.end());
2466
+ }
2467
+
2468
+ JSONTEST_FIXTURE(IteratorTest, indexes) {
2469
+ Json::Value json;
2470
+ json[0] = "a";
2471
+ json[1] = "b";
2472
+ Json::ValueIterator it = json.begin();
2473
+ JSONTEST_ASSERT(it != json.end());
2474
+ JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(0)), it.key());
2475
+ JSONTEST_ASSERT_STRING_EQUAL("", it.name());
2476
+ JSONTEST_ASSERT_EQUAL(0, it.index());
2477
+ ++it;
2478
+ JSONTEST_ASSERT(it != json.end());
2479
+ JSONTEST_ASSERT_EQUAL(Json::Value(Json::ArrayIndex(1)), it.key());
2480
+ JSONTEST_ASSERT_STRING_EQUAL("", it.name());
2481
+ JSONTEST_ASSERT_EQUAL(1, it.index());
2482
+ ++it;
2483
+ JSONTEST_ASSERT(it == json.end());
2484
+ }
2485
+
2486
+ JSONTEST_FIXTURE(IteratorTest, const) {
2487
+ Json::Value const v;
2488
+ JSONTEST_ASSERT_THROWS(
2489
+ Json::Value::iterator it(v.begin()) // Compile, but throw.
2490
+ );
2491
+
2492
+ Json::Value value;
2493
+
2494
+ for(int i = 9; i < 12; ++i)
2495
+ {
2496
+ JSONCPP_OSTRINGSTREAM out;
2497
+ out << std::setw(2) << i;
2498
+ JSONCPP_STRING str = out.str();
2499
+ value[str] = str;
2500
+ }
2501
+
2502
+ JSONCPP_OSTRINGSTREAM out;
2503
+ //in old code, this will get a compile error
2504
+ Json::Value::const_iterator iter = value.begin();
2505
+ for(; iter != value.end(); ++iter)
2506
+ {
2507
+ out << *iter << ',';
2508
+ }
2509
+ JSONCPP_STRING expected = "\" 9\",\"10\",\"11\",";
2510
+ JSONTEST_ASSERT_STRING_EQUAL(expected, out.str());
2511
+ }
2512
+
2513
+ struct RValueTest : JsonTest::TestCase {};
2514
+
2515
+ JSONTEST_FIXTURE(RValueTest, moveConstruction) {
2516
+ #if JSON_HAS_RVALUE_REFERENCES
2517
+ Json::Value json;
2518
+ json["key"] = "value";
2519
+ Json::Value moved = std::move(json);
2520
+ JSONTEST_ASSERT(moved != json); // Possibly not nullValue; definitely not equal.
2521
+ JSONTEST_ASSERT_EQUAL(Json::objectValue, moved.type());
2522
+ JSONTEST_ASSERT_EQUAL(Json::stringValue, moved["key"].type());
2523
+ #endif
2524
+ }
2525
+
2526
+ int main(int argc, const char* argv[]) {
2527
+ JsonTest::Runner runner;
2528
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, checkNormalizeFloatingPointStr);
2529
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, memberCount);
2530
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, objects);
2531
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrays);
2532
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, arrayIssue252);
2533
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, null);
2534
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, strings);
2535
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, bools);
2536
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, integers);
2537
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nonIntegers);
2538
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareNull);
2539
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareInt);
2540
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareUInt);
2541
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareDouble);
2542
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareString);
2543
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareBoolean);
2544
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareArray);
2545
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareObject);
2546
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, compareType);
2547
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, offsetAccessors);
2548
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, typeChecksThrowExceptions);
2549
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, StaticString);
2550
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, CommentBefore);
2551
+ //JSONTEST_REGISTER_FIXTURE(runner, ValueTest, nulls);
2552
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, zeroes);
2553
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, zeroesInKeys);
2554
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, specialFloats);
2555
+ JSONTEST_REGISTER_FIXTURE(runner, ValueTest, precision);
2556
+
2557
+ JSONTEST_REGISTER_FIXTURE(runner, WriterTest, dropNullPlaceholders);
2558
+ JSONTEST_REGISTER_FIXTURE(runner, StreamWriterTest, dropNullPlaceholders);
2559
+ JSONTEST_REGISTER_FIXTURE(runner, StreamWriterTest, writeZeroes);
2560
+
2561
+ JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithNoErrors);
2562
+ JSONTEST_REGISTER_FIXTURE(
2563
+ runner, ReaderTest, parseWithNoErrorsTestingOffsets);
2564
+ JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithOneError);
2565
+ JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseChineseWithOneError);
2566
+ JSONTEST_REGISTER_FIXTURE(runner, ReaderTest, parseWithDetailError);
2567
+
2568
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithNoErrors);
2569
+ JSONTEST_REGISTER_FIXTURE(
2570
+ runner, CharReaderTest, parseWithNoErrorsTestingOffsets);
2571
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithOneError);
2572
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseChineseWithOneError);
2573
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithDetailError);
2574
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderTest, parseWithStackLimit);
2575
+
2576
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderStrictModeTest, dupKeys);
2577
+
2578
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue164);
2579
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, issue107);
2580
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterObject);
2581
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterArray);
2582
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterBool);
2583
+
2584
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowDropNullTest, issue178);
2585
+
2586
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowSingleQuotesTest, issue182);
2587
+
2588
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowZeroesTest, issue176);
2589
+
2590
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowSpecialFloatsTest, issue209);
2591
+
2592
+ JSONTEST_REGISTER_FIXTURE(runner, BuilderTest, settings);
2593
+
2594
+ JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, distance);
2595
+ JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, names);
2596
+ JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, indexes);
2597
+ JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, const);
2598
+
2599
+ JSONTEST_REGISTER_FIXTURE(runner, RValueTest, moveConstruction);
2600
+
2601
+ return runner.runCommandLine(argc, argv);
2602
+ }
2603
+
2604
+ #if defined(__GNUC__)
2605
+ #pragma GCC diagnostic pop
2606
+ #endif