readertest.cpp 72 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895
  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, "1.0", 1.0);
  176. TEST_DOUBLE(fullPrecision, "-1.0", -1.0);
  177. TEST_DOUBLE(fullPrecision, "1.5", 1.5);
  178. TEST_DOUBLE(fullPrecision, "-1.5", -1.5);
  179. TEST_DOUBLE(fullPrecision, "3.1416", 3.1416);
  180. TEST_DOUBLE(fullPrecision, "1E10", 1E10);
  181. TEST_DOUBLE(fullPrecision, "1e10", 1e10);
  182. TEST_DOUBLE(fullPrecision, "1E+10", 1E+10);
  183. TEST_DOUBLE(fullPrecision, "1E-10", 1E-10);
  184. TEST_DOUBLE(fullPrecision, "-1E10", -1E10);
  185. TEST_DOUBLE(fullPrecision, "-1e10", -1e10);
  186. TEST_DOUBLE(fullPrecision, "-1E+10", -1E+10);
  187. TEST_DOUBLE(fullPrecision, "-1E-10", -1E-10);
  188. TEST_DOUBLE(fullPrecision, "1.234E+10", 1.234E+10);
  189. TEST_DOUBLE(fullPrecision, "1.234E-10", 1.234E-10);
  190. TEST_DOUBLE(fullPrecision, "1.79769e+308", 1.79769e+308);
  191. TEST_DOUBLE(fullPrecision, "2.22507e-308", 2.22507e-308);
  192. TEST_DOUBLE(fullPrecision, "-1.79769e+308", -1.79769e+308);
  193. TEST_DOUBLE(fullPrecision, "-2.22507e-308", -2.22507e-308);
  194. TEST_DOUBLE(fullPrecision, "4.9406564584124654e-324", 4.9406564584124654e-324); // minimum denormal
  195. TEST_DOUBLE(fullPrecision, "2.2250738585072009e-308", 2.2250738585072009e-308); // Max subnormal double
  196. TEST_DOUBLE(fullPrecision, "2.2250738585072014e-308", 2.2250738585072014e-308); // Min normal positive double
  197. TEST_DOUBLE(fullPrecision, "1.7976931348623157e+308", 1.7976931348623157e+308); // Max double
  198. TEST_DOUBLE(fullPrecision, "1e-10000", 0.0); // must underflow
  199. TEST_DOUBLE(fullPrecision, "18446744073709551616", 18446744073709551616.0); // 2^64 (max of uint64_t + 1, force to use double)
  200. TEST_DOUBLE(fullPrecision, "-9223372036854775809", -9223372036854775809.0); // -2^63 - 1(min of int64_t + 1, force to use double)
  201. TEST_DOUBLE(fullPrecision, "0.9868011474609375", 0.9868011474609375); // https://github.com/Tencent/rapidjson/issues/120
  202. TEST_DOUBLE(fullPrecision, "123e34", 123e34); // Fast Path Cases In Disguise
  203. TEST_DOUBLE(fullPrecision, "45913141877270640000.0", 45913141877270640000.0);
  204. TEST_DOUBLE(fullPrecision, "2.2250738585072011e-308", 2.2250738585072011e-308); // http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
  205. TEST_DOUBLE(fullPrecision, "1e-00011111111111", 0.0); // Issue #313
  206. TEST_DOUBLE(fullPrecision, "-1e-00011111111111", -0.0);
  207. TEST_DOUBLE(fullPrecision, "1e-214748363", 0.0); // Maximum supported negative exponent
  208. TEST_DOUBLE(fullPrecision, "1e-214748364", 0.0);
  209. TEST_DOUBLE(fullPrecision, "1e-21474836311", 0.0);
  210. TEST_DOUBLE(fullPrecision, "0.017976931348623157e+310", 1.7976931348623157e+308); // Max double in another form
  211. // Since
  212. // abs((2^-1022 - 2^-1074) - 2.2250738585072012e-308) = 3.109754131239141401123495768877590405345064751974375599... x 10^-324
  213. // abs((2^-1022) - 2.2250738585072012e-308) = 1.830902327173324040642192159804623318305533274168872044... x 10 ^ -324
  214. // So 2.2250738585072012e-308 should round to 2^-1022 = 2.2250738585072014e-308
  215. TEST_DOUBLE(fullPrecision, "2.2250738585072012e-308", 2.2250738585072014e-308); // http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
  216. // More closer to normal/subnormal boundary
  217. // boundary = 2^-1022 - 2^-1075 = 2.225073858507201136057409796709131975934819546351645648... x 10^-308
  218. TEST_DOUBLE(fullPrecision, "2.22507385850720113605740979670913197593481954635164564e-308", 2.2250738585072009e-308);
  219. TEST_DOUBLE(fullPrecision, "2.22507385850720113605740979670913197593481954635164565e-308", 2.2250738585072014e-308);
  220. // 1.0 is in (1.0 - 2^-54, 1.0 + 2^-53)
  221. // 1.0 - 2^-54 = 0.999999999999999944488848768742172978818416595458984375
  222. TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984375", 1.0); // round to even
  223. TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984374", 0.99999999999999989); // previous double
  224. TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984376", 1.0); // next double
  225. // 1.0 + 2^-53 = 1.00000000000000011102230246251565404236316680908203125
  226. TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203125", 1.0); // round to even
  227. TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203124", 1.0); // previous double
  228. TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203126", 1.00000000000000022); // next double
  229. // Numbers from https://github.com/floitsch/double-conversion/blob/master/test/cctest/test-strtod.cc
  230. TEST_DOUBLE(fullPrecision, "72057594037927928.0", 72057594037927928.0);
  231. TEST_DOUBLE(fullPrecision, "72057594037927936.0", 72057594037927936.0);
  232. TEST_DOUBLE(fullPrecision, "72057594037927932.0", 72057594037927936.0);
  233. TEST_DOUBLE(fullPrecision, "7205759403792793199999e-5", 72057594037927928.0);
  234. TEST_DOUBLE(fullPrecision, "7205759403792793200001e-5", 72057594037927936.0);
  235. TEST_DOUBLE(fullPrecision, "9223372036854774784.0", 9223372036854774784.0);
  236. TEST_DOUBLE(fullPrecision, "9223372036854775808.0", 9223372036854775808.0);
  237. TEST_DOUBLE(fullPrecision, "9223372036854775296.0", 9223372036854775808.0);
  238. TEST_DOUBLE(fullPrecision, "922337203685477529599999e-5", 9223372036854774784.0);
  239. TEST_DOUBLE(fullPrecision, "922337203685477529600001e-5", 9223372036854775808.0);
  240. TEST_DOUBLE(fullPrecision, "10141204801825834086073718800384", 10141204801825834086073718800384.0);
  241. TEST_DOUBLE(fullPrecision, "10141204801825835211973625643008", 10141204801825835211973625643008.0);
  242. TEST_DOUBLE(fullPrecision, "10141204801825834649023672221696", 10141204801825835211973625643008.0);
  243. TEST_DOUBLE(fullPrecision, "1014120480182583464902367222169599999e-5", 10141204801825834086073718800384.0);
  244. TEST_DOUBLE(fullPrecision, "1014120480182583464902367222169600001e-5", 10141204801825835211973625643008.0);
  245. TEST_DOUBLE(fullPrecision, "5708990770823838890407843763683279797179383808", 5708990770823838890407843763683279797179383808.0);
  246. TEST_DOUBLE(fullPrecision, "5708990770823839524233143877797980545530986496", 5708990770823839524233143877797980545530986496.0);
  247. TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185152", 5708990770823839524233143877797980545530986496.0);
  248. TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185151999e-3", 5708990770823838890407843763683279797179383808.0);
  249. TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185152001e-3", 5708990770823839524233143877797980545530986496.0);
  250. {
  251. char n1e308[310]; // '1' followed by 308 '0'
  252. n1e308[0] = '1';
  253. for (int i = 1; i < 309; i++)
  254. n1e308[i] = '0';
  255. n1e308[309] = '\0';
  256. TEST_DOUBLE(fullPrecision, n1e308, 1E308);
  257. }
  258. // Cover trimming
  259. TEST_DOUBLE(fullPrecision,
  260. "2.22507385850720113605740979670913197593481954635164564802342610972482222202107694551652952390813508"
  261. "7914149158913039621106870086438694594645527657207407820621743379988141063267329253552286881372149012"
  262. "9811224514518898490572223072852551331557550159143974763979834118019993239625482890171070818506906306"
  263. "6665599493827577257201576306269066333264756530000924588831643303777979186961204949739037782970490505"
  264. "1080609940730262937128958950003583799967207254304360284078895771796150945516748243471030702609144621"
  265. "5722898802581825451803257070188608721131280795122334262883686223215037756666225039825343359745688844"
  266. "2390026549819838548794829220689472168983109969836584681402285424333066033985088644580400103493397042"
  267. "7567186443383770486037861622771738545623065874679014086723327636718751234567890123456789012345678901"
  268. "e-308",
  269. 2.2250738585072014e-308);
  270. {
  271. static const unsigned count = 100; // Tested with 1000000 locally
  272. Random r;
  273. Reader reader; // Reusing reader to prevent heap allocation
  274. // Exhaustively test different exponents with random significant
  275. for (uint64_t exp = 0; exp < 2047; exp++) {
  276. ;
  277. for (unsigned i = 0; i < count; i++) {
  278. // Need to call r() in two statements for cross-platform coherent sequence.
  279. uint64_t u = (exp << 52) | uint64_t(r() & 0x000FFFFF) << 32;
  280. u |= uint64_t(r());
  281. internal::Double d = internal::Double(u);
  282. char buffer[32];
  283. *internal::dtoa(d.Value(), buffer) = '\0';
  284. StringStream s(buffer);
  285. ParseDoubleHandler h;
  286. ASSERT_EQ(kParseErrorNone, reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h).Code());
  287. EXPECT_EQ(1u, h.step_);
  288. internal::Double a(h.actual_);
  289. if (fullPrecision) {
  290. EXPECT_EQ(d.Uint64Value(), a.Uint64Value());
  291. if (d.Uint64Value() != a.Uint64Value())
  292. printf(" String: %s\n Actual: %.17g\nExpected: %.17g\n", buffer, h.actual_, d.Value());
  293. }
  294. else {
  295. EXPECT_EQ(d.Sign(), a.Sign()); // for 0.0 != -0.0
  296. EXPECT_DOUBLE_EQ(d.Value(), h.actual_);
  297. }
  298. }
  299. }
  300. }
  301. // Issue #340
  302. TEST_DOUBLE(fullPrecision, "7.450580596923828e-9", 7.450580596923828e-9);
  303. {
  304. internal::Double d(1.0);
  305. for (int i = 0; i < 324; i++) {
  306. char buffer[32];
  307. *internal::dtoa(d.Value(), buffer) = '\0';
  308. StringStream s(buffer);
  309. ParseDoubleHandler h;
  310. Reader reader;
  311. ASSERT_EQ(kParseErrorNone, reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h).Code());
  312. EXPECT_EQ(1u, h.step_);
  313. internal::Double a(h.actual_);
  314. if (fullPrecision) {
  315. EXPECT_EQ(d.Uint64Value(), a.Uint64Value());
  316. if (d.Uint64Value() != a.Uint64Value())
  317. printf(" String: %s\n Actual: %.17g\nExpected: %.17g\n", buffer, h.actual_, d.Value());
  318. }
  319. else {
  320. EXPECT_EQ(d.Sign(), a.Sign()); // for 0.0 != -0.0
  321. EXPECT_DOUBLE_EQ(d.Value(), h.actual_);
  322. }
  323. d = d.Value() * 0.5;
  324. }
  325. }
  326. #undef TEST_DOUBLE
  327. }
  328. TEST(Reader, ParseNumber_NormalPrecisionDouble) {
  329. TestParseDouble<false>();
  330. }
  331. TEST(Reader, ParseNumber_FullPrecisionDouble) {
  332. TestParseDouble<true>();
  333. }
  334. TEST(Reader, ParseNumber_NormalPrecisionError) {
  335. static unsigned count = 1000000;
  336. Random r;
  337. double ulpSum = 0.0;
  338. double ulpMax = 0.0;
  339. for (unsigned i = 0; i < count; i++) {
  340. internal::Double e, a;
  341. do {
  342. // Need to call r() in two statements for cross-platform coherent sequence.
  343. uint64_t u = uint64_t(r()) << 32;
  344. u |= uint64_t(r());
  345. e = u;
  346. } while (e.IsNan() || e.IsInf() || !e.IsNormal());
  347. char buffer[32];
  348. *internal::dtoa(e.Value(), buffer) = '\0';
  349. StringStream s(buffer);
  350. ParseDoubleHandler h;
  351. Reader reader;
  352. ASSERT_EQ(kParseErrorNone, reader.Parse(s, h).Code());
  353. EXPECT_EQ(1u, h.step_);
  354. a = h.actual_;
  355. uint64_t bias1 = e.ToBias();
  356. uint64_t bias2 = a.ToBias();
  357. double ulp = static_cast<double>(bias1 >= bias2 ? bias1 - bias2 : bias2 - bias1);
  358. ulpMax = (std::max)(ulpMax, ulp);
  359. ulpSum += ulp;
  360. }
  361. printf("ULP Average = %g, Max = %g \n", ulpSum / count, ulpMax);
  362. }
  363. TEST(Reader, ParseNumber_Error) {
  364. #define TEST_NUMBER_ERROR(errorCode, str, errorOffset, streamPos) \
  365. { \
  366. char buffer[1001]; \
  367. sprintf(buffer, "%s", str); \
  368. InsituStringStream s(buffer); \
  369. BaseReaderHandler<> h; \
  370. Reader reader; \
  371. EXPECT_FALSE(reader.Parse(s, h)); \
  372. EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
  373. EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
  374. EXPECT_EQ(streamPos, s.Tell());\
  375. }
  376. // Number too big to be stored in double.
  377. {
  378. char n1e309[311]; // '1' followed by 309 '0'
  379. n1e309[0] = '1';
  380. for (int i = 1; i < 310; i++)
  381. n1e309[i] = '0';
  382. n1e309[310] = '\0';
  383. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, n1e309, 0, 309);
  384. }
  385. TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e309", 0, 5);
  386. // Miss fraction part in number.
  387. TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.", 2, 2);
  388. TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.a", 2, 2);
  389. // Miss exponent in number.
  390. TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e", 2, 2);
  391. TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e_", 2, 2);
  392. #undef TEST_NUMBER_ERROR
  393. }
  394. template <typename Encoding>
  395. struct ParseStringHandler : BaseReaderHandler<Encoding, ParseStringHandler<Encoding> > {
  396. ParseStringHandler() : str_(0), length_(0), copy_() {}
  397. ~ParseStringHandler() { EXPECT_TRUE(str_ != 0); if (copy_) free(const_cast<typename Encoding::Ch*>(str_)); }
  398. ParseStringHandler(const ParseStringHandler&);
  399. ParseStringHandler& operator=(const ParseStringHandler&);
  400. bool Default() { ADD_FAILURE(); return false; }
  401. bool String(const typename Encoding::Ch* str, size_t length, bool copy) {
  402. EXPECT_EQ(0, str_);
  403. if (copy) {
  404. str_ = static_cast<typename Encoding::Ch*>(malloc((length + 1) * sizeof(typename Encoding::Ch)));
  405. memcpy(const_cast<typename Encoding::Ch*>(str_), str, (length + 1) * sizeof(typename Encoding::Ch));
  406. }
  407. else
  408. str_ = str;
  409. length_ = length;
  410. copy_ = copy;
  411. return true;
  412. }
  413. const typename Encoding::Ch* str_;
  414. size_t length_;
  415. bool copy_;
  416. };
  417. TEST(Reader, ParseString) {
  418. #define TEST_STRING(Encoding, e, x) \
  419. { \
  420. Encoding::Ch* buffer = StrDup(x); \
  421. GenericInsituStringStream<Encoding> is(buffer); \
  422. ParseStringHandler<Encoding> h; \
  423. GenericReader<Encoding, Encoding> reader; \
  424. reader.Parse<kParseInsituFlag | kParseValidateEncodingFlag>(is, h); \
  425. EXPECT_EQ(0, StrCmp<Encoding::Ch>(e, h.str_)); \
  426. EXPECT_EQ(StrLen(e), h.length_); \
  427. free(buffer); \
  428. GenericStringStream<Encoding> s(x); \
  429. ParseStringHandler<Encoding> h2; \
  430. GenericReader<Encoding, Encoding> reader2; \
  431. reader2.Parse(s, h2); \
  432. EXPECT_EQ(0, StrCmp<Encoding::Ch>(e, h2.str_)); \
  433. EXPECT_EQ(StrLen(e), h2.length_); \
  434. }
  435. // String constant L"\xXX" can only specify character code in bytes, which is not endianness-neutral.
  436. // And old compiler does not support u"" and U"" string literal. So here specify string literal by array of Ch.
  437. // In addition, GCC 4.8 generates -Wnarrowing warnings when character code >= 128 are assigned to signed integer types.
  438. // Therefore, utype is added for declaring unsigned array, and then cast it to Encoding::Ch.
  439. #define ARRAY(...) { __VA_ARGS__ }
  440. #define TEST_STRINGARRAY(Encoding, utype, array, x) \
  441. { \
  442. static const utype ue[] = array; \
  443. static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
  444. TEST_STRING(Encoding, e, x); \
  445. }
  446. #define TEST_STRINGARRAY2(Encoding, utype, earray, xarray) \
  447. { \
  448. static const utype ue[] = earray; \
  449. static const utype xe[] = xarray; \
  450. static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
  451. static const Encoding::Ch* x = reinterpret_cast<const Encoding::Ch *>(&xe[0]); \
  452. TEST_STRING(Encoding, e, x); \
  453. }
  454. TEST_STRING(UTF8<>, "", "\"\"");
  455. TEST_STRING(UTF8<>, "Hello", "\"Hello\"");
  456. TEST_STRING(UTF8<>, "Hello\nWorld", "\"Hello\\nWorld\"");
  457. TEST_STRING(UTF8<>, "\"\\/\b\f\n\r\t", "\"\\\"\\\\/\\b\\f\\n\\r\\t\"");
  458. TEST_STRING(UTF8<>, "\x24", "\"\\u0024\""); // Dollar sign U+0024
  459. TEST_STRING(UTF8<>, "\xC2\xA2", "\"\\u00A2\""); // Cents sign U+00A2
  460. TEST_STRING(UTF8<>, "\xE2\x82\xAC", "\"\\u20AC\""); // Euro sign U+20AC
  461. TEST_STRING(UTF8<>, "\xF0\x9D\x84\x9E", "\"\\uD834\\uDD1E\""); // G clef sign U+1D11E
  462. // UTF16
  463. TEST_STRING(UTF16<>, L"", L"\"\"");
  464. TEST_STRING(UTF16<>, L"Hello", L"\"Hello\"");
  465. TEST_STRING(UTF16<>, L"Hello\nWorld", L"\"Hello\\nWorld\"");
  466. TEST_STRING(UTF16<>, L"\"\\/\b\f\n\r\t", L"\"\\\"\\\\/\\b\\f\\n\\r\\t\"");
  467. TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x0024, 0x0000), L"\"\\u0024\"");
  468. TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x00A2, 0x0000), L"\"\\u00A2\""); // Cents sign U+00A2
  469. TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x20AC, 0x0000), L"\"\\u20AC\""); // Euro sign U+20AC
  470. TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0xD834, 0xDD1E, 0x0000), L"\"\\uD834\\uDD1E\""); // G clef sign U+1D11E
  471. // UTF32
  472. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('\0'), ARRAY('\"', '\"', '\0'));
  473. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('H', 'e', 'l', 'l', 'o', '\0'), ARRAY('\"', 'H', 'e', 'l', 'l', 'o', '\"', '\0'));
  474. 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'));
  475. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('\"', '\\', '/', '\b', '\f', '\n', '\r', '\t', '\0'), ARRAY('\"', '\\', '\"', '\\', '\\', '/', '\\', 'b', '\\', 'f', '\\', 'n', '\\', 'r', '\\', 't', '\"', '\0'));
  476. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x00024, 0x0000), ARRAY('\"', '\\', 'u', '0', '0', '2', '4', '\"', '\0'));
  477. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x000A2, 0x0000), ARRAY('\"', '\\', 'u', '0', '0', 'A', '2', '\"', '\0')); // Cents sign U+00A2
  478. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x020AC, 0x0000), ARRAY('\"', '\\', 'u', '2', '0', 'A', 'C', '\"', '\0')); // Euro sign U+20AC
  479. TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x1D11E, 0x0000), ARRAY('\"', '\\', 'u', 'D', '8', '3', '4', '\\', 'u', 'D', 'D', '1', 'E', '\"', '\0')); // G clef sign U+1D11E
  480. #undef TEST_STRINGARRAY
  481. #undef ARRAY
  482. #undef TEST_STRING
  483. // Support of null character in string
  484. {
  485. StringStream s("\"Hello\\u0000World\"");
  486. const char e[] = "Hello\0World";
  487. ParseStringHandler<UTF8<> > h;
  488. Reader reader;
  489. reader.Parse(s, h);
  490. EXPECT_EQ(0, memcmp(e, h.str_, h.length_ + 1));
  491. EXPECT_EQ(11u, h.length_);
  492. }
  493. }
  494. TEST(Reader, ParseString_Transcoding) {
  495. const char* x = "\"Hello\"";
  496. const wchar_t* e = L"Hello";
  497. GenericStringStream<UTF8<> > is(x);
  498. GenericReader<UTF8<>, UTF16<> > reader;
  499. ParseStringHandler<UTF16<> > h;
  500. reader.Parse(is, h);
  501. EXPECT_EQ(0, StrCmp<UTF16<>::Ch>(e, h.str_));
  502. EXPECT_EQ(StrLen(e), h.length_);
  503. }
  504. TEST(Reader, ParseString_TranscodingWithValidation) {
  505. const char* x = "\"Hello\"";
  506. const wchar_t* e = L"Hello";
  507. GenericStringStream<UTF8<> > is(x);
  508. GenericReader<UTF8<>, UTF16<> > reader;
  509. ParseStringHandler<UTF16<> > h;
  510. reader.Parse<kParseValidateEncodingFlag>(is, h);
  511. EXPECT_EQ(0, StrCmp<UTF16<>::Ch>(e, h.str_));
  512. EXPECT_EQ(StrLen(e), h.length_);
  513. }
  514. TEST(Reader, ParseString_NonDestructive) {
  515. StringStream s("\"Hello\\nWorld\"");
  516. ParseStringHandler<UTF8<> > h;
  517. Reader reader;
  518. reader.Parse(s, h);
  519. EXPECT_EQ(0, StrCmp("Hello\nWorld", h.str_));
  520. EXPECT_EQ(11u, h.length_);
  521. }
  522. template <typename Encoding>
  523. ParseErrorCode TestString(const typename Encoding::Ch* str) {
  524. GenericStringStream<Encoding> s(str);
  525. BaseReaderHandler<Encoding> h;
  526. GenericReader<Encoding, Encoding> reader;
  527. reader.template Parse<kParseValidateEncodingFlag>(s, h);
  528. return reader.GetParseErrorCode();
  529. }
  530. TEST(Reader, ParseString_Error) {
  531. #define TEST_STRING_ERROR(errorCode, str, errorOffset, streamPos)\
  532. {\
  533. GenericStringStream<UTF8<> > s(str);\
  534. BaseReaderHandler<UTF8<> > h;\
  535. GenericReader<UTF8<> , UTF8<> > reader;\
  536. reader.Parse<kParseValidateEncodingFlag>(s, h);\
  537. EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
  538. EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
  539. EXPECT_EQ(streamPos, s.Tell());\
  540. }
  541. #define ARRAY(...) { __VA_ARGS__ }
  542. #define TEST_STRINGENCODING_ERROR(Encoding, TargetEncoding, utype, array) \
  543. { \
  544. static const utype ue[] = array; \
  545. static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
  546. EXPECT_EQ(kParseErrorStringInvalidEncoding, TestString<Encoding>(e));\
  547. /* decode error */\
  548. GenericStringStream<Encoding> s(e);\
  549. BaseReaderHandler<TargetEncoding> h;\
  550. GenericReader<Encoding, TargetEncoding> reader;\
  551. reader.Parse(s, h);\
  552. EXPECT_EQ(kParseErrorStringInvalidEncoding, reader.GetParseErrorCode());\
  553. }
  554. // Invalid escape character in string.
  555. TEST_STRING_ERROR(kParseErrorStringEscapeInvalid, "[\"\\a\"]", 2, 3);
  556. // Incorrect hex digit after \\u escape in string.
  557. TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uABCG\"]", 2, 7);
  558. // Quotation in \\u escape in string (Issue #288)
  559. TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uaaa\"]", 2, 7);
  560. TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uD800\\uFFF\"]", 2, 13);
  561. // The surrogate pair in string is invalid.
  562. TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800X\"]", 2, 8);
  563. TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800\\uFFFF\"]", 2, 14);
  564. // Missing a closing quotation mark in string.
  565. TEST_STRING_ERROR(kParseErrorStringMissQuotationMark, "[\"Test]", 7, 7);
  566. // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
  567. // 3 Malformed sequences
  568. // 3.1 Unexpected continuation bytes
  569. {
  570. char e[] = { '[', '\"', 0, '\"', ']', '\0' };
  571. for (unsigned char c = 0x80u; c <= 0xBFu; c++) {
  572. e[2] = static_cast<char>(c);
  573. ParseErrorCode error = TestString<UTF8<> >(e);
  574. EXPECT_EQ(kParseErrorStringInvalidEncoding, error);
  575. if (error != kParseErrorStringInvalidEncoding)
  576. std::cout << static_cast<unsigned>(c) << std::endl;
  577. }
  578. }
  579. // 3.2 Lonely start characters, 3.5 Impossible bytes
  580. {
  581. char e[] = { '[', '\"', 0, ' ', '\"', ']', '\0' };
  582. for (unsigned c = 0xC0u; c <= 0xFFu; c++) {
  583. e[2] = static_cast<char>(c);
  584. int streamPos;
  585. if (c <= 0xC1u)
  586. streamPos = 3; // 0xC0 - 0xC1
  587. else if (c <= 0xDFu)
  588. streamPos = 4; // 0xC2 - 0xDF
  589. else if (c <= 0xEFu)
  590. streamPos = 5; // 0xE0 - 0xEF
  591. else if (c <= 0xF4u)
  592. streamPos = 6; // 0xF0 - 0xF4
  593. else
  594. streamPos = 3; // 0xF5 - 0xFF
  595. TEST_STRING_ERROR(kParseErrorStringInvalidEncoding, e, 2, streamPos);
  596. }
  597. }
  598. // 4 Overlong sequences
  599. // 4.1 Examples of an overlong ASCII character
  600. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0xAFu, '\"', ']', '\0'));
  601. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0xAFu, '\"', ']', '\0'));
  602. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0xAFu, '\"', ']', '\0'));
  603. // 4.2 Maximum overlong sequences
  604. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC1u, 0xBFu, '\"', ']', '\0'));
  605. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x9Fu, 0xBFu, '\"', ']', '\0'));
  606. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x8Fu, 0xBFu, 0xBFu, '\"', ']', '\0'));
  607. // 4.3 Overlong representation of the NUL character
  608. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0x80u, '\"', ']', '\0'));
  609. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0x80u, '\"', ']', '\0'));
  610. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0x80u, '\"', ']', '\0'));
  611. // 5 Illegal code positions
  612. // 5.1 Single UTF-16 surrogates
  613. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xA0u, 0x80u, '\"', ']', '\0'));
  614. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xADu, 0xBFu, '\"', ']', '\0'));
  615. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAEu, 0x80u, '\"', ']', '\0'));
  616. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAFu, 0xBFu, '\"', ']', '\0'));
  617. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xB0u, 0x80u, '\"', ']', '\0'));
  618. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBEu, 0x80u, '\"', ']', '\0'));
  619. TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBFu, 0xBFu, '\"', ']', '\0'));
  620. // Malform UTF-16 sequences
  621. TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xDC00, 0xDC00, '\"', ']', '\0'));
  622. TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xD800, 0xD800, '\"', ']', '\0'));
  623. // Malform UTF-32 sequence
  624. TEST_STRINGENCODING_ERROR(UTF32<>, UTF8<>, unsigned, ARRAY('[', '\"', 0x110000, '\"', ']', '\0'));
  625. // Malform ASCII sequence
  626. TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x80u), '\"', ']', '\0'));
  627. TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x01u), '\"', ']', '\0'));
  628. TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x1Cu), '\"', ']', '\0'));
  629. #undef ARRAY
  630. #undef TEST_STRINGARRAY_ERROR
  631. }
  632. template <unsigned count>
  633. struct ParseArrayHandler : BaseReaderHandler<UTF8<>, ParseArrayHandler<count> > {
  634. ParseArrayHandler() : step_(0) {}
  635. bool Default() { ADD_FAILURE(); return false; }
  636. bool Uint(unsigned i) { EXPECT_EQ(step_, i); step_++; return true; }
  637. bool StartArray() { EXPECT_EQ(0u, step_); step_++; return true; }
  638. bool EndArray(SizeType) { step_++; return true; }
  639. unsigned step_;
  640. };
  641. TEST(Reader, ParseEmptyArray) {
  642. char *json = StrDup("[ ] ");
  643. InsituStringStream s(json);
  644. ParseArrayHandler<0> h;
  645. Reader reader;
  646. reader.Parse(s, h);
  647. EXPECT_EQ(2u, h.step_);
  648. free(json);
  649. }
  650. TEST(Reader, ParseArray) {
  651. char *json = StrDup("[1, 2, 3, 4]");
  652. InsituStringStream s(json);
  653. ParseArrayHandler<4> h;
  654. Reader reader;
  655. reader.Parse(s, h);
  656. EXPECT_EQ(6u, h.step_);
  657. free(json);
  658. }
  659. TEST(Reader, ParseArray_Error) {
  660. #define TEST_ARRAY_ERROR(errorCode, str, errorOffset) \
  661. { \
  662. int streamPos = errorOffset; \
  663. char buffer[1001]; \
  664. strncpy(buffer, str, 1000); \
  665. InsituStringStream s(buffer); \
  666. BaseReaderHandler<> h; \
  667. GenericReader<UTF8<>, UTF8<>, CrtAllocator> reader; \
  668. EXPECT_FALSE(reader.Parse(s, h)); \
  669. EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
  670. EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
  671. EXPECT_EQ(streamPos, s.Tell());\
  672. }
  673. // Missing a comma or ']' after an array element.
  674. TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1", 2);
  675. TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1}", 2);
  676. TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1 2]", 3);
  677. // Array cannot have a trailing comma (without kParseTrailingCommasFlag);
  678. // a value must follow a comma
  679. TEST_ARRAY_ERROR(kParseErrorValueInvalid, "[1,]", 3);
  680. #undef TEST_ARRAY_ERROR
  681. }
  682. struct ParseObjectHandler : BaseReaderHandler<UTF8<>, ParseObjectHandler> {
  683. ParseObjectHandler() : step_(0) {}
  684. bool Default() { ADD_FAILURE(); return false; }
  685. bool Null() { EXPECT_EQ(8u, step_); step_++; return true; }
  686. bool Bool(bool b) {
  687. switch(step_) {
  688. case 4: EXPECT_TRUE(b); step_++; return true;
  689. case 6: EXPECT_FALSE(b); step_++; return true;
  690. default: ADD_FAILURE(); return false;
  691. }
  692. }
  693. bool Int(int i) {
  694. switch(step_) {
  695. case 10: EXPECT_EQ(123, i); step_++; return true;
  696. case 15: EXPECT_EQ(1, i); step_++; return true;
  697. case 16: EXPECT_EQ(2, i); step_++; return true;
  698. case 17: EXPECT_EQ(3, i); step_++; return true;
  699. default: ADD_FAILURE(); return false;
  700. }
  701. }
  702. bool Uint(unsigned i) { return Int(static_cast<int>(i)); }
  703. bool Double(double d) { EXPECT_EQ(12u, step_); EXPECT_DOUBLE_EQ(3.1416, d); step_++; return true; }
  704. bool String(const char* str, size_t, bool) {
  705. switch(step_) {
  706. case 1: EXPECT_STREQ("hello", str); step_++; return true;
  707. case 2: EXPECT_STREQ("world", str); step_++; return true;
  708. case 3: EXPECT_STREQ("t", str); step_++; return true;
  709. case 5: EXPECT_STREQ("f", str); step_++; return true;
  710. case 7: EXPECT_STREQ("n", str); step_++; return true;
  711. case 9: EXPECT_STREQ("i", str); step_++; return true;
  712. case 11: EXPECT_STREQ("pi", str); step_++; return true;
  713. case 13: EXPECT_STREQ("a", str); step_++; return true;
  714. default: ADD_FAILURE(); return false;
  715. }
  716. }
  717. bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
  718. bool EndObject(SizeType memberCount) { EXPECT_EQ(19u, step_); EXPECT_EQ(7u, memberCount); step_++; return true; }
  719. bool StartArray() { EXPECT_EQ(14u, step_); step_++; return true; }
  720. bool EndArray(SizeType elementCount) { EXPECT_EQ(18u, step_); EXPECT_EQ(3u, elementCount); step_++; return true; }
  721. unsigned step_;
  722. };
  723. TEST(Reader, ParseObject) {
  724. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } ";
  725. // Insitu
  726. {
  727. char* json2 = StrDup(json);
  728. InsituStringStream s(json2);
  729. ParseObjectHandler h;
  730. Reader reader;
  731. reader.Parse<kParseInsituFlag>(s, h);
  732. EXPECT_EQ(20u, h.step_);
  733. free(json2);
  734. }
  735. // Normal
  736. {
  737. StringStream s(json);
  738. ParseObjectHandler h;
  739. Reader reader;
  740. reader.Parse(s, h);
  741. EXPECT_EQ(20u, h.step_);
  742. }
  743. }
  744. struct ParseEmptyObjectHandler : BaseReaderHandler<UTF8<>, ParseEmptyObjectHandler> {
  745. ParseEmptyObjectHandler() : step_(0) {}
  746. bool Default() { ADD_FAILURE(); return false; }
  747. bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
  748. bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; }
  749. unsigned step_;
  750. };
  751. TEST(Reader, Parse_EmptyObject) {
  752. StringStream s("{ } ");
  753. ParseEmptyObjectHandler h;
  754. Reader reader;
  755. reader.Parse(s, h);
  756. EXPECT_EQ(2u, h.step_);
  757. }
  758. struct ParseMultipleRootHandler : BaseReaderHandler<UTF8<>, ParseMultipleRootHandler> {
  759. ParseMultipleRootHandler() : step_(0) {}
  760. bool Default() { ADD_FAILURE(); return false; }
  761. bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
  762. bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; }
  763. bool StartArray() { EXPECT_EQ(2u, step_); step_++; return true; }
  764. bool EndArray(SizeType) { EXPECT_EQ(3u, step_); step_++; return true; }
  765. unsigned step_;
  766. };
  767. template <unsigned parseFlags>
  768. void TestMultipleRoot() {
  769. StringStream s("{}[] a");
  770. ParseMultipleRootHandler h;
  771. Reader reader;
  772. EXPECT_TRUE(reader.Parse<parseFlags>(s, h));
  773. EXPECT_EQ(2u, h.step_);
  774. EXPECT_TRUE(reader.Parse<parseFlags>(s, h));
  775. EXPECT_EQ(4u, h.step_);
  776. EXPECT_EQ(' ', s.Take());
  777. EXPECT_EQ('a', s.Take());
  778. }
  779. TEST(Reader, Parse_MultipleRoot) {
  780. TestMultipleRoot<kParseStopWhenDoneFlag>();
  781. }
  782. TEST(Reader, ParseIterative_MultipleRoot) {
  783. TestMultipleRoot<kParseIterativeFlag | kParseStopWhenDoneFlag>();
  784. }
  785. template <unsigned parseFlags>
  786. void TestInsituMultipleRoot() {
  787. char* buffer = strdup("{}[] a");
  788. InsituStringStream s(buffer);
  789. ParseMultipleRootHandler h;
  790. Reader reader;
  791. EXPECT_TRUE(reader.Parse<kParseInsituFlag | parseFlags>(s, h));
  792. EXPECT_EQ(2u, h.step_);
  793. EXPECT_TRUE(reader.Parse<kParseInsituFlag | parseFlags>(s, h));
  794. EXPECT_EQ(4u, h.step_);
  795. EXPECT_EQ(' ', s.Take());
  796. EXPECT_EQ('a', s.Take());
  797. free(buffer);
  798. }
  799. TEST(Reader, ParseInsitu_MultipleRoot) {
  800. TestInsituMultipleRoot<kParseStopWhenDoneFlag>();
  801. }
  802. TEST(Reader, ParseInsituIterative_MultipleRoot) {
  803. TestInsituMultipleRoot<kParseIterativeFlag | kParseStopWhenDoneFlag>();
  804. }
  805. #define TEST_ERROR(errorCode, str, errorOffset) \
  806. { \
  807. int streamPos = errorOffset; \
  808. char buffer[1001]; \
  809. strncpy(buffer, str, 1000); \
  810. InsituStringStream s(buffer); \
  811. BaseReaderHandler<> h; \
  812. Reader reader; \
  813. EXPECT_FALSE(reader.Parse(s, h)); \
  814. EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
  815. EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
  816. EXPECT_EQ(streamPos, s.Tell());\
  817. }
  818. TEST(Reader, ParseDocument_Error) {
  819. // The document is empty.
  820. TEST_ERROR(kParseErrorDocumentEmpty, "", 0);
  821. TEST_ERROR(kParseErrorDocumentEmpty, " ", 1);
  822. TEST_ERROR(kParseErrorDocumentEmpty, " \n", 2);
  823. // The document root must not follow by other values.
  824. TEST_ERROR(kParseErrorDocumentRootNotSingular, "[] 0", 3);
  825. TEST_ERROR(kParseErrorDocumentRootNotSingular, "{} 0", 3);
  826. TEST_ERROR(kParseErrorDocumentRootNotSingular, "null []", 5);
  827. TEST_ERROR(kParseErrorDocumentRootNotSingular, "0 {}", 2);
  828. }
  829. TEST(Reader, ParseValue_Error) {
  830. // Invalid value.
  831. TEST_ERROR(kParseErrorValueInvalid, "nulL", 3);
  832. TEST_ERROR(kParseErrorValueInvalid, "truE", 3);
  833. TEST_ERROR(kParseErrorValueInvalid, "falsE", 4);
  834. TEST_ERROR(kParseErrorValueInvalid, "a]", 0);
  835. TEST_ERROR(kParseErrorValueInvalid, ".1", 0);
  836. }
  837. TEST(Reader, ParseObject_Error) {
  838. // Missing a name for object member.
  839. TEST_ERROR(kParseErrorObjectMissName, "{1}", 1);
  840. TEST_ERROR(kParseErrorObjectMissName, "{:1}", 1);
  841. TEST_ERROR(kParseErrorObjectMissName, "{null:1}", 1);
  842. TEST_ERROR(kParseErrorObjectMissName, "{true:1}", 1);
  843. TEST_ERROR(kParseErrorObjectMissName, "{false:1}", 1);
  844. TEST_ERROR(kParseErrorObjectMissName, "{1:1}", 1);
  845. TEST_ERROR(kParseErrorObjectMissName, "{[]:1}", 1);
  846. TEST_ERROR(kParseErrorObjectMissName, "{{}:1}", 1);
  847. TEST_ERROR(kParseErrorObjectMissName, "{xyz:1}", 1);
  848. // Missing a colon after a name of object member.
  849. TEST_ERROR(kParseErrorObjectMissColon, "{\"a\" 1}", 5);
  850. TEST_ERROR(kParseErrorObjectMissColon, "{\"a\",1}", 4);
  851. // Must be a comma or '}' after an object member
  852. TEST_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, "{\"a\":1]", 6);
  853. // Object cannot have a trailing comma (without kParseTrailingCommasFlag);
  854. // an object member name must follow a comma
  855. TEST_ERROR(kParseErrorObjectMissName, "{\"a\":1,}", 7);
  856. // This tests that MemoryStream is checking the length in Peek().
  857. {
  858. MemoryStream ms("{\"a\"", 1);
  859. BaseReaderHandler<> h;
  860. Reader reader;
  861. EXPECT_FALSE(reader.Parse<kParseStopWhenDoneFlag>(ms, h));
  862. EXPECT_EQ(kParseErrorObjectMissName, reader.GetParseErrorCode());
  863. }
  864. }
  865. #undef TEST_ERROR
  866. TEST(Reader, SkipWhitespace) {
  867. StringStream ss(" A \t\tB\n \n\nC\r\r \rD \t\n\r E");
  868. const char* expected = "ABCDE";
  869. for (size_t i = 0; i < 5; i++) {
  870. SkipWhitespace(ss);
  871. EXPECT_EQ(expected[i], ss.Take());
  872. }
  873. }
  874. // Test implementing a stream without copy stream optimization.
  875. // Clone from GenericStringStream except that copy constructor is disabled.
  876. template <typename Encoding>
  877. class CustomStringStream {
  878. public:
  879. typedef typename Encoding::Ch Ch;
  880. CustomStringStream(const Ch *src) : src_(src), head_(src) {}
  881. Ch Peek() const { return *src_; }
  882. Ch Take() { return *src_++; }
  883. size_t Tell() const { return static_cast<size_t>(src_ - head_); }
  884. Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; }
  885. void Put(Ch) { RAPIDJSON_ASSERT(false); }
  886. void Flush() { RAPIDJSON_ASSERT(false); }
  887. size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; }
  888. private:
  889. // Prohibit copy constructor & assignment operator.
  890. CustomStringStream(const CustomStringStream&);
  891. CustomStringStream& operator=(const CustomStringStream&);
  892. const Ch* src_; //!< Current read position.
  893. const Ch* head_; //!< Original head of the string.
  894. };
  895. // If the following code is compiled, it should generate compilation error as predicted.
  896. // Because CustomStringStream<> is not copyable via making copy constructor private.
  897. #if 0
  898. namespace rapidjson {
  899. template <typename Encoding>
  900. struct StreamTraits<CustomStringStream<Encoding> > {
  901. enum { copyOptimization = 1 };
  902. };
  903. } // namespace rapidjson
  904. #endif
  905. TEST(Reader, CustomStringStream) {
  906. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } ";
  907. CustomStringStream<UTF8<char> > s(json);
  908. ParseObjectHandler h;
  909. Reader reader;
  910. reader.Parse(s, h);
  911. EXPECT_EQ(20u, h.step_);
  912. }
  913. #include <sstream>
  914. class IStreamWrapper {
  915. public:
  916. typedef char Ch;
  917. IStreamWrapper(std::istream& is) : is_(is) {}
  918. Ch Peek() const {
  919. int c = is_.peek();
  920. return c == std::char_traits<char>::eof() ? '\0' : static_cast<Ch>(c);
  921. }
  922. Ch Take() {
  923. int c = is_.get();
  924. return c == std::char_traits<char>::eof() ? '\0' : static_cast<Ch>(c);
  925. }
  926. size_t Tell() const { return static_cast<size_t>(is_.tellg()); }
  927. Ch* PutBegin() { assert(false); return 0; }
  928. void Put(Ch) { assert(false); }
  929. void Flush() { assert(false); }
  930. size_t PutEnd(Ch*) { assert(false); return 0; }
  931. private:
  932. IStreamWrapper(const IStreamWrapper&);
  933. IStreamWrapper& operator=(const IStreamWrapper&);
  934. std::istream& is_;
  935. };
  936. TEST(Reader, Parse_IStreamWrapper_StringStream) {
  937. const char* json = "[1,2,3,4]";
  938. std::stringstream ss(json);
  939. IStreamWrapper is(ss);
  940. Reader reader;
  941. ParseArrayHandler<4> h;
  942. reader.Parse(is, h);
  943. EXPECT_FALSE(reader.HasParseError());
  944. }
  945. // Test iterative parsing.
  946. #define TESTERRORHANDLING(text, errorCode, offset)\
  947. {\
  948. int streamPos = offset; \
  949. StringStream json(text); \
  950. BaseReaderHandler<> handler; \
  951. Reader reader; \
  952. reader.Parse<kParseIterativeFlag>(json, handler); \
  953. EXPECT_TRUE(reader.HasParseError()); \
  954. EXPECT_EQ(errorCode, reader.GetParseErrorCode()); \
  955. EXPECT_EQ(offset, reader.GetErrorOffset()); \
  956. EXPECT_EQ(streamPos, json.Tell()); \
  957. }
  958. TEST(Reader, IterativeParsing_ErrorHandling) {
  959. TESTERRORHANDLING("{\"a\": a}", kParseErrorValueInvalid, 6u);
  960. TESTERRORHANDLING("", kParseErrorDocumentEmpty, 0u);
  961. TESTERRORHANDLING("{}{}", kParseErrorDocumentRootNotSingular, 2u);
  962. TESTERRORHANDLING("{1}", kParseErrorObjectMissName, 1u);
  963. TESTERRORHANDLING("{\"a\", 1}", kParseErrorObjectMissColon, 4u);
  964. TESTERRORHANDLING("{\"a\"}", kParseErrorObjectMissColon, 4u);
  965. TESTERRORHANDLING("{\"a\": 1", kParseErrorObjectMissCommaOrCurlyBracket, 7u);
  966. TESTERRORHANDLING("[1 2 3]", kParseErrorArrayMissCommaOrSquareBracket, 3u);
  967. TESTERRORHANDLING("{\"a: 1", kParseErrorStringMissQuotationMark, 6u);
  968. TESTERRORHANDLING("{\"a\":}", kParseErrorValueInvalid, 5u);
  969. TESTERRORHANDLING("{\"a\":]", kParseErrorValueInvalid, 5u);
  970. TESTERRORHANDLING("[1,2,}", kParseErrorValueInvalid, 5u);
  971. TESTERRORHANDLING("[}]", kParseErrorValueInvalid, 1u);
  972. TESTERRORHANDLING("[,]", kParseErrorValueInvalid, 1u);
  973. TESTERRORHANDLING("[1,,]", kParseErrorValueInvalid, 3u);
  974. // Trailing commas are not allowed without kParseTrailingCommasFlag
  975. TESTERRORHANDLING("{\"a\": 1,}", kParseErrorObjectMissName, 8u);
  976. TESTERRORHANDLING("[1,2,3,]", kParseErrorValueInvalid, 7u);
  977. // Any JSON value can be a valid root element in RFC7159.
  978. TESTERRORHANDLING("\"ab", kParseErrorStringMissQuotationMark, 3u);
  979. TESTERRORHANDLING("truE", kParseErrorValueInvalid, 3u);
  980. TESTERRORHANDLING("False", kParseErrorValueInvalid, 0u);
  981. TESTERRORHANDLING("true, false", kParseErrorDocumentRootNotSingular, 4u);
  982. TESTERRORHANDLING("false, false", kParseErrorDocumentRootNotSingular, 5u);
  983. TESTERRORHANDLING("nulL", kParseErrorValueInvalid, 3u);
  984. TESTERRORHANDLING("null , null", kParseErrorDocumentRootNotSingular, 5u);
  985. TESTERRORHANDLING("1a", kParseErrorDocumentRootNotSingular, 1u);
  986. }
  987. template<typename Encoding = UTF8<> >
  988. struct IterativeParsingReaderHandler {
  989. typedef typename Encoding::Ch Ch;
  990. const static uint32_t LOG_NULL = 0x10000000;
  991. const static uint32_t LOG_BOOL = 0x20000000;
  992. const static uint32_t LOG_INT = 0x30000000;
  993. const static uint32_t LOG_UINT = 0x40000000;
  994. const static uint32_t LOG_INT64 = 0x50000000;
  995. const static uint32_t LOG_UINT64 = 0x60000000;
  996. const static uint32_t LOG_DOUBLE = 0x70000000;
  997. const static uint32_t LOG_STRING = 0x80000000;
  998. const static uint32_t LOG_STARTOBJECT = 0x90000000;
  999. const static uint32_t LOG_KEY = 0xA0000000;
  1000. const static uint32_t LOG_ENDOBJECT = 0xB0000000;
  1001. const static uint32_t LOG_STARTARRAY = 0xC0000000;
  1002. const static uint32_t LOG_ENDARRAY = 0xD0000000;
  1003. const static size_t LogCapacity = 256;
  1004. uint32_t Logs[LogCapacity];
  1005. size_t LogCount;
  1006. IterativeParsingReaderHandler() : LogCount(0) {
  1007. }
  1008. bool Null() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_NULL; return true; }
  1009. bool Bool(bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_BOOL; return true; }
  1010. bool Int(int) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; }
  1011. bool Uint(unsigned) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; }
  1012. bool Int64(int64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT64; return true; }
  1013. bool Uint64(uint64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_UINT64; return true; }
  1014. bool Double(double) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_DOUBLE; return true; }
  1015. bool RawNumber(const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STRING; return true; }
  1016. bool String(const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STRING; return true; }
  1017. bool StartObject() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTOBJECT; return true; }
  1018. bool Key (const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_KEY; return true; }
  1019. bool EndObject(SizeType c) {
  1020. RAPIDJSON_ASSERT(LogCount < LogCapacity);
  1021. RAPIDJSON_ASSERT((static_cast<uint32_t>(c) & 0xF0000000) == 0);
  1022. Logs[LogCount++] = LOG_ENDOBJECT | static_cast<uint32_t>(c);
  1023. return true;
  1024. }
  1025. bool StartArray() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTARRAY; return true; }
  1026. bool EndArray(SizeType c) {
  1027. RAPIDJSON_ASSERT(LogCount < LogCapacity);
  1028. RAPIDJSON_ASSERT((static_cast<uint32_t>(c) & 0xF0000000) == 0);
  1029. Logs[LogCount++] = LOG_ENDARRAY | static_cast<uint32_t>(c);
  1030. return true;
  1031. }
  1032. };
  1033. TEST(Reader, IterativeParsing_General) {
  1034. {
  1035. StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]");
  1036. Reader reader;
  1037. IterativeParsingReaderHandler<> handler;
  1038. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1039. EXPECT_FALSE(r.IsError());
  1040. EXPECT_FALSE(reader.HasParseError());
  1041. uint32_t e[] = {
  1042. handler.LOG_STARTARRAY,
  1043. handler.LOG_INT,
  1044. handler.LOG_STARTOBJECT,
  1045. handler.LOG_KEY,
  1046. handler.LOG_STARTARRAY,
  1047. handler.LOG_INT,
  1048. handler.LOG_INT,
  1049. handler.LOG_ENDARRAY | 2,
  1050. handler.LOG_ENDOBJECT | 1,
  1051. handler.LOG_NULL,
  1052. handler.LOG_BOOL,
  1053. handler.LOG_BOOL,
  1054. handler.LOG_STRING,
  1055. handler.LOG_DOUBLE,
  1056. handler.LOG_ENDARRAY | 7
  1057. };
  1058. EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount);
  1059. for (size_t i = 0; i < handler.LogCount; ++i) {
  1060. EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i;
  1061. }
  1062. }
  1063. }
  1064. TEST(Reader, IterativeParsing_Count) {
  1065. {
  1066. StringStream is("[{}, {\"k\": 1}, [1], []]");
  1067. Reader reader;
  1068. IterativeParsingReaderHandler<> handler;
  1069. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1070. EXPECT_FALSE(r.IsError());
  1071. EXPECT_FALSE(reader.HasParseError());
  1072. uint32_t e[] = {
  1073. handler.LOG_STARTARRAY,
  1074. handler.LOG_STARTOBJECT,
  1075. handler.LOG_ENDOBJECT | 0,
  1076. handler.LOG_STARTOBJECT,
  1077. handler.LOG_KEY,
  1078. handler.LOG_INT,
  1079. handler.LOG_ENDOBJECT | 1,
  1080. handler.LOG_STARTARRAY,
  1081. handler.LOG_INT,
  1082. handler.LOG_ENDARRAY | 1,
  1083. handler.LOG_STARTARRAY,
  1084. handler.LOG_ENDARRAY | 0,
  1085. handler.LOG_ENDARRAY | 4
  1086. };
  1087. EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount);
  1088. for (size_t i = 0; i < handler.LogCount; ++i) {
  1089. EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i;
  1090. }
  1091. }
  1092. }
  1093. TEST(Reader, IterativePullParsing_General) {
  1094. {
  1095. IterativeParsingReaderHandler<> handler;
  1096. uint32_t e[] = {
  1097. handler.LOG_STARTARRAY,
  1098. handler.LOG_INT,
  1099. handler.LOG_STARTOBJECT,
  1100. handler.LOG_KEY,
  1101. handler.LOG_STARTARRAY,
  1102. handler.LOG_INT,
  1103. handler.LOG_INT,
  1104. handler.LOG_ENDARRAY | 2,
  1105. handler.LOG_ENDOBJECT | 1,
  1106. handler.LOG_NULL,
  1107. handler.LOG_BOOL,
  1108. handler.LOG_BOOL,
  1109. handler.LOG_STRING,
  1110. handler.LOG_DOUBLE,
  1111. handler.LOG_ENDARRAY | 7
  1112. };
  1113. StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]");
  1114. Reader reader;
  1115. reader.IterativeParseInit();
  1116. while (!reader.IterativeParseComplete()) {
  1117. size_t oldLogCount = handler.LogCount;
  1118. EXPECT_TRUE(oldLogCount < sizeof(e) / sizeof(int)) << "overrun";
  1119. EXPECT_TRUE(reader.IterativeParseNext<kParseDefaultFlags>(is, handler)) << "parse fail";
  1120. EXPECT_EQ(handler.LogCount, oldLogCount + 1) << "handler should be invoked exactly once each time";
  1121. EXPECT_EQ(e[oldLogCount], handler.Logs[oldLogCount]) << "wrong event returned";
  1122. }
  1123. EXPECT_FALSE(reader.HasParseError());
  1124. EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount) << "handler invoked wrong number of times";
  1125. // The handler should not be invoked when the JSON has been fully read, but it should not fail
  1126. size_t oldLogCount = handler.LogCount;
  1127. EXPECT_TRUE(reader.IterativeParseNext<kParseDefaultFlags>(is, handler)) << "parse-next past complete is allowed";
  1128. EXPECT_EQ(handler.LogCount, oldLogCount) << "parse-next past complete should not invoke handler";
  1129. EXPECT_FALSE(reader.HasParseError()) << "parse-next past complete should not generate parse error";
  1130. }
  1131. }
  1132. // Test iterative parsing on kParseErrorTermination.
  1133. struct HandlerTerminateAtStartObject : public IterativeParsingReaderHandler<> {
  1134. bool StartObject() { return false; }
  1135. };
  1136. struct HandlerTerminateAtStartArray : public IterativeParsingReaderHandler<> {
  1137. bool StartArray() { return false; }
  1138. };
  1139. struct HandlerTerminateAtEndObject : public IterativeParsingReaderHandler<> {
  1140. bool EndObject(SizeType) { return false; }
  1141. };
  1142. struct HandlerTerminateAtEndArray : public IterativeParsingReaderHandler<> {
  1143. bool EndArray(SizeType) { return false; }
  1144. };
  1145. TEST(Reader, IterativeParsing_ShortCircuit) {
  1146. {
  1147. HandlerTerminateAtStartObject handler;
  1148. Reader reader;
  1149. StringStream is("[1, {}]");
  1150. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1151. EXPECT_TRUE(reader.HasParseError());
  1152. EXPECT_EQ(kParseErrorTermination, r.Code());
  1153. EXPECT_EQ(4u, r.Offset());
  1154. }
  1155. {
  1156. HandlerTerminateAtStartArray handler;
  1157. Reader reader;
  1158. StringStream is("{\"a\": []}");
  1159. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1160. EXPECT_TRUE(reader.HasParseError());
  1161. EXPECT_EQ(kParseErrorTermination, r.Code());
  1162. EXPECT_EQ(6u, r.Offset());
  1163. }
  1164. {
  1165. HandlerTerminateAtEndObject handler;
  1166. Reader reader;
  1167. StringStream is("[1, {}]");
  1168. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1169. EXPECT_TRUE(reader.HasParseError());
  1170. EXPECT_EQ(kParseErrorTermination, r.Code());
  1171. EXPECT_EQ(5u, r.Offset());
  1172. }
  1173. {
  1174. HandlerTerminateAtEndArray handler;
  1175. Reader reader;
  1176. StringStream is("{\"a\": []}");
  1177. ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
  1178. EXPECT_TRUE(reader.HasParseError());
  1179. EXPECT_EQ(kParseErrorTermination, r.Code());
  1180. EXPECT_EQ(7u, r.Offset());
  1181. }
  1182. }
  1183. // For covering BaseReaderHandler default functions
  1184. TEST(Reader, BaseReaderHandler_Default) {
  1185. BaseReaderHandler<> h;
  1186. Reader reader;
  1187. StringStream is("[null, true, -1, 1, -1234567890123456789, 1234567890123456789, 3.14, \"s\", { \"a\" : 1 }]");
  1188. EXPECT_TRUE(reader.Parse(is, h));
  1189. }
  1190. template <int e>
  1191. struct TerminateHandler {
  1192. bool Null() { return e != 0; }
  1193. bool Bool(bool) { return e != 1; }
  1194. bool Int(int) { return e != 2; }
  1195. bool Uint(unsigned) { return e != 3; }
  1196. bool Int64(int64_t) { return e != 4; }
  1197. bool Uint64(uint64_t) { return e != 5; }
  1198. bool Double(double) { return e != 6; }
  1199. bool RawNumber(const char*, SizeType, bool) { return e != 7; }
  1200. bool String(const char*, SizeType, bool) { return e != 8; }
  1201. bool StartObject() { return e != 9; }
  1202. bool Key(const char*, SizeType, bool) { return e != 10; }
  1203. bool EndObject(SizeType) { return e != 11; }
  1204. bool StartArray() { return e != 12; }
  1205. bool EndArray(SizeType) { return e != 13; }
  1206. };
  1207. #define TEST_TERMINATION(e, json)\
  1208. {\
  1209. Reader reader;\
  1210. TerminateHandler<e> h;\
  1211. StringStream is(json);\
  1212. EXPECT_FALSE(reader.Parse(is, h));\
  1213. EXPECT_EQ(kParseErrorTermination, reader.GetParseErrorCode());\
  1214. }
  1215. TEST(Reader, ParseTerminationByHandler) {
  1216. TEST_TERMINATION(0, "[null");
  1217. TEST_TERMINATION(1, "[true");
  1218. TEST_TERMINATION(1, "[false");
  1219. TEST_TERMINATION(2, "[-1");
  1220. TEST_TERMINATION(3, "[1");
  1221. TEST_TERMINATION(4, "[-1234567890123456789");
  1222. TEST_TERMINATION(5, "[1234567890123456789");
  1223. TEST_TERMINATION(6, "[0.5]");
  1224. // RawNumber() is never called
  1225. TEST_TERMINATION(8, "[\"a\"");
  1226. TEST_TERMINATION(9, "[{");
  1227. TEST_TERMINATION(10, "[{\"a\"");
  1228. TEST_TERMINATION(11, "[{}");
  1229. TEST_TERMINATION(11, "[{\"a\":1}"); // non-empty object
  1230. TEST_TERMINATION(12, "{\"a\":[");
  1231. TEST_TERMINATION(13, "{\"a\":[]");
  1232. TEST_TERMINATION(13, "{\"a\":[1]"); // non-empty array
  1233. }
  1234. TEST(Reader, ParseComments) {
  1235. const char* json =
  1236. "// Here is a one-line comment.\n"
  1237. "{// And here's another one\n"
  1238. " /*And here's an in-line one.*/\"hello\" : \"world\","
  1239. " \"t\" :/* And one with '*' symbol*/true ,"
  1240. "/* A multiline comment\n"
  1241. " goes here*/"
  1242. " \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3]"
  1243. "}/*And the last one to be sure */";
  1244. StringStream s(json);
  1245. ParseObjectHandler h;
  1246. Reader reader;
  1247. EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
  1248. EXPECT_EQ(20u, h.step_);
  1249. }
  1250. TEST(Reader, ParseEmptyInlineComment) {
  1251. const char* json = "{/**/\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1252. StringStream s(json);
  1253. ParseObjectHandler h;
  1254. Reader reader;
  1255. EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
  1256. EXPECT_EQ(20u, h.step_);
  1257. }
  1258. TEST(Reader, ParseEmptyOnelineComment) {
  1259. const char* json = "{//\n\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1260. StringStream s(json);
  1261. ParseObjectHandler h;
  1262. Reader reader;
  1263. EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
  1264. EXPECT_EQ(20u, h.step_);
  1265. }
  1266. TEST(Reader, ParseMultipleCommentsInARow) {
  1267. const char* json =
  1268. "{/* first comment *//* second */\n"
  1269. "/* third */ /*fourth*/// last one\n"
  1270. "\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1271. StringStream s(json);
  1272. ParseObjectHandler h;
  1273. Reader reader;
  1274. EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
  1275. EXPECT_EQ(20u, h.step_);
  1276. }
  1277. TEST(Reader, InlineCommentsAreDisabledByDefault) {
  1278. {
  1279. const char* json = "{/* Inline comment. */\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1280. StringStream s(json);
  1281. ParseObjectHandler h;
  1282. Reader reader;
  1283. EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
  1284. }
  1285. {
  1286. const char* json =
  1287. "{\"hello\" : /* Multiline comment starts here\n"
  1288. " continues here\n"
  1289. " and ends here */\"world\", \"t\" :true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1290. StringStream s(json);
  1291. ParseObjectHandler h;
  1292. Reader reader;
  1293. EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
  1294. }
  1295. }
  1296. TEST(Reader, OnelineCommentsAreDisabledByDefault) {
  1297. const char* json = "{// One-line comment\n\"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
  1298. StringStream s(json);
  1299. ParseObjectHandler h;
  1300. Reader reader;
  1301. EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
  1302. }
  1303. TEST(Reader, EofAfterOneLineComment) {
  1304. const char* json = "{\"hello\" : \"world\" // EOF is here -->\0 \n}";
  1305. StringStream s(json);
  1306. ParseObjectHandler h;
  1307. Reader reader;
  1308. EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
  1309. EXPECT_EQ(kParseErrorObjectMissCommaOrCurlyBracket, reader.GetParseErrorCode());
  1310. }
  1311. TEST(Reader, IncompleteMultilineComment) {
  1312. const char* json = "{\"hello\" : \"world\" /* EOF is here -->\0 */}";
  1313. StringStream s(json);
  1314. ParseObjectHandler h;
  1315. Reader reader;
  1316. EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
  1317. EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
  1318. }
  1319. TEST(Reader, IncompleteMultilineComment2) {
  1320. const char* json = "{\"hello\" : \"world\" /* *\0 */}";
  1321. StringStream s(json);
  1322. ParseObjectHandler h;
  1323. Reader reader;
  1324. EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
  1325. EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
  1326. }
  1327. TEST(Reader, UnrecognizedComment) {
  1328. const char* json = "{\"hello\" : \"world\" /! }";
  1329. StringStream s(json);
  1330. ParseObjectHandler h;
  1331. Reader reader;
  1332. EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
  1333. EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
  1334. }
  1335. struct NumbersAsStringsHandler {
  1336. bool Null() { return true; }
  1337. bool Bool(bool) { return true; }
  1338. bool Int(int) { return true; }
  1339. bool Uint(unsigned) { return true; }
  1340. bool Int64(int64_t) { return true; }
  1341. bool Uint64(uint64_t) { return true; }
  1342. bool Double(double) { return true; }
  1343. // 'str' is not null-terminated
  1344. bool RawNumber(const char* str, SizeType length, bool) {
  1345. EXPECT_TRUE(str != 0);
  1346. EXPECT_TRUE(expected_len_ == length);
  1347. EXPECT_TRUE(strncmp(str, expected_, length) == 0);
  1348. return true;
  1349. }
  1350. bool String(const char*, SizeType, bool) { return true; }
  1351. bool StartObject() { return true; }
  1352. bool Key(const char*, SizeType, bool) { return true; }
  1353. bool EndObject(SizeType) { return true; }
  1354. bool StartArray() { return true; }
  1355. bool EndArray(SizeType) { return true; }
  1356. NumbersAsStringsHandler(const char* expected)
  1357. : expected_(expected)
  1358. , expected_len_(strlen(expected)) {}
  1359. const char* expected_;
  1360. size_t expected_len_;
  1361. };
  1362. TEST(Reader, NumbersAsStrings) {
  1363. {
  1364. const char* json = "{ \"pi\": 3.1416 } ";
  1365. StringStream s(json);
  1366. NumbersAsStringsHandler h("3.1416");
  1367. Reader reader;
  1368. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
  1369. }
  1370. {
  1371. char* json = StrDup("{ \"pi\": 3.1416 } ");
  1372. InsituStringStream s(json);
  1373. NumbersAsStringsHandler h("3.1416");
  1374. Reader reader;
  1375. EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
  1376. free(json);
  1377. }
  1378. {
  1379. const char* json = "{ \"gigabyte\": 1.0e9 } ";
  1380. StringStream s(json);
  1381. NumbersAsStringsHandler h("1.0e9");
  1382. Reader reader;
  1383. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
  1384. }
  1385. {
  1386. char* json = StrDup("{ \"gigabyte\": 1.0e9 } ");
  1387. InsituStringStream s(json);
  1388. NumbersAsStringsHandler h("1.0e9");
  1389. Reader reader;
  1390. EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
  1391. free(json);
  1392. }
  1393. {
  1394. const char* json = "{ \"pi\": 314.159e-2 } ";
  1395. StringStream s(json);
  1396. NumbersAsStringsHandler h("314.159e-2");
  1397. Reader reader;
  1398. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
  1399. }
  1400. {
  1401. char* json = StrDup("{ \"gigabyte\": 314.159e-2 } ");
  1402. InsituStringStream s(json);
  1403. NumbersAsStringsHandler h("314.159e-2");
  1404. Reader reader;
  1405. EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
  1406. free(json);
  1407. }
  1408. {
  1409. const char* json = "{ \"negative\": -1.54321 } ";
  1410. StringStream s(json);
  1411. NumbersAsStringsHandler h("-1.54321");
  1412. Reader reader;
  1413. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
  1414. }
  1415. {
  1416. char* json = StrDup("{ \"negative\": -1.54321 } ");
  1417. InsituStringStream s(json);
  1418. NumbersAsStringsHandler h("-1.54321");
  1419. Reader reader;
  1420. EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
  1421. free(json);
  1422. }
  1423. {
  1424. const char* json = "{ \"pi\": 314.159e-2 } ";
  1425. std::stringstream ss(json);
  1426. IStreamWrapper s(ss);
  1427. NumbersAsStringsHandler h("314.159e-2");
  1428. Reader reader;
  1429. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
  1430. }
  1431. }
  1432. template <unsigned extraFlags>
  1433. void TestTrailingCommas() {
  1434. {
  1435. StringStream s("[1,2,3,]");
  1436. ParseArrayHandler<3> h;
  1437. Reader reader;
  1438. EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
  1439. EXPECT_EQ(5u, h.step_);
  1440. }
  1441. {
  1442. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
  1443. "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3],}";
  1444. StringStream s(json);
  1445. ParseObjectHandler h;
  1446. Reader reader;
  1447. EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
  1448. EXPECT_EQ(20u, h.step_);
  1449. }
  1450. {
  1451. // whitespace around trailing commas
  1452. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
  1453. "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3\n,\n]\n,\n} ";
  1454. StringStream s(json);
  1455. ParseObjectHandler h;
  1456. Reader reader;
  1457. EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
  1458. EXPECT_EQ(20u, h.step_);
  1459. }
  1460. {
  1461. // comments around trailing commas
  1462. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null,"
  1463. "\"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3/*test*/,/*test*/]/*test*/,/*test*/}";
  1464. StringStream s(json);
  1465. ParseObjectHandler h;
  1466. Reader reader;
  1467. EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag|kParseCommentsFlag>(s, h));
  1468. EXPECT_EQ(20u, h.step_);
  1469. }
  1470. }
  1471. TEST(Reader, TrailingCommas) {
  1472. TestTrailingCommas<kParseNoFlags>();
  1473. }
  1474. TEST(Reader, TrailingCommasIterative) {
  1475. TestTrailingCommas<kParseIterativeFlag>();
  1476. }
  1477. template <unsigned extraFlags>
  1478. void TestMultipleTrailingCommaErrors() {
  1479. // only a single trailing comma is allowed.
  1480. {
  1481. StringStream s("[1,2,3,,]");
  1482. ParseArrayHandler<3> h;
  1483. Reader reader;
  1484. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1485. EXPECT_TRUE(reader.HasParseError());
  1486. EXPECT_EQ(kParseErrorValueInvalid, r.Code());
  1487. EXPECT_EQ(7u, r.Offset());
  1488. }
  1489. {
  1490. const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
  1491. "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3,],,}";
  1492. StringStream s(json);
  1493. ParseObjectHandler h;
  1494. Reader reader;
  1495. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1496. EXPECT_TRUE(reader.HasParseError());
  1497. EXPECT_EQ(kParseErrorObjectMissName, r.Code());
  1498. EXPECT_EQ(95u, r.Offset());
  1499. }
  1500. }
  1501. TEST(Reader, MultipleTrailingCommaErrors) {
  1502. TestMultipleTrailingCommaErrors<kParseNoFlags>();
  1503. }
  1504. TEST(Reader, MultipleTrailingCommaErrorsIterative) {
  1505. TestMultipleTrailingCommaErrors<kParseIterativeFlag>();
  1506. }
  1507. template <unsigned extraFlags>
  1508. void TestEmptyExceptForCommaErrors() {
  1509. // not allowed even with trailing commas enabled; the
  1510. // trailing comma must follow a value.
  1511. {
  1512. StringStream s("[,]");
  1513. ParseArrayHandler<3> h;
  1514. Reader reader;
  1515. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1516. EXPECT_TRUE(reader.HasParseError());
  1517. EXPECT_EQ(kParseErrorValueInvalid, r.Code());
  1518. EXPECT_EQ(1u, r.Offset());
  1519. }
  1520. {
  1521. StringStream s("{,}");
  1522. ParseObjectHandler h;
  1523. Reader reader;
  1524. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1525. EXPECT_TRUE(reader.HasParseError());
  1526. EXPECT_EQ(kParseErrorObjectMissName, r.Code());
  1527. EXPECT_EQ(1u, r.Offset());
  1528. }
  1529. }
  1530. TEST(Reader, EmptyExceptForCommaErrors) {
  1531. TestEmptyExceptForCommaErrors<kParseNoFlags>();
  1532. }
  1533. TEST(Reader, EmptyExceptForCommaErrorsIterative) {
  1534. TestEmptyExceptForCommaErrors<kParseIterativeFlag>();
  1535. }
  1536. template <unsigned extraFlags>
  1537. void TestTrailingCommaHandlerTermination() {
  1538. {
  1539. HandlerTerminateAtEndArray h;
  1540. Reader reader;
  1541. StringStream s("[1,2,3,]");
  1542. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1543. EXPECT_TRUE(reader.HasParseError());
  1544. EXPECT_EQ(kParseErrorTermination, r.Code());
  1545. EXPECT_EQ(7u, r.Offset());
  1546. }
  1547. {
  1548. HandlerTerminateAtEndObject h;
  1549. Reader reader;
  1550. StringStream s("{\"t\": true, \"f\": false,}");
  1551. ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
  1552. EXPECT_TRUE(reader.HasParseError());
  1553. EXPECT_EQ(kParseErrorTermination, r.Code());
  1554. EXPECT_EQ(23u, r.Offset());
  1555. }
  1556. }
  1557. TEST(Reader, TrailingCommaHandlerTermination) {
  1558. TestTrailingCommaHandlerTermination<kParseNoFlags>();
  1559. }
  1560. TEST(Reader, TrailingCommaHandlerTerminationIterative) {
  1561. TestTrailingCommaHandlerTermination<kParseIterativeFlag>();
  1562. }
  1563. TEST(Reader, ParseNanAndInfinity) {
  1564. #define TEST_NAN_INF(str, x) \
  1565. { \
  1566. { \
  1567. StringStream s(str); \
  1568. ParseDoubleHandler h; \
  1569. Reader reader; \
  1570. ASSERT_EQ(kParseErrorNone, reader.Parse<kParseNanAndInfFlag>(s, h).Code()); \
  1571. EXPECT_EQ(1u, h.step_); \
  1572. internal::Double e(x), a(h.actual_); \
  1573. EXPECT_EQ(e.IsNan(), a.IsNan()); \
  1574. EXPECT_EQ(e.IsInf(), a.IsInf()); \
  1575. if (!e.IsNan()) \
  1576. EXPECT_EQ(e.Sign(), a.Sign()); \
  1577. } \
  1578. { \
  1579. const char* json = "{ \"naninfdouble\": " str " } "; \
  1580. StringStream s(json); \
  1581. NumbersAsStringsHandler h(str); \
  1582. Reader reader; \
  1583. EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \
  1584. } \
  1585. { \
  1586. char* json = StrDup("{ \"naninfdouble\": " str " } "); \
  1587. InsituStringStream s(json); \
  1588. NumbersAsStringsHandler h(str); \
  1589. Reader reader; \
  1590. EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \
  1591. free(json); \
  1592. } \
  1593. }
  1594. #define TEST_NAN_INF_ERROR(errorCode, str, errorOffset) \
  1595. { \
  1596. int streamPos = errorOffset; \
  1597. char buffer[1001]; \
  1598. strncpy(buffer, str, 1000); \
  1599. InsituStringStream s(buffer); \
  1600. BaseReaderHandler<> h; \
  1601. Reader reader; \
  1602. EXPECT_FALSE(reader.Parse<kParseNanAndInfFlag>(s, h)); \
  1603. EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
  1604. EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
  1605. EXPECT_EQ(streamPos, s.Tell());\
  1606. }
  1607. double nan = std::numeric_limits<double>::quiet_NaN();
  1608. double inf = std::numeric_limits<double>::infinity();
  1609. TEST_NAN_INF("NaN", nan);
  1610. TEST_NAN_INF("-NaN", nan);
  1611. TEST_NAN_INF("Inf", inf);
  1612. TEST_NAN_INF("Infinity", inf);
  1613. TEST_NAN_INF("-Inf", -inf);
  1614. TEST_NAN_INF("-Infinity", -inf);
  1615. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NInf", 1);
  1616. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NaInf", 2);
  1617. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "INan", 1);
  1618. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "InNan", 2);
  1619. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "nan", 1);
  1620. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-nan", 1);
  1621. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NAN", 1);
  1622. TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-Infinty", 6);
  1623. #undef TEST_NAN_INF_ERROR
  1624. #undef TEST_NAN_INF
  1625. }
  1626. RAPIDJSON_DIAG_POP