rj_schema 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (299) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +18 -0
  3. data/ext/rj_schema/extconf.rb +7 -0
  4. data/ext/rj_schema/rapidjson/CHANGELOG.md +158 -0
  5. data/ext/rj_schema/rapidjson/CMakeLists.txt +221 -0
  6. data/ext/rj_schema/rapidjson/CMakeModules/FindGTestSrc.cmake +30 -0
  7. data/ext/rj_schema/rapidjson/RapidJSON.pc.in +7 -0
  8. data/ext/rj_schema/rapidjson/RapidJSONConfig.cmake.in +15 -0
  9. data/ext/rj_schema/rapidjson/RapidJSONConfigVersion.cmake.in +10 -0
  10. data/ext/rj_schema/rapidjson/appveyor.yml +41 -0
  11. data/ext/rj_schema/rapidjson/bin/data/glossary.json +22 -0
  12. data/ext/rj_schema/rapidjson/bin/data/menu.json +27 -0
  13. data/ext/rj_schema/rapidjson/bin/data/readme.txt +1 -0
  14. data/ext/rj_schema/rapidjson/bin/data/sample.json +3315 -0
  15. data/ext/rj_schema/rapidjson/bin/data/webapp.json +88 -0
  16. data/ext/rj_schema/rapidjson/bin/data/widget.json +26 -0
  17. data/ext/rj_schema/rapidjson/bin/draft-04/schema +150 -0
  18. data/ext/rj_schema/rapidjson/bin/encodings/utf16be.json +0 -0
  19. data/ext/rj_schema/rapidjson/bin/encodings/utf16bebom.json +0 -0
  20. data/ext/rj_schema/rapidjson/bin/encodings/utf16le.json +0 -0
  21. data/ext/rj_schema/rapidjson/bin/encodings/utf16lebom.json +0 -0
  22. data/ext/rj_schema/rapidjson/bin/encodings/utf32be.json +0 -0
  23. data/ext/rj_schema/rapidjson/bin/encodings/utf32bebom.json +0 -0
  24. data/ext/rj_schema/rapidjson/bin/encodings/utf32le.json +0 -0
  25. data/ext/rj_schema/rapidjson/bin/encodings/utf32lebom.json +0 -0
  26. data/ext/rj_schema/rapidjson/bin/encodings/utf8.json +7 -0
  27. data/ext/rj_schema/rapidjson/bin/encodings/utf8bom.json +7 -0
  28. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail1.json +1 -0
  29. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail10.json +1 -0
  30. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail11.json +1 -0
  31. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail12.json +1 -0
  32. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail13.json +1 -0
  33. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail14.json +1 -0
  34. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail15.json +1 -0
  35. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail16.json +1 -0
  36. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail17.json +1 -0
  37. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail18.json +1 -0
  38. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail19.json +1 -0
  39. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail2.json +1 -0
  40. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail20.json +1 -0
  41. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail21.json +1 -0
  42. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail22.json +1 -0
  43. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail23.json +1 -0
  44. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail24.json +1 -0
  45. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail25.json +1 -0
  46. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail26.json +1 -0
  47. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail27.json +2 -0
  48. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail28.json +2 -0
  49. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail29.json +1 -0
  50. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail3.json +1 -0
  51. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail30.json +1 -0
  52. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail31.json +1 -0
  53. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail32.json +1 -0
  54. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail33.json +1 -0
  55. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail4.json +1 -0
  56. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail5.json +1 -0
  57. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail6.json +1 -0
  58. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail7.json +1 -0
  59. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail8.json +1 -0
  60. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail9.json +1 -0
  61. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass1.json +58 -0
  62. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass2.json +1 -0
  63. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass3.json +6 -0
  64. data/ext/rj_schema/rapidjson/bin/jsonchecker/readme.txt +3 -0
  65. data/ext/rj_schema/rapidjson/bin/jsonschema/LICENSE +19 -0
  66. data/ext/rj_schema/rapidjson/bin/jsonschema/README.md +148 -0
  67. data/ext/rj_schema/rapidjson/bin/jsonschema/bin/jsonschema_suite +283 -0
  68. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/folder/folderInteger.json +3 -0
  69. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/integer.json +3 -0
  70. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/subSchemas.json +8 -0
  71. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/additionalItems.json +82 -0
  72. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/additionalProperties.json +88 -0
  73. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/default.json +49 -0
  74. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/dependencies.json +108 -0
  75. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/disallow.json +80 -0
  76. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/divisibleBy.json +60 -0
  77. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/enum.json +71 -0
  78. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/extends.json +94 -0
  79. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/items.json +46 -0
  80. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maxItems.json +28 -0
  81. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maxLength.json +33 -0
  82. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maximum.json +42 -0
  83. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minItems.json +28 -0
  84. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minLength.json +33 -0
  85. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minimum.json +42 -0
  86. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/bignum.json +107 -0
  87. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/format.json +222 -0
  88. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/jsregex.json +18 -0
  89. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/zeroTerminatedFloats.json +15 -0
  90. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/pattern.json +34 -0
  91. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/patternProperties.json +110 -0
  92. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/properties.json +92 -0
  93. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/ref.json +159 -0
  94. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/refRemote.json +74 -0
  95. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/required.json +53 -0
  96. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/type.json +474 -0
  97. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/uniqueItems.json +79 -0
  98. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/additionalItems.json +82 -0
  99. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/additionalProperties.json +88 -0
  100. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/allOf.json +112 -0
  101. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/anyOf.json +68 -0
  102. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/default.json +49 -0
  103. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/definitions.json +32 -0
  104. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/dependencies.json +113 -0
  105. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/enum.json +72 -0
  106. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/items.json +46 -0
  107. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxItems.json +28 -0
  108. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxLength.json +33 -0
  109. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxProperties.json +28 -0
  110. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maximum.json +42 -0
  111. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minItems.json +28 -0
  112. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minLength.json +33 -0
  113. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minProperties.json +28 -0
  114. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minimum.json +42 -0
  115. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/multipleOf.json +60 -0
  116. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/not.json +96 -0
  117. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/oneOf.json +68 -0
  118. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/bignum.json +107 -0
  119. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/format.json +148 -0
  120. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/zeroTerminatedFloats.json +15 -0
  121. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/pattern.json +34 -0
  122. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/patternProperties.json +110 -0
  123. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/properties.json +92 -0
  124. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/ref.json +159 -0
  125. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/refRemote.json +74 -0
  126. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/required.json +39 -0
  127. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/type.json +330 -0
  128. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/uniqueItems.json +79 -0
  129. data/ext/rj_schema/rapidjson/bin/jsonschema/tox.ini +8 -0
  130. data/ext/rj_schema/rapidjson/bin/types/booleans.json +102 -0
  131. data/ext/rj_schema/rapidjson/bin/types/floats.json +102 -0
  132. data/ext/rj_schema/rapidjson/bin/types/guids.json +102 -0
  133. data/ext/rj_schema/rapidjson/bin/types/integers.json +102 -0
  134. data/ext/rj_schema/rapidjson/bin/types/mixed.json +592 -0
  135. data/ext/rj_schema/rapidjson/bin/types/nulls.json +102 -0
  136. data/ext/rj_schema/rapidjson/bin/types/paragraphs.json +102 -0
  137. data/ext/rj_schema/rapidjson/bin/types/readme.txt +1 -0
  138. data/ext/rj_schema/rapidjson/contrib/natvis/LICENSE +45 -0
  139. data/ext/rj_schema/rapidjson/contrib/natvis/README.md +7 -0
  140. data/ext/rj_schema/rapidjson/contrib/natvis/rapidjson.natvis +38 -0
  141. data/ext/rj_schema/rapidjson/doc/CMakeLists.txt +27 -0
  142. data/ext/rj_schema/rapidjson/doc/Doxyfile.in +2369 -0
  143. data/ext/rj_schema/rapidjson/doc/Doxyfile.zh-cn.in +2369 -0
  144. data/ext/rj_schema/rapidjson/doc/diagram/architecture.dot +50 -0
  145. data/ext/rj_schema/rapidjson/doc/diagram/architecture.png +0 -0
  146. data/ext/rj_schema/rapidjson/doc/diagram/insituparsing.dot +65 -0
  147. data/ext/rj_schema/rapidjson/doc/diagram/insituparsing.png +0 -0
  148. data/ext/rj_schema/rapidjson/doc/diagram/iterative-parser-states-diagram.dot +62 -0
  149. data/ext/rj_schema/rapidjson/doc/diagram/iterative-parser-states-diagram.png +0 -0
  150. data/ext/rj_schema/rapidjson/doc/diagram/makefile +8 -0
  151. data/ext/rj_schema/rapidjson/doc/diagram/move1.dot +47 -0
  152. data/ext/rj_schema/rapidjson/doc/diagram/move1.png +0 -0
  153. data/ext/rj_schema/rapidjson/doc/diagram/move2.dot +62 -0
  154. data/ext/rj_schema/rapidjson/doc/diagram/move2.png +0 -0
  155. data/ext/rj_schema/rapidjson/doc/diagram/move3.dot +60 -0
  156. data/ext/rj_schema/rapidjson/doc/diagram/move3.png +0 -0
  157. data/ext/rj_schema/rapidjson/doc/diagram/normalparsing.dot +56 -0
  158. data/ext/rj_schema/rapidjson/doc/diagram/normalparsing.png +0 -0
  159. data/ext/rj_schema/rapidjson/doc/diagram/simpledom.dot +54 -0
  160. data/ext/rj_schema/rapidjson/doc/diagram/simpledom.png +0 -0
  161. data/ext/rj_schema/rapidjson/doc/diagram/tutorial.dot +58 -0
  162. data/ext/rj_schema/rapidjson/doc/diagram/tutorial.png +0 -0
  163. data/ext/rj_schema/rapidjson/doc/diagram/utilityclass.dot +73 -0
  164. data/ext/rj_schema/rapidjson/doc/diagram/utilityclass.png +0 -0
  165. data/ext/rj_schema/rapidjson/doc/dom.md +280 -0
  166. data/ext/rj_schema/rapidjson/doc/dom.zh-cn.md +284 -0
  167. data/ext/rj_schema/rapidjson/doc/encoding.md +146 -0
  168. data/ext/rj_schema/rapidjson/doc/encoding.zh-cn.md +152 -0
  169. data/ext/rj_schema/rapidjson/doc/faq.md +289 -0
  170. data/ext/rj_schema/rapidjson/doc/faq.zh-cn.md +290 -0
  171. data/ext/rj_schema/rapidjson/doc/features.md +104 -0
  172. data/ext/rj_schema/rapidjson/doc/features.zh-cn.md +103 -0
  173. data/ext/rj_schema/rapidjson/doc/internals.md +368 -0
  174. data/ext/rj_schema/rapidjson/doc/internals.zh-cn.md +363 -0
  175. data/ext/rj_schema/rapidjson/doc/logo/rapidjson.png +0 -0
  176. data/ext/rj_schema/rapidjson/doc/logo/rapidjson.svg +119 -0
  177. data/ext/rj_schema/rapidjson/doc/misc/DoxygenLayout.xml +194 -0
  178. data/ext/rj_schema/rapidjson/doc/misc/doxygenextra.css +274 -0
  179. data/ext/rj_schema/rapidjson/doc/misc/footer.html +11 -0
  180. data/ext/rj_schema/rapidjson/doc/misc/header.html +24 -0
  181. data/ext/rj_schema/rapidjson/doc/npm.md +31 -0
  182. data/ext/rj_schema/rapidjson/doc/performance.md +26 -0
  183. data/ext/rj_schema/rapidjson/doc/performance.zh-cn.md +26 -0
  184. data/ext/rj_schema/rapidjson/doc/pointer.md +234 -0
  185. data/ext/rj_schema/rapidjson/doc/pointer.zh-cn.md +234 -0
  186. data/ext/rj_schema/rapidjson/doc/sax.md +509 -0
  187. data/ext/rj_schema/rapidjson/doc/sax.zh-cn.md +487 -0
  188. data/ext/rj_schema/rapidjson/doc/schema.md +505 -0
  189. data/ext/rj_schema/rapidjson/doc/schema.zh-cn.md +237 -0
  190. data/ext/rj_schema/rapidjson/doc/stream.md +426 -0
  191. data/ext/rj_schema/rapidjson/doc/stream.zh-cn.md +426 -0
  192. data/ext/rj_schema/rapidjson/doc/tutorial.md +536 -0
  193. data/ext/rj_schema/rapidjson/doc/tutorial.zh-cn.md +534 -0
  194. data/ext/rj_schema/rapidjson/docker/debian/Dockerfile +8 -0
  195. data/ext/rj_schema/rapidjson/example/CMakeLists.txt +45 -0
  196. data/ext/rj_schema/rapidjson/example/archiver/archiver.cpp +292 -0
  197. data/ext/rj_schema/rapidjson/example/archiver/archiver.h +145 -0
  198. data/ext/rj_schema/rapidjson/example/archiver/archivertest.cpp +287 -0
  199. data/ext/rj_schema/rapidjson/example/capitalize/capitalize.cpp +67 -0
  200. data/ext/rj_schema/rapidjson/example/condense/condense.cpp +32 -0
  201. data/ext/rj_schema/rapidjson/example/filterkey/filterkey.cpp +135 -0
  202. data/ext/rj_schema/rapidjson/example/filterkeydom/filterkeydom.cpp +170 -0
  203. data/ext/rj_schema/rapidjson/example/jsonx/jsonx.cpp +207 -0
  204. data/ext/rj_schema/rapidjson/example/lookaheadparser/lookaheadparser.cpp +350 -0
  205. data/ext/rj_schema/rapidjson/example/messagereader/messagereader.cpp +105 -0
  206. data/ext/rj_schema/rapidjson/example/parsebyparts/parsebyparts.cpp +176 -0
  207. data/ext/rj_schema/rapidjson/example/pretty/pretty.cpp +30 -0
  208. data/ext/rj_schema/rapidjson/example/prettyauto/prettyauto.cpp +56 -0
  209. data/ext/rj_schema/rapidjson/example/schemavalidator/schemavalidator.cpp +78 -0
  210. data/ext/rj_schema/rapidjson/example/serialize/serialize.cpp +173 -0
  211. data/ext/rj_schema/rapidjson/example/simpledom/simpledom.cpp +29 -0
  212. data/ext/rj_schema/rapidjson/example/simplepullreader/simplepullreader.cpp +53 -0
  213. data/ext/rj_schema/rapidjson/example/simplereader/simplereader.cpp +42 -0
  214. data/ext/rj_schema/rapidjson/example/simplewriter/simplewriter.cpp +36 -0
  215. data/ext/rj_schema/rapidjson/example/tutorial/tutorial.cpp +151 -0
  216. data/ext/rj_schema/rapidjson/include/rapidjson/allocators.h +271 -0
  217. data/ext/rj_schema/rapidjson/include/rapidjson/cursorstreamwrapper.h +78 -0
  218. data/ext/rj_schema/rapidjson/include/rapidjson/document.h +2630 -0
  219. data/ext/rj_schema/rapidjson/include/rapidjson/encodedstream.h +299 -0
  220. data/ext/rj_schema/rapidjson/include/rapidjson/encodings.h +716 -0
  221. data/ext/rj_schema/rapidjson/include/rapidjson/error/en.h +74 -0
  222. data/ext/rj_schema/rapidjson/include/rapidjson/error/error.h +161 -0
  223. data/ext/rj_schema/rapidjson/include/rapidjson/filereadstream.h +99 -0
  224. data/ext/rj_schema/rapidjson/include/rapidjson/filewritestream.h +104 -0
  225. data/ext/rj_schema/rapidjson/include/rapidjson/fwd.h +151 -0
  226. data/ext/rj_schema/rapidjson/include/rapidjson/internal/biginteger.h +290 -0
  227. data/ext/rj_schema/rapidjson/include/rapidjson/internal/diyfp.h +258 -0
  228. data/ext/rj_schema/rapidjson/include/rapidjson/internal/dtoa.h +245 -0
  229. data/ext/rj_schema/rapidjson/include/rapidjson/internal/ieee754.h +78 -0
  230. data/ext/rj_schema/rapidjson/include/rapidjson/internal/itoa.h +304 -0
  231. data/ext/rj_schema/rapidjson/include/rapidjson/internal/meta.h +181 -0
  232. data/ext/rj_schema/rapidjson/include/rapidjson/internal/pow10.h +55 -0
  233. data/ext/rj_schema/rapidjson/include/rapidjson/internal/regex.h +734 -0
  234. data/ext/rj_schema/rapidjson/include/rapidjson/internal/stack.h +231 -0
  235. data/ext/rj_schema/rapidjson/include/rapidjson/internal/strfunc.h +69 -0
  236. data/ext/rj_schema/rapidjson/include/rapidjson/internal/strtod.h +269 -0
  237. data/ext/rj_schema/rapidjson/include/rapidjson/internal/swap.h +46 -0
  238. data/ext/rj_schema/rapidjson/include/rapidjson/istreamwrapper.h +115 -0
  239. data/ext/rj_schema/rapidjson/include/rapidjson/memorybuffer.h +70 -0
  240. data/ext/rj_schema/rapidjson/include/rapidjson/memorystream.h +71 -0
  241. data/ext/rj_schema/rapidjson/include/rapidjson/msinttypes/inttypes.h +316 -0
  242. data/ext/rj_schema/rapidjson/include/rapidjson/msinttypes/stdint.h +300 -0
  243. data/ext/rj_schema/rapidjson/include/rapidjson/ostreamwrapper.h +81 -0
  244. data/ext/rj_schema/rapidjson/include/rapidjson/pointer.h +1363 -0
  245. data/ext/rj_schema/rapidjson/include/rapidjson/prettywriter.h +277 -0
  246. data/ext/rj_schema/rapidjson/include/rapidjson/rapidjson.h +628 -0
  247. data/ext/rj_schema/rapidjson/include/rapidjson/reader.h +2222 -0
  248. data/ext/rj_schema/rapidjson/include/rapidjson/schema.h +2479 -0
  249. data/ext/rj_schema/rapidjson/include/rapidjson/stream.h +223 -0
  250. data/ext/rj_schema/rapidjson/include/rapidjson/stringbuffer.h +121 -0
  251. data/ext/rj_schema/rapidjson/include/rapidjson/writer.h +716 -0
  252. data/ext/rj_schema/rapidjson/include_dirs.js +2 -0
  253. data/ext/rj_schema/rapidjson/library.json +15 -0
  254. data/ext/rj_schema/rapidjson/license.txt +57 -0
  255. data/ext/rj_schema/rapidjson/package.json +24 -0
  256. data/ext/rj_schema/rapidjson/rapidjson.autopkg +77 -0
  257. data/ext/rj_schema/rapidjson/readme.md +160 -0
  258. data/ext/rj_schema/rapidjson/readme.zh-cn.md +152 -0
  259. data/ext/rj_schema/rapidjson/test/CMakeLists.txt +20 -0
  260. data/ext/rj_schema/rapidjson/test/perftest/CMakeLists.txt +28 -0
  261. data/ext/rj_schema/rapidjson/test/perftest/misctest.cpp +974 -0
  262. data/ext/rj_schema/rapidjson/test/perftest/perftest.cpp +24 -0
  263. data/ext/rj_schema/rapidjson/test/perftest/perftest.h +185 -0
  264. data/ext/rj_schema/rapidjson/test/perftest/platformtest.cpp +166 -0
  265. data/ext/rj_schema/rapidjson/test/perftest/rapidjsontest.cpp +472 -0
  266. data/ext/rj_schema/rapidjson/test/perftest/schematest.cpp +216 -0
  267. data/ext/rj_schema/rapidjson/test/unittest/CMakeLists.txt +92 -0
  268. data/ext/rj_schema/rapidjson/test/unittest/allocatorstest.cpp +102 -0
  269. data/ext/rj_schema/rapidjson/test/unittest/bigintegertest.cpp +133 -0
  270. data/ext/rj_schema/rapidjson/test/unittest/cursorstreamwrappertest.cpp +115 -0
  271. data/ext/rj_schema/rapidjson/test/unittest/documenttest.cpp +672 -0
  272. data/ext/rj_schema/rapidjson/test/unittest/dtoatest.cpp +98 -0
  273. data/ext/rj_schema/rapidjson/test/unittest/encodedstreamtest.cpp +313 -0
  274. data/ext/rj_schema/rapidjson/test/unittest/encodingstest.cpp +451 -0
  275. data/ext/rj_schema/rapidjson/test/unittest/filestreamtest.cpp +112 -0
  276. data/ext/rj_schema/rapidjson/test/unittest/fwdtest.cpp +230 -0
  277. data/ext/rj_schema/rapidjson/test/unittest/istreamwrappertest.cpp +181 -0
  278. data/ext/rj_schema/rapidjson/test/unittest/itoatest.cpp +160 -0
  279. data/ext/rj_schema/rapidjson/test/unittest/jsoncheckertest.cpp +143 -0
  280. data/ext/rj_schema/rapidjson/test/unittest/namespacetest.cpp +70 -0
  281. data/ext/rj_schema/rapidjson/test/unittest/ostreamwrappertest.cpp +92 -0
  282. data/ext/rj_schema/rapidjson/test/unittest/pointertest.cpp +1529 -0
  283. data/ext/rj_schema/rapidjson/test/unittest/prettywritertest.cpp +344 -0
  284. data/ext/rj_schema/rapidjson/test/unittest/readertest.cpp +1895 -0
  285. data/ext/rj_schema/rapidjson/test/unittest/regextest.cpp +638 -0
  286. data/ext/rj_schema/rapidjson/test/unittest/schematest.cpp +2009 -0
  287. data/ext/rj_schema/rapidjson/test/unittest/simdtest.cpp +219 -0
  288. data/ext/rj_schema/rapidjson/test/unittest/strfunctest.cpp +30 -0
  289. data/ext/rj_schema/rapidjson/test/unittest/stringbuffertest.cpp +192 -0
  290. data/ext/rj_schema/rapidjson/test/unittest/strtodtest.cpp +132 -0
  291. data/ext/rj_schema/rapidjson/test/unittest/unittest.cpp +51 -0
  292. data/ext/rj_schema/rapidjson/test/unittest/unittest.h +140 -0
  293. data/ext/rj_schema/rapidjson/test/unittest/valuetest.cpp +1829 -0
  294. data/ext/rj_schema/rapidjson/test/unittest/writertest.cpp +598 -0
  295. data/ext/rj_schema/rapidjson/test/valgrind.supp +17 -0
  296. data/ext/rj_schema/rapidjson/travis-doxygen.sh +121 -0
  297. data/ext/rj_schema/rj_schema.cpp +136 -0
  298. data/lib/rj_schema.rb +7 -0
  299. metadata +371 -0
@@ -0,0 +1,98 @@
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/internal/dtoa.h"
17
+
18
+ #ifdef __GNUC__
19
+ RAPIDJSON_DIAG_PUSH
20
+ RAPIDJSON_DIAG_OFF(type-limits)
21
+ #endif
22
+
23
+ using namespace rapidjson::internal;
24
+
25
+ TEST(dtoa, normal) {
26
+ char buffer[30];
27
+
28
+ #define TEST_DTOA(d, a)\
29
+ *dtoa(d, buffer) = '\0';\
30
+ EXPECT_STREQ(a, buffer)
31
+
32
+ TEST_DTOA(0.0, "0.0");
33
+ TEST_DTOA(-0.0, "-0.0");
34
+ TEST_DTOA(1.0, "1.0");
35
+ TEST_DTOA(-1.0, "-1.0");
36
+ TEST_DTOA(1.2345, "1.2345");
37
+ TEST_DTOA(1.2345678, "1.2345678");
38
+ TEST_DTOA(0.123456789012, "0.123456789012");
39
+ TEST_DTOA(1234567.8, "1234567.8");
40
+ TEST_DTOA(-79.39773355813419, "-79.39773355813419");
41
+ TEST_DTOA(0.000001, "0.000001");
42
+ TEST_DTOA(0.0000001, "1e-7");
43
+ TEST_DTOA(1e30, "1e30");
44
+ TEST_DTOA(1.234567890123456e30, "1.234567890123456e30");
45
+ TEST_DTOA(5e-324, "5e-324"); // Min subnormal positive double
46
+ TEST_DTOA(2.225073858507201e-308, "2.225073858507201e-308"); // Max subnormal positive double
47
+ TEST_DTOA(2.2250738585072014e-308, "2.2250738585072014e-308"); // Min normal positive double
48
+ TEST_DTOA(1.7976931348623157e308, "1.7976931348623157e308"); // Max double
49
+
50
+ #undef TEST_DTOA
51
+ }
52
+
53
+ TEST(dtoa, maxDecimalPlaces) {
54
+ char buffer[30];
55
+
56
+ #define TEST_DTOA(m, d, a)\
57
+ *dtoa(d, buffer, m) = '\0';\
58
+ EXPECT_STREQ(a, buffer)
59
+
60
+ TEST_DTOA(3, 0.0, "0.0");
61
+ TEST_DTOA(1, 0.0, "0.0");
62
+ TEST_DTOA(3, -0.0, "-0.0");
63
+ TEST_DTOA(3, 1.0, "1.0");
64
+ TEST_DTOA(3, -1.0, "-1.0");
65
+ TEST_DTOA(3, 1.2345, "1.234");
66
+ TEST_DTOA(2, 1.2345, "1.23");
67
+ TEST_DTOA(1, 1.2345, "1.2");
68
+ TEST_DTOA(3, 1.2345678, "1.234");
69
+ TEST_DTOA(3, 1.0001, "1.0");
70
+ TEST_DTOA(2, 1.0001, "1.0");
71
+ TEST_DTOA(1, 1.0001, "1.0");
72
+ TEST_DTOA(3, 0.123456789012, "0.123");
73
+ TEST_DTOA(2, 0.123456789012, "0.12");
74
+ TEST_DTOA(1, 0.123456789012, "0.1");
75
+ TEST_DTOA(4, 0.0001, "0.0001");
76
+ TEST_DTOA(3, 0.0001, "0.0");
77
+ TEST_DTOA(2, 0.0001, "0.0");
78
+ TEST_DTOA(1, 0.0001, "0.0");
79
+ TEST_DTOA(3, 1234567.8, "1234567.8");
80
+ TEST_DTOA(3, 1e30, "1e30");
81
+ TEST_DTOA(3, 5e-324, "0.0"); // Min subnormal positive double
82
+ TEST_DTOA(3, 2.225073858507201e-308, "0.0"); // Max subnormal positive double
83
+ TEST_DTOA(3, 2.2250738585072014e-308, "0.0"); // Min normal positive double
84
+ TEST_DTOA(3, 1.7976931348623157e308, "1.7976931348623157e308"); // Max double
85
+ TEST_DTOA(5, -0.14000000000000001, "-0.14");
86
+ TEST_DTOA(4, -0.14000000000000001, "-0.14");
87
+ TEST_DTOA(3, -0.14000000000000001, "-0.14");
88
+ TEST_DTOA(3, -0.10000000000000001, "-0.1");
89
+ TEST_DTOA(2, -0.10000000000000001, "-0.1");
90
+ TEST_DTOA(1, -0.10000000000000001, "-0.1");
91
+
92
+ #undef TEST_DTOA
93
+ }
94
+
95
+
96
+ #ifdef __GNUC__
97
+ RAPIDJSON_DIAG_POP
98
+ #endif
@@ -0,0 +1,313 @@
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/filereadstream.h"
17
+ #include "rapidjson/filewritestream.h"
18
+ #include "rapidjson/encodedstream.h"
19
+ #include "rapidjson/stringbuffer.h"
20
+ #include "rapidjson/memorystream.h"
21
+ #include "rapidjson/memorybuffer.h"
22
+
23
+ using namespace rapidjson;
24
+
25
+ class EncodedStreamTest : public ::testing::Test {
26
+ public:
27
+ EncodedStreamTest() : json_(), length_() {}
28
+ virtual ~EncodedStreamTest();
29
+
30
+ virtual void SetUp() {
31
+ json_ = ReadFile("utf8.json", true, &length_);
32
+ }
33
+
34
+ virtual void TearDown() {
35
+ free(json_);
36
+ json_ = 0;
37
+ }
38
+
39
+ private:
40
+ EncodedStreamTest(const EncodedStreamTest&);
41
+ EncodedStreamTest& operator=(const EncodedStreamTest&);
42
+
43
+ protected:
44
+ static FILE* Open(const char* filename) {
45
+ const char *paths[] = {
46
+ "encodings",
47
+ "bin/encodings",
48
+ "../bin/encodings",
49
+ "../../bin/encodings",
50
+ "../../../bin/encodings"
51
+ };
52
+ char buffer[1024];
53
+ for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
54
+ sprintf(buffer, "%s/%s", paths[i], filename);
55
+ FILE *fp = fopen(buffer, "rb");
56
+ if (fp)
57
+ return fp;
58
+ }
59
+ return 0;
60
+ }
61
+
62
+ static char *ReadFile(const char* filename, bool appendPath, size_t* outLength) {
63
+ FILE *fp = appendPath ? Open(filename) : fopen(filename, "rb");
64
+
65
+ if (!fp) {
66
+ *outLength = 0;
67
+ return 0;
68
+ }
69
+
70
+ fseek(fp, 0, SEEK_END);
71
+ *outLength = static_cast<size_t>(ftell(fp));
72
+ fseek(fp, 0, SEEK_SET);
73
+ char* buffer = static_cast<char*>(malloc(*outLength + 1));
74
+ size_t readLength = fread(buffer, 1, *outLength, fp);
75
+ buffer[readLength] = '\0';
76
+ fclose(fp);
77
+ return buffer;
78
+ }
79
+
80
+ template <typename FileEncoding, typename MemoryEncoding>
81
+ void TestEncodedInputStream(const char* filename) {
82
+ // Test FileReadStream
83
+ {
84
+ char buffer[16];
85
+ FILE *fp = Open(filename);
86
+ ASSERT_TRUE(fp != 0);
87
+ FileReadStream fs(fp, buffer, sizeof(buffer));
88
+ EncodedInputStream<FileEncoding, FileReadStream> eis(fs);
89
+ StringStream s(json_);
90
+
91
+ while (eis.Peek() != '\0') {
92
+ unsigned expected, actual;
93
+ EXPECT_TRUE(UTF8<>::Decode(s, &expected));
94
+ EXPECT_TRUE(MemoryEncoding::Decode(eis, &actual));
95
+ EXPECT_EQ(expected, actual);
96
+ }
97
+ EXPECT_EQ('\0', s.Peek());
98
+ fclose(fp);
99
+ }
100
+
101
+ // Test MemoryStream
102
+ {
103
+ size_t size;
104
+ char* data = ReadFile(filename, true, &size);
105
+ MemoryStream ms(data, size);
106
+ EncodedInputStream<FileEncoding, MemoryStream> eis(ms);
107
+ StringStream s(json_);
108
+
109
+ while (eis.Peek() != '\0') {
110
+ unsigned expected, actual;
111
+ EXPECT_TRUE(UTF8<>::Decode(s, &expected));
112
+ EXPECT_TRUE(MemoryEncoding::Decode(eis, &actual));
113
+ EXPECT_EQ(expected, actual);
114
+ }
115
+ EXPECT_EQ('\0', s.Peek());
116
+ free(data);
117
+ EXPECT_EQ(size, eis.Tell());
118
+ }
119
+ }
120
+
121
+ void TestAutoUTFInputStream(const char *filename, bool expectHasBOM) {
122
+ // Test FileReadStream
123
+ {
124
+ char buffer[16];
125
+ FILE *fp = Open(filename);
126
+ ASSERT_TRUE(fp != 0);
127
+ FileReadStream fs(fp, buffer, sizeof(buffer));
128
+ AutoUTFInputStream<unsigned, FileReadStream> eis(fs);
129
+ EXPECT_EQ(expectHasBOM, eis.HasBOM());
130
+ StringStream s(json_);
131
+ while (eis.Peek() != '\0') {
132
+ unsigned expected, actual;
133
+ EXPECT_TRUE(UTF8<>::Decode(s, &expected));
134
+ EXPECT_TRUE(AutoUTF<unsigned>::Decode(eis, &actual));
135
+ EXPECT_EQ(expected, actual);
136
+ }
137
+ EXPECT_EQ('\0', s.Peek());
138
+ fclose(fp);
139
+ }
140
+
141
+ // Test MemoryStream
142
+ {
143
+ size_t size;
144
+ char* data = ReadFile(filename, true, &size);
145
+ MemoryStream ms(data, size);
146
+ AutoUTFInputStream<unsigned, MemoryStream> eis(ms);
147
+ EXPECT_EQ(expectHasBOM, eis.HasBOM());
148
+ StringStream s(json_);
149
+
150
+ while (eis.Peek() != '\0') {
151
+ unsigned expected, actual;
152
+ EXPECT_TRUE(UTF8<>::Decode(s, &expected));
153
+ EXPECT_TRUE(AutoUTF<unsigned>::Decode(eis, &actual));
154
+ EXPECT_EQ(expected, actual);
155
+ }
156
+ EXPECT_EQ('\0', s.Peek());
157
+ free(data);
158
+ EXPECT_EQ(size, eis.Tell());
159
+ }
160
+ }
161
+
162
+ template <typename FileEncoding, typename MemoryEncoding>
163
+ void TestEncodedOutputStream(const char* expectedFilename, bool putBOM) {
164
+ // Test FileWriteStream
165
+ {
166
+ char filename[L_tmpnam];
167
+ FILE* fp = TempFile(filename);
168
+ char buffer[16];
169
+ FileWriteStream os(fp, buffer, sizeof(buffer));
170
+ EncodedOutputStream<FileEncoding, FileWriteStream> eos(os, putBOM);
171
+ StringStream s(json_);
172
+ while (s.Peek() != '\0') {
173
+ bool success = Transcoder<UTF8<>, MemoryEncoding>::Transcode(s, eos);
174
+ EXPECT_TRUE(success);
175
+ }
176
+ eos.Flush();
177
+ fclose(fp);
178
+ EXPECT_TRUE(CompareFile(filename, expectedFilename));
179
+ remove(filename);
180
+ }
181
+
182
+ // Test MemoryBuffer
183
+ {
184
+ MemoryBuffer mb;
185
+ EncodedOutputStream<FileEncoding, MemoryBuffer> eos(mb, putBOM);
186
+ StringStream s(json_);
187
+ while (s.Peek() != '\0') {
188
+ bool success = Transcoder<UTF8<>, MemoryEncoding>::Transcode(s, eos);
189
+ EXPECT_TRUE(success);
190
+ }
191
+ eos.Flush();
192
+ EXPECT_TRUE(CompareBufferFile(mb.GetBuffer(), mb.GetSize(), expectedFilename));
193
+ }
194
+ }
195
+
196
+ void TestAutoUTFOutputStream(UTFType type, bool putBOM, const char *expectedFilename) {
197
+ // Test FileWriteStream
198
+ {
199
+ char filename[L_tmpnam];
200
+ FILE* fp = TempFile(filename);
201
+
202
+ char buffer[16];
203
+ FileWriteStream os(fp, buffer, sizeof(buffer));
204
+ AutoUTFOutputStream<unsigned, FileWriteStream> eos(os, type, putBOM);
205
+ StringStream s(json_);
206
+ while (s.Peek() != '\0') {
207
+ bool success = Transcoder<UTF8<>, AutoUTF<unsigned> >::Transcode(s, eos);
208
+ EXPECT_TRUE(success);
209
+ }
210
+ eos.Flush();
211
+ fclose(fp);
212
+ EXPECT_TRUE(CompareFile(filename, expectedFilename));
213
+ remove(filename);
214
+ }
215
+
216
+ // Test MemoryBuffer
217
+ {
218
+ MemoryBuffer mb;
219
+ AutoUTFOutputStream<unsigned, MemoryBuffer> eos(mb, type, putBOM);
220
+ StringStream s(json_);
221
+ while (s.Peek() != '\0') {
222
+ bool success = Transcoder<UTF8<>, AutoUTF<unsigned> >::Transcode(s, eos);
223
+ EXPECT_TRUE(success);
224
+ }
225
+ eos.Flush();
226
+ EXPECT_TRUE(CompareBufferFile(mb.GetBuffer(), mb.GetSize(), expectedFilename));
227
+ }
228
+ }
229
+
230
+ bool CompareFile(const char* filename, const char* expectedFilename) {
231
+ size_t actualLength, expectedLength;
232
+ char* actualBuffer = ReadFile(filename, false, &actualLength);
233
+ char* expectedBuffer = ReadFile(expectedFilename, true, &expectedLength);
234
+ bool ret = (expectedLength == actualLength) && memcmp(expectedBuffer, actualBuffer, actualLength) == 0;
235
+ free(actualBuffer);
236
+ free(expectedBuffer);
237
+ return ret;
238
+ }
239
+
240
+ bool CompareBufferFile(const char* actualBuffer, size_t actualLength, const char* expectedFilename) {
241
+ size_t expectedLength;
242
+ char* expectedBuffer = ReadFile(expectedFilename, true, &expectedLength);
243
+ bool ret = (expectedLength == actualLength) && memcmp(expectedBuffer, actualBuffer, actualLength) == 0;
244
+ free(expectedBuffer);
245
+ return ret;
246
+ }
247
+
248
+ char *json_;
249
+ size_t length_;
250
+ };
251
+
252
+ EncodedStreamTest::~EncodedStreamTest() {}
253
+
254
+ TEST_F(EncodedStreamTest, EncodedInputStream) {
255
+ TestEncodedInputStream<UTF8<>, UTF8<> >("utf8.json");
256
+ TestEncodedInputStream<UTF8<>, UTF8<> >("utf8bom.json");
257
+ TestEncodedInputStream<UTF16LE<>, UTF16<> >("utf16le.json");
258
+ TestEncodedInputStream<UTF16LE<>, UTF16<> >("utf16lebom.json");
259
+ TestEncodedInputStream<UTF16BE<>, UTF16<> >("utf16be.json");
260
+ TestEncodedInputStream<UTF16BE<>, UTF16<> >("utf16bebom.json");
261
+ TestEncodedInputStream<UTF32LE<>, UTF32<> >("utf32le.json");
262
+ TestEncodedInputStream<UTF32LE<>, UTF32<> >("utf32lebom.json");
263
+ TestEncodedInputStream<UTF32BE<>, UTF32<> >("utf32be.json");
264
+ TestEncodedInputStream<UTF32BE<>, UTF32<> >("utf32bebom.json");
265
+ }
266
+
267
+ TEST_F(EncodedStreamTest, AutoUTFInputStream) {
268
+ TestAutoUTFInputStream("utf8.json", false);
269
+ TestAutoUTFInputStream("utf8bom.json", true);
270
+ TestAutoUTFInputStream("utf16le.json", false);
271
+ TestAutoUTFInputStream("utf16lebom.json",true);
272
+ TestAutoUTFInputStream("utf16be.json", false);
273
+ TestAutoUTFInputStream("utf16bebom.json",true);
274
+ TestAutoUTFInputStream("utf32le.json", false);
275
+ TestAutoUTFInputStream("utf32lebom.json",true);
276
+ TestAutoUTFInputStream("utf32be.json", false);
277
+ TestAutoUTFInputStream("utf32bebom.json", true);
278
+
279
+ {
280
+ // Auto detection fail, use user defined UTF type
281
+ const char json[] = "{ }";
282
+ MemoryStream ms(json, sizeof(json));
283
+ AutoUTFInputStream<unsigned, MemoryStream> eis(ms, kUTF8);
284
+ EXPECT_FALSE(eis.HasBOM());
285
+ EXPECT_EQ(kUTF8, eis.GetType());
286
+ }
287
+ }
288
+
289
+ TEST_F(EncodedStreamTest, EncodedOutputStream) {
290
+ TestEncodedOutputStream<UTF8<>, UTF8<> >("utf8.json", false);
291
+ TestEncodedOutputStream<UTF8<>, UTF8<> >("utf8bom.json", true);
292
+ TestEncodedOutputStream<UTF16LE<>, UTF16<> >("utf16le.json", false);
293
+ TestEncodedOutputStream<UTF16LE<>, UTF16<> >("utf16lebom.json",true);
294
+ TestEncodedOutputStream<UTF16BE<>, UTF16<> >("utf16be.json", false);
295
+ TestEncodedOutputStream<UTF16BE<>, UTF16<> >("utf16bebom.json",true);
296
+ TestEncodedOutputStream<UTF32LE<>, UTF32<> >("utf32le.json", false);
297
+ TestEncodedOutputStream<UTF32LE<>, UTF32<> >("utf32lebom.json",true);
298
+ TestEncodedOutputStream<UTF32BE<>, UTF32<> >("utf32be.json", false);
299
+ TestEncodedOutputStream<UTF32BE<>, UTF32<> >("utf32bebom.json",true);
300
+ }
301
+
302
+ TEST_F(EncodedStreamTest, AutoUTFOutputStream) {
303
+ TestAutoUTFOutputStream(kUTF8, false, "utf8.json");
304
+ TestAutoUTFOutputStream(kUTF8, true, "utf8bom.json");
305
+ TestAutoUTFOutputStream(kUTF16LE, false, "utf16le.json");
306
+ TestAutoUTFOutputStream(kUTF16LE, true, "utf16lebom.json");
307
+ TestAutoUTFOutputStream(kUTF16BE, false, "utf16be.json");
308
+ TestAutoUTFOutputStream(kUTF16BE, true, "utf16bebom.json");
309
+ TestAutoUTFOutputStream(kUTF32LE, false, "utf32le.json");
310
+ TestAutoUTFOutputStream(kUTF32LE, true, "utf32lebom.json");
311
+ TestAutoUTFOutputStream(kUTF32BE, false, "utf32be.json");
312
+ TestAutoUTFOutputStream(kUTF32BE, true, "utf32bebom.json");
313
+ }
@@ -0,0 +1,451 @@
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/filereadstream.h"
17
+ #include "rapidjson/filewritestream.h"
18
+ #include "rapidjson/encodedstream.h"
19
+ #include "rapidjson/stringbuffer.h"
20
+
21
+ using namespace rapidjson;
22
+
23
+ // Verification of encoders/decoders with Hoehrmann's UTF8 decoder
24
+
25
+ // http://www.unicode.org/Public/UNIDATA/Blocks.txt
26
+ static const unsigned kCodepointRanges[] = {
27
+ 0x0000, 0x007F, // Basic Latin
28
+ 0x0080, 0x00FF, // Latin-1 Supplement
29
+ 0x0100, 0x017F, // Latin Extended-A
30
+ 0x0180, 0x024F, // Latin Extended-B
31
+ 0x0250, 0x02AF, // IPA Extensions
32
+ 0x02B0, 0x02FF, // Spacing Modifier Letters
33
+ 0x0300, 0x036F, // Combining Diacritical Marks
34
+ 0x0370, 0x03FF, // Greek and Coptic
35
+ 0x0400, 0x04FF, // Cyrillic
36
+ 0x0500, 0x052F, // Cyrillic Supplement
37
+ 0x0530, 0x058F, // Armenian
38
+ 0x0590, 0x05FF, // Hebrew
39
+ 0x0600, 0x06FF, // Arabic
40
+ 0x0700, 0x074F, // Syriac
41
+ 0x0750, 0x077F, // Arabic Supplement
42
+ 0x0780, 0x07BF, // Thaana
43
+ 0x07C0, 0x07FF, // NKo
44
+ 0x0800, 0x083F, // Samaritan
45
+ 0x0840, 0x085F, // Mandaic
46
+ 0x0900, 0x097F, // Devanagari
47
+ 0x0980, 0x09FF, // Bengali
48
+ 0x0A00, 0x0A7F, // Gurmukhi
49
+ 0x0A80, 0x0AFF, // Gujarati
50
+ 0x0B00, 0x0B7F, // Oriya
51
+ 0x0B80, 0x0BFF, // Tamil
52
+ 0x0C00, 0x0C7F, // Telugu
53
+ 0x0C80, 0x0CFF, // Kannada
54
+ 0x0D00, 0x0D7F, // Malayalam
55
+ 0x0D80, 0x0DFF, // Sinhala
56
+ 0x0E00, 0x0E7F, // Thai
57
+ 0x0E80, 0x0EFF, // Lao
58
+ 0x0F00, 0x0FFF, // Tibetan
59
+ 0x1000, 0x109F, // Myanmar
60
+ 0x10A0, 0x10FF, // Georgian
61
+ 0x1100, 0x11FF, // Hangul Jamo
62
+ 0x1200, 0x137F, // Ethiopic
63
+ 0x1380, 0x139F, // Ethiopic Supplement
64
+ 0x13A0, 0x13FF, // Cherokee
65
+ 0x1400, 0x167F, // Unified Canadian Aboriginal Syllabics
66
+ 0x1680, 0x169F, // Ogham
67
+ 0x16A0, 0x16FF, // Runic
68
+ 0x1700, 0x171F, // Tagalog
69
+ 0x1720, 0x173F, // Hanunoo
70
+ 0x1740, 0x175F, // Buhid
71
+ 0x1760, 0x177F, // Tagbanwa
72
+ 0x1780, 0x17FF, // Khmer
73
+ 0x1800, 0x18AF, // Mongolian
74
+ 0x18B0, 0x18FF, // Unified Canadian Aboriginal Syllabics Extended
75
+ 0x1900, 0x194F, // Limbu
76
+ 0x1950, 0x197F, // Tai Le
77
+ 0x1980, 0x19DF, // New Tai Lue
78
+ 0x19E0, 0x19FF, // Khmer Symbols
79
+ 0x1A00, 0x1A1F, // Buginese
80
+ 0x1A20, 0x1AAF, // Tai Tham
81
+ 0x1B00, 0x1B7F, // Balinese
82
+ 0x1B80, 0x1BBF, // Sundanese
83
+ 0x1BC0, 0x1BFF, // Batak
84
+ 0x1C00, 0x1C4F, // Lepcha
85
+ 0x1C50, 0x1C7F, // Ol Chiki
86
+ 0x1CD0, 0x1CFF, // Vedic Extensions
87
+ 0x1D00, 0x1D7F, // Phonetic Extensions
88
+ 0x1D80, 0x1DBF, // Phonetic Extensions Supplement
89
+ 0x1DC0, 0x1DFF, // Combining Diacritical Marks Supplement
90
+ 0x1E00, 0x1EFF, // Latin Extended Additional
91
+ 0x1F00, 0x1FFF, // Greek Extended
92
+ 0x2000, 0x206F, // General Punctuation
93
+ 0x2070, 0x209F, // Superscripts and Subscripts
94
+ 0x20A0, 0x20CF, // Currency Symbols
95
+ 0x20D0, 0x20FF, // Combining Diacritical Marks for Symbols
96
+ 0x2100, 0x214F, // Letterlike Symbols
97
+ 0x2150, 0x218F, // Number Forms
98
+ 0x2190, 0x21FF, // Arrows
99
+ 0x2200, 0x22FF, // Mathematical Operators
100
+ 0x2300, 0x23FF, // Miscellaneous Technical
101
+ 0x2400, 0x243F, // Control Pictures
102
+ 0x2440, 0x245F, // Optical Character Recognition
103
+ 0x2460, 0x24FF, // Enclosed Alphanumerics
104
+ 0x2500, 0x257F, // Box Drawing
105
+ 0x2580, 0x259F, // Block Elements
106
+ 0x25A0, 0x25FF, // Geometric Shapes
107
+ 0x2600, 0x26FF, // Miscellaneous Symbols
108
+ 0x2700, 0x27BF, // Dingbats
109
+ 0x27C0, 0x27EF, // Miscellaneous Mathematical Symbols-A
110
+ 0x27F0, 0x27FF, // Supplemental Arrows-A
111
+ 0x2800, 0x28FF, // Braille Patterns
112
+ 0x2900, 0x297F, // Supplemental Arrows-B
113
+ 0x2980, 0x29FF, // Miscellaneous Mathematical Symbols-B
114
+ 0x2A00, 0x2AFF, // Supplemental Mathematical Operators
115
+ 0x2B00, 0x2BFF, // Miscellaneous Symbols and Arrows
116
+ 0x2C00, 0x2C5F, // Glagolitic
117
+ 0x2C60, 0x2C7F, // Latin Extended-C
118
+ 0x2C80, 0x2CFF, // Coptic
119
+ 0x2D00, 0x2D2F, // Georgian Supplement
120
+ 0x2D30, 0x2D7F, // Tifinagh
121
+ 0x2D80, 0x2DDF, // Ethiopic Extended
122
+ 0x2DE0, 0x2DFF, // Cyrillic Extended-A
123
+ 0x2E00, 0x2E7F, // Supplemental Punctuation
124
+ 0x2E80, 0x2EFF, // CJK Radicals Supplement
125
+ 0x2F00, 0x2FDF, // Kangxi Radicals
126
+ 0x2FF0, 0x2FFF, // Ideographic Description Characters
127
+ 0x3000, 0x303F, // CJK Symbols and Punctuation
128
+ 0x3040, 0x309F, // Hiragana
129
+ 0x30A0, 0x30FF, // Katakana
130
+ 0x3100, 0x312F, // Bopomofo
131
+ 0x3130, 0x318F, // Hangul Compatibility Jamo
132
+ 0x3190, 0x319F, // Kanbun
133
+ 0x31A0, 0x31BF, // Bopomofo Extended
134
+ 0x31C0, 0x31EF, // CJK Strokes
135
+ 0x31F0, 0x31FF, // Katakana Phonetic Extensions
136
+ 0x3200, 0x32FF, // Enclosed CJK Letters and Months
137
+ 0x3300, 0x33FF, // CJK Compatibility
138
+ 0x3400, 0x4DBF, // CJK Unified Ideographs Extension A
139
+ 0x4DC0, 0x4DFF, // Yijing Hexagram Symbols
140
+ 0x4E00, 0x9FFF, // CJK Unified Ideographs
141
+ 0xA000, 0xA48F, // Yi Syllables
142
+ 0xA490, 0xA4CF, // Yi Radicals
143
+ 0xA4D0, 0xA4FF, // Lisu
144
+ 0xA500, 0xA63F, // Vai
145
+ 0xA640, 0xA69F, // Cyrillic Extended-B
146
+ 0xA6A0, 0xA6FF, // Bamum
147
+ 0xA700, 0xA71F, // Modifier Tone Letters
148
+ 0xA720, 0xA7FF, // Latin Extended-D
149
+ 0xA800, 0xA82F, // Syloti Nagri
150
+ 0xA830, 0xA83F, // Common Indic Number Forms
151
+ 0xA840, 0xA87F, // Phags-pa
152
+ 0xA880, 0xA8DF, // Saurashtra
153
+ 0xA8E0, 0xA8FF, // Devanagari Extended
154
+ 0xA900, 0xA92F, // Kayah Li
155
+ 0xA930, 0xA95F, // Rejang
156
+ 0xA960, 0xA97F, // Hangul Jamo Extended-A
157
+ 0xA980, 0xA9DF, // Javanese
158
+ 0xAA00, 0xAA5F, // Cham
159
+ 0xAA60, 0xAA7F, // Myanmar Extended-A
160
+ 0xAA80, 0xAADF, // Tai Viet
161
+ 0xAB00, 0xAB2F, // Ethiopic Extended-A
162
+ 0xABC0, 0xABFF, // Meetei Mayek
163
+ 0xAC00, 0xD7AF, // Hangul Syllables
164
+ 0xD7B0, 0xD7FF, // Hangul Jamo Extended-B
165
+ //0xD800, 0xDB7F, // High Surrogates
166
+ //0xDB80, 0xDBFF, // High Private Use Surrogates
167
+ //0xDC00, 0xDFFF, // Low Surrogates
168
+ 0xE000, 0xF8FF, // Private Use Area
169
+ 0xF900, 0xFAFF, // CJK Compatibility Ideographs
170
+ 0xFB00, 0xFB4F, // Alphabetic Presentation Forms
171
+ 0xFB50, 0xFDFF, // Arabic Presentation Forms-A
172
+ 0xFE00, 0xFE0F, // Variation Selectors
173
+ 0xFE10, 0xFE1F, // Vertical Forms
174
+ 0xFE20, 0xFE2F, // Combining Half Marks
175
+ 0xFE30, 0xFE4F, // CJK Compatibility Forms
176
+ 0xFE50, 0xFE6F, // Small Form Variants
177
+ 0xFE70, 0xFEFF, // Arabic Presentation Forms-B
178
+ 0xFF00, 0xFFEF, // Halfwidth and Fullwidth Forms
179
+ 0xFFF0, 0xFFFF, // Specials
180
+ 0x10000, 0x1007F, // Linear B Syllabary
181
+ 0x10080, 0x100FF, // Linear B Ideograms
182
+ 0x10100, 0x1013F, // Aegean Numbers
183
+ 0x10140, 0x1018F, // Ancient Greek Numbers
184
+ 0x10190, 0x101CF, // Ancient Symbols
185
+ 0x101D0, 0x101FF, // Phaistos Disc
186
+ 0x10280, 0x1029F, // Lycian
187
+ 0x102A0, 0x102DF, // Carian
188
+ 0x10300, 0x1032F, // Old Italic
189
+ 0x10330, 0x1034F, // Gothic
190
+ 0x10380, 0x1039F, // Ugaritic
191
+ 0x103A0, 0x103DF, // Old Persian
192
+ 0x10400, 0x1044F, // Deseret
193
+ 0x10450, 0x1047F, // Shavian
194
+ 0x10480, 0x104AF, // Osmanya
195
+ 0x10800, 0x1083F, // Cypriot Syllabary
196
+ 0x10840, 0x1085F, // Imperial Aramaic
197
+ 0x10900, 0x1091F, // Phoenician
198
+ 0x10920, 0x1093F, // Lydian
199
+ 0x10A00, 0x10A5F, // Kharoshthi
200
+ 0x10A60, 0x10A7F, // Old South Arabian
201
+ 0x10B00, 0x10B3F, // Avestan
202
+ 0x10B40, 0x10B5F, // Inscriptional Parthian
203
+ 0x10B60, 0x10B7F, // Inscriptional Pahlavi
204
+ 0x10C00, 0x10C4F, // Old Turkic
205
+ 0x10E60, 0x10E7F, // Rumi Numeral Symbols
206
+ 0x11000, 0x1107F, // Brahmi
207
+ 0x11080, 0x110CF, // Kaithi
208
+ 0x12000, 0x123FF, // Cuneiform
209
+ 0x12400, 0x1247F, // Cuneiform Numbers and Punctuation
210
+ 0x13000, 0x1342F, // Egyptian Hieroglyphs
211
+ 0x16800, 0x16A3F, // Bamum Supplement
212
+ 0x1B000, 0x1B0FF, // Kana Supplement
213
+ 0x1D000, 0x1D0FF, // Byzantine Musical Symbols
214
+ 0x1D100, 0x1D1FF, // Musical Symbols
215
+ 0x1D200, 0x1D24F, // Ancient Greek Musical Notation
216
+ 0x1D300, 0x1D35F, // Tai Xuan Jing Symbols
217
+ 0x1D360, 0x1D37F, // Counting Rod Numerals
218
+ 0x1D400, 0x1D7FF, // Mathematical Alphanumeric Symbols
219
+ 0x1F000, 0x1F02F, // Mahjong Tiles
220
+ 0x1F030, 0x1F09F, // Domino Tiles
221
+ 0x1F0A0, 0x1F0FF, // Playing Cards
222
+ 0x1F100, 0x1F1FF, // Enclosed Alphanumeric Supplement
223
+ 0x1F200, 0x1F2FF, // Enclosed Ideographic Supplement
224
+ 0x1F300, 0x1F5FF, // Miscellaneous Symbols And Pictographs
225
+ 0x1F600, 0x1F64F, // Emoticons
226
+ 0x1F680, 0x1F6FF, // Transport And Map Symbols
227
+ 0x1F700, 0x1F77F, // Alchemical Symbols
228
+ 0x20000, 0x2A6DF, // CJK Unified Ideographs Extension B
229
+ 0x2A700, 0x2B73F, // CJK Unified Ideographs Extension C
230
+ 0x2B740, 0x2B81F, // CJK Unified Ideographs Extension D
231
+ 0x2F800, 0x2FA1F, // CJK Compatibility Ideographs Supplement
232
+ 0xE0000, 0xE007F, // Tags
233
+ 0xE0100, 0xE01EF, // Variation Selectors Supplement
234
+ 0xF0000, 0xFFFFF, // Supplementary Private Use Area-A
235
+ 0x100000, 0x10FFFF, // Supplementary Private Use Area-B
236
+ 0xFFFFFFFF
237
+ };
238
+
239
+ // Copyright (c) 2008-2010 Bjoern Hoehrmann <bjoern@hoehrmann.de>
240
+ // See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details.
241
+
242
+ #define UTF8_ACCEPT 0u
243
+
244
+ static const unsigned char utf8d[] = {
245
+ // The first part of the table maps bytes to character classes that
246
+ // to reduce the size of the transition table and create bitmasks.
247
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
248
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
249
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
250
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
251
+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
252
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
253
+ 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
254
+ 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8,
255
+
256
+ // The second part is a transition table that maps a combination
257
+ // of a state of the automaton and a character class to a state.
258
+ 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12,
259
+ 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12,
260
+ 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12,
261
+ 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12,
262
+ 12,36,12,12,12,12,12,12,12,12,12,12,
263
+ };
264
+
265
+ static unsigned inline decode(unsigned* state, unsigned* codep, unsigned byte) {
266
+ unsigned type = utf8d[byte];
267
+
268
+ *codep = (*state != UTF8_ACCEPT) ?
269
+ (byte & 0x3fu) | (*codep << 6) :
270
+ (0xffu >> type) & (byte);
271
+
272
+ *state = utf8d[256 + *state + type];
273
+ return *state;
274
+ }
275
+
276
+ //static bool IsUTF8(unsigned char* s) {
277
+ // unsigned codepoint, state = 0;
278
+ //
279
+ // while (*s)
280
+ // decode(&state, &codepoint, *s++);
281
+ //
282
+ // return state == UTF8_ACCEPT;
283
+ //}
284
+
285
+ TEST(EncodingsTest, UTF8) {
286
+ StringBuffer os, os2;
287
+ for (const unsigned* range = kCodepointRanges; *range != 0xFFFFFFFF; range += 2) {
288
+ for (unsigned codepoint = range[0]; codepoint <= range[1]; ++codepoint) {
289
+ os.Clear();
290
+ UTF8<>::Encode(os, codepoint);
291
+ const char* encodedStr = os.GetString();
292
+
293
+ // Decode with Hoehrmann
294
+ {
295
+ unsigned decodedCodepoint = 0;
296
+ unsigned state = 0;
297
+
298
+ unsigned decodedCount = 0;
299
+ for (const char* s = encodedStr; *s; ++s)
300
+ if (!decode(&state, &decodedCodepoint, static_cast<unsigned char>(*s))) {
301
+ EXPECT_EQ(codepoint, decodedCodepoint);
302
+ decodedCount++;
303
+ }
304
+
305
+ if (*encodedStr) { // This decoder cannot handle U+0000
306
+ EXPECT_EQ(1u, decodedCount); // Should only contain one code point
307
+ }
308
+
309
+ EXPECT_EQ(UTF8_ACCEPT, state);
310
+ if (UTF8_ACCEPT != state)
311
+ std::cout << std::hex << codepoint << " " << decodedCodepoint << std::endl;
312
+ }
313
+
314
+ // Decode
315
+ {
316
+ StringStream is(encodedStr);
317
+ unsigned decodedCodepoint;
318
+ bool result = UTF8<>::Decode(is, &decodedCodepoint);
319
+ EXPECT_TRUE(result);
320
+ EXPECT_EQ(codepoint, decodedCodepoint);
321
+ if (!result || codepoint != decodedCodepoint)
322
+ std::cout << std::hex << codepoint << " " << decodedCodepoint << std::endl;
323
+ }
324
+
325
+ // Validate
326
+ {
327
+ StringStream is(encodedStr);
328
+ os2.Clear();
329
+ bool result = UTF8<>::Validate(is, os2);
330
+ EXPECT_TRUE(result);
331
+ EXPECT_EQ(0, StrCmp(encodedStr, os2.GetString()));
332
+ }
333
+ }
334
+ }
335
+ }
336
+
337
+ TEST(EncodingsTest, UTF16) {
338
+ GenericStringBuffer<UTF16<> > os, os2;
339
+ GenericStringBuffer<UTF8<> > utf8os;
340
+ for (const unsigned* range = kCodepointRanges; *range != 0xFFFFFFFF; range += 2) {
341
+ for (unsigned codepoint = range[0]; codepoint <= range[1]; ++codepoint) {
342
+ os.Clear();
343
+ UTF16<>::Encode(os, codepoint);
344
+ const UTF16<>::Ch* encodedStr = os.GetString();
345
+
346
+ // Encode with Hoehrmann's code
347
+ if (codepoint != 0) // cannot handle U+0000
348
+ {
349
+ // encode with UTF8<> first
350
+ utf8os.Clear();
351
+ UTF8<>::Encode(utf8os, codepoint);
352
+
353
+ // transcode from UTF8 to UTF16 with Hoehrmann's code
354
+ unsigned decodedCodepoint = 0;
355
+ unsigned state = 0;
356
+ UTF16<>::Ch buffer[3], *p = &buffer[0];
357
+ for (const char* s = utf8os.GetString(); *s; ++s) {
358
+ if (!decode(&state, &decodedCodepoint, static_cast<unsigned char>(*s)))
359
+ break;
360
+ }
361
+
362
+ if (codepoint <= 0xFFFF)
363
+ *p++ = static_cast<UTF16<>::Ch>(decodedCodepoint);
364
+ else {
365
+ // Encode code points above U+FFFF as surrogate pair.
366
+ *p++ = static_cast<UTF16<>::Ch>(0xD7C0 + (decodedCodepoint >> 10));
367
+ *p++ = static_cast<UTF16<>::Ch>(0xDC00 + (decodedCodepoint & 0x3FF));
368
+ }
369
+ *p++ = '\0';
370
+
371
+ EXPECT_EQ(0, StrCmp(buffer, encodedStr));
372
+ }
373
+
374
+ // Decode
375
+ {
376
+ GenericStringStream<UTF16<> > is(encodedStr);
377
+ unsigned decodedCodepoint;
378
+ bool result = UTF16<>::Decode(is, &decodedCodepoint);
379
+ EXPECT_TRUE(result);
380
+ EXPECT_EQ(codepoint, decodedCodepoint);
381
+ if (!result || codepoint != decodedCodepoint)
382
+ std::cout << std::hex << codepoint << " " << decodedCodepoint << std::endl;
383
+ }
384
+
385
+ // Validate
386
+ {
387
+ GenericStringStream<UTF16<> > is(encodedStr);
388
+ os2.Clear();
389
+ bool result = UTF16<>::Validate(is, os2);
390
+ EXPECT_TRUE(result);
391
+ EXPECT_EQ(0, StrCmp(encodedStr, os2.GetString()));
392
+ }
393
+ }
394
+ }
395
+ }
396
+
397
+ TEST(EncodingsTest, UTF32) {
398
+ GenericStringBuffer<UTF32<> > os, os2;
399
+ for (const unsigned* range = kCodepointRanges; *range != 0xFFFFFFFF; range += 2) {
400
+ for (unsigned codepoint = range[0]; codepoint <= range[1]; ++codepoint) {
401
+ os.Clear();
402
+ UTF32<>::Encode(os, codepoint);
403
+ const UTF32<>::Ch* encodedStr = os.GetString();
404
+
405
+ // Decode
406
+ {
407
+ GenericStringStream<UTF32<> > is(encodedStr);
408
+ unsigned decodedCodepoint;
409
+ bool result = UTF32<>::Decode(is, &decodedCodepoint);
410
+ EXPECT_TRUE(result);
411
+ EXPECT_EQ(codepoint, decodedCodepoint);
412
+ if (!result || codepoint != decodedCodepoint)
413
+ std::cout << std::hex << codepoint << " " << decodedCodepoint << std::endl;
414
+ }
415
+
416
+ // Validate
417
+ {
418
+ GenericStringStream<UTF32<> > is(encodedStr);
419
+ os2.Clear();
420
+ bool result = UTF32<>::Validate(is, os2);
421
+ EXPECT_TRUE(result);
422
+ EXPECT_EQ(0, StrCmp(encodedStr, os2.GetString()));
423
+ }
424
+ }
425
+ }
426
+ }
427
+
428
+ TEST(EncodingsTest, ASCII) {
429
+ StringBuffer os, os2;
430
+ for (unsigned codepoint = 0; codepoint < 128; codepoint++) {
431
+ os.Clear();
432
+ ASCII<>::Encode(os, codepoint);
433
+ const ASCII<>::Ch* encodedStr = os.GetString();
434
+ {
435
+ StringStream is(encodedStr);
436
+ unsigned decodedCodepoint;
437
+ bool result = ASCII<>::Decode(is, &decodedCodepoint);
438
+ if (!result || codepoint != decodedCodepoint)
439
+ std::cout << std::hex << codepoint << " " << decodedCodepoint << std::endl;
440
+ }
441
+
442
+ // Validate
443
+ {
444
+ StringStream is(encodedStr);
445
+ os2.Clear();
446
+ bool result = ASCII<>::Validate(is, os2);
447
+ EXPECT_TRUE(result);
448
+ EXPECT_EQ(0, StrCmp(encodedStr, os2.GetString()));
449
+ }
450
+ }
451
+ }