Home | History | Annotate | Download | only in unittest
      1 // Tencent is pleased to support the open source community by making RapidJSON available.
      2 //
      3 // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
      4 //
      5 // Licensed under the MIT License (the "License"); you may not use this file except
      6 // in compliance with the License. You may obtain a copy of the License at
      7 //
      8 // http://opensource.org/licenses/MIT
      9 //
     10 // Unless required by applicable law or agreed to in writing, software distributed
     11 // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
     12 // CONDITIONS OF ANY KIND, either express or implied. See the License for the
     13 // specific language governing permissions and limitations under the License.
     14 
     15 #include "unittest.h"
     16 
     17 #include "rapidjson/reader.h"
     18 #include "rapidjson/internal/dtoa.h"
     19 #include "rapidjson/internal/itoa.h"
     20 #include "rapidjson/memorystream.h"
     21 
     22 using namespace rapidjson;
     23 
     24 #ifdef __GNUC__
     25 RAPIDJSON_DIAG_PUSH
     26 RAPIDJSON_DIAG_OFF(effc++)
     27 RAPIDJSON_DIAG_OFF(float-equal)
     28 #endif
     29 
     30 template<bool expect>
     31 struct ParseBoolHandler : BaseReaderHandler<UTF8<>, ParseBoolHandler<expect> > {
     32     ParseBoolHandler() : step_(0) {}
     33     bool Default() { ADD_FAILURE(); return false; }
     34     // gcc 4.8.x generates warning in EXPECT_EQ(bool, bool) on this gtest version.
     35     // Workaround with EXPECT_TRUE().
     36     bool Bool(bool b) { /*EXPECT_EQ(expect, b); */EXPECT_TRUE(expect == b);  ++step_; return true; }
     37 
     38     unsigned step_;
     39 };
     40 
     41 TEST(Reader, ParseTrue) {
     42     StringStream s("true");
     43     ParseBoolHandler<true> h;
     44     Reader reader;
     45     reader.Parse(s, h);
     46     EXPECT_EQ(1u, h.step_);
     47 }
     48 
     49 TEST(Reader, ParseFalse) {
     50     StringStream s("false");
     51     ParseBoolHandler<false> h;
     52     Reader reader;
     53     reader.Parse(s, h);
     54     EXPECT_EQ(1u, h.step_);
     55 }
     56 
     57 struct ParseIntHandler : BaseReaderHandler<UTF8<>, ParseIntHandler> {
     58     ParseIntHandler() : step_(0), actual_() {}
     59     bool Default() { ADD_FAILURE(); return false; }
     60     bool Int(int i) { actual_ = i; step_++; return true; }
     61 
     62     unsigned step_;
     63     int actual_;
     64 };
     65 
     66 struct ParseUintHandler : BaseReaderHandler<UTF8<>, ParseUintHandler> {
     67     ParseUintHandler() : step_(0), actual_() {}
     68     bool Default() { ADD_FAILURE(); return false; }
     69     bool Uint(unsigned i) { actual_ = i; step_++; return true; }
     70 
     71     unsigned step_;
     72     unsigned actual_;
     73 };
     74 
     75 struct ParseInt64Handler : BaseReaderHandler<UTF8<>, ParseInt64Handler> {
     76     ParseInt64Handler() : step_(0), actual_() {}
     77     bool Default() { ADD_FAILURE(); return false; }
     78     bool Int64(int64_t i) { actual_ = i; step_++; return true; }
     79 
     80     unsigned step_;
     81     int64_t actual_;
     82 };
     83 
     84 struct ParseUint64Handler : BaseReaderHandler<UTF8<>, ParseUint64Handler> {
     85     ParseUint64Handler() : step_(0), actual_() {}
     86     bool Default() { ADD_FAILURE(); return false; }
     87     bool Uint64(uint64_t i) { actual_ = i; step_++; return true; }
     88 
     89     unsigned step_;
     90     uint64_t actual_;
     91 };
     92 
     93 struct ParseDoubleHandler : BaseReaderHandler<UTF8<>, ParseDoubleHandler> {
     94     ParseDoubleHandler() : step_(0), actual_() {}
     95     bool Default() { ADD_FAILURE(); return false; }
     96     bool Double(double d) { actual_ = d; step_++; return true; }
     97 
     98     unsigned step_;
     99     double actual_;
    100 };
    101 
    102 TEST(Reader, ParseNumber_Integer) {
    103 #define TEST_INTEGER(Handler, str, x) \
    104     { \
    105         StringStream s(str); \
    106         Handler h; \
    107         Reader reader; \
    108         reader.Parse(s, h); \
    109         EXPECT_EQ(1u, h.step_); \
    110         EXPECT_EQ(x, h.actual_); \
    111     }
    112 
    113     TEST_INTEGER(ParseUintHandler, "0", 0u);
    114     TEST_INTEGER(ParseUintHandler, "123", 123u);
    115     TEST_INTEGER(ParseUintHandler, "2147483648", 2147483648u);       // 2^31 - 1 (cannot be stored in int)
    116     TEST_INTEGER(ParseUintHandler, "4294967295", 4294967295u);
    117 
    118     TEST_INTEGER(ParseIntHandler, "-123", -123);
    119     TEST_INTEGER(ParseIntHandler, "-2147483648", static_cast<int32_t>(0x80000000));     // -2^31 (min of int)
    120 
    121     TEST_INTEGER(ParseUint64Handler, "4294967296", RAPIDJSON_UINT64_C2(1, 0));   // 2^32 (max of unsigned + 1, force to use uint64_t)
    122     TEST_INTEGER(ParseUint64Handler, "18446744073709551615", RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF));   // 2^64 - 1 (max of uint64_t)
    123 
    124     TEST_INTEGER(ParseInt64Handler, "-2147483649", static_cast<int64_t>(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x7FFFFFFF)));   // -2^31 -1 (min of int - 1, force to use int64_t)
    125     TEST_INTEGER(ParseInt64Handler, "-9223372036854775808", static_cast<int64_t>(RAPIDJSON_UINT64_C2(0x80000000, 0x00000000)));       // -2^63 (min of int64_t)
    126 
    127     // Random test for uint32_t/int32_t
    128     {
    129         union {
    130             uint32_t u;
    131             int32_t i;
    132         }u;
    133         Random r;
    134 
    135         for (unsigned i = 0; i < 100000; i++) {
    136             u.u = r();
    137 
    138             char buffer[32];
    139             *internal::u32toa(u.u, buffer) = '\0';
    140             TEST_INTEGER(ParseUintHandler, buffer, u.u);
    141 
    142             if (u.i < 0) {
    143                 *internal::i32toa(u.i, buffer) = '\0';
    144                 TEST_INTEGER(ParseIntHandler, buffer, u.i);
    145             }
    146         }
    147     }
    148 
    149     // Random test for uint64_t/int64_t
    150     {
    151         union {
    152             uint64_t u;
    153             int64_t i;
    154         }u;
    155         Random r;
    156 
    157         for (unsigned i = 0; i < 100000; i++) {
    158             u.u = uint64_t(r()) << 32;
    159             u.u |= r();
    160 
    161             char buffer[32];
    162             if (u.u >= 4294967296ULL) {
    163                 *internal::u64toa(u.u, buffer) = '\0';
    164                 TEST_INTEGER(ParseUint64Handler, buffer, u.u);
    165             }
    166 
    167             if (u.i <= -2147483649LL) {
    168                 *internal::i64toa(u.i, buffer) = '\0';
    169                 TEST_INTEGER(ParseInt64Handler, buffer, u.i);
    170             }
    171         }
    172     }
    173 #undef TEST_INTEGER
    174 }
    175 
    176 template<bool fullPrecision>
    177 static void TestParseDouble() {
    178 #define TEST_DOUBLE(fullPrecision, str, x) \
    179     { \
    180         StringStream s(str); \
    181         ParseDoubleHandler h; \
    182         Reader reader; \
    183         ASSERT_EQ(kParseErrorNone, reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h).Code()); \
    184         EXPECT_EQ(1u, h.step_); \
    185         internal::Double e(x), a(h.actual_); \
    186         if (fullPrecision) { \
    187             EXPECT_EQ(e.Uint64Value(), a.Uint64Value()); \
    188             if (e.Uint64Value() != a.Uint64Value()) \
    189                 printf("  String: %s\n  Actual: %.17g\nExpected: %.17g\n", str, h.actual_, x); \
    190         } \
    191         else { \
    192             EXPECT_EQ(e.Sign(), a.Sign()); /* for 0.0 != -0.0 */ \
    193             EXPECT_DOUBLE_EQ(x, h.actual_); \
    194         } \
    195     }
    196 
    197     TEST_DOUBLE(fullPrecision, "0.0", 0.0);
    198     TEST_DOUBLE(fullPrecision, "-0.0", -0.0); // For checking issue #289
    199     TEST_DOUBLE(fullPrecision, "1.0", 1.0);
    200     TEST_DOUBLE(fullPrecision, "-1.0", -1.0);
    201     TEST_DOUBLE(fullPrecision, "1.5", 1.5);
    202     TEST_DOUBLE(fullPrecision, "-1.5", -1.5);
    203     TEST_DOUBLE(fullPrecision, "3.1416", 3.1416);
    204     TEST_DOUBLE(fullPrecision, "1E10", 1E10);
    205     TEST_DOUBLE(fullPrecision, "1e10", 1e10);
    206     TEST_DOUBLE(fullPrecision, "1E+10", 1E+10);
    207     TEST_DOUBLE(fullPrecision, "1E-10", 1E-10);
    208     TEST_DOUBLE(fullPrecision, "-1E10", -1E10);
    209     TEST_DOUBLE(fullPrecision, "-1e10", -1e10);
    210     TEST_DOUBLE(fullPrecision, "-1E+10", -1E+10);
    211     TEST_DOUBLE(fullPrecision, "-1E-10", -1E-10);
    212     TEST_DOUBLE(fullPrecision, "1.234E+10", 1.234E+10);
    213     TEST_DOUBLE(fullPrecision, "1.234E-10", 1.234E-10);
    214     TEST_DOUBLE(fullPrecision, "1.79769e+308", 1.79769e+308);
    215     TEST_DOUBLE(fullPrecision, "2.22507e-308", 2.22507e-308);
    216     TEST_DOUBLE(fullPrecision, "-1.79769e+308", -1.79769e+308);
    217     TEST_DOUBLE(fullPrecision, "-2.22507e-308", -2.22507e-308);
    218     TEST_DOUBLE(fullPrecision, "4.9406564584124654e-324", 4.9406564584124654e-324); // minimum denormal
    219     TEST_DOUBLE(fullPrecision, "2.2250738585072009e-308", 2.2250738585072009e-308); // Max subnormal double
    220     TEST_DOUBLE(fullPrecision, "2.2250738585072014e-308", 2.2250738585072014e-308); // Min normal positive double
    221     TEST_DOUBLE(fullPrecision, "1.7976931348623157e+308", 1.7976931348623157e+308); // Max double
    222     TEST_DOUBLE(fullPrecision, "1e-10000", 0.0);                                    // must underflow
    223     TEST_DOUBLE(fullPrecision, "18446744073709551616", 18446744073709551616.0);     // 2^64 (max of uint64_t + 1, force to use double)
    224     TEST_DOUBLE(fullPrecision, "-9223372036854775809", -9223372036854775809.0);     // -2^63 - 1(min of int64_t + 1, force to use double)
    225     TEST_DOUBLE(fullPrecision, "0.9868011474609375", 0.9868011474609375);           // https://github.com/miloyip/rapidjson/issues/120
    226     TEST_DOUBLE(fullPrecision, "123e34", 123e34);                                   // Fast Path Cases In Disguise
    227     TEST_DOUBLE(fullPrecision, "45913141877270640000.0", 45913141877270640000.0);
    228     TEST_DOUBLE(fullPrecision, "2.2250738585072011e-308", 2.2250738585072011e-308); // http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
    229     TEST_DOUBLE(fullPrecision, "1e-00011111111111", 0.0);                           // Issue #313
    230     TEST_DOUBLE(fullPrecision, "-1e-00011111111111", -0.0);
    231     TEST_DOUBLE(fullPrecision, "1e-214748363", 0.0);                                  // Maximum supported negative exponent
    232     TEST_DOUBLE(fullPrecision, "1e-214748364", 0.0);
    233     TEST_DOUBLE(fullPrecision, "1e-21474836311", 0.0);
    234     TEST_DOUBLE(fullPrecision, "0.017976931348623157e+310", 1.7976931348623157e+308); // Max double in another form
    235 
    236     // Since
    237     // abs((2^-1022 - 2^-1074) - 2.2250738585072012e-308) = 3.109754131239141401123495768877590405345064751974375599...  10^-324
    238     // abs((2^-1022) - 2.2250738585072012e-308) = 1.830902327173324040642192159804623318305533274168872044...  10 ^ -324
    239     // So 2.2250738585072012e-308 should round to 2^-1022 = 2.2250738585072014e-308
    240     TEST_DOUBLE(fullPrecision, "2.2250738585072012e-308", 2.2250738585072014e-308); // http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
    241 
    242     // More closer to normal/subnormal boundary
    243     // boundary = 2^-1022 - 2^-1075 = 2.225073858507201136057409796709131975934819546351645648...  10^-308
    244     TEST_DOUBLE(fullPrecision, "2.22507385850720113605740979670913197593481954635164564e-308", 2.2250738585072009e-308);
    245     TEST_DOUBLE(fullPrecision, "2.22507385850720113605740979670913197593481954635164565e-308", 2.2250738585072014e-308);
    246 
    247     // 1.0 is in (1.0 - 2^-54, 1.0 + 2^-53)
    248     // 1.0 - 2^-54 = 0.999999999999999944488848768742172978818416595458984375
    249     TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984375", 1.0); // round to even
    250     TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984374", 0.99999999999999989); // previous double
    251     TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984376", 1.0); // next double
    252     // 1.0 + 2^-53 = 1.00000000000000011102230246251565404236316680908203125
    253     TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203125", 1.0); // round to even
    254     TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203124", 1.0); // previous double
    255     TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203126", 1.00000000000000022); // next double
    256 
    257     // Numbers from https://github.com/floitsch/double-conversion/blob/master/test/cctest/test-strtod.cc
    258 
    259     TEST_DOUBLE(fullPrecision, "72057594037927928.0", 72057594037927928.0);
    260     TEST_DOUBLE(fullPrecision, "72057594037927936.0", 72057594037927936.0);
    261     TEST_DOUBLE(fullPrecision, "72057594037927932.0", 72057594037927936.0);
    262     TEST_DOUBLE(fullPrecision, "7205759403792793199999e-5", 72057594037927928.0);
    263     TEST_DOUBLE(fullPrecision, "7205759403792793200001e-5", 72057594037927936.0);
    264 
    265     TEST_DOUBLE(fullPrecision, "9223372036854774784.0", 9223372036854774784.0);
    266     TEST_DOUBLE(fullPrecision, "9223372036854775808.0", 9223372036854775808.0);
    267     TEST_DOUBLE(fullPrecision, "9223372036854775296.0", 9223372036854775808.0);
    268     TEST_DOUBLE(fullPrecision, "922337203685477529599999e-5", 9223372036854774784.0);
    269     TEST_DOUBLE(fullPrecision, "922337203685477529600001e-5", 9223372036854775808.0);
    270 
    271     TEST_DOUBLE(fullPrecision, "10141204801825834086073718800384", 10141204801825834086073718800384.0);
    272     TEST_DOUBLE(fullPrecision, "10141204801825835211973625643008", 10141204801825835211973625643008.0);
    273     TEST_DOUBLE(fullPrecision, "10141204801825834649023672221696", 10141204801825835211973625643008.0);
    274     TEST_DOUBLE(fullPrecision, "1014120480182583464902367222169599999e-5", 10141204801825834086073718800384.0);
    275     TEST_DOUBLE(fullPrecision, "1014120480182583464902367222169600001e-5", 10141204801825835211973625643008.0);
    276 
    277     TEST_DOUBLE(fullPrecision, "5708990770823838890407843763683279797179383808", 5708990770823838890407843763683279797179383808.0);
    278     TEST_DOUBLE(fullPrecision, "5708990770823839524233143877797980545530986496", 5708990770823839524233143877797980545530986496.0);
    279     TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185152", 5708990770823839524233143877797980545530986496.0);
    280     TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185151999e-3", 5708990770823838890407843763683279797179383808.0);
    281     TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185152001e-3", 5708990770823839524233143877797980545530986496.0);
    282 
    283     {
    284         char n1e308[310];   // '1' followed by 308 '0'
    285         n1e308[0] = '1';
    286         for (int i = 1; i < 309; i++)
    287             n1e308[i] = '0';
    288         n1e308[309] = '\0';
    289         TEST_DOUBLE(fullPrecision, n1e308, 1E308);
    290     }
    291 
    292     // Cover trimming
    293     TEST_DOUBLE(fullPrecision,
    294 "2.22507385850720113605740979670913197593481954635164564802342610972482222202107694551652952390813508"
    295 "7914149158913039621106870086438694594645527657207407820621743379988141063267329253552286881372149012"
    296 "9811224514518898490572223072852551331557550159143974763979834118019993239625482890171070818506906306"
    297 "6665599493827577257201576306269066333264756530000924588831643303777979186961204949739037782970490505"
    298 "1080609940730262937128958950003583799967207254304360284078895771796150945516748243471030702609144621"
    299 "5722898802581825451803257070188608721131280795122334262883686223215037756666225039825343359745688844"
    300 "2390026549819838548794829220689472168983109969836584681402285424333066033985088644580400103493397042"
    301 "7567186443383770486037861622771738545623065874679014086723327636718751234567890123456789012345678901"
    302 "e-308",
    303     2.2250738585072014e-308);
    304 
    305     {
    306         static const unsigned count = 100; // Tested with 1000000 locally
    307         Random r;
    308         Reader reader; // Reusing reader to prevent heap allocation
    309 
    310         // Exhaustively test different exponents with random significant
    311         for (uint64_t exp = 0; exp < 2047; exp++) {
    312             ;
    313             for (unsigned i = 0; i < count; i++) {
    314                 // Need to call r() in two statements for cross-platform coherent sequence.
    315                 uint64_t u = (exp << 52) | uint64_t(r() & 0x000FFFFF) << 32;
    316                 u |= uint64_t(r());
    317                 internal::Double d = internal::Double(u);
    318 
    319                 char buffer[32];
    320                 *internal::dtoa(d.Value(), buffer) = '\0';
    321 
    322                 StringStream s(buffer);
    323                 ParseDoubleHandler h;
    324                 ASSERT_EQ(kParseErrorNone, reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h).Code());
    325                 EXPECT_EQ(1u, h.step_);
    326                 internal::Double a(h.actual_);
    327                 if (fullPrecision) {
    328                     EXPECT_EQ(d.Uint64Value(), a.Uint64Value());
    329                     if (d.Uint64Value() != a.Uint64Value())
    330                         printf("  String: %s\n  Actual: %.17g\nExpected: %.17g\n", buffer, h.actual_, d.Value());
    331                 }
    332                 else {
    333                     EXPECT_EQ(d.Sign(), a.Sign()); // for 0.0 != -0.0
    334                     EXPECT_DOUBLE_EQ(d.Value(), h.actual_);
    335                 }
    336             }
    337         }
    338     }
    339 
    340     // Issue #340
    341     TEST_DOUBLE(fullPrecision, "7.450580596923828e-9", 7.450580596923828e-9);
    342     {
    343         internal::Double d(1.0);
    344         for (int i = 0; i < 324; i++) {
    345             char buffer[32];
    346             *internal::dtoa(d.Value(), buffer) = '\0';
    347 
    348             StringStream s(buffer);
    349             ParseDoubleHandler h;
    350             Reader reader;
    351             ASSERT_EQ(kParseErrorNone, reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h).Code());
    352             EXPECT_EQ(1u, h.step_);
    353             internal::Double a(h.actual_);
    354             if (fullPrecision) {
    355                 EXPECT_EQ(d.Uint64Value(), a.Uint64Value());
    356                 if (d.Uint64Value() != a.Uint64Value())
    357                     printf("  String: %s\n  Actual: %.17g\nExpected: %.17g\n", buffer, h.actual_, d.Value());
    358             }
    359             else {
    360                 EXPECT_EQ(d.Sign(), a.Sign()); // for 0.0 != -0.0
    361                 EXPECT_DOUBLE_EQ(d.Value(), h.actual_);
    362             }
    363 
    364 
    365             d = d.Value() * 0.5;
    366         }
    367     }
    368 #undef TEST_DOUBLE
    369 }
    370 
    371 TEST(Reader, ParseNumber_NormalPrecisionDouble) {
    372     TestParseDouble<false>();
    373 }
    374 
    375 TEST(Reader, ParseNumber_FullPrecisionDouble) {
    376     TestParseDouble<true>();
    377 }
    378 
    379 TEST(Reader, ParseNumber_NormalPrecisionError) {
    380     static unsigned count = 1000000;
    381     Random r;
    382 
    383     double ulpSum = 0.0;
    384     double ulpMax = 0.0;
    385     for (unsigned i = 0; i < count; i++) {
    386         internal::Double e, a;
    387         do {
    388             // Need to call r() in two statements for cross-platform coherent sequence.
    389             uint64_t u = uint64_t(r()) << 32;
    390             u |= uint64_t(r());
    391             e = u;
    392         } while (e.IsNan() || e.IsInf() || !e.IsNormal());
    393 
    394         char buffer[32];
    395         *internal::dtoa(e.Value(), buffer) = '\0';
    396 
    397         StringStream s(buffer);
    398         ParseDoubleHandler h;
    399         Reader reader;
    400         ASSERT_EQ(kParseErrorNone, reader.Parse(s, h).Code());
    401         EXPECT_EQ(1u, h.step_);
    402 
    403         a = h.actual_;
    404         uint64_t bias1 = e.ToBias();
    405         uint64_t bias2 = a.ToBias();
    406         double ulp = bias1 >= bias2 ? bias1 - bias2 : bias2 - bias1;
    407         ulpMax = std::max(ulpMax, ulp);
    408         ulpSum += ulp;
    409     }
    410     printf("ULP Average = %g, Max = %g \n", ulpSum / count, ulpMax);
    411 }
    412 
    413 TEST(Reader, ParseNumber_Error) {
    414 #define TEST_NUMBER_ERROR(errorCode, str) \
    415     { \
    416         char buffer[1001]; \
    417         sprintf(buffer, "%s", str); \
    418         InsituStringStream s(buffer); \
    419         BaseReaderHandler<> h; \
    420         Reader reader; \
    421         EXPECT_FALSE(reader.Parse(s, h)); \
    422         EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
    423     }
    424 
    425     // Number too big to be stored in double.
    426     {
    427         char n1e309[311];   // '1' followed by 309 '0'
    428         n1e309[0] = '1';
    429         for (int i = 1; i < 310; i++)
    430             n1e309[i] = '0';
    431         n1e309[310] = '\0';
    432         TEST_NUMBER_ERROR(kParseErrorNumberTooBig, n1e309);
    433     }
    434     TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e309");
    435 
    436     // Miss fraction part in number.
    437     TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.");
    438     TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.a");
    439 
    440     // Miss exponent in number.
    441     TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e");
    442     TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e_");
    443 
    444 #undef TEST_NUMBER_ERROR
    445 }
    446 
    447 template <typename Encoding>
    448 struct ParseStringHandler : BaseReaderHandler<Encoding, ParseStringHandler<Encoding> > {
    449     ParseStringHandler() : str_(0), length_(0), copy_() {}
    450     ~ParseStringHandler() { EXPECT_TRUE(str_ != 0); if (copy_) free(const_cast<typename Encoding::Ch*>(str_)); }
    451 
    452     ParseStringHandler(const ParseStringHandler&);
    453     ParseStringHandler& operator=(const ParseStringHandler&);
    454 
    455     bool Default() { ADD_FAILURE(); return false; }
    456     bool String(const typename Encoding::Ch* str, size_t length, bool copy) {
    457         EXPECT_EQ(0, str_);
    458         if (copy) {
    459             str_ = (typename Encoding::Ch*)malloc((length + 1) * sizeof(typename Encoding::Ch));
    460             memcpy(const_cast<typename Encoding::Ch*>(str_), str, (length + 1) * sizeof(typename Encoding::Ch));
    461         }
    462         else
    463             str_ = str;
    464         length_ = length;
    465         copy_ = copy;
    466         return true;
    467     }
    468 
    469     const typename Encoding::Ch* str_;
    470     size_t length_;
    471     bool copy_;
    472 };
    473 
    474 TEST(Reader, ParseString) {
    475 #define TEST_STRING(Encoding, e, x) \
    476     { \
    477         Encoding::Ch* buffer = StrDup(x); \
    478         GenericInsituStringStream<Encoding> is(buffer); \
    479         ParseStringHandler<Encoding> h; \
    480         GenericReader<Encoding, Encoding> reader; \
    481         reader.Parse<kParseInsituFlag | kParseValidateEncodingFlag>(is, h); \
    482         EXPECT_EQ(0, StrCmp<Encoding::Ch>(e, h.str_)); \
    483         EXPECT_EQ(StrLen(e), h.length_); \
    484         free(buffer); \
    485         GenericStringStream<Encoding> s(x); \
    486         ParseStringHandler<Encoding> h2; \
    487         GenericReader<Encoding, Encoding> reader2; \
    488         reader2.Parse(s, h2); \
    489         EXPECT_EQ(0, StrCmp<Encoding::Ch>(e, h2.str_)); \
    490         EXPECT_EQ(StrLen(e), h2.length_); \
    491     }
    492 
    493     // String constant L"\xXX" can only specify character code in bytes, which is not endianness-neutral.
    494     // And old compiler does not support u"" and U"" string literal. So here specify string literal by array of Ch.
    495     // In addition, GCC 4.8 generates -Wnarrowing warnings when character code >= 128 are assigned to signed integer types.
    496     // Therefore, utype is added for declaring unsigned array, and then cast it to Encoding::Ch.
    497 #define ARRAY(...) { __VA_ARGS__ }
    498 #define TEST_STRINGARRAY(Encoding, utype, array, x) \
    499     { \
    500         static const utype ue[] = array; \
    501         static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
    502         TEST_STRING(Encoding, e, x); \
    503     }
    504 
    505 #define TEST_STRINGARRAY2(Encoding, utype, earray, xarray) \
    506     { \
    507         static const utype ue[] = earray; \
    508         static const utype xe[] = xarray; \
    509         static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
    510         static const Encoding::Ch* x = reinterpret_cast<const Encoding::Ch *>(&xe[0]); \
    511         TEST_STRING(Encoding, e, x); \
    512     }
    513 
    514     TEST_STRING(UTF8<>, "", "\"\"");
    515     TEST_STRING(UTF8<>, "Hello", "\"Hello\"");
    516     TEST_STRING(UTF8<>, "Hello\nWorld", "\"Hello\\nWorld\"");
    517     TEST_STRING(UTF8<>, "\"\\/\b\f\n\r\t", "\"\\\"\\\\/\\b\\f\\n\\r\\t\"");
    518     TEST_STRING(UTF8<>, "\x24", "\"\\u0024\"");         // Dollar sign U+0024
    519     TEST_STRING(UTF8<>, "\xC2\xA2", "\"\\u00A2\"");     // Cents sign U+00A2
    520     TEST_STRING(UTF8<>, "\xE2\x82\xAC", "\"\\u20AC\""); // Euro sign U+20AC
    521     TEST_STRING(UTF8<>, "\xF0\x9D\x84\x9E", "\"\\uD834\\uDD1E\"");  // G clef sign U+1D11E
    522 
    523     // UTF16
    524     TEST_STRING(UTF16<>, L"", L"\"\"");
    525     TEST_STRING(UTF16<>, L"Hello", L"\"Hello\"");
    526     TEST_STRING(UTF16<>, L"Hello\nWorld", L"\"Hello\\nWorld\"");
    527     TEST_STRING(UTF16<>, L"\"\\/\b\f\n\r\t", L"\"\\\"\\\\/\\b\\f\\n\\r\\t\"");
    528     TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x0024, 0x0000), L"\"\\u0024\"");
    529     TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x00A2, 0x0000), L"\"\\u00A2\"");  // Cents sign U+00A2
    530     TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x20AC, 0x0000), L"\"\\u20AC\"");  // Euro sign U+20AC
    531     TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0xD834, 0xDD1E, 0x0000), L"\"\\uD834\\uDD1E\"");   // G clef sign U+1D11E
    532 
    533     // UTF32
    534     TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('\0'), ARRAY('\"', '\"', '\0'));
    535     TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('H', 'e', 'l', 'l', 'o', '\0'), ARRAY('\"', 'H', 'e', 'l', 'l', 'o', '\"', '\0'));
    536     TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('H', 'e', 'l', 'l', 'o', '\n', 'W', 'o', 'r', 'l', 'd', '\0'), ARRAY('\"', 'H', 'e', 'l', 'l', 'o', '\\', 'n', 'W', 'o', 'r', 'l', 'd', '\"', '\0'));
    537     TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('\"', '\\', '/', '\b', '\f', '\n', '\r', '\t', '\0'), ARRAY('\"', '\\', '\"', '\\', '\\', '/', '\\', 'b', '\\', 'f', '\\', 'n', '\\', 'r', '\\', 't', '\"', '\0'));
    538     TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x00024, 0x0000), ARRAY('\"', '\\', 'u', '0', '0', '2', '4', '\"', '\0'));
    539     TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x000A2, 0x0000), ARRAY('\"', '\\', 'u', '0', '0', 'A', '2', '\"', '\0'));   // Cents sign U+00A2
    540     TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x020AC, 0x0000), ARRAY('\"', '\\', 'u', '2', '0', 'A', 'C', '\"', '\0'));   // Euro sign U+20AC
    541     TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x1D11E, 0x0000), ARRAY('\"', '\\', 'u', 'D', '8', '3', '4', '\\', 'u', 'D', 'D', '1', 'E', '\"', '\0'));    // G clef sign U+1D11E
    542 
    543 #undef TEST_STRINGARRAY
    544 #undef ARRAY
    545 #undef TEST_STRING
    546 
    547     // Support of null character in string
    548     {
    549         StringStream s("\"Hello\\u0000World\"");
    550         const char e[] = "Hello\0World";
    551         ParseStringHandler<UTF8<> > h;
    552         Reader reader;
    553         reader.Parse(s, h);
    554         EXPECT_EQ(0, memcmp(e, h.str_, h.length_ + 1));
    555         EXPECT_EQ(11u, h.length_);
    556     }
    557 }
    558 
    559 TEST(Reader, ParseString_Transcoding) {
    560     const char* x = "\"Hello\"";
    561     const wchar_t* e = L"Hello";
    562     GenericStringStream<UTF8<> > is(x);
    563     GenericReader<UTF8<>, UTF16<> > reader;
    564     ParseStringHandler<UTF16<> > h;
    565     reader.Parse(is, h);
    566     EXPECT_EQ(0, StrCmp<UTF16<>::Ch>(e, h.str_));
    567     EXPECT_EQ(StrLen(e), h.length_);
    568 }
    569 
    570 TEST(Reader, ParseString_TranscodingWithValidation) {
    571     const char* x = "\"Hello\"";
    572     const wchar_t* e = L"Hello";
    573     GenericStringStream<UTF8<> > is(x);
    574     GenericReader<UTF8<>, UTF16<> > reader;
    575     ParseStringHandler<UTF16<> > h;
    576     reader.Parse<kParseValidateEncodingFlag>(is, h);
    577     EXPECT_EQ(0, StrCmp<UTF16<>::Ch>(e, h.str_));
    578     EXPECT_EQ(StrLen(e), h.length_);
    579 }
    580 
    581 TEST(Reader, ParseString_NonDestructive) {
    582     StringStream s("\"Hello\\nWorld\"");
    583     ParseStringHandler<UTF8<> > h;
    584     Reader reader;
    585     reader.Parse(s, h);
    586     EXPECT_EQ(0, StrCmp("Hello\nWorld", h.str_));
    587     EXPECT_EQ(11u, h.length_);
    588 }
    589 
    590 template <typename Encoding>
    591 ParseErrorCode TestString(const typename Encoding::Ch* str) {
    592     GenericStringStream<Encoding> s(str);
    593     BaseReaderHandler<Encoding> h;
    594     GenericReader<Encoding, Encoding> reader;
    595     reader.template Parse<kParseValidateEncodingFlag>(s, h);
    596     return reader.GetParseErrorCode();
    597 }
    598 
    599 TEST(Reader, ParseString_Error) {
    600 #define TEST_STRING_ERROR(errorCode, str)\
    601         EXPECT_EQ(errorCode, TestString<UTF8<> >(str))
    602 
    603 #define ARRAY(...) { __VA_ARGS__ }
    604 #define TEST_STRINGENCODING_ERROR(Encoding, TargetEncoding, utype, array) \
    605     { \
    606         static const utype ue[] = array; \
    607         static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
    608         EXPECT_EQ(kParseErrorStringInvalidEncoding, TestString<Encoding>(e));\
    609         /* decode error */\
    610         GenericStringStream<Encoding> s(e);\
    611         BaseReaderHandler<TargetEncoding> h;\
    612         GenericReader<Encoding, TargetEncoding> reader;\
    613         reader.Parse(s, h);\
    614         EXPECT_EQ(kParseErrorStringInvalidEncoding, reader.GetParseErrorCode());\
    615     }
    616 
    617     // Invalid escape character in string.
    618     TEST_STRING_ERROR(kParseErrorStringEscapeInvalid, "[\"\\a\"]");
    619 
    620     // Incorrect hex digit after \\u escape in string.
    621     TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uABCG\"]");
    622 
    623     // Quotation in \\u escape in string (Issue #288)
    624     TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uaaa\"]");
    625     TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uD800\\uFFF\"]");
    626 
    627     // The surrogate pair in string is invalid.
    628     TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800X\"]");
    629     TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800\\uFFFF\"]");
    630 
    631     // Missing a closing quotation mark in string.
    632     TEST_STRING_ERROR(kParseErrorStringMissQuotationMark, "[\"Test]");
    633 
    634     // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
    635 
    636     // 3  Malformed sequences
    637 
    638     // 3.1 Unexpected continuation bytes
    639     {
    640          char e[] = { '[', '\"', 0, '\"', ']', '\0' };
    641          for (unsigned char c = 0x80u; c <= 0xBFu; c++) {
    642             e[2] = c;
    643             ParseErrorCode error = TestString<UTF8<> >(e);
    644             EXPECT_EQ(kParseErrorStringInvalidEncoding, error);
    645             if (error != kParseErrorStringInvalidEncoding)
    646                 std::cout << (unsigned)(unsigned char)c << std::endl;
    647          }
    648     }
    649 
    650     // 3.2 Lonely start characters, 3.5 Impossible bytes
    651     {
    652         char e[] = { '[', '\"', 0, ' ', '\"', ']', '\0' };
    653         for (unsigned c = 0xC0u; c <= 0xFFu; c++) {
    654             e[2] = (char)c;
    655             TEST_STRING_ERROR(kParseErrorStringInvalidEncoding, e);
    656         }
    657     }
    658 
    659     // 4  Overlong sequences
    660 
    661     // 4.1  Examples of an overlong ASCII character
    662     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0xAFu, '\"', ']', '\0'));
    663     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0xAFu, '\"', ']', '\0'));
    664     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0xAFu, '\"', ']', '\0'));
    665 
    666     // 4.2  Maximum overlong sequences
    667     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC1u, 0xBFu, '\"', ']', '\0'));
    668     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x9Fu, 0xBFu, '\"', ']', '\0'));
    669     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x8Fu, 0xBFu, 0xBFu, '\"', ']', '\0'));
    670 
    671     // 4.3  Overlong representation of the NUL character
    672     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0x80u, '\"', ']', '\0'));
    673     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0x80u, '\"', ']', '\0'));
    674     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0x80u, '\"', ']', '\0'));
    675 
    676     // 5  Illegal code positions
    677 
    678     // 5.1 Single UTF-16 surrogates
    679     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xA0u, 0x80u, '\"', ']', '\0'));
    680     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xADu, 0xBFu, '\"', ']', '\0'));
    681     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAEu, 0x80u, '\"', ']', '\0'));
    682     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAFu, 0xBFu, '\"', ']', '\0'));
    683     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xB0u, 0x80u, '\"', ']', '\0'));
    684     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBEu, 0x80u, '\"', ']', '\0'));
    685     TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBFu, 0xBFu, '\"', ']', '\0'));
    686 
    687     // Malform UTF-16 sequences
    688     TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xDC00, 0xDC00, '\"', ']', '\0'));
    689     TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xD800, 0xD800, '\"', ']', '\0'));
    690 
    691     // Malform UTF-32 sequence
    692     TEST_STRINGENCODING_ERROR(UTF32<>, UTF8<>, unsigned, ARRAY('[', '\"', 0x110000, '\"', ']', '\0'));
    693 
    694     // Malform ASCII sequence
    695     TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x80), '\"', ']', '\0'));
    696 
    697 #undef ARRAY
    698 #undef TEST_STRINGARRAY_ERROR
    699 }
    700 
    701 template <unsigned count>
    702 struct ParseArrayHandler : BaseReaderHandler<UTF8<>, ParseArrayHandler<count> > {
    703     ParseArrayHandler() : step_(0) {}
    704 
    705     bool Default() { ADD_FAILURE(); return false; }
    706     bool Uint(unsigned i) { EXPECT_EQ(step_, i); step_++; return true; }
    707     bool StartArray() { EXPECT_EQ(0u, step_); step_++; return true; }
    708     bool EndArray(SizeType) { step_++; return true; }
    709 
    710     unsigned step_;
    711 };
    712 
    713 TEST(Reader, ParseEmptyArray) {
    714     char *json = StrDup("[ ] ");
    715     InsituStringStream s(json);
    716     ParseArrayHandler<0> h;
    717     Reader reader;
    718     reader.Parse(s, h);
    719     EXPECT_EQ(2u, h.step_);
    720     free(json);
    721 }
    722 
    723 TEST(Reader, ParseArray) {
    724     char *json = StrDup("[1, 2, 3, 4]");
    725     InsituStringStream s(json);
    726     ParseArrayHandler<4> h;
    727     Reader reader;
    728     reader.Parse(s, h);
    729     EXPECT_EQ(6u, h.step_);
    730     free(json);
    731 }
    732 
    733 TEST(Reader, ParseArray_Error) {
    734 #define TEST_ARRAY_ERROR(errorCode, str) \
    735     { \
    736         char buffer[1001]; \
    737         strncpy(buffer, str, 1000); \
    738         InsituStringStream s(buffer); \
    739         BaseReaderHandler<> h; \
    740         GenericReader<UTF8<>, UTF8<>, CrtAllocator> reader; \
    741         EXPECT_FALSE(reader.Parse(s, h)); \
    742         EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
    743     }
    744 
    745     // Missing a comma or ']' after an array element.
    746     TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1");
    747     TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1}");
    748     TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1 2]");
    749 
    750 #undef TEST_ARRAY_ERROR
    751 }
    752 
    753 struct ParseObjectHandler : BaseReaderHandler<UTF8<>, ParseObjectHandler> {
    754     ParseObjectHandler() : step_(0) {}
    755 
    756     bool Default() { ADD_FAILURE(); return false; }
    757     bool Null() { EXPECT_EQ(8u, step_); step_++; return true; }
    758     bool Bool(bool b) {
    759         switch(step_) {
    760             case 4: EXPECT_TRUE(b); step_++; return true;
    761             case 6: EXPECT_FALSE(b); step_++; return true;
    762             default: ADD_FAILURE(); return false;
    763         }
    764     }
    765     bool Int(int i) {
    766         switch(step_) {
    767             case 10: EXPECT_EQ(123, i); step_++; return true;
    768             case 15: EXPECT_EQ(1, i); step_++; return true;
    769             case 16: EXPECT_EQ(2, i); step_++; return true;
    770             case 17: EXPECT_EQ(3, i); step_++; return true;
    771             default: ADD_FAILURE(); return false;
    772         }
    773     }
    774     bool Uint(unsigned i) { return Int(i); }
    775     bool Double(double d) { EXPECT_EQ(12u, step_); EXPECT_DOUBLE_EQ(3.1416, d); step_++; return true; }
    776     bool String(const char* str, size_t, bool) {
    777         switch(step_) {
    778             case 1: EXPECT_STREQ("hello", str); step_++; return true;
    779             case 2: EXPECT_STREQ("world", str); step_++; return true;
    780             case 3: EXPECT_STREQ("t", str); step_++; return true;
    781             case 5: EXPECT_STREQ("f", str); step_++; return true;
    782             case 7: EXPECT_STREQ("n", str); step_++; return true;
    783             case 9: EXPECT_STREQ("i", str); step_++; return true;
    784             case 11: EXPECT_STREQ("pi", str); step_++; return true;
    785             case 13: EXPECT_STREQ("a", str); step_++; return true;
    786             default: ADD_FAILURE(); return false;
    787         }
    788     }
    789     bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
    790     bool EndObject(SizeType memberCount) { EXPECT_EQ(19u, step_); EXPECT_EQ(7u, memberCount); step_++; return true; }
    791     bool StartArray() { EXPECT_EQ(14u, step_); step_++; return true; }
    792     bool EndArray(SizeType elementCount) { EXPECT_EQ(18u, step_); EXPECT_EQ(3u, elementCount); step_++; return true; }
    793 
    794     unsigned step_;
    795 };
    796 
    797 TEST(Reader, ParseObject) {
    798     const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } ";
    799 
    800     // Insitu
    801     {
    802         char* json2 = StrDup(json);
    803         InsituStringStream s(json2);
    804         ParseObjectHandler h;
    805         Reader reader;
    806         reader.Parse<kParseInsituFlag>(s, h);
    807         EXPECT_EQ(20u, h.step_);
    808         free(json2);
    809     }
    810 
    811     // Normal
    812     {
    813         StringStream s(json);
    814         ParseObjectHandler h;
    815         Reader reader;
    816         reader.Parse(s, h);
    817         EXPECT_EQ(20u, h.step_);
    818     }
    819 }
    820 
    821 struct ParseEmptyObjectHandler : BaseReaderHandler<UTF8<>, ParseEmptyObjectHandler> {
    822     ParseEmptyObjectHandler() : step_(0) {}
    823 
    824     bool Default() { ADD_FAILURE(); return false; }
    825     bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
    826     bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; }
    827 
    828     unsigned step_;
    829 };
    830 
    831 TEST(Reader, Parse_EmptyObject) {
    832     StringStream s("{ } ");
    833     ParseEmptyObjectHandler h;
    834     Reader reader;
    835     reader.Parse(s, h);
    836     EXPECT_EQ(2u, h.step_);
    837 }
    838 
    839 struct ParseMultipleRootHandler : BaseReaderHandler<UTF8<>, ParseMultipleRootHandler> {
    840     ParseMultipleRootHandler() : step_(0) {}
    841 
    842     bool Default() { ADD_FAILURE(); return false; }
    843     bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
    844     bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; }
    845     bool StartArray() { EXPECT_EQ(2u, step_); step_++; return true; }
    846     bool EndArray(SizeType) { EXPECT_EQ(3u, step_); step_++; return true; }
    847 
    848     unsigned step_;
    849 };
    850 
    851 template <unsigned parseFlags>
    852 void TestMultipleRoot() {
    853     StringStream s("{}[] a");
    854     ParseMultipleRootHandler h;
    855     Reader reader;
    856     EXPECT_TRUE(reader.Parse<parseFlags>(s, h));
    857     EXPECT_EQ(2u, h.step_);
    858     EXPECT_TRUE(reader.Parse<parseFlags>(s, h));
    859     EXPECT_EQ(4u, h.step_);
    860     EXPECT_EQ(' ', s.Take());
    861     EXPECT_EQ('a', s.Take());
    862 }
    863 
    864 TEST(Reader, Parse_MultipleRoot) {
    865     TestMultipleRoot<kParseStopWhenDoneFlag>();
    866 }
    867 
    868 TEST(Reader, ParseIterative_MultipleRoot) {
    869     TestMultipleRoot<kParseIterativeFlag | kParseStopWhenDoneFlag>();
    870 }
    871 
    872 template <unsigned parseFlags>
    873 void TestInsituMultipleRoot() {
    874     char* buffer = strdup("{}[] a");
    875     InsituStringStream s(buffer);
    876     ParseMultipleRootHandler h;
    877     Reader reader;
    878     EXPECT_TRUE(reader.Parse<kParseInsituFlag | parseFlags>(s, h));
    879     EXPECT_EQ(2u, h.step_);
    880     EXPECT_TRUE(reader.Parse<kParseInsituFlag | parseFlags>(s, h));
    881     EXPECT_EQ(4u, h.step_);
    882     EXPECT_EQ(' ', s.Take());
    883     EXPECT_EQ('a', s.Take());
    884     free(buffer);
    885 }
    886 
    887 TEST(Reader, ParseInsitu_MultipleRoot) {
    888     TestInsituMultipleRoot<kParseStopWhenDoneFlag>();
    889 }
    890 
    891 TEST(Reader, ParseInsituIterative_MultipleRoot) {
    892     TestInsituMultipleRoot<kParseIterativeFlag | kParseStopWhenDoneFlag>();
    893 }
    894 
    895 #define TEST_ERROR(errorCode, str) \
    896     { \
    897         char buffer[1001]; \
    898         strncpy(buffer, str, 1000); \
    899         InsituStringStream s(buffer); \
    900         BaseReaderHandler<> h; \
    901         Reader reader; \
    902         EXPECT_FALSE(reader.Parse(s, h)); \
    903         EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
    904     }
    905 
    906 TEST(Reader, ParseDocument_Error) {
    907     // The document is empty.
    908     TEST_ERROR(kParseErrorDocumentEmpty, "");
    909     TEST_ERROR(kParseErrorDocumentEmpty, " ");
    910     TEST_ERROR(kParseErrorDocumentEmpty, " \n");
    911 
    912     // The document root must not follow by other values.
    913     TEST_ERROR(kParseErrorDocumentRootNotSingular, "[] 0");
    914     TEST_ERROR(kParseErrorDocumentRootNotSingular, "{} 0");
    915     TEST_ERROR(kParseErrorDocumentRootNotSingular, "null []");
    916     TEST_ERROR(kParseErrorDocumentRootNotSingular, "0 {}");
    917 }
    918 
    919 TEST(Reader, ParseValue_Error) {
    920     // Invalid value.
    921     TEST_ERROR(kParseErrorValueInvalid, "nulL");
    922     TEST_ERROR(kParseErrorValueInvalid, "truE");
    923     TEST_ERROR(kParseErrorValueInvalid, "falsE");
    924     TEST_ERROR(kParseErrorValueInvalid, "a]");
    925     TEST_ERROR(kParseErrorValueInvalid, ".1");
    926 }
    927 
    928 TEST(Reader, ParseObject_Error) {
    929     // Missing a name for object member.
    930     TEST_ERROR(kParseErrorObjectMissName, "{1}");
    931     TEST_ERROR(kParseErrorObjectMissName, "{:1}");
    932     TEST_ERROR(kParseErrorObjectMissName, "{null:1}");
    933     TEST_ERROR(kParseErrorObjectMissName, "{true:1}");
    934     TEST_ERROR(kParseErrorObjectMissName, "{false:1}");
    935     TEST_ERROR(kParseErrorObjectMissName, "{1:1}");
    936     TEST_ERROR(kParseErrorObjectMissName, "{[]:1}");
    937     TEST_ERROR(kParseErrorObjectMissName, "{{}:1}");
    938     TEST_ERROR(kParseErrorObjectMissName, "{xyz:1}");
    939 
    940     // Missing a colon after a name of object member.
    941     TEST_ERROR(kParseErrorObjectMissColon, "{\"a\" 1}");
    942     TEST_ERROR(kParseErrorObjectMissColon, "{\"a\",1}");
    943 
    944     // Must be a comma or '}' after an object member
    945     TEST_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, "{\"a\":1]");
    946 
    947     // This tests that MemoryStream is checking the length in Peek().
    948     {
    949         MemoryStream ms("{\"a\"", 1);
    950         BaseReaderHandler<> h;
    951         Reader reader;
    952         EXPECT_FALSE(reader.Parse<kParseStopWhenDoneFlag>(ms, h));
    953         EXPECT_EQ(kParseErrorObjectMissName, reader.GetParseErrorCode());
    954     }
    955 }
    956 
    957 #undef TEST_ERROR
    958 
    959 TEST(Reader, SkipWhitespace) {
    960     StringStream ss(" A \t\tB\n \n\nC\r\r \rD \t\n\r E");
    961     const char* expected = "ABCDE";
    962     for (size_t i = 0; i < 5; i++) {
    963         SkipWhitespace(ss);
    964         EXPECT_EQ(expected[i], ss.Take());
    965     }
    966 }
    967 
    968 // Test implementing a stream without copy stream optimization.
    969 // Clone from GenericStringStream except that copy constructor is disabled.
    970 template <typename Encoding>
    971 class CustomStringStream {
    972 public:
    973     typedef typename Encoding::Ch Ch;
    974 
    975     CustomStringStream(const Ch *src) : src_(src), head_(src) {}
    976 
    977     Ch Peek() const { return *src_; }
    978     Ch Take() { return *src_++; }
    979     size_t Tell() const { return static_cast<size_t>(src_ - head_); }
    980 
    981     Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; }
    982     void Put(Ch) { RAPIDJSON_ASSERT(false); }
    983     void Flush() { RAPIDJSON_ASSERT(false); }
    984     size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; }
    985 
    986 private:
    987     // Prohibit copy constructor & assignment operator.
    988     CustomStringStream(const CustomStringStream&);
    989     CustomStringStream& operator=(const CustomStringStream&);
    990 
    991     const Ch* src_;     //!< Current read position.
    992     const Ch* head_;    //!< Original head of the string.
    993 };
    994 
    995 // If the following code is compiled, it should generate compilation error as predicted.
    996 // Because CustomStringStream<> is not copyable via making copy constructor private.
    997 #if 0
    998 namespace rapidjson {
    999 
   1000 template <typename Encoding>
   1001 struct StreamTraits<CustomStringStream<Encoding> > {
   1002     enum { copyOptimization = 1 };
   1003 };
   1004 
   1005 } // namespace rapidjson
   1006 #endif
   1007 
   1008 TEST(Reader, CustomStringStream) {
   1009     const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } ";
   1010     CustomStringStream<UTF8<char> > s(json);
   1011     ParseObjectHandler h;
   1012     Reader reader;
   1013     reader.Parse(s, h);
   1014     EXPECT_EQ(20u, h.step_);
   1015 }
   1016 
   1017 #include <sstream>
   1018 
   1019 class IStreamWrapper {
   1020 public:
   1021     typedef char Ch;
   1022 
   1023     IStreamWrapper(std::istream& is) : is_(is) {}
   1024 
   1025     Ch Peek() const {
   1026         int c = is_.peek();
   1027         return c == std::char_traits<char>::eof() ? '\0' : (Ch)c;
   1028     }
   1029 
   1030     Ch Take() {
   1031         int c = is_.get();
   1032         return c == std::char_traits<char>::eof() ? '\0' : (Ch)c;
   1033     }
   1034 
   1035     size_t Tell() const { return (size_t)is_.tellg(); }
   1036 
   1037     Ch* PutBegin() { assert(false); return 0; }
   1038     void Put(Ch) { assert(false); }
   1039     void Flush() { assert(false); }
   1040     size_t PutEnd(Ch*) { assert(false); return 0; }
   1041 
   1042 private:
   1043     IStreamWrapper(const IStreamWrapper&);
   1044     IStreamWrapper& operator=(const IStreamWrapper&);
   1045 
   1046     std::istream& is_;
   1047 };
   1048 
   1049 TEST(Reader, Parse_IStreamWrapper_StringStream) {
   1050     const char* json = "[1,2,3,4]";
   1051 
   1052     std::stringstream ss(json);
   1053     IStreamWrapper is(ss);
   1054 
   1055     Reader reader;
   1056     ParseArrayHandler<4> h;
   1057     reader.Parse(is, h);
   1058     EXPECT_FALSE(reader.HasParseError());
   1059 }
   1060 
   1061 // Test iterative parsing.
   1062 
   1063 #define TESTERRORHANDLING(text, errorCode, offset)\
   1064 {\
   1065     StringStream json(text); \
   1066     BaseReaderHandler<> handler; \
   1067     Reader reader; \
   1068     reader.Parse<kParseIterativeFlag>(json, handler); \
   1069     EXPECT_TRUE(reader.HasParseError()); \
   1070     EXPECT_EQ(errorCode, reader.GetParseErrorCode()); \
   1071     EXPECT_EQ(offset, reader.GetErrorOffset()); \
   1072 }
   1073 
   1074 TEST(Reader, IterativeParsing_ErrorHandling) {
   1075     TESTERRORHANDLING("{\"a\": a}", kParseErrorValueInvalid, 6u);
   1076 
   1077     TESTERRORHANDLING("", kParseErrorDocumentEmpty, 0u);
   1078     TESTERRORHANDLING("{}{}", kParseErrorDocumentRootNotSingular, 2u);
   1079 
   1080     TESTERRORHANDLING("{1}", kParseErrorObjectMissName, 1u);
   1081     TESTERRORHANDLING("{\"a\", 1}", kParseErrorObjectMissColon, 4u);
   1082     TESTERRORHANDLING("{\"a\"}", kParseErrorObjectMissColon, 4u);
   1083     TESTERRORHANDLING("{\"a\": 1", kParseErrorObjectMissCommaOrCurlyBracket, 7u);
   1084     TESTERRORHANDLING("[1 2 3]", kParseErrorArrayMissCommaOrSquareBracket, 3u);
   1085     TESTERRORHANDLING("{\"a: 1", kParseErrorStringMissQuotationMark, 5u);
   1086 
   1087     // Any JSON value can be a valid root element in RFC7159.
   1088     TESTERRORHANDLING("\"ab", kParseErrorStringMissQuotationMark, 2u);
   1089     TESTERRORHANDLING("truE", kParseErrorValueInvalid, 3u);
   1090     TESTERRORHANDLING("False", kParseErrorValueInvalid, 0u);
   1091     TESTERRORHANDLING("true, false", kParseErrorDocumentRootNotSingular, 4u);
   1092     TESTERRORHANDLING("false, false", kParseErrorDocumentRootNotSingular, 5u);
   1093     TESTERRORHANDLING("nulL", kParseErrorValueInvalid, 3u);
   1094     TESTERRORHANDLING("null , null", kParseErrorDocumentRootNotSingular, 5u);
   1095     TESTERRORHANDLING("1a", kParseErrorDocumentRootNotSingular, 1u);
   1096 }
   1097 
   1098 template<typename Encoding = UTF8<> >
   1099 struct IterativeParsingReaderHandler {
   1100     typedef typename Encoding::Ch Ch;
   1101 
   1102     const static int LOG_NULL = -1;
   1103     const static int LOG_BOOL = -2;
   1104     const static int LOG_INT = -3;
   1105     const static int LOG_UINT = -4;
   1106     const static int LOG_INT64 = -5;
   1107     const static int LOG_UINT64 = -6;
   1108     const static int LOG_DOUBLE = -7;
   1109     const static int LOG_STRING = -8;
   1110     const static int LOG_STARTOBJECT = -9;
   1111     const static int LOG_KEY = -10;
   1112     const static int LOG_ENDOBJECT = -11;
   1113     const static int LOG_STARTARRAY = -12;
   1114     const static int LOG_ENDARRAY = -13;
   1115 
   1116     const static size_t LogCapacity = 256;
   1117     int Logs[LogCapacity];
   1118     size_t LogCount;
   1119 
   1120     IterativeParsingReaderHandler() : LogCount(0) {
   1121     }
   1122 
   1123     bool Null() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_NULL; return true; }
   1124 
   1125     bool Bool(bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_BOOL; return true; }
   1126 
   1127     bool Int(int) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; }
   1128 
   1129     bool Uint(unsigned) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; }
   1130 
   1131     bool Int64(int64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT64; return true; }
   1132 
   1133     bool Uint64(uint64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_UINT64; return true; }
   1134 
   1135     bool Double(double) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_DOUBLE; return true; }
   1136 
   1137     bool String(const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STRING; return true; }
   1138 
   1139     bool StartObject() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTOBJECT; return true; }
   1140 
   1141     bool Key (const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_KEY; return true; }
   1142 
   1143     bool EndObject(SizeType c) {
   1144         RAPIDJSON_ASSERT(LogCount < LogCapacity);
   1145         Logs[LogCount++] = LOG_ENDOBJECT;
   1146         Logs[LogCount++] = (int)c;
   1147         return true;
   1148     }
   1149 
   1150     bool StartArray() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTARRAY; return true; }
   1151 
   1152     bool EndArray(SizeType c) {
   1153         RAPIDJSON_ASSERT(LogCount < LogCapacity);
   1154         Logs[LogCount++] = LOG_ENDARRAY;
   1155         Logs[LogCount++] = (int)c;
   1156         return true;
   1157     }
   1158 };
   1159 
   1160 TEST(Reader, IterativeParsing_General) {
   1161     {
   1162         StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]");
   1163         Reader reader;
   1164         IterativeParsingReaderHandler<> handler;
   1165 
   1166         ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
   1167 
   1168         EXPECT_FALSE(r.IsError());
   1169         EXPECT_FALSE(reader.HasParseError());
   1170 
   1171         int e[] = {
   1172             handler.LOG_STARTARRAY,
   1173             handler.LOG_INT,
   1174             handler.LOG_STARTOBJECT,
   1175             handler.LOG_KEY,
   1176             handler.LOG_STARTARRAY,
   1177             handler.LOG_INT,
   1178             handler.LOG_INT,
   1179             handler.LOG_ENDARRAY, 2,
   1180             handler.LOG_ENDOBJECT, 1,
   1181             handler.LOG_NULL,
   1182             handler.LOG_BOOL,
   1183             handler.LOG_BOOL,
   1184             handler.LOG_STRING,
   1185             handler.LOG_DOUBLE,
   1186             handler.LOG_ENDARRAY, 7
   1187         };
   1188 
   1189         EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount);
   1190 
   1191         for (size_t i = 0; i < handler.LogCount; ++i) {
   1192             EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i;
   1193         }
   1194     }
   1195 }
   1196 
   1197 TEST(Reader, IterativeParsing_Count) {
   1198     {
   1199         StringStream is("[{}, {\"k\": 1}, [1], []]");
   1200         Reader reader;
   1201         IterativeParsingReaderHandler<> handler;
   1202 
   1203         ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
   1204 
   1205         EXPECT_FALSE(r.IsError());
   1206         EXPECT_FALSE(reader.HasParseError());
   1207 
   1208         int e[] = {
   1209             handler.LOG_STARTARRAY,
   1210             handler.LOG_STARTOBJECT,
   1211             handler.LOG_ENDOBJECT, 0,
   1212             handler.LOG_STARTOBJECT,
   1213             handler.LOG_KEY,
   1214             handler.LOG_INT,
   1215             handler.LOG_ENDOBJECT, 1,
   1216             handler.LOG_STARTARRAY,
   1217             handler.LOG_INT,
   1218             handler.LOG_ENDARRAY, 1,
   1219             handler.LOG_STARTARRAY,
   1220             handler.LOG_ENDARRAY, 0,
   1221             handler.LOG_ENDARRAY, 4
   1222         };
   1223 
   1224         EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount);
   1225 
   1226         for (size_t i = 0; i < handler.LogCount; ++i) {
   1227             EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i;
   1228         }
   1229     }
   1230 }
   1231 
   1232 // Test iterative parsing on kParseErrorTermination.
   1233 struct HandlerTerminateAtStartObject : public IterativeParsingReaderHandler<> {
   1234     bool StartObject() { return false; }
   1235 };
   1236 
   1237 struct HandlerTerminateAtStartArray : public IterativeParsingReaderHandler<> {
   1238     bool StartArray() { return false; }
   1239 };
   1240 
   1241 struct HandlerTerminateAtEndObject : public IterativeParsingReaderHandler<> {
   1242     bool EndObject(SizeType) { return false; }
   1243 };
   1244 
   1245 struct HandlerTerminateAtEndArray : public IterativeParsingReaderHandler<> {
   1246     bool EndArray(SizeType) { return false; }
   1247 };
   1248 
   1249 TEST(Reader, IterativeParsing_ShortCircuit) {
   1250     {
   1251         HandlerTerminateAtStartObject handler;
   1252         Reader reader;
   1253         StringStream is("[1, {}]");
   1254 
   1255         ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
   1256 
   1257         EXPECT_TRUE(reader.HasParseError());
   1258         EXPECT_EQ(kParseErrorTermination, r.Code());
   1259         EXPECT_EQ(4u, r.Offset());
   1260     }
   1261 
   1262     {
   1263         HandlerTerminateAtStartArray handler;
   1264         Reader reader;
   1265         StringStream is("{\"a\": []}");
   1266 
   1267         ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
   1268 
   1269         EXPECT_TRUE(reader.HasParseError());
   1270         EXPECT_EQ(kParseErrorTermination, r.Code());
   1271         EXPECT_EQ(6u, r.Offset());
   1272     }
   1273 
   1274     {
   1275         HandlerTerminateAtEndObject handler;
   1276         Reader reader;
   1277         StringStream is("[1, {}]");
   1278 
   1279         ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
   1280 
   1281         EXPECT_TRUE(reader.HasParseError());
   1282         EXPECT_EQ(kParseErrorTermination, r.Code());
   1283         EXPECT_EQ(5u, r.Offset());
   1284     }
   1285 
   1286     {
   1287         HandlerTerminateAtEndArray handler;
   1288         Reader reader;
   1289         StringStream is("{\"a\": []}");
   1290 
   1291         ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
   1292 
   1293         EXPECT_TRUE(reader.HasParseError());
   1294         EXPECT_EQ(kParseErrorTermination, r.Code());
   1295         EXPECT_EQ(7u, r.Offset());
   1296     }
   1297 }
   1298 
   1299 // For covering BaseReaderHandler default functions
   1300 TEST(Reader, BaseReaderHandler_Default) {
   1301     BaseReaderHandler<> h;
   1302     Reader reader;
   1303     StringStream is("[null, true, -1, 1, -1234567890123456789, 1234567890123456789, 3.14, \"s\", { \"a\" : 1 }]");
   1304     EXPECT_TRUE(reader.Parse(is, h));
   1305 }
   1306 
   1307 template <int e>
   1308 struct TerminateHandler {
   1309     bool Null() { return e != 0; }
   1310     bool Bool(bool) { return e != 1; }
   1311     bool Int(int) { return e != 2; }
   1312     bool Uint(unsigned) { return e != 3; }
   1313     bool Int64(int64_t) { return e != 4; }
   1314     bool Uint64(uint64_t) { return e != 5;  }
   1315     bool Double(double) { return e != 6; }
   1316     bool String(const char*, SizeType, bool) { return e != 7; }
   1317     bool StartObject() { return e != 8; }
   1318     bool Key(const char*, SizeType, bool)  { return e != 9; }
   1319     bool EndObject(SizeType) { return e != 10; }
   1320     bool StartArray() { return e != 11; }
   1321     bool EndArray(SizeType) { return e != 12; }
   1322 };
   1323 
   1324 #define TEST_TERMINATION(e, json)\
   1325 {\
   1326     Reader reader;\
   1327     TerminateHandler<e> h;\
   1328     StringStream is(json);\
   1329     EXPECT_FALSE(reader.Parse(is, h));\
   1330     EXPECT_EQ(kParseErrorTermination, reader.GetParseErrorCode());\
   1331 }
   1332 
   1333 TEST(Reader, ParseTerminationByHandler) {
   1334     TEST_TERMINATION(0, "[null");
   1335     TEST_TERMINATION(1, "[true");
   1336     TEST_TERMINATION(1, "[false");
   1337     TEST_TERMINATION(2, "[-1");
   1338     TEST_TERMINATION(3, "[1");
   1339     TEST_TERMINATION(4, "[-1234567890123456789");
   1340     TEST_TERMINATION(5, "[1234567890123456789");
   1341     TEST_TERMINATION(6, "[0.5]");
   1342     TEST_TERMINATION(7, "[\"a\"");
   1343     TEST_TERMINATION(8, "[{");
   1344     TEST_TERMINATION(9, "[{\"a\"");
   1345     TEST_TERMINATION(10, "[{}");
   1346     TEST_TERMINATION(10, "[{\"a\":1}"); // non-empty object
   1347     TEST_TERMINATION(11, "{\"a\":[");
   1348     TEST_TERMINATION(12, "{\"a\":[]");
   1349     TEST_TERMINATION(12, "{\"a\":[1]"); // non-empty array
   1350 }
   1351 
   1352 #ifdef __GNUC__
   1353 RAPIDJSON_DIAG_POP
   1354 #endif
   1355