rj_schema 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (614) 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 +226 -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 +54 -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/booleans.json +102 -0
  130. data/ext/rj_schema/rapidjson/bin/types/floats.json +102 -0
  131. data/ext/rj_schema/rapidjson/bin/types/guids.json +102 -0
  132. data/ext/rj_schema/rapidjson/bin/types/integers.json +102 -0
  133. data/ext/rj_schema/rapidjson/bin/types/mixed.json +592 -0
  134. data/ext/rj_schema/rapidjson/bin/types/nulls.json +102 -0
  135. data/ext/rj_schema/rapidjson/bin/types/paragraphs.json +102 -0
  136. data/ext/rj_schema/rapidjson/bin/types/readme.txt +1 -0
  137. data/ext/rj_schema/rapidjson/contrib/natvis/LICENSE +45 -0
  138. data/ext/rj_schema/rapidjson/contrib/natvis/README.md +7 -0
  139. data/ext/rj_schema/rapidjson/contrib/natvis/rapidjson.natvis +38 -0
  140. data/ext/rj_schema/rapidjson/doc/CMakeLists.txt +27 -0
  141. data/ext/rj_schema/rapidjson/doc/Doxyfile.in +2369 -0
  142. data/ext/rj_schema/rapidjson/doc/Doxyfile.zh-cn.in +2369 -0
  143. data/ext/rj_schema/rapidjson/doc/diagram/architecture.dot +50 -0
  144. data/ext/rj_schema/rapidjson/doc/diagram/architecture.png +0 -0
  145. data/ext/rj_schema/rapidjson/doc/diagram/insituparsing.dot +65 -0
  146. data/ext/rj_schema/rapidjson/doc/diagram/insituparsing.png +0 -0
  147. data/ext/rj_schema/rapidjson/doc/diagram/iterative-parser-states-diagram.dot +62 -0
  148. data/ext/rj_schema/rapidjson/doc/diagram/iterative-parser-states-diagram.png +0 -0
  149. data/ext/rj_schema/rapidjson/doc/diagram/makefile +8 -0
  150. data/ext/rj_schema/rapidjson/doc/diagram/move1.dot +47 -0
  151. data/ext/rj_schema/rapidjson/doc/diagram/move1.png +0 -0
  152. data/ext/rj_schema/rapidjson/doc/diagram/move2.dot +62 -0
  153. data/ext/rj_schema/rapidjson/doc/diagram/move2.png +0 -0
  154. data/ext/rj_schema/rapidjson/doc/diagram/move3.dot +60 -0
  155. data/ext/rj_schema/rapidjson/doc/diagram/move3.png +0 -0
  156. data/ext/rj_schema/rapidjson/doc/diagram/normalparsing.dot +56 -0
  157. data/ext/rj_schema/rapidjson/doc/diagram/normalparsing.png +0 -0
  158. data/ext/rj_schema/rapidjson/doc/diagram/simpledom.dot +54 -0
  159. data/ext/rj_schema/rapidjson/doc/diagram/simpledom.png +0 -0
  160. data/ext/rj_schema/rapidjson/doc/diagram/tutorial.dot +58 -0
  161. data/ext/rj_schema/rapidjson/doc/diagram/tutorial.png +0 -0
  162. data/ext/rj_schema/rapidjson/doc/diagram/utilityclass.dot +73 -0
  163. data/ext/rj_schema/rapidjson/doc/diagram/utilityclass.png +0 -0
  164. data/ext/rj_schema/rapidjson/doc/dom.md +281 -0
  165. data/ext/rj_schema/rapidjson/doc/dom.zh-cn.md +285 -0
  166. data/ext/rj_schema/rapidjson/doc/encoding.md +146 -0
  167. data/ext/rj_schema/rapidjson/doc/encoding.zh-cn.md +152 -0
  168. data/ext/rj_schema/rapidjson/doc/faq.md +289 -0
  169. data/ext/rj_schema/rapidjson/doc/faq.zh-cn.md +290 -0
  170. data/ext/rj_schema/rapidjson/doc/features.md +104 -0
  171. data/ext/rj_schema/rapidjson/doc/features.zh-cn.md +103 -0
  172. data/ext/rj_schema/rapidjson/doc/internals.md +368 -0
  173. data/ext/rj_schema/rapidjson/doc/internals.zh-cn.md +363 -0
  174. data/ext/rj_schema/rapidjson/doc/logo/rapidjson.png +0 -0
  175. data/ext/rj_schema/rapidjson/doc/logo/rapidjson.svg +119 -0
  176. data/ext/rj_schema/rapidjson/doc/misc/DoxygenLayout.xml +194 -0
  177. data/ext/rj_schema/rapidjson/doc/misc/doxygenextra.css +274 -0
  178. data/ext/rj_schema/rapidjson/doc/misc/footer.html +11 -0
  179. data/ext/rj_schema/rapidjson/doc/misc/header.html +24 -0
  180. data/ext/rj_schema/rapidjson/doc/npm.md +31 -0
  181. data/ext/rj_schema/rapidjson/doc/performance.md +26 -0
  182. data/ext/rj_schema/rapidjson/doc/performance.zh-cn.md +26 -0
  183. data/ext/rj_schema/rapidjson/doc/pointer.md +234 -0
  184. data/ext/rj_schema/rapidjson/doc/pointer.zh-cn.md +234 -0
  185. data/ext/rj_schema/rapidjson/doc/sax.md +509 -0
  186. data/ext/rj_schema/rapidjson/doc/sax.zh-cn.md +487 -0
  187. data/ext/rj_schema/rapidjson/doc/schema.md +505 -0
  188. data/ext/rj_schema/rapidjson/doc/schema.zh-cn.md +237 -0
  189. data/ext/rj_schema/rapidjson/doc/stream.md +429 -0
  190. data/ext/rj_schema/rapidjson/doc/stream.zh-cn.md +429 -0
  191. data/ext/rj_schema/rapidjson/doc/tutorial.md +536 -0
  192. data/ext/rj_schema/rapidjson/doc/tutorial.zh-cn.md +535 -0
  193. data/ext/rj_schema/rapidjson/docker/debian/Dockerfile +8 -0
  194. data/ext/rj_schema/rapidjson/example/CMakeLists.txt +46 -0
  195. data/ext/rj_schema/rapidjson/example/archiver/archiver.cpp +292 -0
  196. data/ext/rj_schema/rapidjson/example/archiver/archiver.h +145 -0
  197. data/ext/rj_schema/rapidjson/example/archiver/archivertest.cpp +287 -0
  198. data/ext/rj_schema/rapidjson/example/capitalize/capitalize.cpp +67 -0
  199. data/ext/rj_schema/rapidjson/example/condense/condense.cpp +32 -0
  200. data/ext/rj_schema/rapidjson/example/filterkey/filterkey.cpp +135 -0
  201. data/ext/rj_schema/rapidjson/example/filterkeydom/filterkeydom.cpp +170 -0
  202. data/ext/rj_schema/rapidjson/example/jsonx/jsonx.cpp +207 -0
  203. data/ext/rj_schema/rapidjson/example/lookaheadparser/lookaheadparser.cpp +350 -0
  204. data/ext/rj_schema/rapidjson/example/messagereader/messagereader.cpp +105 -0
  205. data/ext/rj_schema/rapidjson/example/parsebyparts/parsebyparts.cpp +176 -0
  206. data/ext/rj_schema/rapidjson/example/pretty/pretty.cpp +30 -0
  207. data/ext/rj_schema/rapidjson/example/prettyauto/prettyauto.cpp +56 -0
  208. data/ext/rj_schema/rapidjson/example/schemavalidator/schemavalidator.cpp +78 -0
  209. data/ext/rj_schema/rapidjson/example/serialize/serialize.cpp +173 -0
  210. data/ext/rj_schema/rapidjson/example/simpledom/simpledom.cpp +29 -0
  211. data/ext/rj_schema/rapidjson/example/simplepullreader/simplepullreader.cpp +53 -0
  212. data/ext/rj_schema/rapidjson/example/simplereader/simplereader.cpp +42 -0
  213. data/ext/rj_schema/rapidjson/example/simplewriter/simplewriter.cpp +36 -0
  214. data/ext/rj_schema/rapidjson/example/sortkeys/sortkeys.cpp +62 -0
  215. data/ext/rj_schema/rapidjson/example/tutorial/tutorial.cpp +151 -0
  216. data/ext/rj_schema/rapidjson/include/rapidjson/allocators.h +284 -0
  217. data/ext/rj_schema/rapidjson/include/rapidjson/cursorstreamwrapper.h +78 -0
  218. data/ext/rj_schema/rapidjson/include/rapidjson/document.h +2732 -0
  219. data/ext/rj_schema/rapidjson/include/rapidjson/encodedstream.h +299 -0
  220. data/ext/rj_schema/rapidjson/include/rapidjson/encodings.h +716 -0
  221. data/ext/rj_schema/rapidjson/include/rapidjson/error/en.h +74 -0
  222. data/ext/rj_schema/rapidjson/include/rapidjson/error/error.h +161 -0
  223. data/ext/rj_schema/rapidjson/include/rapidjson/filereadstream.h +99 -0
  224. data/ext/rj_schema/rapidjson/include/rapidjson/filewritestream.h +104 -0
  225. data/ext/rj_schema/rapidjson/include/rapidjson/fwd.h +151 -0
  226. data/ext/rj_schema/rapidjson/include/rapidjson/internal/biginteger.h +290 -0
  227. data/ext/rj_schema/rapidjson/include/rapidjson/internal/clzll.h +71 -0
  228. data/ext/rj_schema/rapidjson/include/rapidjson/internal/diyfp.h +257 -0
  229. data/ext/rj_schema/rapidjson/include/rapidjson/internal/dtoa.h +245 -0
  230. data/ext/rj_schema/rapidjson/include/rapidjson/internal/ieee754.h +78 -0
  231. data/ext/rj_schema/rapidjson/include/rapidjson/internal/itoa.h +308 -0
  232. data/ext/rj_schema/rapidjson/include/rapidjson/internal/meta.h +186 -0
  233. data/ext/rj_schema/rapidjson/include/rapidjson/internal/pow10.h +55 -0
  234. data/ext/rj_schema/rapidjson/include/rapidjson/internal/regex.h +739 -0
  235. data/ext/rj_schema/rapidjson/include/rapidjson/internal/stack.h +232 -0
  236. data/ext/rj_schema/rapidjson/include/rapidjson/internal/strfunc.h +69 -0
  237. data/ext/rj_schema/rapidjson/include/rapidjson/internal/strtod.h +290 -0
  238. data/ext/rj_schema/rapidjson/include/rapidjson/internal/swap.h +46 -0
  239. data/ext/rj_schema/rapidjson/include/rapidjson/istreamwrapper.h +128 -0
  240. data/ext/rj_schema/rapidjson/include/rapidjson/memorybuffer.h +70 -0
  241. data/ext/rj_schema/rapidjson/include/rapidjson/memorystream.h +71 -0
  242. data/ext/rj_schema/rapidjson/include/rapidjson/msinttypes/inttypes.h +316 -0
  243. data/ext/rj_schema/rapidjson/include/rapidjson/msinttypes/stdint.h +300 -0
  244. data/ext/rj_schema/rapidjson/include/rapidjson/ostreamwrapper.h +81 -0
  245. data/ext/rj_schema/rapidjson/include/rapidjson/pointer.h +1415 -0
  246. data/ext/rj_schema/rapidjson/include/rapidjson/prettywriter.h +277 -0
  247. data/ext/rj_schema/rapidjson/include/rapidjson/rapidjson.h +676 -0
  248. data/ext/rj_schema/rapidjson/include/rapidjson/reader.h +2236 -0
  249. data/ext/rj_schema/rapidjson/include/rapidjson/schema.h +2496 -0
  250. data/ext/rj_schema/rapidjson/include/rapidjson/stream.h +223 -0
  251. data/ext/rj_schema/rapidjson/include/rapidjson/stringbuffer.h +121 -0
  252. data/ext/rj_schema/rapidjson/include/rapidjson/writer.h +710 -0
  253. data/ext/rj_schema/rapidjson/include_dirs.js +2 -0
  254. data/ext/rj_schema/rapidjson/library.json +15 -0
  255. data/ext/rj_schema/rapidjson/license.txt +57 -0
  256. data/ext/rj_schema/rapidjson/package.json +24 -0
  257. data/ext/rj_schema/rapidjson/rapidjson.autopkg +77 -0
  258. data/ext/rj_schema/rapidjson/readme.md +210 -0
  259. data/ext/rj_schema/rapidjson/readme.zh-cn.md +152 -0
  260. data/ext/rj_schema/rapidjson/test/CMakeLists.txt +20 -0
  261. data/ext/rj_schema/rapidjson/test/perftest/CMakeLists.txt +28 -0
  262. data/ext/rj_schema/rapidjson/test/perftest/misctest.cpp +974 -0
  263. data/ext/rj_schema/rapidjson/test/perftest/perftest.cpp +24 -0
  264. data/ext/rj_schema/rapidjson/test/perftest/perftest.h +185 -0
  265. data/ext/rj_schema/rapidjson/test/perftest/platformtest.cpp +166 -0
  266. data/ext/rj_schema/rapidjson/test/perftest/rapidjsontest.cpp +546 -0
  267. data/ext/rj_schema/rapidjson/test/perftest/schematest.cpp +223 -0
  268. data/ext/rj_schema/rapidjson/test/unittest/CMakeLists.txt +92 -0
  269. data/ext/rj_schema/rapidjson/test/unittest/allocatorstest.cpp +100 -0
  270. data/ext/rj_schema/rapidjson/test/unittest/bigintegertest.cpp +138 -0
  271. data/ext/rj_schema/rapidjson/test/unittest/cursorstreamwrappertest.cpp +115 -0
  272. data/ext/rj_schema/rapidjson/test/unittest/documenttest.cpp +672 -0
  273. data/ext/rj_schema/rapidjson/test/unittest/dtoatest.cpp +98 -0
  274. data/ext/rj_schema/rapidjson/test/unittest/encodedstreamtest.cpp +313 -0
  275. data/ext/rj_schema/rapidjson/test/unittest/encodingstest.cpp +451 -0
  276. data/ext/rj_schema/rapidjson/test/unittest/filestreamtest.cpp +155 -0
  277. data/ext/rj_schema/rapidjson/test/unittest/fwdtest.cpp +230 -0
  278. data/ext/rj_schema/rapidjson/test/unittest/istreamwrappertest.cpp +181 -0
  279. data/ext/rj_schema/rapidjson/test/unittest/itoatest.cpp +160 -0
  280. data/ext/rj_schema/rapidjson/test/unittest/jsoncheckertest.cpp +143 -0
  281. data/ext/rj_schema/rapidjson/test/unittest/namespacetest.cpp +70 -0
  282. data/ext/rj_schema/rapidjson/test/unittest/ostreamwrappertest.cpp +92 -0
  283. data/ext/rj_schema/rapidjson/test/unittest/pointertest.cpp +1638 -0
  284. data/ext/rj_schema/rapidjson/test/unittest/prettywritertest.cpp +373 -0
  285. data/ext/rj_schema/rapidjson/test/unittest/readertest.cpp +2225 -0
  286. data/ext/rj_schema/rapidjson/test/unittest/regextest.cpp +639 -0
  287. data/ext/rj_schema/rapidjson/test/unittest/schematest.cpp +2072 -0
  288. data/ext/rj_schema/rapidjson/test/unittest/simdtest.cpp +219 -0
  289. data/ext/rj_schema/rapidjson/test/unittest/strfunctest.cpp +30 -0
  290. data/ext/rj_schema/rapidjson/test/unittest/stringbuffertest.cpp +192 -0
  291. data/ext/rj_schema/rapidjson/test/unittest/strtodtest.cpp +132 -0
  292. data/ext/rj_schema/rapidjson/test/unittest/unittest.cpp +51 -0
  293. data/ext/rj_schema/rapidjson/test/unittest/unittest.h +143 -0
  294. data/ext/rj_schema/rapidjson/test/unittest/valuetest.cpp +1851 -0
  295. data/ext/rj_schema/rapidjson/test/unittest/writertest.cpp +598 -0
  296. data/ext/rj_schema/rapidjson/test/valgrind.supp +17 -0
  297. data/ext/rj_schema/rapidjson/thirdparty/gtest/BUILD.bazel +175 -0
  298. data/ext/rj_schema/rapidjson/thirdparty/gtest/CMakeLists.txt +33 -0
  299. data/ext/rj_schema/rapidjson/thirdparty/gtest/CONTRIBUTING.md +160 -0
  300. data/ext/rj_schema/rapidjson/thirdparty/gtest/LICENSE +28 -0
  301. data/ext/rj_schema/rapidjson/thirdparty/gtest/Makefile.am +14 -0
  302. data/ext/rj_schema/rapidjson/thirdparty/gtest/README.md +122 -0
  303. data/ext/rj_schema/rapidjson/thirdparty/gtest/WORKSPACE +8 -0
  304. data/ext/rj_schema/rapidjson/thirdparty/gtest/appveyor.yml +104 -0
  305. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/build-linux-autotools.sh +44 -0
  306. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/build-linux-bazel.sh +36 -0
  307. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/env-linux.sh +41 -0
  308. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/env-osx.sh +40 -0
  309. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/get-nprocessors.sh +48 -0
  310. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/install-linux.sh +49 -0
  311. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/install-osx.sh +39 -0
  312. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/log-config.sh +51 -0
  313. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/travis.sh +44 -0
  314. data/ext/rj_schema/rapidjson/thirdparty/gtest/configure.ac +16 -0
  315. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CHANGES +126 -0
  316. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CMakeLists.txt +242 -0
  317. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CONTRIBUTORS +40 -0
  318. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/LICENSE +28 -0
  319. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/Makefile.am +224 -0
  320. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/README.md +344 -0
  321. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/cmake/gmock.pc.in +9 -0
  322. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/cmake/gmock_main.pc.in +9 -0
  323. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/configure.ac +146 -0
  324. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/CheatSheet.md +564 -0
  325. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/CookBook.md +3660 -0
  326. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/DesignDoc.md +280 -0
  327. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/Documentation.md +15 -0
  328. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/ForDummies.md +447 -0
  329. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/FrequentlyAskedQuestions.md +627 -0
  330. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/KnownIssues.md +19 -0
  331. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-actions.h +1262 -0
  332. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-cardinalities.h +147 -0
  333. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-actions.h +2571 -0
  334. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-actions.h.pump +833 -0
  335. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h +1379 -0
  336. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump +347 -0
  337. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-matchers.h +2258 -0
  338. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-matchers.h.pump +675 -0
  339. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-nice-strict.h +458 -0
  340. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-nice-strict.h.pump +178 -0
  341. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-matchers.h +5255 -0
  342. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-more-actions.h +246 -0
  343. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-more-matchers.h +91 -0
  344. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-spec-builders.h +1918 -0
  345. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock.h +95 -0
  346. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h +8 -0
  347. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump +10 -0
  348. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-matchers.h +38 -0
  349. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-port.h +46 -0
  350. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h +286 -0
  351. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump +136 -0
  352. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-internal-utils.h +574 -0
  353. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-port.h +87 -0
  354. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/make/Makefile +101 -0
  355. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock.sln +32 -0
  356. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock.vcproj +191 -0
  357. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_config.vsprops +15 -0
  358. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_main.vcproj +187 -0
  359. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_test.vcproj +201 -0
  360. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock.sln +46 -0
  361. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock.vcxproj +145 -0
  362. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_config.props +19 -0
  363. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_main.vcxproj +151 -0
  364. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_test.vcxproj +176 -0
  365. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock.sln +46 -0
  366. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock.vcxproj +145 -0
  367. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_config.props +19 -0
  368. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_main.vcxproj +151 -0
  369. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_test.vcxproj +176 -0
  370. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/fuse_gmock_files.py +240 -0
  371. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/LICENSE +203 -0
  372. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/README +34 -0
  373. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/README.cppclean +115 -0
  374. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/__init__.py +0 -0
  375. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/ast.py +1733 -0
  376. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/gmock_class.py +227 -0
  377. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/gmock_class_test.py +448 -0
  378. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/keywords.py +59 -0
  379. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/tokenize.py +287 -0
  380. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/utils.py +41 -0
  381. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/gmock_gen.py +31 -0
  382. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/gmock-config.in +303 -0
  383. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/gmock_doctor.py +640 -0
  384. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/upload.py +1387 -0
  385. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/upload_gmock.py +78 -0
  386. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-all.cc +47 -0
  387. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-cardinalities.cc +156 -0
  388. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-internal-utils.cc +204 -0
  389. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-matchers.cc +573 -0
  390. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-spec-builders.cc +883 -0
  391. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock.cc +205 -0
  392. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock_main.cc +54 -0
  393. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/BUILD.bazel +123 -0
  394. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-actions_test.cc +1575 -0
  395. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-cardinalities_test.cc +428 -0
  396. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-actions_test.cc +1230 -0
  397. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-function-mockers_test.cc +647 -0
  398. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-internal-utils_test.cc +129 -0
  399. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-matchers_test.cc +1341 -0
  400. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-internal-utils_test.cc +718 -0
  401. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-matchers_test.cc +6767 -0
  402. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-more-actions_test.cc +710 -0
  403. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-nice-strict_test.cc +511 -0
  404. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-port_test.cc +43 -0
  405. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-spec-builders_test.cc +2771 -0
  406. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_all_test.cc +51 -0
  407. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_ex_test.cc +81 -0
  408. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_leak_test.py +108 -0
  409. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_leak_test_.cc +100 -0
  410. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link2_test.cc +40 -0
  411. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link_test.cc +40 -0
  412. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link_test.h +691 -0
  413. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test.py +183 -0
  414. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test_.cc +310 -0
  415. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test_golden.txt +317 -0
  416. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_stress_test.cc +323 -0
  417. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_test.cc +262 -0
  418. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_test_utils.py +110 -0
  419. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CHANGES +157 -0
  420. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CMakeLists.txt +312 -0
  421. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CONTRIBUTORS +37 -0
  422. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/LICENSE +28 -0
  423. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/Makefile.am +339 -0
  424. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/README.md +341 -0
  425. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/cmake/gtest.pc.in +9 -0
  426. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/cmake/gtest_main.pc.in +10 -0
  427. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/cmake/internal_utils.cmake +280 -0
  428. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest.cbproj +138 -0
  429. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest.groupproj +54 -0
  430. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_all.cc +38 -0
  431. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_link.cc +40 -0
  432. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_main.cbproj +82 -0
  433. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_unittest.cbproj +88 -0
  434. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/configure.ac +68 -0
  435. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/Pkgconfig.md +146 -0
  436. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/PumpManual.md +177 -0
  437. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/XcodeGuide.md +93 -0
  438. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/advanced.md +2416 -0
  439. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/faq.md +1092 -0
  440. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/primer.md +536 -0
  441. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/samples.md +14 -0
  442. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-death-test.h +342 -0
  443. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-message.h +249 -0
  444. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-param-test.h +1438 -0
  445. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-param-test.h.pump +501 -0
  446. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-printers.h +1082 -0
  447. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-spi.h +231 -0
  448. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-test-part.h +179 -0
  449. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-typed-test.h +264 -0
  450. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest.h +2332 -0
  451. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest_pred_impl.h +357 -0
  452. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest_prod.h +61 -0
  453. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest-port.h +70 -0
  454. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
  455. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest.h +45 -0
  456. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-death-test-internal.h +275 -0
  457. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-filepath.h +205 -0
  458. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-internal.h +1277 -0
  459. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-linked_ptr.h +243 -0
  460. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util-generated.h +5139 -0
  461. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +279 -0
  462. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util.h +723 -0
  463. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-port-arch.h +100 -0
  464. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-port.h +2687 -0
  465. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-string.h +167 -0
  466. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-tuple.h +1020 -0
  467. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-tuple.h.pump +347 -0
  468. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-type-util.h +3347 -0
  469. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-type-util.h.pump +313 -0
  470. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/m4/acx_pthread.m4 +363 -0
  471. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/m4/gtest.m4 +74 -0
  472. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/make/Makefile +82 -0
  473. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest-md.sln +55 -0
  474. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest-md.vcxproj +149 -0
  475. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest-md.vcxproj.filters +18 -0
  476. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest.sln +55 -0
  477. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest.vcxproj +149 -0
  478. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest.vcxproj.filters +18 -0
  479. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main-md.vcxproj +154 -0
  480. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main-md.vcxproj.filters +18 -0
  481. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main.vcxproj +162 -0
  482. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main.vcxproj.filters +18 -0
  483. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test-md.vcxproj +199 -0
  484. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test-md.vcxproj.filters +26 -0
  485. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test.vcxproj +191 -0
  486. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test.vcxproj.filters +26 -0
  487. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest-md.vcxproj +188 -0
  488. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest-md.vcxproj.filters +18 -0
  489. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest.vcxproj +180 -0
  490. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest.vcxproj.filters +18 -0
  491. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/prime_tables.h +127 -0
  492. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1.cc +68 -0
  493. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1.h +43 -0
  494. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample10_unittest.cc +140 -0
  495. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1_unittest.cc +154 -0
  496. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2.cc +56 -0
  497. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2.h +85 -0
  498. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2_unittest.cc +110 -0
  499. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample3-inl.h +172 -0
  500. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample3_unittest.cc +152 -0
  501. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4.cc +46 -0
  502. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4.h +53 -0
  503. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4_unittest.cc +49 -0
  504. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample5_unittest.cc +199 -0
  505. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample6_unittest.cc +225 -0
  506. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample7_unittest.cc +118 -0
  507. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample8_unittest.cc +174 -0
  508. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample9_unittest.cc +157 -0
  509. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/common.py +83 -0
  510. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/fuse_gtest_files.py +253 -0
  511. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/gen_gtest_pred_impl.py +730 -0
  512. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/gtest-config.in +274 -0
  513. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/pump.py +855 -0
  514. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/release_docs.py +158 -0
  515. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/test/Makefile +59 -0
  516. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/upload.py +1387 -0
  517. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/upload_gtest.py +78 -0
  518. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-all.cc +48 -0
  519. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-death-test.cc +1536 -0
  520. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-filepath.cc +385 -0
  521. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-internal-inl.h +1175 -0
  522. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-port.cc +1277 -0
  523. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-printers.cc +458 -0
  524. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-test-part.cc +102 -0
  525. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-typed-test.cc +119 -0
  526. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest.cc +5846 -0
  527. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest_main.cc +38 -0
  528. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/BUILD.bazel +396 -0
  529. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-death-test_ex_test.cc +93 -0
  530. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-death-test_test.cc +1424 -0
  531. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-filepath_test.cc +652 -0
  532. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-linked_ptr_test.cc +154 -0
  533. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-listener_test.cc +311 -0
  534. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-message_test.cc +159 -0
  535. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-options_test.cc +213 -0
  536. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test2_test.cc +61 -0
  537. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test_test.cc +1110 -0
  538. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test_test.h +53 -0
  539. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-port_test.cc +1303 -0
  540. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-printers_test.cc +1737 -0
  541. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-test-part_test.cc +208 -0
  542. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-tuple_test.cc +320 -0
  543. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test2_test.cc +45 -0
  544. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test_test.cc +380 -0
  545. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test_test.h +66 -0
  546. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-unittest-api_test.cc +341 -0
  547. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_all_test.cc +47 -0
  548. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_assert_by_exception_test.cc +119 -0
  549. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_break_on_failure_unittest.py +210 -0
  550. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_break_on_failure_unittest_.cc +87 -0
  551. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_catch_exceptions_test.py +235 -0
  552. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_catch_exceptions_test_.cc +311 -0
  553. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_color_test.py +129 -0
  554. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_color_test_.cc +63 -0
  555. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_env_var_test.py +119 -0
  556. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_env_var_test_.cc +124 -0
  557. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_environment_test.cc +189 -0
  558. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_filter_unittest.py +638 -0
  559. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_filter_unittest_.cc +138 -0
  560. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_help_test.py +172 -0
  561. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_help_test_.cc +46 -0
  562. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_json_outfiles_test.py +162 -0
  563. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_json_output_unittest.py +611 -0
  564. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_json_test_utils.py +60 -0
  565. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_list_tests_unittest.py +207 -0
  566. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_list_tests_unittest_.cc +157 -0
  567. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_main_unittest.cc +45 -0
  568. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_no_test_unittest.cc +56 -0
  569. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test.py +344 -0
  570. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test_.cc +1067 -0
  571. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test_golden_lin.txt +781 -0
  572. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_pred_impl_unittest.cc +2427 -0
  573. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_premature_exit_test.cc +127 -0
  574. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_prod_test.cc +57 -0
  575. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_repeat_test.cc +236 -0
  576. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_shuffle_test.py +325 -0
  577. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_shuffle_test_.cc +103 -0
  578. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_sole_header_test.cc +57 -0
  579. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_stress_test.cc +250 -0
  580. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_test_utils.py +318 -0
  581. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_testbridge_test.py +65 -0
  582. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_testbridge_test_.cc +44 -0
  583. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_ex_test.cc +92 -0
  584. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_test.py +171 -0
  585. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_test_.cc +72 -0
  586. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_uninitialized_test.py +69 -0
  587. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_uninitialized_test_.cc +43 -0
  588. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_unittest.cc +7797 -0
  589. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfile1_test_.cc +48 -0
  590. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfile2_test_.cc +48 -0
  591. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfiles_test.py +140 -0
  592. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_output_unittest.py +378 -0
  593. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_output_unittest_.cc +179 -0
  594. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_test_utils.py +196 -0
  595. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/production.cc +36 -0
  596. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/production.h +55 -0
  597. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/DebugProject.xcconfig +30 -0
  598. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/FrameworkTarget.xcconfig +17 -0
  599. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/General.xcconfig +41 -0
  600. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/ReleaseProject.xcconfig +32 -0
  601. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/StaticLibraryTarget.xcconfig +18 -0
  602. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/TestTarget.xcconfig +8 -0
  603. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Resources/Info.plist +30 -0
  604. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/Info.plist +28 -0
  605. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj +457 -0
  606. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/runtests.sh +62 -0
  607. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget.cc +63 -0
  608. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget.h +59 -0
  609. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget_test.cc +68 -0
  610. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Scripts/runtests.sh +65 -0
  611. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Scripts/versiongenerate.py +100 -0
  612. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/gtest.xcodeproj/project.pbxproj +1182 -0
  613. data/ext/rj_schema/rapidjson/travis-doxygen.sh +128 -0
  614. metadata +613 -1
@@ -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. All rights reserved.
4
+ //
5
+ // Licensed under the MIT License (the "License"); you may not use this file except
6
+ // in compliance with the License. You may obtain a copy of the License at
7
+ //
8
+ // http://opensource.org/licenses/MIT
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software distributed
11
+ // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
+ // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
+ // specific language governing permissions and limitations under the License.
14
+
15
+ #include "unittest.h"
16
+ #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,2225 @@
1
+ // Tencent is pleased to support the open source community by making RapidJSON available.
2
+ //
3
+ // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4
+ //
5
+ // Licensed under the MIT License (the "License"); you may not use this file except
6
+ // in compliance with the License. You may obtain a copy of the License at
7
+ //
8
+ // http://opensource.org/licenses/MIT
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software distributed
11
+ // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
+ // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
+ // specific language governing permissions and limitations under the License.
14
+
15
+ #include "unittest.h"
16
+
17
+ #include "rapidjson/reader.h"
18
+ #include "rapidjson/internal/dtoa.h"
19
+ #include "rapidjson/internal/itoa.h"
20
+ #include "rapidjson/memorystream.h"
21
+
22
+ #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
+ // Missing a closing quotation mark in string.
948
+ TEST_STRING_ERROR(kParseErrorStringMissQuotationMark, "[\"Test]", 7u, 7u);
949
+
950
+ // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
951
+
952
+ // 3 Malformed sequences
953
+
954
+ // 3.1 Unexpected continuation bytes
955
+ {
956
+ char e[] = { '[', '\"', 0, '\"', ']', '\0' };
957
+ for (unsigned char c = 0x80u; c <= 0xBFu; c++) {
958
+ e[2] = static_cast<char>(c);
959
+ ParseErrorCode error = TestString<UTF8<> >(e);
960
+ EXPECT_EQ(kParseErrorStringInvalidEncoding, error);
961
+ if (error != kParseErrorStringInvalidEncoding)
962
+ std::cout << static_cast<unsigned>(c) << std::endl;
963
+ }
964
+ }
965
+
966
+ // 3.2 Lonely start characters, 3.5 Impossible bytes
967
+ {
968
+ char e[] = { '[', '\"', 0, ' ', '\"', ']', '\0' };
969
+ for (unsigned c = 0xC0u; c <= 0xFFu; c++) {
970
+ e[2] = static_cast<char>(c);
971
+ unsigned streamPos;
972
+ if (c <= 0xC1u)
973
+ streamPos = 3; // 0xC0 - 0xC1
974
+ else if (c <= 0xDFu)
975
+ streamPos = 4; // 0xC2 - 0xDF
976
+ else if (c <= 0xEFu)
977
+ streamPos = 5; // 0xE0 - 0xEF
978
+ else if (c <= 0xF4u)
979
+ streamPos = 6; // 0xF0 - 0xF4
980
+ else
981
+ streamPos = 3; // 0xF5 - 0xFF
982
+ TEST_STRING_ERROR(kParseErrorStringInvalidEncoding, e, 2u, streamPos);
983
+ }
984
+ }
985
+
986
+ // 4 Overlong sequences
987
+
988
+ // 4.1 Examples of an overlong ASCII character
989
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0xAFu, '\"', ']', '\0'));
990
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0xAFu, '\"', ']', '\0'));
991
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0xAFu, '\"', ']', '\0'));
992
+
993
+ // 4.2 Maximum overlong sequences
994
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC1u, 0xBFu, '\"', ']', '\0'));
995
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x9Fu, 0xBFu, '\"', ']', '\0'));
996
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x8Fu, 0xBFu, 0xBFu, '\"', ']', '\0'));
997
+
998
+ // 4.3 Overlong representation of the NUL character
999
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xC0u, 0x80u, '\"', ']', '\0'));
1000
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xE0u, 0x80u, 0x80u, '\"', ']', '\0'));
1001
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xF0u, 0x80u, 0x80u, 0x80u, '\"', ']', '\0'));
1002
+
1003
+ // 5 Illegal code positions
1004
+
1005
+ // 5.1 Single UTF-16 surrogates
1006
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xA0u, 0x80u, '\"', ']', '\0'));
1007
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xADu, 0xBFu, '\"', ']', '\0'));
1008
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAEu, 0x80u, '\"', ']', '\0'));
1009
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xAFu, 0xBFu, '\"', ']', '\0'));
1010
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xB0u, 0x80u, '\"', ']', '\0'));
1011
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBEu, 0x80u, '\"', ']', '\0'));
1012
+ TEST_STRINGENCODING_ERROR(UTF8<>, UTF16<>, unsigned char, ARRAY('[', '\"', 0xEDu, 0xBFu, 0xBFu, '\"', ']', '\0'));
1013
+
1014
+ // Malform UTF-16 sequences
1015
+ TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xDC00, 0xDC00, '\"', ']', '\0'));
1016
+ TEST_STRINGENCODING_ERROR(UTF16<>, UTF8<>, wchar_t, ARRAY('[', '\"', 0xD800, 0xD800, '\"', ']', '\0'));
1017
+
1018
+ // Malform UTF-32 sequence
1019
+ TEST_STRINGENCODING_ERROR(UTF32<>, UTF8<>, unsigned, ARRAY('[', '\"', 0x110000, '\"', ']', '\0'));
1020
+
1021
+ // Malform ASCII sequence
1022
+ TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x80u), '\"', ']', '\0'));
1023
+ TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x01u), '\"', ']', '\0'));
1024
+ TEST_STRINGENCODING_ERROR(ASCII<>, UTF8<>, char, ARRAY('[', '\"', char(0x1Cu), '\"', ']', '\0'));
1025
+
1026
+ #undef ARRAY
1027
+ #undef TEST_STRINGARRAY_ERROR
1028
+ }
1029
+
1030
+ template <unsigned count>
1031
+ struct ParseArrayHandler : BaseReaderHandler<UTF8<>, ParseArrayHandler<count> > {
1032
+ ParseArrayHandler() : step_(0) {}
1033
+
1034
+ bool Default() { ADD_FAILURE(); return false; }
1035
+ bool Uint(unsigned i) { EXPECT_EQ(step_, i); step_++; return true; }
1036
+ bool StartArray() { EXPECT_EQ(0u, step_); step_++; return true; }
1037
+ bool EndArray(SizeType) { step_++; return true; }
1038
+
1039
+ unsigned step_;
1040
+ };
1041
+
1042
+ TEST(Reader, ParseEmptyArray) {
1043
+ char *json = StrDup("[ ] ");
1044
+ InsituStringStream s(json);
1045
+ ParseArrayHandler<0> h;
1046
+ Reader reader;
1047
+ reader.Parse(s, h);
1048
+ EXPECT_EQ(2u, h.step_);
1049
+ free(json);
1050
+ }
1051
+
1052
+ TEST(Reader, ParseArray) {
1053
+ char *json = StrDup("[1, 2, 3, 4]");
1054
+ InsituStringStream s(json);
1055
+ ParseArrayHandler<4> h;
1056
+ Reader reader;
1057
+ reader.Parse(s, h);
1058
+ EXPECT_EQ(6u, h.step_);
1059
+ free(json);
1060
+ }
1061
+
1062
+ TEST(Reader, ParseArray_Error) {
1063
+ #define TEST_ARRAY_ERROR(errorCode, str, errorOffset) \
1064
+ { \
1065
+ unsigned streamPos = errorOffset; \
1066
+ char buffer[1001]; \
1067
+ strncpy(buffer, str, 1000); \
1068
+ InsituStringStream s(buffer); \
1069
+ BaseReaderHandler<> h; \
1070
+ GenericReader<UTF8<>, UTF8<>, CrtAllocator> reader; \
1071
+ EXPECT_FALSE(reader.Parse(s, h)); \
1072
+ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
1073
+ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
1074
+ EXPECT_EQ(streamPos, s.Tell());\
1075
+ }
1076
+
1077
+ // Missing a comma or ']' after an array element.
1078
+ TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1", 2u);
1079
+ TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1}", 2u);
1080
+ TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1 2]", 3u);
1081
+
1082
+ // Array cannot have a trailing comma (without kParseTrailingCommasFlag);
1083
+ // a value must follow a comma
1084
+ TEST_ARRAY_ERROR(kParseErrorValueInvalid, "[1,]", 3u);
1085
+
1086
+ #undef TEST_ARRAY_ERROR
1087
+ }
1088
+
1089
+ struct ParseObjectHandler : BaseReaderHandler<UTF8<>, ParseObjectHandler> {
1090
+ ParseObjectHandler() : step_(0) {}
1091
+
1092
+ bool Default() { ADD_FAILURE(); return false; }
1093
+ bool Null() { EXPECT_EQ(8u, step_); step_++; return true; }
1094
+ bool Bool(bool b) {
1095
+ switch(step_) {
1096
+ case 4: EXPECT_TRUE(b); step_++; return true;
1097
+ case 6: EXPECT_FALSE(b); step_++; return true;
1098
+ default: ADD_FAILURE(); return false;
1099
+ }
1100
+ }
1101
+ bool Int(int i) {
1102
+ switch(step_) {
1103
+ case 10: EXPECT_EQ(123, i); step_++; return true;
1104
+ case 15: EXPECT_EQ(1, i); step_++; return true;
1105
+ case 16: EXPECT_EQ(2, i); step_++; return true;
1106
+ case 17: EXPECT_EQ(3, i); step_++; return true;
1107
+ default: ADD_FAILURE(); return false;
1108
+ }
1109
+ }
1110
+ bool Uint(unsigned i) { return Int(static_cast<int>(i)); }
1111
+ bool Double(double d) { EXPECT_EQ(12u, step_); EXPECT_DOUBLE_EQ(3.1416, d); step_++; return true; }
1112
+ bool String(const char* str, size_t, bool) {
1113
+ switch(step_) {
1114
+ case 1: EXPECT_STREQ("hello", str); step_++; return true;
1115
+ case 2: EXPECT_STREQ("world", str); step_++; return true;
1116
+ case 3: EXPECT_STREQ("t", str); step_++; return true;
1117
+ case 5: EXPECT_STREQ("f", str); step_++; return true;
1118
+ case 7: EXPECT_STREQ("n", str); step_++; return true;
1119
+ case 9: EXPECT_STREQ("i", str); step_++; return true;
1120
+ case 11: EXPECT_STREQ("pi", str); step_++; return true;
1121
+ case 13: EXPECT_STREQ("a", str); step_++; return true;
1122
+ default: ADD_FAILURE(); return false;
1123
+ }
1124
+ }
1125
+ bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
1126
+ bool EndObject(SizeType memberCount) { EXPECT_EQ(19u, step_); EXPECT_EQ(7u, memberCount); step_++; return true; }
1127
+ bool StartArray() { EXPECT_EQ(14u, step_); step_++; return true; }
1128
+ bool EndArray(SizeType elementCount) { EXPECT_EQ(18u, step_); EXPECT_EQ(3u, elementCount); step_++; return true; }
1129
+
1130
+ unsigned step_;
1131
+ };
1132
+
1133
+ TEST(Reader, ParseObject) {
1134
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } ";
1135
+
1136
+ // Insitu
1137
+ {
1138
+ char* json2 = StrDup(json);
1139
+ InsituStringStream s(json2);
1140
+ ParseObjectHandler h;
1141
+ Reader reader;
1142
+ reader.Parse<kParseInsituFlag>(s, h);
1143
+ EXPECT_EQ(20u, h.step_);
1144
+ free(json2);
1145
+ }
1146
+
1147
+ // Normal
1148
+ {
1149
+ StringStream s(json);
1150
+ ParseObjectHandler h;
1151
+ Reader reader;
1152
+ reader.Parse(s, h);
1153
+ EXPECT_EQ(20u, h.step_);
1154
+ }
1155
+ }
1156
+
1157
+ struct ParseEmptyObjectHandler : BaseReaderHandler<UTF8<>, ParseEmptyObjectHandler> {
1158
+ ParseEmptyObjectHandler() : step_(0) {}
1159
+
1160
+ bool Default() { ADD_FAILURE(); return false; }
1161
+ bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
1162
+ bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; }
1163
+
1164
+ unsigned step_;
1165
+ };
1166
+
1167
+ TEST(Reader, Parse_EmptyObject) {
1168
+ StringStream s("{ } ");
1169
+ ParseEmptyObjectHandler h;
1170
+ Reader reader;
1171
+ reader.Parse(s, h);
1172
+ EXPECT_EQ(2u, h.step_);
1173
+ }
1174
+
1175
+ struct ParseMultipleRootHandler : BaseReaderHandler<UTF8<>, ParseMultipleRootHandler> {
1176
+ ParseMultipleRootHandler() : step_(0) {}
1177
+
1178
+ bool Default() { ADD_FAILURE(); return false; }
1179
+ bool StartObject() { EXPECT_EQ(0u, step_); step_++; return true; }
1180
+ bool EndObject(SizeType) { EXPECT_EQ(1u, step_); step_++; return true; }
1181
+ bool StartArray() { EXPECT_EQ(2u, step_); step_++; return true; }
1182
+ bool EndArray(SizeType) { EXPECT_EQ(3u, step_); step_++; return true; }
1183
+
1184
+ unsigned step_;
1185
+ };
1186
+
1187
+ template <unsigned parseFlags>
1188
+ void TestMultipleRoot() {
1189
+ StringStream s("{}[] a");
1190
+ ParseMultipleRootHandler h;
1191
+ Reader reader;
1192
+ EXPECT_TRUE(reader.Parse<parseFlags>(s, h));
1193
+ EXPECT_EQ(2u, h.step_);
1194
+ EXPECT_TRUE(reader.Parse<parseFlags>(s, h));
1195
+ EXPECT_EQ(4u, h.step_);
1196
+ EXPECT_EQ(' ', s.Take());
1197
+ EXPECT_EQ('a', s.Take());
1198
+ }
1199
+
1200
+ TEST(Reader, Parse_MultipleRoot) {
1201
+ TestMultipleRoot<kParseStopWhenDoneFlag>();
1202
+ }
1203
+
1204
+ TEST(Reader, ParseIterative_MultipleRoot) {
1205
+ TestMultipleRoot<kParseIterativeFlag | kParseStopWhenDoneFlag>();
1206
+ }
1207
+
1208
+ template <unsigned parseFlags>
1209
+ void TestInsituMultipleRoot() {
1210
+ char* buffer = strdup("{}[] a");
1211
+ InsituStringStream s(buffer);
1212
+ ParseMultipleRootHandler h;
1213
+ Reader reader;
1214
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag | parseFlags>(s, h));
1215
+ EXPECT_EQ(2u, h.step_);
1216
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag | parseFlags>(s, h));
1217
+ EXPECT_EQ(4u, h.step_);
1218
+ EXPECT_EQ(' ', s.Take());
1219
+ EXPECT_EQ('a', s.Take());
1220
+ free(buffer);
1221
+ }
1222
+
1223
+ TEST(Reader, ParseInsitu_MultipleRoot) {
1224
+ TestInsituMultipleRoot<kParseStopWhenDoneFlag>();
1225
+ }
1226
+
1227
+ TEST(Reader, ParseInsituIterative_MultipleRoot) {
1228
+ TestInsituMultipleRoot<kParseIterativeFlag | kParseStopWhenDoneFlag>();
1229
+ }
1230
+
1231
+ #define TEST_ERROR(errorCode, str, errorOffset) \
1232
+ { \
1233
+ unsigned streamPos = errorOffset; \
1234
+ char buffer[1001]; \
1235
+ strncpy(buffer, str, 1000); \
1236
+ InsituStringStream s(buffer); \
1237
+ BaseReaderHandler<> h; \
1238
+ Reader reader; \
1239
+ EXPECT_FALSE(reader.Parse(s, h)); \
1240
+ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
1241
+ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
1242
+ EXPECT_EQ(streamPos, s.Tell());\
1243
+ }
1244
+
1245
+ TEST(Reader, ParseDocument_Error) {
1246
+ // The document is empty.
1247
+ TEST_ERROR(kParseErrorDocumentEmpty, "", 0u);
1248
+ TEST_ERROR(kParseErrorDocumentEmpty, " ", 1u);
1249
+ TEST_ERROR(kParseErrorDocumentEmpty, " \n", 2u);
1250
+
1251
+ // The document root must not follow by other values.
1252
+ TEST_ERROR(kParseErrorDocumentRootNotSingular, "[] 0", 3u);
1253
+ TEST_ERROR(kParseErrorDocumentRootNotSingular, "{} 0", 3u);
1254
+ TEST_ERROR(kParseErrorDocumentRootNotSingular, "null []", 5u);
1255
+ TEST_ERROR(kParseErrorDocumentRootNotSingular, "0 {}", 2u);
1256
+ }
1257
+
1258
+ TEST(Reader, ParseValue_Error) {
1259
+ // Invalid value.
1260
+ TEST_ERROR(kParseErrorValueInvalid, "nulL", 3u);
1261
+ TEST_ERROR(kParseErrorValueInvalid, "truE", 3u);
1262
+ TEST_ERROR(kParseErrorValueInvalid, "falsE", 4u);
1263
+ TEST_ERROR(kParseErrorValueInvalid, "a]", 0u);
1264
+ TEST_ERROR(kParseErrorValueInvalid, ".1", 0u);
1265
+ }
1266
+
1267
+ TEST(Reader, ParseObject_Error) {
1268
+ // Missing a name for object member.
1269
+ TEST_ERROR(kParseErrorObjectMissName, "{1}", 1u);
1270
+ TEST_ERROR(kParseErrorObjectMissName, "{:1}", 1u);
1271
+ TEST_ERROR(kParseErrorObjectMissName, "{null:1}", 1u);
1272
+ TEST_ERROR(kParseErrorObjectMissName, "{true:1}", 1u);
1273
+ TEST_ERROR(kParseErrorObjectMissName, "{false:1}", 1u);
1274
+ TEST_ERROR(kParseErrorObjectMissName, "{1:1}", 1u);
1275
+ TEST_ERROR(kParseErrorObjectMissName, "{[]:1}", 1u);
1276
+ TEST_ERROR(kParseErrorObjectMissName, "{{}:1}", 1u);
1277
+ TEST_ERROR(kParseErrorObjectMissName, "{xyz:1}", 1u);
1278
+
1279
+ // Missing a colon after a name of object member.
1280
+ TEST_ERROR(kParseErrorObjectMissColon, "{\"a\" 1}", 5u);
1281
+ TEST_ERROR(kParseErrorObjectMissColon, "{\"a\",1}", 4u);
1282
+
1283
+ // Must be a comma or '}' after an object member
1284
+ TEST_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, "{\"a\":1]", 6u);
1285
+
1286
+ // Object cannot have a trailing comma (without kParseTrailingCommasFlag);
1287
+ // an object member name must follow a comma
1288
+ TEST_ERROR(kParseErrorObjectMissName, "{\"a\":1,}", 7u);
1289
+
1290
+ // This tests that MemoryStream is checking the length in Peek().
1291
+ {
1292
+ MemoryStream ms("{\"a\"", 1);
1293
+ BaseReaderHandler<> h;
1294
+ Reader reader;
1295
+ EXPECT_FALSE(reader.Parse<kParseStopWhenDoneFlag>(ms, h));
1296
+ EXPECT_EQ(kParseErrorObjectMissName, reader.GetParseErrorCode());
1297
+ }
1298
+ }
1299
+
1300
+ #undef TEST_ERROR
1301
+
1302
+ TEST(Reader, SkipWhitespace) {
1303
+ StringStream ss(" A \t\tB\n \n\nC\r\r \rD \t\n\r E");
1304
+ const char* expected = "ABCDE";
1305
+ for (size_t i = 0; i < 5; i++) {
1306
+ SkipWhitespace(ss);
1307
+ EXPECT_EQ(expected[i], ss.Take());
1308
+ }
1309
+ }
1310
+
1311
+ // Test implementing a stream without copy stream optimization.
1312
+ // Clone from GenericStringStream except that copy constructor is disabled.
1313
+ template <typename Encoding>
1314
+ class CustomStringStream {
1315
+ public:
1316
+ typedef typename Encoding::Ch Ch;
1317
+
1318
+ CustomStringStream(const Ch *src) : src_(src), head_(src) {}
1319
+
1320
+ Ch Peek() const { return *src_; }
1321
+ Ch Take() { return *src_++; }
1322
+ size_t Tell() const { return static_cast<size_t>(src_ - head_); }
1323
+
1324
+ Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; }
1325
+ void Put(Ch) { RAPIDJSON_ASSERT(false); }
1326
+ void Flush() { RAPIDJSON_ASSERT(false); }
1327
+ size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; }
1328
+
1329
+ private:
1330
+ // Prohibit copy constructor & assignment operator.
1331
+ CustomStringStream(const CustomStringStream&);
1332
+ CustomStringStream& operator=(const CustomStringStream&);
1333
+
1334
+ const Ch* src_; //!< Current read position.
1335
+ const Ch* head_; //!< Original head of the string.
1336
+ };
1337
+
1338
+ // If the following code is compiled, it should generate compilation error as predicted.
1339
+ // Because CustomStringStream<> is not copyable via making copy constructor private.
1340
+ #if 0
1341
+ namespace rapidjson {
1342
+
1343
+ template <typename Encoding>
1344
+ struct StreamTraits<CustomStringStream<Encoding> > {
1345
+ enum { copyOptimization = 1 };
1346
+ };
1347
+
1348
+ } // namespace rapidjson
1349
+ #endif
1350
+
1351
+ TEST(Reader, CustomStringStream) {
1352
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] } ";
1353
+ CustomStringStream<UTF8<char> > s(json);
1354
+ ParseObjectHandler h;
1355
+ Reader reader;
1356
+ reader.Parse(s, h);
1357
+ EXPECT_EQ(20u, h.step_);
1358
+ }
1359
+
1360
+ #include <sstream>
1361
+
1362
+ class IStreamWrapper {
1363
+ public:
1364
+ typedef char Ch;
1365
+
1366
+ IStreamWrapper(std::istream& is) : is_(is) {}
1367
+
1368
+ Ch Peek() const {
1369
+ int c = is_.peek();
1370
+ return c == std::char_traits<char>::eof() ? '\0' : static_cast<Ch>(c);
1371
+ }
1372
+
1373
+ Ch Take() {
1374
+ int c = is_.get();
1375
+ return c == std::char_traits<char>::eof() ? '\0' : static_cast<Ch>(c);
1376
+ }
1377
+
1378
+ size_t Tell() const { return static_cast<size_t>(is_.tellg()); }
1379
+
1380
+ Ch* PutBegin() { assert(false); return 0; }
1381
+ void Put(Ch) { assert(false); }
1382
+ void Flush() { assert(false); }
1383
+ size_t PutEnd(Ch*) { assert(false); return 0; }
1384
+
1385
+ private:
1386
+ IStreamWrapper(const IStreamWrapper&);
1387
+ IStreamWrapper& operator=(const IStreamWrapper&);
1388
+
1389
+ std::istream& is_;
1390
+ };
1391
+
1392
+ TEST(Reader, Parse_IStreamWrapper_StringStream) {
1393
+ const char* json = "[1,2,3,4]";
1394
+
1395
+ std::stringstream ss(json);
1396
+ IStreamWrapper is(ss);
1397
+
1398
+ Reader reader;
1399
+ ParseArrayHandler<4> h;
1400
+ reader.Parse(is, h);
1401
+ EXPECT_FALSE(reader.HasParseError());
1402
+ }
1403
+
1404
+ // Test iterative parsing.
1405
+
1406
+ #define TESTERRORHANDLING(text, errorCode, offset)\
1407
+ {\
1408
+ unsigned streamPos = offset; \
1409
+ StringStream json(text); \
1410
+ BaseReaderHandler<> handler; \
1411
+ Reader reader; \
1412
+ reader.Parse<kParseIterativeFlag>(json, handler); \
1413
+ EXPECT_TRUE(reader.HasParseError()); \
1414
+ EXPECT_EQ(errorCode, reader.GetParseErrorCode()); \
1415
+ EXPECT_EQ(offset, reader.GetErrorOffset()); \
1416
+ EXPECT_EQ(streamPos, json.Tell()); \
1417
+ }
1418
+
1419
+ TEST(Reader, IterativeParsing_ErrorHandling) {
1420
+ TESTERRORHANDLING("{\"a\": a}", kParseErrorValueInvalid, 6u);
1421
+
1422
+ TESTERRORHANDLING("", kParseErrorDocumentEmpty, 0u);
1423
+ TESTERRORHANDLING("{}{}", kParseErrorDocumentRootNotSingular, 2u);
1424
+
1425
+ TESTERRORHANDLING("{1}", kParseErrorObjectMissName, 1u);
1426
+ TESTERRORHANDLING("{\"a\", 1}", kParseErrorObjectMissColon, 4u);
1427
+ TESTERRORHANDLING("{\"a\"}", kParseErrorObjectMissColon, 4u);
1428
+ TESTERRORHANDLING("{\"a\": 1", kParseErrorObjectMissCommaOrCurlyBracket, 7u);
1429
+ TESTERRORHANDLING("[1 2 3]", kParseErrorArrayMissCommaOrSquareBracket, 3u);
1430
+ TESTERRORHANDLING("{\"a: 1", kParseErrorStringMissQuotationMark, 6u);
1431
+ TESTERRORHANDLING("{\"a\":}", kParseErrorValueInvalid, 5u);
1432
+ TESTERRORHANDLING("{\"a\":]", kParseErrorValueInvalid, 5u);
1433
+ TESTERRORHANDLING("[1,2,}", kParseErrorValueInvalid, 5u);
1434
+ TESTERRORHANDLING("[}]", kParseErrorValueInvalid, 1u);
1435
+ TESTERRORHANDLING("[,]", kParseErrorValueInvalid, 1u);
1436
+ TESTERRORHANDLING("[1,,]", kParseErrorValueInvalid, 3u);
1437
+
1438
+ // Trailing commas are not allowed without kParseTrailingCommasFlag
1439
+ TESTERRORHANDLING("{\"a\": 1,}", kParseErrorObjectMissName, 8u);
1440
+ TESTERRORHANDLING("[1,2,3,]", kParseErrorValueInvalid, 7u);
1441
+
1442
+ // Any JSON value can be a valid root element in RFC7159.
1443
+ TESTERRORHANDLING("\"ab", kParseErrorStringMissQuotationMark, 3u);
1444
+ TESTERRORHANDLING("truE", kParseErrorValueInvalid, 3u);
1445
+ TESTERRORHANDLING("False", kParseErrorValueInvalid, 0u);
1446
+ TESTERRORHANDLING("true, false", kParseErrorDocumentRootNotSingular, 4u);
1447
+ TESTERRORHANDLING("false, false", kParseErrorDocumentRootNotSingular, 5u);
1448
+ TESTERRORHANDLING("nulL", kParseErrorValueInvalid, 3u);
1449
+ TESTERRORHANDLING("null , null", kParseErrorDocumentRootNotSingular, 5u);
1450
+ TESTERRORHANDLING("1a", kParseErrorDocumentRootNotSingular, 1u);
1451
+ }
1452
+
1453
+ template<typename Encoding = UTF8<> >
1454
+ struct IterativeParsingReaderHandler {
1455
+ typedef typename Encoding::Ch Ch;
1456
+
1457
+ const static uint32_t LOG_NULL = 0x10000000;
1458
+ const static uint32_t LOG_BOOL = 0x20000000;
1459
+ const static uint32_t LOG_INT = 0x30000000;
1460
+ const static uint32_t LOG_UINT = 0x40000000;
1461
+ const static uint32_t LOG_INT64 = 0x50000000;
1462
+ const static uint32_t LOG_UINT64 = 0x60000000;
1463
+ const static uint32_t LOG_DOUBLE = 0x70000000;
1464
+ const static uint32_t LOG_STRING = 0x80000000;
1465
+ const static uint32_t LOG_STARTOBJECT = 0x90000000;
1466
+ const static uint32_t LOG_KEY = 0xA0000000;
1467
+ const static uint32_t LOG_ENDOBJECT = 0xB0000000;
1468
+ const static uint32_t LOG_STARTARRAY = 0xC0000000;
1469
+ const static uint32_t LOG_ENDARRAY = 0xD0000000;
1470
+
1471
+ const static size_t LogCapacity = 256;
1472
+ uint32_t Logs[LogCapacity];
1473
+ size_t LogCount;
1474
+
1475
+ IterativeParsingReaderHandler() : LogCount(0) {
1476
+ }
1477
+
1478
+ bool Null() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_NULL; return true; }
1479
+
1480
+ bool Bool(bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_BOOL; return true; }
1481
+
1482
+ bool Int(int) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; }
1483
+
1484
+ bool Uint(unsigned) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT; return true; }
1485
+
1486
+ bool Int64(int64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_INT64; return true; }
1487
+
1488
+ bool Uint64(uint64_t) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_UINT64; return true; }
1489
+
1490
+ bool Double(double) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_DOUBLE; return true; }
1491
+
1492
+ bool RawNumber(const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STRING; return true; }
1493
+
1494
+ bool String(const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STRING; return true; }
1495
+
1496
+ bool StartObject() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTOBJECT; return true; }
1497
+
1498
+ bool Key (const Ch*, SizeType, bool) { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_KEY; return true; }
1499
+
1500
+ bool EndObject(SizeType c) {
1501
+ RAPIDJSON_ASSERT(LogCount < LogCapacity);
1502
+ RAPIDJSON_ASSERT((static_cast<uint32_t>(c) & 0xF0000000) == 0);
1503
+ Logs[LogCount++] = LOG_ENDOBJECT | static_cast<uint32_t>(c);
1504
+ return true;
1505
+ }
1506
+
1507
+ bool StartArray() { RAPIDJSON_ASSERT(LogCount < LogCapacity); Logs[LogCount++] = LOG_STARTARRAY; return true; }
1508
+
1509
+ bool EndArray(SizeType c) {
1510
+ RAPIDJSON_ASSERT(LogCount < LogCapacity);
1511
+ RAPIDJSON_ASSERT((static_cast<uint32_t>(c) & 0xF0000000) == 0);
1512
+ Logs[LogCount++] = LOG_ENDARRAY | static_cast<uint32_t>(c);
1513
+ return true;
1514
+ }
1515
+ };
1516
+
1517
+ TEST(Reader, IterativeParsing_General) {
1518
+ {
1519
+ StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]");
1520
+ Reader reader;
1521
+ IterativeParsingReaderHandler<> handler;
1522
+
1523
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1524
+
1525
+ EXPECT_FALSE(r.IsError());
1526
+ EXPECT_FALSE(reader.HasParseError());
1527
+
1528
+ uint32_t e[] = {
1529
+ handler.LOG_STARTARRAY,
1530
+ handler.LOG_INT,
1531
+ handler.LOG_STARTOBJECT,
1532
+ handler.LOG_KEY,
1533
+ handler.LOG_STARTARRAY,
1534
+ handler.LOG_INT,
1535
+ handler.LOG_INT,
1536
+ handler.LOG_ENDARRAY | 2,
1537
+ handler.LOG_ENDOBJECT | 1,
1538
+ handler.LOG_NULL,
1539
+ handler.LOG_BOOL,
1540
+ handler.LOG_BOOL,
1541
+ handler.LOG_STRING,
1542
+ handler.LOG_DOUBLE,
1543
+ handler.LOG_ENDARRAY | 7
1544
+ };
1545
+
1546
+ EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount);
1547
+
1548
+ for (size_t i = 0; i < handler.LogCount; ++i) {
1549
+ EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i;
1550
+ }
1551
+ }
1552
+ }
1553
+
1554
+ TEST(Reader, IterativeParsing_Count) {
1555
+ {
1556
+ StringStream is("[{}, {\"k\": 1}, [1], []]");
1557
+ Reader reader;
1558
+ IterativeParsingReaderHandler<> handler;
1559
+
1560
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1561
+
1562
+ EXPECT_FALSE(r.IsError());
1563
+ EXPECT_FALSE(reader.HasParseError());
1564
+
1565
+ uint32_t e[] = {
1566
+ handler.LOG_STARTARRAY,
1567
+ handler.LOG_STARTOBJECT,
1568
+ handler.LOG_ENDOBJECT | 0,
1569
+ handler.LOG_STARTOBJECT,
1570
+ handler.LOG_KEY,
1571
+ handler.LOG_INT,
1572
+ handler.LOG_ENDOBJECT | 1,
1573
+ handler.LOG_STARTARRAY,
1574
+ handler.LOG_INT,
1575
+ handler.LOG_ENDARRAY | 1,
1576
+ handler.LOG_STARTARRAY,
1577
+ handler.LOG_ENDARRAY | 0,
1578
+ handler.LOG_ENDARRAY | 4
1579
+ };
1580
+
1581
+ EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount);
1582
+
1583
+ for (size_t i = 0; i < handler.LogCount; ++i) {
1584
+ EXPECT_EQ(e[i], handler.Logs[i]) << "i = " << i;
1585
+ }
1586
+ }
1587
+ }
1588
+
1589
+ TEST(Reader, IterativePullParsing_General) {
1590
+ {
1591
+ IterativeParsingReaderHandler<> handler;
1592
+ uint32_t e[] = {
1593
+ handler.LOG_STARTARRAY,
1594
+ handler.LOG_INT,
1595
+ handler.LOG_STARTOBJECT,
1596
+ handler.LOG_KEY,
1597
+ handler.LOG_STARTARRAY,
1598
+ handler.LOG_INT,
1599
+ handler.LOG_INT,
1600
+ handler.LOG_ENDARRAY | 2,
1601
+ handler.LOG_ENDOBJECT | 1,
1602
+ handler.LOG_NULL,
1603
+ handler.LOG_BOOL,
1604
+ handler.LOG_BOOL,
1605
+ handler.LOG_STRING,
1606
+ handler.LOG_DOUBLE,
1607
+ handler.LOG_ENDARRAY | 7
1608
+ };
1609
+
1610
+ StringStream is("[1, {\"k\": [1, 2]}, null, false, true, \"string\", 1.2]");
1611
+ Reader reader;
1612
+
1613
+ reader.IterativeParseInit();
1614
+ while (!reader.IterativeParseComplete()) {
1615
+ size_t oldLogCount = handler.LogCount;
1616
+ EXPECT_TRUE(oldLogCount < sizeof(e) / sizeof(int)) << "overrun";
1617
+
1618
+ EXPECT_TRUE(reader.IterativeParseNext<kParseDefaultFlags>(is, handler)) << "parse fail";
1619
+ EXPECT_EQ(handler.LogCount, oldLogCount + 1) << "handler should be invoked exactly once each time";
1620
+ EXPECT_EQ(e[oldLogCount], handler.Logs[oldLogCount]) << "wrong event returned";
1621
+ }
1622
+
1623
+ EXPECT_FALSE(reader.HasParseError());
1624
+ EXPECT_EQ(sizeof(e) / sizeof(int), handler.LogCount) << "handler invoked wrong number of times";
1625
+
1626
+ // The handler should not be invoked when the JSON has been fully read, but it should not fail
1627
+ size_t oldLogCount = handler.LogCount;
1628
+ EXPECT_TRUE(reader.IterativeParseNext<kParseDefaultFlags>(is, handler)) << "parse-next past complete is allowed";
1629
+ EXPECT_EQ(handler.LogCount, oldLogCount) << "parse-next past complete should not invoke handler";
1630
+ EXPECT_FALSE(reader.HasParseError()) << "parse-next past complete should not generate parse error";
1631
+ }
1632
+ }
1633
+
1634
+ // Test iterative parsing on kParseErrorTermination.
1635
+ struct HandlerTerminateAtStartObject : public IterativeParsingReaderHandler<> {
1636
+ bool StartObject() { return false; }
1637
+ };
1638
+
1639
+ struct HandlerTerminateAtStartArray : public IterativeParsingReaderHandler<> {
1640
+ bool StartArray() { return false; }
1641
+ };
1642
+
1643
+ struct HandlerTerminateAtEndObject : public IterativeParsingReaderHandler<> {
1644
+ bool EndObject(SizeType) { return false; }
1645
+ };
1646
+
1647
+ struct HandlerTerminateAtEndArray : public IterativeParsingReaderHandler<> {
1648
+ bool EndArray(SizeType) { return false; }
1649
+ };
1650
+
1651
+ TEST(Reader, IterativeParsing_ShortCircuit) {
1652
+ {
1653
+ HandlerTerminateAtStartObject handler;
1654
+ Reader reader;
1655
+ StringStream is("[1, {}]");
1656
+
1657
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1658
+
1659
+ EXPECT_TRUE(reader.HasParseError());
1660
+ EXPECT_EQ(kParseErrorTermination, r.Code());
1661
+ EXPECT_EQ(4u, r.Offset());
1662
+ }
1663
+
1664
+ {
1665
+ HandlerTerminateAtStartArray handler;
1666
+ Reader reader;
1667
+ StringStream is("{\"a\": []}");
1668
+
1669
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1670
+
1671
+ EXPECT_TRUE(reader.HasParseError());
1672
+ EXPECT_EQ(kParseErrorTermination, r.Code());
1673
+ EXPECT_EQ(6u, r.Offset());
1674
+ }
1675
+
1676
+ {
1677
+ HandlerTerminateAtEndObject handler;
1678
+ Reader reader;
1679
+ StringStream is("[1, {}]");
1680
+
1681
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1682
+
1683
+ EXPECT_TRUE(reader.HasParseError());
1684
+ EXPECT_EQ(kParseErrorTermination, r.Code());
1685
+ EXPECT_EQ(5u, r.Offset());
1686
+ }
1687
+
1688
+ {
1689
+ HandlerTerminateAtEndArray handler;
1690
+ Reader reader;
1691
+ StringStream is("{\"a\": []}");
1692
+
1693
+ ParseResult r = reader.Parse<kParseIterativeFlag>(is, handler);
1694
+
1695
+ EXPECT_TRUE(reader.HasParseError());
1696
+ EXPECT_EQ(kParseErrorTermination, r.Code());
1697
+ EXPECT_EQ(7u, r.Offset());
1698
+ }
1699
+ }
1700
+
1701
+ // For covering BaseReaderHandler default functions
1702
+ TEST(Reader, BaseReaderHandler_Default) {
1703
+ BaseReaderHandler<> h;
1704
+ Reader reader;
1705
+ StringStream is("[null, true, -1, 1, -1234567890123456789, 1234567890123456789, 3.14, \"s\", { \"a\" : 1 }]");
1706
+ EXPECT_TRUE(reader.Parse(is, h));
1707
+ }
1708
+
1709
+ template <int e>
1710
+ struct TerminateHandler {
1711
+ bool Null() { return e != 0; }
1712
+ bool Bool(bool) { return e != 1; }
1713
+ bool Int(int) { return e != 2; }
1714
+ bool Uint(unsigned) { return e != 3; }
1715
+ bool Int64(int64_t) { return e != 4; }
1716
+ bool Uint64(uint64_t) { return e != 5; }
1717
+ bool Double(double) { return e != 6; }
1718
+ bool RawNumber(const char*, SizeType, bool) { return e != 7; }
1719
+ bool String(const char*, SizeType, bool) { return e != 8; }
1720
+ bool StartObject() { return e != 9; }
1721
+ bool Key(const char*, SizeType, bool) { return e != 10; }
1722
+ bool EndObject(SizeType) { return e != 11; }
1723
+ bool StartArray() { return e != 12; }
1724
+ bool EndArray(SizeType) { return e != 13; }
1725
+ };
1726
+
1727
+ #define TEST_TERMINATION(e, json)\
1728
+ {\
1729
+ Reader reader;\
1730
+ TerminateHandler<e> h;\
1731
+ StringStream is(json);\
1732
+ EXPECT_FALSE(reader.Parse(is, h));\
1733
+ EXPECT_EQ(kParseErrorTermination, reader.GetParseErrorCode());\
1734
+ }
1735
+
1736
+ TEST(Reader, ParseTerminationByHandler) {
1737
+ TEST_TERMINATION(0, "[null");
1738
+ TEST_TERMINATION(1, "[true");
1739
+ TEST_TERMINATION(1, "[false");
1740
+ TEST_TERMINATION(2, "[-1");
1741
+ TEST_TERMINATION(3, "[1");
1742
+ TEST_TERMINATION(4, "[-1234567890123456789");
1743
+ TEST_TERMINATION(5, "[1234567890123456789");
1744
+ TEST_TERMINATION(6, "[0.5]");
1745
+ // RawNumber() is never called
1746
+ TEST_TERMINATION(8, "[\"a\"");
1747
+ TEST_TERMINATION(9, "[{");
1748
+ TEST_TERMINATION(10, "[{\"a\"");
1749
+ TEST_TERMINATION(11, "[{}");
1750
+ TEST_TERMINATION(11, "[{\"a\":1}"); // non-empty object
1751
+ TEST_TERMINATION(12, "{\"a\":[");
1752
+ TEST_TERMINATION(13, "{\"a\":[]");
1753
+ TEST_TERMINATION(13, "{\"a\":[1]"); // non-empty array
1754
+ }
1755
+
1756
+ TEST(Reader, ParseComments) {
1757
+ const char* json =
1758
+ "// Here is a one-line comment.\n"
1759
+ "{// And here's another one\n"
1760
+ " /*And here's an in-line one.*/\"hello\" : \"world\","
1761
+ " \"t\" :/* And one with '*' symbol*/true ,"
1762
+ "/* A multiline comment\n"
1763
+ " goes here*/"
1764
+ " \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3]"
1765
+ "}/*And the last one to be sure */";
1766
+
1767
+ StringStream s(json);
1768
+ ParseObjectHandler h;
1769
+ Reader reader;
1770
+ EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
1771
+ EXPECT_EQ(20u, h.step_);
1772
+ }
1773
+
1774
+ TEST(Reader, ParseEmptyInlineComment) {
1775
+ const char* json = "{/**/\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1776
+
1777
+ StringStream s(json);
1778
+ ParseObjectHandler h;
1779
+ Reader reader;
1780
+ EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
1781
+ EXPECT_EQ(20u, h.step_);
1782
+ }
1783
+
1784
+ TEST(Reader, ParseEmptyOnelineComment) {
1785
+ const char* json = "{//\n\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1786
+
1787
+ StringStream s(json);
1788
+ ParseObjectHandler h;
1789
+ Reader reader;
1790
+ EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
1791
+ EXPECT_EQ(20u, h.step_);
1792
+ }
1793
+
1794
+ TEST(Reader, ParseMultipleCommentsInARow) {
1795
+ const char* json =
1796
+ "{/* first comment *//* second */\n"
1797
+ "/* third */ /*fourth*/// last one\n"
1798
+ "\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1799
+
1800
+ StringStream s(json);
1801
+ ParseObjectHandler h;
1802
+ Reader reader;
1803
+ EXPECT_TRUE(reader.Parse<kParseCommentsFlag>(s, h));
1804
+ EXPECT_EQ(20u, h.step_);
1805
+ }
1806
+
1807
+ TEST(Reader, InlineCommentsAreDisabledByDefault) {
1808
+ {
1809
+ const char* json = "{/* Inline comment. */\"hello\" : \"world\", \"t\" : true, \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1810
+
1811
+ StringStream s(json);
1812
+ ParseObjectHandler h;
1813
+ Reader reader;
1814
+ EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
1815
+ }
1816
+
1817
+ {
1818
+ const char* json =
1819
+ "{\"hello\" : /* Multiline comment starts here\n"
1820
+ " continues here\n"
1821
+ " and ends here */\"world\", \"t\" :true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1822
+
1823
+ StringStream s(json);
1824
+ ParseObjectHandler h;
1825
+ Reader reader;
1826
+ EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
1827
+ }
1828
+ }
1829
+
1830
+ TEST(Reader, OnelineCommentsAreDisabledByDefault) {
1831
+ const char* json = "{// One-line comment\n\"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3] }";
1832
+
1833
+ StringStream s(json);
1834
+ ParseObjectHandler h;
1835
+ Reader reader;
1836
+ EXPECT_FALSE(reader.Parse<kParseDefaultFlags>(s, h));
1837
+ }
1838
+
1839
+ TEST(Reader, EofAfterOneLineComment) {
1840
+ const char* json = "{\"hello\" : \"world\" // EOF is here -->\0 \n}";
1841
+
1842
+ StringStream s(json);
1843
+ ParseObjectHandler h;
1844
+ Reader reader;
1845
+ EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
1846
+ EXPECT_EQ(kParseErrorObjectMissCommaOrCurlyBracket, reader.GetParseErrorCode());
1847
+ }
1848
+
1849
+ TEST(Reader, IncompleteMultilineComment) {
1850
+ const char* json = "{\"hello\" : \"world\" /* EOF is here -->\0 */}";
1851
+
1852
+ StringStream s(json);
1853
+ ParseObjectHandler h;
1854
+ Reader reader;
1855
+ EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
1856
+ EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
1857
+ }
1858
+
1859
+ TEST(Reader, IncompleteMultilineComment2) {
1860
+ const char* json = "{\"hello\" : \"world\" /* *\0 */}";
1861
+
1862
+ StringStream s(json);
1863
+ ParseObjectHandler h;
1864
+ Reader reader;
1865
+ EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
1866
+ EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
1867
+ }
1868
+
1869
+ TEST(Reader, UnrecognizedComment) {
1870
+ const char* json = "{\"hello\" : \"world\" /! }";
1871
+
1872
+ StringStream s(json);
1873
+ ParseObjectHandler h;
1874
+ Reader reader;
1875
+ EXPECT_FALSE(reader.Parse<kParseCommentsFlag>(s, h));
1876
+ EXPECT_EQ(kParseErrorUnspecificSyntaxError, reader.GetParseErrorCode());
1877
+ }
1878
+
1879
+ struct NumbersAsStringsHandler {
1880
+ bool Null() { return true; }
1881
+ bool Bool(bool) { return true; }
1882
+ bool Int(int) { return true; }
1883
+ bool Uint(unsigned) { return true; }
1884
+ bool Int64(int64_t) { return true; }
1885
+ bool Uint64(uint64_t) { return true; }
1886
+ bool Double(double) { return true; }
1887
+ // 'str' is not null-terminated
1888
+ bool RawNumber(const char* str, SizeType length, bool) {
1889
+ EXPECT_TRUE(str != 0);
1890
+ EXPECT_TRUE(expected_len_ == length);
1891
+ EXPECT_TRUE(strncmp(str, expected_, length) == 0);
1892
+ return true;
1893
+ }
1894
+ bool String(const char*, SizeType, bool) { return true; }
1895
+ bool StartObject() { return true; }
1896
+ bool Key(const char*, SizeType, bool) { return true; }
1897
+ bool EndObject(SizeType) { return true; }
1898
+ bool StartArray() { return true; }
1899
+ bool EndArray(SizeType) { return true; }
1900
+
1901
+ NumbersAsStringsHandler(const char* expected)
1902
+ : expected_(expected)
1903
+ , expected_len_(strlen(expected)) {}
1904
+
1905
+ const char* expected_;
1906
+ size_t expected_len_;
1907
+ };
1908
+
1909
+ TEST(Reader, NumbersAsStrings) {
1910
+ {
1911
+ const char* json = "{ \"pi\": 3.1416 } ";
1912
+ StringStream s(json);
1913
+ NumbersAsStringsHandler h("3.1416");
1914
+ Reader reader;
1915
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1916
+ }
1917
+ {
1918
+ char* json = StrDup("{ \"pi\": 3.1416 } ");
1919
+ InsituStringStream s(json);
1920
+ NumbersAsStringsHandler h("3.1416");
1921
+ Reader reader;
1922
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
1923
+ free(json);
1924
+ }
1925
+ {
1926
+ const char* json = "{ \"gigabyte\": 1.0e9 } ";
1927
+ StringStream s(json);
1928
+ NumbersAsStringsHandler h("1.0e9");
1929
+ Reader reader;
1930
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1931
+ }
1932
+ {
1933
+ char* json = StrDup("{ \"gigabyte\": 1.0e9 } ");
1934
+ InsituStringStream s(json);
1935
+ NumbersAsStringsHandler h("1.0e9");
1936
+ Reader reader;
1937
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
1938
+ free(json);
1939
+ }
1940
+ {
1941
+ const char* json = "{ \"pi\": 314.159e-2 } ";
1942
+ StringStream s(json);
1943
+ NumbersAsStringsHandler h("314.159e-2");
1944
+ Reader reader;
1945
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1946
+ }
1947
+ {
1948
+ char* json = StrDup("{ \"gigabyte\": 314.159e-2 } ");
1949
+ InsituStringStream s(json);
1950
+ NumbersAsStringsHandler h("314.159e-2");
1951
+ Reader reader;
1952
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
1953
+ free(json);
1954
+ }
1955
+ {
1956
+ const char* json = "{ \"negative\": -1.54321 } ";
1957
+ StringStream s(json);
1958
+ NumbersAsStringsHandler h("-1.54321");
1959
+ Reader reader;
1960
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1961
+ }
1962
+ {
1963
+ char* json = StrDup("{ \"negative\": -1.54321 } ");
1964
+ InsituStringStream s(json);
1965
+ NumbersAsStringsHandler h("-1.54321");
1966
+ Reader reader;
1967
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag>(s, h));
1968
+ free(json);
1969
+ }
1970
+ {
1971
+ const char* json = "{ \"pi\": 314.159e-2 } ";
1972
+ std::stringstream ss(json);
1973
+ IStreamWrapper s(ss);
1974
+ NumbersAsStringsHandler h("314.159e-2");
1975
+ Reader reader;
1976
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1977
+ }
1978
+ {
1979
+ char n1e319[321]; // '1' followed by 319 '0'
1980
+ n1e319[0] = '1';
1981
+ for (int i = 1; i < 320; i++)
1982
+ n1e319[i] = '0';
1983
+ n1e319[320] = '\0';
1984
+ StringStream s(n1e319);
1985
+ NumbersAsStringsHandler h(n1e319);
1986
+ Reader reader;
1987
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag>(s, h));
1988
+ }
1989
+ }
1990
+
1991
+ template <unsigned extraFlags>
1992
+ void TestTrailingCommas() {
1993
+ {
1994
+ StringStream s("[1,2,3,]");
1995
+ ParseArrayHandler<3> h;
1996
+ Reader reader;
1997
+ EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
1998
+ EXPECT_EQ(5u, h.step_);
1999
+ }
2000
+ {
2001
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
2002
+ "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3],}";
2003
+ StringStream s(json);
2004
+ ParseObjectHandler h;
2005
+ Reader reader;
2006
+ EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
2007
+ EXPECT_EQ(20u, h.step_);
2008
+ }
2009
+ {
2010
+ // whitespace around trailing commas
2011
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
2012
+ "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3\n,\n]\n,\n} ";
2013
+ StringStream s(json);
2014
+ ParseObjectHandler h;
2015
+ Reader reader;
2016
+ EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
2017
+ EXPECT_EQ(20u, h.step_);
2018
+ }
2019
+ {
2020
+ // comments around trailing commas
2021
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null,"
2022
+ "\"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3/*test*/,/*test*/]/*test*/,/*test*/}";
2023
+ StringStream s(json);
2024
+ ParseObjectHandler h;
2025
+ Reader reader;
2026
+ EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag|kParseCommentsFlag>(s, h));
2027
+ EXPECT_EQ(20u, h.step_);
2028
+ }
2029
+ }
2030
+
2031
+ TEST(Reader, TrailingCommas) {
2032
+ TestTrailingCommas<kParseNoFlags>();
2033
+ }
2034
+
2035
+ TEST(Reader, TrailingCommasIterative) {
2036
+ TestTrailingCommas<kParseIterativeFlag>();
2037
+ }
2038
+
2039
+ template <unsigned extraFlags>
2040
+ void TestMultipleTrailingCommaErrors() {
2041
+ // only a single trailing comma is allowed.
2042
+ {
2043
+ StringStream s("[1,2,3,,]");
2044
+ ParseArrayHandler<3> h;
2045
+ Reader reader;
2046
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2047
+ EXPECT_TRUE(reader.HasParseError());
2048
+ EXPECT_EQ(kParseErrorValueInvalid, r.Code());
2049
+ EXPECT_EQ(7u, r.Offset());
2050
+ }
2051
+ {
2052
+ const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
2053
+ "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3,],,}";
2054
+ StringStream s(json);
2055
+ ParseObjectHandler h;
2056
+ Reader reader;
2057
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2058
+ EXPECT_TRUE(reader.HasParseError());
2059
+ EXPECT_EQ(kParseErrorObjectMissName, r.Code());
2060
+ EXPECT_EQ(95u, r.Offset());
2061
+ }
2062
+ }
2063
+
2064
+ TEST(Reader, MultipleTrailingCommaErrors) {
2065
+ TestMultipleTrailingCommaErrors<kParseNoFlags>();
2066
+ }
2067
+
2068
+ TEST(Reader, MultipleTrailingCommaErrorsIterative) {
2069
+ TestMultipleTrailingCommaErrors<kParseIterativeFlag>();
2070
+ }
2071
+
2072
+ template <unsigned extraFlags>
2073
+ void TestEmptyExceptForCommaErrors() {
2074
+ // not allowed even with trailing commas enabled; the
2075
+ // trailing comma must follow a value.
2076
+ {
2077
+ StringStream s("[,]");
2078
+ ParseArrayHandler<3> h;
2079
+ Reader reader;
2080
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2081
+ EXPECT_TRUE(reader.HasParseError());
2082
+ EXPECT_EQ(kParseErrorValueInvalid, r.Code());
2083
+ EXPECT_EQ(1u, r.Offset());
2084
+ }
2085
+ {
2086
+ StringStream s("{,}");
2087
+ ParseObjectHandler h;
2088
+ Reader reader;
2089
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2090
+ EXPECT_TRUE(reader.HasParseError());
2091
+ EXPECT_EQ(kParseErrorObjectMissName, r.Code());
2092
+ EXPECT_EQ(1u, r.Offset());
2093
+ }
2094
+ }
2095
+
2096
+ TEST(Reader, EmptyExceptForCommaErrors) {
2097
+ TestEmptyExceptForCommaErrors<kParseNoFlags>();
2098
+ }
2099
+
2100
+ TEST(Reader, EmptyExceptForCommaErrorsIterative) {
2101
+ TestEmptyExceptForCommaErrors<kParseIterativeFlag>();
2102
+ }
2103
+
2104
+ template <unsigned extraFlags>
2105
+ void TestTrailingCommaHandlerTermination() {
2106
+ {
2107
+ HandlerTerminateAtEndArray h;
2108
+ Reader reader;
2109
+ StringStream s("[1,2,3,]");
2110
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2111
+ EXPECT_TRUE(reader.HasParseError());
2112
+ EXPECT_EQ(kParseErrorTermination, r.Code());
2113
+ EXPECT_EQ(7u, r.Offset());
2114
+ }
2115
+ {
2116
+ HandlerTerminateAtEndObject h;
2117
+ Reader reader;
2118
+ StringStream s("{\"t\": true, \"f\": false,}");
2119
+ ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2120
+ EXPECT_TRUE(reader.HasParseError());
2121
+ EXPECT_EQ(kParseErrorTermination, r.Code());
2122
+ EXPECT_EQ(23u, r.Offset());
2123
+ }
2124
+ }
2125
+
2126
+ TEST(Reader, TrailingCommaHandlerTermination) {
2127
+ TestTrailingCommaHandlerTermination<kParseNoFlags>();
2128
+ }
2129
+
2130
+ TEST(Reader, TrailingCommaHandlerTerminationIterative) {
2131
+ TestTrailingCommaHandlerTermination<kParseIterativeFlag>();
2132
+ }
2133
+
2134
+ TEST(Reader, ParseNanAndInfinity) {
2135
+ #define TEST_NAN_INF(str, x) \
2136
+ { \
2137
+ { \
2138
+ StringStream s(str); \
2139
+ ParseDoubleHandler h; \
2140
+ Reader reader; \
2141
+ ASSERT_EQ(kParseErrorNone, reader.Parse<kParseNanAndInfFlag>(s, h).Code()); \
2142
+ EXPECT_EQ(1u, h.step_); \
2143
+ internal::Double e(x), a(h.actual_); \
2144
+ EXPECT_EQ(e.IsNan(), a.IsNan()); \
2145
+ EXPECT_EQ(e.IsInf(), a.IsInf()); \
2146
+ if (!e.IsNan()) \
2147
+ EXPECT_EQ(e.Sign(), a.Sign()); \
2148
+ } \
2149
+ { \
2150
+ const char* json = "{ \"naninfdouble\": " str " } "; \
2151
+ StringStream s(json); \
2152
+ NumbersAsStringsHandler h(str); \
2153
+ Reader reader; \
2154
+ EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \
2155
+ } \
2156
+ { \
2157
+ char* json = StrDup("{ \"naninfdouble\": " str " } "); \
2158
+ InsituStringStream s(json); \
2159
+ NumbersAsStringsHandler h(str); \
2160
+ Reader reader; \
2161
+ EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \
2162
+ free(json); \
2163
+ } \
2164
+ }
2165
+ #define TEST_NAN_INF_ERROR(errorCode, str, errorOffset) \
2166
+ { \
2167
+ unsigned streamPos = errorOffset; \
2168
+ char buffer[1001]; \
2169
+ strncpy(buffer, str, 1000); \
2170
+ InsituStringStream s(buffer); \
2171
+ BaseReaderHandler<> h; \
2172
+ Reader reader; \
2173
+ EXPECT_FALSE(reader.Parse<kParseNanAndInfFlag>(s, h)); \
2174
+ EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
2175
+ EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
2176
+ EXPECT_EQ(streamPos, s.Tell());\
2177
+ }
2178
+
2179
+ double nan = std::numeric_limits<double>::quiet_NaN();
2180
+ double inf = std::numeric_limits<double>::infinity();
2181
+
2182
+ TEST_NAN_INF("NaN", nan);
2183
+ TEST_NAN_INF("-NaN", nan);
2184
+ TEST_NAN_INF("Inf", inf);
2185
+ TEST_NAN_INF("Infinity", inf);
2186
+ TEST_NAN_INF("-Inf", -inf);
2187
+ TEST_NAN_INF("-Infinity", -inf);
2188
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NInf", 1u);
2189
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NaInf", 2u);
2190
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "INan", 1u);
2191
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "InNan", 2u);
2192
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "nan", 1u);
2193
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-nan", 1u);
2194
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NAN", 1u);
2195
+ TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-Infinty", 6u);
2196
+
2197
+ #undef TEST_NAN_INF_ERROR
2198
+ #undef TEST_NAN_INF
2199
+ }
2200
+
2201
+ TEST(Reader, EscapedApostrophe) {
2202
+ const char json[] = " { \"foo\": \"bar\\'buzz\" } ";
2203
+
2204
+ BaseReaderHandler<> h;
2205
+
2206
+ {
2207
+ StringStream s(json);
2208
+ Reader reader;
2209
+ ParseResult r = reader.Parse<kParseNoFlags>(s, h);
2210
+ EXPECT_TRUE(reader.HasParseError());
2211
+ EXPECT_EQ(kParseErrorStringEscapeInvalid, r.Code());
2212
+ EXPECT_EQ(14u, r.Offset());
2213
+ }
2214
+
2215
+ {
2216
+ StringStream s(json);
2217
+ Reader reader;
2218
+ ParseResult r = reader.Parse<kParseEscapedApostropheFlag>(s, h);
2219
+ EXPECT_FALSE(reader.HasParseError());
2220
+ EXPECT_EQ(kParseErrorNone, r.Code());
2221
+ EXPECT_EQ(0u, r.Offset());
2222
+ }
2223
+ }
2224
+
2225
+ RAPIDJSON_DIAG_POP