rj_schema 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }