rj_schema 0.2.4 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (627) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rj_schema/rapidjson/CHANGELOG.md +158 -0
  3. data/ext/rj_schema/rapidjson/CMakeLists.txt +248 -0
  4. data/ext/rj_schema/rapidjson/CMakeModules/FindGTestSrc.cmake +30 -0
  5. data/ext/rj_schema/rapidjson/RapidJSON.pc.in +7 -0
  6. data/ext/rj_schema/rapidjson/RapidJSONConfig.cmake.in +25 -0
  7. data/ext/rj_schema/rapidjson/RapidJSONConfigVersion.cmake.in +10 -0
  8. data/ext/rj_schema/rapidjson/appveyor.yml +102 -0
  9. data/ext/rj_schema/rapidjson/bin/data/abcde.txt +1 -0
  10. data/ext/rj_schema/rapidjson/bin/data/glossary.json +22 -0
  11. data/ext/rj_schema/rapidjson/bin/data/menu.json +27 -0
  12. data/ext/rj_schema/rapidjson/bin/data/readme.txt +1 -0
  13. data/ext/rj_schema/rapidjson/bin/data/sample.json +3315 -0
  14. data/ext/rj_schema/rapidjson/bin/data/webapp.json +88 -0
  15. data/ext/rj_schema/rapidjson/bin/data/widget.json +26 -0
  16. data/ext/rj_schema/rapidjson/bin/draft-04/schema +150 -0
  17. data/ext/rj_schema/rapidjson/bin/encodings/utf16be.json +0 -0
  18. data/ext/rj_schema/rapidjson/bin/encodings/utf16bebom.json +0 -0
  19. data/ext/rj_schema/rapidjson/bin/encodings/utf16le.json +0 -0
  20. data/ext/rj_schema/rapidjson/bin/encodings/utf16lebom.json +0 -0
  21. data/ext/rj_schema/rapidjson/bin/encodings/utf32be.json +0 -0
  22. data/ext/rj_schema/rapidjson/bin/encodings/utf32bebom.json +0 -0
  23. data/ext/rj_schema/rapidjson/bin/encodings/utf32le.json +0 -0
  24. data/ext/rj_schema/rapidjson/bin/encodings/utf32lebom.json +0 -0
  25. data/ext/rj_schema/rapidjson/bin/encodings/utf8.json +7 -0
  26. data/ext/rj_schema/rapidjson/bin/encodings/utf8bom.json +7 -0
  27. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail1.json +1 -0
  28. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail10.json +1 -0
  29. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail11.json +1 -0
  30. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail12.json +1 -0
  31. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail13.json +1 -0
  32. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail14.json +1 -0
  33. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail15.json +1 -0
  34. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail16.json +1 -0
  35. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail17.json +1 -0
  36. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail18.json +1 -0
  37. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail19.json +1 -0
  38. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail2.json +1 -0
  39. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail20.json +1 -0
  40. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail21.json +1 -0
  41. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail22.json +1 -0
  42. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail23.json +1 -0
  43. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail24.json +1 -0
  44. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail25.json +1 -0
  45. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail26.json +1 -0
  46. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail27.json +2 -0
  47. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail28.json +2 -0
  48. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail29.json +1 -0
  49. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail3.json +1 -0
  50. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail30.json +1 -0
  51. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail31.json +1 -0
  52. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail32.json +1 -0
  53. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail33.json +1 -0
  54. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail4.json +1 -0
  55. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail5.json +1 -0
  56. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail6.json +1 -0
  57. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail7.json +1 -0
  58. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail8.json +1 -0
  59. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail9.json +1 -0
  60. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass1.json +58 -0
  61. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass2.json +1 -0
  62. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass3.json +6 -0
  63. data/ext/rj_schema/rapidjson/bin/jsonchecker/readme.txt +3 -0
  64. data/ext/rj_schema/rapidjson/bin/jsonschema/LICENSE +19 -0
  65. data/ext/rj_schema/rapidjson/bin/jsonschema/README.md +148 -0
  66. data/ext/rj_schema/rapidjson/bin/jsonschema/bin/jsonschema_suite +283 -0
  67. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/folder/folderInteger.json +3 -0
  68. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/integer.json +3 -0
  69. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/subSchemas.json +8 -0
  70. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/additionalItems.json +82 -0
  71. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/additionalProperties.json +88 -0
  72. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/default.json +49 -0
  73. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/dependencies.json +108 -0
  74. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/disallow.json +80 -0
  75. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/divisibleBy.json +60 -0
  76. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/enum.json +71 -0
  77. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/extends.json +94 -0
  78. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/items.json +46 -0
  79. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maxItems.json +28 -0
  80. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maxLength.json +33 -0
  81. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maximum.json +42 -0
  82. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minItems.json +28 -0
  83. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minLength.json +33 -0
  84. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minimum.json +42 -0
  85. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/bignum.json +107 -0
  86. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/format.json +222 -0
  87. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/jsregex.json +18 -0
  88. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/zeroTerminatedFloats.json +15 -0
  89. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/pattern.json +34 -0
  90. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/patternProperties.json +110 -0
  91. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/properties.json +92 -0
  92. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/ref.json +159 -0
  93. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/refRemote.json +74 -0
  94. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/required.json +53 -0
  95. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/type.json +474 -0
  96. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/uniqueItems.json +79 -0
  97. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/additionalItems.json +82 -0
  98. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/additionalProperties.json +88 -0
  99. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/allOf.json +112 -0
  100. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/anyOf.json +68 -0
  101. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/default.json +49 -0
  102. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/definitions.json +32 -0
  103. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/dependencies.json +113 -0
  104. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/enum.json +72 -0
  105. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/items.json +46 -0
  106. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxItems.json +28 -0
  107. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxLength.json +33 -0
  108. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxProperties.json +28 -0
  109. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maximum.json +42 -0
  110. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minItems.json +28 -0
  111. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minLength.json +33 -0
  112. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minProperties.json +28 -0
  113. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minimum.json +42 -0
  114. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/multipleOf.json +60 -0
  115. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/not.json +96 -0
  116. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/oneOf.json +68 -0
  117. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/bignum.json +107 -0
  118. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/format.json +148 -0
  119. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/zeroTerminatedFloats.json +15 -0
  120. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/pattern.json +34 -0
  121. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/patternProperties.json +110 -0
  122. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/properties.json +92 -0
  123. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/ref.json +159 -0
  124. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/refRemote.json +74 -0
  125. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/required.json +39 -0
  126. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/type.json +330 -0
  127. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/uniqueItems.json +79 -0
  128. data/ext/rj_schema/rapidjson/bin/jsonschema/tox.ini +8 -0
  129. data/ext/rj_schema/rapidjson/bin/types/alotofkeys.json +502 -0
  130. data/ext/rj_schema/rapidjson/bin/types/booleans.json +102 -0
  131. data/ext/rj_schema/rapidjson/bin/types/floats.json +102 -0
  132. data/ext/rj_schema/rapidjson/bin/types/guids.json +102 -0
  133. data/ext/rj_schema/rapidjson/bin/types/integers.json +102 -0
  134. data/ext/rj_schema/rapidjson/bin/types/mixed.json +592 -0
  135. data/ext/rj_schema/rapidjson/bin/types/nulls.json +102 -0
  136. data/ext/rj_schema/rapidjson/bin/types/paragraphs.json +102 -0
  137. data/ext/rj_schema/rapidjson/bin/types/readme.txt +1 -0
  138. data/ext/rj_schema/rapidjson/bin/unittestschema/address.json +139 -0
  139. data/ext/rj_schema/rapidjson/bin/unittestschema/allOf_address.json +7 -0
  140. data/ext/rj_schema/rapidjson/bin/unittestschema/anyOf_address.json +7 -0
  141. data/ext/rj_schema/rapidjson/bin/unittestschema/idandref.json +69 -0
  142. data/ext/rj_schema/rapidjson/bin/unittestschema/oneOf_address.json +7 -0
  143. data/ext/rj_schema/rapidjson/contrib/natvis/LICENSE +45 -0
  144. data/ext/rj_schema/rapidjson/contrib/natvis/README.md +7 -0
  145. data/ext/rj_schema/rapidjson/contrib/natvis/rapidjson.natvis +38 -0
  146. data/ext/rj_schema/rapidjson/doc/CMakeLists.txt +27 -0
  147. data/ext/rj_schema/rapidjson/doc/Doxyfile.in +2369 -0
  148. data/ext/rj_schema/rapidjson/doc/Doxyfile.zh-cn.in +2369 -0
  149. data/ext/rj_schema/rapidjson/doc/diagram/architecture.dot +50 -0
  150. data/ext/rj_schema/rapidjson/doc/diagram/architecture.png +0 -0
  151. data/ext/rj_schema/rapidjson/doc/diagram/insituparsing.dot +65 -0
  152. data/ext/rj_schema/rapidjson/doc/diagram/insituparsing.png +0 -0
  153. data/ext/rj_schema/rapidjson/doc/diagram/iterative-parser-states-diagram.dot +62 -0
  154. data/ext/rj_schema/rapidjson/doc/diagram/iterative-parser-states-diagram.png +0 -0
  155. data/ext/rj_schema/rapidjson/doc/diagram/makefile +8 -0
  156. data/ext/rj_schema/rapidjson/doc/diagram/move1.dot +47 -0
  157. data/ext/rj_schema/rapidjson/doc/diagram/move1.png +0 -0
  158. data/ext/rj_schema/rapidjson/doc/diagram/move2.dot +62 -0
  159. data/ext/rj_schema/rapidjson/doc/diagram/move2.png +0 -0
  160. data/ext/rj_schema/rapidjson/doc/diagram/move3.dot +60 -0
  161. data/ext/rj_schema/rapidjson/doc/diagram/move3.png +0 -0
  162. data/ext/rj_schema/rapidjson/doc/diagram/normalparsing.dot +56 -0
  163. data/ext/rj_schema/rapidjson/doc/diagram/normalparsing.png +0 -0
  164. data/ext/rj_schema/rapidjson/doc/diagram/simpledom.dot +54 -0
  165. data/ext/rj_schema/rapidjson/doc/diagram/simpledom.png +0 -0
  166. data/ext/rj_schema/rapidjson/doc/diagram/tutorial.dot +58 -0
  167. data/ext/rj_schema/rapidjson/doc/diagram/tutorial.png +0 -0
  168. data/ext/rj_schema/rapidjson/doc/diagram/utilityclass.dot +73 -0
  169. data/ext/rj_schema/rapidjson/doc/diagram/utilityclass.png +0 -0
  170. data/ext/rj_schema/rapidjson/doc/dom.md +281 -0
  171. data/ext/rj_schema/rapidjson/doc/dom.zh-cn.md +285 -0
  172. data/ext/rj_schema/rapidjson/doc/encoding.md +146 -0
  173. data/ext/rj_schema/rapidjson/doc/encoding.zh-cn.md +152 -0
  174. data/ext/rj_schema/rapidjson/doc/faq.md +289 -0
  175. data/ext/rj_schema/rapidjson/doc/faq.zh-cn.md +290 -0
  176. data/ext/rj_schema/rapidjson/doc/features.md +104 -0
  177. data/ext/rj_schema/rapidjson/doc/features.zh-cn.md +103 -0
  178. data/ext/rj_schema/rapidjson/doc/internals.md +368 -0
  179. data/ext/rj_schema/rapidjson/doc/internals.zh-cn.md +363 -0
  180. data/ext/rj_schema/rapidjson/doc/logo/rapidjson.png +0 -0
  181. data/ext/rj_schema/rapidjson/doc/logo/rapidjson.svg +119 -0
  182. data/ext/rj_schema/rapidjson/doc/misc/DoxygenLayout.xml +194 -0
  183. data/ext/rj_schema/rapidjson/doc/misc/doxygenextra.css +274 -0
  184. data/ext/rj_schema/rapidjson/doc/misc/footer.html +11 -0
  185. data/ext/rj_schema/rapidjson/doc/misc/header.html +24 -0
  186. data/ext/rj_schema/rapidjson/doc/npm.md +31 -0
  187. data/ext/rj_schema/rapidjson/doc/performance.md +26 -0
  188. data/ext/rj_schema/rapidjson/doc/performance.zh-cn.md +26 -0
  189. data/ext/rj_schema/rapidjson/doc/pointer.md +234 -0
  190. data/ext/rj_schema/rapidjson/doc/pointer.zh-cn.md +234 -0
  191. data/ext/rj_schema/rapidjson/doc/sax.md +509 -0
  192. data/ext/rj_schema/rapidjson/doc/sax.zh-cn.md +487 -0
  193. data/ext/rj_schema/rapidjson/doc/schema.md +505 -0
  194. data/ext/rj_schema/rapidjson/doc/schema.zh-cn.md +237 -0
  195. data/ext/rj_schema/rapidjson/doc/stream.md +429 -0
  196. data/ext/rj_schema/rapidjson/doc/stream.zh-cn.md +429 -0
  197. data/ext/rj_schema/rapidjson/doc/tutorial.md +536 -0
  198. data/ext/rj_schema/rapidjson/doc/tutorial.zh-cn.md +535 -0
  199. data/ext/rj_schema/rapidjson/docker/debian/Dockerfile +8 -0
  200. data/ext/rj_schema/rapidjson/example/CMakeLists.txt +46 -0
  201. data/ext/rj_schema/rapidjson/example/archiver/archiver.cpp +292 -0
  202. data/ext/rj_schema/rapidjson/example/archiver/archiver.h +145 -0
  203. data/ext/rj_schema/rapidjson/example/archiver/archivertest.cpp +287 -0
  204. data/ext/rj_schema/rapidjson/example/capitalize/capitalize.cpp +67 -0
  205. data/ext/rj_schema/rapidjson/example/condense/condense.cpp +32 -0
  206. data/ext/rj_schema/rapidjson/example/filterkey/filterkey.cpp +135 -0
  207. data/ext/rj_schema/rapidjson/example/filterkeydom/filterkeydom.cpp +170 -0
  208. data/ext/rj_schema/rapidjson/example/jsonx/jsonx.cpp +207 -0
  209. data/ext/rj_schema/rapidjson/example/lookaheadparser/lookaheadparser.cpp +350 -0
  210. data/ext/rj_schema/rapidjson/example/messagereader/messagereader.cpp +105 -0
  211. data/ext/rj_schema/rapidjson/example/parsebyparts/parsebyparts.cpp +176 -0
  212. data/ext/rj_schema/rapidjson/example/pretty/pretty.cpp +30 -0
  213. data/ext/rj_schema/rapidjson/example/prettyauto/prettyauto.cpp +56 -0
  214. data/ext/rj_schema/rapidjson/example/schemavalidator/schemavalidator.cpp +198 -0
  215. data/ext/rj_schema/rapidjson/example/serialize/serialize.cpp +173 -0
  216. data/ext/rj_schema/rapidjson/example/simpledom/simpledom.cpp +29 -0
  217. data/ext/rj_schema/rapidjson/example/simplepullreader/simplepullreader.cpp +53 -0
  218. data/ext/rj_schema/rapidjson/example/simplereader/simplereader.cpp +42 -0
  219. data/ext/rj_schema/rapidjson/example/simplewriter/simplewriter.cpp +36 -0
  220. data/ext/rj_schema/rapidjson/example/sortkeys/sortkeys.cpp +62 -0
  221. data/ext/rj_schema/rapidjson/example/traverseaspointer.cpp +39 -0
  222. data/ext/rj_schema/rapidjson/example/tutorial/tutorial.cpp +151 -0
  223. data/ext/rj_schema/rapidjson/include/rapidjson/allocators.h +692 -0
  224. data/ext/rj_schema/rapidjson/include/rapidjson/cursorstreamwrapper.h +78 -0
  225. data/ext/rj_schema/rapidjson/include/rapidjson/document.h +3027 -0
  226. data/ext/rj_schema/rapidjson/include/rapidjson/encodedstream.h +299 -0
  227. data/ext/rj_schema/rapidjson/include/rapidjson/encodings.h +716 -0
  228. data/ext/rj_schema/rapidjson/include/rapidjson/error/en.h +122 -0
  229. data/ext/rj_schema/rapidjson/include/rapidjson/error/error.h +216 -0
  230. data/ext/rj_schema/rapidjson/include/rapidjson/filereadstream.h +99 -0
  231. data/ext/rj_schema/rapidjson/include/rapidjson/filewritestream.h +104 -0
  232. data/ext/rj_schema/rapidjson/include/rapidjson/fwd.h +151 -0
  233. data/ext/rj_schema/rapidjson/include/rapidjson/internal/biginteger.h +290 -0
  234. data/ext/rj_schema/rapidjson/include/rapidjson/internal/clzll.h +71 -0
  235. data/ext/rj_schema/rapidjson/include/rapidjson/internal/diyfp.h +257 -0
  236. data/ext/rj_schema/rapidjson/include/rapidjson/internal/dtoa.h +245 -0
  237. data/ext/rj_schema/rapidjson/include/rapidjson/internal/ieee754.h +78 -0
  238. data/ext/rj_schema/rapidjson/include/rapidjson/internal/itoa.h +308 -0
  239. data/ext/rj_schema/rapidjson/include/rapidjson/internal/meta.h +186 -0
  240. data/ext/rj_schema/rapidjson/include/rapidjson/internal/pow10.h +55 -0
  241. data/ext/rj_schema/rapidjson/include/rapidjson/internal/regex.h +739 -0
  242. data/ext/rj_schema/rapidjson/include/rapidjson/internal/stack.h +232 -0
  243. data/ext/rj_schema/rapidjson/include/rapidjson/internal/strfunc.h +83 -0
  244. data/ext/rj_schema/rapidjson/include/rapidjson/internal/strtod.h +290 -0
  245. data/ext/rj_schema/rapidjson/include/rapidjson/internal/swap.h +46 -0
  246. data/ext/rj_schema/rapidjson/include/rapidjson/istreamwrapper.h +128 -0
  247. data/ext/rj_schema/rapidjson/include/rapidjson/memorybuffer.h +70 -0
  248. data/ext/rj_schema/rapidjson/include/rapidjson/memorystream.h +71 -0
  249. data/ext/rj_schema/rapidjson/include/rapidjson/msinttypes/inttypes.h +316 -0
  250. data/ext/rj_schema/rapidjson/include/rapidjson/msinttypes/stdint.h +300 -0
  251. data/ext/rj_schema/rapidjson/include/rapidjson/ostreamwrapper.h +81 -0
  252. data/ext/rj_schema/rapidjson/include/rapidjson/pointer.h +1482 -0
  253. data/ext/rj_schema/rapidjson/include/rapidjson/prettywriter.h +277 -0
  254. data/ext/rj_schema/rapidjson/include/rapidjson/rapidjson.h +741 -0
  255. data/ext/rj_schema/rapidjson/include/rapidjson/reader.h +2244 -0
  256. data/ext/rj_schema/rapidjson/include/rapidjson/schema.h +2795 -0
  257. data/ext/rj_schema/rapidjson/include/rapidjson/stream.h +223 -0
  258. data/ext/rj_schema/rapidjson/include/rapidjson/stringbuffer.h +121 -0
  259. data/ext/rj_schema/rapidjson/include/rapidjson/uri.h +466 -0
  260. data/ext/rj_schema/rapidjson/include/rapidjson/writer.h +710 -0
  261. data/ext/rj_schema/rapidjson/include_dirs.js +2 -0
  262. data/ext/rj_schema/rapidjson/library.json +15 -0
  263. data/ext/rj_schema/rapidjson/license.txt +57 -0
  264. data/ext/rj_schema/rapidjson/package.json +24 -0
  265. data/ext/rj_schema/rapidjson/rapidjson.autopkg +77 -0
  266. data/ext/rj_schema/rapidjson/readme.md +210 -0
  267. data/ext/rj_schema/rapidjson/readme.zh-cn.md +152 -0
  268. data/ext/rj_schema/rapidjson/test/CMakeLists.txt +20 -0
  269. data/ext/rj_schema/rapidjson/test/perftest/CMakeLists.txt +28 -0
  270. data/ext/rj_schema/rapidjson/test/perftest/misctest.cpp +974 -0
  271. data/ext/rj_schema/rapidjson/test/perftest/perftest.cpp +24 -0
  272. data/ext/rj_schema/rapidjson/test/perftest/perftest.h +186 -0
  273. data/ext/rj_schema/rapidjson/test/perftest/platformtest.cpp +166 -0
  274. data/ext/rj_schema/rapidjson/test/perftest/rapidjsontest.cpp +564 -0
  275. data/ext/rj_schema/rapidjson/test/perftest/schematest.cpp +223 -0
  276. data/ext/rj_schema/rapidjson/test/unittest/CMakeLists.txt +95 -0
  277. data/ext/rj_schema/rapidjson/test/unittest/allocatorstest.cpp +292 -0
  278. data/ext/rj_schema/rapidjson/test/unittest/bigintegertest.cpp +138 -0
  279. data/ext/rj_schema/rapidjson/test/unittest/clzlltest.cpp +34 -0
  280. data/ext/rj_schema/rapidjson/test/unittest/cursorstreamwrappertest.cpp +115 -0
  281. data/ext/rj_schema/rapidjson/test/unittest/documenttest.cpp +674 -0
  282. data/ext/rj_schema/rapidjson/test/unittest/dtoatest.cpp +98 -0
  283. data/ext/rj_schema/rapidjson/test/unittest/encodedstreamtest.cpp +313 -0
  284. data/ext/rj_schema/rapidjson/test/unittest/encodingstest.cpp +451 -0
  285. data/ext/rj_schema/rapidjson/test/unittest/filestreamtest.cpp +155 -0
  286. data/ext/rj_schema/rapidjson/test/unittest/fwdtest.cpp +230 -0
  287. data/ext/rj_schema/rapidjson/test/unittest/istreamwrappertest.cpp +181 -0
  288. data/ext/rj_schema/rapidjson/test/unittest/itoatest.cpp +160 -0
  289. data/ext/rj_schema/rapidjson/test/unittest/jsoncheckertest.cpp +143 -0
  290. data/ext/rj_schema/rapidjson/test/unittest/namespacetest.cpp +70 -0
  291. data/ext/rj_schema/rapidjson/test/unittest/ostreamwrappertest.cpp +92 -0
  292. data/ext/rj_schema/rapidjson/test/unittest/platformtest.cpp +40 -0
  293. data/ext/rj_schema/rapidjson/test/unittest/pointertest.cpp +1730 -0
  294. data/ext/rj_schema/rapidjson/test/unittest/prettywritertest.cpp +373 -0
  295. data/ext/rj_schema/rapidjson/test/unittest/readertest.cpp +2228 -0
  296. data/ext/rj_schema/rapidjson/test/unittest/regextest.cpp +639 -0
  297. data/ext/rj_schema/rapidjson/test/unittest/schematest.cpp +2952 -0
  298. data/ext/rj_schema/rapidjson/test/unittest/simdtest.cpp +219 -0
  299. data/ext/rj_schema/rapidjson/test/unittest/strfunctest.cpp +30 -0
  300. data/ext/rj_schema/rapidjson/test/unittest/stringbuffertest.cpp +192 -0
  301. data/ext/rj_schema/rapidjson/test/unittest/strtodtest.cpp +132 -0
  302. data/ext/rj_schema/rapidjson/test/unittest/unittest.cpp +51 -0
  303. data/ext/rj_schema/rapidjson/test/unittest/unittest.h +143 -0
  304. data/ext/rj_schema/rapidjson/test/unittest/uritest.cpp +718 -0
  305. data/ext/rj_schema/rapidjson/test/unittest/valuetest.cpp +1861 -0
  306. data/ext/rj_schema/rapidjson/test/unittest/writertest.cpp +598 -0
  307. data/ext/rj_schema/rapidjson/test/valgrind.supp +17 -0
  308. data/ext/rj_schema/rapidjson/thirdparty/gtest/BUILD.bazel +175 -0
  309. data/ext/rj_schema/rapidjson/thirdparty/gtest/CMakeLists.txt +33 -0
  310. data/ext/rj_schema/rapidjson/thirdparty/gtest/CONTRIBUTING.md +160 -0
  311. data/ext/rj_schema/rapidjson/thirdparty/gtest/LICENSE +28 -0
  312. data/ext/rj_schema/rapidjson/thirdparty/gtest/Makefile.am +14 -0
  313. data/ext/rj_schema/rapidjson/thirdparty/gtest/README.md +122 -0
  314. data/ext/rj_schema/rapidjson/thirdparty/gtest/WORKSPACE +8 -0
  315. data/ext/rj_schema/rapidjson/thirdparty/gtest/appveyor.yml +104 -0
  316. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/build-linux-autotools.sh +44 -0
  317. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/build-linux-bazel.sh +36 -0
  318. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/env-linux.sh +41 -0
  319. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/env-osx.sh +40 -0
  320. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/get-nprocessors.sh +48 -0
  321. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/install-linux.sh +49 -0
  322. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/install-osx.sh +39 -0
  323. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/log-config.sh +51 -0
  324. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/travis.sh +44 -0
  325. data/ext/rj_schema/rapidjson/thirdparty/gtest/configure.ac +16 -0
  326. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CHANGES +126 -0
  327. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CMakeLists.txt +242 -0
  328. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CONTRIBUTORS +40 -0
  329. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/LICENSE +28 -0
  330. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/Makefile.am +224 -0
  331. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/README.md +344 -0
  332. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/cmake/gmock.pc.in +9 -0
  333. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/cmake/gmock_main.pc.in +9 -0
  334. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/configure.ac +146 -0
  335. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/CheatSheet.md +564 -0
  336. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/CookBook.md +3660 -0
  337. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/DesignDoc.md +280 -0
  338. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/Documentation.md +15 -0
  339. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/ForDummies.md +447 -0
  340. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/FrequentlyAskedQuestions.md +627 -0
  341. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/KnownIssues.md +19 -0
  342. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-actions.h +1262 -0
  343. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-cardinalities.h +147 -0
  344. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-actions.h +2571 -0
  345. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-actions.h.pump +833 -0
  346. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h +1379 -0
  347. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump +347 -0
  348. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-matchers.h +2258 -0
  349. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-matchers.h.pump +675 -0
  350. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-nice-strict.h +458 -0
  351. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-nice-strict.h.pump +178 -0
  352. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-matchers.h +5255 -0
  353. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-more-actions.h +246 -0
  354. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-more-matchers.h +91 -0
  355. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-spec-builders.h +1918 -0
  356. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock.h +95 -0
  357. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h +8 -0
  358. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump +10 -0
  359. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-matchers.h +38 -0
  360. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-port.h +46 -0
  361. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h +286 -0
  362. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump +136 -0
  363. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-internal-utils.h +574 -0
  364. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-port.h +87 -0
  365. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/make/Makefile +101 -0
  366. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock.sln +32 -0
  367. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock.vcproj +191 -0
  368. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_config.vsprops +15 -0
  369. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_main.vcproj +187 -0
  370. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_test.vcproj +201 -0
  371. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock.sln +46 -0
  372. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock.vcxproj +145 -0
  373. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_config.props +19 -0
  374. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_main.vcxproj +151 -0
  375. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_test.vcxproj +176 -0
  376. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock.sln +46 -0
  377. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock.vcxproj +145 -0
  378. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_config.props +19 -0
  379. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_main.vcxproj +151 -0
  380. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_test.vcxproj +176 -0
  381. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/fuse_gmock_files.py +240 -0
  382. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/LICENSE +203 -0
  383. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/README +34 -0
  384. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/README.cppclean +115 -0
  385. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/__init__.py +0 -0
  386. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/ast.py +1733 -0
  387. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/gmock_class.py +227 -0
  388. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/gmock_class_test.py +448 -0
  389. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/keywords.py +59 -0
  390. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/tokenize.py +287 -0
  391. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/utils.py +41 -0
  392. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/gmock_gen.py +31 -0
  393. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/gmock-config.in +303 -0
  394. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/gmock_doctor.py +640 -0
  395. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/upload.py +1387 -0
  396. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/upload_gmock.py +78 -0
  397. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-all.cc +47 -0
  398. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-cardinalities.cc +156 -0
  399. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-internal-utils.cc +204 -0
  400. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-matchers.cc +573 -0
  401. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-spec-builders.cc +883 -0
  402. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock.cc +205 -0
  403. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock_main.cc +54 -0
  404. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/BUILD.bazel +123 -0
  405. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-actions_test.cc +1575 -0
  406. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-cardinalities_test.cc +428 -0
  407. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-actions_test.cc +1230 -0
  408. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-function-mockers_test.cc +647 -0
  409. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-internal-utils_test.cc +129 -0
  410. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-matchers_test.cc +1341 -0
  411. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-internal-utils_test.cc +718 -0
  412. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-matchers_test.cc +6767 -0
  413. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-more-actions_test.cc +710 -0
  414. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-nice-strict_test.cc +511 -0
  415. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-port_test.cc +43 -0
  416. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-spec-builders_test.cc +2771 -0
  417. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_all_test.cc +51 -0
  418. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_ex_test.cc +81 -0
  419. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_leak_test.py +108 -0
  420. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_leak_test_.cc +100 -0
  421. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link2_test.cc +40 -0
  422. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link_test.cc +40 -0
  423. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link_test.h +691 -0
  424. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test.py +183 -0
  425. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test_.cc +310 -0
  426. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test_golden.txt +317 -0
  427. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_stress_test.cc +323 -0
  428. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_test.cc +262 -0
  429. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_test_utils.py +110 -0
  430. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CHANGES +157 -0
  431. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CMakeLists.txt +312 -0
  432. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CONTRIBUTORS +37 -0
  433. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/LICENSE +28 -0
  434. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/Makefile.am +339 -0
  435. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/README.md +341 -0
  436. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/cmake/gtest.pc.in +9 -0
  437. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/cmake/gtest_main.pc.in +10 -0
  438. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/cmake/internal_utils.cmake +280 -0
  439. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest.cbproj +138 -0
  440. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest.groupproj +54 -0
  441. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_all.cc +38 -0
  442. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_link.cc +40 -0
  443. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_main.cbproj +82 -0
  444. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_unittest.cbproj +88 -0
  445. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/configure.ac +68 -0
  446. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/Pkgconfig.md +146 -0
  447. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/PumpManual.md +177 -0
  448. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/XcodeGuide.md +93 -0
  449. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/advanced.md +2416 -0
  450. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/faq.md +1092 -0
  451. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/primer.md +536 -0
  452. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/samples.md +14 -0
  453. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-death-test.h +342 -0
  454. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-message.h +249 -0
  455. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-param-test.h +1438 -0
  456. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-param-test.h.pump +501 -0
  457. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-printers.h +1082 -0
  458. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-spi.h +231 -0
  459. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-test-part.h +179 -0
  460. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-typed-test.h +264 -0
  461. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest.h +2332 -0
  462. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest_pred_impl.h +357 -0
  463. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest_prod.h +61 -0
  464. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest-port.h +70 -0
  465. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
  466. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest.h +45 -0
  467. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-death-test-internal.h +275 -0
  468. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-filepath.h +205 -0
  469. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-internal.h +1277 -0
  470. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-linked_ptr.h +243 -0
  471. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util-generated.h +5139 -0
  472. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +279 -0
  473. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util.h +723 -0
  474. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-port-arch.h +100 -0
  475. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-port.h +2687 -0
  476. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-string.h +167 -0
  477. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-tuple.h +1020 -0
  478. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-tuple.h.pump +347 -0
  479. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-type-util.h +3347 -0
  480. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-type-util.h.pump +313 -0
  481. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/m4/acx_pthread.m4 +363 -0
  482. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/m4/gtest.m4 +74 -0
  483. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/make/Makefile +82 -0
  484. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest-md.sln +55 -0
  485. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest-md.vcxproj +149 -0
  486. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest-md.vcxproj.filters +18 -0
  487. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest.sln +55 -0
  488. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest.vcxproj +149 -0
  489. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest.vcxproj.filters +18 -0
  490. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main-md.vcxproj +154 -0
  491. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main-md.vcxproj.filters +18 -0
  492. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main.vcxproj +162 -0
  493. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main.vcxproj.filters +18 -0
  494. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test-md.vcxproj +199 -0
  495. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test-md.vcxproj.filters +26 -0
  496. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test.vcxproj +191 -0
  497. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test.vcxproj.filters +26 -0
  498. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest-md.vcxproj +188 -0
  499. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest-md.vcxproj.filters +18 -0
  500. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest.vcxproj +180 -0
  501. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest.vcxproj.filters +18 -0
  502. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/prime_tables.h +127 -0
  503. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1.cc +68 -0
  504. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1.h +43 -0
  505. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample10_unittest.cc +140 -0
  506. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1_unittest.cc +154 -0
  507. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2.cc +56 -0
  508. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2.h +85 -0
  509. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2_unittest.cc +110 -0
  510. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample3-inl.h +172 -0
  511. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample3_unittest.cc +152 -0
  512. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4.cc +46 -0
  513. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4.h +53 -0
  514. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4_unittest.cc +49 -0
  515. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample5_unittest.cc +199 -0
  516. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample6_unittest.cc +225 -0
  517. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample7_unittest.cc +118 -0
  518. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample8_unittest.cc +174 -0
  519. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample9_unittest.cc +157 -0
  520. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/common.py +83 -0
  521. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/fuse_gtest_files.py +253 -0
  522. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/gen_gtest_pred_impl.py +730 -0
  523. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/gtest-config.in +274 -0
  524. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/pump.py +855 -0
  525. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/release_docs.py +158 -0
  526. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/test/Makefile +59 -0
  527. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/upload.py +1387 -0
  528. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/upload_gtest.py +78 -0
  529. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-all.cc +48 -0
  530. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-death-test.cc +1536 -0
  531. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-filepath.cc +385 -0
  532. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-internal-inl.h +1175 -0
  533. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-port.cc +1277 -0
  534. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-printers.cc +458 -0
  535. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-test-part.cc +102 -0
  536. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-typed-test.cc +119 -0
  537. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest.cc +5846 -0
  538. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest_main.cc +38 -0
  539. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/BUILD.bazel +396 -0
  540. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-death-test_ex_test.cc +93 -0
  541. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-death-test_test.cc +1424 -0
  542. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-filepath_test.cc +652 -0
  543. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-linked_ptr_test.cc +154 -0
  544. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-listener_test.cc +311 -0
  545. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-message_test.cc +159 -0
  546. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-options_test.cc +213 -0
  547. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test2_test.cc +61 -0
  548. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test_test.cc +1110 -0
  549. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test_test.h +53 -0
  550. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-port_test.cc +1303 -0
  551. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-printers_test.cc +1737 -0
  552. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-test-part_test.cc +208 -0
  553. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-tuple_test.cc +320 -0
  554. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test2_test.cc +45 -0
  555. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test_test.cc +380 -0
  556. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test_test.h +66 -0
  557. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-unittest-api_test.cc +341 -0
  558. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_all_test.cc +47 -0
  559. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_assert_by_exception_test.cc +119 -0
  560. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_break_on_failure_unittest.py +210 -0
  561. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_break_on_failure_unittest_.cc +87 -0
  562. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_catch_exceptions_test.py +235 -0
  563. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_catch_exceptions_test_.cc +311 -0
  564. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_color_test.py +129 -0
  565. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_color_test_.cc +63 -0
  566. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_env_var_test.py +119 -0
  567. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_env_var_test_.cc +124 -0
  568. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_environment_test.cc +189 -0
  569. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_filter_unittest.py +638 -0
  570. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_filter_unittest_.cc +138 -0
  571. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_help_test.py +172 -0
  572. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_help_test_.cc +46 -0
  573. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_json_outfiles_test.py +162 -0
  574. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_json_output_unittest.py +611 -0
  575. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_json_test_utils.py +60 -0
  576. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_list_tests_unittest.py +207 -0
  577. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_list_tests_unittest_.cc +157 -0
  578. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_main_unittest.cc +45 -0
  579. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_no_test_unittest.cc +56 -0
  580. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test.py +344 -0
  581. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test_.cc +1067 -0
  582. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test_golden_lin.txt +781 -0
  583. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_pred_impl_unittest.cc +2427 -0
  584. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_premature_exit_test.cc +127 -0
  585. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_prod_test.cc +57 -0
  586. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_repeat_test.cc +236 -0
  587. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_shuffle_test.py +325 -0
  588. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_shuffle_test_.cc +103 -0
  589. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_sole_header_test.cc +57 -0
  590. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_stress_test.cc +250 -0
  591. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_test_utils.py +318 -0
  592. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_testbridge_test.py +65 -0
  593. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_testbridge_test_.cc +44 -0
  594. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_ex_test.cc +92 -0
  595. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_test.py +171 -0
  596. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_test_.cc +72 -0
  597. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_uninitialized_test.py +69 -0
  598. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_uninitialized_test_.cc +43 -0
  599. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_unittest.cc +7797 -0
  600. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfile1_test_.cc +48 -0
  601. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfile2_test_.cc +48 -0
  602. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfiles_test.py +140 -0
  603. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_output_unittest.py +378 -0
  604. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_output_unittest_.cc +179 -0
  605. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_test_utils.py +196 -0
  606. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/production.cc +36 -0
  607. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/production.h +55 -0
  608. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/DebugProject.xcconfig +30 -0
  609. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/FrameworkTarget.xcconfig +17 -0
  610. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/General.xcconfig +41 -0
  611. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/ReleaseProject.xcconfig +32 -0
  612. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/StaticLibraryTarget.xcconfig +18 -0
  613. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/TestTarget.xcconfig +8 -0
  614. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Resources/Info.plist +30 -0
  615. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/Info.plist +28 -0
  616. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj +457 -0
  617. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/runtests.sh +62 -0
  618. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget.cc +63 -0
  619. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget.h +59 -0
  620. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget_test.cc +68 -0
  621. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Scripts/runtests.sh +65 -0
  622. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Scripts/versiongenerate.py +100 -0
  623. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/gtest.xcodeproj/project.pbxproj +1182 -0
  624. data/ext/rj_schema/rapidjson/travis-doxygen.sh +128 -0
  625. data/ext/rj_schema/rj_schema.cpp +162 -18
  626. data/lib/rj_schema.rb +1 -1
  627. metadata +626 -3
@@ -0,0 +1,373 @@
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.
4
+ //
5
+ // Licensed under the MIT License (the "License"); you may not use this file except
6
+ // in compliance with the License. You may obtain a copy of the License at
7
+ //
8
+ // http://opensource.org/licenses/MIT
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software distributed
11
+ // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
+ // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
+ // specific language governing permissions and limitations under the License.
14
+
15
+ #include "unittest.h"
16
+ #include "rapidjson/reader.h"
17
+ #include "rapidjson/prettywriter.h"
18
+ #include "rapidjson/stringbuffer.h"
19
+ #include "rapidjson/filewritestream.h"
20
+
21
+ #ifdef __clang__
22
+ RAPIDJSON_DIAG_PUSH
23
+ RAPIDJSON_DIAG_OFF(c++98-compat)
24
+ #endif
25
+
26
+ using namespace rapidjson;
27
+
28
+ static const char kJson[] = "{\"hello\":\"world\",\"t\":true,\"f\":false,\"n\":null,\"i\":123,\"pi\":3.1416,\"a\":[1,2,3,-1],\"u64\":1234567890123456789,\"i64\":-1234567890123456789}";
29
+ static const char kPrettyJson[] =
30
+ "{\n"
31
+ " \"hello\": \"world\",\n"
32
+ " \"t\": true,\n"
33
+ " \"f\": false,\n"
34
+ " \"n\": null,\n"
35
+ " \"i\": 123,\n"
36
+ " \"pi\": 3.1416,\n"
37
+ " \"a\": [\n"
38
+ " 1,\n"
39
+ " 2,\n"
40
+ " 3,\n"
41
+ " -1\n"
42
+ " ],\n"
43
+ " \"u64\": 1234567890123456789,\n"
44
+ " \"i64\": -1234567890123456789\n"
45
+ "}";
46
+
47
+ static const char kPrettyJson_FormatOptions_SLA[] =
48
+ "{\n"
49
+ " \"hello\": \"world\",\n"
50
+ " \"t\": true,\n"
51
+ " \"f\": false,\n"
52
+ " \"n\": null,\n"
53
+ " \"i\": 123,\n"
54
+ " \"pi\": 3.1416,\n"
55
+ " \"a\": [1, 2, 3, -1],\n"
56
+ " \"u64\": 1234567890123456789,\n"
57
+ " \"i64\": -1234567890123456789\n"
58
+ "}";
59
+
60
+ TEST(PrettyWriter, Basic) {
61
+ StringBuffer buffer;
62
+ PrettyWriter<StringBuffer> writer(buffer);
63
+ Reader reader;
64
+ StringStream s(kJson);
65
+ reader.Parse(s, writer);
66
+ EXPECT_STREQ(kPrettyJson, buffer.GetString());
67
+ }
68
+
69
+ TEST(PrettyWriter, FormatOptions) {
70
+ StringBuffer buffer;
71
+ PrettyWriter<StringBuffer> writer(buffer);
72
+ writer.SetFormatOptions(kFormatSingleLineArray);
73
+ Reader reader;
74
+ StringStream s(kJson);
75
+ reader.Parse(s, writer);
76
+ EXPECT_STREQ(kPrettyJson_FormatOptions_SLA, buffer.GetString());
77
+ }
78
+
79
+ TEST(PrettyWriter, SetIndent) {
80
+ StringBuffer buffer;
81
+ PrettyWriter<StringBuffer> writer(buffer);
82
+ writer.SetIndent('\t', 1);
83
+ Reader reader;
84
+ StringStream s(kJson);
85
+ reader.Parse(s, writer);
86
+ EXPECT_STREQ(
87
+ "{\n"
88
+ "\t\"hello\": \"world\",\n"
89
+ "\t\"t\": true,\n"
90
+ "\t\"f\": false,\n"
91
+ "\t\"n\": null,\n"
92
+ "\t\"i\": 123,\n"
93
+ "\t\"pi\": 3.1416,\n"
94
+ "\t\"a\": [\n"
95
+ "\t\t1,\n"
96
+ "\t\t2,\n"
97
+ "\t\t3,\n"
98
+ "\t\t-1\n"
99
+ "\t],\n"
100
+ "\t\"u64\": 1234567890123456789,\n"
101
+ "\t\"i64\": -1234567890123456789\n"
102
+ "}",
103
+ buffer.GetString());
104
+ }
105
+
106
+ TEST(PrettyWriter, String) {
107
+ StringBuffer buffer;
108
+ PrettyWriter<StringBuffer> writer(buffer);
109
+ EXPECT_TRUE(writer.StartArray());
110
+ EXPECT_TRUE(writer.String("Hello\n"));
111
+ EXPECT_TRUE(writer.EndArray());
112
+ EXPECT_STREQ("[\n \"Hello\\n\"\n]", buffer.GetString());
113
+ }
114
+
115
+ #if RAPIDJSON_HAS_STDSTRING
116
+ TEST(PrettyWriter, String_STDSTRING) {
117
+ StringBuffer buffer;
118
+ PrettyWriter<StringBuffer> writer(buffer);
119
+ EXPECT_TRUE(writer.StartArray());
120
+ EXPECT_TRUE(writer.String(std::string("Hello\n")));
121
+ EXPECT_TRUE(writer.EndArray());
122
+ EXPECT_STREQ("[\n \"Hello\\n\"\n]", buffer.GetString());
123
+ }
124
+ #endif
125
+
126
+ #include <sstream>
127
+
128
+ class OStreamWrapper {
129
+ public:
130
+ typedef char Ch;
131
+
132
+ OStreamWrapper(std::ostream& os) : os_(os) {}
133
+
134
+ Ch Peek() const { assert(false); return '\0'; }
135
+ Ch Take() { assert(false); return '\0'; }
136
+ size_t Tell() const { return 0; }
137
+
138
+ Ch* PutBegin() { assert(false); return 0; }
139
+ void Put(Ch c) { os_.put(c); }
140
+ void Flush() { os_.flush(); }
141
+ size_t PutEnd(Ch*) { assert(false); return 0; }
142
+
143
+ private:
144
+ OStreamWrapper(const OStreamWrapper&);
145
+ OStreamWrapper& operator=(const OStreamWrapper&);
146
+
147
+ std::ostream& os_;
148
+ };
149
+
150
+ // For covering PutN() generic version
151
+ TEST(PrettyWriter, OStreamWrapper) {
152
+ StringStream s(kJson);
153
+
154
+ std::stringstream ss;
155
+ OStreamWrapper os(ss);
156
+
157
+ PrettyWriter<OStreamWrapper> writer(os);
158
+
159
+ Reader reader;
160
+ reader.Parse(s, writer);
161
+
162
+ std::string actual = ss.str();
163
+ EXPECT_STREQ(kPrettyJson, actual.c_str());
164
+ }
165
+
166
+ // For covering FileWriteStream::PutN()
167
+ TEST(PrettyWriter, FileWriteStream) {
168
+ char filename[L_tmpnam];
169
+ FILE* fp = TempFile(filename);
170
+ ASSERT_TRUE(fp!=NULL);
171
+ char buffer[16];
172
+ FileWriteStream os(fp, buffer, sizeof(buffer));
173
+ PrettyWriter<FileWriteStream> writer(os);
174
+ Reader reader;
175
+ StringStream s(kJson);
176
+ reader.Parse(s, writer);
177
+ fclose(fp);
178
+
179
+ fp = fopen(filename, "rb");
180
+ fseek(fp, 0, SEEK_END);
181
+ size_t size = static_cast<size_t>(ftell(fp));
182
+ fseek(fp, 0, SEEK_SET);
183
+ char* json = static_cast<char*>(malloc(size + 1));
184
+ size_t readLength = fread(json, 1, size, fp);
185
+ json[readLength] = '\0';
186
+ fclose(fp);
187
+ remove(filename);
188
+ EXPECT_STREQ(kPrettyJson, json);
189
+ free(json);
190
+ }
191
+
192
+ TEST(PrettyWriter, RawValue) {
193
+ StringBuffer buffer;
194
+ PrettyWriter<StringBuffer> writer(buffer);
195
+ writer.StartObject();
196
+ writer.Key("a");
197
+ writer.Int(1);
198
+ writer.Key("raw");
199
+ const char json[] = "[\"Hello\\nWorld\", 123.456]";
200
+ writer.RawValue(json, strlen(json), kArrayType);
201
+ writer.EndObject();
202
+ EXPECT_TRUE(writer.IsComplete());
203
+ EXPECT_STREQ(
204
+ "{\n"
205
+ " \"a\": 1,\n"
206
+ " \"raw\": [\"Hello\\nWorld\", 123.456]\n" // no indentation within raw value
207
+ "}",
208
+ buffer.GetString());
209
+ }
210
+
211
+ TEST(PrettyWriter, InvalidEventSequence) {
212
+ // {]
213
+ {
214
+ StringBuffer buffer;
215
+ PrettyWriter<StringBuffer> writer(buffer);
216
+ writer.StartObject();
217
+ EXPECT_THROW(writer.EndArray(), AssertException);
218
+ EXPECT_FALSE(writer.IsComplete());
219
+ }
220
+
221
+ // [}
222
+ {
223
+ StringBuffer buffer;
224
+ PrettyWriter<StringBuffer> writer(buffer);
225
+ writer.StartArray();
226
+ EXPECT_THROW(writer.EndObject(), AssertException);
227
+ EXPECT_FALSE(writer.IsComplete());
228
+ }
229
+
230
+ // { 1:
231
+ {
232
+ StringBuffer buffer;
233
+ PrettyWriter<StringBuffer> writer(buffer);
234
+ writer.StartObject();
235
+ EXPECT_THROW(writer.Int(1), AssertException);
236
+ EXPECT_FALSE(writer.IsComplete());
237
+ }
238
+
239
+ // { 'a' }
240
+ {
241
+ StringBuffer buffer;
242
+ PrettyWriter<StringBuffer> writer(buffer);
243
+ writer.StartObject();
244
+ writer.Key("a");
245
+ EXPECT_THROW(writer.EndObject(), AssertException);
246
+ EXPECT_FALSE(writer.IsComplete());
247
+ }
248
+
249
+ // { 'a':'b','c' }
250
+ {
251
+ StringBuffer buffer;
252
+ PrettyWriter<StringBuffer> writer(buffer);
253
+ writer.StartObject();
254
+ writer.Key("a");
255
+ writer.String("b");
256
+ writer.Key("c");
257
+ EXPECT_THROW(writer.EndObject(), AssertException);
258
+ EXPECT_FALSE(writer.IsComplete());
259
+ }
260
+ }
261
+
262
+ TEST(PrettyWriter, NaN) {
263
+ double nan = std::numeric_limits<double>::quiet_NaN();
264
+
265
+ EXPECT_TRUE(internal::Double(nan).IsNan());
266
+ StringBuffer buffer;
267
+ {
268
+ PrettyWriter<StringBuffer> writer(buffer);
269
+ EXPECT_FALSE(writer.Double(nan));
270
+ }
271
+ {
272
+ PrettyWriter<StringBuffer, UTF8<>, UTF8<>, CrtAllocator, kWriteNanAndInfFlag> writer(buffer);
273
+ EXPECT_TRUE(writer.Double(nan));
274
+ EXPECT_STREQ("NaN", buffer.GetString());
275
+ }
276
+ GenericStringBuffer<UTF16<> > buffer2;
277
+ PrettyWriter<GenericStringBuffer<UTF16<> > > writer2(buffer2);
278
+ EXPECT_FALSE(writer2.Double(nan));
279
+ }
280
+
281
+ TEST(PrettyWriter, Inf) {
282
+ double inf = std::numeric_limits<double>::infinity();
283
+
284
+ EXPECT_TRUE(internal::Double(inf).IsInf());
285
+ StringBuffer buffer;
286
+ {
287
+ PrettyWriter<StringBuffer> writer(buffer);
288
+ EXPECT_FALSE(writer.Double(inf));
289
+ }
290
+ {
291
+ PrettyWriter<StringBuffer> writer(buffer);
292
+ EXPECT_FALSE(writer.Double(-inf));
293
+ }
294
+ {
295
+ PrettyWriter<StringBuffer, UTF8<>, UTF8<>, CrtAllocator, kWriteNanAndInfFlag> writer(buffer);
296
+ EXPECT_TRUE(writer.Double(inf));
297
+ }
298
+ {
299
+ PrettyWriter<StringBuffer, UTF8<>, UTF8<>, CrtAllocator, kWriteNanAndInfFlag> writer(buffer);
300
+ EXPECT_TRUE(writer.Double(-inf));
301
+ }
302
+ EXPECT_STREQ("Infinity-Infinity", buffer.GetString());
303
+ }
304
+
305
+ TEST(PrettyWriter, Issue_889) {
306
+ char buf[100] = "Hello";
307
+
308
+ StringBuffer buffer;
309
+ PrettyWriter<StringBuffer> writer(buffer);
310
+ writer.StartArray();
311
+ writer.String(buf);
312
+ writer.EndArray();
313
+
314
+ EXPECT_STREQ("[\n \"Hello\"\n]", buffer.GetString());
315
+ EXPECT_TRUE(writer.IsComplete()); \
316
+ }
317
+
318
+
319
+ #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
320
+
321
+ static PrettyWriter<StringBuffer> WriterGen(StringBuffer &target) {
322
+ PrettyWriter<StringBuffer> writer(target);
323
+ writer.StartObject();
324
+ writer.Key("a");
325
+ writer.Int(1);
326
+ return writer;
327
+ }
328
+
329
+ TEST(PrettyWriter, MoveCtor) {
330
+ StringBuffer buffer;
331
+ PrettyWriter<StringBuffer> writer(WriterGen(buffer));
332
+ writer.EndObject();
333
+ EXPECT_TRUE(writer.IsComplete());
334
+ EXPECT_STREQ(
335
+ "{\n"
336
+ " \"a\": 1\n"
337
+ "}",
338
+ buffer.GetString());
339
+ }
340
+ #endif
341
+
342
+ TEST(PrettyWriter, Issue_1336) {
343
+ #define T(meth, val, expected) \
344
+ { \
345
+ StringBuffer buffer; \
346
+ PrettyWriter<StringBuffer> writer(buffer); \
347
+ writer.meth(val); \
348
+ \
349
+ EXPECT_STREQ(expected, buffer.GetString()); \
350
+ EXPECT_TRUE(writer.IsComplete()); \
351
+ }
352
+
353
+ T(Bool, false, "false");
354
+ T(Bool, true, "true");
355
+ T(Int, 0, "0");
356
+ T(Uint, 0, "0");
357
+ T(Int64, 0, "0");
358
+ T(Uint64, 0, "0");
359
+ T(Double, 0, "0.0");
360
+ T(String, "Hello", "\"Hello\"");
361
+ #undef T
362
+
363
+ StringBuffer buffer;
364
+ PrettyWriter<StringBuffer> writer(buffer);
365
+ writer.Null();
366
+
367
+ EXPECT_STREQ("null", buffer.GetString());
368
+ EXPECT_TRUE(writer.IsComplete());
369
+ }
370
+
371
+ #ifdef __clang__
372
+ RAPIDJSON_DIAG_POP
373
+ #endif
@@ -0,0 +1,2228 @@
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.
4
+ //
5
+ // Licensed under the MIT License (the "License"); you may not use this file except
6
+ // in compliance with the License. You may obtain a copy of the License at
7
+ //
8
+ // http://opensource.org/licenses/MIT
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software distributed
11
+ // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
+ // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
+ // specific language governing permissions and limitations under the License.
14
+
15
+ #include "unittest.h"
16
+
17
+ #include "rapidjson/reader.h"
18
+ #include "rapidjson/internal/dtoa.h"
19
+ #include "rapidjson/internal/itoa.h"
20
+ #include "rapidjson/memorystream.h"
21
+
22
+ #include <limits>
23
+
24
+ using namespace rapidjson;
25
+
26
+ RAPIDJSON_DIAG_PUSH
27
+ #ifdef __GNUC__
28
+ RAPIDJSON_DIAG_OFF(effc++)
29
+ RAPIDJSON_DIAG_OFF(float-equal)
30
+ RAPIDJSON_DIAG_OFF(missing-noreturn)
31
+ #if __GNUC__ >= 7
32
+ RAPIDJSON_DIAG_OFF(dangling-else)
33
+ #endif
34
+ #endif // __GNUC__
35
+
36
+ #ifdef __clang__
37
+ RAPIDJSON_DIAG_OFF(variadic-macros)
38
+ RAPIDJSON_DIAG_OFF(c++98-compat-pedantic)
39
+ #endif
40
+
41
+ template<bool expect>
42
+ struct ParseBoolHandler : BaseReaderHandler<UTF8<>, ParseBoolHandler<expect> > {
43
+ ParseBoolHandler() : step_(0) {}
44
+ bool Default() { ADD_FAILURE(); return false; }
45
+ // gcc 4.8.x generates warning in EXPECT_EQ(bool, bool) on this gtest version.
46
+ // Workaround with EXPECT_TRUE().
47
+ bool Bool(bool b) { /*EXPECT_EQ(expect, b); */EXPECT_TRUE(expect == b); ++step_; return true; }
48
+
49
+ unsigned step_;
50
+ };
51
+
52
+ TEST(Reader, ParseTrue) {
53
+ StringStream s("true");
54
+ ParseBoolHandler<true> h;
55
+ Reader reader;
56
+ reader.Parse(s, h);
57
+ EXPECT_EQ(1u, h.step_);
58
+ }
59
+
60
+ TEST(Reader, ParseFalse) {
61
+ StringStream s("false");
62
+ ParseBoolHandler<false> h;
63
+ Reader reader;
64
+ reader.Parse(s, h);
65
+ EXPECT_EQ(1u, h.step_);
66
+ }
67
+
68
+ struct ParseIntHandler : BaseReaderHandler<UTF8<>, ParseIntHandler> {
69
+ ParseIntHandler() : step_(0), actual_() {}
70
+ bool Default() { ADD_FAILURE(); return false; }
71
+ bool Int(int i) { actual_ = i; step_++; return true; }
72
+
73
+ unsigned step_;
74
+ int actual_;
75
+ };
76
+
77
+ struct ParseUintHandler : BaseReaderHandler<UTF8<>, ParseUintHandler> {
78
+ ParseUintHandler() : step_(0), actual_() {}
79
+ bool Default() { ADD_FAILURE(); return false; }
80
+ bool Uint(unsigned i) { actual_ = i; step_++; return true; }
81
+
82
+ unsigned step_;
83
+ unsigned actual_;
84
+ };
85
+
86
+ struct ParseInt64Handler : BaseReaderHandler<UTF8<>, ParseInt64Handler> {
87
+ ParseInt64Handler() : step_(0), actual_() {}
88
+ bool Default() { ADD_FAILURE(); return false; }
89
+ bool Int64(int64_t i) { actual_ = i; step_++; return true; }
90
+
91
+ unsigned step_;
92
+ int64_t actual_;
93
+ };
94
+
95
+ struct ParseUint64Handler : BaseReaderHandler<UTF8<>, ParseUint64Handler> {
96
+ ParseUint64Handler() : step_(0), actual_() {}
97
+ bool Default() { ADD_FAILURE(); return false; }
98
+ bool Uint64(uint64_t i) { actual_ = i; step_++; return true; }
99
+
100
+ unsigned step_;
101
+ uint64_t actual_;
102
+ };
103
+
104
+ struct ParseDoubleHandler : BaseReaderHandler<UTF8<>, ParseDoubleHandler> {
105
+ ParseDoubleHandler() : step_(0), actual_() {}
106
+ bool Default() { ADD_FAILURE(); return false; }
107
+ bool Double(double d) { actual_ = d; step_++; return true; }
108
+
109
+ unsigned step_;
110
+ double actual_;
111
+ };
112
+
113
+ TEST(Reader, ParseNumber_Integer) {
114
+ #define TEST_INTEGER(Handler, str, x) \
115
+ { \
116
+ StringStream s(str); \
117
+ Handler h; \
118
+ Reader reader; \
119
+ reader.Parse(s, h); \
120
+ EXPECT_EQ(1u, h.step_); \
121
+ EXPECT_EQ(x, h.actual_); \
122
+ }
123
+
124
+ TEST_INTEGER(ParseUintHandler, "0", 0u);
125
+ TEST_INTEGER(ParseUintHandler, "123", 123u);
126
+ TEST_INTEGER(ParseUintHandler, "2147483648", 2147483648u); // 2^31 - 1 (cannot be stored in int)
127
+ TEST_INTEGER(ParseUintHandler, "4294967295", 4294967295u);
128
+
129
+ TEST_INTEGER(ParseIntHandler, "-123", -123);
130
+ TEST_INTEGER(ParseIntHandler, "-2147483648", static_cast<int32_t>(0x80000000)); // -2^31 (min of int)
131
+
132
+ TEST_INTEGER(ParseUint64Handler, "4294967296", RAPIDJSON_UINT64_C2(1, 0)); // 2^32 (max of unsigned + 1, force to use uint64_t)
133
+ TEST_INTEGER(ParseUint64Handler, "18446744073709551615", RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF)); // 2^64 - 1 (max of uint64_t)
134
+
135
+ 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)
136
+ TEST_INTEGER(ParseInt64Handler, "-9223372036854775808", static_cast<int64_t>(RAPIDJSON_UINT64_C2(0x80000000, 0x00000000))); // -2^63 (min of int64_t)
137
+
138
+ // Random test for uint32_t/int32_t
139
+ {
140
+ union {
141
+ uint32_t u;
142
+ int32_t i;
143
+ }u;
144
+ Random r;
145
+
146
+ for (unsigned i = 0; i < 100000; i++) {
147
+ u.u = r();
148
+
149
+ char buffer[32];
150
+ *internal::u32toa(u.u, buffer) = '\0';
151
+ TEST_INTEGER(ParseUintHandler, buffer, u.u);
152
+
153
+ if (u.i < 0) {
154
+ *internal::i32toa(u.i, buffer) = '\0';
155
+ TEST_INTEGER(ParseIntHandler, buffer, u.i);
156
+ }
157
+ }
158
+ }
159
+
160
+ // Random test for uint64_t/int64_t
161
+ {
162
+ union {
163
+ uint64_t u;
164
+ int64_t i;
165
+ }u;
166
+ Random r;
167
+
168
+ for (unsigned i = 0; i < 100000; i++) {
169
+ u.u = uint64_t(r()) << 32;
170
+ u.u |= r();
171
+
172
+ char buffer[32];
173
+ if (u.u > uint64_t(4294967295u)) {
174
+ *internal::u64toa(u.u, buffer) = '\0';
175
+ TEST_INTEGER(ParseUint64Handler, buffer, u.u);
176
+ }
177
+
178
+ if (u.i < -int64_t(2147483648u)) {
179
+ *internal::i64toa(u.i, buffer) = '\0';
180
+ TEST_INTEGER(ParseInt64Handler, buffer, u.i);
181
+ }
182
+ }
183
+ }
184
+ #undef TEST_INTEGER
185
+ }
186
+
187
+ template<bool fullPrecision>
188
+ static void TestParseDouble() {
189
+ #define TEST_DOUBLE(fullPrecision, str, x) \
190
+ { \
191
+ StringStream s(str); \
192
+ ParseDoubleHandler h; \
193
+ Reader reader; \
194
+ ASSERT_EQ(kParseErrorNone, reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h).Code()); \
195
+ EXPECT_EQ(1u, h.step_); \
196
+ internal::Double e(x), a(h.actual_); \
197
+ if (fullPrecision) { \
198
+ EXPECT_EQ(e.Uint64Value(), a.Uint64Value()); \
199
+ if (e.Uint64Value() != a.Uint64Value()) \
200
+ printf(" String: %s\n Actual: %.17g\nExpected: %.17g\n", str, h.actual_, x); \
201
+ } \
202
+ else { \
203
+ EXPECT_EQ(e.Sign(), a.Sign()); /* for 0.0 != -0.0 */ \
204
+ EXPECT_DOUBLE_EQ(x, h.actual_); \
205
+ } \
206
+ }
207
+
208
+ TEST_DOUBLE(fullPrecision, "0.0", 0.0);
209
+ TEST_DOUBLE(fullPrecision, "-0.0", -0.0); // For checking issue #289
210
+ TEST_DOUBLE(fullPrecision, "0e100", 0.0); // For checking issue #1249
211
+ TEST_DOUBLE(fullPrecision, "1.0", 1.0);
212
+ TEST_DOUBLE(fullPrecision, "-1.0", -1.0);
213
+ TEST_DOUBLE(fullPrecision, "1.5", 1.5);
214
+ TEST_DOUBLE(fullPrecision, "-1.5", -1.5);
215
+ TEST_DOUBLE(fullPrecision, "3.1416", 3.1416);
216
+ TEST_DOUBLE(fullPrecision, "1E10", 1E10);
217
+ TEST_DOUBLE(fullPrecision, "1e10", 1e10);
218
+ TEST_DOUBLE(fullPrecision, "1E+10", 1E+10);
219
+ TEST_DOUBLE(fullPrecision, "1E-10", 1E-10);
220
+ TEST_DOUBLE(fullPrecision, "-1E10", -1E10);
221
+ TEST_DOUBLE(fullPrecision, "-1e10", -1e10);
222
+ TEST_DOUBLE(fullPrecision, "-1E+10", -1E+10);
223
+ TEST_DOUBLE(fullPrecision, "-1E-10", -1E-10);
224
+ TEST_DOUBLE(fullPrecision, "1.234E+10", 1.234E+10);
225
+ TEST_DOUBLE(fullPrecision, "1.234E-10", 1.234E-10);
226
+ TEST_DOUBLE(fullPrecision, "1.79769e+308", 1.79769e+308);
227
+ TEST_DOUBLE(fullPrecision, "2.22507e-308", 2.22507e-308);
228
+ TEST_DOUBLE(fullPrecision, "-1.79769e+308", -1.79769e+308);
229
+ TEST_DOUBLE(fullPrecision, "-2.22507e-308", -2.22507e-308);
230
+ TEST_DOUBLE(fullPrecision, "4.9406564584124654e-324", 4.9406564584124654e-324); // minimum denormal
231
+ TEST_DOUBLE(fullPrecision, "2.2250738585072009e-308", 2.2250738585072009e-308); // Max subnormal double
232
+ TEST_DOUBLE(fullPrecision, "2.2250738585072014e-308", 2.2250738585072014e-308); // Min normal positive double
233
+ TEST_DOUBLE(fullPrecision, "1.7976931348623157e+308", 1.7976931348623157e+308); // Max double
234
+ TEST_DOUBLE(fullPrecision, "1e-10000", 0.0); // must underflow
235
+ TEST_DOUBLE(fullPrecision, "18446744073709551616", 18446744073709551616.0); // 2^64 (max of uint64_t + 1, force to use double)
236
+ TEST_DOUBLE(fullPrecision, "-9223372036854775809", -9223372036854775809.0); // -2^63 - 1(min of int64_t + 1, force to use double)
237
+ TEST_DOUBLE(fullPrecision, "0.9868011474609375", 0.9868011474609375); // https://github.com/Tencent/rapidjson/issues/120
238
+ TEST_DOUBLE(fullPrecision, "123e34", 123e34); // Fast Path Cases In Disguise
239
+ TEST_DOUBLE(fullPrecision, "45913141877270640000.0", 45913141877270640000.0);
240
+ TEST_DOUBLE(fullPrecision, "2.2250738585072011e-308", 2.2250738585072011e-308); // http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
241
+ TEST_DOUBLE(fullPrecision, "1e-00011111111111", 0.0); // Issue #313
242
+ TEST_DOUBLE(fullPrecision, "-1e-00011111111111", -0.0);
243
+ TEST_DOUBLE(fullPrecision, "1e-214748363", 0.0); // Maximum supported negative exponent
244
+ TEST_DOUBLE(fullPrecision, "1e-214748364", 0.0);
245
+ TEST_DOUBLE(fullPrecision, "1e-21474836311", 0.0);
246
+ TEST_DOUBLE(fullPrecision, "1.00000000001e-2147483638", 0.0);
247
+ TEST_DOUBLE(fullPrecision, "0.017976931348623157e+310", 1.7976931348623157e+308); // Max double in another form
248
+ TEST_DOUBLE(fullPrecision, "128.74836467836484838364836483643636483648e-336", 0.0); // Issue #1251
249
+
250
+ // Since
251
+ // abs((2^-1022 - 2^-1074) - 2.2250738585072012e-308) = 3.109754131239141401123495768877590405345064751974375599... x 10^-324
252
+ // abs((2^-1022) - 2.2250738585072012e-308) = 1.830902327173324040642192159804623318305533274168872044... x 10 ^ -324
253
+ // So 2.2250738585072012e-308 should round to 2^-1022 = 2.2250738585072014e-308
254
+ TEST_DOUBLE(fullPrecision, "2.2250738585072012e-308", 2.2250738585072014e-308); // http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
255
+
256
+ // More closer to normal/subnormal boundary
257
+ // boundary = 2^-1022 - 2^-1075 = 2.225073858507201136057409796709131975934819546351645648... x 10^-308
258
+ TEST_DOUBLE(fullPrecision, "2.22507385850720113605740979670913197593481954635164564e-308", 2.2250738585072009e-308);
259
+ TEST_DOUBLE(fullPrecision, "2.22507385850720113605740979670913197593481954635164565e-308", 2.2250738585072014e-308);
260
+
261
+ // 1.0 is in (1.0 - 2^-54, 1.0 + 2^-53)
262
+ // 1.0 - 2^-54 = 0.999999999999999944488848768742172978818416595458984375
263
+ TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984375", 1.0); // round to even
264
+ TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984374", 0.99999999999999989); // previous double
265
+ TEST_DOUBLE(fullPrecision, "0.999999999999999944488848768742172978818416595458984376", 1.0); // next double
266
+ // 1.0 + 2^-53 = 1.00000000000000011102230246251565404236316680908203125
267
+ TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203125", 1.0); // round to even
268
+ TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203124", 1.0); // previous double
269
+ TEST_DOUBLE(fullPrecision, "1.00000000000000011102230246251565404236316680908203126", 1.00000000000000022); // next double
270
+
271
+ // Numbers from https://github.com/floitsch/double-conversion/blob/master/test/cctest/test-strtod.cc
272
+
273
+ TEST_DOUBLE(fullPrecision, "72057594037927928.0", 72057594037927928.0);
274
+ TEST_DOUBLE(fullPrecision, "72057594037927936.0", 72057594037927936.0);
275
+ TEST_DOUBLE(fullPrecision, "72057594037927932.0", 72057594037927936.0);
276
+ TEST_DOUBLE(fullPrecision, "7205759403792793199999e-5", 72057594037927928.0);
277
+ TEST_DOUBLE(fullPrecision, "7205759403792793200001e-5", 72057594037927936.0);
278
+
279
+ TEST_DOUBLE(fullPrecision, "9223372036854774784.0", 9223372036854774784.0);
280
+ TEST_DOUBLE(fullPrecision, "9223372036854775808.0", 9223372036854775808.0);
281
+ TEST_DOUBLE(fullPrecision, "9223372036854775296.0", 9223372036854775808.0);
282
+ TEST_DOUBLE(fullPrecision, "922337203685477529599999e-5", 9223372036854774784.0);
283
+ TEST_DOUBLE(fullPrecision, "922337203685477529600001e-5", 9223372036854775808.0);
284
+
285
+ TEST_DOUBLE(fullPrecision, "10141204801825834086073718800384", 10141204801825834086073718800384.0);
286
+ TEST_DOUBLE(fullPrecision, "10141204801825835211973625643008", 10141204801825835211973625643008.0);
287
+ TEST_DOUBLE(fullPrecision, "10141204801825834649023672221696", 10141204801825835211973625643008.0);
288
+ TEST_DOUBLE(fullPrecision, "1014120480182583464902367222169599999e-5", 10141204801825834086073718800384.0);
289
+ TEST_DOUBLE(fullPrecision, "1014120480182583464902367222169600001e-5", 10141204801825835211973625643008.0);
290
+
291
+ TEST_DOUBLE(fullPrecision, "5708990770823838890407843763683279797179383808", 5708990770823838890407843763683279797179383808.0);
292
+ TEST_DOUBLE(fullPrecision, "5708990770823839524233143877797980545530986496", 5708990770823839524233143877797980545530986496.0);
293
+ TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185152", 5708990770823839524233143877797980545530986496.0);
294
+ TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185151999e-3", 5708990770823838890407843763683279797179383808.0);
295
+ TEST_DOUBLE(fullPrecision, "5708990770823839207320493820740630171355185152001e-3", 5708990770823839524233143877797980545530986496.0);
296
+
297
+ {
298
+ char n1e308[310]; // '1' followed by 308 '0'
299
+ n1e308[0] = '1';
300
+ for (int i = 1; i < 309; i++)
301
+ n1e308[i] = '0';
302
+ n1e308[309] = '\0';
303
+ TEST_DOUBLE(fullPrecision, n1e308, 1E308);
304
+ }
305
+
306
+ // Cover trimming
307
+ TEST_DOUBLE(fullPrecision,
308
+ "2.22507385850720113605740979670913197593481954635164564802342610972482222202107694551652952390813508"
309
+ "7914149158913039621106870086438694594645527657207407820621743379988141063267329253552286881372149012"
310
+ "9811224514518898490572223072852551331557550159143974763979834118019993239625482890171070818506906306"
311
+ "6665599493827577257201576306269066333264756530000924588831643303777979186961204949739037782970490505"
312
+ "1080609940730262937128958950003583799967207254304360284078895771796150945516748243471030702609144621"
313
+ "5722898802581825451803257070188608721131280795122334262883686223215037756666225039825343359745688844"
314
+ "2390026549819838548794829220689472168983109969836584681402285424333066033985088644580400103493397042"
315
+ "7567186443383770486037861622771738545623065874679014086723327636718751234567890123456789012345678901"
316
+ "e-308",
317
+ 2.2250738585072014e-308);
318
+
319
+ {
320
+ static const unsigned count = 100; // Tested with 1000000 locally
321
+ Random r;
322
+ Reader reader; // Reusing reader to prevent heap allocation
323
+
324
+ // Exhaustively test different exponents with random significant
325
+ for (uint64_t exp = 0; exp < 2047; exp++) {
326
+ ;
327
+ for (unsigned i = 0; i < count; i++) {
328
+ // Need to call r() in two statements for cross-platform coherent sequence.
329
+ uint64_t u = (exp << 52) | uint64_t(r() & 0x000FFFFF) << 32;
330
+ u |= uint64_t(r());
331
+ internal::Double d = internal::Double(u);
332
+
333
+ char buffer[32];
334
+ *internal::dtoa(d.Value(), buffer) = '\0';
335
+
336
+ StringStream s(buffer);
337
+ ParseDoubleHandler h;
338
+ ASSERT_EQ(kParseErrorNone, reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h).Code());
339
+ EXPECT_EQ(1u, h.step_);
340
+ internal::Double a(h.actual_);
341
+ if (fullPrecision) {
342
+ EXPECT_EQ(d.Uint64Value(), a.Uint64Value());
343
+ if (d.Uint64Value() != a.Uint64Value())
344
+ printf(" String: %s\n Actual: %.17g\nExpected: %.17g\n", buffer, h.actual_, d.Value());
345
+ }
346
+ else {
347
+ EXPECT_EQ(d.Sign(), a.Sign()); // for 0.0 != -0.0
348
+ EXPECT_DOUBLE_EQ(d.Value(), h.actual_);
349
+ }
350
+ }
351
+ }
352
+ }
353
+
354
+ // Issue #340
355
+ TEST_DOUBLE(fullPrecision, "7.450580596923828e-9", 7.450580596923828e-9);
356
+ {
357
+ internal::Double d(1.0);
358
+ for (int i = 0; i < 324; i++) {
359
+ char buffer[32];
360
+ *internal::dtoa(d.Value(), buffer) = '\0';
361
+
362
+ StringStream s(buffer);
363
+ ParseDoubleHandler h;
364
+ Reader reader;
365
+ ASSERT_EQ(kParseErrorNone, reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h).Code());
366
+ EXPECT_EQ(1u, h.step_);
367
+ internal::Double a(h.actual_);
368
+ if (fullPrecision) {
369
+ EXPECT_EQ(d.Uint64Value(), a.Uint64Value());
370
+ if (d.Uint64Value() != a.Uint64Value())
371
+ printf(" String: %s\n Actual: %.17g\nExpected: %.17g\n", buffer, h.actual_, d.Value());
372
+ }
373
+ else {
374
+ EXPECT_EQ(d.Sign(), a.Sign()); // for 0.0 != -0.0
375
+ EXPECT_DOUBLE_EQ(d.Value(), h.actual_);
376
+ }
377
+
378
+
379
+ d = d.Value() * 0.5;
380
+ }
381
+ }
382
+
383
+ // Issue 1249
384
+ TEST_DOUBLE(fullPrecision, "0e100", 0.0);
385
+
386
+ // Issue 1251
387
+ TEST_DOUBLE(fullPrecision, "128.74836467836484838364836483643636483648e-336", 0.0);
388
+
389
+ // Issue 1256
390
+ TEST_DOUBLE(fullPrecision,
391
+ "6223372036854775296.1701512723685473547372536854755293372036854685477"
392
+ "529752233737201701512337200972013723685473123372036872036854236854737"
393
+ "247372368372367752975258547752975254729752547372368737201701512354737"
394
+ "83723677529752585477247372368372368547354737253685475529752",
395
+ 6223372036854775808.0);
396
+
397
+ #if 0
398
+ // Test (length + exponent) overflow
399
+ TEST_DOUBLE(fullPrecision, "0e+2147483647", 0.0);
400
+ TEST_DOUBLE(fullPrecision, "0e-2147483648", 0.0);
401
+ TEST_DOUBLE(fullPrecision, "1e-2147483648", 0.0);
402
+ TEST_DOUBLE(fullPrecision, "0e+9223372036854775807", 0.0);
403
+ TEST_DOUBLE(fullPrecision, "0e-9223372036854775808", 0.0);
404
+ #endif
405
+
406
+ if (fullPrecision)
407
+ {
408
+ TEST_DOUBLE(fullPrecision, "1e-325", 0.0);
409
+ TEST_DOUBLE(fullPrecision, "1e-324", 0.0);
410
+ TEST_DOUBLE(fullPrecision, "2e-324", 0.0);
411
+ TEST_DOUBLE(fullPrecision, "2.4703282292062327e-324", 0.0);
412
+ TEST_DOUBLE(fullPrecision, "2.4703282292062328e-324", 5e-324);
413
+ TEST_DOUBLE(fullPrecision, "2.48e-324",5e-324);
414
+ TEST_DOUBLE(fullPrecision, "2.5e-324", 5e-324);
415
+
416
+ // Slightly above max-normal
417
+ TEST_DOUBLE(fullPrecision, "1.7976931348623158e+308", 1.7976931348623158e+308);
418
+
419
+ TEST_DOUBLE(fullPrecision,
420
+ "17976931348623157081452742373170435679807056752584499659891747680315726"
421
+ "07800285387605895586327668781715404589535143824642343213268894641827684"
422
+ "67546703537516986049910576551282076245490090389328944075868508455133942"
423
+ "30458323690322294816580855933212334827479782620414472316873817718091929"
424
+ "9881250404026184124858368",
425
+ (std::numeric_limits<double>::max)());
426
+
427
+ TEST_DOUBLE(fullPrecision,
428
+ "243546080556034731077856379609316893158278902575447060151047"
429
+ "212703405344938119816206067372775299130836050315842578309818"
430
+ "316450894337978612745889730079163798234256495613858256849283"
431
+ "467066859489192118352020514036083287319232435355752493038825"
432
+ "828481044358810649108367633313557305310641892225870327827273"
433
+ "41408256.000000",
434
+ 2.4354608055603473e+307);
435
+ // 9007199254740991 * 2^971 (max normal)
436
+ TEST_DOUBLE(fullPrecision,
437
+ "1.797693134862315708145274237317043567980705675258449965989174768031572607800285"
438
+ "38760589558632766878171540458953514382464234321326889464182768467546703537516986"
439
+ "04991057655128207624549009038932894407586850845513394230458323690322294816580855"
440
+ "9332123348274797826204144723168738177180919299881250404026184124858368e+308",
441
+ 1.797693134862315708e+308 // 0x1.fffffffffffffp1023
442
+ );
443
+ #if 0
444
+ // TODO:
445
+ // Should work at least in full-precision mode...
446
+ TEST_DOUBLE(fullPrecision,
447
+ "0.00000000000000000000000000000000000000000000000000000000000"
448
+ "0000000000000000000000000000000000000000000000000000000000000"
449
+ "0000000000000000000000000000000000000000000000000000000000000"
450
+ "0000000000000000000000000000000000000000000000000000000000000"
451
+ "0000000000000000000000000000000000000000000000000000000000000"
452
+ "0000000000000000000024703282292062327208828439643411068618252"
453
+ "9901307162382212792841250337753635104375932649918180817996189"
454
+ "8982823477228588654633283551779698981993873980053909390631503"
455
+ "5659515570226392290858392449105184435931802849936536152500319"
456
+ "3704576782492193656236698636584807570015857692699037063119282"
457
+ "7955855133292783433840935197801553124659726357957462276646527"
458
+ "2827220056374006485499977096599470454020828166226237857393450"
459
+ "7363390079677619305775067401763246736009689513405355374585166"
460
+ "6113422376667860416215968046191446729184030053005753084904876"
461
+ "5391711386591646239524912623653881879636239373280423891018672"
462
+ "3484976682350898633885879256283027559956575244555072551893136"
463
+ "9083625477918694866799496832404970582102851318545139621383772"
464
+ "2826145437693412532098591327667236328125",
465
+ 0.0);
466
+ #endif
467
+ // 9007199254740991 * 2^-1074 = (2^53 - 1) * 2^-1074
468
+ TEST_DOUBLE(fullPrecision,
469
+ "4.450147717014402272114819593418263951869639092703291296046852219449644444042153"
470
+ "89103305904781627017582829831782607924221374017287738918929105531441481564124348"
471
+ "67599762821265346585071045737627442980259622449029037796981144446145705102663115"
472
+ "10031828794952795966823603998647925096578034214163701381261333311989876551545144"
473
+ "03152612538132666529513060001849177663286607555958373922409899478075565940981010"
474
+ "21612198814605258742579179000071675999344145086087205681577915435923018910334964"
475
+ "86942061405218289243144579760516365090360651414037721744226256159024466852576737"
476
+ "24464300755133324500796506867194913776884780053099639677097589658441378944337966"
477
+ "21993967316936280457084866613206797017728916080020698679408551343728867675409720"
478
+ "757232455434770912461317493580281734466552734375e-308",
479
+ 4.450147717014402272e-308 // 0x1.fffffffffffffp-1022
480
+ );
481
+ // 9007199254740990 * 2^-1074
482
+ TEST_DOUBLE(fullPrecision,
483
+ "4.450147717014401778049173752171719775300846224481918930987049605124880018456471"
484
+ "39035755177760751831052846195619008686241717547743167145836439860405887584484471"
485
+ "19639655002484083577939142623582164522087943959208000909794783876158397872163051"
486
+ "22622675229968408654350206725478309956546318828765627255022767720818849892988457"
487
+ "26333908582101604036318532842699932130356061901518261174396928478121372742040102"
488
+ "17446565569357687263889031732270082446958029584739170416643195242132750803227473"
489
+ "16608838720742955671061336566907126801014814608027120593609275183716632624844904"
490
+ "31985250929886016737037234388448352929102742708402644340627409931664203093081360"
491
+ "70794835812045179006047003875039546061891526346421705014598610179523165038319441"
492
+ "51446491086954182492263498716056346893310546875e-308",
493
+ 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022
494
+ );
495
+ // half way between the two numbers above.
496
+ // round to nearest even.
497
+ TEST_DOUBLE(fullPrecision,
498
+ "4.450147717014402025081996672794991863585242658592605113516950912287262231249312"
499
+ "64069530541271189424317838013700808305231545782515453032382772695923684574304409"
500
+ "93619708911874715081505094180604803751173783204118519353387964161152051487413083"
501
+ "16327252012460602310586905362063117526562176521464664318142050516404363222266800"
502
+ "64743260560117135282915796422274554896821334728738317548403413978098469341510556"
503
+ "19529382191981473003234105366170879223151087335413188049110555339027884856781219"
504
+ "01775450062980622457102958163711745945687733011032421168917765671370549738710820"
505
+ "78224775842509670618916870627821633352993761380751142008862499795052791018709663"
506
+ "46394401564490729731565935244123171539810221213221201847003580761626016356864581"
507
+ "1358486831521563686919762403704226016998291015625e-308",
508
+ 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022
509
+ );
510
+ TEST_DOUBLE(fullPrecision,
511
+ "4.450147717014402025081996672794991863585242658592605113516950912287262231249312"
512
+ "64069530541271189424317838013700808305231545782515453032382772695923684574304409"
513
+ "93619708911874715081505094180604803751173783204118519353387964161152051487413083"
514
+ "16327252012460602310586905362063117526562176521464664318142050516404363222266800"
515
+ "64743260560117135282915796422274554896821334728738317548403413978098469341510556"
516
+ "19529382191981473003234105366170879223151087335413188049110555339027884856781219"
517
+ "01775450062980622457102958163711745945687733011032421168917765671370549738710820"
518
+ "78224775842509670618916870627821633352993761380751142008862499795052791018709663"
519
+ "46394401564490729731565935244123171539810221213221201847003580761626016356864581"
520
+ "13584868315215636869197624037042260169982910156250000000000000000000000000000000"
521
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
522
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000e-308",
523
+ 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022
524
+ );
525
+ #if 0
526
+ // ... round up
527
+ // TODO:
528
+ // Should work at least in full-precision mode...
529
+ TEST_DOUBLE(fullPrecision,
530
+ "4.450147717014402025081996672794991863585242658592605113516950912287262231249312"
531
+ "64069530541271189424317838013700808305231545782515453032382772695923684574304409"
532
+ "93619708911874715081505094180604803751173783204118519353387964161152051487413083"
533
+ "16327252012460602310586905362063117526562176521464664318142050516404363222266800"
534
+ "64743260560117135282915796422274554896821334728738317548403413978098469341510556"
535
+ "19529382191981473003234105366170879223151087335413188049110555339027884856781219"
536
+ "01775450062980622457102958163711745945687733011032421168917765671370549738710820"
537
+ "78224775842509670618916870627821633352993761380751142008862499795052791018709663"
538
+ "46394401564490729731565935244123171539810221213221201847003580761626016356864581"
539
+ "13584868315215636869197624037042260169982910156250000000000000000000000000000000"
540
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
541
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000001e-308",
542
+ 4.450147717014402272e-308 // 0x1.fffffffffffffp-1022
543
+ );
544
+ #endif
545
+ // ... round down
546
+ TEST_DOUBLE(fullPrecision,
547
+ "4.450147717014402025081996672794991863585242658592605113516950912287262231249312"
548
+ "64069530541271189424317838013700808305231545782515453032382772695923684574304409"
549
+ "93619708911874715081505094180604803751173783204118519353387964161152051487413083"
550
+ "16327252012460602310586905362063117526562176521464664318142050516404363222266800"
551
+ "64743260560117135282915796422274554896821334728738317548403413978098469341510556"
552
+ "19529382191981473003234105366170879223151087335413188049110555339027884856781219"
553
+ "01775450062980622457102958163711745945687733011032421168917765671370549738710820"
554
+ "78224775842509670618916870627821633352993761380751142008862499795052791018709663"
555
+ "46394401564490729731565935244123171539810221213221201847003580761626016356864581"
556
+ "13584868315215636869197624037042260169982910156249999999999999999999999999999999"
557
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
558
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999e-308",
559
+ 4.450147717014401778e-308 // 0x1.ffffffffffffep-1022
560
+ );
561
+ // Slightly below half way between max-normal and infinity.
562
+ // Should round down.
563
+ TEST_DOUBLE(fullPrecision,
564
+ "1.797693134862315807937289714053034150799341327100378269361737789804449682927647"
565
+ "50946649017977587207096330286416692887910946555547851940402630657488671505820681"
566
+ "90890200070838367627385484581771153176447573027006985557136695962284291481986083"
567
+ "49364752927190741684443655107043427115596995080930428801779041744977919999999999"
568
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
569
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
570
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
571
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
572
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
573
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
574
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
575
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
576
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
577
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
578
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999"
579
+ "99999999999999999999999999999999999999999999999999999999999999999999999999999999e+308",
580
+ 1.797693134862315708e+308 // 0x1.fffffffffffffp1023
581
+ );
582
+ }
583
+
584
+ #undef TEST_DOUBLE
585
+ }
586
+
587
+ TEST(Reader, ParseNumber_NormalPrecisionDouble) {
588
+ TestParseDouble<false>();
589
+ }
590
+
591
+ TEST(Reader, ParseNumber_FullPrecisionDouble) {
592
+ TestParseDouble<true>();
593
+ }
594
+
595
+ TEST(Reader, ParseNumber_NormalPrecisionError) {
596
+ static unsigned count = 1000000;
597
+ Random r;
598
+
599
+ double ulpSum = 0.0;
600
+ double ulpMax = 0.0;
601
+ for (unsigned i = 0; i < count; i++) {
602
+ internal::Double e, a;
603
+ do {
604
+ // Need to call r() in two statements for cross-platform coherent sequence.
605
+ uint64_t u = uint64_t(r()) << 32;
606
+ u |= uint64_t(r());
607
+ e = u;
608
+ } while (e.IsNan() || e.IsInf() || !e.IsNormal());
609
+
610
+ char buffer[32];
611
+ *internal::dtoa(e.Value(), buffer) = '\0';
612
+
613
+ StringStream s(buffer);
614
+ ParseDoubleHandler h;
615
+ Reader reader;
616
+ ASSERT_EQ(kParseErrorNone, reader.Parse(s, h).Code());
617
+ EXPECT_EQ(1u, h.step_);
618
+
619
+ a = h.actual_;
620
+ uint64_t bias1 = e.ToBias();
621
+ uint64_t bias2 = a.ToBias();
622
+ double ulp = static_cast<double>(bias1 >= bias2 ? bias1 - bias2 : bias2 - bias1);
623
+ ulpMax = (std::max)(ulpMax, ulp);
624
+ ulpSum += ulp;
625
+ }
626
+ printf("ULP Average = %g, Max = %g \n", ulpSum / count, ulpMax);
627
+ }
628
+
629
+ template<bool fullPrecision>
630
+ static void TestParseNumberError() {
631
+ #define TEST_NUMBER_ERROR(errorCode, str, errorOffset, streamPos) \
632
+ { \
633
+ char buffer[2048]; \
634
+ ASSERT_LT(std::strlen(str), 2048u); \
635
+ sprintf(buffer, "%s", str); \
636
+ InsituStringStream s(buffer); \
637
+ BaseReaderHandler<> h; \
638
+ Reader reader; \
639
+ EXPECT_FALSE(reader.Parse<fullPrecision ? kParseFullPrecisionFlag : 0>(s, h)); \
640
+ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
641
+ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
642
+ EXPECT_EQ(streamPos, s.Tell());\
643
+ }
644
+
645
+ // Number too big to be stored in double.
646
+ {
647
+ char n1e309[311]; // '1' followed by 309 '0'
648
+ n1e309[0] = '1';
649
+ for (int i = 1; i < 310; i++)
650
+ n1e309[i] = '0';
651
+ n1e309[310] = '\0';
652
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, n1e309, 0u, 310u);
653
+ }
654
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e309", 0u, 5u);
655
+
656
+ // Miss fraction part in number.
657
+ TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.", 2u, 2u);
658
+ TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.a", 2u, 2u);
659
+
660
+ // Miss exponent in number.
661
+ TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e", 2u, 2u);
662
+ TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e_", 2u, 2u);
663
+
664
+ // Issue 849
665
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.8e308", 0u, 7u);
666
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "5e308", 0u, 5u);
667
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e309", 0u, 5u);
668
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.0e310", 0u, 7u);
669
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.00e310", 0u, 8u);
670
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "-1.8e308", 0u, 8u);
671
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "-1e309", 0u, 6u);
672
+
673
+ // Issue 1253
674
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "2e308", 0u, 5u);
675
+
676
+ // Issue 1259
677
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
678
+ "88474320368547737236837236775298547354737253685475547552933720368546854775297525"
679
+ "29337203685468547770151233720097201372368547312337203687203685423685123372036872"
680
+ "03685473724737236837236775297525854775297525472975254737236873720170151235473783"
681
+ "7236737247372368772473723683723456789012E66", 0u, 283u);
682
+
683
+ #if 0
684
+ // Test (length + exponent) overflow
685
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+2147483647", 0u, 13u);
686
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+9223372036854775807", 0u, 22u);
687
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+10000", 0u, 8u);
688
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+50000", 0u, 8u);
689
+ #endif
690
+
691
+ // 9007199254740992 * 2^971 ("infinity")
692
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
693
+ "1.797693134862315907729305190789024733617976978942306572734300811577326758055009"
694
+ "63132708477322407536021120113879871393357658789768814416622492847430639474124377"
695
+ "76789342486548527630221960124609411945308295208500576883815068234246288147391311"
696
+ "0540827237163350510684586298239947245938479716304835356329624224137216e+308", 0u, 315u);
697
+
698
+ // TODO:
699
+ // These tests (currently) fail in normal-precision mode
700
+ if (fullPrecision)
701
+ {
702
+ // Half way between max-normal and infinity
703
+ // Should round to infinity in nearest-even mode.
704
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
705
+ "1.797693134862315807937289714053034150799341327100378269361737789804449682927647"
706
+ "50946649017977587207096330286416692887910946555547851940402630657488671505820681"
707
+ "90890200070838367627385484581771153176447573027006985557136695962284291481986083"
708
+ "49364752927190741684443655107043427115596995080930428801779041744977920000000000"
709
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
710
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
711
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
712
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
713
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
714
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
715
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
716
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
717
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
718
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000e+308", 0u, 1125u);
719
+ // ...round up
720
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
721
+ "1.797693134862315807937289714053034150799341327100378269361737789804449682927647"
722
+ "50946649017977587207096330286416692887910946555547851940402630657488671505820681"
723
+ "90890200070838367627385484581771153176447573027006985557136695962284291481986083"
724
+ "49364752927190741684443655107043427115596995080930428801779041744977920000000000"
725
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
726
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
727
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
728
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
729
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
730
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
731
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
732
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
733
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
734
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
735
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000001e+308", 0u, 1205u);
736
+ }
737
+
738
+ TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
739
+ "10000000000000000000000000000000000000000000000000000000000000000000000000000000"
740
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
741
+ "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
742
+ "0000000000000000000000000000000000000000000000000000000000000000000001", 0u, 310u);
743
+
744
+ #undef TEST_NUMBER_ERROR
745
+ }
746
+
747
+ TEST(Reader, ParseNumberError_NormalPrecisionDouble) {
748
+ TestParseNumberError<false>();
749
+ }
750
+
751
+ TEST(Reader, ParseNumberError_FullPrecisionDouble) {
752
+ TestParseNumberError<true>();
753
+ }
754
+
755
+ template <typename Encoding>
756
+ struct ParseStringHandler : BaseReaderHandler<Encoding, ParseStringHandler<Encoding> > {
757
+ ParseStringHandler() : str_(0), length_(0), copy_() {}
758
+ ~ParseStringHandler() { EXPECT_TRUE(str_ != 0); if (copy_) free(const_cast<typename Encoding::Ch*>(str_)); }
759
+
760
+ ParseStringHandler(const ParseStringHandler&);
761
+ ParseStringHandler& operator=(const ParseStringHandler&);
762
+
763
+ bool Default() { ADD_FAILURE(); return false; }
764
+ bool String(const typename Encoding::Ch* str, size_t length, bool copy) {
765
+ EXPECT_EQ(0, str_);
766
+ if (copy) {
767
+ str_ = static_cast<typename Encoding::Ch*>(malloc((length + 1) * sizeof(typename Encoding::Ch)));
768
+ memcpy(const_cast<typename Encoding::Ch*>(str_), str, (length + 1) * sizeof(typename Encoding::Ch));
769
+ }
770
+ else
771
+ str_ = str;
772
+ length_ = length;
773
+ copy_ = copy;
774
+ return true;
775
+ }
776
+
777
+ const typename Encoding::Ch* str_;
778
+ size_t length_;
779
+ bool copy_;
780
+ };
781
+
782
+ TEST(Reader, ParseString) {
783
+ #define TEST_STRING(Encoding, e, x) \
784
+ { \
785
+ Encoding::Ch* buffer = StrDup(x); \
786
+ GenericInsituStringStream<Encoding> is(buffer); \
787
+ ParseStringHandler<Encoding> h; \
788
+ GenericReader<Encoding, Encoding> reader; \
789
+ reader.Parse<kParseInsituFlag | kParseValidateEncodingFlag>(is, h); \
790
+ EXPECT_EQ(0, StrCmp<Encoding::Ch>(e, h.str_)); \
791
+ EXPECT_EQ(StrLen(e), h.length_); \
792
+ free(buffer); \
793
+ GenericStringStream<Encoding> s(x); \
794
+ ParseStringHandler<Encoding> h2; \
795
+ GenericReader<Encoding, Encoding> reader2; \
796
+ reader2.Parse(s, h2); \
797
+ EXPECT_EQ(0, StrCmp<Encoding::Ch>(e, h2.str_)); \
798
+ EXPECT_EQ(StrLen(e), h2.length_); \
799
+ }
800
+
801
+ // String constant L"\xXX" can only specify character code in bytes, which is not endianness-neutral.
802
+ // And old compiler does not support u"" and U"" string literal. So here specify string literal by array of Ch.
803
+ // In addition, GCC 4.8 generates -Wnarrowing warnings when character code >= 128 are assigned to signed integer types.
804
+ // Therefore, utype is added for declaring unsigned array, and then cast it to Encoding::Ch.
805
+ #define ARRAY(...) { __VA_ARGS__ }
806
+ #define TEST_STRINGARRAY(Encoding, utype, array, x) \
807
+ { \
808
+ static const utype ue[] = array; \
809
+ static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
810
+ TEST_STRING(Encoding, e, x); \
811
+ }
812
+
813
+ #define TEST_STRINGARRAY2(Encoding, utype, earray, xarray) \
814
+ { \
815
+ static const utype ue[] = earray; \
816
+ static const utype xe[] = xarray; \
817
+ static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
818
+ static const Encoding::Ch* x = reinterpret_cast<const Encoding::Ch *>(&xe[0]); \
819
+ TEST_STRING(Encoding, e, x); \
820
+ }
821
+
822
+ TEST_STRING(UTF8<>, "", "\"\"");
823
+ TEST_STRING(UTF8<>, "Hello", "\"Hello\"");
824
+ TEST_STRING(UTF8<>, "Hello\nWorld", "\"Hello\\nWorld\"");
825
+ TEST_STRING(UTF8<>, "\"\\/\b\f\n\r\t", "\"\\\"\\\\/\\b\\f\\n\\r\\t\"");
826
+ TEST_STRING(UTF8<>, "\x24", "\"\\u0024\""); // Dollar sign U+0024
827
+ TEST_STRING(UTF8<>, "\xC2\xA2", "\"\\u00A2\""); // Cents sign U+00A2
828
+ TEST_STRING(UTF8<>, "\xE2\x82\xAC", "\"\\u20AC\""); // Euro sign U+20AC
829
+ TEST_STRING(UTF8<>, "\xF0\x9D\x84\x9E", "\"\\uD834\\uDD1E\""); // G clef sign U+1D11E
830
+
831
+ // UTF16
832
+ TEST_STRING(UTF16<>, L"", L"\"\"");
833
+ TEST_STRING(UTF16<>, L"Hello", L"\"Hello\"");
834
+ TEST_STRING(UTF16<>, L"Hello\nWorld", L"\"Hello\\nWorld\"");
835
+ TEST_STRING(UTF16<>, L"\"\\/\b\f\n\r\t", L"\"\\\"\\\\/\\b\\f\\n\\r\\t\"");
836
+ TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x0024, 0x0000), L"\"\\u0024\"");
837
+ TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x00A2, 0x0000), L"\"\\u00A2\""); // Cents sign U+00A2
838
+ TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0x20AC, 0x0000), L"\"\\u20AC\""); // Euro sign U+20AC
839
+ TEST_STRINGARRAY(UTF16<>, wchar_t, ARRAY(0xD834, 0xDD1E, 0x0000), L"\"\\uD834\\uDD1E\""); // G clef sign U+1D11E
840
+
841
+ // UTF32
842
+ TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('\0'), ARRAY('\"', '\"', '\0'));
843
+ TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('H', 'e', 'l', 'l', 'o', '\0'), ARRAY('\"', 'H', 'e', 'l', 'l', 'o', '\"', '\0'));
844
+ 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'));
845
+ TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY('\"', '\\', '/', '\b', '\f', '\n', '\r', '\t', '\0'), ARRAY('\"', '\\', '\"', '\\', '\\', '/', '\\', 'b', '\\', 'f', '\\', 'n', '\\', 'r', '\\', 't', '\"', '\0'));
846
+ TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x00024, 0x0000), ARRAY('\"', '\\', 'u', '0', '0', '2', '4', '\"', '\0'));
847
+ TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x000A2, 0x0000), ARRAY('\"', '\\', 'u', '0', '0', 'A', '2', '\"', '\0')); // Cents sign U+00A2
848
+ TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x020AC, 0x0000), ARRAY('\"', '\\', 'u', '2', '0', 'A', 'C', '\"', '\0')); // Euro sign U+20AC
849
+ TEST_STRINGARRAY2(UTF32<>, unsigned, ARRAY(0x1D11E, 0x0000), ARRAY('\"', '\\', 'u', 'D', '8', '3', '4', '\\', 'u', 'D', 'D', '1', 'E', '\"', '\0')); // G clef sign U+1D11E
850
+
851
+ #undef TEST_STRINGARRAY
852
+ #undef ARRAY
853
+ #undef TEST_STRING
854
+
855
+ // Support of null character in string
856
+ {
857
+ StringStream s("\"Hello\\u0000World\"");
858
+ const char e[] = "Hello\0World";
859
+ ParseStringHandler<UTF8<> > h;
860
+ Reader reader;
861
+ reader.Parse(s, h);
862
+ EXPECT_EQ(0, memcmp(e, h.str_, h.length_ + 1));
863
+ EXPECT_EQ(11u, h.length_);
864
+ }
865
+ }
866
+
867
+ TEST(Reader, ParseString_Transcoding) {
868
+ const char* x = "\"Hello\"";
869
+ const wchar_t* e = L"Hello";
870
+ GenericStringStream<UTF8<> > is(x);
871
+ GenericReader<UTF8<>, UTF16<> > reader;
872
+ ParseStringHandler<UTF16<> > h;
873
+ reader.Parse(is, h);
874
+ EXPECT_EQ(0, StrCmp<UTF16<>::Ch>(e, h.str_));
875
+ EXPECT_EQ(StrLen(e), h.length_);
876
+ }
877
+
878
+ TEST(Reader, ParseString_TranscodingWithValidation) {
879
+ const char* x = "\"Hello\"";
880
+ const wchar_t* e = L"Hello";
881
+ GenericStringStream<UTF8<> > is(x);
882
+ GenericReader<UTF8<>, UTF16<> > reader;
883
+ ParseStringHandler<UTF16<> > h;
884
+ reader.Parse<kParseValidateEncodingFlag>(is, h);
885
+ EXPECT_EQ(0, StrCmp<UTF16<>::Ch>(e, h.str_));
886
+ EXPECT_EQ(StrLen(e), h.length_);
887
+ }
888
+
889
+ TEST(Reader, ParseString_NonDestructive) {
890
+ StringStream s("\"Hello\\nWorld\"");
891
+ ParseStringHandler<UTF8<> > h;
892
+ Reader reader;
893
+ reader.Parse(s, h);
894
+ EXPECT_EQ(0, StrCmp("Hello\nWorld", h.str_));
895
+ EXPECT_EQ(11u, h.length_);
896
+ }
897
+
898
+ template <typename Encoding>
899
+ ParseErrorCode TestString(const typename Encoding::Ch* str) {
900
+ GenericStringStream<Encoding> s(str);
901
+ BaseReaderHandler<Encoding> h;
902
+ GenericReader<Encoding, Encoding> reader;
903
+ reader.template Parse<kParseValidateEncodingFlag>(s, h);
904
+ return reader.GetParseErrorCode();
905
+ }
906
+
907
+ TEST(Reader, ParseString_Error) {
908
+ #define TEST_STRING_ERROR(errorCode, str, errorOffset, streamPos)\
909
+ {\
910
+ GenericStringStream<UTF8<> > s(str);\
911
+ BaseReaderHandler<UTF8<> > h;\
912
+ GenericReader<UTF8<> , UTF8<> > reader;\
913
+ reader.Parse<kParseValidateEncodingFlag>(s, h);\
914
+ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
915
+ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
916
+ EXPECT_EQ(streamPos, s.Tell());\
917
+ }
918
+
919
+ #define ARRAY(...) { __VA_ARGS__ }
920
+ #define TEST_STRINGENCODING_ERROR(Encoding, TargetEncoding, utype, array) \
921
+ { \
922
+ static const utype ue[] = array; \
923
+ static const Encoding::Ch* e = reinterpret_cast<const Encoding::Ch *>(&ue[0]); \
924
+ EXPECT_EQ(kParseErrorStringInvalidEncoding, TestString<Encoding>(e));\
925
+ /* decode error */\
926
+ GenericStringStream<Encoding> s(e);\
927
+ BaseReaderHandler<TargetEncoding> h;\
928
+ GenericReader<Encoding, TargetEncoding> reader;\
929
+ reader.Parse(s, h);\
930
+ EXPECT_EQ(kParseErrorStringInvalidEncoding, reader.GetParseErrorCode());\
931
+ }
932
+
933
+ // Invalid escape character in string.
934
+ TEST_STRING_ERROR(kParseErrorStringEscapeInvalid, "[\"\\a\"]", 2u, 3u);
935
+
936
+ // Incorrect hex digit after \\u escape in string.
937
+ TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uABCG\"]", 2u, 7u);
938
+
939
+ // Quotation in \\u escape in string (Issue #288)
940
+ TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uaaa\"]", 2u, 7u);
941
+ TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uD800\\uFFF\"]", 2u, 13u);
942
+
943
+ // The surrogate pair in string is invalid.
944
+ TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800X\"]", 2u, 8u);
945
+ TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800\\uFFFF\"]", 2u, 14u);
946
+
947
+ // Single low surrogate pair in string is invalid.
948
+ TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\udc4d\"]", 2u, 8u);
949
+
950
+ // Missing a closing quotation mark in string.
951
+ TEST_STRING_ERROR(kParseErrorStringMissQuotationMark, "[\"Test]", 7u, 7u);
952
+
953
+ // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
954
+
955
+ // 3 Malformed sequences
956
+
957
+ // 3.1 Unexpected continuation bytes
958
+ {
959
+ char e[] = { '[', '\"', 0, '\"', ']', '\0' };
960
+ for (unsigned char c = 0x80u; c <= 0xBFu; c++) {
961
+ e[2] = static_cast<char>(c);
962
+ ParseErrorCode error = TestString<UTF8<> >(e);
963
+ EXPECT_EQ(kParseErrorStringInvalidEncoding, error);
964
+ if (error != kParseErrorStringInvalidEncoding)
965
+ std::cout << static_cast<unsigned>(c) << std::endl;
966
+ }
967
+ }
968
+
969
+ // 3.2 Lonely start characters, 3.5 Impossible bytes
970
+ {
971
+ char e[] = { '[', '\"', 0, ' ', '\"', ']', '\0' };
972
+ for (unsigned c = 0xC0u; c <= 0xFFu; c++) {
973
+ e[2] = static_cast<char>(c);
974
+ unsigned streamPos;
975
+ if (c <= 0xC1u)
976
+ streamPos = 3; // 0xC0 - 0xC1
977
+ else if (c <= 0xDFu)
978
+ streamPos = 4; // 0xC2 - 0xDF
979
+ else if (c <= 0xEFu)
980
+ streamPos = 5; // 0xE0 - 0xEF
981
+ else if (c <= 0xF4u)
982
+ streamPos = 6; // 0xF0 - 0xF4
983
+ else
984
+ streamPos = 3; // 0xF5 - 0xFF
985
+ TEST_STRING_ERROR(kParseErrorStringInvalidEncoding, e, 2u, streamPos);
986
+ }
987
+ }
988
+
989
+ // 4 Overlong sequences
990
+
991
+ // 4.1 Examples of an overlong ASCII character
992
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0xAFu, '\"', ']', '\0'));
993
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0xAFu, '\"', ']', '\0'));
994
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0xAFu, '\"', ']', '\0'));
995
+
996
+ // 4.2 Maximum overlong sequences
997
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC1u, 0xBFu, '\"', ']', '\0'));
998
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x9Fu, 0xBFu, '\"', ']', '\0'));
999
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x8Fu, 0xBFu, 0xBFu, '\"', ']', '\0'));
1000
+
1001
+ // 4.3 Overlong representation of the NUL character
1002
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0x80u, '\"', ']', '\0'));
1003
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0x80u, '\"', ']', '\0'));
1004
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0x80u, '\"', ']', '\0'));
1005
+
1006
+ // 5 Illegal code positions
1007
+
1008
+ // 5.1 Single UTF-16 surrogates
1009
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xA0u, 0x80u, '\"', ']', '\0'));
1010
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xADu, 0xBFu, '\"', ']', '\0'));
1011
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAEu, 0x80u, '\"', ']', '\0'));
1012
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAFu, 0xBFu, '\"', ']', '\0'));
1013
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xB0u, 0x80u, '\"', ']', '\0'));
1014
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBEu, 0x80u, '\"', ']', '\0'));
1015
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBFu, 0xBFu, '\"', ']', '\0'));
1016
+
1017
+ // Malform UTF-16 sequences
1018
+ TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xDC00, 0xDC00, '\"', ']', '\0'));
1019
+ TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xD800, 0xD800, '\"', ']', '\0'));
1020
+
1021
+ // Malform UTF-32 sequence
1022
+ TEST_STRINGENCODING_ERROR(UTF32<>, UTF8<>, unsigned, ARRAY('[', '\"', 0x110000, '\"', ']', '\0'));
1023
+
1024
+ // Malform ASCII sequence
1025
+ TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x80u), '\"', ']', '\0'));
1026
+ TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x01u), '\"', ']', '\0'));
1027
+ TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x1Cu), '\"', ']', '\0'));
1028
+
1029
+ #undef ARRAY
1030
+ #undef TEST_STRINGARRAY_ERROR
1031
+ }
1032
+
1033
+ template <unsigned count>
1034
+ struct ParseArrayHandler : BaseReaderHandler<UTF8<>, ParseArrayHandler<count> > {
1035
+ ParseArrayHandler() : step_(0) {}
1036
+
1037
+ bool Default() { ADD_FAILURE(); return false; }
1038
+ bool Uint(unsigned i) { EXPECT_EQ(step_, i); step_++; return true; }
1039
+ bool StartArray() { EXPECT_EQ(0u, step_); step_++; return true; }
1040
+ bool EndArray(SizeType) { step_++; return true; }
1041
+
1042
+ unsigned step_;
1043
+ };
1044
+
1045
+ TEST(Reader, ParseEmptyArray) {
1046
+ char *json = StrDup("[ ] ");
1047
+ InsituStringStream s(json);
1048
+ ParseArrayHandler<0> h;
1049
+ Reader reader;
1050
+ reader.Parse(s, h);
1051
+ EXPECT_EQ(2u, h.step_);
1052
+ free(json);
1053
+ }
1054
+
1055
+ TEST(Reader, ParseArray) {
1056
+ char *json = StrDup("[1, 2, 3, 4]");
1057
+ InsituStringStream s(json);
1058
+ ParseArrayHandler<4> h;
1059
+ Reader reader;
1060
+ reader.Parse(s, h);
1061
+ EXPECT_EQ(6u, h.step_);
1062
+ free(json);
1063
+ }
1064
+
1065
+ TEST(Reader, ParseArray_Error) {
1066
+ #define TEST_ARRAY_ERROR(errorCode, str, errorOffset) \
1067
+ { \
1068
+ unsigned streamPos = errorOffset; \
1069
+ char buffer[1001]; \
1070
+ strncpy(buffer, str, 1000); \
1071
+ InsituStringStream s(buffer); \
1072
+ BaseReaderHandler<> h; \
1073
+ GenericReader<UTF8<>, UTF8<>, CrtAllocator> reader; \
1074
+ EXPECT_FALSE(reader.Parse(s, h)); \
1075
+ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
1076
+ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
1077
+ EXPECT_EQ(streamPos, s.Tell());\
1078
+ }
1079
+
1080
+ // Missing a comma or ']' after an array element.
1081
+ TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1", 2u);
1082
+ TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1}", 2u);
1083
+ TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1 2]", 3u);
1084
+
1085
+ // Array cannot have a trailing comma (without kParseTrailingCommasFlag);
1086
+ // a value must follow a comma
1087
+ TEST_ARRAY_ERROR(kParseErrorValueInvalid, "[1,]", 3u);
1088
+
1089
+ #undef TEST_ARRAY_ERROR
1090
+ }
1091
+
1092
+ struct ParseObjectHandler : BaseReaderHandler<UTF8<>, ParseObjectHandler> {
1093
+ ParseObjectHandler() : step_(0) {}
1094
+
1095
+ bool Default() { ADD_FAILURE(); return false; }
1096
+ bool Null() { EXPECT_EQ(8u, step_); step_++; return true; }
1097
+ bool Bool(bool b) {
1098
+ switch(step_) {
1099
+ case 4: EXPECT_TRUE(b); step_++; return true;
1100
+ case 6: EXPECT_FALSE(b); step_++; return true;
1101
+ default: ADD_FAILURE(); return false;
1102
+ }
1103
+ }
1104
+ bool Int(int i) {
1105
+ switch(step_) {
1106
+ case 10: EXPECT_EQ(123, i); step_++; return true;
1107
+ case 15: EXPECT_EQ(1, i); step_++; return true;
1108
+ case 16: EXPECT_EQ(2, i); step_++; return true;
1109
+ case 17: EXPECT_EQ(3, i); step_++; return true;
1110
+ default: ADD_FAILURE(); return false;
1111
+ }
1112
+ }
1113
+ bool Uint(unsigned i) { return Int(static_cast<int>(i)); }
1114
+ bool Double(double d) { EXPECT_EQ(12u, step_); EXPECT_DOUBLE_EQ(3.1416, d); step_++; return true; }
1115
+ bool String(const char* str, size_t, bool) {
1116
+ switch(step_) {
1117
+ case 1: EXPECT_STREQ("hello", str); step_++; return true;
1118
+ case 2: EXPECT_STREQ("world", str); step_++; return true;
1119
+ case 3: EXPECT_STREQ("t", str); step_++; return true;
1120
+ case 5: EXPECT_STREQ("f", str); step_++; return true;
1121
+ case 7: EXPECT_STREQ("n", str); step_++; return true;
1122
+ case 9: EXPECT_STREQ("i", str); step_++; return true;
1123
+ case 11: EXPECT_STREQ("pi", str); step_++; return true;
1124
+ case 13: EXPECT_STREQ("a", str); step_++; return true;
1125
+ default: ADD_FAILURE(); return false;
1126
+ }
1127
+ }
1128
+ bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
1129
+ bool EndObject(SizeType memberCount) { EXPECT_EQ(19u, step_); EXPECT_EQ(7u, memberCount); step_++; return true; }
1130
+ bool StartArray() { EXPECT_EQ(14u, step_); step_++; return true; }
1131
+ bool EndArray(SizeType elementCount) { EXPECT_EQ(18u, step_); EXPECT_EQ(3u, elementCount); step_++; return true; }
1132
+
1133
+ unsigned step_;
1134
+ };
1135
+
1136
+ TEST(Reader, ParseObject) {
1137
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } ";
1138
+
1139
+ // Insitu
1140
+ {
1141
+ char* json2 = StrDup(json);
1142
+ InsituStringStream s(json2);
1143
+ ParseObjectHandler h;
1144
+ Reader reader;
1145
+ reader.Parse<kParseInsituFlag>(s, h);
1146
+ EXPECT_EQ(20u, h.step_);
1147
+ free(json2);
1148
+ }
1149
+
1150
+ // Normal
1151
+ {
1152
+ StringStream s(json);
1153
+ ParseObjectHandler h;
1154
+ Reader reader;
1155
+ reader.Parse(s, h);
1156
+ EXPECT_EQ(20u, h.step_);
1157
+ }
1158
+ }
1159
+
1160
+ struct ParseEmptyObjectHandler : BaseReaderHandler<UTF8<>, ParseEmptyObjectHandler> {
1161
+ ParseEmptyObjectHandler() : step_(0) {}
1162
+
1163
+ bool Default() { ADD_FAILURE(); return false; }
1164
+ bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
1165
+ bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; }
1166
+
1167
+ unsigned step_;
1168
+ };
1169
+
1170
+ TEST(Reader, Parse_EmptyObject) {
1171
+ StringStream s("{ } ");
1172
+ ParseEmptyObjectHandler h;
1173
+ Reader reader;
1174
+ reader.Parse(s, h);
1175
+ EXPECT_EQ(2u, h.step_);
1176
+ }
1177
+
1178
+ struct ParseMultipleRootHandler : BaseReaderHandler<UTF8<>, ParseMultipleRootHandler> {
1179
+ ParseMultipleRootHandler() : step_(0) {}
1180
+
1181
+ bool Default() { ADD_FAILURE(); return false; }
1182
+ bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
1183
+ bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; }
1184
+ bool StartArray() { EXPECT_EQ(2u, step_); step_++; return true; }
1185
+ bool EndArray(SizeType) { EXPECT_EQ(3u, step_); step_++; return true; }
1186
+
1187
+ unsigned step_;
1188
+ };
1189
+
1190
+ template <unsigned parseFlags>
1191
+ void TestMultipleRoot() {
1192
+ StringStream s("{}[] a");
1193
+ ParseMultipleRootHandler h;
1194
+ Reader reader;
1195
+ EXPECT_TRUE(reader.Parse<parseFlags>(s, h));
1196
+ EXPECT_EQ(2u, h.step_);
1197
+ EXPECT_TRUE(reader.Parse<parseFlags>(s, h));
1198
+ EXPECT_EQ(4u, h.step_);
1199
+ EXPECT_EQ(' ', s.Take());
1200
+ EXPECT_EQ('a', s.Take());
1201
+ }
1202
+
1203
+ TEST(Reader, Parse_MultipleRoot) {
1204
+ TestMultipleRoot<kParseStopWhenDoneFlag>();
1205
+ }
1206
+
1207
+ TEST(Reader, ParseIterative_MultipleRoot) {
1208
+ TestMultipleRoot<kParseIterativeFlag | kParseStopWhenDoneFlag>();
1209
+ }
1210
+
1211
+ template <unsigned parseFlags>
1212
+ void TestInsituMultipleRoot() {
1213
+ char* buffer = strdup("{}[] a");
1214
+ InsituStringStream s(buffer);
1215
+ ParseMultipleRootHandler h;
1216
+ Reader reader;
1217
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag | parseFlags>(s, h));
1218
+ EXPECT_EQ(2u, h.step_);
1219
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag | parseFlags>(s, h));
1220
+ EXPECT_EQ(4u, h.step_);
1221
+ EXPECT_EQ(' ', s.Take());
1222
+ EXPECT_EQ('a', s.Take());
1223
+ free(buffer);
1224
+ }
1225
+
1226
+ TEST(Reader, ParseInsitu_MultipleRoot) {
1227
+ TestInsituMultipleRoot<kParseStopWhenDoneFlag>();
1228
+ }
1229
+
1230
+ TEST(Reader, ParseInsituIterative_MultipleRoot) {
1231
+ TestInsituMultipleRoot<kParseIterativeFlag | kParseStopWhenDoneFlag>();
1232
+ }
1233
+
1234
+ #define TEST_ERROR(errorCode, str, errorOffset) \
1235
+ { \
1236
+ unsigned streamPos = errorOffset; \
1237
+ char buffer[1001]; \
1238
+ strncpy(buffer, str, 1000); \
1239
+ InsituStringStream s(buffer); \
1240
+ BaseReaderHandler<> h; \
1241
+ Reader reader; \
1242
+ EXPECT_FALSE(reader.Parse(s, h)); \
1243
+ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
1244
+ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
1245
+ EXPECT_EQ(streamPos, s.Tell());\
1246
+ }
1247
+
1248
+ TEST(Reader, ParseDocument_Error) {
1249
+ // The document is empty.
1250
+ TEST_ERROR(kParseErrorDocumentEmpty, "", 0u);
1251
+ TEST_ERROR(kParseErrorDocumentEmpty, " ", 1u);
1252
+ TEST_ERROR(kParseErrorDocumentEmpty, " \n", 2u);
1253
+
1254
+ // The document root must not follow by other values.
1255
+ TEST_ERROR(kParseErrorDocumentRootNotSingular, "[] 0", 3u);
1256
+ TEST_ERROR(kParseErrorDocumentRootNotSingular, "{} 0", 3u);
1257
+ TEST_ERROR(kParseErrorDocumentRootNotSingular, "null []", 5u);
1258
+ TEST_ERROR(kParseErrorDocumentRootNotSingular, "0 {}", 2u);
1259
+ }
1260
+
1261
+ TEST(Reader, ParseValue_Error) {
1262
+ // Invalid value.
1263
+ TEST_ERROR(kParseErrorValueInvalid, "nulL", 3u);
1264
+ TEST_ERROR(kParseErrorValueInvalid, "truE", 3u);
1265
+ TEST_ERROR(kParseErrorValueInvalid, "falsE", 4u);
1266
+ TEST_ERROR(kParseErrorValueInvalid, "a]", 0u);
1267
+ TEST_ERROR(kParseErrorValueInvalid, ".1", 0u);
1268
+ }
1269
+
1270
+ TEST(Reader, ParseObject_Error) {
1271
+ // Missing a name for object member.
1272
+ TEST_ERROR(kParseErrorObjectMissName, "{1}", 1u);
1273
+ TEST_ERROR(kParseErrorObjectMissName, "{:1}", 1u);
1274
+ TEST_ERROR(kParseErrorObjectMissName, "{null:1}", 1u);
1275
+ TEST_ERROR(kParseErrorObjectMissName, "{true:1}", 1u);
1276
+ TEST_ERROR(kParseErrorObjectMissName, "{false:1}", 1u);
1277
+ TEST_ERROR(kParseErrorObjectMissName, "{1:1}", 1u);
1278
+ TEST_ERROR(kParseErrorObjectMissName, "{[]:1}", 1u);
1279
+ TEST_ERROR(kParseErrorObjectMissName, "{{}:1}", 1u);
1280
+ TEST_ERROR(kParseErrorObjectMissName, "{xyz:1}", 1u);
1281
+
1282
+ // Missing a colon after a name of object member.
1283
+ TEST_ERROR(kParseErrorObjectMissColon, "{\"a\" 1}", 5u);
1284
+ TEST_ERROR(kParseErrorObjectMissColon, "{\"a\",1}", 4u);
1285
+
1286
+ // Must be a comma or '}' after an object member
1287
+ TEST_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, "{\"a\":1]", 6u);
1288
+
1289
+ // Object cannot have a trailing comma (without kParseTrailingCommasFlag);
1290
+ // an object member name must follow a comma
1291
+ TEST_ERROR(kParseErrorObjectMissName, "{\"a\":1,}", 7u);
1292
+
1293
+ // This tests that MemoryStream is checking the length in Peek().
1294
+ {
1295
+ MemoryStream ms("{\"a\"", 1);
1296
+ BaseReaderHandler<> h;
1297
+ Reader reader;
1298
+ EXPECT_FALSE(reader.Parse<kParseStopWhenDoneFlag>(ms, h));
1299
+ EXPECT_EQ(kParseErrorObjectMissName, reader.GetParseErrorCode());
1300
+ }
1301
+ }
1302
+
1303
+ #undef TEST_ERROR
1304
+
1305
+ TEST(Reader, SkipWhitespace) {
1306
+ StringStream ss(" A \t\tB\n \n\nC\r\r \rD \t\n\r E");
1307
+ const char* expected = "ABCDE";
1308
+ for (size_t i = 0; i < 5; i++) {
1309
+ SkipWhitespace(ss);
1310
+ EXPECT_EQ(expected[i], ss.Take());
1311
+ }
1312
+ }
1313
+
1314
+ // Test implementing a stream without copy stream optimization.
1315
+ // Clone from GenericStringStream except that copy constructor is disabled.
1316
+ template <typename Encoding>
1317
+ class CustomStringStream {
1318
+ public:
1319
+ typedef typename Encoding::Ch Ch;
1320
+
1321
+ CustomStringStream(const Ch *src) : src_(src), head_(src) {}
1322
+
1323
+ Ch Peek() const { return *src_; }
1324
+ Ch Take() { return *src_++; }
1325
+ size_t Tell() const { return static_cast<size_t>(src_ - head_); }
1326
+
1327
+ Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; }
1328
+ void Put(Ch) { RAPIDJSON_ASSERT(false); }
1329
+ void Flush() { RAPIDJSON_ASSERT(false); }
1330
+ size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; }
1331
+
1332
+ private:
1333
+ // Prohibit copy constructor & assignment operator.
1334
+ CustomStringStream(const CustomStringStream&);
1335
+ CustomStringStream& operator=(const CustomStringStream&);
1336
+
1337
+ const Ch* src_; //!< Current read position.
1338
+ const Ch* head_; //!< Original head of the string.
1339
+ };
1340
+
1341
+ // If the following code is compiled, it should generate compilation error as predicted.
1342
+ // Because CustomStringStream<> is not copyable via making copy constructor private.
1343
+ #if 0
1344
+ namespace rapidjson {
1345
+
1346
+ template <typename Encoding>
1347
+ struct StreamTraits<CustomStringStream<Encoding> > {
1348
+ enum { copyOptimization = 1 };
1349
+ };
1350
+
1351
+ } // namespace rapidjson
1352
+ #endif
1353
+
1354
+ TEST(Reader, CustomStringStream) {
1355
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } ";
1356
+ CustomStringStream<UTF8<char> > s(json);
1357
+ ParseObjectHandler h;
1358
+ Reader reader;
1359
+ reader.Parse(s, h);
1360
+ EXPECT_EQ(20u, h.step_);
1361
+ }
1362
+
1363
+ #include <sstream>
1364
+
1365
+ class IStreamWrapper {
1366
+ public:
1367
+ typedef char Ch;
1368
+
1369
+ IStreamWrapper(std::istream& is) : is_(is) {}
1370
+
1371
+ Ch Peek() const {
1372
+ int c = is_.peek();
1373
+ return c == std::char_traits<char>::eof() ? '\0' : static_cast<Ch>(c);
1374
+ }
1375
+
1376
+ Ch Take() {
1377
+ int c = is_.get();
1378
+ return c == std::char_traits<char>::eof() ? '\0' : static_cast<Ch>(c);
1379
+ }
1380
+
1381
+ size_t Tell() const { return static_cast<size_t>(is_.tellg()); }
1382
+
1383
+ Ch* PutBegin() { assert(false); return 0; }
1384
+ void Put(Ch) { assert(false); }
1385
+ void Flush() { assert(false); }
1386
+ size_t PutEnd(Ch*) { assert(false); return 0; }
1387
+
1388
+ private:
1389
+ IStreamWrapper(const IStreamWrapper&);
1390
+ IStreamWrapper& operator=(const IStreamWrapper&);
1391
+
1392
+ std::istream& is_;
1393
+ };
1394
+
1395
+ TEST(Reader, Parse_IStreamWrapper_StringStream) {
1396
+ const char* json = "[1,2,3,4]";
1397
+
1398
+ std::stringstream ss(json);
1399
+ IStreamWrapper is(ss);
1400
+
1401
+ Reader reader;
1402
+ ParseArrayHandler<4> h;
1403
+ reader.Parse(is, h);
1404
+ EXPECT_FALSE(reader.HasParseError());
1405
+ }
1406
+
1407
+ // Test iterative parsing.
1408
+
1409
+ #define TESTERRORHANDLING(text, errorCode, offset)\
1410
+ {\
1411
+ unsigned streamPos = offset; \
1412
+ StringStream json(text); \
1413
+ BaseReaderHandler<> handler; \
1414
+ Reader reader; \
1415
+ reader.Parse<kParseIterativeFlag>(json, handler); \
1416
+ EXPECT_TRUE(reader.HasParseError()); \
1417
+ EXPECT_EQ(errorCode, reader.GetParseErrorCode()); \
1418
+ EXPECT_EQ(offset, reader.GetErrorOffset()); \
1419
+ EXPECT_EQ(streamPos, json.Tell()); \
1420
+ }
1421
+
1422
+ TEST(Reader, IterativeParsing_ErrorHandling) {
1423
+ TESTERRORHANDLING("{\"a\": a}", kParseErrorValueInvalid, 6u);
1424
+
1425
+ TESTERRORHANDLING("", kParseErrorDocumentEmpty, 0u);
1426
+ TESTERRORHANDLING("{}{}", kParseErrorDocumentRootNotSingular, 2u);
1427
+
1428
+ TESTERRORHANDLING("{1}", kParseErrorObjectMissName, 1u);
1429
+ TESTERRORHANDLING("{\"a\", 1}", kParseErrorObjectMissColon, 4u);
1430
+ TESTERRORHANDLING("{\"a\"}", kParseErrorObjectMissColon, 4u);
1431
+ TESTERRORHANDLING("{\"a\": 1", kParseErrorObjectMissCommaOrCurlyBracket, 7u);
1432
+ TESTERRORHANDLING("[1 2 3]", kParseErrorArrayMissCommaOrSquareBracket, 3u);
1433
+ TESTERRORHANDLING("{\"a: 1", kParseErrorStringMissQuotationMark, 6u);
1434
+ TESTERRORHANDLING("{\"a\":}", kParseErrorValueInvalid, 5u);
1435
+ TESTERRORHANDLING("{\"a\":]", kParseErrorValueInvalid, 5u);
1436
+ TESTERRORHANDLING("[1,2,}", kParseErrorValueInvalid, 5u);
1437
+ TESTERRORHANDLING("[}]", kParseErrorValueInvalid, 1u);
1438
+ TESTERRORHANDLING("[,]", kParseErrorValueInvalid, 1u);
1439
+ TESTERRORHANDLING("[1,,]", kParseErrorValueInvalid, 3u);
1440
+
1441
+ // Trailing commas are not allowed without kParseTrailingCommasFlag
1442
+ TESTERRORHANDLING("{\"a\": 1,}", kParseErrorObjectMissName, 8u);
1443
+ TESTERRORHANDLING("[1,2,3,]", kParseErrorValueInvalid, 7u);
1444
+
1445
+ // Any JSON value can be a valid root element in RFC7159.
1446
+ TESTERRORHANDLING("\"ab", kParseErrorStringMissQuotationMark, 3u);
1447
+ TESTERRORHANDLING("truE", kParseErrorValueInvalid, 3u);
1448
+ TESTERRORHANDLING("False", kParseErrorValueInvalid, 0u);
1449
+ TESTERRORHANDLING("true, false", kParseErrorDocumentRootNotSingular, 4u);
1450
+ TESTERRORHANDLING("false, false", kParseErrorDocumentRootNotSingular, 5u);
1451
+ TESTERRORHANDLING("nulL", kParseErrorValueInvalid, 3u);
1452
+ TESTERRORHANDLING("null , null", kParseErrorDocumentRootNotSingular, 5u);
1453
+ TESTERRORHANDLING("1a", kParseErrorDocumentRootNotSingular, 1u);
1454
+ }
1455
+
1456
+ template<typename Encoding = UTF8<> >
1457
+ struct IterativeParsingReaderHandler {
1458
+ typedef typename Encoding::Ch Ch;
1459
+
1460
+ const static uint32_t LOG_NULL = 0x10000000;
1461
+ const static uint32_t LOG_BOOL = 0x20000000;
1462
+ const static uint32_t LOG_INT = 0x30000000;
1463
+ const static uint32_t LOG_UINT = 0x40000000;
1464
+ const static uint32_t LOG_INT64 = 0x50000000;
1465
+ const static uint32_t LOG_UINT64 = 0x60000000;
1466
+ const static uint32_t LOG_DOUBLE = 0x70000000;
1467
+ const static uint32_t LOG_STRING = 0x80000000;
1468
+ const static uint32_t LOG_STARTOBJECT = 0x90000000;
1469
+ const static uint32_t LOG_KEY = 0xA0000000;
1470
+ const static uint32_t LOG_ENDOBJECT = 0xB0000000;
1471
+ const static uint32_t LOG_STARTARRAY = 0xC0000000;
1472
+ const static uint32_t LOG_ENDARRAY = 0xD0000000;
1473
+
1474
+ const static size_t LogCapacity = 256;
1475
+ uint32_t Logs[LogCapacity];
1476
+ size_t LogCount;
1477
+
1478
+ IterativeParsingReaderHandler() : LogCount(0) {
1479
+ }
1480
+
1481
+ bool Null() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_NULL; return true; }
1482
+
1483
+ bool Bool(bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_BOOL; return true; }
1484
+
1485
+ bool Int(int) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; }
1486
+
1487
+ bool Uint(unsigned) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; }
1488
+
1489
+ bool Int64(int64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT64; return true; }
1490
+
1491
+ bool Uint64(uint64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_UINT64; return true; }
1492
+
1493
+ bool Double(double) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_DOUBLE; return true; }
1494
+
1495
+ bool RawNumber(const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STRING; return true; }
1496
+
1497
+ bool String(const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STRING; return true; }
1498
+
1499
+ bool StartObject() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTOBJECT; return true; }
1500
+
1501
+ bool Key (const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_KEY; return true; }
1502
+
1503
+ bool EndObject(SizeType c) {
1504
+ RAPIDJSON_ASSERT(LogCount < LogCapacity);
1505
+ RAPIDJSON_ASSERT((static_cast<uint32_t>(c) & 0xF0000000) == 0);
1506
+ Logs[LogCount++] = LOG_ENDOBJECT | static_cast<uint32_t>(c);
1507
+ return true;
1508
+ }
1509
+
1510
+ bool StartArray() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTARRAY; return true; }
1511
+
1512
+ bool EndArray(SizeType c) {
1513
+ RAPIDJSON_ASSERT(LogCount < LogCapacity);
1514
+ RAPIDJSON_ASSERT((static_cast<uint32_t>(c) & 0xF0000000) == 0);
1515
+ Logs[LogCount++] = LOG_ENDARRAY | static_cast<uint32_t>(c);
1516
+ return true;
1517
+ }
1518
+ };
1519
+
1520
+ TEST(Reader, IterativeParsing_General) {
1521
+ {
1522
+ StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]");
1523
+ Reader reader;
1524
+ IterativeParsingReaderHandler<> handler;
1525
+
1526
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1527
+
1528
+ EXPECT_FALSE(r.IsError());
1529
+ EXPECT_FALSE(reader.HasParseError());
1530
+
1531
+ uint32_t e[] = {
1532
+ handler.LOG_STARTARRAY,
1533
+ handler.LOG_INT,
1534
+ handler.LOG_STARTOBJECT,
1535
+ handler.LOG_KEY,
1536
+ handler.LOG_STARTARRAY,
1537
+ handler.LOG_INT,
1538
+ handler.LOG_INT,
1539
+ handler.LOG_ENDARRAY | 2,
1540
+ handler.LOG_ENDOBJECT | 1,
1541
+ handler.LOG_NULL,
1542
+ handler.LOG_BOOL,
1543
+ handler.LOG_BOOL,
1544
+ handler.LOG_STRING,
1545
+ handler.LOG_DOUBLE,
1546
+ handler.LOG_ENDARRAY | 7
1547
+ };
1548
+
1549
+ EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount);
1550
+
1551
+ for (size_t i = 0; i < handler.LogCount; ++i) {
1552
+ EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i;
1553
+ }
1554
+ }
1555
+ }
1556
+
1557
+ TEST(Reader, IterativeParsing_Count) {
1558
+ {
1559
+ StringStream is("[{}, {\"k\": 1}, [1], []]");
1560
+ Reader reader;
1561
+ IterativeParsingReaderHandler<> handler;
1562
+
1563
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1564
+
1565
+ EXPECT_FALSE(r.IsError());
1566
+ EXPECT_FALSE(reader.HasParseError());
1567
+
1568
+ uint32_t e[] = {
1569
+ handler.LOG_STARTARRAY,
1570
+ handler.LOG_STARTOBJECT,
1571
+ handler.LOG_ENDOBJECT | 0,
1572
+ handler.LOG_STARTOBJECT,
1573
+ handler.LOG_KEY,
1574
+ handler.LOG_INT,
1575
+ handler.LOG_ENDOBJECT | 1,
1576
+ handler.LOG_STARTARRAY,
1577
+ handler.LOG_INT,
1578
+ handler.LOG_ENDARRAY | 1,
1579
+ handler.LOG_STARTARRAY,
1580
+ handler.LOG_ENDARRAY | 0,
1581
+ handler.LOG_ENDARRAY | 4
1582
+ };
1583
+
1584
+ EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount);
1585
+
1586
+ for (size_t i = 0; i < handler.LogCount; ++i) {
1587
+ EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i;
1588
+ }
1589
+ }
1590
+ }
1591
+
1592
+ TEST(Reader, IterativePullParsing_General) {
1593
+ {
1594
+ IterativeParsingReaderHandler<> handler;
1595
+ uint32_t e[] = {
1596
+ handler.LOG_STARTARRAY,
1597
+ handler.LOG_INT,
1598
+ handler.LOG_STARTOBJECT,
1599
+ handler.LOG_KEY,
1600
+ handler.LOG_STARTARRAY,
1601
+ handler.LOG_INT,
1602
+ handler.LOG_INT,
1603
+ handler.LOG_ENDARRAY | 2,
1604
+ handler.LOG_ENDOBJECT | 1,
1605
+ handler.LOG_NULL,
1606
+ handler.LOG_BOOL,
1607
+ handler.LOG_BOOL,
1608
+ handler.LOG_STRING,
1609
+ handler.LOG_DOUBLE,
1610
+ handler.LOG_ENDARRAY | 7
1611
+ };
1612
+
1613
+ StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]");
1614
+ Reader reader;
1615
+
1616
+ reader.IterativeParseInit();
1617
+ while (!reader.IterativeParseComplete()) {
1618
+ size_t oldLogCount = handler.LogCount;
1619
+ EXPECT_TRUE(oldLogCount < sizeof(e) / sizeof(int)) << "overrun";
1620
+
1621
+ EXPECT_TRUE(reader.IterativeParseNext<kParseDefaultFlags>(is, handler)) << "parse fail";
1622
+ EXPECT_EQ(handler.LogCount, oldLogCount + 1) << "handler should be invoked exactly once each time";
1623
+ EXPECT_EQ(e[oldLogCount], handler.Logs[oldLogCount]) << "wrong event returned";
1624
+ }
1625
+
1626
+ EXPECT_FALSE(reader.HasParseError());
1627
+ EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount) << "handler invoked wrong number of times";
1628
+
1629
+ // The handler should not be invoked when the JSON has been fully read, but it should not fail
1630
+ size_t oldLogCount = handler.LogCount;
1631
+ EXPECT_TRUE(reader.IterativeParseNext<kParseDefaultFlags>(is, handler)) << "parse-next past complete is allowed";
1632
+ EXPECT_EQ(handler.LogCount, oldLogCount) << "parse-next past complete should not invoke handler";
1633
+ EXPECT_FALSE(reader.HasParseError()) << "parse-next past complete should not generate parse error";
1634
+ }
1635
+ }
1636
+
1637
+ // Test iterative parsing on kParseErrorTermination.
1638
+ struct HandlerTerminateAtStartObject : public IterativeParsingReaderHandler<> {
1639
+ bool StartObject() { return false; }
1640
+ };
1641
+
1642
+ struct HandlerTerminateAtStartArray : public IterativeParsingReaderHandler<> {
1643
+ bool StartArray() { return false; }
1644
+ };
1645
+
1646
+ struct HandlerTerminateAtEndObject : public IterativeParsingReaderHandler<> {
1647
+ bool EndObject(SizeType) { return false; }
1648
+ };
1649
+
1650
+ struct HandlerTerminateAtEndArray : public IterativeParsingReaderHandler<> {
1651
+ bool EndArray(SizeType) { return false; }
1652
+ };
1653
+
1654
+ TEST(Reader, IterativeParsing_ShortCircuit) {
1655
+ {
1656
+ HandlerTerminateAtStartObject handler;
1657
+ Reader reader;
1658
+ StringStream is("[1, {}]");
1659
+
1660
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1661
+
1662
+ EXPECT_TRUE(reader.HasParseError());
1663
+ EXPECT_EQ(kParseErrorTermination, r.Code());
1664
+ EXPECT_EQ(4u, r.Offset());
1665
+ }
1666
+
1667
+ {
1668
+ HandlerTerminateAtStartArray handler;
1669
+ Reader reader;
1670
+ StringStream is("{\"a\": []}");
1671
+
1672
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1673
+
1674
+ EXPECT_TRUE(reader.HasParseError());
1675
+ EXPECT_EQ(kParseErrorTermination, r.Code());
1676
+ EXPECT_EQ(6u, r.Offset());
1677
+ }
1678
+
1679
+ {
1680
+ HandlerTerminateAtEndObject handler;
1681
+ Reader reader;
1682
+ StringStream is("[1, {}]");
1683
+
1684
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1685
+
1686
+ EXPECT_TRUE(reader.HasParseError());
1687
+ EXPECT_EQ(kParseErrorTermination, r.Code());
1688
+ EXPECT_EQ(5u, r.Offset());
1689
+ }
1690
+
1691
+ {
1692
+ HandlerTerminateAtEndArray handler;
1693
+ Reader reader;
1694
+ StringStream is("{\"a\": []}");
1695
+
1696
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1697
+
1698
+ EXPECT_TRUE(reader.HasParseError());
1699
+ EXPECT_EQ(kParseErrorTermination, r.Code());
1700
+ EXPECT_EQ(7u, r.Offset());
1701
+ }
1702
+ }
1703
+
1704
+ // For covering BaseReaderHandler default functions
1705
+ TEST(Reader, BaseReaderHandler_Default) {
1706
+ BaseReaderHandler<> h;
1707
+ Reader reader;
1708
+ StringStream is("[null, true, -1, 1, -1234567890123456789, 1234567890123456789, 3.14, \"s\", { \"a\" : 1 }]");
1709
+ EXPECT_TRUE(reader.Parse(is, h));
1710
+ }
1711
+
1712
+ template <int e>
1713
+ struct TerminateHandler {
1714
+ bool Null() { return e != 0; }
1715
+ bool Bool(bool) { return e != 1; }
1716
+ bool Int(int) { return e != 2; }
1717
+ bool Uint(unsigned) { return e != 3; }
1718
+ bool Int64(int64_t) { return e != 4; }
1719
+ bool Uint64(uint64_t) { return e != 5; }
1720
+ bool Double(double) { return e != 6; }
1721
+ bool RawNumber(const char*, SizeType, bool) { return e != 7; }
1722
+ bool String(const char*, SizeType, bool) { return e != 8; }
1723
+ bool StartObject() { return e != 9; }
1724
+ bool Key(const char*, SizeType, bool) { return e != 10; }
1725
+ bool EndObject(SizeType) { return e != 11; }
1726
+ bool StartArray() { return e != 12; }
1727
+ bool EndArray(SizeType) { return e != 13; }
1728
+ };
1729
+
1730
+ #define TEST_TERMINATION(e, json)\
1731
+ {\
1732
+ Reader reader;\
1733
+ TerminateHandler<e> h;\
1734
+ StringStream is(json);\
1735
+ EXPECT_FALSE(reader.Parse(is, h));\
1736
+ EXPECT_EQ(kParseErrorTermination, reader.GetParseErrorCode());\
1737
+ }
1738
+
1739
+ TEST(Reader, ParseTerminationByHandler) {
1740
+ TEST_TERMINATION(0, "[null");
1741
+ TEST_TERMINATION(1, "[true");
1742
+ TEST_TERMINATION(1, "[false");
1743
+ TEST_TERMINATION(2, "[-1");
1744
+ TEST_TERMINATION(3, "[1");
1745
+ TEST_TERMINATION(4, "[-1234567890123456789");
1746
+ TEST_TERMINATION(5, "[1234567890123456789");
1747
+ TEST_TERMINATION(6, "[0.5]");
1748
+ // RawNumber() is never called
1749
+ TEST_TERMINATION(8, "[\"a\"");
1750
+ TEST_TERMINATION(9, "[{");
1751
+ TEST_TERMINATION(10, "[{\"a\"");
1752
+ TEST_TERMINATION(11, "[{}");
1753
+ TEST_TERMINATION(11, "[{\"a\":1}"); // non-empty object
1754
+ TEST_TERMINATION(12, "{\"a\":[");
1755
+ TEST_TERMINATION(13, "{\"a\":[]");
1756
+ TEST_TERMINATION(13, "{\"a\":[1]"); // non-empty array
1757
+ }
1758
+
1759
+ TEST(Reader, ParseComments) {
1760
+ const char* json =
1761
+ "// Here is a one-line comment.\n"
1762
+ "{// And here's another one\n"
1763
+ " /*And here's an in-line one.*/\"hello\" : \"world\","
1764
+ " \"t\" :/* And one with '*' symbol*/true ,"
1765
+ "/* A multiline comment\n"
1766
+ " goes here*/"
1767
+ " \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3]"
1768
+ "}/*And the last one to be sure */";
1769
+
1770
+ StringStream s(json);
1771
+ ParseObjectHandler h;
1772
+ Reader reader;
1773
+ EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
1774
+ EXPECT_EQ(20u, h.step_);
1775
+ }
1776
+
1777
+ TEST(Reader, ParseEmptyInlineComment) {
1778
+ const char* json = "{/**/\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1779
+
1780
+ StringStream s(json);
1781
+ ParseObjectHandler h;
1782
+ Reader reader;
1783
+ EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
1784
+ EXPECT_EQ(20u, h.step_);
1785
+ }
1786
+
1787
+ TEST(Reader, ParseEmptyOnelineComment) {
1788
+ const char* json = "{//\n\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1789
+
1790
+ StringStream s(json);
1791
+ ParseObjectHandler h;
1792
+ Reader reader;
1793
+ EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
1794
+ EXPECT_EQ(20u, h.step_);
1795
+ }
1796
+
1797
+ TEST(Reader, ParseMultipleCommentsInARow) {
1798
+ const char* json =
1799
+ "{/* first comment *//* second */\n"
1800
+ "/* third */ /*fourth*/// last one\n"
1801
+ "\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1802
+
1803
+ StringStream s(json);
1804
+ ParseObjectHandler h;
1805
+ Reader reader;
1806
+ EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
1807
+ EXPECT_EQ(20u, h.step_);
1808
+ }
1809
+
1810
+ TEST(Reader, InlineCommentsAreDisabledByDefault) {
1811
+ {
1812
+ const char* json = "{/* Inline comment. */\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1813
+
1814
+ StringStream s(json);
1815
+ ParseObjectHandler h;
1816
+ Reader reader;
1817
+ EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
1818
+ }
1819
+
1820
+ {
1821
+ const char* json =
1822
+ "{\"hello\" : /* Multiline comment starts here\n"
1823
+ " continues here\n"
1824
+ " and ends here */\"world\", \"t\" :true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1825
+
1826
+ StringStream s(json);
1827
+ ParseObjectHandler h;
1828
+ Reader reader;
1829
+ EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
1830
+ }
1831
+ }
1832
+
1833
+ TEST(Reader, OnelineCommentsAreDisabledByDefault) {
1834
+ const char* json = "{// One-line comment\n\"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1835
+
1836
+ StringStream s(json);
1837
+ ParseObjectHandler h;
1838
+ Reader reader;
1839
+ EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
1840
+ }
1841
+
1842
+ TEST(Reader, EofAfterOneLineComment) {
1843
+ const char* json = "{\"hello\" : \"world\" // EOF is here -->\0 \n}";
1844
+
1845
+ StringStream s(json);
1846
+ ParseObjectHandler h;
1847
+ Reader reader;
1848
+ EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
1849
+ EXPECT_EQ(kParseErrorObjectMissCommaOrCurlyBracket, reader.GetParseErrorCode());
1850
+ }
1851
+
1852
+ TEST(Reader, IncompleteMultilineComment) {
1853
+ const char* json = "{\"hello\" : \"world\" /* EOF is here -->\0 */}";
1854
+
1855
+ StringStream s(json);
1856
+ ParseObjectHandler h;
1857
+ Reader reader;
1858
+ EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
1859
+ EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
1860
+ }
1861
+
1862
+ TEST(Reader, IncompleteMultilineComment2) {
1863
+ const char* json = "{\"hello\" : \"world\" /* *\0 */}";
1864
+
1865
+ StringStream s(json);
1866
+ ParseObjectHandler h;
1867
+ Reader reader;
1868
+ EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
1869
+ EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
1870
+ }
1871
+
1872
+ TEST(Reader, UnrecognizedComment) {
1873
+ const char* json = "{\"hello\" : \"world\" /! }";
1874
+
1875
+ StringStream s(json);
1876
+ ParseObjectHandler h;
1877
+ Reader reader;
1878
+ EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
1879
+ EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
1880
+ }
1881
+
1882
+ struct NumbersAsStringsHandler {
1883
+ bool Null() { return true; }
1884
+ bool Bool(bool) { return true; }
1885
+ bool Int(int) { return true; }
1886
+ bool Uint(unsigned) { return true; }
1887
+ bool Int64(int64_t) { return true; }
1888
+ bool Uint64(uint64_t) { return true; }
1889
+ bool Double(double) { return true; }
1890
+ // 'str' is not null-terminated
1891
+ bool RawNumber(const char* str, SizeType length, bool) {
1892
+ EXPECT_TRUE(str != 0);
1893
+ EXPECT_TRUE(expected_len_ == length);
1894
+ EXPECT_TRUE(strncmp(str, expected_, length) == 0);
1895
+ return true;
1896
+ }
1897
+ bool String(const char*, SizeType, bool) { return true; }
1898
+ bool StartObject() { return true; }
1899
+ bool Key(const char*, SizeType, bool) { return true; }
1900
+ bool EndObject(SizeType) { return true; }
1901
+ bool StartArray() { return true; }
1902
+ bool EndArray(SizeType) { return true; }
1903
+
1904
+ NumbersAsStringsHandler(const char* expected)
1905
+ : expected_(expected)
1906
+ , expected_len_(strlen(expected)) {}
1907
+
1908
+ const char* expected_;
1909
+ size_t expected_len_;
1910
+ };
1911
+
1912
+ TEST(Reader, NumbersAsStrings) {
1913
+ {
1914
+ const char* json = "{ \"pi\": 3.1416 } ";
1915
+ StringStream s(json);
1916
+ NumbersAsStringsHandler h("3.1416");
1917
+ Reader reader;
1918
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1919
+ }
1920
+ {
1921
+ char* json = StrDup("{ \"pi\": 3.1416 } ");
1922
+ InsituStringStream s(json);
1923
+ NumbersAsStringsHandler h("3.1416");
1924
+ Reader reader;
1925
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
1926
+ free(json);
1927
+ }
1928
+ {
1929
+ const char* json = "{ \"gigabyte\": 1.0e9 } ";
1930
+ StringStream s(json);
1931
+ NumbersAsStringsHandler h("1.0e9");
1932
+ Reader reader;
1933
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1934
+ }
1935
+ {
1936
+ char* json = StrDup("{ \"gigabyte\": 1.0e9 } ");
1937
+ InsituStringStream s(json);
1938
+ NumbersAsStringsHandler h("1.0e9");
1939
+ Reader reader;
1940
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
1941
+ free(json);
1942
+ }
1943
+ {
1944
+ const char* json = "{ \"pi\": 314.159e-2 } ";
1945
+ StringStream s(json);
1946
+ NumbersAsStringsHandler h("314.159e-2");
1947
+ Reader reader;
1948
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1949
+ }
1950
+ {
1951
+ char* json = StrDup("{ \"gigabyte\": 314.159e-2 } ");
1952
+ InsituStringStream s(json);
1953
+ NumbersAsStringsHandler h("314.159e-2");
1954
+ Reader reader;
1955
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
1956
+ free(json);
1957
+ }
1958
+ {
1959
+ const char* json = "{ \"negative\": -1.54321 } ";
1960
+ StringStream s(json);
1961
+ NumbersAsStringsHandler h("-1.54321");
1962
+ Reader reader;
1963
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1964
+ }
1965
+ {
1966
+ char* json = StrDup("{ \"negative\": -1.54321 } ");
1967
+ InsituStringStream s(json);
1968
+ NumbersAsStringsHandler h("-1.54321");
1969
+ Reader reader;
1970
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
1971
+ free(json);
1972
+ }
1973
+ {
1974
+ const char* json = "{ \"pi\": 314.159e-2 } ";
1975
+ std::stringstream ss(json);
1976
+ IStreamWrapper s(ss);
1977
+ NumbersAsStringsHandler h("314.159e-2");
1978
+ Reader reader;
1979
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1980
+ }
1981
+ {
1982
+ char n1e319[321]; // '1' followed by 319 '0'
1983
+ n1e319[0] = '1';
1984
+ for (int i = 1; i < 320; i++)
1985
+ n1e319[i] = '0';
1986
+ n1e319[320] = '\0';
1987
+ StringStream s(n1e319);
1988
+ NumbersAsStringsHandler h(n1e319);
1989
+ Reader reader;
1990
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1991
+ }
1992
+ }
1993
+
1994
+ template <unsigned extraFlags>
1995
+ void TestTrailingCommas() {
1996
+ {
1997
+ StringStream s("[1,2,3,]");
1998
+ ParseArrayHandler<3> h;
1999
+ Reader reader;
2000
+ EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
2001
+ EXPECT_EQ(5u, h.step_);
2002
+ }
2003
+ {
2004
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
2005
+ "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3],}";
2006
+ StringStream s(json);
2007
+ ParseObjectHandler h;
2008
+ Reader reader;
2009
+ EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
2010
+ EXPECT_EQ(20u, h.step_);
2011
+ }
2012
+ {
2013
+ // whitespace around trailing commas
2014
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
2015
+ "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3\n,\n]\n,\n} ";
2016
+ StringStream s(json);
2017
+ ParseObjectHandler h;
2018
+ Reader reader;
2019
+ EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
2020
+ EXPECT_EQ(20u, h.step_);
2021
+ }
2022
+ {
2023
+ // comments around trailing commas
2024
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null,"
2025
+ "\"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3/*test*/,/*test*/]/*test*/,/*test*/}";
2026
+ StringStream s(json);
2027
+ ParseObjectHandler h;
2028
+ Reader reader;
2029
+ EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag|kParseCommentsFlag>(s, h));
2030
+ EXPECT_EQ(20u, h.step_);
2031
+ }
2032
+ }
2033
+
2034
+ TEST(Reader, TrailingCommas) {
2035
+ TestTrailingCommas<kParseNoFlags>();
2036
+ }
2037
+
2038
+ TEST(Reader, TrailingCommasIterative) {
2039
+ TestTrailingCommas<kParseIterativeFlag>();
2040
+ }
2041
+
2042
+ template <unsigned extraFlags>
2043
+ void TestMultipleTrailingCommaErrors() {
2044
+ // only a single trailing comma is allowed.
2045
+ {
2046
+ StringStream s("[1,2,3,,]");
2047
+ ParseArrayHandler<3> h;
2048
+ Reader reader;
2049
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2050
+ EXPECT_TRUE(reader.HasParseError());
2051
+ EXPECT_EQ(kParseErrorValueInvalid, r.Code());
2052
+ EXPECT_EQ(7u, r.Offset());
2053
+ }
2054
+ {
2055
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
2056
+ "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3,],,}";
2057
+ StringStream s(json);
2058
+ ParseObjectHandler h;
2059
+ Reader reader;
2060
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2061
+ EXPECT_TRUE(reader.HasParseError());
2062
+ EXPECT_EQ(kParseErrorObjectMissName, r.Code());
2063
+ EXPECT_EQ(95u, r.Offset());
2064
+ }
2065
+ }
2066
+
2067
+ TEST(Reader, MultipleTrailingCommaErrors) {
2068
+ TestMultipleTrailingCommaErrors<kParseNoFlags>();
2069
+ }
2070
+
2071
+ TEST(Reader, MultipleTrailingCommaErrorsIterative) {
2072
+ TestMultipleTrailingCommaErrors<kParseIterativeFlag>();
2073
+ }
2074
+
2075
+ template <unsigned extraFlags>
2076
+ void TestEmptyExceptForCommaErrors() {
2077
+ // not allowed even with trailing commas enabled; the
2078
+ // trailing comma must follow a value.
2079
+ {
2080
+ StringStream s("[,]");
2081
+ ParseArrayHandler<3> h;
2082
+ Reader reader;
2083
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2084
+ EXPECT_TRUE(reader.HasParseError());
2085
+ EXPECT_EQ(kParseErrorValueInvalid, r.Code());
2086
+ EXPECT_EQ(1u, r.Offset());
2087
+ }
2088
+ {
2089
+ StringStream s("{,}");
2090
+ ParseObjectHandler h;
2091
+ Reader reader;
2092
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2093
+ EXPECT_TRUE(reader.HasParseError());
2094
+ EXPECT_EQ(kParseErrorObjectMissName, r.Code());
2095
+ EXPECT_EQ(1u, r.Offset());
2096
+ }
2097
+ }
2098
+
2099
+ TEST(Reader, EmptyExceptForCommaErrors) {
2100
+ TestEmptyExceptForCommaErrors<kParseNoFlags>();
2101
+ }
2102
+
2103
+ TEST(Reader, EmptyExceptForCommaErrorsIterative) {
2104
+ TestEmptyExceptForCommaErrors<kParseIterativeFlag>();
2105
+ }
2106
+
2107
+ template <unsigned extraFlags>
2108
+ void TestTrailingCommaHandlerTermination() {
2109
+ {
2110
+ HandlerTerminateAtEndArray h;
2111
+ Reader reader;
2112
+ StringStream s("[1,2,3,]");
2113
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2114
+ EXPECT_TRUE(reader.HasParseError());
2115
+ EXPECT_EQ(kParseErrorTermination, r.Code());
2116
+ EXPECT_EQ(7u, r.Offset());
2117
+ }
2118
+ {
2119
+ HandlerTerminateAtEndObject h;
2120
+ Reader reader;
2121
+ StringStream s("{\"t\": true, \"f\": false,}");
2122
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2123
+ EXPECT_TRUE(reader.HasParseError());
2124
+ EXPECT_EQ(kParseErrorTermination, r.Code());
2125
+ EXPECT_EQ(23u, r.Offset());
2126
+ }
2127
+ }
2128
+
2129
+ TEST(Reader, TrailingCommaHandlerTermination) {
2130
+ TestTrailingCommaHandlerTermination<kParseNoFlags>();
2131
+ }
2132
+
2133
+ TEST(Reader, TrailingCommaHandlerTerminationIterative) {
2134
+ TestTrailingCommaHandlerTermination<kParseIterativeFlag>();
2135
+ }
2136
+
2137
+ TEST(Reader, ParseNanAndInfinity) {
2138
+ #define TEST_NAN_INF(str, x) \
2139
+ { \
2140
+ { \
2141
+ StringStream s(str); \
2142
+ ParseDoubleHandler h; \
2143
+ Reader reader; \
2144
+ ASSERT_EQ(kParseErrorNone, reader.Parse<kParseNanAndInfFlag>(s, h).Code()); \
2145
+ EXPECT_EQ(1u, h.step_); \
2146
+ internal::Double e(x), a(h.actual_); \
2147
+ EXPECT_EQ(e.IsNan(), a.IsNan()); \
2148
+ EXPECT_EQ(e.IsInf(), a.IsInf()); \
2149
+ if (!e.IsNan()) \
2150
+ EXPECT_EQ(e.Sign(), a.Sign()); \
2151
+ } \
2152
+ { \
2153
+ const char* json = "{ \"naninfdouble\": " str " } "; \
2154
+ StringStream s(json); \
2155
+ NumbersAsStringsHandler h(str); \
2156
+ Reader reader; \
2157
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \
2158
+ } \
2159
+ { \
2160
+ char* json = StrDup("{ \"naninfdouble\": " str " } "); \
2161
+ InsituStringStream s(json); \
2162
+ NumbersAsStringsHandler h(str); \
2163
+ Reader reader; \
2164
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \
2165
+ free(json); \
2166
+ } \
2167
+ }
2168
+ #define TEST_NAN_INF_ERROR(errorCode, str, errorOffset) \
2169
+ { \
2170
+ unsigned streamPos = errorOffset; \
2171
+ char buffer[1001]; \
2172
+ strncpy(buffer, str, 1000); \
2173
+ InsituStringStream s(buffer); \
2174
+ BaseReaderHandler<> h; \
2175
+ Reader reader; \
2176
+ EXPECT_FALSE(reader.Parse<kParseNanAndInfFlag>(s, h)); \
2177
+ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
2178
+ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
2179
+ EXPECT_EQ(streamPos, s.Tell());\
2180
+ }
2181
+
2182
+ double nan = std::numeric_limits<double>::quiet_NaN();
2183
+ double inf = std::numeric_limits<double>::infinity();
2184
+
2185
+ TEST_NAN_INF("NaN", nan);
2186
+ TEST_NAN_INF("-NaN", nan);
2187
+ TEST_NAN_INF("Inf", inf);
2188
+ TEST_NAN_INF("Infinity", inf);
2189
+ TEST_NAN_INF("-Inf", -inf);
2190
+ TEST_NAN_INF("-Infinity", -inf);
2191
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NInf", 1u);
2192
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NaInf", 2u);
2193
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "INan", 1u);
2194
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "InNan", 2u);
2195
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "nan", 1u);
2196
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-nan", 1u);
2197
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NAN", 1u);
2198
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-Infinty", 6u);
2199
+
2200
+ #undef TEST_NAN_INF_ERROR
2201
+ #undef TEST_NAN_INF
2202
+ }
2203
+
2204
+ TEST(Reader, EscapedApostrophe) {
2205
+ const char json[] = " { \"foo\": \"bar\\'buzz\" } ";
2206
+
2207
+ BaseReaderHandler<> h;
2208
+
2209
+ {
2210
+ StringStream s(json);
2211
+ Reader reader;
2212
+ ParseResult r = reader.Parse<kParseNoFlags>(s, h);
2213
+ EXPECT_TRUE(reader.HasParseError());
2214
+ EXPECT_EQ(kParseErrorStringEscapeInvalid, r.Code());
2215
+ EXPECT_EQ(14u, r.Offset());
2216
+ }
2217
+
2218
+ {
2219
+ StringStream s(json);
2220
+ Reader reader;
2221
+ ParseResult r = reader.Parse<kParseEscapedApostropheFlag>(s, h);
2222
+ EXPECT_FALSE(reader.HasParseError());
2223
+ EXPECT_EQ(kParseErrorNone, r.Code());
2224
+ EXPECT_EQ(0u, r.Offset());
2225
+ }
2226
+ }
2227
+
2228
+ RAPIDJSON_DIAG_POP