ooxml_crypt 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (264) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +58 -0
  5. data/Rakefile +12 -0
  6. data/bin/console +15 -0
  7. data/bin/setup +8 -0
  8. data/ext/ooxml_crypt/extconf.rb +18 -0
  9. data/ext/ooxml_crypt/ooxml_crypt.c +27 -0
  10. data/ext/ooxml_crypt/ooxml_crypt.h +7 -0
  11. data/lib/ooxml_crypt/version.rb +5 -0
  12. data/lib/ooxml_crypt.rb +75 -0
  13. data/vendor/cybozulib/.github/workflows/main.yml +12 -0
  14. data/vendor/cybozulib/.gitignore +5 -0
  15. data/vendor/cybozulib/CMakeLists.txt +6 -0
  16. data/vendor/cybozulib/COPYRIGHT +27 -0
  17. data/vendor/cybozulib/Makefile +26 -0
  18. data/vendor/cybozulib/bin/libeay32.dll +0 -0
  19. data/vendor/cybozulib/bin/libmecab.dll +0 -0
  20. data/vendor/cybozulib/bin/ssleay32.dll +0 -0
  21. data/vendor/cybozulib/common.mk +116 -0
  22. data/vendor/cybozulib/common.props +25 -0
  23. data/vendor/cybozulib/cybozulib.sln +286 -0
  24. data/vendor/cybozulib/debug.props +14 -0
  25. data/vendor/cybozulib/include/cybozu/array.hpp +197 -0
  26. data/vendor/cybozulib/include/cybozu/atoi.hpp +238 -0
  27. data/vendor/cybozulib/include/cybozu/atomic.hpp +146 -0
  28. data/vendor/cybozulib/include/cybozu/base64.hpp +210 -0
  29. data/vendor/cybozulib/include/cybozu/benchmark.hpp +212 -0
  30. data/vendor/cybozulib/include/cybozu/bfd.hpp +105 -0
  31. data/vendor/cybozulib/include/cybozu/bit_operation.hpp +139 -0
  32. data/vendor/cybozulib/include/cybozu/bitvector.hpp +358 -0
  33. data/vendor/cybozulib/include/cybozu/condition_variable.hpp +113 -0
  34. data/vendor/cybozulib/include/cybozu/condition_variable_cs.hpp +74 -0
  35. data/vendor/cybozulib/include/cybozu/config.hpp +392 -0
  36. data/vendor/cybozulib/include/cybozu/critical_section.hpp +60 -0
  37. data/vendor/cybozulib/include/cybozu/crypto.hpp +321 -0
  38. data/vendor/cybozulib/include/cybozu/csucvector.hpp +624 -0
  39. data/vendor/cybozulib/include/cybozu/csv.hpp +294 -0
  40. data/vendor/cybozulib/include/cybozu/data_type.hpp +27 -0
  41. data/vendor/cybozulib/include/cybozu/endian.hpp +224 -0
  42. data/vendor/cybozulib/include/cybozu/env.hpp +63 -0
  43. data/vendor/cybozulib/include/cybozu/event.hpp +122 -0
  44. data/vendor/cybozulib/include/cybozu/exception.hpp +253 -0
  45. data/vendor/cybozulib/include/cybozu/file.hpp +626 -0
  46. data/vendor/cybozulib/include/cybozu/fmindex.hpp +291 -0
  47. data/vendor/cybozulib/include/cybozu/format.hpp +93 -0
  48. data/vendor/cybozulib/include/cybozu/frequency.hpp +264 -0
  49. data/vendor/cybozulib/include/cybozu/hash.hpp +67 -0
  50. data/vendor/cybozulib/include/cybozu/inttype.hpp +174 -0
  51. data/vendor/cybozulib/include/cybozu/itoa.hpp +336 -0
  52. data/vendor/cybozulib/include/cybozu/json.hpp +120 -0
  53. data/vendor/cybozulib/include/cybozu/line_stream.hpp +149 -0
  54. data/vendor/cybozulib/include/cybozu/link_libeay32.hpp +21 -0
  55. data/vendor/cybozulib/include/cybozu/link_mpir.hpp +18 -0
  56. data/vendor/cybozulib/include/cybozu/link_ssleay32.hpp +19 -0
  57. data/vendor/cybozulib/include/cybozu/log.hpp +237 -0
  58. data/vendor/cybozulib/include/cybozu/minixml.hpp +452 -0
  59. data/vendor/cybozulib/include/cybozu/mmap.hpp +143 -0
  60. data/vendor/cybozulib/include/cybozu/mutex.hpp +144 -0
  61. data/vendor/cybozulib/include/cybozu/nlp/mecab.hpp +96 -0
  62. data/vendor/cybozulib/include/cybozu/nlp/plsi.hpp +315 -0
  63. data/vendor/cybozulib/include/cybozu/nlp/random.hpp +74 -0
  64. data/vendor/cybozulib/include/cybozu/nlp/sparse.hpp +529 -0
  65. data/vendor/cybozulib/include/cybozu/nlp/svd.hpp +486 -0
  66. data/vendor/cybozulib/include/cybozu/nlp/tfidf.hpp +226 -0
  67. data/vendor/cybozulib/include/cybozu/nlp/top_score.hpp +75 -0
  68. data/vendor/cybozulib/include/cybozu/option.hpp +743 -0
  69. data/vendor/cybozulib/include/cybozu/parallel.hpp +88 -0
  70. data/vendor/cybozulib/include/cybozu/pcg.hpp +72 -0
  71. data/vendor/cybozulib/include/cybozu/process.hpp +324 -0
  72. data/vendor/cybozulib/include/cybozu/quit_signal_handler.hpp +66 -0
  73. data/vendor/cybozulib/include/cybozu/random_generator.hpp +144 -0
  74. data/vendor/cybozulib/include/cybozu/regex.hpp +463 -0
  75. data/vendor/cybozulib/include/cybozu/select8.hpp +279 -0
  76. data/vendor/cybozulib/include/cybozu/serializer.hpp +363 -0
  77. data/vendor/cybozulib/include/cybozu/sha1.hpp +209 -0
  78. data/vendor/cybozulib/include/cybozu/sha2.hpp +506 -0
  79. data/vendor/cybozulib/include/cybozu/siphash.hpp +105 -0
  80. data/vendor/cybozulib/include/cybozu/socket.hpp +785 -0
  81. data/vendor/cybozulib/include/cybozu/ssl.hpp +203 -0
  82. data/vendor/cybozulib/include/cybozu/stacktrace.hpp +291 -0
  83. data/vendor/cybozulib/include/cybozu/stream.hpp +269 -0
  84. data/vendor/cybozulib/include/cybozu/string.hpp +1746 -0
  85. data/vendor/cybozulib/include/cybozu/string_operation.hpp +365 -0
  86. data/vendor/cybozulib/include/cybozu/sucvector.hpp +378 -0
  87. data/vendor/cybozulib/include/cybozu/test.hpp +373 -0
  88. data/vendor/cybozulib/include/cybozu/thread.hpp +229 -0
  89. data/vendor/cybozulib/include/cybozu/time.hpp +281 -0
  90. data/vendor/cybozulib/include/cybozu/tls.hpp +115 -0
  91. data/vendor/cybozulib/include/cybozu/unordered_map.hpp +13 -0
  92. data/vendor/cybozulib/include/cybozu/unordered_set.hpp +13 -0
  93. data/vendor/cybozulib/include/cybozu/v128.hpp +376 -0
  94. data/vendor/cybozulib/include/cybozu/wavelet_matrix.hpp +345 -0
  95. data/vendor/cybozulib/include/cybozu/xorshift.hpp +189 -0
  96. data/vendor/cybozulib/include/cybozu/zlib.hpp +325 -0
  97. data/vendor/cybozulib/include/sais.hxx +364 -0
  98. data/vendor/cybozulib/misc/make_select8tbl.cpp +26 -0
  99. data/vendor/cybozulib/mk.bat +37 -0
  100. data/vendor/cybozulib/readme.md +29 -0
  101. data/vendor/cybozulib/release.props +12 -0
  102. data/vendor/cybozulib/sample/Makefile +30 -0
  103. data/vendor/cybozulib/sample/csucvector_smpl.cpp +42 -0
  104. data/vendor/cybozulib/sample/data/svd/org/test1.S +4 -0
  105. data/vendor/cybozulib/sample/data/svd/org/test1.U +4 -0
  106. data/vendor/cybozulib/sample/data/svd/org/test1.V +6 -0
  107. data/vendor/cybozulib/sample/data/svd/test1 +4 -0
  108. data/vendor/cybozulib/sample/data/svd/test2 +4 -0
  109. data/vendor/cybozulib/sample/desymbol.cpp +127 -0
  110. data/vendor/cybozulib/sample/exception_smpl.cpp +46 -0
  111. data/vendor/cybozulib/sample/fmindex_smpl.cpp +231 -0
  112. data/vendor/cybozulib/sample/log_smpl.cpp +19 -0
  113. data/vendor/cybozulib/sample/mecab_smpl.cpp +37 -0
  114. data/vendor/cybozulib/sample/option2_smpl.cpp +68 -0
  115. data/vendor/cybozulib/sample/option_smpl.cpp +42 -0
  116. data/vendor/cybozulib/sample/plsi_smpl.cpp +207 -0
  117. data/vendor/cybozulib/sample/proj/exception_smpl.vcproj +184 -0
  118. data/vendor/cybozulib/sample/proj/mecab_smpl.vcproj +184 -0
  119. data/vendor/cybozulib/sample/proj/ssl_smpl/ssl_smpl.vcxproj +85 -0
  120. data/vendor/cybozulib/sample/proj/ssl_smpl.vcproj +347 -0
  121. data/vendor/cybozulib/sample/proj/stacktrace_smpl/stacktrace_smpl.vcxproj +85 -0
  122. data/vendor/cybozulib/sample/proj/svd_smpl.vcproj +184 -0
  123. data/vendor/cybozulib/sample/quit_signal_handler.cpp +30 -0
  124. data/vendor/cybozulib/sample/serializer_smpl.cpp +196 -0
  125. data/vendor/cybozulib/sample/socket_smpl.cpp +82 -0
  126. data/vendor/cybozulib/sample/ssl_smpl.cpp +39 -0
  127. data/vendor/cybozulib/sample/stacktrace_smpl.cpp +52 -0
  128. data/vendor/cybozulib/sample/svd_bench_smpl.cpp +143 -0
  129. data/vendor/cybozulib/sample/svd_smpl.cpp +94 -0
  130. data/vendor/cybozulib/sample/wm_bench_smpl.cpp +182 -0
  131. data/vendor/cybozulib/sample/zlib_smpl.cpp +41 -0
  132. data/vendor/cybozulib/src/Makefile +8 -0
  133. data/vendor/cybozulib/src/base/Makefile +19 -0
  134. data/vendor/cybozulib/test/Makefile +12 -0
  135. data/vendor/cybozulib/test/base/Makefile +37 -0
  136. data/vendor/cybozulib/test/base/array_test.cpp +173 -0
  137. data/vendor/cybozulib/test/base/atoi_test.cpp +774 -0
  138. data/vendor/cybozulib/test/base/atomic_test.cpp +49 -0
  139. data/vendor/cybozulib/test/base/base64_test.cpp +113 -0
  140. data/vendor/cybozulib/test/base/bit_operation_test.cpp +134 -0
  141. data/vendor/cybozulib/test/base/bitvector_test.cpp +204 -0
  142. data/vendor/cybozulib/test/base/condition_variable_cs_test.cpp +92 -0
  143. data/vendor/cybozulib/test/base/condition_variable_test.cpp +88 -0
  144. data/vendor/cybozulib/test/base/config_test.cpp +236 -0
  145. data/vendor/cybozulib/test/base/crypto_test.cpp +122 -0
  146. data/vendor/cybozulib/test/base/csucvector_test.cpp +63 -0
  147. data/vendor/cybozulib/test/base/csv_test.cpp +182 -0
  148. data/vendor/cybozulib/test/base/data/a.xml +26 -0
  149. data/vendor/cybozulib/test/base/endian_test.cpp +56 -0
  150. data/vendor/cybozulib/test/base/env_test.cpp +22 -0
  151. data/vendor/cybozulib/test/base/event_test.cpp +41 -0
  152. data/vendor/cybozulib/test/base/file_test.cpp +233 -0
  153. data/vendor/cybozulib/test/base/fmindex_test.cpp +118 -0
  154. data/vendor/cybozulib/test/base/format_test.cpp +12 -0
  155. data/vendor/cybozulib/test/base/frequency_test.cpp +104 -0
  156. data/vendor/cybozulib/test/base/itoa_test.cpp +522 -0
  157. data/vendor/cybozulib/test/base/line_stream_test.cpp +208 -0
  158. data/vendor/cybozulib/test/base/mecab_test.cpp +41 -0
  159. data/vendor/cybozulib/test/base/minixml_test.cpp +103 -0
  160. data/vendor/cybozulib/test/base/mmap_test.cpp +15 -0
  161. data/vendor/cybozulib/test/base/option_test.cpp +487 -0
  162. data/vendor/cybozulib/test/base/parallel_test.cpp +48 -0
  163. data/vendor/cybozulib/test/base/proj/array_test/array_test.vcxproj +86 -0
  164. data/vendor/cybozulib/test/base/proj/atoi_test/atoi_test.vcxproj +86 -0
  165. data/vendor/cybozulib/test/base/proj/atomic_test/atomic_test.vcxproj +86 -0
  166. data/vendor/cybozulib/test/base/proj/base64_test/base64_test.vcxproj +86 -0
  167. data/vendor/cybozulib/test/base/proj/condition_variable_cs_test/condition_variable_cs_test.vcxproj +86 -0
  168. data/vendor/cybozulib/test/base/proj/condition_variable_test/condition_variable_test.vcxproj +86 -0
  169. data/vendor/cybozulib/test/base/proj/config_test/config_test.vcxproj +86 -0
  170. data/vendor/cybozulib/test/base/proj/csv_test/csv_test.vcxproj +86 -0
  171. data/vendor/cybozulib/test/base/proj/endian_test/endian_test.vcxproj +86 -0
  172. data/vendor/cybozulib/test/base/proj/env_test/env_test.vcxproj +86 -0
  173. data/vendor/cybozulib/test/base/proj/event_test/event_test.vcxproj +86 -0
  174. data/vendor/cybozulib/test/base/proj/file_test/file_test.vcxproj +86 -0
  175. data/vendor/cybozulib/test/base/proj/itoa_test/itoa_test.vcxproj +86 -0
  176. data/vendor/cybozulib/test/base/proj/mecab_test/mecab_test.vcxproj +88 -0
  177. data/vendor/cybozulib/test/base/proj/minixml_test/minixml_test.vcxproj +86 -0
  178. data/vendor/cybozulib/test/base/proj/mmap_test/mmap_test.vcxproj +86 -0
  179. data/vendor/cybozulib/test/base/proj/serializer_test/serializer_test.vcxproj +86 -0
  180. data/vendor/cybozulib/test/base/proj/sha1_test/sha1_test.vcxproj +86 -0
  181. data/vendor/cybozulib/test/base/proj/stream_test/stream_test.vcxproj +86 -0
  182. data/vendor/cybozulib/test/base/proj/string_operation_test/string_operation_test.vcxproj +86 -0
  183. data/vendor/cybozulib/test/base/proj/string_test/string_test.vcxproj +86 -0
  184. data/vendor/cybozulib/test/base/proj/thread_test/thread_test.vcxproj +86 -0
  185. data/vendor/cybozulib/test/base/proj/time_test/time_test.vcxproj +86 -0
  186. data/vendor/cybozulib/test/base/proj/tls_test/tls_test.vcxproj +86 -0
  187. data/vendor/cybozulib/test/base/proj/zlib_test/zlib_test.vcxproj +86 -0
  188. data/vendor/cybozulib/test/base/random_generator_test.cpp +28 -0
  189. data/vendor/cybozulib/test/base/regex_test.cpp +74 -0
  190. data/vendor/cybozulib/test/base/serializer_test.cpp +483 -0
  191. data/vendor/cybozulib/test/base/sha1_test.cpp +61 -0
  192. data/vendor/cybozulib/test/base/sha2_test.cpp +191 -0
  193. data/vendor/cybozulib/test/base/siphash_test.cpp +33 -0
  194. data/vendor/cybozulib/test/base/socket_test.cpp +76 -0
  195. data/vendor/cybozulib/test/base/stream_test.cpp +101 -0
  196. data/vendor/cybozulib/test/base/string_operation_test.cpp +340 -0
  197. data/vendor/cybozulib/test/base/string_test.cpp +1705 -0
  198. data/vendor/cybozulib/test/base/sucvector_test.cpp +312 -0
  199. data/vendor/cybozulib/test/base/thread_test.cpp +62 -0
  200. data/vendor/cybozulib/test/base/time_test.cpp +164 -0
  201. data/vendor/cybozulib/test/base/tls_test.cpp +50 -0
  202. data/vendor/cybozulib/test/base/wavelet_matrix_test.cpp +145 -0
  203. data/vendor/cybozulib/test/base/zlib_test.cpp +371 -0
  204. data/vendor/cybozulib/test/nlp/Makefile +27 -0
  205. data/vendor/cybozulib/test/nlp/proj/random_test.vcproj +184 -0
  206. data/vendor/cybozulib/test/nlp/proj/sparse_test.vcproj +184 -0
  207. data/vendor/cybozulib/test/nlp/proj/svd_test.vcproj +184 -0
  208. data/vendor/cybozulib/test/nlp/random_test.cpp +62 -0
  209. data/vendor/cybozulib/test/nlp/sparse_test.cpp +347 -0
  210. data/vendor/cybozulib/test/nlp/svd_test.cpp +234 -0
  211. data/vendor/cybozulib/test/nlp/top_score_test.cpp +40 -0
  212. data/vendor/cybozulib/tool/create_vcproj.py +186 -0
  213. data/vendor/cybozulib/tool/vcproj_tmpl.py +185 -0
  214. data/vendor/msoffice/COPYRIGHT +27 -0
  215. data/vendor/msoffice/Makefile +29 -0
  216. data/vendor/msoffice/bin/64/msoc.dll +0 -0
  217. data/vendor/msoffice/bin/64/msocsample.exe +0 -0
  218. data/vendor/msoffice/bin/64/msoffice-crypt.exe +0 -0
  219. data/vendor/msoffice/bin/msoc.dll +0 -0
  220. data/vendor/msoffice/bin/msocsample.exe +0 -0
  221. data/vendor/msoffice/bin/msoffice-crypt.exe +0 -0
  222. data/vendor/msoffice/common.mk +71 -0
  223. data/vendor/msoffice/common.props +26 -0
  224. data/vendor/msoffice/debug.props +14 -0
  225. data/vendor/msoffice/include/attack.hpp +211 -0
  226. data/vendor/msoffice/include/cfb.hpp +777 -0
  227. data/vendor/msoffice/include/crypto_util.hpp +450 -0
  228. data/vendor/msoffice/include/custom_sha1.hpp +342 -0
  229. data/vendor/msoffice/include/decode.hpp +240 -0
  230. data/vendor/msoffice/include/encode.hpp +221 -0
  231. data/vendor/msoffice/include/make_dataspace.hpp +316 -0
  232. data/vendor/msoffice/include/msoc.h +129 -0
  233. data/vendor/msoffice/include/resource.hpp +7 -0
  234. data/vendor/msoffice/include/standard_encryption.hpp +145 -0
  235. data/vendor/msoffice/include/uint32vec.hpp +179 -0
  236. data/vendor/msoffice/include/util.hpp +212 -0
  237. data/vendor/msoffice/lib/.emptydir +0 -0
  238. data/vendor/msoffice/misc/decrypt-xls.vbs +46 -0
  239. data/vendor/msoffice/mk.bat +1 -0
  240. data/vendor/msoffice/mkdll.bat +3 -0
  241. data/vendor/msoffice/msoc.def +13 -0
  242. data/vendor/msoffice/msocsample.py +178 -0
  243. data/vendor/msoffice/msoffice12.sln +31 -0
  244. data/vendor/msoffice/readme.md +110 -0
  245. data/vendor/msoffice/release.props +28 -0
  246. data/vendor/msoffice/src/Makefile +19 -0
  247. data/vendor/msoffice/src/attack.cpp +124 -0
  248. data/vendor/msoffice/src/cfb_test.cpp +77 -0
  249. data/vendor/msoffice/src/minisample.c +54 -0
  250. data/vendor/msoffice/src/msocdll.cpp +276 -0
  251. data/vendor/msoffice/src/msocsample.c +136 -0
  252. data/vendor/msoffice/src/msoffice-crypt.cpp +219 -0
  253. data/vendor/msoffice/src/proj/attack/attack.vcxproj +88 -0
  254. data/vendor/msoffice/src/proj/main/msoffice-crypt.vcxproj +88 -0
  255. data/vendor/msoffice/src/sha1.cpp +234 -0
  256. data/vendor/msoffice/test/Makefile +20 -0
  257. data/vendor/msoffice/test/cfb_test.cpp +74 -0
  258. data/vendor/msoffice/test/hash_test.cpp +59 -0
  259. data/vendor/msoffice/test/proj/cfb/cfb_test.vcxproj +90 -0
  260. data/vendor/msoffice/test/proj/hash/hash_test.vcxproj +90 -0
  261. data/vendor/msoffice/test/sampl.bat +8 -0
  262. data/vendor/msoffice/test_all.py +46 -0
  263. data/vendor/update +4 -0
  264. metadata +351 -0
@@ -0,0 +1,1705 @@
1
+ // don't delete bom(EF BB BF) for visual stduio
2
+ #include <iostream>
3
+ #include <fstream>
4
+ #include <sstream>
5
+ #include <stdio.h>
6
+ #include <assert.h>
7
+ #include <vector>
8
+ #include <iterator>
9
+ #include <stdexcept>
10
+ #include <cybozu/string.hpp>
11
+ #include <cybozu/test.hpp>
12
+
13
+ using namespace cybozu;
14
+
15
+ #ifdef _MSC_VER
16
+ #pragma warning(disable : 4309)
17
+ #endif
18
+
19
+ ///////// iterator
20
+
21
+ #ifdef _MSC_VER
22
+ #define STR(x) L ## x
23
+ #else
24
+ #define STR(x) x
25
+ #endif
26
+
27
+ CYBOZU_TEST_AUTO(string_iterator_test)
28
+ {
29
+ // String s(STR("これはUTF-8 1"));
30
+ String s("\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1");
31
+ String t;
32
+ std::copy(s.begin(), s.end(), std::back_inserter(t));
33
+ CYBOZU_TEST_EQUAL(s, t);
34
+ }
35
+
36
+ CYBOZU_TEST_AUTO(string_reverse_iterator_test)
37
+ {
38
+ /* String s("これはUTF-8 1"); */
39
+ String s("\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1");
40
+ String t;
41
+ std::copy(s.rbegin(), s.rend(), std::back_inserter(t));
42
+ /* String checked("1 8-FTUはれこ"); */
43
+ String checked("1 8-FTU" "\xe3\x81\xaf\xe3\x82\x8c\xe3\x81\x93");
44
+ CYBOZU_TEST_EQUAL(t, checked);
45
+ }
46
+
47
+ CYBOZU_TEST_AUTO(string_iterater_test_push_back)
48
+ {
49
+ /* String s("これはUTF-8 1"); */
50
+ String s("\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1");
51
+ Char t = '2';
52
+ s.push_back(t);
53
+ /* String checked("これはUTF-8 12"); */
54
+ String checked("\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 12");
55
+ CYBOZU_TEST_EQUAL(s, checked);
56
+ }
57
+
58
+ ///////// utility
59
+
60
+ // copy [off, off + count) to [dest, dest + count)
61
+ CYBOZU_TEST_AUTO(string_util_test_copy)
62
+ {
63
+ /* String s("あいueお"), t; */
64
+ String s("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x8A"), t;
65
+ Char dest[100];
66
+ s.copy(dest, 3, 1);
67
+ dest[3] = '\0'; /* copy method does not terminate */
68
+ t = dest;
69
+ /* "いue" */
70
+ CYBOZU_TEST_EQUAL(t, "\xe3\x81\x84\x75\x65");
71
+ }
72
+
73
+ // exchange contents with rhs
74
+ CYBOZU_TEST_AUTO(string_util_test_swap)
75
+ {
76
+ /* String s("あいueお"), t("abcうえf"); */
77
+ String s("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x8A");
78
+ String t("\x61\x62\x63\xe3\x81\x86\xe3\x81\x88\x66");
79
+ s.swap(t);
80
+ /* CYBOZU_TEST_EQUAL(t, "あいueお"); */
81
+ CYBOZU_TEST_EQUAL(t, "\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x8A");
82
+ /* CYBOZU_TEST_EQUAL(s, "abcうえf"); */
83
+ CYBOZU_TEST_EQUAL(s, "\x61\x62\x63\xe3\x81\x86\xe3\x81\x88\x66");
84
+ }
85
+
86
+ // return [off, off + count) as new string
87
+ CYBOZU_TEST_AUTO(string_util_test_substr)
88
+ {
89
+ /* String s("あいueお"); */
90
+ String s("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x8A");
91
+ String t = s.substr(1, 3);
92
+ /* CYBOZU_TEST_EQUAL(t, "いue"); */
93
+ CYBOZU_TEST_EQUAL(t, "\xe3\x81\x84\x75\x65");
94
+ }
95
+ /////////// compare //////////
96
+ //// String
97
+ // compare [0, _Mysize) with rhs
98
+ CYBOZU_TEST_AUTO(string_util_test_compare_cybozu_str)
99
+ {
100
+ /* String s("ういのおくやま"); */
101
+ String s("\xE3\x81\x86\xE3\x81\x84\xE3\x81\xAE\xE3\x81\x8A\xE3\x81\x8F\xE3\x82\x84\xE3\x81\xBE");
102
+ /* String t("ういのおくやま"); */
103
+ String t("\xE3\x81\x86\xE3\x81\x84\xE3\x81\xAE\xE3\x81\x8A\xE3\x81\x8F\xE3\x82\x84\xE3\x81\xBE");
104
+ /* String t("うゐのおくやま"); */
105
+ String u("\xE3\x81\x86\xE3\x82\x90\xE3\x81\xAE\xE3\x81\x8A\xE3\x81\x8F\xE3\x82\x84\xE3\x81\xBE");
106
+
107
+ CYBOZU_TEST_ASSERT(s.compare(t) == 0);
108
+ CYBOZU_TEST_ASSERT(s.compare(u) != 0);
109
+ }
110
+
111
+ // compare [off, off + n) with rhs
112
+ CYBOZU_TEST_AUTO(string_util_test_compare_cybozu_substring)
113
+ {
114
+ /* String s("ういのおくやま"); */
115
+ String s("\xE3\x81\x86\xE3\x81\x84\xE3\x81\xAE\xE3\x81\x8A\xE3\x81\x8F\xE3\x82\x84\xE3\x81\xBE");
116
+ /* String t("おくやま"); */
117
+ String t("\xE3\x81\x8A\xE3\x81\x8F\xE3\x82\x84\xE3\x81\xBE");
118
+
119
+ CYBOZU_TEST_EQUAL(s.compare(3, 4, t), 0);
120
+ }
121
+
122
+ // compare [off, off + n) with rhs [rhsOff, rhsOff + count)
123
+ CYBOZU_TEST_AUTO(string_util_test_compare_cybozu_substring_substring)
124
+ {
125
+ /* String s("あいu いue おく"); */
126
+ String s("\xe3\x81\x82\xe3\x81\x84u"
127
+ " "
128
+ "\xe3\x81\x84\x75\x65"
129
+ " "
130
+ "\xE3\x81\x8A\xE3\x81\x8F");
131
+ /* "あいueお" "いue" "abc" */
132
+ String t("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x8A" "\xe3\x81\x84\x75\x65" "abc");
133
+ printf("size=%d, %d\n", (int)s.size(), (int)t.size());
134
+ CYBOZU_TEST_EQUAL(s.compare(4, 3, t, 5, 3), 0);
135
+ }
136
+
137
+ //// Char *
138
+ // compare [0, _Mysize) with [str, <null>)
139
+ CYBOZU_TEST_AUTO(string_util_test_compare_cybozu_char_array_zero)
140
+ {
141
+ String s("doragon");
142
+ Char t[] = {'d','o','r','a','g','o','n', 0};
143
+ CYBOZU_TEST_EQUAL(s.compare(t), 0);
144
+ }
145
+
146
+ CYBOZU_TEST_AUTO(string_util_test_compare_offset_cybozu_char_array_zero)
147
+ {
148
+ String s("doragon quest");
149
+ Char t[] = {'d','o','r','a','g','o','n', 0};
150
+ CYBOZU_TEST_EQUAL(s.compare(0, 7, t), 0);
151
+ }
152
+
153
+ CYBOZU_TEST_AUTO(string_util_test_compare_offset_cybozu_char_array_zero_offset)
154
+ {
155
+ String s("doragon quest");
156
+ Char t[] = {'q','u','e','s','t', ' ', '5', 0};
157
+ CYBOZU_TEST_EQUAL(s.compare(8, 5, t, 5), 0);
158
+ }
159
+
160
+ CYBOZU_TEST_AUTO(string_util_test_toUtf8string)
161
+ {
162
+ std::string s("doragon");
163
+ String t("doragon");
164
+ t.toUtf8();
165
+ CYBOZU_TEST_EQUAL(t.toUtf8(), s);
166
+
167
+ s.erase();
168
+ t.erase();
169
+ /* s = "あいうえお"; */
170
+ s = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
171
+ /* t = "あいうえお"; */
172
+ t = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
173
+ CYBOZU_TEST_EQUAL(t.toUtf8(), s);
174
+
175
+ /* "どabcれ" "(丈に点)" 最後の文字はサロゲートペアになる文字 */
176
+ const Char cs[] = { 0x00003069, 0x00000061, 0x00000062, 0x00000063, 0x0000308c, 0x0002000b, 0 };
177
+ String ss(cs);
178
+ CYBOZU_TEST_EQUAL(ss, "\xe3\x81\xa9" "abc" "\xe3\x82\x8c" "\xf0\xa0\x80\x8b");
179
+ }
180
+
181
+ CYBOZU_TEST_AUTO(string_constructor_char_array_test)
182
+ {
183
+ const Char str[] = { 'a', 'b', 'c', 'd', 'e', 0 };
184
+ String a(str, 5);
185
+ std::stringstream ss;
186
+ ss << a;
187
+ CYBOZU_TEST_EQUAL(ss.str(), "abcde");
188
+ }
189
+
190
+ CYBOZU_TEST_AUTO(string_constructor_substring_test)
191
+ {
192
+ const Char str[] = { 'a', 'b', 'c', 'd', 'e', 0 };
193
+ String a(str, 5);
194
+ String b(a, 1, 2);
195
+ std::stringstream ss;
196
+ ss << b;
197
+ CYBOZU_TEST_EQUAL(ss.str(), "bc");
198
+ }
199
+
200
+ CYBOZU_TEST_AUTO(string_constructor_zeroterminated_test)
201
+ {
202
+ const Char str[] = { 'a', 'b', 'c', 'd', 'e', 0 };
203
+ String a(str);
204
+ std::stringstream ss;
205
+ ss << a;
206
+ CYBOZU_TEST_EQUAL(ss.str(), "abcde");
207
+ }
208
+
209
+ CYBOZU_TEST_AUTO(string_constructor_from_count_times_c)
210
+ {
211
+ String a(10, 'a');
212
+ std::stringstream ss;
213
+ ss << a;
214
+ CYBOZU_TEST_EQUAL(ss.str(), "aaaaaaaaaa");
215
+ }
216
+
217
+ CYBOZU_TEST_AUTO(string_constructor_surrogate_pair_test)
218
+ {
219
+ /* "どabcれ" "(丈に点)" 最後の文字はサロゲートペアになる文字 */
220
+ String a("\xe3\x81\xa9" "abc" "\xe3\x82\x8c" "\xf0\xa0\x80\x8b");
221
+ const Char s[] = { 0x00003069, 0x00000061, 0x00000062, 0x00000063, 0x0000308c, 0x0002000b, 0 };
222
+ std::stringstream ss;
223
+ ss << a;
224
+ CYBOZU_TEST_EQUAL(a, s);
225
+ CYBOZU_TEST_EQUAL(ss.str(), "\xe3\x81\xa9" "abc" "\xe3\x82\x8c" "\xf0\xa0\x80\x8b");
226
+ }
227
+
228
+ // test iterator
229
+ CYBOZU_TEST_AUTO(string_constructor_iterator_test)
230
+ {
231
+ /* std::string a("What is 寿限無寿限無?"); */
232
+ std::string a("What is " "\xE5\xAF\xBF\xE9\x99\x90\xE7\x84\xA1" "?");
233
+ String s(a.begin() + 5, a.end());
234
+ std::string b("is " "\xE5\xAF\xBF\xE9\x99\x90\xE7\x84\xA1" "?");
235
+ /* CYBOZU_TEST_EQUAL(s, "is 寿限無寿限無?"); */
236
+ CYBOZU_TEST_EQUAL(s, b);
237
+ }
238
+
239
+ CYBOZU_TEST_AUTO(string_constructor_comp_test)
240
+ {
241
+ const Char s[] = { 0x8868, 0 };
242
+ /* String a("表"); */
243
+ String a("\xE8\xA1\xA8");
244
+ String b(s, 1);
245
+ CYBOZU_TEST_EQUAL(a, b);
246
+ }
247
+
248
+ // pointer
249
+ CYBOZU_TEST_AUTO(string_constructor_pointer_test)
250
+ {
251
+ /* const char a[] = "What is 寿限無寿限無?"; */
252
+ const char a[] = "What is " "\xE5\xAF\xBF\xE9\x99\x90\xE7\x84\xA1" "?";
253
+ String s(a, a + CYBOZU_NUM_OF_ARRAY(a) - 1);
254
+ String x("What is " "\xE5\xAF\xBF\xE9\x99\x90\xE7\x84\xA1" "?");
255
+ /* CYBOZU_TEST_EQUAL(s, "What is 寿限無寿限無?"); */
256
+ CYBOZU_TEST_EQUAL(s, x);
257
+
258
+ String t(a + 3, a + 6);
259
+ CYBOZU_TEST_EQUAL(t, "t i");
260
+ }
261
+
262
+ // stringstream(char)
263
+ CYBOZU_TEST_AUTO(string_constructor_stringstream_test)
264
+ {
265
+ std::basic_stringstream<char> ss;
266
+ ss << "\xe3\x81\xa9" "abc" "\xe3\x82\x8c" "\xf0\xa0\x80\x8b";
267
+ String a(std::istreambuf_iterator<char>(ss.rdbuf()), std::istreambuf_iterator<char>());
268
+
269
+ CYBOZU_TEST_EQUAL(a, "\xe3\x81\xa9" "abc" "\xe3\x82\x8c" "\xf0\xa0\x80\x8b");
270
+ }
271
+
272
+ // stringstream(Char)
273
+ CYBOZU_TEST_AUTO(string_constructor_stringstream_Char_test)
274
+ {
275
+ std::basic_stringstream<Char> ss;
276
+ const Char s[] = { 0x00003069, 0x00000061, 0x00000062, 0x00000063, 0x0000308c, 0x0002000b, 0 };
277
+
278
+ ss << s;
279
+ String a(std::istreambuf_iterator<Char>(ss.rdbuf()), std::istreambuf_iterator<Char>());
280
+ CYBOZU_TEST_EQUAL(a, "\xe3\x81\xa9" "abc" "\xe3\x82\x8c" "\xf0\xa0\x80\x8b");
281
+ }
282
+
283
+ //from Char16
284
+ CYBOZU_TEST_AUTO(string_constructor_char16_test)
285
+ {
286
+ const Char16 str[] = { 'a', 'b', 'c', 'd', 'e', 0 };
287
+ String16 a(str);
288
+ String s(a);
289
+ CYBOZU_TEST_EQUAL(s, "abcde");
290
+ }
291
+
292
+ ///////// index
293
+
294
+ CYBOZU_TEST_AUTO(string_index_test_at)
295
+ {
296
+ /* String s("これはUTF-8 1"); */
297
+ String s("\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1");
298
+ Char t = s.at(3);
299
+ Char c = 'U';
300
+ CYBOZU_TEST_EQUAL(t, c);
301
+ }
302
+
303
+ CYBOZU_TEST_AUTO(string_index_test_at_exception)
304
+ {
305
+ try {
306
+ /* String s("これはUTF-8 1"); */
307
+ String s("\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1");
308
+ s.at(200);
309
+ CYBOZU_TEST_FAIL("NEVER REACHED!");
310
+ } catch (std::out_of_range&) {
311
+ std::cout << "std::out_of_range thrown!" << std::endl;
312
+ } catch (...) {
313
+ CYBOZU_TEST_FAIL("NEVER REACHED!");
314
+ }
315
+ }
316
+
317
+ CYBOZU_TEST_AUTO(string_index_test_index)
318
+ {
319
+ /* String s("これはUTF-8 1"); */
320
+ String s("\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1");
321
+ Char t = s[6];
322
+ Char c = '-';
323
+ CYBOZU_TEST_EQUAL(t, c);
324
+ }
325
+
326
+ //cybozu::String
327
+ CYBOZU_TEST_AUTO(string_append_op_test_string)
328
+ {
329
+ /* const char cs2[] = "です"; */
330
+ const char cs2[] = "\xE3\x81\xA7\xE3\x81\x99";
331
+ /* String s = "これはUTF-8"; */
332
+ String s = "\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8";
333
+ s += cs2;
334
+ String checked = "\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8" "\xE3\x81\xA7\xE3\x81\x99";
335
+ /* CYBOZU_TEST_EQUAL(s, "これはUTF-8です"); */
336
+ CYBOZU_TEST_EQUAL(s, checked);
337
+ }
338
+
339
+ //Char [] Null Terminated
340
+ CYBOZU_TEST_AUTO(string_append_op_test_char_array)
341
+ {
342
+ /* "こUTF-8 3"; */
343
+ const Char c[] = { 0x00003053, 0x00000055, 0x00000054, 0x00000046, 0x0000002d, 0x00000038, ' ', '3', 0 };
344
+ /* String s = "あああ"; */
345
+ String s = "\xE3\x81\x82\xE3\x81\x82\xE3\x81\x82";
346
+ s += c;
347
+ String checked = "\xE3\x81\x82\xE3\x81\x82\xE3\x81\x82" "\xe3\x81\x93" "UTF-8 3";
348
+ /* CYBOZU_TEST_EQUAL(s, "あああこUTF-8 3"); */
349
+ CYBOZU_TEST_EQUAL(s, checked);
350
+ }
351
+
352
+ //Char
353
+ CYBOZU_TEST_AUTO(string_append_op_test_char)
354
+ {
355
+ /* "こUTF-8 3"; */
356
+ const Char c = '3';
357
+ /* String s = "あああ"; */
358
+ String s = "\xE3\x81\x82\xE3\x81\x82\xE3\x81\x82";
359
+ s += c;
360
+ /* CYBOZU_TEST_EQUAL(s, "あああ3"); */
361
+ String checked = "\xE3\x81\x82\xE3\x81\x82\xE3\x81\x82\x33";
362
+ CYBOZU_TEST_EQUAL(s, checked);
363
+ }
364
+
365
+ //cybozu::String
366
+ CYBOZU_TEST_AUTO(string_append_test_string)
367
+ {
368
+ /* String s = "あああ"; */
369
+ String s = "\xE3\x81\x82\xE3\x81\x82\xE3\x81\x82";
370
+ String t;
371
+ t.append(s);
372
+ /* CYBOZU_TEST_EQUAL(t, "あああ"); */
373
+ CYBOZU_TEST_EQUAL(t, "\xE3\x81\x82\xE3\x81\x82\xE3\x81\x82");
374
+ }
375
+
376
+ //cybozu::String
377
+ CYBOZU_TEST_AUTO(string_append_test_sub_string)
378
+ {
379
+ /* String s = "あIう"; */
380
+ String s = "\xE3\x81\x82\x49\xE3\x81\x86";
381
+ String t;
382
+ t.append(s, 1, 1);
383
+ CYBOZU_TEST_EQUAL(t, "I");
384
+ }
385
+
386
+ //Char[]
387
+ CYBOZU_TEST_AUTO(string_append_test_char_array_off_z)
388
+ {
389
+ /* "こUTF-8 3" */
390
+ const Char c[] = { 0x00003053, 0x00000055, 0x00000054, 0x00000046, 0x0000002d, 0x00000038, ' ', '3', 0 };
391
+ String t;
392
+ t.append(c,2);
393
+ /* CYBOZU_TEST_EQUAL(t, "こU"); */
394
+ const String checked = "\xE3\x81\x93\x55";
395
+ CYBOZU_TEST_EQUAL(t, checked);
396
+ }
397
+
398
+ //Zero terminated Char array
399
+ CYBOZU_TEST_AUTO(string_append_test_zero_terminated_char_array)
400
+ {
401
+ /* "こUTF-8 3" */
402
+ const Char c[] = { 0x00003053, 0x00000055, 0x00000054, 0x00000046, 0x0000002d, 0x00000038, ' ', '3', 0 };
403
+ String t;
404
+ t.append(c);
405
+ String checked = "\xe3\x81\x93" "UTF-8 3";
406
+ /* CYBOZU_TEST_EQUAL(t, "こUTF-8 3"); */
407
+ CYBOZU_TEST_EQUAL(t, checked);
408
+ }
409
+
410
+ //count * Char
411
+ CYBOZU_TEST_AUTO(string_append_test_multiple_char)
412
+ {
413
+ /* String t = "あいうえお"; */
414
+ String t = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
415
+ Char x = 'w';
416
+ t.append(10, x);
417
+ String checked = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A" "wwwwwwwwww";
418
+ CYBOZU_TEST_EQUAL(t, checked);
419
+ }
420
+
421
+ // test iterator
422
+ CYBOZU_TEST_AUTO(string_append_test_iterator)
423
+ {
424
+ /* std::string a("What is 寿限無寿限無?"); */
425
+ std::string a("What is " "\xE5\xAF\xBF\xE9\x99\x90\xE7\x84\xA1" "?");
426
+ String t;
427
+ t.append(a.begin() + 5, a.end());
428
+ std::string b("is " "\xE5\xAF\xBF\xE9\x99\x90\xE7\x84\xA1" "?");
429
+ /* CYBOZU_TEST_EQUAL(t, "is 寿限無寿限無?"); */
430
+ CYBOZU_TEST_EQUAL(t, b);
431
+ }
432
+
433
+ // append [str, str + count)
434
+ CYBOZU_TEST_AUTO(string_append_char_array)
435
+ {
436
+ const char cs[] = "abcdefg";
437
+ String t;
438
+ t.append(cs, 3);
439
+ CYBOZU_TEST_EQUAL(t, "abc");
440
+ }
441
+
442
+ // append [str, str + count)
443
+ CYBOZU_TEST_AUTO(string_append_char_array_null)
444
+ {
445
+ /* const char cs[] = "あいうえお"; */
446
+ const char cs[] = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
447
+ String t;
448
+ t.append(cs);
449
+ const String checked = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
450
+ /* CYBOZU_TEST_EQUAL(t,"あいうえお"); */
451
+ CYBOZU_TEST_EQUAL(t, checked);
452
+ }
453
+
454
+ // append str
455
+ CYBOZU_TEST_AUTO(string_append_std_string)
456
+ {
457
+ /* const std::string x = "サイボウズ"; */
458
+ const std::string x("\xE3\x82\xB5\xE3\x82\xA4\xE3\x83\x9C\xE3\x82\xA6\xE3\x82\xBA");
459
+ String t;
460
+ t.append(x);
461
+ /* CYBOZU_TEST_EQUAL(t,"サイボウズ"); */
462
+ String checked = "\xE3\x82\xB5\xE3\x82\xA4\xE3\x83\x9C\xE3\x82\xA6\xE3\x82\xBA";
463
+ CYBOZU_TEST_EQUAL(t, checked);
464
+ }
465
+
466
+ CYBOZU_TEST_AUTO(string_assignment_test_char_array)
467
+ {
468
+ /* const char cs[] = "これはUTF-8 1"; */
469
+ const char cs[] = "\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1";
470
+ String s;
471
+ s = cs;
472
+ String checked = "\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1";
473
+ /* CYBOZU_TEST_EQUAL(s, "これはUTF-8 1"); */
474
+ CYBOZU_TEST_EQUAL(s, checked);
475
+ }
476
+
477
+ CYBOZU_TEST_AUTO(string_assignment_test_std_string)
478
+ {
479
+ /* const std::string ss = "これは 2"; */
480
+ const std::string ss = "\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" " 2";
481
+ String s;
482
+ s = ss;
483
+ String checked = "\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" " 2";
484
+ /* CYBOZU_TEST_EQUAL(s, "これは 2"); */
485
+ CYBOZU_TEST_EQUAL(s, checked);
486
+ }
487
+
488
+ CYBOZU_TEST_AUTO(string_assignment_test_uchar_32)
489
+ {
490
+ /* "こUTF-8 3" */
491
+ const Char c[] = { 0x00003053, 0x00000055, 0x00000054, 0x00000046, 0x0000002d, 0x00000038, ' ', '3', 0 };
492
+ String s;
493
+ s = c;
494
+ /* CYBOZU_TEST_EQUAL(s, "こUTF-8 3"); */
495
+ String checked = "\xe3\x81\x93" "UTF-8 3";
496
+ CYBOZU_TEST_EQUAL(s, checked);
497
+ }
498
+
499
+ //cybozu::String
500
+ CYBOZU_TEST_AUTO(string_assignment_cybozu_string)
501
+ {
502
+ String s, ss;
503
+ /* s = "これはUTF-8 1"; */
504
+ s = "\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1";
505
+ ss = s;
506
+ CYBOZU_TEST_EQUAL(s, ss);
507
+ }
508
+
509
+ //Char
510
+ CYBOZU_TEST_AUTO(string_assignment_Char)
511
+ {
512
+ const Char c = 'a';
513
+ String s;
514
+ s = c;
515
+ CYBOZU_TEST_EQUAL(s, "a");
516
+ }
517
+
518
+ ////////////////////////////////////
519
+ //cybozu::String
520
+ CYBOZU_TEST_AUTO(string_assignment_cybozu_string_assign)
521
+ {
522
+ String s, ss;
523
+ /* s = "これはUTF-8 1"; */
524
+ s = "\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1";
525
+ ss.assign(s);
526
+ CYBOZU_TEST_EQUAL(ss, s);
527
+ }
528
+ // assign rhs [off, off + count)
529
+ CYBOZU_TEST_AUTO(string_assignment_cybozu_substring_assign)
530
+ {
531
+ String s, ss;
532
+ /* s = "これはUTF-8 2"; */
533
+ s = "\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 2";
534
+ ss.assign(s,3,4);
535
+ CYBOZU_TEST_EQUAL(ss, "UTF-");
536
+ }
537
+
538
+ // assign [str, str + count)
539
+ CYBOZU_TEST_AUTO(string_assignment_cybozu_char_array_assign)
540
+ {
541
+ String ss;
542
+ Char c[] = {'a','b','c','d','e','f',0};
543
+ ss.assign(c,3);
544
+ CYBOZU_TEST_EQUAL(ss, "abc");
545
+ }
546
+
547
+ // assign [str, <null>)
548
+ CYBOZU_TEST_AUTO(string_assignment_cybozu_char_array_zero_terminated)
549
+ {
550
+ String ss;
551
+ Char c[] = {'a','b','c','d','e','f',0};
552
+ ss.assign(c);
553
+ CYBOZU_TEST_EQUAL(ss, "abcdef");
554
+ }
555
+
556
+ // assign count * c
557
+ CYBOZU_TEST_AUTO(string_assignment_cybozu_multiple_char)
558
+ {
559
+ String ss;
560
+ Char c = 'X';
561
+ ss.assign(10, c);
562
+ CYBOZU_TEST_EQUAL(ss, "XXXXXXXXXX");
563
+ }
564
+
565
+ //Iterator
566
+ CYBOZU_TEST_AUTO(string_assignment_cybozu_iterator)
567
+ {
568
+ String ss;
569
+ /* std::string a("What is 寿限無寿限無?"); */
570
+ std::string a("What is " "\xE5\xAF\xBF\xE9\x99\x90\xE7\x84\xA1" "?");
571
+ ss.assign(a.begin()+3, a.end());
572
+ std::string b("t is " "\xE5\xAF\xBF\xE9\x99\x90\xE7\x84\xA1" "?");
573
+ CYBOZU_TEST_EQUAL(ss, b);
574
+ }
575
+
576
+ // assign [str, str + count)
577
+ CYBOZU_TEST_AUTO(string_assignment_cybozu_std_char_array)
578
+ {
579
+ String ss;
580
+ char c[] = "ABCDEFG";
581
+ ss.assign(c, 5);
582
+ CYBOZU_TEST_EQUAL(ss, "ABCDE");
583
+ }
584
+
585
+ // assign [str, <null>)
586
+ CYBOZU_TEST_AUTO(string_assignment_cybozu_std_char_array_assign)
587
+ {
588
+ String ss;
589
+ /* char c[] = "あいうえおー"; */
590
+ char c[] = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A\xE3\x83\xBC";
591
+ ss.assign(c);
592
+ std::string checked = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A\xE3\x83\xBC";
593
+ CYBOZU_TEST_EQUAL(ss, checked);
594
+ }
595
+
596
+ // assign str
597
+ CYBOZU_TEST_AUTO(string_assignment_cybozu_std_string_assign)
598
+ {
599
+ String ss;
600
+ /* std::string a("サイボウズ"); */
601
+ std::string a("\xE3\x82\xB5\xE3\x82\xA4\xE3\x83\x9C\xE3\x82\xA6\xE3\x82\xBA");
602
+ ss.assign(a);
603
+ String checked = "\xE3\x82\xB5\xE3\x82\xA4\xE3\x83\x9C\xE3\x82\xA6\xE3\x82\xBA";
604
+ /* CYBOZU_TEST_EQUAL(ss, "サイボウズ"); */
605
+ CYBOZU_TEST_EQUAL(ss, checked);
606
+
607
+ }
608
+
609
+ ///////// direct_access
610
+
611
+ // return pointer to null-terminated nonmutable arrya
612
+ CYBOZU_TEST_AUTO(string_utility_test_c_str)
613
+ {
614
+ String s("abcdefg");
615
+ const Char cs[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 0};
616
+ for (int i = 0; i<8 ; i++) {
617
+ CYBOZU_TEST_EQUAL(s.c_str()[i], cs[i]);
618
+ }
619
+ }
620
+
621
+ // return pointer to nonmutable array
622
+ CYBOZU_TEST_AUTO(string_utility_test_data)
623
+ {
624
+ String s("abcdefg");
625
+ const Char cs[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 0};
626
+ for (int i = 0; i<7 ; i++) {
627
+ CYBOZU_TEST_EQUAL(s.c_str()[i], cs[i]);
628
+ }
629
+ }
630
+
631
+ ///////// erase
632
+ // insert rhs at off
633
+ CYBOZU_TEST_AUTO(string_erase_test_cybozu_string)
634
+ {
635
+ /* String s("いろはにほへと"); */
636
+ String s("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
637
+ s.erase(2, 3);
638
+ /* CYBOZU_TEST_EQUAL(s, "いろへと"); */
639
+ String checked("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xB8\xE3\x81\xA8");
640
+ CYBOZU_TEST_EQUAL(s, checked);
641
+
642
+ /* String t("かきくけこ"); */
643
+ String t("\xE3\x81\x8B\xE3\x81\x8D\xE3\x81\x8F\xE3\x81\x91\xE3\x81\x93");
644
+ t.erase();
645
+ CYBOZU_TEST_EQUAL(t, "");
646
+ }
647
+
648
+ // erase element at here
649
+ CYBOZU_TEST_AUTO(string_erase_test_iterator)
650
+ {
651
+ /* String s("いろはにほへと"); */
652
+ String s("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
653
+ s.erase(s.begin() + 3);
654
+ /* CYBOZU_TEST_EQUAL(s, "いろはほへと"); */
655
+ String checked("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
656
+ CYBOZU_TEST_EQUAL(s, checked);
657
+ }
658
+
659
+ // erase substring [begin, end)
660
+ CYBOZU_TEST_AUTO(string_erase_test_iterator_substr)
661
+ {
662
+ /* String s("いろはにほへと"); */
663
+ String s("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
664
+ s.erase(s.begin()+3, s.end()-1);
665
+ /* CYBOZU_TEST_EQUAL(s, "いろはと"); */
666
+ String checked("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xA8");
667
+ CYBOZU_TEST_EQUAL(s, checked);
668
+ }
669
+
670
+ //erase all
671
+ CYBOZU_TEST_AUTO(string_erase_test_all)
672
+ {
673
+ /* String s("わかよたれそ"); */
674
+ String s("\xE3\x82\x8F\xE3\x81\x8B\xE3\x82\x88\xE3\x81\x9F\xE3\x82\x8C\xE3\x81\x9D");
675
+ s.clear();
676
+ CYBOZU_TEST_EQUAL(s, "");
677
+ }
678
+
679
+ ///////// find
680
+
681
+ // look for rhs beginnng at or after off
682
+ CYBOZU_TEST_AUTO(string_size_test_find_cybozu_string)
683
+ {
684
+ /* String s("あいueい"); */
685
+ String s("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x84");
686
+ /* const String t("い"); */
687
+ const String t("\xe3\x81\x84");
688
+
689
+ CYBOZU_TEST_EQUAL(s.find(t), 1);
690
+ CYBOZU_TEST_EQUAL(s.find(t, 2), 4);
691
+ }
692
+
693
+ // look for [str, str + count) beginnng at or after off
694
+ CYBOZU_TEST_AUTO(string_size_test_find_cybozu_char_array)
695
+ {
696
+ /* String s("あいueい"); */
697
+ String s("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x84");
698
+ const Char t[] = {'u','e'};
699
+ CYBOZU_TEST_EQUAL(s.find(t, 0, 2), 2);
700
+ CYBOZU_TEST_EQUAL(s.find(t, 3, 1), size_t(-1));
701
+ }
702
+
703
+ // look for [str, <null>) beginnng at or after off
704
+ CYBOZU_TEST_AUTO(string_size_test_find_cybozu_char_array_zero)
705
+ {
706
+ /* String s("あいueい"); */
707
+ String s("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x84");
708
+ const Char t[] = {'u','e', 0};
709
+ CYBOZU_TEST_EQUAL(s.find(t, 0), 2);
710
+ CYBOZU_TEST_EQUAL(s.find(t, 3), size_t(-1));
711
+ }
712
+
713
+ // look for c at or after off
714
+ CYBOZU_TEST_AUTO(string_size_test_find_cybozu_char)
715
+ {
716
+ /* String s("あいueい"); */
717
+ String s("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x84");
718
+ CYBOZU_TEST_EQUAL(s.find('u', 0), 2);
719
+ CYBOZU_TEST_EQUAL(s.find('u', 3), size_t(-1));
720
+ }
721
+
722
+ // look for rhs beginning before off
723
+ CYBOZU_TEST_AUTO(string_size_test_rfind_cybozu_string)
724
+ {
725
+ /* String s("あいueい"); */
726
+ String s("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x84");
727
+ CYBOZU_TEST_EQUAL(s.rfind("\xe3\x81\x84"), 4);
728
+ CYBOZU_TEST_EQUAL(s.rfind("\xe3\x81\x84", 3), 1);
729
+ }
730
+
731
+ // look for [str, str + count) beginning before off
732
+ CYBOZU_TEST_AUTO(string_size_test_rfind_cybozu_char_array)
733
+ {
734
+ /* String s("あいueい"); */
735
+ String s("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x84");
736
+ Char cs[] = {'u', 'e'};
737
+ CYBOZU_TEST_EQUAL(s.rfind(cs,4,2), 2);
738
+ }
739
+
740
+ CYBOZU_TEST_AUTO(string_size_test_rfind_cybozu_char_array_zero)
741
+ // look for [str, <null>) beginning before off
742
+ {
743
+ /* String s("あいueい"); */
744
+ String s("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x84");
745
+ Char cs[] = {'u', 'e', 0};
746
+ CYBOZU_TEST_EQUAL(s.rfind(cs,4), 2);
747
+ CYBOZU_TEST_EQUAL(s.rfind(cs,0), size_t(-1));
748
+ }
749
+
750
+ CYBOZU_TEST_AUTO(string_size_test_rfind_cybozu_char)
751
+ // look for [str, <null>) beginning before off
752
+ {
753
+ /* String s("あいueい"); */
754
+ String s("\xe3\x81\x82\xe3\x81\x84\x75\x65\xe3\x81\x84");
755
+ Char c = 'u';
756
+ CYBOZU_TEST_EQUAL(s.rfind(c), 2);
757
+ CYBOZU_TEST_EQUAL(s.rfind(c,1), size_t(-1));
758
+ }
759
+
760
+ CYBOZU_TEST_AUTO(string_size_test_find_first_of_cybozu_string)
761
+ // look for one of rhs at or after off
762
+ {
763
+ /* String s("えいもeimoんせすん"); */
764
+ String s("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
765
+ /* String c("わをん"); */
766
+ String c("\xE3\x82\x8F\xE3\x82\x92\xE3\x82\x93");
767
+ CYBOZU_TEST_EQUAL(s.find_first_of(c), 7);
768
+ CYBOZU_TEST_EQUAL(s.find_first_of(c,8), 10);
769
+ }
770
+
771
+
772
+ // look for one of [str, str + count) at or after off
773
+ CYBOZU_TEST_AUTO(string_size_test_find_first_of_cybozu_char_array)
774
+ {
775
+ /* String s("えいもeimoんせすん"); */
776
+ String s("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
777
+ Char c[] = {'c', 'd', 'e'};
778
+ CYBOZU_TEST_EQUAL(s.find_first_of(c, 0, 2), size_t(-1));
779
+ CYBOZU_TEST_EQUAL(s.find_first_of(c, 0, 3), 3);
780
+ }
781
+
782
+ // look for c at or after off
783
+ CYBOZU_TEST_AUTO(string_size_test_find_first_of_cybozu_char)
784
+ {
785
+ /* String s("えいもeimoんせすん"); */
786
+ String s("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
787
+ Char c = 'e';
788
+ CYBOZU_TEST_EQUAL(s.find_first_of(c), 3);
789
+ CYBOZU_TEST_EQUAL(s.find_first_of(c, 6), size_t(-1));
790
+ }
791
+
792
+ // look for one of rhs before off
793
+ CYBOZU_TEST_AUTO(string_size_test_find_last_of_cybozu_string)
794
+ {
795
+ /* String s("えいもeimoんせすん"); */
796
+ String s("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
797
+ /* String cs("わをん"); */
798
+ String cs("\xE3\x82\x8F\xE3\x82\x92\xE3\x82\x93");
799
+ CYBOZU_TEST_EQUAL( s.find_last_of(cs), 10);
800
+ CYBOZU_TEST_EQUAL( s.find_last_of(cs, 4), size_t(-1));
801
+ }
802
+
803
+ // look for one of [str, str + count) before off
804
+ CYBOZU_TEST_AUTO(string_size_test_find_last_of_cybozu_char_array)
805
+ {
806
+ /* String s("えいもeimoんせすん"); */
807
+ String s("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
808
+ Char c[] = {'c', 'd', 'e'};
809
+ CYBOZU_TEST_EQUAL( s.find_last_of(c, 20, 3), 3);
810
+ CYBOZU_TEST_EQUAL( s.find_last_of(c, 20, 2), size_t(-1));
811
+ }
812
+
813
+ // look for one of [str, <null>) before off
814
+ CYBOZU_TEST_AUTO(string_size_test_find_last_of_cybozu_char_array_zero)
815
+ {
816
+ /* String s("えいもeimoんせすん"); */
817
+ String s("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
818
+ Char c[] = {'c', 'd', 'e', 0};
819
+ CYBOZU_TEST_EQUAL( s.find_last_of(c, 20), 3);
820
+ CYBOZU_TEST_EQUAL( s.find_last_of(c, 2), size_t(-1));
821
+ }
822
+
823
+ // look for none of rhs at or after off
824
+ CYBOZU_TEST_AUTO(string_size_test_find_first_not_of_cybozu_string)
825
+ {
826
+ /* String s("えいもeimoんせすん"); */
827
+ String s("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
828
+ /* String t("えいもeimoんせすん"); */
829
+ String t("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
830
+ /* String u("えん"); */
831
+ String u ("\xE3\x81\x88\xE3\x82\x93");
832
+ CYBOZU_TEST_EQUAL( s.find_first_not_of(t), size_t(-1));
833
+ CYBOZU_TEST_EQUAL( s.find_first_not_of(u, 3), 3);
834
+ CYBOZU_TEST_EQUAL( s.find_first_not_of(u), 1);
835
+ }
836
+
837
+ // look for none of [str, str + count) at or after off
838
+ CYBOZU_TEST_AUTO(string_size_test_find_first_not_of_cybozu_char_array)
839
+ {
840
+ /* String s("えいもeimoんせすん"); */
841
+ String s("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
842
+ Char t[] = {'e','i','m','o'};
843
+ CYBOZU_TEST_EQUAL( s.find_first_not_of(t, 0, 4), 0);
844
+ CYBOZU_TEST_EQUAL( s.find_first_not_of(t, 3, 2), 5);
845
+ }
846
+
847
+ // look for one of [str, <null>) at or after off
848
+ CYBOZU_TEST_AUTO(string_size_test_find_first_not_of_cybozu_char_array_zero)
849
+ {
850
+ /* String s("えいもeimoんせすん"); */
851
+ String s("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
852
+ Char t[] = {'e','i','m','o', 0};
853
+ CYBOZU_TEST_EQUAL( s.find_first_not_of(t, 0), 0);
854
+ CYBOZU_TEST_EQUAL( s.find_first_not_of(t, 3), 7);
855
+ }
856
+
857
+ // look for non c at or after off
858
+ CYBOZU_TEST_AUTO(string_size_test_find_first_not_of_cybozu_char)
859
+ {
860
+ String s("mmmmmOPmmmmmQ");
861
+ Char t = 'm';
862
+ CYBOZU_TEST_EQUAL( s.find_first_not_of(t, 0), 5);
863
+ CYBOZU_TEST_EQUAL( s.find_first_not_of(t, 8), 12);
864
+ }
865
+
866
+ // look for none of rhs before off
867
+ CYBOZU_TEST_AUTO(string_size_test_find_last_not_of_cybozu_string)
868
+ {
869
+ /* String s("えいもeimoんせすん"); */
870
+ String s("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
871
+ String t("eimo");
872
+ CYBOZU_TEST_EQUAL( s.find_last_not_of(t), 10);
873
+ CYBOZU_TEST_EQUAL( s.find_last_not_of(t, 4), 2);
874
+ }
875
+
876
+ // look for none of [str, str + count) before off
877
+ CYBOZU_TEST_AUTO(string_size_test_find_last_not_of_cybozu_char_array)
878
+ {
879
+ /* String s("えいもeimoんせすん"); */
880
+ String s("\xE3\x81\x88\xE3\x81\x84\xE3\x82\x82" "eimo" "\xE3\x82\x93\xE3\x81\x9B\xE3\x81\x99\xE3\x82\x93");
881
+ Char t[] = {'e','i','m','o'};
882
+ CYBOZU_TEST_EQUAL( s.find_last_not_of(t, 4, 2), 2);
883
+ CYBOZU_TEST_EQUAL( s.find_last_not_of(t, 100, 4), 10);
884
+ }
885
+
886
+ // look for none of [str, <null>) before off
887
+ CYBOZU_TEST_AUTO(string_size_test_find_last_not_of_cybozu_char_array_zero)
888
+ {
889
+ String s("eimo");
890
+ Char t[] = {'e','i','m','o', 0};
891
+ CYBOZU_TEST_EQUAL( s.find_last_not_of(t, 4), size_t(-1));
892
+ Char u[] = {'a','b','c','d','e',0};
893
+ CYBOZU_TEST_EQUAL( s.find_last_not_of(u, 4), 3);
894
+ }
895
+
896
+ // look for non c before off
897
+ CYBOZU_TEST_AUTO(string_size_test_find_last_not_of_cybozu_char)
898
+ {
899
+ String s("mmmmmOPmmmmmQ");
900
+ Char t = 'm';
901
+ CYBOZU_TEST_EQUAL( s.find_last_not_of(t, 100), 12);
902
+ CYBOZU_TEST_EQUAL( s.find_last_not_of(t, 8), 6);
903
+ }
904
+
905
+ // insert rhs at off
906
+ CYBOZU_TEST_AUTO(string_insert_test_cybozu_string)
907
+ {
908
+ /* String s("いろはにほへと"); */
909
+ String s("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
910
+ const String t("abc");
911
+ s.insert(3, t);
912
+ /* CYBOZU_TEST_EQUAL(s, "いろはabcにほへと"); */
913
+ String checked("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF" "abc" "\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
914
+ CYBOZU_TEST_EQUAL(s, checked);
915
+ }
916
+
917
+ // insert rhs [off, off + count) at off
918
+ CYBOZU_TEST_AUTO(string_insert_test_cybozu_substring)
919
+ {
920
+ /* String s("いろはにほへと"); */
921
+ String s("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
922
+ const String t("abc");
923
+ s.insert(3, t, 1, 1);
924
+ /* CYBOZU_TEST_EQUAL(s, "いろはbにほへと"); */
925
+ String checked("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF" "b" "\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
926
+ CYBOZU_TEST_EQUAL(s, checked);
927
+ }
928
+
929
+ // insert [str, str + count) at off
930
+ CYBOZU_TEST_AUTO(string_insert_test_cybozu_char_array)
931
+ {
932
+ /* String s("ちりぬるを"); */
933
+ String s("\xE3\x81\xA1\xE3\x82\x8A\xE3\x81\xAC\xE3\x82\x8B\xE3\x82\x92");
934
+ const Char c[]={'v', 'w', 'x', 'y', 'z', 0};
935
+ s.insert(4, c, 3);
936
+ /* CYBOZU_TEST_EQUAL(s, "ちりぬるvwxを"); */
937
+ String checked("\xE3\x81\xA1\xE3\x82\x8A\xE3\x81\xAC\xE3\x82\x8B" "vwx" "\xE3\x82\x92");
938
+ CYBOZU_TEST_EQUAL(s, checked);
939
+ }
940
+
941
+ // insert [str, <null>) at off
942
+ CYBOZU_TEST_AUTO(string_insert_test_cybozu_char_array_zero)
943
+ {
944
+ /* String s("ちりぬるを"); */
945
+ String s("\xE3\x81\xA1\xE3\x82\x8A\xE3\x81\xAC\xE3\x82\x8B\xE3\x82\x92");
946
+ const Char c[]={'v', 'w', 'x', 'y', 'z', 0};
947
+ s.insert(4, c);
948
+ /* CYBOZU_TEST_EQUAL(s, "ちりぬるvwxyzを"); */
949
+ String checked("\xE3\x81\xA1\xE3\x82\x8A\xE3\x81\xAC\xE3\x82\x8B" "vwxyz" "\xE3\x82\x92");
950
+ CYBOZU_TEST_EQUAL(s, checked);
951
+ }
952
+
953
+ // insert count * c at off
954
+ CYBOZU_TEST_AUTO(string_insert_test_cybozu_multi_char)
955
+ {
956
+ /* String s("ちりぬるを"); */
957
+ String s("\xE3\x81\xA1\xE3\x82\x8A\xE3\x81\xAC\xE3\x82\x8B\xE3\x82\x92");
958
+ const Char c ='X';
959
+ s.insert(2, 4, c);
960
+ /* CYBOZU_TEST_EQUAL(s, "ちりXXXXぬるを"); */
961
+ String checked("\xE3\x81\xA1\xE3\x82\x8A" "XXXX"
962
+ "\xE3\x81\xAC\xE3\x82\x8B\xE3\x82\x92");
963
+ CYBOZU_TEST_EQUAL(s, checked);
964
+ }
965
+
966
+ // insert c at here
967
+ CYBOZU_TEST_AUTO(string_insert_test_cybozu_iterator_char)
968
+ {
969
+ /* String s("ちりぬるを"); */
970
+ String s("\xE3\x81\xA1\xE3\x82\x8A\xE3\x81\xAC\xE3\x82\x8B\xE3\x82\x92");
971
+ const Char c ='X';
972
+ s.insert(s.begin()+1, c);
973
+ /* CYBOZU_TEST_EQUAL(s, "ちXりぬるを"); */
974
+ String checked("\xE3\x81\xA1" "X"
975
+ "\xE3\x82\x8A\xE3\x81\xAC\xE3\x82\x8B\xE3\x82\x92");
976
+ CYBOZU_TEST_EQUAL(s, checked);
977
+
978
+ }
979
+
980
+ // insert count * Char at here
981
+ CYBOZU_TEST_AUTO(string_insert_test_cybozu_iterator_multi_chars)
982
+ {
983
+ /* String s("ちりぬるを"); */
984
+ String s("\xE3\x81\xA1\xE3\x82\x8A\xE3\x81\xAC\xE3\x82\x8B\xE3\x82\x92");
985
+ const Char c ='Y';
986
+ s.insert(s.begin(), 5, c);
987
+ /* CYBOZU_TEST_EQUAL(s, "YYYYYちりぬるを"); */
988
+ String checked("YYYYY" "\xE3\x81\xA1\xE3\x82\x8A\xE3\x81\xAC\xE3\x82\x8B\xE3\x82\x92");
989
+ CYBOZU_TEST_EQUAL(s, checked);
990
+ }
991
+
992
+ // insert [begin, end) at here
993
+ CYBOZU_TEST_AUTO(string_insert_test_cybozu_iterator_iterator)
994
+ {
995
+ /* String s("あいうえお"); */
996
+ String s("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
997
+ String t("abcdef");
998
+ s.insert(s.begin()+2, t.begin()+1, t.begin()+3);
999
+
1000
+ /* CYBOZU_TEST_EQUAL(s, "あいbcうえお"); */
1001
+ String checked("\xE3\x81\x82\xE3\x81\x84" "bc" "\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1002
+ CYBOZU_TEST_EQUAL(s, checked);
1003
+ }
1004
+ // NOT EQUAL CASE
1005
+ CYBOZU_TEST_AUTO(string_util_test_not_equal_cc)
1006
+ {
1007
+ String t1("doragon");
1008
+ String t2("doragun");
1009
+ CYBOZU_TEST_ASSERT(t1 != t2);
1010
+ }
1011
+
1012
+ CYBOZU_TEST_AUTO(string_util_test_not_equal_cs)
1013
+ {
1014
+ String t1("doragon");
1015
+ std::string t2("doragun");
1016
+ CYBOZU_TEST_ASSERT(t1 != t2);
1017
+ }
1018
+
1019
+ CYBOZU_TEST_AUTO(string_util_test_not_equal_cs2)
1020
+ {
1021
+ String t1("doragon");
1022
+ const char t2[]="doragun";
1023
+ CYBOZU_TEST_ASSERT(t1 != t2);
1024
+ }
1025
+
1026
+ CYBOZU_TEST_AUTO(string_util_test_not_equal_sc)
1027
+ {
1028
+ std::string t1("doragon");
1029
+ String t2("doragun");
1030
+ CYBOZU_TEST_ASSERT(t1 != t2);
1031
+ }
1032
+
1033
+ CYBOZU_TEST_AUTO(string_util_test_not_equal_sc2)
1034
+ {
1035
+ const char t1[] ="doragon";
1036
+ String t2("doragun");
1037
+ CYBOZU_TEST_ASSERT(t1 != t2);
1038
+ }
1039
+
1040
+
1041
+ // < CASE
1042
+ CYBOZU_TEST_AUTO(string_util_test_less_than_cc)
1043
+ {
1044
+ /* あいうえお */
1045
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1046
+ /* あいうえを */
1047
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1048
+
1049
+ CYBOZU_TEST_ASSERT(t1 < t2);
1050
+ }
1051
+
1052
+ CYBOZU_TEST_AUTO(string_util_test_less_than_cs)
1053
+ {
1054
+ /* あいうえお */
1055
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1056
+ /* あいうえを */
1057
+ std::string t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1058
+
1059
+ CYBOZU_TEST_ASSERT(t1 < t2);
1060
+ }
1061
+
1062
+ CYBOZU_TEST_AUTO(string_util_test_less_than_cs2)
1063
+ {
1064
+ /* あいうえお */
1065
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1066
+ /* あいうえを */
1067
+ const char t2[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92";
1068
+
1069
+ CYBOZU_TEST_ASSERT(t1 < t2);
1070
+ }
1071
+
1072
+ CYBOZU_TEST_AUTO(string_util_test_less_than_sc)
1073
+ {
1074
+ /* あいうえお */
1075
+ std::string t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1076
+ /* あいうえを */
1077
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1078
+
1079
+ CYBOZU_TEST_ASSERT(t1 < t2);
1080
+ }
1081
+
1082
+ CYBOZU_TEST_AUTO(string_util_test_less_than_sc2)
1083
+ {
1084
+ /* あいうえお */
1085
+ const char t1[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
1086
+ /* あいうえを */
1087
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1088
+
1089
+ CYBOZU_TEST_ASSERT(t1 < t2);
1090
+ }
1091
+
1092
+ // <= CASE
1093
+ CYBOZU_TEST_AUTO(string_util_test_less_than_or_equal_cc)
1094
+ {
1095
+ /* あいうえお */
1096
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1097
+ /* あいうえを */
1098
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1099
+
1100
+ CYBOZU_TEST_ASSERT(t1 <= t2);
1101
+ }
1102
+
1103
+ CYBOZU_TEST_AUTO(string_util_test_less_than_or_equal_cs)
1104
+ {
1105
+ /* あいうえお */
1106
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1107
+ /* あいうえを */
1108
+ std::string t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1109
+
1110
+ CYBOZU_TEST_ASSERT(t1 <= t2);
1111
+ }
1112
+
1113
+ CYBOZU_TEST_AUTO(string_util_test_less_than_or_equal_cs2)
1114
+ {
1115
+ /* あいうえお */
1116
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1117
+ /* あいうえを */
1118
+ const char t2[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92";
1119
+
1120
+ CYBOZU_TEST_ASSERT(t1 <= t2);
1121
+ }
1122
+
1123
+ CYBOZU_TEST_AUTO(string_util_test_less_than_or_equal_sc)
1124
+ {
1125
+ /* あいうえお */
1126
+ std::string t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1127
+ /* あいうえを */
1128
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1129
+
1130
+ CYBOZU_TEST_ASSERT(t1 <= t2);
1131
+ }
1132
+
1133
+ CYBOZU_TEST_AUTO(string_util_test_less_than_or_equal_sc2)
1134
+ {
1135
+ /* あいうえお */
1136
+ const char t1[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
1137
+ /* あいうえを */
1138
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1139
+
1140
+ CYBOZU_TEST_ASSERT(t1 <= t2);
1141
+ }
1142
+
1143
+
1144
+ // <= CASE
1145
+ CYBOZU_TEST_AUTO(string_util_test_less_than_or_equal_cc_equal)
1146
+ {
1147
+ /* あいうえお */
1148
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1149
+ /* あいうえお */
1150
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1151
+
1152
+ CYBOZU_TEST_ASSERT(t1 <= t2);
1153
+ }
1154
+
1155
+ CYBOZU_TEST_AUTO(string_util_test_less_than_or_equal_cs_equal)
1156
+ {
1157
+ /* あいうえお */
1158
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1159
+ /* あいうえお */
1160
+ std::string t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1161
+
1162
+ CYBOZU_TEST_ASSERT(t1 <= t2);
1163
+ }
1164
+
1165
+ CYBOZU_TEST_AUTO(string_util_test_less_than_or_equal_cs2_equal)
1166
+ {
1167
+ /* あいうえお */
1168
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1169
+ /* あいうえお */
1170
+ const char t2[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
1171
+
1172
+ CYBOZU_TEST_ASSERT(t1 <= t2);
1173
+ }
1174
+
1175
+ CYBOZU_TEST_AUTO(string_util_test_less_than_or_equal_sc_equal)
1176
+ {
1177
+ /* あいうえお */
1178
+ std::string t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1179
+ /* あいうえお */
1180
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1181
+
1182
+ CYBOZU_TEST_ASSERT(t1 <= t2);
1183
+ }
1184
+
1185
+ CYBOZU_TEST_AUTO(string_util_test_less_than_or_equal_sc2_equal)
1186
+ {
1187
+ /* あいうえお */
1188
+ const char t1[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
1189
+ /* あいうえお */
1190
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1191
+
1192
+ CYBOZU_TEST_ASSERT(t1 <= t2);
1193
+ }
1194
+
1195
+
1196
+ /////////////////////
1197
+ // > CASE
1198
+ /////////////////////
1199
+
1200
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_cc)
1201
+ {
1202
+ /* あいうえを */
1203
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1204
+ /* あいうえお */
1205
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1206
+
1207
+ CYBOZU_TEST_ASSERT(t1 > t2);
1208
+ }
1209
+
1210
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_cs)
1211
+ {
1212
+ /* あいうえお */
1213
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1214
+ /* あいうえを */
1215
+ std::string t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1216
+
1217
+ CYBOZU_TEST_ASSERT(t1 < t2);
1218
+ }
1219
+
1220
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_cs2)
1221
+ {
1222
+ /* あいうえを */
1223
+ const char t1[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92";
1224
+ /* あいうえお */
1225
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1226
+
1227
+ CYBOZU_TEST_ASSERT(t1 > t2);
1228
+ }
1229
+
1230
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_sc)
1231
+ {
1232
+ /* あいうえを */
1233
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1234
+ /* あいうえお */
1235
+ std::string t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1236
+
1237
+ CYBOZU_TEST_ASSERT(t1 > t2);
1238
+ }
1239
+
1240
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_sc2)
1241
+ {
1242
+ /* あいうえを */
1243
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1244
+ /* あいうえお */
1245
+ const char t2[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
1246
+
1247
+ CYBOZU_TEST_ASSERT(t1 > t2);
1248
+ }
1249
+
1250
+ // >= CASE
1251
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_or_equal_cc)
1252
+ {
1253
+ /* あいうえを */
1254
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1255
+ /* あいうえお */
1256
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1257
+
1258
+ CYBOZU_TEST_ASSERT(t1 >= t2);
1259
+ }
1260
+
1261
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_or_equal_cs)
1262
+ {
1263
+
1264
+ /* あいうえを */
1265
+ std::string t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1266
+ /* あいうえお */
1267
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1268
+
1269
+ CYBOZU_TEST_ASSERT(t1 >= t2);
1270
+ }
1271
+
1272
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_or_equal_cs2)
1273
+ {
1274
+ /* あいうえを */
1275
+ const char t1[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92";
1276
+ /* あいうえお */
1277
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1278
+
1279
+ CYBOZU_TEST_ASSERT(t1 >= t2);
1280
+ }
1281
+
1282
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_or_equal_sc)
1283
+ {
1284
+ /* あいうえを */
1285
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1286
+ /* あいうえお */
1287
+ std::string t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1288
+
1289
+ CYBOZU_TEST_ASSERT(t1 >= t2);
1290
+ }
1291
+
1292
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_or_equal_sc2)
1293
+ {
1294
+ /* あいうえを */
1295
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x82\x92");
1296
+ /* あいうえお */
1297
+ const char t2[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
1298
+
1299
+ CYBOZU_TEST_ASSERT(t1 >= t2);
1300
+ }
1301
+
1302
+
1303
+ // >= CASE
1304
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_or_equal_cc_equal)
1305
+ {
1306
+ /* あいうえお */
1307
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1308
+ /* あいうえお */
1309
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1310
+
1311
+ CYBOZU_TEST_ASSERT(t1 >= t2);
1312
+ }
1313
+
1314
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_or_equal_cs_equal)
1315
+ {
1316
+ /* あいうえお */
1317
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1318
+ /* あいうえお */
1319
+ std::string t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1320
+
1321
+ CYBOZU_TEST_ASSERT(t1 >= t2);
1322
+ }
1323
+
1324
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_or_equal_cs2_equal)
1325
+ {
1326
+ /* あいうえお */
1327
+ String t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1328
+ /* あいうえお */
1329
+ const char t2[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
1330
+
1331
+ CYBOZU_TEST_ASSERT(t1 >= t2);
1332
+ }
1333
+
1334
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_or_equal_sc_equal)
1335
+ {
1336
+ /* あいうえお */
1337
+ std::string t1("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1338
+ /* あいうえお */
1339
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1340
+
1341
+ CYBOZU_TEST_ASSERT(t1 >= t2);
1342
+ }
1343
+
1344
+ CYBOZU_TEST_AUTO(string_util_test_greater_than_or_equal_sc2_equal)
1345
+ {
1346
+ /* あいうえお */
1347
+ const char t1[] ="\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A";
1348
+ /* あいうえお */
1349
+ String t2("\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
1350
+
1351
+ CYBOZU_TEST_ASSERT(t1 >= t2);
1352
+ }
1353
+
1354
+ ///////// replace
1355
+ /////// String
1356
+
1357
+ // replace [off, off + n) with rhs
1358
+ CYBOZU_TEST_AUTO(string_replace_test_cybozu_string)
1359
+ {
1360
+ /* String s("いろはにほへと"); */
1361
+ String s("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
1362
+ String t("ABCDEFGHIJ");
1363
+ s.replace(2, 3, t);
1364
+ String checked("\xE3\x81\x84\xE3\x82\x8D" "ABCDEFGHIJ" "\xE3\x81\xB8\xE3\x81\xA8");
1365
+ /* CYBOZU_TEST_EQUAL(s, "いろABCDEFGHIJへと"); */
1366
+ CYBOZU_TEST_EQUAL(s, checked);
1367
+ }
1368
+
1369
+ // replace [off, off + n) with rhs [rhsOff, rhsOff + count)
1370
+ CYBOZU_TEST_AUTO(string_replace_test_cybozu_substring)
1371
+ {
1372
+ /* String s("いろはにほへと"); */
1373
+ String s("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
1374
+ String t("ABCDEFGHIJ");
1375
+ s.replace(2, 3, t, 3, 2);
1376
+ /* CYBOZU_TEST_EQUAL(s, "いろDEへと"); */
1377
+ String checked("\xE3\x81\x84\xE3\x82\x8D" "DE" "\xE3\x81\xB8\xE3\x81\xA8");
1378
+ CYBOZU_TEST_EQUAL(s, checked);
1379
+ }
1380
+
1381
+ /////// Char[]
1382
+ CYBOZU_TEST_AUTO(string_replace_test_cybozu_char_array)
1383
+ {
1384
+ /* String s("いろはにほへと"); */
1385
+ String s("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
1386
+ Char c[]={'A','B','C','D','E','F', 0};
1387
+ s.replace(3, 3, c, 4);
1388
+ /* CYBOZU_TEST_EQUAL(s, "いろはABCDと"); */
1389
+ String checked("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF" "ABCD" "\xE3\x81\xA8");
1390
+ CYBOZU_TEST_EQUAL(s, checked);
1391
+ }
1392
+
1393
+ // replace [off, off + n) with [str, <null>)
1394
+ CYBOZU_TEST_AUTO(string_replace_test_cybozu_char_array_zero)
1395
+ {
1396
+ /* String s("いろはにほへと"); */
1397
+ String s("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
1398
+ Char c[]={'A','B','C','D','E','F', 0};
1399
+ s.replace(3, 3, c);
1400
+ /* CYBOZU_TEST_EQUAL(s, "いろはABCDEFと"); */
1401
+ String checked("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF" "ABCDEF" "\xE3\x81\xA8");
1402
+ CYBOZU_TEST_EQUAL(s, checked);
1403
+ }
1404
+
1405
+ // replace [off, off + n) with count * c
1406
+ CYBOZU_TEST_AUTO(string_replace_test_cybozu_multiple_chars)
1407
+ {
1408
+ /* String s("いろはにほへと"); */
1409
+ String s("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xAB\xE3\x81\xBB\xE3\x81\xB8\xE3\x81\xA8");
1410
+ Char c = 'W';
1411
+ s.replace(4, 2, 3, c);
1412
+ /* CYBOZU_TEST_EQUAL(s, "いろはにWWWと"); */
1413
+ String checked("\xE3\x81\x84\xE3\x82\x8D\xE3\x81\xAF\xE3\x81\xAB"
1414
+ "WWW" "\xE3\x81\xA8");
1415
+ CYBOZU_TEST_EQUAL(s, checked);
1416
+ }
1417
+
1418
+ /////// Iterator
1419
+
1420
+ // replace [begin, end) with rhs
1421
+ CYBOZU_TEST_AUTO(string_replace_iterator)
1422
+ {
1423
+ /* String s("わかよたれそ"); */
1424
+ String s("\xE3\x82\x8F\xE3\x81\x8B\xE3\x82\x88\xE3\x81\x9F\xE3\x82\x8C\xE3\x81\x9D");
1425
+ String t("abcdef");
1426
+ s.replace(s.begin()+1, s.end()-1, t);
1427
+ /* CYBOZU_TEST_EQUAL(s, "わabcdefそ"); */
1428
+ String checked("\xE3\x82\x8F" "abcdef" "\xE3\x81\x9D");
1429
+ CYBOZU_TEST_EQUAL(s, checked);
1430
+ }
1431
+
1432
+ // replace [begin, end) with [str, str + count)
1433
+ CYBOZU_TEST_AUTO(string_replace_iterator_cybozu_char_array)
1434
+ {
1435
+ /* String s("わかよたれそ"); */
1436
+ String s("\xE3\x82\x8F\xE3\x81\x8B\xE3\x82\x88\xE3\x81\x9F\xE3\x82\x8C\xE3\x81\x9D");
1437
+ const Char t[] = {'A','B','C','D','E'};
1438
+ s.replace(s.begin()+1, s.end()-1, t, 3);
1439
+ /* CYBOZU_TEST_EQUAL( s, "わABCそ"); */
1440
+ String checked("\xE3\x82\x8F" "ABC" "\xE3\x81\x9D");
1441
+ CYBOZU_TEST_EQUAL(s, checked);
1442
+ }
1443
+
1444
+ CYBOZU_TEST_AUTO(string_replace_iterator_cybozu_char_array_zero)
1445
+ {
1446
+ /* String s("わかよたれそ"); */
1447
+ String s("\xE3\x82\x8F\xE3\x81\x8B\xE3\x82\x88\xE3\x81\x9F\xE3\x82\x8C\xE3\x81\x9D");
1448
+ const Char t[] = {'A','B','C','D','E', 0};
1449
+ s.replace(s.begin()+1, s.end()-1, t);
1450
+ /* CYBOZU_TEST_EQUAL( s, "わABCDEそ"); */
1451
+ String checked("\xE3\x82\x8F" "ABCDE" "\xE3\x81\x9D");
1452
+ CYBOZU_TEST_EQUAL(s, checked);
1453
+ }
1454
+
1455
+ //replace [begin, end) with count * c
1456
+ CYBOZU_TEST_AUTO(string_replace_iterator_cybozu_multiple_chars)
1457
+ {
1458
+ /* String s("つねならん"); */
1459
+ String s("\xE3\x81\xA4\xE3\x81\xAD\xE3\x81\xAA\xE3\x82\x89\xE3\x82\x93");
1460
+ const Char c = 'N';
1461
+ s.replace(s.begin()+2, s.end()-2, 3, c);
1462
+ /* "つねNNNらん" */
1463
+ String checked("\xE3\x81\xA4\xE3\x81\xAD" "NNN" "\xE3\x82\x89\xE3\x82\x93");
1464
+ CYBOZU_TEST_EQUAL(s, checked);
1465
+ }
1466
+
1467
+ // replace [begin, end) with [begin2, end2)
1468
+ CYBOZU_TEST_AUTO(string_replace_iterator_iterator)
1469
+ {
1470
+ /* String s("つねならん"); */
1471
+ String s("\xE3\x81\xA4\xE3\x81\xAD\xE3\x81\xAA\xE3\x82\x89\xE3\x82\x93");
1472
+ /* String t("ならのおくやま"); */
1473
+ String t("\xE3\x81\xAA\xE3\x82\x89\xE3\x81\xAE\xE3\x81\x8A\xE3\x81\x8F\xE3\x82\x84\xE3\x81\xBE");
1474
+
1475
+ s.replace(s.begin()+2, s.end()-2, t.begin()+1, t.end()-1);
1476
+ /* CYBOZU_TEST_EQUAL( s, "つねらのおくやらん"); */
1477
+ String checked("\xE3\x81\xA4\xE3\x81\xAD\xE3\x82\x89\xE3\x81\xAE\xE3\x81\x8A\xE3\x81\x8F\xE3\x82\x84\xE3\x82\x89\xE3\x82\x93");
1478
+ CYBOZU_TEST_EQUAL(s, checked);
1479
+ }
1480
+
1481
+ ///////// size
1482
+
1483
+ // return length of sequence
1484
+ CYBOZU_TEST_AUTO(string_size_test_size)
1485
+ {
1486
+ String s("aiueo");
1487
+ CYBOZU_TEST_EQUAL(s.size(), 5);
1488
+ }
1489
+
1490
+ // return length of sequence
1491
+ CYBOZU_TEST_AUTO(string_size_test_length)
1492
+ {
1493
+ String s("aiueo");
1494
+ CYBOZU_TEST_EQUAL(s.length(), 5);
1495
+ }
1496
+
1497
+ // return maximum possible length of sequence
1498
+ CYBOZU_TEST_AUTO(string_size_test_max_size)
1499
+ {
1500
+ String s("aiueo");
1501
+ CYBOZU_TEST_ASSERT(s.max_size() >= s.length());
1502
+ }
1503
+
1504
+ // determine new length, padding with null elements as needed
1505
+ CYBOZU_TEST_AUTO(string_size_test_resize_null)
1506
+ {
1507
+ String s1("aiueo");
1508
+ s1.resize(10);
1509
+ CYBOZU_TEST_EQUAL(s1.length(), 10);
1510
+
1511
+ String t("aiueo");
1512
+ t.resize(2);
1513
+ CYBOZU_TEST_EQUAL(t, "ai");
1514
+ }
1515
+
1516
+ // determine new length, padding with c elements as needed
1517
+ CYBOZU_TEST_AUTO(string_size_test_resize_padding)
1518
+ {
1519
+ String s1("aiueo");
1520
+ s1.resize(10, 'C');
1521
+ CYBOZU_TEST_EQUAL(s1.length(), 10);
1522
+ CYBOZU_TEST_EQUAL(s1, "aiueoCCCCC");
1523
+ }
1524
+
1525
+ // return current length of allocated storage
1526
+ CYBOZU_TEST_AUTO(string_size_test_capacity)
1527
+ {
1528
+ String s1("aiueo");
1529
+ CYBOZU_TEST_ASSERT(s1.capacity() < s1.max_size());
1530
+ s1.reserve(100);
1531
+ CYBOZU_TEST_ASSERT(s1.capacity() >= 100);
1532
+ }
1533
+
1534
+ // test if sequence is empty
1535
+ CYBOZU_TEST_AUTO(string_size_test_empty)
1536
+ {
1537
+ String s1;
1538
+ CYBOZU_TEST_ASSERT(s1.empty());
1539
+ }
1540
+
1541
+ CYBOZU_TEST_AUTO(utf16)
1542
+ {
1543
+ // abc a-i-u-
1544
+ const cybozu::Char16 utf16[6] = { 0x61, 0x62, 0x63, 0x3042, 0x3044, 0x3046 };
1545
+ const char utf8[12] = { 0x61, 0x62, 0x63, (char)0xE3, (char)0x81, (char)0x82, (char)0xE3, (char)0x81, (char)0x84, (char)0xE3, (char)0x81, (char)0x86 };
1546
+ cybozu::String16 s;
1547
+ cybozu::ConvertUtf8ToUtf16(&s, utf8, utf8 + 12);
1548
+ CYBOZU_TEST_EQUAL(s.size(), 6u);
1549
+ for (int i = 0; i < 6; i++) {
1550
+ CYBOZU_TEST_EQUAL(s[i], utf16[i]);
1551
+ }
1552
+ std::string t;
1553
+ cybozu::ConvertUtf16ToUtf8(&t, utf16, utf16 + 6);
1554
+ CYBOZU_TEST_EQUAL(t.size(), 12u);
1555
+ for (int i = 0; i < 12; i++) {
1556
+ CYBOZU_TEST_EQUAL(t[i], utf8[i]);
1557
+ }
1558
+ }
1559
+
1560
+ CYBOZU_TEST_AUTO(Utf8ref)
1561
+ {
1562
+ const std::string utf8 = "\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1";
1563
+ const String s(utf8);
1564
+ cybozu::Utf8refT<std::string::const_iterator> ref(utf8.begin(), utf8.end());
1565
+ cybozu::Char c;
1566
+ size_t i = 0;
1567
+ while (ref.next(&c)) {
1568
+ CYBOZU_TEST_EQUAL(c, s[i]);
1569
+ i++;
1570
+ }
1571
+ CYBOZU_TEST_EQUAL(i, s.size());
1572
+ }
1573
+
1574
+ CYBOZU_TEST_AUTO(Utf8ref_bad_char)
1575
+ {
1576
+ const std::string utf8 = "\xe3\x81\x93\xe3";
1577
+ const String s(utf8.c_str(), 3);
1578
+ cybozu::Utf8ref ref(utf8.c_str(), utf8.size());
1579
+ cybozu::Char c;
1580
+ CYBOZU_TEST_ASSERT(ref.next(&c));
1581
+ CYBOZU_TEST_EQUAL(s[0], c);
1582
+ CYBOZU_TEST_EXCEPTION(ref.next(&c), std::exception);
1583
+ }
1584
+
1585
+ CYBOZU_TEST_AUTO(Utf8ref_ignore_bad_char)
1586
+ {
1587
+ const std::string badUtf8 = "\xe3\x81\x93\xff\xff\xff\xe3\x82\x8c\xff\xff\xe3\x81\xaf" "UTF-8 1";
1588
+ const String s("\xe3\x81\x93\xe3\x82\x8c\xe3\x81\xaf" "UTF-8 1");
1589
+ cybozu::Utf8refT<std::string::const_iterator> ref(badUtf8.begin(), badUtf8.end(), true);
1590
+ cybozu::Char c;
1591
+ size_t i = 0;
1592
+ while (ref.next(&c)) {
1593
+ CYBOZU_TEST_EQUAL(c, s[i]);
1594
+ i++;
1595
+ }
1596
+ CYBOZU_TEST_EQUAL(i, s.size());
1597
+ }
1598
+
1599
+ CYBOZU_TEST_AUTO(equal)
1600
+ {
1601
+ const cybozu::String a = "abc";
1602
+ const std::string b = "abc";
1603
+ const char *c = "abc";
1604
+ const cybozu::Char d[] = { 'a', 'b', 'c', '\0' };
1605
+ CYBOZU_TEST_EQUAL(a, a);
1606
+ CYBOZU_TEST_EQUAL(a, b);
1607
+ CYBOZU_TEST_EQUAL(a, c);
1608
+ CYBOZU_TEST_EQUAL(a, d);
1609
+
1610
+ CYBOZU_TEST_EQUAL(b, a);
1611
+ CYBOZU_TEST_EQUAL(c, a);
1612
+ CYBOZU_TEST_EQUAL(d, a);
1613
+
1614
+ CYBOZU_TEST_ASSERT(!(a != a));
1615
+ CYBOZU_TEST_ASSERT(!(a != b));
1616
+ CYBOZU_TEST_ASSERT(!(a != c));
1617
+ CYBOZU_TEST_ASSERT(!(a != d));
1618
+
1619
+ CYBOZU_TEST_ASSERT(!(b != a));
1620
+ CYBOZU_TEST_ASSERT(!(c != a));
1621
+ CYBOZU_TEST_ASSERT(!(d != a));
1622
+ #ifdef _MSC_VER
1623
+ const wchar_t e[] = L"abc";
1624
+ CYBOZU_TEST_EQUAL(a, e);
1625
+ CYBOZU_TEST_EQUAL(e, a);
1626
+ CYBOZU_TEST_ASSERT(!(a != e));
1627
+ CYBOZU_TEST_ASSERT(!(e != a));
1628
+ #endif
1629
+ }
1630
+
1631
+ CYBOZU_TEST_AUTO(less)
1632
+ {
1633
+ const cybozu::String a = "ab";
1634
+ const std::string b = "abc";
1635
+ const char *c = "abc";
1636
+ const cybozu::Char d[] = { 'a', 'b', 'c', '\0' };
1637
+ CYBOZU_TEST_ASSERT(a < b);
1638
+ CYBOZU_TEST_ASSERT(a < c);
1639
+ CYBOZU_TEST_ASSERT(a < d);
1640
+
1641
+ CYBOZU_TEST_ASSERT(a <= b);
1642
+ CYBOZU_TEST_ASSERT(a <= c);
1643
+ CYBOZU_TEST_ASSERT(a <= d);
1644
+
1645
+ CYBOZU_TEST_ASSERT(b > a);
1646
+ CYBOZU_TEST_ASSERT(c > a);
1647
+ CYBOZU_TEST_ASSERT(d > a);
1648
+
1649
+ CYBOZU_TEST_ASSERT(b >= a);
1650
+ CYBOZU_TEST_ASSERT(c >= a);
1651
+ CYBOZU_TEST_ASSERT(d >= a);
1652
+ #ifdef _MSC_VER
1653
+ const wchar_t e[] = L"abc";
1654
+ CYBOZU_TEST_ASSERT(a < e);
1655
+ CYBOZU_TEST_ASSERT(a <= e);
1656
+ CYBOZU_TEST_ASSERT(e > a);
1657
+ CYBOZU_TEST_ASSERT(e >= a);
1658
+ #endif
1659
+ }
1660
+
1661
+ CYBOZU_TEST_AUTO(greater)
1662
+ {
1663
+ const cybozu::String a = "abcd";
1664
+ const std::string b = "abc";
1665
+ const char *c = "abc";
1666
+ const cybozu::Char d[] = { 'a', 'b', 'c', '\0' };
1667
+ CYBOZU_TEST_ASSERT(a > b);
1668
+ CYBOZU_TEST_ASSERT(a > c);
1669
+ CYBOZU_TEST_ASSERT(a > d);
1670
+
1671
+ CYBOZU_TEST_ASSERT(a >= b);
1672
+ CYBOZU_TEST_ASSERT(a >= c);
1673
+ CYBOZU_TEST_ASSERT(a >= d);
1674
+
1675
+ CYBOZU_TEST_ASSERT(b < a);
1676
+ CYBOZU_TEST_ASSERT(c < a);
1677
+ CYBOZU_TEST_ASSERT(d < a);
1678
+
1679
+ CYBOZU_TEST_ASSERT(b <= a);
1680
+ CYBOZU_TEST_ASSERT(c <= a);
1681
+ CYBOZU_TEST_ASSERT(d <= a);
1682
+ #ifdef _MSC_VER
1683
+ const wchar_t e[] = L"abc";
1684
+ CYBOZU_TEST_ASSERT(a > e);
1685
+ CYBOZU_TEST_ASSERT(a >= e);
1686
+ CYBOZU_TEST_ASSERT(e < a);
1687
+ CYBOZU_TEST_ASSERT(e <= a);
1688
+ #endif
1689
+ }
1690
+
1691
+ #if CYBOZU_CPP_VERSION == CYBOZU_CPP_VERSION_CPP11
1692
+ CYBOZU_TEST_AUTO(move)
1693
+ {
1694
+ cybozu::String a, b;
1695
+ b = "abc";
1696
+ a = b;
1697
+ CYBOZU_TEST_EQUAL(a, "abc");
1698
+ CYBOZU_TEST_EQUAL(a, b);
1699
+ a = "123";
1700
+ a = std::move(b);
1701
+ CYBOZU_TEST_EQUAL(a, "abc");
1702
+ a.pop_back();
1703
+ CYBOZU_TEST_EQUAL(a, "ab");
1704
+ }
1705
+ #endif