rj_schema 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (613) hide show
  1. checksums.yaml +4 -4
  2. metadata +3 -615
  3. data/ext/rj_schema/rapidjson/CHANGELOG.md +0 -158
  4. data/ext/rj_schema/rapidjson/CMakeLists.txt +0 -221
  5. data/ext/rj_schema/rapidjson/CMakeModules/FindGTestSrc.cmake +0 -30
  6. data/ext/rj_schema/rapidjson/RapidJSON.pc.in +0 -7
  7. data/ext/rj_schema/rapidjson/RapidJSONConfig.cmake.in +0 -15
  8. data/ext/rj_schema/rapidjson/RapidJSONConfigVersion.cmake.in +0 -10
  9. data/ext/rj_schema/rapidjson/appveyor.yml +0 -41
  10. data/ext/rj_schema/rapidjson/bin/data/glossary.json +0 -22
  11. data/ext/rj_schema/rapidjson/bin/data/menu.json +0 -27
  12. data/ext/rj_schema/rapidjson/bin/data/readme.txt +0 -1
  13. data/ext/rj_schema/rapidjson/bin/data/sample.json +0 -3315
  14. data/ext/rj_schema/rapidjson/bin/data/webapp.json +0 -88
  15. data/ext/rj_schema/rapidjson/bin/data/widget.json +0 -26
  16. data/ext/rj_schema/rapidjson/bin/draft-04/schema +0 -150
  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 +0 -7
  26. data/ext/rj_schema/rapidjson/bin/encodings/utf8bom.json +0 -7
  27. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail1.json +0 -1
  28. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail10.json +0 -1
  29. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail11.json +0 -1
  30. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail12.json +0 -1
  31. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail13.json +0 -1
  32. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail14.json +0 -1
  33. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail15.json +0 -1
  34. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail16.json +0 -1
  35. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail17.json +0 -1
  36. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail18.json +0 -1
  37. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail19.json +0 -1
  38. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail2.json +0 -1
  39. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail20.json +0 -1
  40. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail21.json +0 -1
  41. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail22.json +0 -1
  42. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail23.json +0 -1
  43. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail24.json +0 -1
  44. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail25.json +0 -1
  45. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail26.json +0 -1
  46. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail27.json +0 -2
  47. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail28.json +0 -2
  48. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail29.json +0 -1
  49. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail3.json +0 -1
  50. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail30.json +0 -1
  51. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail31.json +0 -1
  52. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail32.json +0 -1
  53. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail33.json +0 -1
  54. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail4.json +0 -1
  55. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail5.json +0 -1
  56. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail6.json +0 -1
  57. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail7.json +0 -1
  58. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail8.json +0 -1
  59. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail9.json +0 -1
  60. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass1.json +0 -58
  61. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass2.json +0 -1
  62. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass3.json +0 -6
  63. data/ext/rj_schema/rapidjson/bin/jsonchecker/readme.txt +0 -3
  64. data/ext/rj_schema/rapidjson/bin/jsonschema/LICENSE +0 -19
  65. data/ext/rj_schema/rapidjson/bin/jsonschema/README.md +0 -148
  66. data/ext/rj_schema/rapidjson/bin/jsonschema/bin/jsonschema_suite +0 -283
  67. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/folder/folderInteger.json +0 -3
  68. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/integer.json +0 -3
  69. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/subSchemas.json +0 -8
  70. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/additionalItems.json +0 -82
  71. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/additionalProperties.json +0 -88
  72. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/default.json +0 -49
  73. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/dependencies.json +0 -108
  74. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/disallow.json +0 -80
  75. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/divisibleBy.json +0 -60
  76. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/enum.json +0 -71
  77. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/extends.json +0 -94
  78. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/items.json +0 -46
  79. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maxItems.json +0 -28
  80. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maxLength.json +0 -33
  81. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maximum.json +0 -42
  82. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minItems.json +0 -28
  83. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minLength.json +0 -33
  84. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minimum.json +0 -42
  85. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/bignum.json +0 -107
  86. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/format.json +0 -222
  87. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/jsregex.json +0 -18
  88. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/zeroTerminatedFloats.json +0 -15
  89. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/pattern.json +0 -34
  90. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/patternProperties.json +0 -110
  91. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/properties.json +0 -92
  92. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/ref.json +0 -159
  93. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/refRemote.json +0 -74
  94. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/required.json +0 -53
  95. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/type.json +0 -474
  96. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/uniqueItems.json +0 -79
  97. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/additionalItems.json +0 -82
  98. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/additionalProperties.json +0 -88
  99. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/allOf.json +0 -112
  100. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/anyOf.json +0 -68
  101. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/default.json +0 -49
  102. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/definitions.json +0 -32
  103. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/dependencies.json +0 -113
  104. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/enum.json +0 -72
  105. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/items.json +0 -46
  106. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxItems.json +0 -28
  107. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxLength.json +0 -33
  108. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxProperties.json +0 -28
  109. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maximum.json +0 -42
  110. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minItems.json +0 -28
  111. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minLength.json +0 -33
  112. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minProperties.json +0 -28
  113. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minimum.json +0 -42
  114. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/multipleOf.json +0 -60
  115. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/not.json +0 -96
  116. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/oneOf.json +0 -68
  117. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/bignum.json +0 -107
  118. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/format.json +0 -148
  119. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/zeroTerminatedFloats.json +0 -15
  120. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/pattern.json +0 -34
  121. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/patternProperties.json +0 -110
  122. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/properties.json +0 -92
  123. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/ref.json +0 -159
  124. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/refRemote.json +0 -74
  125. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/required.json +0 -39
  126. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/type.json +0 -330
  127. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/uniqueItems.json +0 -79
  128. data/ext/rj_schema/rapidjson/bin/jsonschema/tox.ini +0 -8
  129. data/ext/rj_schema/rapidjson/bin/types/booleans.json +0 -102
  130. data/ext/rj_schema/rapidjson/bin/types/floats.json +0 -102
  131. data/ext/rj_schema/rapidjson/bin/types/guids.json +0 -102
  132. data/ext/rj_schema/rapidjson/bin/types/integers.json +0 -102
  133. data/ext/rj_schema/rapidjson/bin/types/mixed.json +0 -592
  134. data/ext/rj_schema/rapidjson/bin/types/nulls.json +0 -102
  135. data/ext/rj_schema/rapidjson/bin/types/paragraphs.json +0 -102
  136. data/ext/rj_schema/rapidjson/bin/types/readme.txt +0 -1
  137. data/ext/rj_schema/rapidjson/contrib/natvis/LICENSE +0 -45
  138. data/ext/rj_schema/rapidjson/contrib/natvis/README.md +0 -7
  139. data/ext/rj_schema/rapidjson/contrib/natvis/rapidjson.natvis +0 -38
  140. data/ext/rj_schema/rapidjson/doc/CMakeLists.txt +0 -27
  141. data/ext/rj_schema/rapidjson/doc/Doxyfile.in +0 -2369
  142. data/ext/rj_schema/rapidjson/doc/Doxyfile.zh-cn.in +0 -2369
  143. data/ext/rj_schema/rapidjson/doc/diagram/architecture.dot +0 -50
  144. data/ext/rj_schema/rapidjson/doc/diagram/architecture.png +0 -0
  145. data/ext/rj_schema/rapidjson/doc/diagram/insituparsing.dot +0 -65
  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 +0 -62
  148. data/ext/rj_schema/rapidjson/doc/diagram/iterative-parser-states-diagram.png +0 -0
  149. data/ext/rj_schema/rapidjson/doc/diagram/makefile +0 -8
  150. data/ext/rj_schema/rapidjson/doc/diagram/move1.dot +0 -47
  151. data/ext/rj_schema/rapidjson/doc/diagram/move1.png +0 -0
  152. data/ext/rj_schema/rapidjson/doc/diagram/move2.dot +0 -62
  153. data/ext/rj_schema/rapidjson/doc/diagram/move2.png +0 -0
  154. data/ext/rj_schema/rapidjson/doc/diagram/move3.dot +0 -60
  155. data/ext/rj_schema/rapidjson/doc/diagram/move3.png +0 -0
  156. data/ext/rj_schema/rapidjson/doc/diagram/normalparsing.dot +0 -56
  157. data/ext/rj_schema/rapidjson/doc/diagram/normalparsing.png +0 -0
  158. data/ext/rj_schema/rapidjson/doc/diagram/simpledom.dot +0 -54
  159. data/ext/rj_schema/rapidjson/doc/diagram/simpledom.png +0 -0
  160. data/ext/rj_schema/rapidjson/doc/diagram/tutorial.dot +0 -58
  161. data/ext/rj_schema/rapidjson/doc/diagram/tutorial.png +0 -0
  162. data/ext/rj_schema/rapidjson/doc/diagram/utilityclass.dot +0 -73
  163. data/ext/rj_schema/rapidjson/doc/diagram/utilityclass.png +0 -0
  164. data/ext/rj_schema/rapidjson/doc/dom.md +0 -280
  165. data/ext/rj_schema/rapidjson/doc/dom.zh-cn.md +0 -284
  166. data/ext/rj_schema/rapidjson/doc/encoding.md +0 -146
  167. data/ext/rj_schema/rapidjson/doc/encoding.zh-cn.md +0 -152
  168. data/ext/rj_schema/rapidjson/doc/faq.md +0 -289
  169. data/ext/rj_schema/rapidjson/doc/faq.zh-cn.md +0 -290
  170. data/ext/rj_schema/rapidjson/doc/features.md +0 -104
  171. data/ext/rj_schema/rapidjson/doc/features.zh-cn.md +0 -103
  172. data/ext/rj_schema/rapidjson/doc/internals.md +0 -368
  173. data/ext/rj_schema/rapidjson/doc/internals.zh-cn.md +0 -363
  174. data/ext/rj_schema/rapidjson/doc/logo/rapidjson.png +0 -0
  175. data/ext/rj_schema/rapidjson/doc/logo/rapidjson.svg +0 -119
  176. data/ext/rj_schema/rapidjson/doc/misc/DoxygenLayout.xml +0 -194
  177. data/ext/rj_schema/rapidjson/doc/misc/doxygenextra.css +0 -274
  178. data/ext/rj_schema/rapidjson/doc/misc/footer.html +0 -11
  179. data/ext/rj_schema/rapidjson/doc/misc/header.html +0 -24
  180. data/ext/rj_schema/rapidjson/doc/npm.md +0 -31
  181. data/ext/rj_schema/rapidjson/doc/performance.md +0 -26
  182. data/ext/rj_schema/rapidjson/doc/performance.zh-cn.md +0 -26
  183. data/ext/rj_schema/rapidjson/doc/pointer.md +0 -234
  184. data/ext/rj_schema/rapidjson/doc/pointer.zh-cn.md +0 -234
  185. data/ext/rj_schema/rapidjson/doc/sax.md +0 -509
  186. data/ext/rj_schema/rapidjson/doc/sax.zh-cn.md +0 -487
  187. data/ext/rj_schema/rapidjson/doc/schema.md +0 -505
  188. data/ext/rj_schema/rapidjson/doc/schema.zh-cn.md +0 -237
  189. data/ext/rj_schema/rapidjson/doc/stream.md +0 -429
  190. data/ext/rj_schema/rapidjson/doc/stream.zh-cn.md +0 -429
  191. data/ext/rj_schema/rapidjson/doc/tutorial.md +0 -536
  192. data/ext/rj_schema/rapidjson/doc/tutorial.zh-cn.md +0 -534
  193. data/ext/rj_schema/rapidjson/docker/debian/Dockerfile +0 -8
  194. data/ext/rj_schema/rapidjson/example/CMakeLists.txt +0 -45
  195. data/ext/rj_schema/rapidjson/example/archiver/archiver.cpp +0 -292
  196. data/ext/rj_schema/rapidjson/example/archiver/archiver.h +0 -145
  197. data/ext/rj_schema/rapidjson/example/archiver/archivertest.cpp +0 -287
  198. data/ext/rj_schema/rapidjson/example/capitalize/capitalize.cpp +0 -67
  199. data/ext/rj_schema/rapidjson/example/condense/condense.cpp +0 -32
  200. data/ext/rj_schema/rapidjson/example/filterkey/filterkey.cpp +0 -135
  201. data/ext/rj_schema/rapidjson/example/filterkeydom/filterkeydom.cpp +0 -170
  202. data/ext/rj_schema/rapidjson/example/jsonx/jsonx.cpp +0 -207
  203. data/ext/rj_schema/rapidjson/example/lookaheadparser/lookaheadparser.cpp +0 -350
  204. data/ext/rj_schema/rapidjson/example/messagereader/messagereader.cpp +0 -105
  205. data/ext/rj_schema/rapidjson/example/parsebyparts/parsebyparts.cpp +0 -176
  206. data/ext/rj_schema/rapidjson/example/pretty/pretty.cpp +0 -30
  207. data/ext/rj_schema/rapidjson/example/prettyauto/prettyauto.cpp +0 -56
  208. data/ext/rj_schema/rapidjson/example/schemavalidator/schemavalidator.cpp +0 -78
  209. data/ext/rj_schema/rapidjson/example/serialize/serialize.cpp +0 -173
  210. data/ext/rj_schema/rapidjson/example/simpledom/simpledom.cpp +0 -29
  211. data/ext/rj_schema/rapidjson/example/simplepullreader/simplepullreader.cpp +0 -53
  212. data/ext/rj_schema/rapidjson/example/simplereader/simplereader.cpp +0 -42
  213. data/ext/rj_schema/rapidjson/example/simplewriter/simplewriter.cpp +0 -36
  214. data/ext/rj_schema/rapidjson/example/tutorial/tutorial.cpp +0 -151
  215. data/ext/rj_schema/rapidjson/include/rapidjson/allocators.h +0 -284
  216. data/ext/rj_schema/rapidjson/include/rapidjson/cursorstreamwrapper.h +0 -78
  217. data/ext/rj_schema/rapidjson/include/rapidjson/document.h +0 -2648
  218. data/ext/rj_schema/rapidjson/include/rapidjson/encodedstream.h +0 -299
  219. data/ext/rj_schema/rapidjson/include/rapidjson/encodings.h +0 -716
  220. data/ext/rj_schema/rapidjson/include/rapidjson/error/en.h +0 -74
  221. data/ext/rj_schema/rapidjson/include/rapidjson/error/error.h +0 -161
  222. data/ext/rj_schema/rapidjson/include/rapidjson/filereadstream.h +0 -99
  223. data/ext/rj_schema/rapidjson/include/rapidjson/filewritestream.h +0 -104
  224. data/ext/rj_schema/rapidjson/include/rapidjson/fwd.h +0 -151
  225. data/ext/rj_schema/rapidjson/include/rapidjson/internal/biginteger.h +0 -290
  226. data/ext/rj_schema/rapidjson/include/rapidjson/internal/diyfp.h +0 -271
  227. data/ext/rj_schema/rapidjson/include/rapidjson/internal/dtoa.h +0 -245
  228. data/ext/rj_schema/rapidjson/include/rapidjson/internal/ieee754.h +0 -78
  229. data/ext/rj_schema/rapidjson/include/rapidjson/internal/itoa.h +0 -308
  230. data/ext/rj_schema/rapidjson/include/rapidjson/internal/meta.h +0 -186
  231. data/ext/rj_schema/rapidjson/include/rapidjson/internal/pow10.h +0 -55
  232. data/ext/rj_schema/rapidjson/include/rapidjson/internal/regex.h +0 -732
  233. data/ext/rj_schema/rapidjson/include/rapidjson/internal/stack.h +0 -231
  234. data/ext/rj_schema/rapidjson/include/rapidjson/internal/strfunc.h +0 -69
  235. data/ext/rj_schema/rapidjson/include/rapidjson/internal/strtod.h +0 -290
  236. data/ext/rj_schema/rapidjson/include/rapidjson/internal/swap.h +0 -46
  237. data/ext/rj_schema/rapidjson/include/rapidjson/istreamwrapper.h +0 -113
  238. data/ext/rj_schema/rapidjson/include/rapidjson/memorybuffer.h +0 -70
  239. data/ext/rj_schema/rapidjson/include/rapidjson/memorystream.h +0 -71
  240. data/ext/rj_schema/rapidjson/include/rapidjson/msinttypes/inttypes.h +0 -316
  241. data/ext/rj_schema/rapidjson/include/rapidjson/msinttypes/stdint.h +0 -300
  242. data/ext/rj_schema/rapidjson/include/rapidjson/ostreamwrapper.h +0 -81
  243. data/ext/rj_schema/rapidjson/include/rapidjson/pointer.h +0 -1357
  244. data/ext/rj_schema/rapidjson/include/rapidjson/prettywriter.h +0 -277
  245. data/ext/rj_schema/rapidjson/include/rapidjson/rapidjson.h +0 -630
  246. data/ext/rj_schema/rapidjson/include/rapidjson/reader.h +0 -2230
  247. data/ext/rj_schema/rapidjson/include/rapidjson/schema.h +0 -2494
  248. data/ext/rj_schema/rapidjson/include/rapidjson/stream.h +0 -223
  249. data/ext/rj_schema/rapidjson/include/rapidjson/stringbuffer.h +0 -121
  250. data/ext/rj_schema/rapidjson/include/rapidjson/writer.h +0 -710
  251. data/ext/rj_schema/rapidjson/include_dirs.js +0 -2
  252. data/ext/rj_schema/rapidjson/library.json +0 -15
  253. data/ext/rj_schema/rapidjson/license.txt +0 -57
  254. data/ext/rj_schema/rapidjson/package.json +0 -24
  255. data/ext/rj_schema/rapidjson/rapidjson.autopkg +0 -77
  256. data/ext/rj_schema/rapidjson/readme.md +0 -160
  257. data/ext/rj_schema/rapidjson/readme.zh-cn.md +0 -152
  258. data/ext/rj_schema/rapidjson/test/CMakeLists.txt +0 -20
  259. data/ext/rj_schema/rapidjson/test/perftest/CMakeLists.txt +0 -28
  260. data/ext/rj_schema/rapidjson/test/perftest/misctest.cpp +0 -974
  261. data/ext/rj_schema/rapidjson/test/perftest/perftest.cpp +0 -24
  262. data/ext/rj_schema/rapidjson/test/perftest/perftest.h +0 -185
  263. data/ext/rj_schema/rapidjson/test/perftest/platformtest.cpp +0 -166
  264. data/ext/rj_schema/rapidjson/test/perftest/rapidjsontest.cpp +0 -472
  265. data/ext/rj_schema/rapidjson/test/perftest/schematest.cpp +0 -223
  266. data/ext/rj_schema/rapidjson/test/unittest/CMakeLists.txt +0 -92
  267. data/ext/rj_schema/rapidjson/test/unittest/allocatorstest.cpp +0 -100
  268. data/ext/rj_schema/rapidjson/test/unittest/bigintegertest.cpp +0 -138
  269. data/ext/rj_schema/rapidjson/test/unittest/cursorstreamwrappertest.cpp +0 -115
  270. data/ext/rj_schema/rapidjson/test/unittest/documenttest.cpp +0 -672
  271. data/ext/rj_schema/rapidjson/test/unittest/dtoatest.cpp +0 -98
  272. data/ext/rj_schema/rapidjson/test/unittest/encodedstreamtest.cpp +0 -313
  273. data/ext/rj_schema/rapidjson/test/unittest/encodingstest.cpp +0 -451
  274. data/ext/rj_schema/rapidjson/test/unittest/filestreamtest.cpp +0 -112
  275. data/ext/rj_schema/rapidjson/test/unittest/fwdtest.cpp +0 -230
  276. data/ext/rj_schema/rapidjson/test/unittest/istreamwrappertest.cpp +0 -181
  277. data/ext/rj_schema/rapidjson/test/unittest/itoatest.cpp +0 -160
  278. data/ext/rj_schema/rapidjson/test/unittest/jsoncheckertest.cpp +0 -143
  279. data/ext/rj_schema/rapidjson/test/unittest/namespacetest.cpp +0 -70
  280. data/ext/rj_schema/rapidjson/test/unittest/ostreamwrappertest.cpp +0 -92
  281. data/ext/rj_schema/rapidjson/test/unittest/pointertest.cpp +0 -1529
  282. data/ext/rj_schema/rapidjson/test/unittest/prettywritertest.cpp +0 -373
  283. data/ext/rj_schema/rapidjson/test/unittest/readertest.cpp +0 -2190
  284. data/ext/rj_schema/rapidjson/test/unittest/regextest.cpp +0 -638
  285. data/ext/rj_schema/rapidjson/test/unittest/schematest.cpp +0 -2072
  286. data/ext/rj_schema/rapidjson/test/unittest/simdtest.cpp +0 -219
  287. data/ext/rj_schema/rapidjson/test/unittest/strfunctest.cpp +0 -30
  288. data/ext/rj_schema/rapidjson/test/unittest/stringbuffertest.cpp +0 -192
  289. data/ext/rj_schema/rapidjson/test/unittest/strtodtest.cpp +0 -132
  290. data/ext/rj_schema/rapidjson/test/unittest/unittest.cpp +0 -51
  291. data/ext/rj_schema/rapidjson/test/unittest/unittest.h +0 -140
  292. data/ext/rj_schema/rapidjson/test/unittest/valuetest.cpp +0 -1851
  293. data/ext/rj_schema/rapidjson/test/unittest/writertest.cpp +0 -598
  294. data/ext/rj_schema/rapidjson/test/valgrind.supp +0 -17
  295. data/ext/rj_schema/rapidjson/thirdparty/gtest/CMakeLists.txt +0 -16
  296. data/ext/rj_schema/rapidjson/thirdparty/gtest/README.md +0 -141
  297. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CHANGES +0 -126
  298. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CMakeLists.txt +0 -202
  299. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CONTRIBUTORS +0 -40
  300. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/LICENSE +0 -28
  301. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/Makefile.am +0 -224
  302. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/README.md +0 -333
  303. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/configure.ac +0 -146
  304. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/CheatSheet.md +0 -562
  305. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/CookBook.md +0 -3675
  306. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/DesignDoc.md +0 -280
  307. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/DevGuide.md +0 -132
  308. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/Documentation.md +0 -12
  309. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/ForDummies.md +0 -439
  310. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/FrequentlyAskedQuestions.md +0 -628
  311. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/KnownIssues.md +0 -19
  312. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_5/CheatSheet.md +0 -525
  313. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_5/CookBook.md +0 -3250
  314. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_5/Documentation.md +0 -11
  315. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_5/ForDummies.md +0 -439
  316. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_5/FrequentlyAskedQuestions.md +0 -624
  317. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_6/CheatSheet.md +0 -534
  318. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_6/CookBook.md +0 -3342
  319. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_6/Documentation.md +0 -12
  320. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_6/ForDummies.md +0 -439
  321. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_6/FrequentlyAskedQuestions.md +0 -628
  322. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_7/CheatSheet.md +0 -556
  323. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_7/CookBook.md +0 -3432
  324. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_7/Documentation.md +0 -12
  325. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_7/ForDummies.md +0 -439
  326. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_7/FrequentlyAskedQuestions.md +0 -628
  327. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-actions.h +0 -1205
  328. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-cardinalities.h +0 -147
  329. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-actions.h +0 -2377
  330. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-actions.h.pump +0 -794
  331. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h +0 -1095
  332. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump +0 -291
  333. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-matchers.h +0 -2179
  334. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-matchers.h.pump +0 -672
  335. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-nice-strict.h +0 -397
  336. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-nice-strict.h.pump +0 -161
  337. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-matchers.h +0 -4399
  338. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-more-actions.h +0 -246
  339. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-more-matchers.h +0 -58
  340. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-spec-builders.h +0 -1847
  341. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock.h +0 -94
  342. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h +0 -8
  343. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump +0 -10
  344. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-matchers.h +0 -39
  345. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-port.h +0 -46
  346. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h +0 -279
  347. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump +0 -136
  348. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-internal-utils.h +0 -511
  349. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-port.h +0 -91
  350. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/make/Makefile +0 -101
  351. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock.sln +0 -32
  352. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock.vcproj +0 -191
  353. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_config.vsprops +0 -15
  354. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_main.vcproj +0 -187
  355. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_test.vcproj +0 -201
  356. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock.sln +0 -32
  357. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock.vcxproj +0 -82
  358. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_config.props +0 -19
  359. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_main.vcxproj +0 -88
  360. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_test.vcxproj +0 -101
  361. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock.sln +0 -32
  362. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock.vcxproj +0 -84
  363. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_config.props +0 -19
  364. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_main.vcxproj +0 -90
  365. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_test.vcxproj +0 -103
  366. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/fuse_gmock_files.py +0 -240
  367. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/LICENSE +0 -203
  368. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/README +0 -35
  369. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/README.cppclean +0 -115
  370. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/__init__.py +0 -0
  371. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/ast.py +0 -1733
  372. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/gmock_class.py +0 -227
  373. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/gmock_class_test.py +0 -448
  374. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/keywords.py +0 -59
  375. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/tokenize.py +0 -287
  376. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/utils.py +0 -41
  377. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/gmock_gen.py +0 -31
  378. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/gmock-config.in +0 -303
  379. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/gmock_doctor.py +0 -640
  380. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/upload.py +0 -1387
  381. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/upload_gmock.py +0 -78
  382. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-all.cc +0 -47
  383. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-cardinalities.cc +0 -156
  384. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-internal-utils.cc +0 -174
  385. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-matchers.cc +0 -498
  386. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-spec-builders.cc +0 -823
  387. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock.cc +0 -183
  388. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock_main.cc +0 -54
  389. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-actions_test.cc +0 -1411
  390. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-cardinalities_test.cc +0 -428
  391. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-actions_test.cc +0 -1228
  392. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-function-mockers_test.cc +0 -622
  393. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-internal-utils_test.cc +0 -127
  394. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-matchers_test.cc +0 -1286
  395. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-internal-utils_test.cc +0 -699
  396. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-matchers_test.cc +0 -5648
  397. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-more-actions_test.cc +0 -708
  398. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-nice-strict_test.cc +0 -424
  399. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-port_test.cc +0 -43
  400. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-spec-builders_test.cc +0 -2644
  401. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_all_test.cc +0 -51
  402. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_ex_test.cc +0 -81
  403. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_leak_test.py +0 -108
  404. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_leak_test_.cc +0 -100
  405. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link2_test.cc +0 -40
  406. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link_test.cc +0 -40
  407. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link_test.h +0 -669
  408. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test.py +0 -180
  409. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test_.cc +0 -291
  410. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test_golden.txt +0 -310
  411. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_stress_test.cc +0 -322
  412. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_test.cc +0 -220
  413. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_test_utils.py +0 -112
  414. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CHANGES +0 -157
  415. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CMakeLists.txt +0 -286
  416. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CONTRIBUTORS +0 -37
  417. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/LICENSE +0 -28
  418. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/Makefile.am +0 -310
  419. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/README.md +0 -280
  420. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/cmake/internal_utils.cmake +0 -242
  421. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest.cbproj +0 -138
  422. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest.groupproj +0 -54
  423. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_all.cc +0 -38
  424. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_link.cc +0 -40
  425. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_main.cbproj +0 -82
  426. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_unittest.cbproj +0 -88
  427. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/configure.ac +0 -68
  428. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/AdvancedGuide.md +0 -2182
  429. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/DevGuide.md +0 -126
  430. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/Documentation.md +0 -14
  431. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/FAQ.md +0 -1087
  432. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/Primer.md +0 -502
  433. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/PumpManual.md +0 -177
  434. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/Samples.md +0 -14
  435. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_AdvancedGuide.md +0 -2096
  436. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_Documentation.md +0 -12
  437. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_FAQ.md +0 -886
  438. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_Primer.md +0 -497
  439. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_PumpManual.md +0 -177
  440. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_XcodeGuide.md +0 -93
  441. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_AdvancedGuide.md +0 -2178
  442. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_Documentation.md +0 -14
  443. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_FAQ.md +0 -1038
  444. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_Primer.md +0 -501
  445. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_PumpManual.md +0 -177
  446. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_Samples.md +0 -14
  447. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_XcodeGuide.md +0 -93
  448. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_AdvancedGuide.md +0 -2181
  449. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_Documentation.md +0 -14
  450. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_FAQ.md +0 -1082
  451. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_Primer.md +0 -501
  452. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_PumpManual.md +0 -177
  453. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_Samples.md +0 -14
  454. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_XcodeGuide.md +0 -93
  455. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/XcodeGuide.md +0 -93
  456. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-death-test.h +0 -294
  457. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-message.h +0 -250
  458. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-param-test.h +0 -1444
  459. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-param-test.h.pump +0 -510
  460. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-printers.h +0 -993
  461. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-spi.h +0 -232
  462. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-test-part.h +0 -179
  463. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-typed-test.h +0 -263
  464. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest.h +0 -2236
  465. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest_pred_impl.h +0 -358
  466. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest_prod.h +0 -58
  467. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest-port.h +0 -69
  468. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest-printers.h +0 -42
  469. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest.h +0 -41
  470. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-death-test-internal.h +0 -319
  471. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-filepath.h +0 -206
  472. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-internal.h +0 -1238
  473. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-linked_ptr.h +0 -243
  474. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util-generated.h +0 -5146
  475. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +0 -286
  476. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util.h +0 -731
  477. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-port-arch.h +0 -93
  478. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-port.h +0 -2554
  479. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-string.h +0 -167
  480. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-tuple.h +0 -1020
  481. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-tuple.h.pump +0 -347
  482. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-type-util.h +0 -3331
  483. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-type-util.h.pump +0 -297
  484. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/m4/acx_pthread.m4 +0 -363
  485. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/m4/gtest.m4 +0 -74
  486. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/make/Makefile +0 -82
  487. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest-md.sln +0 -45
  488. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest-md.vcproj +0 -126
  489. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest.sln +0 -45
  490. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest.vcproj +0 -126
  491. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_main-md.vcproj +0 -129
  492. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_main.vcproj +0 -129
  493. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_prod_test-md.vcproj +0 -164
  494. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_prod_test.vcproj +0 -164
  495. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_unittest-md.vcproj +0 -147
  496. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_unittest.vcproj +0 -147
  497. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/prime_tables.h +0 -123
  498. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1.cc +0 -68
  499. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1.h +0 -43
  500. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample10_unittest.cc +0 -144
  501. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1_unittest.cc +0 -153
  502. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2.cc +0 -56
  503. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2.h +0 -85
  504. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2_unittest.cc +0 -109
  505. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample3-inl.h +0 -172
  506. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample3_unittest.cc +0 -151
  507. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4.cc +0 -46
  508. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4.h +0 -53
  509. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4_unittest.cc +0 -45
  510. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample5_unittest.cc +0 -199
  511. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample6_unittest.cc +0 -224
  512. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample7_unittest.cc +0 -130
  513. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample8_unittest.cc +0 -173
  514. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample9_unittest.cc +0 -160
  515. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/common.py +0 -83
  516. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/fuse_gtest_files.py +0 -253
  517. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/gen_gtest_pred_impl.py +0 -730
  518. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/gtest-config.in +0 -274
  519. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/pump.py +0 -855
  520. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/release_docs.py +0 -158
  521. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/test/Makefile +0 -59
  522. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/upload.py +0 -1387
  523. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/upload_gtest.py +0 -78
  524. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-all.cc +0 -48
  525. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-death-test.cc +0 -1342
  526. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-filepath.cc +0 -387
  527. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-internal-inl.h +0 -1183
  528. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-port.cc +0 -1259
  529. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-printers.cc +0 -373
  530. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-test-part.cc +0 -110
  531. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-typed-test.cc +0 -118
  532. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest.cc +0 -5388
  533. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest_main.cc +0 -38
  534. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-death-test_ex_test.cc +0 -93
  535. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-death-test_test.cc +0 -1427
  536. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-filepath_test.cc +0 -662
  537. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-linked_ptr_test.cc +0 -154
  538. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-listener_test.cc +0 -311
  539. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-message_test.cc +0 -159
  540. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-options_test.cc +0 -215
  541. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test2_test.cc +0 -65
  542. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test_test.cc +0 -1055
  543. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test_test.h +0 -57
  544. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-port_test.cc +0 -1304
  545. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-printers_test.cc +0 -1635
  546. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-test-part_test.cc +0 -208
  547. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-tuple_test.cc +0 -320
  548. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test2_test.cc +0 -45
  549. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test_test.cc +0 -380
  550. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test_test.h +0 -66
  551. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-unittest-api_test.cc +0 -341
  552. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_all_test.cc +0 -47
  553. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_break_on_failure_unittest.py +0 -212
  554. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_break_on_failure_unittest_.cc +0 -88
  555. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_catch_exceptions_test.py +0 -237
  556. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_catch_exceptions_test_.cc +0 -311
  557. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_color_test.py +0 -130
  558. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_color_test_.cc +0 -71
  559. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_env_var_test.py +0 -117
  560. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_env_var_test_.cc +0 -126
  561. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_environment_test.cc +0 -192
  562. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_filter_unittest.py +0 -636
  563. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_filter_unittest_.cc +0 -140
  564. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_help_test.py +0 -172
  565. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_help_test_.cc +0 -46
  566. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_list_tests_unittest.py +0 -207
  567. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_list_tests_unittest_.cc +0 -157
  568. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_main_unittest.cc +0 -45
  569. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_no_test_unittest.cc +0 -56
  570. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test.py +0 -340
  571. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test_.cc +0 -1062
  572. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test_golden_lin.txt +0 -743
  573. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_pred_impl_unittest.cc +0 -2427
  574. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_premature_exit_test.cc +0 -127
  575. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_prod_test.cc +0 -57
  576. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_repeat_test.cc +0 -253
  577. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_shuffle_test.py +0 -325
  578. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_shuffle_test_.cc +0 -103
  579. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_sole_header_test.cc +0 -57
  580. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_stress_test.cc +0 -256
  581. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_test_utils.py +0 -320
  582. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_ex_test.cc +0 -92
  583. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_test.py +0 -171
  584. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_test_.cc +0 -72
  585. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_uninitialized_test.py +0 -70
  586. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_uninitialized_test_.cc +0 -43
  587. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_unittest.cc +0 -7706
  588. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfile1_test_.cc +0 -49
  589. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfile2_test_.cc +0 -49
  590. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfiles_test.py +0 -132
  591. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_output_unittest.py +0 -308
  592. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_output_unittest_.cc +0 -181
  593. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_test_utils.py +0 -194
  594. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/production.cc +0 -36
  595. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/production.h +0 -55
  596. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/DebugProject.xcconfig +0 -30
  597. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/FrameworkTarget.xcconfig +0 -17
  598. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/General.xcconfig +0 -41
  599. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/ReleaseProject.xcconfig +0 -32
  600. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/StaticLibraryTarget.xcconfig +0 -18
  601. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/TestTarget.xcconfig +0 -8
  602. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Resources/Info.plist +0 -30
  603. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/Info.plist +0 -28
  604. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj +0 -457
  605. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/runtests.sh +0 -62
  606. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget.cc +0 -63
  607. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget.h +0 -59
  608. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget_test.cc +0 -68
  609. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Scripts/runtests.sh +0 -65
  610. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Scripts/versiongenerate.py +0 -100
  611. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/gtest.xcodeproj/project.pbxproj +0 -1135
  612. data/ext/rj_schema/rapidjson/thirdparty/gtest/travis.sh +0 -15
  613. data/ext/rj_schema/rapidjson/travis-doxygen.sh +0 -121
@@ -1,373 +0,0 @@
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
@@ -1,2190 +0,0 @@
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, 0, 310);
653
- }
654
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e309", 0, 5);
655
-
656
- // Miss fraction part in number.
657
- TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.", 2, 2);
658
- TEST_NUMBER_ERROR(kParseErrorNumberMissFraction, "1.a", 2, 2);
659
-
660
- // Miss exponent in number.
661
- TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e", 2, 2);
662
- TEST_NUMBER_ERROR(kParseErrorNumberMissExponent, "1e_", 2, 2);
663
-
664
- // Issue 849
665
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.8e308", 0, 7);
666
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "5e308", 0, 5);
667
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e309", 0, 5);
668
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.0e310", 0, 7);
669
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1.00e310", 0, 8);
670
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "-1.8e308", 0, 8);
671
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "-1e309", 0, 6);
672
-
673
- // Issue 1253
674
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "2e308", 0, 5);
675
-
676
- // Issue 1259
677
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
678
- "88474320368547737236837236775298547354737253685475547552933720368546854775297525"
679
- "29337203685468547770151233720097201372368547312337203687203685423685123372036872"
680
- "03685473724737236837236775297525854775297525472975254737236873720170151235473783"
681
- "7236737247372368772473723683723456789012E66", 0, 283);
682
-
683
- #if 0
684
- // Test (length + exponent) overflow
685
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+2147483647", 0, 13);
686
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+9223372036854775807", 0, 22);
687
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+10000", 0, 8);
688
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig, "1e+50000", 0, 8);
689
- #endif
690
-
691
- // 9007199254740992 * 2^971 ("infinity")
692
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
693
- "1.797693134862315907729305190789024733617976978942306572734300811577326758055009"
694
- "63132708477322407536021120113879871393357658789768814416622492847430639474124377"
695
- "76789342486548527630221960124609411945308295208500576883815068234246288147391311"
696
- "0540827237163350510684586298239947245938479716304835356329624224137216e+308", 0, 315);
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", 0, 1125);
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", 0, 1205);
736
- }
737
-
738
- TEST_NUMBER_ERROR(kParseErrorNumberTooBig,
739
- "10000000000000000000000000000000000000000000000000000000000000000000000000000000"
740
- "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
741
- "00000000000000000000000000000000000000000000000000000000000000000000000000000000"
742
- "0000000000000000000000000000000000000000000000000000000000000000000001", 0, 310);
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\"]", 2, 3);
935
-
936
- // Incorrect hex digit after \\u escape in string.
937
- TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uABCG\"]", 2, 7);
938
-
939
- // Quotation in \\u escape in string (Issue #288)
940
- TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uaaa\"]", 2, 7);
941
- TEST_STRING_ERROR(kParseErrorStringUnicodeEscapeInvalidHex, "[\"\\uD800\\uFFF\"]", 2, 13);
942
-
943
- // The surrogate pair in string is invalid.
944
- TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800X\"]", 2, 8);
945
- TEST_STRING_ERROR(kParseErrorStringUnicodeSurrogateInvalid, "[\"\\uD800\\uFFFF\"]", 2, 14);
946
-
947
- // Missing a closing quotation mark in string.
948
- TEST_STRING_ERROR(kParseErrorStringMissQuotationMark, "[\"Test]", 7, 7);
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
- int 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, 2, 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
- int 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", 2);
1079
- TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1}", 2);
1080
- TEST_ARRAY_ERROR(kParseErrorArrayMissCommaOrSquareBracket, "[1 2]", 3);
1081
-
1082
- // Array cannot have a trailing comma (without kParseTrailingCommasFlag);
1083
- // a value must follow a comma
1084
- TEST_ARRAY_ERROR(kParseErrorValueInvalid, "[1,]", 3);
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
- int 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, "", 0);
1248
- TEST_ERROR(kParseErrorDocumentEmpty, " ", 1);
1249
- TEST_ERROR(kParseErrorDocumentEmpty, " \n", 2);
1250
-
1251
- // The document root must not follow by other values.
1252
- TEST_ERROR(kParseErrorDocumentRootNotSingular, "[] 0", 3);
1253
- TEST_ERROR(kParseErrorDocumentRootNotSingular, "{} 0", 3);
1254
- TEST_ERROR(kParseErrorDocumentRootNotSingular, "null []", 5);
1255
- TEST_ERROR(kParseErrorDocumentRootNotSingular, "0 {}", 2);
1256
- }
1257
-
1258
- TEST(Reader, ParseValue_Error) {
1259
- // Invalid value.
1260
- TEST_ERROR(kParseErrorValueInvalid, "nulL", 3);
1261
- TEST_ERROR(kParseErrorValueInvalid, "truE", 3);
1262
- TEST_ERROR(kParseErrorValueInvalid, "falsE", 4);
1263
- TEST_ERROR(kParseErrorValueInvalid, "a]", 0);
1264
- TEST_ERROR(kParseErrorValueInvalid, ".1", 0);
1265
- }
1266
-
1267
- TEST(Reader, ParseObject_Error) {
1268
- // Missing a name for object member.
1269
- TEST_ERROR(kParseErrorObjectMissName, "{1}", 1);
1270
- TEST_ERROR(kParseErrorObjectMissName, "{:1}", 1);
1271
- TEST_ERROR(kParseErrorObjectMissName, "{null:1}", 1);
1272
- TEST_ERROR(kParseErrorObjectMissName, "{true:1}", 1);
1273
- TEST_ERROR(kParseErrorObjectMissName, "{false:1}", 1);
1274
- TEST_ERROR(kParseErrorObjectMissName, "{1:1}", 1);
1275
- TEST_ERROR(kParseErrorObjectMissName, "{[]:1}", 1);
1276
- TEST_ERROR(kParseErrorObjectMissName, "{{}:1}", 1);
1277
- TEST_ERROR(kParseErrorObjectMissName, "{xyz:1}", 1);
1278
-
1279
- // Missing a colon after a name of object member.
1280
- TEST_ERROR(kParseErrorObjectMissColon, "{\"a\" 1}", 5);
1281
- TEST_ERROR(kParseErrorObjectMissColon, "{\"a\",1}", 4);
1282
-
1283
- // Must be a comma or '}' after an object member
1284
- TEST_ERROR(kParseErrorObjectMissCommaOrCurlyBracket, "{\"a\":1]", 6);
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,}", 7);
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
- int 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
-
1980
- template <unsigned extraFlags>
1981
- void TestTrailingCommas() {
1982
- {
1983
- StringStream s("[1,2,3,]");
1984
- ParseArrayHandler<3> h;
1985
- Reader reader;
1986
- EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
1987
- EXPECT_EQ(5u, h.step_);
1988
- }
1989
- {
1990
- const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
1991
- "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3],}";
1992
- StringStream s(json);
1993
- ParseObjectHandler h;
1994
- Reader reader;
1995
- EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
1996
- EXPECT_EQ(20u, h.step_);
1997
- }
1998
- {
1999
- // whitespace around trailing commas
2000
- const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
2001
- "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3\n,\n]\n,\n} ";
2002
- StringStream s(json);
2003
- ParseObjectHandler h;
2004
- Reader reader;
2005
- EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h));
2006
- EXPECT_EQ(20u, h.step_);
2007
- }
2008
- {
2009
- // comments around trailing commas
2010
- const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null,"
2011
- "\"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3/*test*/,/*test*/]/*test*/,/*test*/}";
2012
- StringStream s(json);
2013
- ParseObjectHandler h;
2014
- Reader reader;
2015
- EXPECT_TRUE(reader.Parse<extraFlags|kParseTrailingCommasFlag|kParseCommentsFlag>(s, h));
2016
- EXPECT_EQ(20u, h.step_);
2017
- }
2018
- }
2019
-
2020
- TEST(Reader, TrailingCommas) {
2021
- TestTrailingCommas<kParseNoFlags>();
2022
- }
2023
-
2024
- TEST(Reader, TrailingCommasIterative) {
2025
- TestTrailingCommas<kParseIterativeFlag>();
2026
- }
2027
-
2028
- template <unsigned extraFlags>
2029
- void TestMultipleTrailingCommaErrors() {
2030
- // only a single trailing comma is allowed.
2031
- {
2032
- StringStream s("[1,2,3,,]");
2033
- ParseArrayHandler<3> h;
2034
- Reader reader;
2035
- ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2036
- EXPECT_TRUE(reader.HasParseError());
2037
- EXPECT_EQ(kParseErrorValueInvalid, r.Code());
2038
- EXPECT_EQ(7u, r.Offset());
2039
- }
2040
- {
2041
- const char* json = "{ \"hello\" : \"world\", \"t\" : true , \"f\" : false,"
2042
- "\"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3,],,}";
2043
- StringStream s(json);
2044
- ParseObjectHandler h;
2045
- Reader reader;
2046
- ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2047
- EXPECT_TRUE(reader.HasParseError());
2048
- EXPECT_EQ(kParseErrorObjectMissName, r.Code());
2049
- EXPECT_EQ(95u, r.Offset());
2050
- }
2051
- }
2052
-
2053
- TEST(Reader, MultipleTrailingCommaErrors) {
2054
- TestMultipleTrailingCommaErrors<kParseNoFlags>();
2055
- }
2056
-
2057
- TEST(Reader, MultipleTrailingCommaErrorsIterative) {
2058
- TestMultipleTrailingCommaErrors<kParseIterativeFlag>();
2059
- }
2060
-
2061
- template <unsigned extraFlags>
2062
- void TestEmptyExceptForCommaErrors() {
2063
- // not allowed even with trailing commas enabled; the
2064
- // trailing comma must follow a value.
2065
- {
2066
- StringStream s("[,]");
2067
- ParseArrayHandler<3> h;
2068
- Reader reader;
2069
- ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2070
- EXPECT_TRUE(reader.HasParseError());
2071
- EXPECT_EQ(kParseErrorValueInvalid, r.Code());
2072
- EXPECT_EQ(1u, r.Offset());
2073
- }
2074
- {
2075
- StringStream s("{,}");
2076
- ParseObjectHandler h;
2077
- Reader reader;
2078
- ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2079
- EXPECT_TRUE(reader.HasParseError());
2080
- EXPECT_EQ(kParseErrorObjectMissName, r.Code());
2081
- EXPECT_EQ(1u, r.Offset());
2082
- }
2083
- }
2084
-
2085
- TEST(Reader, EmptyExceptForCommaErrors) {
2086
- TestEmptyExceptForCommaErrors<kParseNoFlags>();
2087
- }
2088
-
2089
- TEST(Reader, EmptyExceptForCommaErrorsIterative) {
2090
- TestEmptyExceptForCommaErrors<kParseIterativeFlag>();
2091
- }
2092
-
2093
- template <unsigned extraFlags>
2094
- void TestTrailingCommaHandlerTermination() {
2095
- {
2096
- HandlerTerminateAtEndArray h;
2097
- Reader reader;
2098
- StringStream s("[1,2,3,]");
2099
- ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2100
- EXPECT_TRUE(reader.HasParseError());
2101
- EXPECT_EQ(kParseErrorTermination, r.Code());
2102
- EXPECT_EQ(7u, r.Offset());
2103
- }
2104
- {
2105
- HandlerTerminateAtEndObject h;
2106
- Reader reader;
2107
- StringStream s("{\"t\": true, \"f\": false,}");
2108
- ParseResult r = reader.Parse<extraFlags|kParseTrailingCommasFlag>(s, h);
2109
- EXPECT_TRUE(reader.HasParseError());
2110
- EXPECT_EQ(kParseErrorTermination, r.Code());
2111
- EXPECT_EQ(23u, r.Offset());
2112
- }
2113
- }
2114
-
2115
- TEST(Reader, TrailingCommaHandlerTermination) {
2116
- TestTrailingCommaHandlerTermination<kParseNoFlags>();
2117
- }
2118
-
2119
- TEST(Reader, TrailingCommaHandlerTerminationIterative) {
2120
- TestTrailingCommaHandlerTermination<kParseIterativeFlag>();
2121
- }
2122
-
2123
- TEST(Reader, ParseNanAndInfinity) {
2124
- #define TEST_NAN_INF(str, x) \
2125
- { \
2126
- { \
2127
- StringStream s(str); \
2128
- ParseDoubleHandler h; \
2129
- Reader reader; \
2130
- ASSERT_EQ(kParseErrorNone, reader.Parse<kParseNanAndInfFlag>(s, h).Code()); \
2131
- EXPECT_EQ(1u, h.step_); \
2132
- internal::Double e(x), a(h.actual_); \
2133
- EXPECT_EQ(e.IsNan(), a.IsNan()); \
2134
- EXPECT_EQ(e.IsInf(), a.IsInf()); \
2135
- if (!e.IsNan()) \
2136
- EXPECT_EQ(e.Sign(), a.Sign()); \
2137
- } \
2138
- { \
2139
- const char* json = "{ \"naninfdouble\": " str " } "; \
2140
- StringStream s(json); \
2141
- NumbersAsStringsHandler h(str); \
2142
- Reader reader; \
2143
- EXPECT_TRUE(reader.Parse<kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \
2144
- } \
2145
- { \
2146
- char* json = StrDup("{ \"naninfdouble\": " str " } "); \
2147
- InsituStringStream s(json); \
2148
- NumbersAsStringsHandler h(str); \
2149
- Reader reader; \
2150
- EXPECT_TRUE(reader.Parse<kParseInsituFlag|kParseNumbersAsStringsFlag|kParseNanAndInfFlag>(s, h)); \
2151
- free(json); \
2152
- } \
2153
- }
2154
- #define TEST_NAN_INF_ERROR(errorCode, str, errorOffset) \
2155
- { \
2156
- int streamPos = errorOffset; \
2157
- char buffer[1001]; \
2158
- strncpy(buffer, str, 1000); \
2159
- InsituStringStream s(buffer); \
2160
- BaseReaderHandler<> h; \
2161
- Reader reader; \
2162
- EXPECT_FALSE(reader.Parse<kParseNanAndInfFlag>(s, h)); \
2163
- EXPECT_EQ(errorCode, reader.GetParseErrorCode());\
2164
- EXPECT_EQ(errorOffset, reader.GetErrorOffset());\
2165
- EXPECT_EQ(streamPos, s.Tell());\
2166
- }
2167
-
2168
- double nan = std::numeric_limits<double>::quiet_NaN();
2169
- double inf = std::numeric_limits<double>::infinity();
2170
-
2171
- TEST_NAN_INF("NaN", nan);
2172
- TEST_NAN_INF("-NaN", nan);
2173
- TEST_NAN_INF("Inf", inf);
2174
- TEST_NAN_INF("Infinity", inf);
2175
- TEST_NAN_INF("-Inf", -inf);
2176
- TEST_NAN_INF("-Infinity", -inf);
2177
- TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NInf", 1);
2178
- TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NaInf", 2);
2179
- TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "INan", 1);
2180
- TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "InNan", 2);
2181
- TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "nan", 1);
2182
- TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-nan", 1);
2183
- TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NAN", 1);
2184
- TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-Infinty", 6);
2185
-
2186
- #undef TEST_NAN_INF_ERROR
2187
- #undef TEST_NAN_INF
2188
- }
2189
-
2190
- RAPIDJSON_DIAG_POP