readertest.cpp 91 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225
  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. #include <limits>
  20. using namespace rapidjson;
  21. RAPIDJSON_DIAG_PUSH
  22. #ifdef __GNUC__
  23. RAPIDJSON_DIAG_OFF(effc++)
  24. RAPIDJSON_DIAG_OFF(float-equal)
  25. RAPIDJSON_DIAG_OFF(missing-noreturn)
  26. #if __GNUC__ >= 7
  27. RAPIDJSON_DIAG_OFF(dangling-else)
  28. #endif
  29. #endif // __GNUC__
  30. #ifdef __clang__
  31. RAPIDJSON_DIAG_OFF(variadic-macros)
  32. RAPIDJSON_DIAG_OFF(c++98-compat-pedantic)
  33. #endif
  34. template<bool expect>
  35. struct ParseBoolHandler : BaseReaderHandler<UTF8<>, ParseBoolHandler<expect> > {
  36. ParseBoolHandler() : step_(0) {}
  37. bool Default() { ADD_FAILURE(); return false; }
  38. // gcc 4.8.x generates warning in EXPECT_EQ(bool, bool) on this gtest version.
  39. // Workaround with EXPECT_TRUE().
  40. bool Bool(bool b) { /*EXPECT_EQ(expect, b); */EXPECT_TRUE(expect == b); ++step_; return true; }
  41. unsigned step_;
  42. };
  43. TEST(Reader, ParseTrue) {
  44. StringStream s("true");
  45. ParseBoolHandler<true> h;
  46. Reader reader;
  47. reader.Parse(s, h);
  48. EXPECT_EQ(1u, h.step_);
  49. }
  50. TEST(Reader, ParseFalse) {
  51. StringStream s("false");
  52. ParseBoolHandler<false> h;
  53. Reader reader;
  54. reader.Parse(s, h);
  55. EXPECT_EQ(1u, h.step_);
  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. unsigned step_;
  62. int actual_;
  63. };
  64. struct ParseUintHandler : BaseReaderHandler<UTF8<>, ParseUintHandler> {
  65. ParseUintHandler() : step_(0), actual_() {}
  66. bool Default() { ADD_FAILURE(); return false; }
  67. bool Uint(unsigned i) { actual_ = i; step_++; return true; }
  68. unsigned step_;
  69. unsigned actual_;
  70. };
  71. struct ParseInt64Handler : BaseReaderHandler<UTF8<>, ParseInt64Handler> {
  72. ParseInt64Handler() : step_(0), actual_() {}
  73. bool Default() { ADD_FAILURE(); return false; }
  74. bool Int64(int64_t i) { actual_ = i; step_++; return true; }
  75. unsigned step_;
  76. int64_t actual_;
  77. };
  78. struct ParseUint64Handler : BaseReaderHandler<UTF8<>, ParseUint64Handler> {
  79. ParseUint64Handler() : step_(0), actual_() {}
  80. bool Default() { ADD_FAILURE(); return false; }
  81. bool Uint64(uint64_t i) { actual_ = i; step_++; return true; }
  82. unsigned step_;
  83. uint64_t actual_;
  84. };
  85. struct ParseDoubleHandler : BaseReaderHandler<UTF8<>, ParseDoubleHandler> {
  86. ParseDoubleHandler() : step_(0), actual_() {}
  87. bool Default() { ADD_FAILURE(); return false; }
  88. bool Double(double d) { actual_ = d; step_++; return true; }
  89. unsigned step_;
  90. double actual_;
  91. };
  92. TEST(Reader, ParseNumber_Integer) {
  93. #define TEST_INTEGER(Handler, str, x) \
  94. { \
  95. StringStream s(str); \
  96. Handler h; \
  97. Reader reader; \
  98. reader.Parse(s, h); \
  99. EXPECT_EQ(1u, h.step_); \
  100. EXPECT_EQ(x, h.actual_); \
  101. }
  102. TEST_INTEGER(ParseUintHandler, "0", 0u);
  103. TEST_INTEGER(ParseUintHandler, "123", 123u);
  104. TEST_INTEGER(ParseUintHandler, "2147483648", 2147483648u); // 2^31 - 1 (cannot be stored in int)
  105. TEST_INTEGER(ParseUintHandler, "4294967295", 4294967295u);
  106. TEST_INTEGER(ParseIntHandler, "-123", -123);
  107. TEST_INTEGER(ParseIntHandler, "-2147483648", static_cast<int32_t>(0x80000000)); // -2^31 (min of int)
  108. TEST_INTEGER(ParseUint64Handler, "4294967296", RAPIDJSON_UINT64_C2(1, 0)); // 2^32 (max of unsigned + 1, force to use uint64_t)
  109. TEST_INTEGER(ParseUint64Handler, "18446744073709551615", RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF)); // 2^64 - 1 (max of uint64_t)
  110. 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)
  111. TEST_INTEGER(ParseInt64Handler, "-9223372036854775808", static_cast<int64_t>(RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))); // -2^63 (min of int64_t)
  112. // Random test for uint32_t/int32_t
  113. {
  114. union {
  115. uint32_t u;
  116. int32_t i;
  117. }u;
  118. Random r;
  119. for (unsigned i = 0; i < 100000; i++) {
  120. u.u = r();
  121. char buffer[32];
  122. *internal::u32toa(u.u, buffer) = '\0';
  123. TEST_INTEGER(ParseUintHandler, buffer, u.u);
  124. if (u.i < 0) {
  125. *internal::i32toa(u.i, buffer) = '\0';
  126. TEST_INTEGER(ParseIntHandler, buffer, u.i);
  127. }
  128. }
  129. }
  130. // Random test for uint64_t/int64_t
  131. {
  132. union {
  133. uint64_t u;
  134. int64_t i;
  135. }u;
  136. Random r;
  137. for (unsigned i = 0; i < 100000; i++) {
  138. u.u = uint64_t(r()) << 32;
  139. u.u |= r();
  140. char buffer[32];
  141. if (u.u > uint64_t(4294967295u)) {
  142. *internal::u64toa(u.u, buffer) = '\0';
  143. TEST_INTEGER(ParseUint64Handler, buffer, u.u);
  144. }
  145. if (u.i < -int64_t(2147483648u)) {
  146. *internal::i64toa(u.i, buffer) = '\0';
  147. TEST_INTEGER(ParseInt64Handler, buffer, u.i);
  148. }
  149. }
  150. }
  151. #undef TEST_INTEGER
  152. }
  153. template<bool fullPrecision>
  154. static void TestParseDouble() {
  155. #define TEST_DOUBLE(fullPrecision, str, x) \
  156. { \
  157. StringStream s(str); \
  158. ParseDoubleHandler h; \
  159. Reader reader; \
  160. ASSERT_EQ(kParseErrorNone, reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h).Code()); \
  161. EXPECT_EQ(1u, h.step_); \
  162. internal::Double e(x), a(h.actual_); \
  163. if (fullPrecision) { \
  164. EXPECT_EQ(e.Uint64Value(), a.Uint64Value()); \
  165. if (e.Uint64Value() != a.Uint64Value()) \
  166. printf(" String: %s\n Actual: %.17g\nExpected: %.17g\n", str, h.actual_, x); \
  167. } \
  168. else { \
  169. EXPECT_EQ(e.Sign(), a.Sign()); /* for 0.0 != -0.0 */ \
  170. EXPECT_DOUBLE_EQ(x, h.actual_); \
  171. } \
  172. }
  173. TEST_DOUBLE(fullPrecision, "0.0", 0.0);
  174. TEST_DOUBLE(fullPrecision, "-0.0", -0.0); // For checking issue #289
  175. TEST_DOUBLE(fullPrecision, "0e100", 0.0); // For checking issue #1249
  176. TEST_DOUBLE(fullPrecision, "1.0", 1.0);
  177. TEST_DOUBLE(fullPrecision, "-1.0", -1.0);
  178. TEST_DOUBLE(fullPrecision, "1.5", 1.5);
  179. TEST_DOUBLE(fullPrecision, "-1.5", -1.5);
  180. TEST_DOUBLE(fullPrecision, "3.1416", 3.1416);
  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, "-1E10", -1E10);
  186. TEST_DOUBLE(fullPrecision, "-1e10", -1e10);
  187. TEST_DOUBLE(fullPrecision, "-1E+10", -1E+10);
  188. TEST_DOUBLE(fullPrecision, "-1E-10", -1E-10);
  189. TEST_DOUBLE(fullPrecision, "1.234E+10", 1.234E+10);
  190. TEST_DOUBLE(fullPrecision, "1.234E-10", 1.234E-10);
  191. TEST_DOUBLE(fullPrecision, "1.79769e+308", 1.79769e+308);
  192. TEST_DOUBLE(fullPrecision, "2.22507e-308", 2.22507e-308);
  193. TEST_DOUBLE(fullPrecision, "-1.79769e+308", -1.79769e+308);
  194. TEST_DOUBLE(fullPrecision, "-2.22507e-308", -2.22507e-308);
  195. TEST_DOUBLE(fullPrecision, "4.9406564584124654e-324", 4.9406564584124654e-324); // minimum denormal
  196. TEST_DOUBLE(fullPrecision, "2.2250738585072009e-308", 2.2250738585072009e-308); // Max subnormal double
  197. TEST_DOUBLE(fullPrecision, "2.2250738585072014e-308", 2.2250738585072014e-308); // Min normal positive double
  198. TEST_DOUBLE(fullPrecision, "1.7976931348623157e+308", 1.7976931348623157e+308); // Max double
  199. TEST_DOUBLE(fullPrecision, "1e-10000", 0.0); // must underflow
  200. TEST_DOUBLE(fullPrecision, "18446744073709551616", 18446744073709551616.0); // 2^64 (max of uint64_t + 1, force to use double)
  201. TEST_DOUBLE(fullPrecision, "-9223372036854775809", -9223372036854775809.0); // -2^63 - 1(min of int64_t + 1, force to use double)
  202. TEST_DOUBLE(fullPrecision, "0.9868011474609375", 0.9868011474609375); // https://github.com/Tencent/rapidjson/issues/120
  203. TEST_DOUBLE(fullPrecision, "123e34", 123e34); // Fast Path Cases In Disguise
  204. TEST_DOUBLE(fullPrecision, "45913141877270640000.0", 45913141877270640000.0);
  205. TEST_DOUBLE(fullPrecision, "2.2250738585072011e-308", 2.2250738585072011e-308); // http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
  206. TEST_DOUBLE(fullPrecision, "1e-00011111111111", 0.0); // Issue #313
  207. TEST_DOUBLE(fullPrecision, "-1e-00011111111111", -0.0);
  208. TEST_DOUBLE(fullPrecision, "1e-214748363", 0.0); // Maximum supported negative exponent
  209. TEST_DOUBLE(fullPrecision, "1e-214748364", 0.0);
  210. TEST_DOUBLE(fullPrecision, "1e-21474836311", 0.0);
  211. TEST_DOUBLE(fullPrecision, "1.00000000001e-2147483638", 0.0);
  212. TEST_DOUBLE(fullPrecision, "0.017976931348623157e+310", 1.7976931348623157e+308); // Max double in another form
  213. TEST_DOUBLE(fullPrecision, "128.74836467836484838364836483643636483648e-336", 0.0); // Issue #1251
  214. // Since
  215. // abs((2^-1022 - 2^-1074) - 2.2250738585072012e-308) = 3.109754131239141401123495768877590405345064751974375599... x 10^-324
  216. // abs((2^-1022) - 2.2250738585072012e-308) = 1.830902327173324040642192159804623318305533274168872044... x 10 ^ -324
  217. // So 2.2250738585072012e-308 should round to 2^-1022 = 2.2250738585072014e-308
  218. TEST_DOUBLE(fullPrecision, "2.2250738585072012e-308", 2.2250738585072014e-308); // http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
  219. // More closer to normal/subnormal boundary
  220. // boundary = 2^-1022 - 2^-1075 = 2.225073858507201136057409796709131975934819546351645648... x 10^-308
  221. TEST_DOUBLE(fullPrecision, "2.22507385850720113605740979670913197593481954635164564e-308", 2.2250738585072009e-308);
  222. TEST_DOUBLE(fullPrecision, "2.22507385850720113605740979670913197593481954635164565e-308", 2.2250738585072014e-308);
  223. // 1.0 is in (1.0 - 2^-54, 1.0 + 2^-53)
  224. // 1.0 - 2^-54 = 0.999999999999999944488848768742172978818416595458984375
  225. TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984375", 1.0); // round to even
  226. TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984374", 0.99999999999999989); // previous double
  227. TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984376", 1.0); // next double
  228. // 1.0 + 2^-53 = 1.00000000000000011102230246251565404236316680908203125
  229. TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203125", 1.0); // round to even
  230. TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203124", 1.0); // previous double
  231. TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203126", 1.00000000000000022); // next double
  232. // Numbers from https://github.com/floitsch/double-conversion/blob/master/test/cctest/test-strtod.cc
  233. TEST_DOUBLE(fullPrecision, "72057594037927928.0", 72057594037927928.0);
  234. TEST_DOUBLE(fullPrecision, "72057594037927936.0", 72057594037927936.0);
  235. TEST_DOUBLE(fullPrecision, "72057594037927932.0", 72057594037927936.0);
  236. TEST_DOUBLE(fullPrecision, "7205759403792793199999e-5", 72057594037927928.0);
  237. TEST_DOUBLE(fullPrecision, "7205759403792793200001e-5", 72057594037927936.0);
  238. TEST_DOUBLE(fullPrecision, "9223372036854774784.0", 9223372036854774784.0);
  239. TEST_DOUBLE(fullPrecision, "9223372036854775808.0", 9223372036854775808.0);
  240. TEST_DOUBLE(fullPrecision, "9223372036854775296.0", 9223372036854775808.0);
  241. TEST_DOUBLE(fullPrecision, "922337203685477529599999e-5", 9223372036854774784.0);
  242. TEST_DOUBLE(fullPrecision, "922337203685477529600001e-5", 9223372036854775808.0);
  243. TEST_DOUBLE(fullPrecision, "10141204801825834086073718800384", 10141204801825834086073718800384.0);
  244. TEST_DOUBLE(fullPrecision, "10141204801825835211973625643008", 10141204801825835211973625643008.0);
  245. TEST_DOUBLE(fullPrecision, "10141204801825834649023672221696", 10141204801825835211973625643008.0);
  246. TEST_DOUBLE(fullPrecision, "1014120480182583464902367222169599999e-5", 10141204801825834086073718800384.0);
  247. TEST_DOUBLE(fullPrecision, "1014120480182583464902367222169600001e-5", 10141204801825835211973625643008.0);
  248. TEST_DOUBLE(fullPrecision, "5708990770823838890407843763683279797179383808", 5708990770823838890407843763683279797179383808.0);
  249. TEST_DOUBLE(fullPrecision, "5708990770823839524233143877797980545530986496", 5708990770823839524233143877797980545530986496.0);
  250. TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185152", 5708990770823839524233143877797980545530986496.0);
  251. TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185151999e-3", 5708990770823838890407843763683279797179383808.0);
  252. TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185152001e-3", 5708990770823839524233143877797980545530986496.0);
  253. {
  254. char n1e308[310]; // '1' followed by 308 '0'
  255. n1e308[0] = '1';
  256. for (int i = 1; i < 309; i++)
  257. n1e308[i] = '0';
  258. n1e308[309] = '\0';
  259. TEST_DOUBLE(fullPrecision, n1e308, 1E308);
  260. }
  261. // Cover trimming
  262. TEST_DOUBLE(fullPrecision,
  263. "2.22507385850720113605740979670913197593481954635164564802342610972482222202107694551652952390813508"
  264. "7914149158913039621106870086438694594645527657207407820621743379988141063267329253552286881372149012"
  265. "9811224514518898490572223072852551331557550159143974763979834118019993239625482890171070818506906306"
  266. "6665599493827577257201576306269066333264756530000924588831643303777979186961204949739037782970490505"
  267. "1080609940730262937128958950003583799967207254304360284078895771796150945516748243471030702609144621"
  268. "5722898802581825451803257070188608721131280795122334262883686223215037756666225039825343359745688844"
  269. "2390026549819838548794829220689472168983109969836584681402285424333066033985088644580400103493397042"
  270. "7567186443383770486037861622771738545623065874679014086723327636718751234567890123456789012345678901"
  271. "e-308",
  272. 2.2250738585072014e-308);
  273. {
  274. static const unsigned count = 100; // Tested with 1000000 locally
  275. Random r;
  276. Reader reader; // Reusing reader to prevent heap allocation
  277. // Exhaustively test different exponents with random significant
  278. for (uint64_t exp = 0; exp < 2047; exp++) {
  279. ;
  280. for (unsigned i = 0; i < count; i++) {
  281. // Need to call r() in two statements for cross-platform coherent sequence.
  282. uint64_t u = (exp << 52) | uint64_t(r() & 0x000FFFFF) << 32;
  283. u |= uint64_t(r());
  284. internal::Double d = internal::Double(u);
  285. char buffer[32];
  286. *internal::dtoa(d.Value(), buffer) = '\0';
  287. StringStream s(buffer);
  288. ParseDoubleHandler h;
  289. ASSERT_EQ(kParseErrorNone, reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h).Code());
  290. EXPECT_EQ(1u, h.step_);
  291. internal::Double a(h.actual_);
  292. if (fullPrecision) {
  293. EXPECT_EQ(d.Uint64Value(), a.Uint64Value());
  294. if (d.Uint64Value() != a.Uint64Value())
  295. printf(" String: %s\n Actual: %.17g\nExpected: %.17g\n", buffer, h.actual_, d.Value());
  296. }
  297. else {
  298. EXPECT_EQ(d.Sign(), a.Sign()); // for 0.0 != -0.0
  299. EXPECT_DOUBLE_EQ(d.Value(), h.actual_);
  300. }
  301. }
  302. }
  303. }
  304. // Issue #340
  305. TEST_DOUBLE(fullPrecision, "7.450580596923828e-9", 7.450580596923828e-9);
  306. {
  307. internal::Double d(1.0);
  308. for (int i = 0; i < 324; i++) {
  309. char buffer[32];
  310. *internal::dtoa(d.Value(), buffer) = '\0';
  311. StringStream s(buffer);
  312. ParseDoubleHandler h;
  313. Reader reader;
  314. ASSERT_EQ(kParseErrorNone, reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h).Code());
  315. EXPECT_EQ(1u, h.step_);
  316. internal::Double a(h.actual_);
  317. if (fullPrecision) {
  318. EXPECT_EQ(d.Uint64Value(), a.Uint64Value());
  319. if (d.Uint64Value() != a.Uint64Value())
  320. printf(" String: %s\n Actual: %.17g\nExpected: %.17g\n", buffer, h.actual_, d.Value());
  321. }
  322. else {
  323. EXPECT_EQ(d.Sign(), a.Sign()); // for 0.0 != -0.0
  324. EXPECT_DOUBLE_EQ(d.Value(), h.actual_);
  325. }
  326. d = d.Value() * 0.5;
  327. }
  328. }
  329. // Issue 1249
  330. TEST_DOUBLE(fullPrecision, "0e100", 0.0);
  331. // Issue 1251
  332. TEST_DOUBLE(fullPrecision, "128.74836467836484838364836483643636483648e-336", 0.0);
  333. // Issue 1256
  334. TEST_DOUBLE(fullPrecision,
  335. "6223372036854775296.1701512723685473547372536854755293372036854685477"
  336. "529752233737201701512337200972013723685473123372036872036854236854737"
  337. "247372368372367752975258547752975254729752547372368737201701512354737"
  338. "83723677529752585477247372368372368547354737253685475529752",
  339. 6223372036854775808.0);
  340. #if 0
  341. // Test (length + exponent) overflow
  342. TEST_DOUBLE(fullPrecision, "0e+2147483647", 0.0);
  343. TEST_DOUBLE(fullPrecision, "0e-2147483648", 0.0);
  344. TEST_DOUBLE(fullPrecision, "1e-2147483648", 0.0);
  345. TEST_DOUBLE(fullPrecision, "0e+9223372036854775807", 0.0);
  346. TEST_DOUBLE(fullPrecision, "0e-9223372036854775808", 0.0);
  347. #endif
  348. if (fullPrecision)
  349. {
  350. TEST_DOUBLE(fullPrecision, "1e-325", 0.0);
  351. TEST_DOUBLE(fullPrecision, "1e-324", 0.0);
  352. TEST_DOUBLE(fullPrecision, "2e-324", 0.0);
  353. TEST_DOUBLE(fullPrecision, "2.4703282292062327e-324", 0.0);
  354. TEST_DOUBLE(fullPrecision, "2.4703282292062328e-324", 5e-324);
  355. TEST_DOUBLE(fullPrecision, "2.48e-324",5e-324);
  356. TEST_DOUBLE(fullPrecision, "2.5e-324", 5e-324);
  357. // Slightly above max-normal
  358. TEST_DOUBLE(fullPrecision, "1.7976931348623158e+308", 1.7976931348623158e+308);
  359. TEST_DOUBLE(fullPrecision,
  360. "17976931348623157081452742373170435679807056752584499659891747680315726"
  361. "07800285387605895586327668781715404589535143824642343213268894641827684"
  362. "67546703537516986049910576551282076245490090389328944075868508455133942"
  363. "30458323690322294816580855933212334827479782620414472316873817718091929"
  364. "9881250404026184124858368",
  365. (std::numeric_limits<double>::max)());
  366. TEST_DOUBLE(fullPrecision,
  367. "243546080556034731077856379609316893158278902575447060151047"
  368. "212703405344938119816206067372775299130836050315842578309818"
  369. "316450894337978612745889730079163798234256495613858256849283"
  370. "467066859489192118352020514036083287319232435355752493038825"
  371. "828481044358810649108367633313557305310641892225870327827273"
  372. "41408256.000000",
  373. 2.4354608055603473e+307);
  374. // 9007199254740991 * 2^971 (max normal)
  375. TEST_DOUBLE(fullPrecision,
  376. "1.797693134862315708145274237317043567980705675258449965989174768031572607800285"
  377. "38760589558632766878171540458953514382464234321326889464182768467546703537516986"
  378. "04991057655128207624549009038932894407586850845513394230458323690322294816580855"
  379. "9332123348274797826204144723168738177180919299881250404026184124858368e+308",
  380. 1.797693134862315708e+308 // 0x1.fffffffffffffp1023
  381. );
  382. #if 0
  383. // TODO:
  384. // Should work at least in full-precision mode...
  385. TEST_DOUBLE(fullPrecision,
  386. "0.00000000000000000000000000000000000000000000000000000000000"
  387. "0000000000000000000000000000000000000000000000000000000000000"
  388. "0000000000000000000000000000000000000000000000000000000000000"
  389. "0000000000000000000000000000000000000000000000000000000000000"
  390. "0000000000000000000000000000000000000000000000000000000000000"
  391. "0000000000000000000024703282292062327208828439643411068618252"
  392. "9901307162382212792841250337753635104375932649918180817996189"
  393. "8982823477228588654633283551779698981993873980053909390631503"
  394. "5659515570226392290858392449105184435931802849936536152500319"
  395. "3704576782492193656236698636584807570015857692699037063119282"
  396. "7955855133292783433840935197801553124659726357957462276646527"
  397. "2827220056374006485499977096599470454020828166226237857393450"
  398. "7363390079677619305775067401763246736009689513405355374585166"
  399. "6113422376667860416215968046191446729184030053005753084904876"
  400. "5391711386591646239524912623653881879636239373280423891018672"
  401. "3484976682350898633885879256283027559956575244555072551893136"
  402. "9083625477918694866799496832404970582102851318545139621383772"
  403. "2826145437693412532098591327667236328125",
  404. 0.0);
  405. #endif
  406. // 9007199254740991 * 2^-1074 = (2^53 - 1) * 2^-1074
  407. TEST_DOUBLE(fullPrecision,
  408. "4.450147717014402272114819593418263951869639092703291296046852219449644444042153"
  409. "89103305904781627017582829831782607924221374017287738918929105531441481564124348"
  410. "67599762821265346585071045737627442980259622449029037796981144446145705102663115"
  411. "10031828794952795966823603998647925096578034214163701381261333311989876551545144"
  412. "03152612538132666529513060001849177663286607555958373922409899478075565940981010"
  413. "21612198814605258742579179000071675999344145086087205681577915435923018910334964"
  414. "86942061405218289243144579760516365090360651414037721744226256159024466852576737"
  415. "24464300755133324500796506867194913776884780053099639677097589658441378944337966"
  416. "21993967316936280457084866613206797017728916080020698679408551343728867675409720"
  417. "757232455434770912461317493580281734466552734375e-308",
  418. 4.450147717014402272e-308 // 0x1.fffffffffffffp-1022
  419. );
  420. // 9007199254740990 * 2^-1074
  421. TEST_DOUBLE(fullPrecision,
  422. "4.450147717014401778049173752171719775300846224481918930987049605124880018456471"
  423. "39035755177760751831052846195619008686241717547743167145836439860405887584484471"
  424. "19639655002484083577939142623582164522087943959208000909794783876158397872163051"
  425. "22622675229968408654350206725478309956546318828765627255022767720818849892988457"
  426. "26333908582101604036318532842699932130356061901518261174396928478121372742040102"
  427. "17446565569357687263889031732270082446958029584739170416643195242132750803227473"
  428. "16608838720742955671061336566907126801014814608027120593609275183716632624844904"
  429. "31985250929886016737037234388448352929102742708402644340627409931664203093081360"
  430. "70794835812045179006047003875039546061891526346421705014598610179523165038319441"
  431. "51446491086954182492263498716056346893310546875e-308",
  432. 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022
  433. );
  434. // half way between the two numbers above.
  435. // round to nearest even.
  436. TEST_DOUBLE(fullPrecision,
  437. "4.450147717014402025081996672794991863585242658592605113516950912287262231249312"
  438. "64069530541271189424317838013700808305231545782515453032382772695923684574304409"
  439. "93619708911874715081505094180604803751173783204118519353387964161152051487413083"
  440. "16327252012460602310586905362063117526562176521464664318142050516404363222266800"
  441. "64743260560117135282915796422274554896821334728738317548403413978098469341510556"
  442. "19529382191981473003234105366170879223151087335413188049110555339027884856781219"
  443. "01775450062980622457102958163711745945687733011032421168917765671370549738710820"
  444. "78224775842509670618916870627821633352993761380751142008862499795052791018709663"
  445. "46394401564490729731565935244123171539810221213221201847003580761626016356864581"
  446. "1358486831521563686919762403704226016998291015625e-308",
  447. 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022
  448. );
  449. TEST_DOUBLE(fullPrecision,
  450. "4.450147717014402025081996672794991863585242658592605113516950912287262231249312"
  451. "64069530541271189424317838013700808305231545782515453032382772695923684574304409"
  452. "93619708911874715081505094180604803751173783204118519353387964161152051487413083"
  453. "16327252012460602310586905362063117526562176521464664318142050516404363222266800"
  454. "64743260560117135282915796422274554896821334728738317548403413978098469341510556"
  455. "19529382191981473003234105366170879223151087335413188049110555339027884856781219"
  456. "01775450062980622457102958163711745945687733011032421168917765671370549738710820"
  457. "78224775842509670618916870627821633352993761380751142008862499795052791018709663"
  458. "46394401564490729731565935244123171539810221213221201847003580761626016356864581"
  459. "13584868315215636869197624037042260169982910156250000000000000000000000000000000"
  460. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  461. "00000000000000000000000000000000000000000000000000000000000000000000000000000000e-308",
  462. 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022
  463. );
  464. #if 0
  465. // ... round up
  466. // TODO:
  467. // Should work at least in full-precision mode...
  468. TEST_DOUBLE(fullPrecision,
  469. "4.450147717014402025081996672794991863585242658592605113516950912287262231249312"
  470. "64069530541271189424317838013700808305231545782515453032382772695923684574304409"
  471. "93619708911874715081505094180604803751173783204118519353387964161152051487413083"
  472. "16327252012460602310586905362063117526562176521464664318142050516404363222266800"
  473. "64743260560117135282915796422274554896821334728738317548403413978098469341510556"
  474. "19529382191981473003234105366170879223151087335413188049110555339027884856781219"
  475. "01775450062980622457102958163711745945687733011032421168917765671370549738710820"
  476. "78224775842509670618916870627821633352993761380751142008862499795052791018709663"
  477. "46394401564490729731565935244123171539810221213221201847003580761626016356864581"
  478. "13584868315215636869197624037042260169982910156250000000000000000000000000000000"
  479. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  480. "00000000000000000000000000000000000000000000000000000000000000000000000000000001e-308",
  481. 4.450147717014402272e-308 // 0x1.fffffffffffffp-1022
  482. );
  483. #endif
  484. // ... round down
  485. TEST_DOUBLE(fullPrecision,
  486. "4.450147717014402025081996672794991863585242658592605113516950912287262231249312"
  487. "64069530541271189424317838013700808305231545782515453032382772695923684574304409"
  488. "93619708911874715081505094180604803751173783204118519353387964161152051487413083"
  489. "16327252012460602310586905362063117526562176521464664318142050516404363222266800"
  490. "64743260560117135282915796422274554896821334728738317548403413978098469341510556"
  491. "19529382191981473003234105366170879223151087335413188049110555339027884856781219"
  492. "01775450062980622457102958163711745945687733011032421168917765671370549738710820"
  493. "78224775842509670618916870627821633352993761380751142008862499795052791018709663"
  494. "46394401564490729731565935244123171539810221213221201847003580761626016356864581"
  495. "13584868315215636869197624037042260169982910156249999999999999999999999999999999"
  496. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  497. "99999999999999999999999999999999999999999999999999999999999999999999999999999999e-308",
  498. 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022
  499. );
  500. // Slightly below half way between max-normal and infinity.
  501. // Should round down.
  502. TEST_DOUBLE(fullPrecision,
  503. "1.797693134862315807937289714053034150799341327100378269361737789804449682927647"
  504. "50946649017977587207096330286416692887910946555547851940402630657488671505820681"
  505. "90890200070838367627385484581771153176447573027006985557136695962284291481986083"
  506. "49364752927190741684443655107043427115596995080930428801779041744977919999999999"
  507. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  508. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  509. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  510. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  511. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  512. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  513. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  514. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  515. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  516. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  517. "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
  518. "99999999999999999999999999999999999999999999999999999999999999999999999999999999e+308",
  519. 1.797693134862315708e+308 // 0x1.fffffffffffffp1023
  520. );
  521. }
  522. #undef TEST_DOUBLE
  523. }
  524. TEST(Reader, ParseNumber_NormalPrecisionDouble) {
  525. TestParseDouble<false>();
  526. }
  527. TEST(Reader, ParseNumber_FullPrecisionDouble) {
  528. TestParseDouble<true>();
  529. }
  530. TEST(Reader, ParseNumber_NormalPrecisionError) {
  531. static unsigned count = 1000000;
  532. Random r;
  533. double ulpSum = 0.0;
  534. double ulpMax = 0.0;
  535. for (unsigned i = 0; i < count; i++) {
  536. internal::Double e, a;
  537. do {
  538. // Need to call r() in two statements for cross-platform coherent sequence.
  539. uint64_t u = uint64_t(r()) << 32;
  540. u |= uint64_t(r());
  541. e = u;
  542. } while (e.IsNan() || e.IsInf() || !e.IsNormal());
  543. char buffer[32];
  544. *internal::dtoa(e.Value(), buffer) = '\0';
  545. StringStream s(buffer);
  546. ParseDoubleHandler h;
  547. Reader reader;
  548. ASSERT_EQ(kParseErrorNone, reader.Parse(s, h).Code());
  549. EXPECT_EQ(1u, h.step_);
  550. a = h.actual_;
  551. uint64_t bias1 = e.ToBias();
  552. uint64_t bias2 = a.ToBias();
  553. double ulp = static_cast<double>(bias1 >= bias2 ? bias1 - bias2 : bias2 - bias1);
  554. ulpMax = (std::max)(ulpMax, ulp);
  555. ulpSum += ulp;
  556. }
  557. printf("ULP Average = %g, Max = %g \n", ulpSum / count, ulpMax);
  558. }
  559. template<bool fullPrecision>
  560. static void TestParseNumberError() {
  561. #define TEST_NUMBER_ERROR(errorCode, str, errorOffset, streamPos) \
  562. { \
  563. char buffer[2048]; \
  564. ASSERT_LT(std::strlen(str), 2048u); \
  565. sprintf(buffer, "%s", str); \
  566. InsituStringStream s(buffer); \
  567. BaseReaderHandler<> h; \
  568. Reader reader; \
  569. EXPECT_FALSE(reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h)); \
  570. EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
  571. EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
  572. EXPECT_EQ(streamPos, s.Tell());\
  573. }
  574. // Number too big to be stored in double.
  575. {
  576. char n1e309[311]; // '1' followed by 309 '0'
  577. n1e309[0] = '1';
  578. for (int i = 1; i < 310; i++)
  579. n1e309[i] = '0';
  580. n1e309[310] = '\0';
  581. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, n1e309, 0u, 310u);
  582. }
  583. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e309", 0u, 5u);
  584. // Miss fraction part in number.
  585. TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.", 2u, 2u);
  586. TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.a", 2u, 2u);
  587. // Miss exponent in number.
  588. TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e", 2u, 2u);
  589. TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e_", 2u, 2u);
  590. // Issue 849
  591. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.8e308", 0u, 7u);
  592. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "5e308", 0u, 5u);
  593. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e309", 0u, 5u);
  594. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.0e310", 0u, 7u);
  595. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.00e310", 0u, 8u);
  596. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "-1.8e308", 0u, 8u);
  597. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "-1e309", 0u, 6u);
  598. // Issue 1253
  599. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "2e308", 0u, 5u);
  600. // Issue 1259
  601. TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
  602. "88474320368547737236837236775298547354737253685475547552933720368546854775297525"
  603. "29337203685468547770151233720097201372368547312337203687203685423685123372036872"
  604. "03685473724737236837236775297525854775297525472975254737236873720170151235473783"
  605. "7236737247372368772473723683723456789012E66", 0u, 283u);
  606. #if 0
  607. // Test (length + exponent) overflow
  608. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+2147483647", 0u, 13u);
  609. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+9223372036854775807", 0u, 22u);
  610. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+10000", 0u, 8u);
  611. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+50000", 0u, 8u);
  612. #endif
  613. // 9007199254740992 * 2^971 ("infinity")
  614. TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
  615. "1.797693134862315907729305190789024733617976978942306572734300811577326758055009"
  616. "63132708477322407536021120113879871393357658789768814416622492847430639474124377"
  617. "76789342486548527630221960124609411945308295208500576883815068234246288147391311"
  618. "0540827237163350510684586298239947245938479716304835356329624224137216e+308", 0u, 315u);
  619. // TODO:
  620. // These tests (currently) fail in normal-precision mode
  621. if (fullPrecision)
  622. {
  623. // Half way between max-normal and infinity
  624. // Should round to infinity in nearest-even mode.
  625. TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
  626. "1.797693134862315807937289714053034150799341327100378269361737789804449682927647"
  627. "50946649017977587207096330286416692887910946555547851940402630657488671505820681"
  628. "90890200070838367627385484581771153176447573027006985557136695962284291481986083"
  629. "49364752927190741684443655107043427115596995080930428801779041744977920000000000"
  630. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  631. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  632. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  633. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  634. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  635. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  636. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  637. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  638. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  639. "00000000000000000000000000000000000000000000000000000000000000000000000000000000e+308", 0u, 1125u);
  640. // ...round up
  641. TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
  642. "1.797693134862315807937289714053034150799341327100378269361737789804449682927647"
  643. "50946649017977587207096330286416692887910946555547851940402630657488671505820681"
  644. "90890200070838367627385484581771153176447573027006985557136695962284291481986083"
  645. "49364752927190741684443655107043427115596995080930428801779041744977920000000000"
  646. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  647. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  648. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  649. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  650. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  651. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  652. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  653. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  654. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  655. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  656. "00000000000000000000000000000000000000000000000000000000000000000000000000000001e+308", 0u, 1205u);
  657. }
  658. TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
  659. "10000000000000000000000000000000000000000000000000000000000000000000000000000000"
  660. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  661. "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
  662. "0000000000000000000000000000000000000000000000000000000000000000000001", 0u, 310u);
  663. #undef TEST_NUMBER_ERROR
  664. }
  665. TEST(Reader, ParseNumberError_NormalPrecisionDouble) {
  666. TestParseNumberError<false>();
  667. }
  668. TEST(Reader, ParseNumberError_FullPrecisionDouble) {
  669. TestParseNumberError<true>();
  670. }
  671. template <typename Encoding>
  672. struct ParseStringHandler : BaseReaderHandler<Encoding, ParseStringHandler<Encoding> > {
  673. ParseStringHandler() : str_(0), length_(0), copy_() {}
  674. ~ParseStringHandler() { EXPECT_TRUE(str_ != 0); if (copy_) free(const_cast<typename Encoding::Ch*>(str_)); }
  675. ParseStringHandler(const ParseStringHandler&);
  676. ParseStringHandler& operator=(const ParseStringHandler&);
  677. bool Default() { ADD_FAILURE(); return false; }
  678. bool String(const typename Encoding::Ch* str, size_t length, bool copy) {
  679. EXPECT_EQ(0, str_);
  680. if (copy) {
  681. str_ = static_cast<typename Encoding::Ch*>(malloc((length + 1) * sizeof(typename Encoding::Ch)));
  682. memcpy(const_cast<typename Encoding::Ch*>(str_), str, (length + 1) * sizeof(typename Encoding::Ch));
  683. }
  684. else
  685. str_ = str;
  686. length_ = length;
  687. copy_ = copy;
  688. return true;
  689. }
  690. const typename Encoding::Ch* str_;
  691. size_t length_;
  692. bool copy_;
  693. };
  694. TEST(Reader, ParseString) {
  695. #define TEST_STRING(Encoding, e, x) \
  696. { \
  697. Encoding::Ch* buffer = StrDup(x); \
  698. GenericInsituStringStream<Encoding> is(buffer); \
  699. ParseStringHandler<Encoding> h; \
  700. GenericReader<Encoding, Encoding> reader; \
  701. reader.Parse<kParseInsituFlag | kParseValidateEncodingFlag>(is, h); \
  702. EXPECT_EQ(0, StrCmp<Encoding::Ch>(e, h.str_)); \
  703. EXPECT_EQ(StrLen(e), h.length_); \
  704. free(buffer); \
  705. GenericStringStream<Encoding> s(x); \
  706. ParseStringHandler<Encoding> h2; \
  707. GenericReader<Encoding, Encoding> reader2; \
  708. reader2.Parse(s, h2); \
  709. EXPECT_EQ(0, StrCmp<Encoding::Ch>(e, h2.str_)); \
  710. EXPECT_EQ(StrLen(e), h2.length_); \
  711. }
  712. // String constant L"\xXX" can only specify character code in bytes, which is not endianness-neutral.
  713. // And old compiler does not support u"" and U"" string literal. So here specify string literal by array of Ch.
  714. // In addition, GCC 4.8 generates -Wnarrowing warnings when character code >= 128 are assigned to signed integer types.
  715. // Therefore, utype is added for declaring unsigned array, and then cast it to Encoding::Ch.
  716. #define ARRAY(...) { __VA_ARGS__ }
  717. #define TEST_STRINGARRAY(Encoding, utype, array, x) \
  718. { \
  719. static const utype ue[] = array; \
  720. static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
  721. TEST_STRING(Encoding, e, x); \
  722. }
  723. #define TEST_STRINGARRAY2(Encoding, utype, earray, xarray) \
  724. { \
  725. static const utype ue[] = earray; \
  726. static const utype xe[] = xarray; \
  727. static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
  728. static const Encoding::Ch* x = reinterpret_cast<const Encoding::Ch *>(&xe[0]); \
  729. TEST_STRING(Encoding, e, x); \
  730. }
  731. TEST_STRING(UTF8<>, "", "\"\"");
  732. TEST_STRING(UTF8<>, "Hello", "\"Hello\"");
  733. TEST_STRING(UTF8<>, "Hello\nWorld", "\"Hello\\nWorld\"");
  734. TEST_STRING(UTF8<>, "\"\\/\b\f\n\r\t", "\"\\\"\\\\/\\b\\f\\n\\r\\t\"");
  735. TEST_STRING(UTF8<>, "\x24", "\"\\u0024\""); // Dollar sign U+0024
  736. TEST_STRING(UTF8<>, "\xC2\xA2", "\"\\u00A2\""); // Cents sign U+00A2
  737. TEST_STRING(UTF8<>, "\xE2\x82\xAC", "\"\\u20AC\""); // Euro sign U+20AC
  738. TEST_STRING(UTF8<>, "\xF0\x9D\x84\x9E", "\"\\uD834\\uDD1E\""); // G clef sign U+1D11E
  739. // UTF16
  740. TEST_STRING(UTF16<>, L"", L"\"\"");
  741. TEST_STRING(UTF16<>, L"Hello", L"\"Hello\"");
  742. TEST_STRING(UTF16<>, L"Hello\nWorld", L"\"Hello\\nWorld\"");
  743. TEST_STRING(UTF16<>, L"\"\\/\b\f\n\r\t", L"\"\\\"\\\\/\\b\\f\\n\\r\\t\"");
  744. TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x0024, 0x0000), L"\"\\u0024\"");
  745. TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x00A2, 0x0000), L"\"\\u00A2\""); // Cents sign U+00A2
  746. TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x20AC, 0x0000), L"\"\\u20AC\""); // Euro sign U+20AC
  747. TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0xD834, 0xDD1E, 0x0000), L"\"\\uD834\\uDD1E\""); // G clef sign U+1D11E
  748. // UTF32
  749. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('\0'), ARRAY('\"', '\"', '\0'));
  750. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('H', 'e', 'l', 'l', 'o', '\0'), ARRAY('\"', 'H', 'e', 'l', 'l', 'o', '\"', '\0'));
  751. 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'));
  752. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('\"', '\\', '/', '\b', '\f', '\n', '\r', '\t', '\0'), ARRAY('\"', '\\', '\"', '\\', '\\', '/', '\\', 'b', '\\', 'f', '\\', 'n', '\\', 'r', '\\', 't', '\"', '\0'));
  753. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x00024, 0x0000), ARRAY('\"', '\\', 'u', '0', '0', '2', '4', '\"', '\0'));
  754. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x000A2, 0x0000), ARRAY('\"', '\\', 'u', '0', '0', 'A', '2', '\"', '\0')); // Cents sign U+00A2
  755. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x020AC, 0x0000), ARRAY('\"', '\\', 'u', '2', '0', 'A', 'C', '\"', '\0')); // Euro sign U+20AC
  756. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x1D11E, 0x0000), ARRAY('\"', '\\', 'u', 'D', '8', '3', '4', '\\', 'u', 'D', 'D', '1', 'E', '\"', '\0')); // G clef sign U+1D11E
  757. #undef TEST_STRINGARRAY
  758. #undef ARRAY
  759. #undef TEST_STRING
  760. // Support of null character in string
  761. {
  762. StringStream s("\"Hello\\u0000World\"");
  763. const char e[] = "Hello\0World";
  764. ParseStringHandler<UTF8<> > h;
  765. Reader reader;
  766. reader.Parse(s, h);
  767. EXPECT_EQ(0, memcmp(e, h.str_, h.length_ + 1));
  768. EXPECT_EQ(11u, h.length_);
  769. }
  770. }
  771. TEST(Reader, ParseString_Transcoding) {
  772. const char* x = "\"Hello\"";
  773. const wchar_t* e = L"Hello";
  774. GenericStringStream<UTF8<> > is(x);
  775. GenericReader<UTF8<>, UTF16<> > reader;
  776. ParseStringHandler<UTF16<> > h;
  777. reader.Parse(is, h);
  778. EXPECT_EQ(0, StrCmp<UTF16<>::Ch>(e, h.str_));
  779. EXPECT_EQ(StrLen(e), h.length_);
  780. }
  781. TEST(Reader, ParseString_TranscodingWithValidation) {
  782. const char* x = "\"Hello\"";
  783. const wchar_t* e = L"Hello";
  784. GenericStringStream<UTF8<> > is(x);
  785. GenericReader<UTF8<>, UTF16<> > reader;
  786. ParseStringHandler<UTF16<> > h;
  787. reader.Parse<kParseValidateEncodingFlag>(is, h);
  788. EXPECT_EQ(0, StrCmp<UTF16<>::Ch>(e, h.str_));
  789. EXPECT_EQ(StrLen(e), h.length_);
  790. }
  791. TEST(Reader, ParseString_NonDestructive) {
  792. StringStream s("\"Hello\\nWorld\"");
  793. ParseStringHandler<UTF8<> > h;
  794. Reader reader;
  795. reader.Parse(s, h);
  796. EXPECT_EQ(0, StrCmp("Hello\nWorld", h.str_));
  797. EXPECT_EQ(11u, h.length_);
  798. }
  799. template <typename Encoding>
  800. ParseErrorCode TestString(const typename Encoding::Ch* str) {
  801. GenericStringStream<Encoding> s(str);
  802. BaseReaderHandler<Encoding> h;
  803. GenericReader<Encoding, Encoding> reader;
  804. reader.template Parse<kParseValidateEncodingFlag>(s, h);
  805. return reader.GetParseErrorCode();
  806. }
  807. TEST(Reader, ParseString_Error) {
  808. #define TEST_STRING_ERROR(errorCode, str, errorOffset, streamPos)\
  809. {\
  810. GenericStringStream<UTF8<> > s(str);\
  811. BaseReaderHandler<UTF8<> > h;\
  812. GenericReader<UTF8<> , UTF8<> > reader;\
  813. reader.Parse<kParseValidateEncodingFlag>(s, h);\
  814. EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
  815. EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
  816. EXPECT_EQ(streamPos, s.Tell());\
  817. }
  818. #define ARRAY(...) { __VA_ARGS__ }
  819. #define TEST_STRINGENCODING_ERROR(Encoding, TargetEncoding, utype, array) \
  820. { \
  821. static const utype ue[] = array; \
  822. static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
  823. EXPECT_EQ(kParseErrorStringInvalidEncoding, TestString<Encoding>(e));\
  824. /* decode error */\
  825. GenericStringStream<Encoding> s(e);\
  826. BaseReaderHandler<TargetEncoding> h;\
  827. GenericReader<Encoding, TargetEncoding> reader;\
  828. reader.Parse(s, h);\
  829. EXPECT_EQ(kParseErrorStringInvalidEncoding, reader.GetParseErrorCode());\
  830. }
  831. // Invalid escape character in string.
  832. TEST_STRING_ERROR(kParseErrorStringEscapeInvalid, "[\"\\a\"]", 2u, 3u);
  833. // Incorrect hex digit after \\u escape in string.
  834. TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uABCG\"]", 2u, 7u);
  835. // Quotation in \\u escape in string (Issue #288)
  836. TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uaaa\"]", 2u, 7u);
  837. TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uD800\\uFFF\"]", 2u, 13u);
  838. // The surrogate pair in string is invalid.
  839. TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800X\"]", 2u, 8u);
  840. TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800\\uFFFF\"]", 2u, 14u);
  841. // Missing a closing quotation mark in string.
  842. TEST_STRING_ERROR(kParseErrorStringMissQuotationMark, "[\"Test]", 7u, 7u);
  843. // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
  844. // 3 Malformed sequences
  845. // 3.1 Unexpected continuation bytes
  846. {
  847. char e[] = { '[', '\"', 0, '\"', ']', '\0' };
  848. for (unsigned char c = 0x80u; c <= 0xBFu; c++) {
  849. e[2] = static_cast<char>(c);
  850. ParseErrorCode error = TestString<UTF8<> >(e);
  851. EXPECT_EQ(kParseErrorStringInvalidEncoding, error);
  852. if (error != kParseErrorStringInvalidEncoding)
  853. std::cout << static_cast<unsigned>(c) << std::endl;
  854. }
  855. }
  856. // 3.2 Lonely start characters, 3.5 Impossible bytes
  857. {
  858. char e[] = { '[', '\"', 0, ' ', '\"', ']', '\0' };
  859. for (unsigned c = 0xC0u; c <= 0xFFu; c++) {
  860. e[2] = static_cast<char>(c);
  861. unsigned streamPos;
  862. if (c <= 0xC1u)
  863. streamPos = 3; // 0xC0 - 0xC1
  864. else if (c <= 0xDFu)
  865. streamPos = 4; // 0xC2 - 0xDF
  866. else if (c <= 0xEFu)
  867. streamPos = 5; // 0xE0 - 0xEF
  868. else if (c <= 0xF4u)
  869. streamPos = 6; // 0xF0 - 0xF4
  870. else
  871. streamPos = 3; // 0xF5 - 0xFF
  872. TEST_STRING_ERROR(kParseErrorStringInvalidEncoding, e, 2u, streamPos);
  873. }
  874. }
  875. // 4 Overlong sequences
  876. // 4.1 Examples of an overlong ASCII character
  877. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0xAFu, '\"', ']', '\0'));
  878. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0xAFu, '\"', ']', '\0'));
  879. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0xAFu, '\"', ']', '\0'));
  880. // 4.2 Maximum overlong sequences
  881. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC1u, 0xBFu, '\"', ']', '\0'));
  882. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x9Fu, 0xBFu, '\"', ']', '\0'));
  883. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x8Fu, 0xBFu, 0xBFu, '\"', ']', '\0'));
  884. // 4.3 Overlong representation of the NUL character
  885. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0x80u, '\"', ']', '\0'));
  886. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0x80u, '\"', ']', '\0'));
  887. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0x80u, '\"', ']', '\0'));
  888. // 5 Illegal code positions
  889. // 5.1 Single UTF-16 surrogates
  890. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xA0u, 0x80u, '\"', ']', '\0'));
  891. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xADu, 0xBFu, '\"', ']', '\0'));
  892. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAEu, 0x80u, '\"', ']', '\0'));
  893. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAFu, 0xBFu, '\"', ']', '\0'));
  894. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xB0u, 0x80u, '\"', ']', '\0'));
  895. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBEu, 0x80u, '\"', ']', '\0'));
  896. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBFu, 0xBFu, '\"', ']', '\0'));
  897. // Malform UTF-16 sequences
  898. TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xDC00, 0xDC00, '\"', ']', '\0'));
  899. TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xD800, 0xD800, '\"', ']', '\0'));
  900. // Malform UTF-32 sequence
  901. TEST_STRINGENCODING_ERROR(UTF32<>, UTF8<>, unsigned, ARRAY('[', '\"', 0x110000, '\"', ']', '\0'));
  902. // Malform ASCII sequence
  903. TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x80u), '\"', ']', '\0'));
  904. TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x01u), '\"', ']', '\0'));
  905. TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x1Cu), '\"', ']', '\0'));
  906. #undef ARRAY
  907. #undef TEST_STRINGARRAY_ERROR
  908. }
  909. template <unsigned count>
  910. struct ParseArrayHandler : BaseReaderHandler<UTF8<>, ParseArrayHandler<count> > {
  911. ParseArrayHandler() : step_(0) {}
  912. bool Default() { ADD_FAILURE(); return false; }
  913. bool Uint(unsigned i) { EXPECT_EQ(step_, i); step_++; return true; }
  914. bool StartArray() { EXPECT_EQ(0u, step_); step_++; return true; }
  915. bool EndArray(SizeType) { step_++; return true; }
  916. unsigned step_;
  917. };
  918. TEST(Reader, ParseEmptyArray) {
  919. char *json = StrDup("[ ] ");
  920. InsituStringStream s(json);
  921. ParseArrayHandler<0> h;
  922. Reader reader;
  923. reader.Parse(s, h);
  924. EXPECT_EQ(2u, h.step_);
  925. free(json);
  926. }
  927. TEST(Reader, ParseArray) {
  928. char *json = StrDup("[1, 2, 3, 4]");
  929. InsituStringStream s(json);
  930. ParseArrayHandler<4> h;
  931. Reader reader;
  932. reader.Parse(s, h);
  933. EXPECT_EQ(6u, h.step_);
  934. free(json);
  935. }
  936. TEST(Reader, ParseArray_Error) {
  937. #define TEST_ARRAY_ERROR(errorCode, str, errorOffset) \
  938. { \
  939. unsigned streamPos = errorOffset; \
  940. char buffer[1001]; \
  941. strncpy(buffer, str, 1000); \
  942. InsituStringStream s(buffer); \
  943. BaseReaderHandler<> h; \
  944. GenericReader<UTF8<>, UTF8<>, CrtAllocator> reader; \
  945. EXPECT_FALSE(reader.Parse(s, h)); \
  946. EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
  947. EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
  948. EXPECT_EQ(streamPos, s.Tell());\
  949. }
  950. // Missing a comma or ']' after an array element.
  951. TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1", 2u);
  952. TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1}", 2u);
  953. TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1 2]", 3u);
  954. // Array cannot have a trailing comma (without kParseTrailingCommasFlag);
  955. // a value must follow a comma
  956. TEST_ARRAY_ERROR(kParseErrorValueInvalid, "[1,]", 3u);
  957. #undef TEST_ARRAY_ERROR
  958. }
  959. struct ParseObjectHandler : BaseReaderHandler<UTF8<>, ParseObjectHandler> {
  960. ParseObjectHandler() : step_(0) {}
  961. bool Default() { ADD_FAILURE(); return false; }
  962. bool Null() { EXPECT_EQ(8u, step_); step_++; return true; }
  963. bool Bool(bool b) {
  964. switch(step_) {
  965. case 4: EXPECT_TRUE(b); step_++; return true;
  966. case 6: EXPECT_FALSE(b); step_++; return true;
  967. default: ADD_FAILURE(); return false;
  968. }
  969. }
  970. bool Int(int i) {
  971. switch(step_) {
  972. case 10: EXPECT_EQ(123, i); step_++; return true;
  973. case 15: EXPECT_EQ(1, i); step_++; return true;
  974. case 16: EXPECT_EQ(2, i); step_++; return true;
  975. case 17: EXPECT_EQ(3, i); step_++; return true;
  976. default: ADD_FAILURE(); return false;
  977. }
  978. }
  979. bool Uint(unsigned i) { return Int(static_cast<int>(i)); }
  980. bool Double(double d) { EXPECT_EQ(12u, step_); EXPECT_DOUBLE_EQ(3.1416, d); step_++; return true; }
  981. bool String(const char* str, size_t, bool) {
  982. switch(step_) {
  983. case 1: EXPECT_STREQ("hello", str); step_++; return true;
  984. case 2: EXPECT_STREQ("world", str); step_++; return true;
  985. case 3: EXPECT_STREQ("t", str); step_++; return true;
  986. case 5: EXPECT_STREQ("f", str); step_++; return true;
  987. case 7: EXPECT_STREQ("n", str); step_++; return true;
  988. case 9: EXPECT_STREQ("i", str); step_++; return true;
  989. case 11: EXPECT_STREQ("pi", str); step_++; return true;
  990. case 13: EXPECT_STREQ("a", str); step_++; return true;
  991. default: ADD_FAILURE(); return false;
  992. }
  993. }
  994. bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
  995. bool EndObject(SizeType memberCount) { EXPECT_EQ(19u, step_); EXPECT_EQ(7u, memberCount); step_++; return true; }
  996. bool StartArray() { EXPECT_EQ(14u, step_); step_++; return true; }
  997. bool EndArray(SizeType elementCount) { EXPECT_EQ(18u, step_); EXPECT_EQ(3u, elementCount); step_++; return true; }
  998. unsigned step_;
  999. };
  1000. TEST(Reader, ParseObject) {
  1001. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } ";
  1002. // Insitu
  1003. {
  1004. char* json2 = StrDup(json);
  1005. InsituStringStream s(json2);
  1006. ParseObjectHandler h;
  1007. Reader reader;
  1008. reader.Parse<kParseInsituFlag>(s, h);
  1009. EXPECT_EQ(20u, h.step_);
  1010. free(json2);
  1011. }
  1012. // Normal
  1013. {
  1014. StringStream s(json);
  1015. ParseObjectHandler h;
  1016. Reader reader;
  1017. reader.Parse(s, h);
  1018. EXPECT_EQ(20u, h.step_);
  1019. }
  1020. }
  1021. struct ParseEmptyObjectHandler : BaseReaderHandler<UTF8<>, ParseEmptyObjectHandler> {
  1022. ParseEmptyObjectHandler() : step_(0) {}
  1023. bool Default() { ADD_FAILURE(); return false; }
  1024. bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
  1025. bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; }
  1026. unsigned step_;
  1027. };
  1028. TEST(Reader, Parse_EmptyObject) {
  1029. StringStream s("{ } ");
  1030. ParseEmptyObjectHandler h;
  1031. Reader reader;
  1032. reader.Parse(s, h);
  1033. EXPECT_EQ(2u, h.step_);
  1034. }
  1035. struct ParseMultipleRootHandler : BaseReaderHandler<UTF8<>, ParseMultipleRootHandler> {
  1036. ParseMultipleRootHandler() : step_(0) {}
  1037. bool Default() { ADD_FAILURE(); return false; }
  1038. bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
  1039. bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; }
  1040. bool StartArray() { EXPECT_EQ(2u, step_); step_++; return true; }
  1041. bool EndArray(SizeType) { EXPECT_EQ(3u, step_); step_++; return true; }
  1042. unsigned step_;
  1043. };
  1044. template <unsigned parseFlags>
  1045. void TestMultipleRoot() {
  1046. StringStream s("{}[] a");
  1047. ParseMultipleRootHandler h;
  1048. Reader reader;
  1049. EXPECT_TRUE(reader.Parse<parseFlags>(s, h));
  1050. EXPECT_EQ(2u, h.step_);
  1051. EXPECT_TRUE(reader.Parse<parseFlags>(s, h));
  1052. EXPECT_EQ(4u, h.step_);
  1053. EXPECT_EQ(' ', s.Take());
  1054. EXPECT_EQ('a', s.Take());
  1055. }
  1056. TEST(Reader, Parse_MultipleRoot) {
  1057. TestMultipleRoot<kParseStopWhenDoneFlag>();
  1058. }
  1059. TEST(Reader, ParseIterative_MultipleRoot) {
  1060. TestMultipleRoot<kParseIterativeFlag | kParseStopWhenDoneFlag>();
  1061. }
  1062. template <unsigned parseFlags>
  1063. void TestInsituMultipleRoot() {
  1064. char* buffer = strdup("{}[] a");
  1065. InsituStringStream s(buffer);
  1066. ParseMultipleRootHandler h;
  1067. Reader reader;
  1068. EXPECT_TRUE(reader.Parse<kParseInsituFlag | parseFlags>(s, h));
  1069. EXPECT_EQ(2u, h.step_);
  1070. EXPECT_TRUE(reader.Parse<kParseInsituFlag | parseFlags>(s, h));
  1071. EXPECT_EQ(4u, h.step_);
  1072. EXPECT_EQ(' ', s.Take());
  1073. EXPECT_EQ('a', s.Take());
  1074. free(buffer);
  1075. }
  1076. TEST(Reader, ParseInsitu_MultipleRoot) {
  1077. TestInsituMultipleRoot<kParseStopWhenDoneFlag>();
  1078. }
  1079. TEST(Reader, ParseInsituIterative_MultipleRoot) {
  1080. TestInsituMultipleRoot<kParseIterativeFlag | kParseStopWhenDoneFlag>();
  1081. }
  1082. #define TEST_ERROR(errorCode, str, errorOffset) \
  1083. { \
  1084. unsigned streamPos = errorOffset; \
  1085. char buffer[1001]; \
  1086. strncpy(buffer, str, 1000); \
  1087. InsituStringStream s(buffer); \
  1088. BaseReaderHandler<> h; \
  1089. Reader reader; \
  1090. EXPECT_FALSE(reader.Parse(s, h)); \
  1091. EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
  1092. EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
  1093. EXPECT_EQ(streamPos, s.Tell());\
  1094. }
  1095. TEST(Reader, ParseDocument_Error) {
  1096. // The document is empty.
  1097. TEST_ERROR(kParseErrorDocumentEmpty, "", 0u);
  1098. TEST_ERROR(kParseErrorDocumentEmpty, " ", 1u);
  1099. TEST_ERROR(kParseErrorDocumentEmpty, " \n", 2u);
  1100. // The document root must not follow by other values.
  1101. TEST_ERROR(kParseErrorDocumentRootNotSingular, "[] 0", 3u);
  1102. TEST_ERROR(kParseErrorDocumentRootNotSingular, "{} 0", 3u);
  1103. TEST_ERROR(kParseErrorDocumentRootNotSingular, "null []", 5u);
  1104. TEST_ERROR(kParseErrorDocumentRootNotSingular, "0 {}", 2u);
  1105. }
  1106. TEST(Reader, ParseValue_Error) {
  1107. // Invalid value.
  1108. TEST_ERROR(kParseErrorValueInvalid, "nulL", 3u);
  1109. TEST_ERROR(kParseErrorValueInvalid, "truE", 3u);
  1110. TEST_ERROR(kParseErrorValueInvalid, "falsE", 4u);
  1111. TEST_ERROR(kParseErrorValueInvalid, "a]", 0u);
  1112. TEST_ERROR(kParseErrorValueInvalid, ".1", 0u);
  1113. }
  1114. TEST(Reader, ParseObject_Error) {
  1115. // Missing a name for object member.
  1116. TEST_ERROR(kParseErrorObjectMissName, "{1}", 1u);
  1117. TEST_ERROR(kParseErrorObjectMissName, "{:1}", 1u);
  1118. TEST_ERROR(kParseErrorObjectMissName, "{null:1}", 1u);
  1119. TEST_ERROR(kParseErrorObjectMissName, "{true:1}", 1u);
  1120. TEST_ERROR(kParseErrorObjectMissName, "{false:1}", 1u);
  1121. TEST_ERROR(kParseErrorObjectMissName, "{1:1}", 1u);
  1122. TEST_ERROR(kParseErrorObjectMissName, "{[]:1}", 1u);
  1123. TEST_ERROR(kParseErrorObjectMissName, "{{}:1}", 1u);
  1124. TEST_ERROR(kParseErrorObjectMissName, "{xyz:1}", 1u);
  1125. // Missing a colon after a name of object member.
  1126. TEST_ERROR(kParseErrorObjectMissColon, "{\"a\" 1}", 5u);
  1127. TEST_ERROR(kParseErrorObjectMissColon, "{\"a\",1}", 4u);
  1128. // Must be a comma or '}' after an object member
  1129. TEST_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, "{\"a\":1]", 6u);
  1130. // Object cannot have a trailing comma (without kParseTrailingCommasFlag);
  1131. // an object member name must follow a comma
  1132. TEST_ERROR(kParseErrorObjectMissName, "{\"a\":1,}", 7u);
  1133. // This tests that MemoryStream is checking the length in Peek().
  1134. {
  1135. MemoryStream ms("{\"a\"", 1);
  1136. BaseReaderHandler<> h;
  1137. Reader reader;
  1138. EXPECT_FALSE(reader.Parse<kParseStopWhenDoneFlag>(ms, h));
  1139. EXPECT_EQ(kParseErrorObjectMissName, reader.GetParseErrorCode());
  1140. }
  1141. }
  1142. #undef TEST_ERROR
  1143. TEST(Reader, SkipWhitespace) {
  1144. StringStream ss(" A \t\tB\n \n\nC\r\r \rD \t\n\r E");
  1145. const char* expected = "ABCDE";
  1146. for (size_t i = 0; i < 5; i++) {
  1147. SkipWhitespace(ss);
  1148. EXPECT_EQ(expected[i], ss.Take());
  1149. }
  1150. }
  1151. // Test implementing a stream without copy stream optimization.
  1152. // Clone from GenericStringStream except that copy constructor is disabled.
  1153. template <typename Encoding>
  1154. class CustomStringStream {
  1155. public:
  1156. typedef typename Encoding::Ch Ch;
  1157. CustomStringStream(const Ch *src) : src_(src), head_(src) {}
  1158. Ch Peek() const { return *src_; }
  1159. Ch Take() { return *src_++; }
  1160. size_t Tell() const { return static_cast<size_t>(src_ - head_); }
  1161. Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; }
  1162. void Put(Ch) { RAPIDJSON_ASSERT(false); }
  1163. void Flush() { RAPIDJSON_ASSERT(false); }
  1164. size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; }
  1165. private:
  1166. // Prohibit copy constructor & assignment operator.
  1167. CustomStringStream(const CustomStringStream&);
  1168. CustomStringStream& operator=(const CustomStringStream&);
  1169. const Ch* src_; //!< Current read position.
  1170. const Ch* head_; //!< Original head of the string.
  1171. };
  1172. // If the following code is compiled, it should generate compilation error as predicted.
  1173. // Because CustomStringStream<> is not copyable via making copy constructor private.
  1174. #if 0
  1175. namespace rapidjson {
  1176. template <typename Encoding>
  1177. struct StreamTraits<CustomStringStream<Encoding> > {
  1178. enum { copyOptimization = 1 };
  1179. };
  1180. } // namespace rapidjson
  1181. #endif
  1182. TEST(Reader, CustomStringStream) {
  1183. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } ";
  1184. CustomStringStream<UTF8<char> > s(json);
  1185. ParseObjectHandler h;
  1186. Reader reader;
  1187. reader.Parse(s, h);
  1188. EXPECT_EQ(20u, h.step_);
  1189. }
  1190. #include <sstream>
  1191. class IStreamWrapper {
  1192. public:
  1193. typedef char Ch;
  1194. IStreamWrapper(std::istream& is) : is_(is) {}
  1195. Ch Peek() const {
  1196. int c = is_.peek();
  1197. return c == std::char_traits<char>::eof() ? '\0' : static_cast<Ch>(c);
  1198. }
  1199. Ch Take() {
  1200. int c = is_.get();
  1201. return c == std::char_traits<char>::eof() ? '\0' : static_cast<Ch>(c);
  1202. }
  1203. size_t Tell() const { return static_cast<size_t>(is_.tellg()); }
  1204. Ch* PutBegin() { assert(false); return 0; }
  1205. void Put(Ch) { assert(false); }
  1206. void Flush() { assert(false); }
  1207. size_t PutEnd(Ch*) { assert(false); return 0; }
  1208. private:
  1209. IStreamWrapper(const IStreamWrapper&);
  1210. IStreamWrapper& operator=(const IStreamWrapper&);
  1211. std::istream& is_;
  1212. };
  1213. TEST(Reader, Parse_IStreamWrapper_StringStream) {
  1214. const char* json = "[1,2,3,4]";
  1215. std::stringstream ss(json);
  1216. IStreamWrapper is(ss);
  1217. Reader reader;
  1218. ParseArrayHandler<4> h;
  1219. reader.Parse(is, h);
  1220. EXPECT_FALSE(reader.HasParseError());
  1221. }
  1222. // Test iterative parsing.
  1223. #define TESTERRORHANDLING(text, errorCode, offset)\
  1224. {\
  1225. unsigned streamPos = offset; \
  1226. StringStream json(text); \
  1227. BaseReaderHandler<> handler; \
  1228. Reader reader; \
  1229. reader.Parse<kParseIterativeFlag>(json, handler); \
  1230. EXPECT_TRUE(reader.HasParseError()); \
  1231. EXPECT_EQ(errorCode, reader.GetParseErrorCode()); \
  1232. EXPECT_EQ(offset, reader.GetErrorOffset()); \
  1233. EXPECT_EQ(streamPos, json.Tell()); \
  1234. }
  1235. TEST(Reader, IterativeParsing_ErrorHandling) {
  1236. TESTERRORHANDLING("{\"a\": a}", kParseErrorValueInvalid, 6u);
  1237. TESTERRORHANDLING("", kParseErrorDocumentEmpty, 0u);
  1238. TESTERRORHANDLING("{}{}", kParseErrorDocumentRootNotSingular, 2u);
  1239. TESTERRORHANDLING("{1}", kParseErrorObjectMissName, 1u);
  1240. TESTERRORHANDLING("{\"a\", 1}", kParseErrorObjectMissColon, 4u);
  1241. TESTERRORHANDLING("{\"a\"}", kParseErrorObjectMissColon, 4u);
  1242. TESTERRORHANDLING("{\"a\": 1", kParseErrorObjectMissCommaOrCurlyBracket, 7u);
  1243. TESTERRORHANDLING("[1 2 3]", kParseErrorArrayMissCommaOrSquareBracket, 3u);
  1244. TESTERRORHANDLING("{\"a: 1", kParseErrorStringMissQuotationMark, 6u);
  1245. TESTERRORHANDLING("{\"a\":}", kParseErrorValueInvalid, 5u);
  1246. TESTERRORHANDLING("{\"a\":]", kParseErrorValueInvalid, 5u);
  1247. TESTERRORHANDLING("[1,2,}", kParseErrorValueInvalid, 5u);
  1248. TESTERRORHANDLING("[}]", kParseErrorValueInvalid, 1u);
  1249. TESTERRORHANDLING("[,]", kParseErrorValueInvalid, 1u);
  1250. TESTERRORHANDLING("[1,,]", kParseErrorValueInvalid, 3u);
  1251. // Trailing commas are not allowed without kParseTrailingCommasFlag
  1252. TESTERRORHANDLING("{\"a\": 1,}", kParseErrorObjectMissName, 8u);
  1253. TESTERRORHANDLING("[1,2,3,]", kParseErrorValueInvalid, 7u);
  1254. // Any JSON value can be a valid root element in RFC7159.
  1255. TESTERRORHANDLING("\"ab", kParseErrorStringMissQuotationMark, 3u);
  1256. TESTERRORHANDLING("truE", kParseErrorValueInvalid, 3u);
  1257. TESTERRORHANDLING("False", kParseErrorValueInvalid, 0u);
  1258. TESTERRORHANDLING("true, false", kParseErrorDocumentRootNotSingular, 4u);
  1259. TESTERRORHANDLING("false, false", kParseErrorDocumentRootNotSingular, 5u);
  1260. TESTERRORHANDLING("nulL", kParseErrorValueInvalid, 3u);
  1261. TESTERRORHANDLING("null , null", kParseErrorDocumentRootNotSingular, 5u);
  1262. TESTERRORHANDLING("1a", kParseErrorDocumentRootNotSingular, 1u);
  1263. }
  1264. template<typename Encoding = UTF8<> >
  1265. struct IterativeParsingReaderHandler {
  1266. typedef typename Encoding::Ch Ch;
  1267. const static uint32_t LOG_NULL = 0x10000000;
  1268. const static uint32_t LOG_BOOL = 0x20000000;
  1269. const static uint32_t LOG_INT = 0x30000000;
  1270. const static uint32_t LOG_UINT = 0x40000000;
  1271. const static uint32_t LOG_INT64 = 0x50000000;
  1272. const static uint32_t LOG_UINT64 = 0x60000000;
  1273. const static uint32_t LOG_DOUBLE = 0x70000000;
  1274. const static uint32_t LOG_STRING = 0x80000000;
  1275. const static uint32_t LOG_STARTOBJECT = 0x90000000;
  1276. const static uint32_t LOG_KEY = 0xA0000000;
  1277. const static uint32_t LOG_ENDOBJECT = 0xB0000000;
  1278. const static uint32_t LOG_STARTARRAY = 0xC0000000;
  1279. const static uint32_t LOG_ENDARRAY = 0xD0000000;
  1280. const static size_t LogCapacity = 256;
  1281. uint32_t Logs[LogCapacity];
  1282. size_t LogCount;
  1283. IterativeParsingReaderHandler() : LogCount(0) {
  1284. }
  1285. bool Null() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_NULL; return true; }
  1286. bool Bool(bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_BOOL; return true; }
  1287. bool Int(int) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; }
  1288. bool Uint(unsigned) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; }
  1289. bool Int64(int64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT64; return true; }
  1290. bool Uint64(uint64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_UINT64; return true; }
  1291. bool Double(double) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_DOUBLE; return true; }
  1292. bool RawNumber(const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STRING; return true; }
  1293. bool String(const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STRING; return true; }
  1294. bool StartObject() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTOBJECT; return true; }
  1295. bool Key (const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_KEY; return true; }
  1296. bool EndObject(SizeType c) {
  1297. RAPIDJSON_ASSERT(LogCount < LogCapacity);
  1298. RAPIDJSON_ASSERT((static_cast<uint32_t>(c) & 0xF0000000) == 0);
  1299. Logs[LogCount++] = LOG_ENDOBJECT | static_cast<uint32_t>(c);
  1300. return true;
  1301. }
  1302. bool StartArray() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTARRAY; return true; }
  1303. bool EndArray(SizeType c) {
  1304. RAPIDJSON_ASSERT(LogCount < LogCapacity);
  1305. RAPIDJSON_ASSERT((static_cast<uint32_t>(c) & 0xF0000000) == 0);
  1306. Logs[LogCount++] = LOG_ENDARRAY | static_cast<uint32_t>(c);
  1307. return true;
  1308. }
  1309. };
  1310. TEST(Reader, IterativeParsing_General) {
  1311. {
  1312. StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]");
  1313. Reader reader;
  1314. IterativeParsingReaderHandler<> handler;
  1315. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1316. EXPECT_FALSE(r.IsError());
  1317. EXPECT_FALSE(reader.HasParseError());
  1318. uint32_t e[] = {
  1319. handler.LOG_STARTARRAY,
  1320. handler.LOG_INT,
  1321. handler.LOG_STARTOBJECT,
  1322. handler.LOG_KEY,
  1323. handler.LOG_STARTARRAY,
  1324. handler.LOG_INT,
  1325. handler.LOG_INT,
  1326. handler.LOG_ENDARRAY | 2,
  1327. handler.LOG_ENDOBJECT | 1,
  1328. handler.LOG_NULL,
  1329. handler.LOG_BOOL,
  1330. handler.LOG_BOOL,
  1331. handler.LOG_STRING,
  1332. handler.LOG_DOUBLE,
  1333. handler.LOG_ENDARRAY | 7
  1334. };
  1335. EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount);
  1336. for (size_t i = 0; i < handler.LogCount; ++i) {
  1337. EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i;
  1338. }
  1339. }
  1340. }
  1341. TEST(Reader, IterativeParsing_Count) {
  1342. {
  1343. StringStream is("[{}, {\"k\": 1}, [1], []]");
  1344. Reader reader;
  1345. IterativeParsingReaderHandler<> handler;
  1346. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1347. EXPECT_FALSE(r.IsError());
  1348. EXPECT_FALSE(reader.HasParseError());
  1349. uint32_t e[] = {
  1350. handler.LOG_STARTARRAY,
  1351. handler.LOG_STARTOBJECT,
  1352. handler.LOG_ENDOBJECT | 0,
  1353. handler.LOG_STARTOBJECT,
  1354. handler.LOG_KEY,
  1355. handler.LOG_INT,
  1356. handler.LOG_ENDOBJECT | 1,
  1357. handler.LOG_STARTARRAY,
  1358. handler.LOG_INT,
  1359. handler.LOG_ENDARRAY | 1,
  1360. handler.LOG_STARTARRAY,
  1361. handler.LOG_ENDARRAY | 0,
  1362. handler.LOG_ENDARRAY | 4
  1363. };
  1364. EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount);
  1365. for (size_t i = 0; i < handler.LogCount; ++i) {
  1366. EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i;
  1367. }
  1368. }
  1369. }
  1370. TEST(Reader, IterativePullParsing_General) {
  1371. {
  1372. IterativeParsingReaderHandler<> handler;
  1373. uint32_t e[] = {
  1374. handler.LOG_STARTARRAY,
  1375. handler.LOG_INT,
  1376. handler.LOG_STARTOBJECT,
  1377. handler.LOG_KEY,
  1378. handler.LOG_STARTARRAY,
  1379. handler.LOG_INT,
  1380. handler.LOG_INT,
  1381. handler.LOG_ENDARRAY | 2,
  1382. handler.LOG_ENDOBJECT | 1,
  1383. handler.LOG_NULL,
  1384. handler.LOG_BOOL,
  1385. handler.LOG_BOOL,
  1386. handler.LOG_STRING,
  1387. handler.LOG_DOUBLE,
  1388. handler.LOG_ENDARRAY | 7
  1389. };
  1390. StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]");
  1391. Reader reader;
  1392. reader.IterativeParseInit();
  1393. while (!reader.IterativeParseComplete()) {
  1394. size_t oldLogCount = handler.LogCount;
  1395. EXPECT_TRUE(oldLogCount < sizeof(e) / sizeof(int)) << "overrun";
  1396. EXPECT_TRUE(reader.IterativeParseNext<kParseDefaultFlags>(is, handler)) << "parse fail";
  1397. EXPECT_EQ(handler.LogCount, oldLogCount + 1) << "handler should be invoked exactly once each time";
  1398. EXPECT_EQ(e[oldLogCount], handler.Logs[oldLogCount]) << "wrong event returned";
  1399. }
  1400. EXPECT_FALSE(reader.HasParseError());
  1401. EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount) << "handler invoked wrong number of times";
  1402. // The handler should not be invoked when the JSON has been fully read, but it should not fail
  1403. size_t oldLogCount = handler.LogCount;
  1404. EXPECT_TRUE(reader.IterativeParseNext<kParseDefaultFlags>(is, handler)) << "parse-next past complete is allowed";
  1405. EXPECT_EQ(handler.LogCount, oldLogCount) << "parse-next past complete should not invoke handler";
  1406. EXPECT_FALSE(reader.HasParseError()) << "parse-next past complete should not generate parse error";
  1407. }
  1408. }
  1409. // Test iterative parsing on kParseErrorTermination.
  1410. struct HandlerTerminateAtStartObject : public IterativeParsingReaderHandler<> {
  1411. bool StartObject() { return false; }
  1412. };
  1413. struct HandlerTerminateAtStartArray : public IterativeParsingReaderHandler<> {
  1414. bool StartArray() { return false; }
  1415. };
  1416. struct HandlerTerminateAtEndObject : public IterativeParsingReaderHandler<> {
  1417. bool EndObject(SizeType) { return false; }
  1418. };
  1419. struct HandlerTerminateAtEndArray : public IterativeParsingReaderHandler<> {
  1420. bool EndArray(SizeType) { return false; }
  1421. };
  1422. TEST(Reader, IterativeParsing_ShortCircuit) {
  1423. {
  1424. HandlerTerminateAtStartObject handler;
  1425. Reader reader;
  1426. StringStream is("[1, {}]");
  1427. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1428. EXPECT_TRUE(reader.HasParseError());
  1429. EXPECT_EQ(kParseErrorTermination, r.Code());
  1430. EXPECT_EQ(4u, r.Offset());
  1431. }
  1432. {
  1433. HandlerTerminateAtStartArray handler;
  1434. Reader reader;
  1435. StringStream is("{\"a\": []}");
  1436. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1437. EXPECT_TRUE(reader.HasParseError());
  1438. EXPECT_EQ(kParseErrorTermination, r.Code());
  1439. EXPECT_EQ(6u, r.Offset());
  1440. }
  1441. {
  1442. HandlerTerminateAtEndObject handler;
  1443. Reader reader;
  1444. StringStream is("[1, {}]");
  1445. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1446. EXPECT_TRUE(reader.HasParseError());
  1447. EXPECT_EQ(kParseErrorTermination, r.Code());
  1448. EXPECT_EQ(5u, r.Offset());
  1449. }
  1450. {
  1451. HandlerTerminateAtEndArray handler;
  1452. Reader reader;
  1453. StringStream is("{\"a\": []}");
  1454. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1455. EXPECT_TRUE(reader.HasParseError());
  1456. EXPECT_EQ(kParseErrorTermination, r.Code());
  1457. EXPECT_EQ(7u, r.Offset());
  1458. }
  1459. }
  1460. // For covering BaseReaderHandler default functions
  1461. TEST(Reader, BaseReaderHandler_Default) {
  1462. BaseReaderHandler<> h;
  1463. Reader reader;
  1464. StringStream is("[null, true, -1, 1, -1234567890123456789, 1234567890123456789, 3.14, \"s\", { \"a\" : 1 }]");
  1465. EXPECT_TRUE(reader.Parse(is, h));
  1466. }
  1467. template <int e>
  1468. struct TerminateHandler {
  1469. bool Null() { return e != 0; }
  1470. bool Bool(bool) { return e != 1; }
  1471. bool Int(int) { return e != 2; }
  1472. bool Uint(unsigned) { return e != 3; }
  1473. bool Int64(int64_t) { return e != 4; }
  1474. bool Uint64(uint64_t) { return e != 5; }
  1475. bool Double(double) { return e != 6; }
  1476. bool RawNumber(const char*, SizeType, bool) { return e != 7; }
  1477. bool String(const char*, SizeType, bool) { return e != 8; }
  1478. bool StartObject() { return e != 9; }
  1479. bool Key(const char*, SizeType, bool) { return e != 10; }
  1480. bool EndObject(SizeType) { return e != 11; }
  1481. bool StartArray() { return e != 12; }
  1482. bool EndArray(SizeType) { return e != 13; }
  1483. };
  1484. #define TEST_TERMINATION(e, json)\
  1485. {\
  1486. Reader reader;\
  1487. TerminateHandler<e> h;\
  1488. StringStream is(json);\
  1489. EXPECT_FALSE(reader.Parse(is, h));\
  1490. EXPECT_EQ(kParseErrorTermination, reader.GetParseErrorCode());\
  1491. }
  1492. TEST(Reader, ParseTerminationByHandler) {
  1493. TEST_TERMINATION(0, "[null");
  1494. TEST_TERMINATION(1, "[true");
  1495. TEST_TERMINATION(1, "[false");
  1496. TEST_TERMINATION(2, "[-1");
  1497. TEST_TERMINATION(3, "[1");
  1498. TEST_TERMINATION(4, "[-1234567890123456789");
  1499. TEST_TERMINATION(5, "[1234567890123456789");
  1500. TEST_TERMINATION(6, "[0.5]");
  1501. // RawNumber() is never called
  1502. TEST_TERMINATION(8, "[\"a\"");
  1503. TEST_TERMINATION(9, "[{");
  1504. TEST_TERMINATION(10, "[{\"a\"");
  1505. TEST_TERMINATION(11, "[{}");
  1506. TEST_TERMINATION(11, "[{\"a\":1}"); // non-empty object
  1507. TEST_TERMINATION(12, "{\"a\":[");
  1508. TEST_TERMINATION(13, "{\"a\":[]");
  1509. TEST_TERMINATION(13, "{\"a\":[1]"); // non-empty array
  1510. }
  1511. TEST(Reader, ParseComments) {
  1512. const char* json =
  1513. "// Here is a one-line comment.\n"
  1514. "{// And here's another one\n"
  1515. " /*And here's an in-line one.*/\"hello\" : \"world\","
  1516. " \"t\" :/* And one with '*' symbol*/true ,"
  1517. "/* A multiline comment\n"
  1518. " goes here*/"
  1519. " \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3]"
  1520. "}/*And the last one to be sure */";
  1521. StringStream s(json);
  1522. ParseObjectHandler h;
  1523. Reader reader;
  1524. EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
  1525. EXPECT_EQ(20u, h.step_);
  1526. }
  1527. TEST(Reader, ParseEmptyInlineComment) {
  1528. const char* json = "{/**/\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1529. StringStream s(json);
  1530. ParseObjectHandler h;
  1531. Reader reader;
  1532. EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
  1533. EXPECT_EQ(20u, h.step_);
  1534. }
  1535. TEST(Reader, ParseEmptyOnelineComment) {
  1536. const char* json = "{//\n\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1537. StringStream s(json);
  1538. ParseObjectHandler h;
  1539. Reader reader;
  1540. EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
  1541. EXPECT_EQ(20u, h.step_);
  1542. }
  1543. TEST(Reader, ParseMultipleCommentsInARow) {
  1544. const char* json =
  1545. "{/* first comment *//* second */\n"
  1546. "/* third */ /*fourth*/// last one\n"
  1547. "\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1548. StringStream s(json);
  1549. ParseObjectHandler h;
  1550. Reader reader;
  1551. EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
  1552. EXPECT_EQ(20u, h.step_);
  1553. }
  1554. TEST(Reader, InlineCommentsAreDisabledByDefault) {
  1555. {
  1556. const char* json = "{/* Inline comment. */\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1557. StringStream s(json);
  1558. ParseObjectHandler h;
  1559. Reader reader;
  1560. EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
  1561. }
  1562. {
  1563. const char* json =
  1564. "{\"hello\" : /* Multiline comment starts here\n"
  1565. " continues here\n"
  1566. " and ends here */\"world\", \"t\" :true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1567. StringStream s(json);
  1568. ParseObjectHandler h;
  1569. Reader reader;
  1570. EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
  1571. }
  1572. }
  1573. TEST(Reader, OnelineCommentsAreDisabledByDefault) {
  1574. const char* json = "{// One-line comment\n\"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1575. StringStream s(json);
  1576. ParseObjectHandler h;
  1577. Reader reader;
  1578. EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
  1579. }
  1580. TEST(Reader, EofAfterOneLineComment) {
  1581. const char* json = "{\"hello\" : \"world\" // EOF is here -->\0 \n}";
  1582. StringStream s(json);
  1583. ParseObjectHandler h;
  1584. Reader reader;
  1585. EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
  1586. EXPECT_EQ(kParseErrorObjectMissCommaOrCurlyBracket, reader.GetParseErrorCode());
  1587. }
  1588. TEST(Reader, IncompleteMultilineComment) {
  1589. const char* json = "{\"hello\" : \"world\" /* EOF is here -->\0 */}";
  1590. StringStream s(json);
  1591. ParseObjectHandler h;
  1592. Reader reader;
  1593. EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
  1594. EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
  1595. }
  1596. TEST(Reader, IncompleteMultilineComment2) {
  1597. const char* json = "{\"hello\" : \"world\" /* *\0 */}";
  1598. StringStream s(json);
  1599. ParseObjectHandler h;
  1600. Reader reader;
  1601. EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
  1602. EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
  1603. }
  1604. TEST(Reader, UnrecognizedComment) {
  1605. const char* json = "{\"hello\" : \"world\" /! }";
  1606. StringStream s(json);
  1607. ParseObjectHandler h;
  1608. Reader reader;
  1609. EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
  1610. EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
  1611. }
  1612. struct NumbersAsStringsHandler {
  1613. bool Null() { return true; }
  1614. bool Bool(bool) { return true; }
  1615. bool Int(int) { return true; }
  1616. bool Uint(unsigned) { return true; }
  1617. bool Int64(int64_t) { return true; }
  1618. bool Uint64(uint64_t) { return true; }
  1619. bool Double(double) { return true; }
  1620. // 'str' is not null-terminated
  1621. bool RawNumber(const char* str, SizeType length, bool) {
  1622. EXPECT_TRUE(str != 0);
  1623. EXPECT_TRUE(expected_len_ == length);
  1624. EXPECT_TRUE(strncmp(str, expected_, length) == 0);
  1625. return true;
  1626. }
  1627. bool String(const char*, SizeType, bool) { return true; }
  1628. bool StartObject() { return true; }
  1629. bool Key(const char*, SizeType, bool) { return true; }
  1630. bool EndObject(SizeType) { return true; }
  1631. bool StartArray() { return true; }
  1632. bool EndArray(SizeType) { return true; }
  1633. NumbersAsStringsHandler(const char* expected)
  1634. : expected_(expected)
  1635. , expected_len_(strlen(expected)) {}
  1636. const char* expected_;
  1637. size_t expected_len_;
  1638. };
  1639. TEST(Reader, NumbersAsStrings) {
  1640. {
  1641. const char* json = "{ \"pi\": 3.1416 } ";
  1642. StringStream s(json);
  1643. NumbersAsStringsHandler h("3.1416");
  1644. Reader reader;
  1645. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
  1646. }
  1647. {
  1648. char* json = StrDup("{ \"pi\": 3.1416 } ");
  1649. InsituStringStream s(json);
  1650. NumbersAsStringsHandler h("3.1416");
  1651. Reader reader;
  1652. EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
  1653. free(json);
  1654. }
  1655. {
  1656. const char* json = "{ \"gigabyte\": 1.0e9 } ";
  1657. StringStream s(json);
  1658. NumbersAsStringsHandler h("1.0e9");
  1659. Reader reader;
  1660. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
  1661. }
  1662. {
  1663. char* json = StrDup("{ \"gigabyte\": 1.0e9 } ");
  1664. InsituStringStream s(json);
  1665. NumbersAsStringsHandler h("1.0e9");
  1666. Reader reader;
  1667. EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
  1668. free(json);
  1669. }
  1670. {
  1671. const char* json = "{ \"pi\": 314.159e-2 } ";
  1672. StringStream s(json);
  1673. NumbersAsStringsHandler h("314.159e-2");
  1674. Reader reader;
  1675. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
  1676. }
  1677. {
  1678. char* json = StrDup("{ \"gigabyte\": 314.159e-2 } ");
  1679. InsituStringStream s(json);
  1680. NumbersAsStringsHandler h("314.159e-2");
  1681. Reader reader;
  1682. EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
  1683. free(json);
  1684. }
  1685. {
  1686. const char* json = "{ \"negative\": -1.54321 } ";
  1687. StringStream s(json);
  1688. NumbersAsStringsHandler h("-1.54321");
  1689. Reader reader;
  1690. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
  1691. }
  1692. {
  1693. char* json = StrDup("{ \"negative\": -1.54321 } ");
  1694. InsituStringStream s(json);
  1695. NumbersAsStringsHandler h("-1.54321");
  1696. Reader reader;
  1697. EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
  1698. free(json);
  1699. }
  1700. {
  1701. const char* json = "{ \"pi\": 314.159e-2 } ";
  1702. std::stringstream ss(json);
  1703. IStreamWrapper s(ss);
  1704. NumbersAsStringsHandler h("314.159e-2");
  1705. Reader reader;
  1706. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
  1707. }
  1708. {
  1709. char n1e319[321]; // '1' followed by 319 '0'
  1710. n1e319[0] = '1';
  1711. for (int i = 1; i < 320; i++)
  1712. n1e319[i] = '0';
  1713. n1e319[320] = '\0';
  1714. StringStream s(n1e319);
  1715. NumbersAsStringsHandler h(n1e319);
  1716. Reader reader;
  1717. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
  1718. }
  1719. }
  1720. template <unsigned extraFlags>
  1721. void TestTrailingCommas() {
  1722. {
  1723. StringStream s("[1,2,3,]");
  1724. ParseArrayHandler<3> h;
  1725. Reader reader;
  1726. EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
  1727. EXPECT_EQ(5u, h.step_);
  1728. }
  1729. {
  1730. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
  1731. "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3],}";
  1732. StringStream s(json);
  1733. ParseObjectHandler h;
  1734. Reader reader;
  1735. EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
  1736. EXPECT_EQ(20u, h.step_);
  1737. }
  1738. {
  1739. // whitespace around trailing commas
  1740. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
  1741. "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3\n,\n]\n,\n} ";
  1742. StringStream s(json);
  1743. ParseObjectHandler h;
  1744. Reader reader;
  1745. EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
  1746. EXPECT_EQ(20u, h.step_);
  1747. }
  1748. {
  1749. // comments around trailing commas
  1750. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null,"
  1751. "\"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3/*test*/,/*test*/]/*test*/,/*test*/}";
  1752. StringStream s(json);
  1753. ParseObjectHandler h;
  1754. Reader reader;
  1755. EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag|kParseCommentsFlag>(s, h));
  1756. EXPECT_EQ(20u, h.step_);
  1757. }
  1758. }
  1759. TEST(Reader, TrailingCommas) {
  1760. TestTrailingCommas<kParseNoFlags>();
  1761. }
  1762. TEST(Reader, TrailingCommasIterative) {
  1763. TestTrailingCommas<kParseIterativeFlag>();
  1764. }
  1765. template <unsigned extraFlags>
  1766. void TestMultipleTrailingCommaErrors() {
  1767. // only a single trailing comma is allowed.
  1768. {
  1769. StringStream s("[1,2,3,,]");
  1770. ParseArrayHandler<3> h;
  1771. Reader reader;
  1772. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1773. EXPECT_TRUE(reader.HasParseError());
  1774. EXPECT_EQ(kParseErrorValueInvalid, r.Code());
  1775. EXPECT_EQ(7u, r.Offset());
  1776. }
  1777. {
  1778. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
  1779. "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3,],,}";
  1780. StringStream s(json);
  1781. ParseObjectHandler h;
  1782. Reader reader;
  1783. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1784. EXPECT_TRUE(reader.HasParseError());
  1785. EXPECT_EQ(kParseErrorObjectMissName, r.Code());
  1786. EXPECT_EQ(95u, r.Offset());
  1787. }
  1788. }
  1789. TEST(Reader, MultipleTrailingCommaErrors) {
  1790. TestMultipleTrailingCommaErrors<kParseNoFlags>();
  1791. }
  1792. TEST(Reader, MultipleTrailingCommaErrorsIterative) {
  1793. TestMultipleTrailingCommaErrors<kParseIterativeFlag>();
  1794. }
  1795. template <unsigned extraFlags>
  1796. void TestEmptyExceptForCommaErrors() {
  1797. // not allowed even with trailing commas enabled; the
  1798. // trailing comma must follow a value.
  1799. {
  1800. StringStream s("[,]");
  1801. ParseArrayHandler<3> h;
  1802. Reader reader;
  1803. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1804. EXPECT_TRUE(reader.HasParseError());
  1805. EXPECT_EQ(kParseErrorValueInvalid, r.Code());
  1806. EXPECT_EQ(1u, r.Offset());
  1807. }
  1808. {
  1809. StringStream s("{,}");
  1810. ParseObjectHandler h;
  1811. Reader reader;
  1812. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1813. EXPECT_TRUE(reader.HasParseError());
  1814. EXPECT_EQ(kParseErrorObjectMissName, r.Code());
  1815. EXPECT_EQ(1u, r.Offset());
  1816. }
  1817. }
  1818. TEST(Reader, EmptyExceptForCommaErrors) {
  1819. TestEmptyExceptForCommaErrors<kParseNoFlags>();
  1820. }
  1821. TEST(Reader, EmptyExceptForCommaErrorsIterative) {
  1822. TestEmptyExceptForCommaErrors<kParseIterativeFlag>();
  1823. }
  1824. template <unsigned extraFlags>
  1825. void TestTrailingCommaHandlerTermination() {
  1826. {
  1827. HandlerTerminateAtEndArray h;
  1828. Reader reader;
  1829. StringStream s("[1,2,3,]");
  1830. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1831. EXPECT_TRUE(reader.HasParseError());
  1832. EXPECT_EQ(kParseErrorTermination, r.Code());
  1833. EXPECT_EQ(7u, r.Offset());
  1834. }
  1835. {
  1836. HandlerTerminateAtEndObject h;
  1837. Reader reader;
  1838. StringStream s("{\"t\": true, \"f\": false,}");
  1839. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1840. EXPECT_TRUE(reader.HasParseError());
  1841. EXPECT_EQ(kParseErrorTermination, r.Code());
  1842. EXPECT_EQ(23u, r.Offset());
  1843. }
  1844. }
  1845. TEST(Reader, TrailingCommaHandlerTermination) {
  1846. TestTrailingCommaHandlerTermination<kParseNoFlags>();
  1847. }
  1848. TEST(Reader, TrailingCommaHandlerTerminationIterative) {
  1849. TestTrailingCommaHandlerTermination<kParseIterativeFlag>();
  1850. }
  1851. TEST(Reader, ParseNanAndInfinity) {
  1852. #define TEST_NAN_INF(str, x) \
  1853. { \
  1854. { \
  1855. StringStream s(str); \
  1856. ParseDoubleHandler h; \
  1857. Reader reader; \
  1858. ASSERT_EQ(kParseErrorNone, reader.Parse<kParseNanAndInfFlag>(s, h).Code()); \
  1859. EXPECT_EQ(1u, h.step_); \
  1860. internal::Double e(x), a(h.actual_); \
  1861. EXPECT_EQ(e.IsNan(), a.IsNan()); \
  1862. EXPECT_EQ(e.IsInf(), a.IsInf()); \
  1863. if (!e.IsNan()) \
  1864. EXPECT_EQ(e.Sign(), a.Sign()); \
  1865. } \
  1866. { \
  1867. const char* json = "{ \"naninfdouble\": " str " } "; \
  1868. StringStream s(json); \
  1869. NumbersAsStringsHandler h(str); \
  1870. Reader reader; \
  1871. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \
  1872. } \
  1873. { \
  1874. char* json = StrDup("{ \"naninfdouble\": " str " } "); \
  1875. InsituStringStream s(json); \
  1876. NumbersAsStringsHandler h(str); \
  1877. Reader reader; \
  1878. EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \
  1879. free(json); \
  1880. } \
  1881. }
  1882. #define TEST_NAN_INF_ERROR(errorCode, str, errorOffset) \
  1883. { \
  1884. unsigned streamPos = errorOffset; \
  1885. char buffer[1001]; \
  1886. strncpy(buffer, str, 1000); \
  1887. InsituStringStream s(buffer); \
  1888. BaseReaderHandler<> h; \
  1889. Reader reader; \
  1890. EXPECT_FALSE(reader.Parse<kParseNanAndInfFlag>(s, h)); \
  1891. EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
  1892. EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
  1893. EXPECT_EQ(streamPos, s.Tell());\
  1894. }
  1895. double nan = std::numeric_limits<double>::quiet_NaN();
  1896. double inf = std::numeric_limits<double>::infinity();
  1897. TEST_NAN_INF("NaN", nan);
  1898. TEST_NAN_INF("-NaN", nan);
  1899. TEST_NAN_INF("Inf", inf);
  1900. TEST_NAN_INF("Infinity", inf);
  1901. TEST_NAN_INF("-Inf", -inf);
  1902. TEST_NAN_INF("-Infinity", -inf);
  1903. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NInf", 1u);
  1904. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NaInf", 2u);
  1905. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "INan", 1u);
  1906. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "InNan", 2u);
  1907. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "nan", 1u);
  1908. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-nan", 1u);
  1909. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NAN", 1u);
  1910. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-Infinty", 6u);
  1911. #undef TEST_NAN_INF_ERROR
  1912. #undef TEST_NAN_INF
  1913. }
  1914. TEST(Reader, EscapedApostrophe) {
  1915. const char json[] = " { \"foo\": \"bar\\'buzz\" } ";
  1916. BaseReaderHandler<> h;
  1917. {
  1918. StringStream s(json);
  1919. Reader reader;
  1920. ParseResult r = reader.Parse<kParseNoFlags>(s, h);
  1921. EXPECT_TRUE(reader.HasParseError());
  1922. EXPECT_EQ(kParseErrorStringEscapeInvalid, r.Code());
  1923. EXPECT_EQ(14u, r.Offset());
  1924. }
  1925. {
  1926. StringStream s(json);
  1927. Reader reader;
  1928. ParseResult r = reader.Parse<kParseEscapedApostropheFlag>(s, h);
  1929. EXPECT_FALSE(reader.HasParseError());
  1930. EXPECT_EQ(kParseErrorNone, r.Code());
  1931. EXPECT_EQ(0u, r.Offset());
  1932. }
  1933. }
  1934. RAPIDJSON_DIAG_POP