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

6
#include <json/config.h>
7
8
9
#include <json/json.h>
#include "jsontest.h"

10
// Make numeric limits more convenient to talk about.
11
// Assumes int type in 32 bits.
12
13
14
15
16
17
#define kint32max Json::Value::maxInt
#define kint32min Json::Value::minInt
#define kuint32max Json::Value::maxUInt
#define kint64max Json::Value::maxInt64
#define kint64min Json::Value::minInt64
#define kuint64max Json::Value::maxUInt64
18
19
20
21
22
23

static const double kdint64max = double(kint64max);
static const float kfint64max = float(kint64max);
static const float kfint32max = float(kint32max);
static const float kfuint32max = float(kuint32max);

24
25
26
27
28
29
30

// //////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////
// Json Library test cases
// //////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////

31
32
33
34
35
36
37
38
#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
static inline double uint64ToDouble( Json::UInt64 value )
{
    return static_cast<double>( value );
}
#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
static inline double uint64ToDouble( Json::UInt64 value )
{
39
    return static_cast<double>( Json::Int64(value/2) ) * 2.0 + Json::Int64(value & 1);
40
41
}
#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
42
43
44
45
46
47
48
49
50
51

struct ValueTest : JsonTest::TestCase
{
   Json::Value null_;
   Json::Value emptyArray_;
   Json::Value emptyObject_;
   Json::Value integer_;
   Json::Value unsignedInteger_;
   Json::Value smallUnsignedInteger_;
   Json::Value real_;
52
   Json::Value float_;
53
54
55
56
57
58
59
60
   Json::Value array1_;
   Json::Value object1_;
   Json::Value emptyString_;
   Json::Value string1_;
   Json::Value string_;
   Json::Value true_;
   Json::Value false_;

61

62
63
64
65
66
   ValueTest()
      : emptyArray_( Json::arrayValue )
      , emptyObject_( Json::objectValue )
      , integer_( 123456789 )
      , unsignedInteger_( 34567890u )
67
      , smallUnsignedInteger_( Json::Value::UInt( Json::Value::maxInt ) )
68
      , real_( 1234.56789 )
Aaron Jacobs's avatar
Aaron Jacobs committed
69
      , float_( 0.00390625f )
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
      , emptyString_( "" )
      , string1_( "a" )
      , string_( "sometext with space" )
      , true_( true )
      , false_( false )
   {
      array1_.append( 1234 );
      object1_["id"] = 1234;
   }

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

      bool isObject_;
      bool isArray_;
      bool isBool_;
88
89
90
      bool isString_;
      bool isNull_;

91
      bool isInt_;
92
      bool isInt64_;
93
      bool isUInt_;
94
      bool isUInt64_;
95
      bool isIntegral_;
96
      bool isDouble_;
97
98
99
100
101
102
103
104
      bool isNumeric_;
   };

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

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

   void checkIs( const Json::Value &value, const IsCheck &check );
105
106
107
108

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

   void checkIsEqual( const Json::Value &x, const Json::Value &y );
109
110
111

   /// Normalize the representation of floating-point number by stripped leading 0 in exponent.
   static std::string normalizeFloatingPointStr( const std::string &s );
112
113
114
};


115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
std::string 
ValueTest::normalizeFloatingPointStr( const std::string &s )
{
    std::string::size_type index = s.find_last_of( "eE" );
    if ( index != std::string::npos )
    {
        std::string::size_type hasSign = (s[index+1] == '+' || s[index+1] == '-') ? 1 : 0;
        std::string::size_type exponentStartIndex = index + 1 + hasSign;
        std::string normalized = s.substr( 0, exponentStartIndex );
        std::string::size_type indexDigit = s.find_first_not_of( '0', exponentStartIndex );
        std::string exponent = "0";
        if ( indexDigit != std::string::npos ) // There is an exponent different from 0
        {
            exponent = s.substr( indexDigit );
        }
        return normalized + exponent;
    }
    return s;
}


JSONTEST_FIXTURE( ValueTest, checkNormalizeFloatingPointStr )
{
    JSONTEST_ASSERT_STRING_EQUAL( "0.0", normalizeFloatingPointStr("0.0") );
    JSONTEST_ASSERT_STRING_EQUAL( "0e0", normalizeFloatingPointStr("0e0") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234.0", normalizeFloatingPointStr("1234.0") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234.0e0", normalizeFloatingPointStr("1234.0e0") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234.0e+0", normalizeFloatingPointStr("1234.0e+0") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e-1", normalizeFloatingPointStr("1234e-1") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e10", normalizeFloatingPointStr("1234e10") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e10", normalizeFloatingPointStr("1234e010") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e+10", normalizeFloatingPointStr("1234e+010") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e-10", normalizeFloatingPointStr("1234e-010") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e+100", normalizeFloatingPointStr("1234e+100") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e-100", normalizeFloatingPointStr("1234e-100") );
    JSONTEST_ASSERT_STRING_EQUAL( "1234e+1", normalizeFloatingPointStr("1234e+001") );
}


154
JSONTEST_FIXTURE( ValueTest, memberCount )
155
156
157
158
159
160
161
{
   JSONTEST_ASSERT_PRED( checkMemberCount(emptyArray_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(emptyObject_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(array1_, 1) );
   JSONTEST_ASSERT_PRED( checkMemberCount(object1_, 1) );
   JSONTEST_ASSERT_PRED( checkMemberCount(null_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(integer_, 0) );
Aaron Jacobs's avatar
Aaron Jacobs committed
162
163
   JSONTEST_ASSERT_PRED( checkMemberCount(unsignedInteger_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(smallUnsignedInteger_, 0) );
164
165
166
167
168
169
170
   JSONTEST_ASSERT_PRED( checkMemberCount(real_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(emptyString_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(string_, 0) );
   JSONTEST_ASSERT_PRED( checkMemberCount(true_, 0) );
}


171
JSONTEST_FIXTURE( ValueTest, objects )
172
{
Aaron Jacobs's avatar
Aaron Jacobs committed
173
   // Types
174
175
176
177
   IsCheck checks;
   checks.isObject_ = true;
   JSONTEST_ASSERT_PRED( checkIs( emptyObject_, checks ) );
   JSONTEST_ASSERT_PRED( checkIs( object1_, checks ) );
Aaron Jacobs's avatar
Aaron Jacobs committed
178

179
   JSONTEST_ASSERT_EQUAL(Json::objectValue, emptyObject_.type());
180

181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
   // Empty object okay
   JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::nullValue));

   // Non-empty object not okay
   JSONTEST_ASSERT(!object1_.isConvertibleTo(Json::nullValue));

   // Always okay
   JSONTEST_ASSERT(emptyObject_.isConvertibleTo(Json::objectValue));

   // Never okay
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(!emptyObject_.isConvertibleTo(Json::stringValue));

Aaron Jacobs's avatar
Aaron Jacobs committed
198
199
200
   // Access through const reference
   const Json::Value &constObject = object1_;

201
202
   JSONTEST_ASSERT_EQUAL(Json::Value(1234), constObject["id"]);
   JSONTEST_ASSERT_EQUAL(Json::Value(), constObject["unknown id"]);
Aaron Jacobs's avatar
Aaron Jacobs committed
203
204

   // Access through non-const reference
205
206
   JSONTEST_ASSERT_EQUAL(Json::Value(1234), object1_["id"]);
   JSONTEST_ASSERT_EQUAL(Json::Value(), object1_["unknown id"]);
Aaron Jacobs's avatar
Aaron Jacobs committed
207
208

   object1_["some other id"] = "foo";
209
   JSONTEST_ASSERT_EQUAL(Json::Value("foo"), object1_["some other id"]);
210
211
212
}


213
JSONTEST_FIXTURE( ValueTest, arrays )
214
{
Aaron Jacobs's avatar
Aaron Jacobs committed
215
216
   const unsigned int index0 = 0;

217
   // Types
218
219
220
221
   IsCheck checks;
   checks.isArray_ = true;
   JSONTEST_ASSERT_PRED( checkIs( emptyArray_, checks ) );
   JSONTEST_ASSERT_PRED( checkIs( array1_, checks ) );
222

223
   JSONTEST_ASSERT_EQUAL(Json::arrayValue, array1_.type());
224

225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
   // Empty array okay
   JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::nullValue));

   // Non-empty array not okay
   JSONTEST_ASSERT(!array1_.isConvertibleTo(Json::nullValue));

   // Always okay
   JSONTEST_ASSERT(emptyArray_.isConvertibleTo(Json::arrayValue));

   // Never okay
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::objectValue));
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(!emptyArray_.isConvertibleTo(Json::stringValue));

Aaron Jacobs's avatar
Aaron Jacobs committed
242
   // Access through const reference
243
   const Json::Value &constArray = array1_;
244
245
   JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
   JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
Aaron Jacobs's avatar
Aaron Jacobs committed
246
247

   // Access through non-const reference
248
249
   JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
   JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
Aaron Jacobs's avatar
Aaron Jacobs committed
250
251

   array1_[2] = Json::Value(17);
252
253
   JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
   JSONTEST_ASSERT_EQUAL(Json::Value(17), array1_[2]);
254
255
256
}


257
JSONTEST_FIXTURE( ValueTest, null )
258
{
259
   JSONTEST_ASSERT_EQUAL(Json::nullValue, null_.type());
260

261
262
263
   IsCheck checks;
   checks.isNull_ = true;
   JSONTEST_ASSERT_PRED( checkIs( null_, checks ) );
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280

   JSONTEST_ASSERT(null_.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(null_.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(Json::Int(0), null_.asInt());
   JSONTEST_ASSERT_EQUAL(Json::LargestInt(0), null_.asLargestInt());
   JSONTEST_ASSERT_EQUAL(Json::UInt(0), null_.asUInt());
   JSONTEST_ASSERT_EQUAL(Json::LargestUInt(0), null_.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, null_.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, null_.asFloat());
   JSONTEST_ASSERT_STRING_EQUAL("", null_.asString());
281
282
283
}


284
JSONTEST_FIXTURE( ValueTest, strings )
285
{
286
   JSONTEST_ASSERT_EQUAL(Json::stringValue, string1_.type());
287

288
289
290
291
292
   IsCheck checks;
   checks.isString_ = true;
   JSONTEST_ASSERT_PRED( checkIs( emptyString_, checks ) );
   JSONTEST_ASSERT_PRED( checkIs( string_, checks ) );
   JSONTEST_ASSERT_PRED( checkIs( string1_, checks ) );
Aaron Jacobs's avatar
Aaron Jacobs committed
293

294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
   // Empty string okay
   JSONTEST_ASSERT(emptyString_.isConvertibleTo(Json::nullValue));

   // Non-empty string not okay
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::nullValue));

   // Always okay
   JSONTEST_ASSERT(string1_.isConvertibleTo(Json::stringValue));

   // Never okay
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::objectValue));
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!string1_.isConvertibleTo(Json::realValue));

310
311
   JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asString());
   JSONTEST_ASSERT_STRING_EQUAL("a", string1_.asCString());
312
313
314
}


315
JSONTEST_FIXTURE( ValueTest, bools )
316
{
317
   JSONTEST_ASSERT_EQUAL(Json::booleanValue, false_.type());
318

319
320
321
322
   IsCheck checks;
   checks.isBool_ = true;
   JSONTEST_ASSERT_PRED( checkIs( false_, checks ) );
   JSONTEST_ASSERT_PRED( checkIs( true_, checks ) );
Aaron Jacobs's avatar
Aaron Jacobs committed
323

324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
   // False okay
   JSONTEST_ASSERT(false_.isConvertibleTo(Json::nullValue));

   // True not okay
   JSONTEST_ASSERT(!true_.isConvertibleTo(Json::nullValue));

   // Always okay
   JSONTEST_ASSERT(true_.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(true_.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(true_.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(true_.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(true_.isConvertibleTo(Json::stringValue));

   // Never okay
   JSONTEST_ASSERT(!true_.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!true_.isConvertibleTo(Json::objectValue));

341
   JSONTEST_ASSERT_EQUAL(true, true_.asBool());
342
343
344
345
346
347
348
   JSONTEST_ASSERT_EQUAL(1, true_.asInt());
   JSONTEST_ASSERT_EQUAL(1, true_.asLargestInt());
   JSONTEST_ASSERT_EQUAL(1, true_.asUInt());
   JSONTEST_ASSERT_EQUAL(1, true_.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(1.0, true_.asDouble());
   JSONTEST_ASSERT_EQUAL(1.0, true_.asFloat());

349
   JSONTEST_ASSERT_EQUAL(false, false_.asBool());
350
351
352
353
354
355
   JSONTEST_ASSERT_EQUAL(0, false_.asInt());
   JSONTEST_ASSERT_EQUAL(0, false_.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, false_.asUInt());
   JSONTEST_ASSERT_EQUAL(0, false_.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, false_.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, false_.asFloat());
356
357
358
}


359
JSONTEST_FIXTURE( ValueTest, integers )
360
361
{
   IsCheck checks;
Aaron Jacobs's avatar
Aaron Jacobs committed
362
   Json::Value val;
363

364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
   // Conversions that don't depend on the value.
   JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(Json::Value(17).isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!Json::Value(17).isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(Json::Value(17U).isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!Json::Value(17U).isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(Json::Value(17.0).isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!Json::Value(17.0).isConvertibleTo(Json::objectValue));

383
384
385
386
387
388
389
   // Default int
   val = Json::Value(Json::intValue);

   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());

   checks = IsCheck();
   checks.isInt_ = true;
390
391
392
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
393
   checks.isIntegral_ = true;
394
395
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
396
397
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

398
399
400
401
   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

402
403
404
405
406
407
   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
408
409
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
410
411
412
413
414
415
416

   // Default uint
   val = Json::Value(Json::uintValue);

   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());

   checks = IsCheck();
417
418
   checks.isInt_ = true;
   checks.isInt64_ = true;
419
   checks.isUInt_ = true;
420
421
422
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
423
   checks.isNumeric_ = true;
424
425
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

426
427
428
429
   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

430
431
432
433
434
435
   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
436
437
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
438
439
440
441
442
443

   // Default real
   val = Json::Value(Json::realValue);

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

444
445
446
447
   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

448
449
450
451
452
   checks = IsCheck();
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
453
   checks.isIntegral_ = true;
454
455
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
456
457
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

458
459
460
461
462
463
   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
464
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
465
   JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
466

467
   // Zero (signed constructor arg)
Aaron Jacobs's avatar
Aaron Jacobs committed
468
469
   val = Json::Value(0);

470
   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
471

472
473
   checks = IsCheck();
   checks.isInt_ = true;
474
475
476
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
477
   checks.isIntegral_ = true;
478
479
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
480
481
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

482
483
484
485
   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

486
487
488
489
490
491
   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
492
493
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
494

495
   // Zero (unsigned constructor arg)
Aaron Jacobs's avatar
Aaron Jacobs committed
496
497
   val = Json::Value(0u);

498
   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
499

500
   checks = IsCheck();
501
502
   checks.isInt_ = true;
   checks.isInt64_ = true;
503
   checks.isUInt_ = true;
504
   checks.isUInt64_ = true;
505
   checks.isIntegral_ = true;
506
507
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
508
509
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

510
511
512
513
   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

514
515
516
517
518
519
   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
520
521
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("0", val.asString());
Aaron Jacobs's avatar
Aaron Jacobs committed
522
523
524
525

   // Zero (floating-point constructor arg)
   val = Json::Value(0.0);

526
   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
527

Aaron Jacobs's avatar
Aaron Jacobs committed
528
   checks = IsCheck();
529
530
531
532
533
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
534
535
536
537
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

538
539
540
541
   JSONTEST_ASSERT(val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

542
543
544
545
546
547
   JSONTEST_ASSERT_EQUAL(0, val.asInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(0, val.asUInt());
   JSONTEST_ASSERT_EQUAL(0, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(0.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(0.0, val.asFloat());
548
   JSONTEST_ASSERT_EQUAL(false, val.asBool());
549
   JSONTEST_ASSERT_STRING_EQUAL("0.0", val.asString());
550

551
   // 2^20 (signed constructor arg)
Aaron Jacobs's avatar
Aaron Jacobs committed
552
553
   val = Json::Value(1 << 20);

554
   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
555
   checks = IsCheck();
556
   checks.isInt_ = true;
557
558
559
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
560
   checks.isIntegral_ = true;
561
562
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
563
564
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

565
566
567
568
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

569
570
571
572
573
574
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
575
576
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
577
578

   // 2^20 (unsigned constructor arg)
579
   val = Json::Value(Json::UInt(1 << 20));
Aaron Jacobs's avatar
Aaron Jacobs committed
580

581
   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
582

583
   checks = IsCheck();
584
585
   checks.isInt_ = true;
   checks.isInt64_ = true;
586
   checks.isUInt_ = true;
587
   checks.isUInt64_ = true;
588
   checks.isIntegral_ = true;
589
590
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
591
592
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

593
594
595
596
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

597
598
599
600
601
602
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
603
604
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1048576", val.asString());
Aaron Jacobs's avatar
Aaron Jacobs committed
605
606
607
608

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

609
   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
610

Aaron Jacobs's avatar
Aaron Jacobs committed
611
   checks = IsCheck();
612
613
614
615
616
   checks.isInt_ = true;
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
617
618
619
620
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

621
622
623
624
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

625
626
627
628
629
630
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asDouble());
   JSONTEST_ASSERT_EQUAL((1 << 20), val.asFloat());
631
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
632
   JSONTEST_ASSERT_STRING_EQUAL("1048576.0", normalizeFloatingPointStr(val.asString()));
633
634

   // -2^20
Aaron Jacobs's avatar
Aaron Jacobs committed
635
636
   val = Json::Value(-(1 << 20));

637
   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
638

639
640
   checks = IsCheck();
   checks.isInt_ = true;
641
   checks.isInt64_ = true;
642
   checks.isIntegral_ = true;
643
644
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
645
646
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

647
648
649
650
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

651
652
653
654
   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asInt());
   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asDouble());
   JSONTEST_ASSERT_EQUAL(-(1 << 20), val.asFloat());
655
656
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("-1048576", val.asString());
657
658

   // int32 max
Aaron Jacobs's avatar
Aaron Jacobs committed
659
660
   val = Json::Value(kint32max);

661
   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
662

663
664
   checks = IsCheck();
   checks.isInt_ = true;
665
666
667
   checks.isInt64_ = true;
   checks.isUInt_ = true;
   checks.isUInt64_ = true;
668
   checks.isIntegral_ = true;
669
670
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
671
672
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

673
674
675
676
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

677
678
679
680
681
   JSONTEST_ASSERT_EQUAL(kint32max, val.asInt());
   JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(kint32max, val.asUInt());
   JSONTEST_ASSERT_EQUAL(kint32max, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(kint32max, val.asDouble());
682
   JSONTEST_ASSERT_EQUAL(kfint32max, val.asFloat());
683
684
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("2147483647", val.asString());
685
686

   // int32 min
Aaron Jacobs's avatar
Aaron Jacobs committed
687
688
   val = Json::Value(kint32min);

689
   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
690

691
692
   checks = IsCheck();
   checks.isInt_ = true;
693
   checks.isInt64_ = true;
694
   checks.isIntegral_ = true;
695
696
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
697
698
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

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

703
704
705
706
   JSONTEST_ASSERT_EQUAL(kint32min, val.asInt());
   JSONTEST_ASSERT_EQUAL(kint32min, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(kint32min, val.asDouble());
   JSONTEST_ASSERT_EQUAL(kint32min, val.asFloat());
707
708
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("-2147483648", val.asString());
709
710

   // uint32 max
Aaron Jacobs's avatar
Aaron Jacobs committed
711
712
   val = Json::Value(kuint32max);

713
   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
714

715
   checks = IsCheck();
716
   checks.isInt64_ = true;
717
   checks.isUInt_ = true;
718
   checks.isUInt64_ = true;
719
   checks.isIntegral_ = true;
720
721
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
722
723
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

724
725
726
727
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));

Aaron Jacobs's avatar
Aaron Jacobs committed
728
#ifndef JSON_NO_INT64
729
   JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestInt());
Aaron Jacobs's avatar
Aaron Jacobs committed
730
#endif
731
732
733
   JSONTEST_ASSERT_EQUAL(kuint32max, val.asUInt());
   JSONTEST_ASSERT_EQUAL(kuint32max, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(kuint32max, val.asDouble());
734
   JSONTEST_ASSERT_EQUAL(kfuint32max, val.asFloat());
735
736
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("4294967295", val.asString());
737
738
739

#ifdef JSON_NO_INT64
   // int64 max
Aaron Jacobs's avatar
Aaron Jacobs committed
740
741
   val = Json::Value(double(kint64max));

742
   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
743

744
745
746
   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
747
748
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

749
750
751
752
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

753
754
   JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
755
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
756
   JSONTEST_ASSERT_STRING_EQUAL("9.22337e+18", val.asString());
757
758

   // int64 min
Aaron Jacobs's avatar
Aaron Jacobs committed
759
760
   val = Json::Value(double(kint64min));

761
   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
762

763
764
765
   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
766
767
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

768
769
770
771
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

772
773
   JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
774
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
775
   JSONTEST_ASSERT_STRING_EQUAL("-9.22337e+18", val.asString());
776
777

   // uint64 max
Aaron Jacobs's avatar
Aaron Jacobs committed
778
779
   val = Json::Value(double(kuint64max));

780
   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
781

782
783
784
   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
785
786
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

787
788
789
790
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

791
792
   JSONTEST_ASSERT_EQUAL(double(kuint64max), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(kuint64max), val.asFloat());
793
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
794
   JSONTEST_ASSERT_STRING_EQUAL("1.84467e+19", val.asString());
795
#else  // ifdef JSON_NO_INT64
796
   // 2^40 (signed constructor arg)
797
   val = Json::Value(Json::Int64(1) << 40);
798

799
   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
800

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

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

813
814
815
816
817
818
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
819
820
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
821
822

   // 2^40 (unsigned constructor arg)
823
   val = Json::Value(Json::UInt64(1) << 40);
824

825
   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
826

827
   checks = IsCheck();
828
829
   checks.isInt64_ = true;
   checks.isUInt64_ = true;
830
   checks.isIntegral_ = true;
831
832
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
833
834
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

835
836
837
838
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

839
840
841
842
843
844
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
845
846
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1099511627776", val.asString());
847
848

   // 2^40 (floating-point constructor arg)
849
   val = Json::Value((Json::Int64(1) << 40) / 1.0);
850

851
   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
852

853
   checks = IsCheck();
854
855
856
   checks.isInt64_ = true;
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
857
858
859
860
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

861
862
863
864
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

865
866
867
868
869
870
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asUInt64());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asDouble());
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 40), val.asFloat());
871
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
872
   JSONTEST_ASSERT_STRING_EQUAL("1099511627776.0", normalizeFloatingPointStr(val.asString()));
873
874

   // -2^40
875
   val = Json::Value(-(Json::Int64(1) << 40));
876

877
   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
878

879
   checks = IsCheck();
880
   checks.isInt64_ = true;
881
   checks.isIntegral_ = true;
882
883
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
884
885
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

886
887
888
889
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

890
891
892
893
   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asInt64());
   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asDouble());
   JSONTEST_ASSERT_EQUAL(-(Json::Int64(1) << 40), val.asFloat());
894
895
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("-1099511627776", val.asString());
896

897
   // int64 max
Aaron Jacobs's avatar
Aaron Jacobs committed
898
899
   val = Json::Value(Json::Int64(kint64max));

900
   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
901

902
   checks = IsCheck();
903
904
   checks.isInt64_ = true;
   checks.isUInt64_ = true;
905
   checks.isIntegral_ = true;
906
907
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
908
909
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

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

914
915
916
917
918
919
   JSONTEST_ASSERT_EQUAL(kint64max, val.asInt64());
   JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(kint64max, val.asUInt64());
   JSONTEST_ASSERT_EQUAL(kint64max, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(double(kint64max), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(kint64max), val.asFloat());
920
921
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("9223372036854775807", val.asString());
922

923
924
925
926
   // int64 max (floating point constructor). Note that kint64max is not exactly
   // representable as a double, and will be rounded up to be higher.
   val = Json::Value(double(kint64max));

927
   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
928
929
930
931
932
933
934
935

   checks = IsCheck();
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

936
937
938
939
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

940
941
942
943
   JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asUInt64());
   JSONTEST_ASSERT_EQUAL(Json::UInt64(1) << 63, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(uint64ToDouble(Json::UInt64(1) << 63), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(Json::UInt64(1) << 63)), val.asFloat());
944
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
945
   JSONTEST_ASSERT_STRING_EQUAL("9.223372036854776e+18", normalizeFloatingPointStr(val.asString()));
946

947
   // int64 min
Aaron Jacobs's avatar
Aaron Jacobs committed
948
949
   val = Json::Value(Json::Int64(kint64min));

950
   JSONTEST_ASSERT_EQUAL(Json::intValue, val.type());
951

952
   checks = IsCheck();
953
   checks.isInt64_ = true;
954
   checks.isIntegral_ = true;
955
956
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
957
958
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

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

963
964
965
966
   JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
   JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(double(kint64min), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(kint64min), val.asFloat());
967
968
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("-9223372036854775808", val.asString());
969

970
971
972
973
   // int64 min (floating point constructor). Note that kint64min *is* exactly
   // representable as a double.
   val = Json::Value(double(kint64min));

974
   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
975
976
977
978
979
980
981
982

   checks = IsCheck();
   checks.isInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

983
984
985
986
987
988
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(kint64min, val.asInt64());
   JSONTEST_ASSERT_EQUAL(kint64min, val.asLargestInt());
989
990
   JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(-9223372036854775808.0, val.asFloat());
991
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
992
   JSONTEST_ASSERT_STRING_EQUAL("-9.223372036854776e+18", normalizeFloatingPointStr(val.asString()));
993

994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
   // 10^19
   const uint64_t ten_to_19 = 1e19;
   val = Json::Value(Json::UInt64(ten_to_19));

   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());

   checks = IsCheck();
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(ten_to_19, val.asUInt64());
   JSONTEST_ASSERT_EQUAL(ten_to_19, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(uint64ToDouble(ten_to_19), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(ten_to_19)), val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("10000000000000000000", val.asString());

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

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

   checks = IsCheck();
   checks.isUInt64_ = true;
   checks.isIntegral_ = true;
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

   JSONTEST_ASSERT_EQUAL(1e19, val.asDouble());
   JSONTEST_ASSERT_EQUAL(1e19, val.asFloat());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("1.000000000000000e+19", normalizeFloatingPointStr(val.asString()));

1040
   // uint64 max
Aaron Jacobs's avatar
Aaron Jacobs committed
1041
1042
   val = Json::Value(Json::UInt64(kuint64max));

1043
   JSONTEST_ASSERT_EQUAL(Json::uintValue, val.type());
1044

1045
   checks = IsCheck();
1046
   checks.isUInt64_ = true;
1047
   checks.isIntegral_ = true;
1048
1049
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
1050
1051
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

1052
1053
1054
1055
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

1056
1057
   JSONTEST_ASSERT_EQUAL(kuint64max, val.asUInt64());
   JSONTEST_ASSERT_EQUAL(kuint64max, val.asLargestUInt());
1058
1059
   JSONTEST_ASSERT_EQUAL(uint64ToDouble(kuint64max), val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(uint64ToDouble(kuint64max)), val.asFloat());
1060
1061
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
   JSONTEST_ASSERT_STRING_EQUAL("18446744073709551615", val.asString());
1062

1063
1064
   // uint64 max (floating point constructor). Note that kuint64max is not
   // exactly representable as a double, and will be rounded up to be higher.
1065
   val = Json::Value(uint64ToDouble(kuint64max));
1066

1067
   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1068
1069
1070
1071
1072
1073

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

1074
1075
1076
1077
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));

1078
1079
   JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asDouble());
   JSONTEST_ASSERT_EQUAL(18446744073709551616.0, val.asFloat());
1080
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
1081
   JSONTEST_ASSERT_STRING_EQUAL("1.844674407370955e+19", normalizeFloatingPointStr(val.asString()));
1082
1083
1084
1085
1086
1087
1088
1089
#endif
}


JSONTEST_FIXTURE( ValueTest, nonIntegers )
{
   IsCheck checks;
   Json::Value val;
1090

1091
1092
   // Small positive number
   val = Json::Value(1.5);
Aaron Jacobs's avatar
Aaron Jacobs committed
1093

1094
   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());
1095

Aaron Jacobs's avatar
Aaron Jacobs committed
1096
   checks = IsCheck();
1097
   checks.isDouble_ = true;
1098
   checks.isNumeric_ = true;
Aaron Jacobs's avatar
Aaron Jacobs committed
1099
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );
1100

1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(1.5, val.asDouble());
   JSONTEST_ASSERT_EQUAL(1.5, val.asFloat());
   JSONTEST_ASSERT_EQUAL(1, val.asInt());
   JSONTEST_ASSERT_EQUAL(1, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(1, val.asUInt());
   JSONTEST_ASSERT_EQUAL(1, val.asLargestUInt());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
1117
   JSONTEST_ASSERT_EQUAL("1.50", val.asString());
1118
1119
1120

   // Small negative number
   val = Json::Value(-1.5);
1121

1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
   JSONTEST_ASSERT_EQUAL(Json::realValue, val.type());

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(-1.5, val.asDouble());
   JSONTEST_ASSERT_EQUAL(-1.5, val.asFloat());
   JSONTEST_ASSERT_EQUAL(-1, val.asInt());
   JSONTEST_ASSERT_EQUAL(-1, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
1143
   JSONTEST_ASSERT_EQUAL("-1.50", val.asString());
1144
1145
1146

   // A bit over int32 max
   val = Json::Value(kint32max + 0.5);
Aaron Jacobs's avatar
Aaron Jacobs committed
1147

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

Aaron Jacobs's avatar
Aaron Jacobs committed
1150
1151
1152
1153
1154
   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
   JSONTEST_ASSERT(val.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(2147483647.5, val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(2147483647.5), val.asFloat());
   JSONTEST_ASSERT_EQUAL(2147483647U, val.asUInt());
#ifdef JSON_HAS_INT64
   JSONTEST_ASSERT_EQUAL(2147483647L, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL(2147483647U, val.asLargestUInt());
#endif
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
1172
   JSONTEST_ASSERT_EQUAL("2147483647.50", normalizeFloatingPointStr(val.asString()));
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195

   // A bit under int32 min
   val = Json::Value(kint32min - 0.5);

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

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(-2147483648.5, val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(-2147483648.5), val.asFloat());
#ifdef JSON_HAS_INT64
1196
   JSONTEST_ASSERT_EQUAL(-Json::Int64(1)<< 31, val.asLargestInt());
1197
1198
#endif
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
1199
   JSONTEST_ASSERT_EQUAL("-2147483648.50", normalizeFloatingPointStr(val.asString()));
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222

   // A bit over uint32 max
   val = Json::Value(kuint32max + 0.5);

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

   checks = IsCheck();
   checks.isDouble_ = true;
   checks.isNumeric_ = true;
   JSONTEST_ASSERT_PRED( checkIs( val, checks ) );

   JSONTEST_ASSERT(val.isConvertibleTo(Json::realValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::booleanValue));
   JSONTEST_ASSERT(val.isConvertibleTo(Json::stringValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::nullValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::intValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::uintValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::arrayValue));
   JSONTEST_ASSERT(!val.isConvertibleTo(Json::objectValue));

   JSONTEST_ASSERT_EQUAL(4294967295.5, val.asDouble());
   JSONTEST_ASSERT_EQUAL(float(4294967295.5), val.asFloat());
#ifdef JSON_HAS_INT64
1223
1224
   JSONTEST_ASSERT_EQUAL((Json::Int64(1) << 32)-1, val.asLargestInt());
   JSONTEST_ASSERT_EQUAL((Json::UInt64(1) << 32)-Json::UInt64(1), val.asLargestUInt());
1225
1226
#endif
   JSONTEST_ASSERT_EQUAL(true, val.asBool());
1227
1228
1229
1230
   JSONTEST_ASSERT_EQUAL("4294967295.50", normalizeFloatingPointStr(val.asString()));

   val = Json::Value(1.2345678901234);
   JSONTEST_ASSERT_STRING_EQUAL( "1.23456789012340", normalizeFloatingPointStr(val.asString()));
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245

   // A 16-digit floating point number.
   val = Json::Value(2199023255552000.0f);
   JSONTEST_ASSERT_EQUAL(float(2199023255552000), val.asFloat());
   JSONTEST_ASSERT_STRING_EQUAL("2199023255552000.", normalizeFloatingPointStr(val.asString()));

   // A very large floating point number.
   val = Json::Value(3.402823466385289e38);
   JSONTEST_ASSERT_EQUAL(float(3.402823466385289e38), val.asFloat());
   JSONTEST_ASSERT_STRING_EQUAL("3.402823466385289e+38", normalizeFloatingPointStr(val.asString()));

   // An even larger floating point number.
   val = Json::Value(1.2345678e300);
   JSONTEST_ASSERT_EQUAL(double(1.2345678e300), val.asDouble());
   JSONTEST_ASSERT_STRING_EQUAL("1.234567800000000e+300", normalizeFloatingPointStr(val.asString()));
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
}


void
ValueTest::checkConstMemberCount( const Json::Value &value, unsigned int expectedCount )
{
   unsigned int count = 0;
   Json::Value::const_iterator itEnd = value.end();
   for ( Json::Value::const_iterator it = value.begin(); it != itEnd; ++it )
   {
      ++count;
   }
   JSONTEST_ASSERT_EQUAL( expectedCount, count ) << "Json::Value::const_iterator";
}

void
ValueTest::checkMemberCount( Json::Value &value, unsigned int expectedCount )
{
1264
   JSONTEST_ASSERT_EQUAL(expectedCount, value.size() );
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281

   unsigned int count = 0;
   Json::Value::iterator itEnd = value.end();
   for ( Json::Value::iterator it = value.begin(); it != itEnd; ++it )
   {
      ++count;
   }
   JSONTEST_ASSERT_EQUAL( expectedCount, count ) << "Json::Value::iterator";

   JSONTEST_ASSERT_PRED( checkConstMemberCount(value, expectedCount) );
}


ValueTest::IsCheck::IsCheck()
   : isObject_( false )
   , isArray_( false )
   , isBool_( false )
1282
1283
   , isString_( false )
   , isNull_( false )
1284
   , isInt_( false )
1285
   , isInt64_( false )
1286
   , isUInt_( false )
1287
   , isUInt64_( false )
1288
   , isIntegral_( false )
1289
   , isDouble_( false )
1290
1291
1292
1293
1294
1295
1296
1297
   , isNumeric_( false )
{
}


void 
ValueTest::checkIs( const Json::Value &value, const IsCheck &check )
{
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
   JSONTEST_ASSERT_EQUAL(check.isObject_, value.isObject() );
   JSONTEST_ASSERT_EQUAL(check.isArray_, value.isArray() );
   JSONTEST_ASSERT_EQUAL(check.isBool_, value.isBool() );
   JSONTEST_ASSERT_EQUAL(check.isDouble_, value.isDouble() );
   JSONTEST_ASSERT_EQUAL(check.isInt_, value.isInt() );
   JSONTEST_ASSERT_EQUAL(check.isUInt_, value.isUInt() );
   JSONTEST_ASSERT_EQUAL(check.isIntegral_, value.isIntegral() );
   JSONTEST_ASSERT_EQUAL(check.isNumeric_, value.isNumeric() );
   JSONTEST_ASSERT_EQUAL(check.isString_, value.isString() );
   JSONTEST_ASSERT_EQUAL(check.isNull_, value.isNull() );
1308
1309

#ifdef JSON_HAS_INT64
1310
1311
   JSONTEST_ASSERT_EQUAL(check.isInt64_, value.isInt64() );
   JSONTEST_ASSERT_EQUAL(check.isUInt64_, value.isUInt64() );
1312
#else
1313
1314
   JSONTEST_ASSERT_EQUAL(false, value.isInt64() );
   JSONTEST_ASSERT_EQUAL(false, value.isUInt64() );
1315
#endif
1316
1317
}

1318
1319
1320
1321
1322
1323
JSONTEST_FIXTURE( ValueTest, compareNull )
{
    JSONTEST_ASSERT_PRED( checkIsEqual( Json::Value(), Json::Value() ) );
}


1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
JSONTEST_FIXTURE( ValueTest, compareInt )
{
    JSONTEST_ASSERT_PRED( checkIsLess( 0, 10 ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( 10, 10 ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( -10, -10 ) );
    JSONTEST_ASSERT_PRED( checkIsLess( -10, 0 ) );
}


JSONTEST_FIXTURE( ValueTest, compareUInt )
{
    JSONTEST_ASSERT_PRED( checkIsLess( 0u, 10u ) );
    JSONTEST_ASSERT_PRED( checkIsLess( 0u, Json::Value::maxUInt ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( 10u, 10u ) );
}


JSONTEST_FIXTURE( ValueTest, compareDouble )
{
    JSONTEST_ASSERT_PRED( checkIsLess( 0.0, 10.0 ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( 10.0, 10.0 ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( -10.0, -10.0 ) );
    JSONTEST_ASSERT_PRED( checkIsLess( -10.0, 0.0 ) );
}


JSONTEST_FIXTURE( ValueTest, compareString )
{
    JSONTEST_ASSERT_PRED( checkIsLess( "", " " ) );
    JSONTEST_ASSERT_PRED( checkIsLess( "", "a" ) );
    JSONTEST_ASSERT_PRED( checkIsLess( "abcd", "zyui" ) );
    JSONTEST_ASSERT_PRED( checkIsLess( "abc", "abcd" ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( "abcd", "abcd" ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( " ", " " ) );
    JSONTEST_ASSERT_PRED( checkIsLess( "ABCD", "abcd" ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( "ABCD", "ABCD" ) );
}


JSONTEST_FIXTURE( ValueTest, compareBoolean )
{
    JSONTEST_ASSERT_PRED( checkIsLess( false, true ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( false, false ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( true, true ) );
}


JSONTEST_FIXTURE( ValueTest, compareArray )
{
    // array compare size then content
    Json::Value emptyArray(Json::arrayValue);
    Json::Value l1aArray;
    l1aArray.append( 0 );
    Json::Value l1bArray;
    l1bArray.append( 10 );
    Json::Value l2aArray;
    l2aArray.append( 0 );
    l2aArray.append( 0 );
    Json::Value l2bArray;
    l2bArray.append( 0 );
    l2bArray.append( 10 );
    JSONTEST_ASSERT_PRED( checkIsLess( emptyArray, l1aArray ) );
    JSONTEST_ASSERT_PRED( checkIsLess( emptyArray, l2aArray ) );
    JSONTEST_ASSERT_PRED( checkIsLess( l1aArray, l2aArray ) );
    JSONTEST_ASSERT_PRED( checkIsLess( l2aArray, l2bArray ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( emptyArray, Json::Value( emptyArray ) ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( l1aArray, Json::Value( l1aArray) ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( l2bArray, Json::Value( l2bArray) ) );
}


JSONTEST_FIXTURE( ValueTest, compareObject )
{
    // object compare size then content
    Json::Value emptyObject(Json::objectValue);
    Json::Value l1aObject;
    l1aObject["key1"] = 0;
    Json::Value l1bObject;
    l1aObject["key1"] = 10;
    Json::Value l2aObject;
    l2aObject["key1"] = 0;
    l2aObject["key2"] = 0;
    JSONTEST_ASSERT_PRED( checkIsLess( emptyObject, l1aObject ) );
    JSONTEST_ASSERT_PRED( checkIsLess( emptyObject, l2aObject ) );
    JSONTEST_ASSERT_PRED( checkIsLess( l1aObject, l2aObject ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( emptyObject, Json::Value( emptyObject ) ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( l1aObject, Json::Value( l1aObject ) ) );
    JSONTEST_ASSERT_PRED( checkIsEqual( l2aObject, Json::Value( l2aObject ) ) );
}


1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
JSONTEST_FIXTURE( ValueTest, compareType )
{
    // object of different type are ordered according to their type
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(), Json::Value(1) ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(1), Json::Value(1u) ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(1u), Json::Value(1.0) ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(1.0), Json::Value("a") ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value("a"), Json::Value(true) ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(true), Json::Value(Json::arrayValue) ) );
    JSONTEST_ASSERT_PRED( checkIsLess( Json::Value(Json::arrayValue), Json::Value(Json::objectValue) ) );
}


1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
void 
ValueTest::checkIsLess( const Json::Value &x, const Json::Value &y )
{
    JSONTEST_ASSERT( x < y );
    JSONTEST_ASSERT( y > x );
    JSONTEST_ASSERT( x <= y );
    JSONTEST_ASSERT( y >= x );
    JSONTEST_ASSERT( !(x == y) );
    JSONTEST_ASSERT( !(y == x) );
    JSONTEST_ASSERT( !(x >= y) );
    JSONTEST_ASSERT( !(y <= x) );
    JSONTEST_ASSERT( !(x > y) );
    JSONTEST_ASSERT( !(y < x) );
1441
1442
    JSONTEST_ASSERT( x.compare( y ) < 0 );
    JSONTEST_ASSERT( y.compare( x ) >= 0 );
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
}


void 
ValueTest::checkIsEqual( const Json::Value &x, const Json::Value &y )
{
    JSONTEST_ASSERT( x == y );
    JSONTEST_ASSERT( y == x );
    JSONTEST_ASSERT( x <= y );
    JSONTEST_ASSERT( y <= x );
    JSONTEST_ASSERT( x >= y );
    JSONTEST_ASSERT( y >= x );
    JSONTEST_ASSERT( !(x < y) );
    JSONTEST_ASSERT( !(y < x) );
    JSONTEST_ASSERT( !(x > y) );
    JSONTEST_ASSERT( !(y > x) );
1459
1460
    JSONTEST_ASSERT( x.compare( y ) == 0 );
    JSONTEST_ASSERT( y.compare( x ) == 0 );
1461
1462
}

1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479

struct WriterTest : JsonTest::TestCase
{
};


JSONTEST_FIXTURE( WriterTest, dropNullPlaceholders )
{
    Json::FastWriter writer;
    Json::Value nullValue;
    JSONTEST_ASSERT( writer.write(nullValue) == "null\n" );

    writer.dropNullPlaceholders();
    JSONTEST_ASSERT( writer.write(nullValue) == "\n" );
}


1480
1481
1482
int main( int argc, const char *argv[] )
{
   JsonTest::Runner runner;
1483
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, checkNormalizeFloatingPointStr );
1484
1485
1486
1487
1488
1489
1490
1491
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, memberCount );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, objects );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, arrays );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, null );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, strings );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, bools );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, integers );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, nonIntegers );
1492
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareNull );
1493
1494
1495
1496
1497
1498
1499
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareInt );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareUInt );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareDouble );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareString );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareBoolean );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareArray );
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareObject );
1500
   JSONTEST_REGISTER_FIXTURE( runner, ValueTest, compareType );
1501
   JSONTEST_REGISTER_FIXTURE( runner, WriterTest, dropNullPlaceholders );
1502
1503
   return runner.runCommandLine( argc, argv );
}