readertest.cpp 58 KB

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