u 0.5.0 → 1.0.0

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 (316) hide show
  1. checksums.yaml +7 -0
  2. data/build/ext/u/data/attributes.rb +39 -0
  3. data/build/ext/u/data/bidi-mirroring.rb +27 -0
  4. data/build/ext/u/data/canonical-combining-class.rb +15 -0
  5. data/build/ext/u/data/case-folding.rb +39 -0
  6. data/build/ext/u/data/cased.rb +19 -0
  7. data/build/ext/u/data/compose.rb +304 -0
  8. data/build/ext/u/data/constants.rb +31 -0
  9. data/build/ext/u/data/decompose.rb +85 -0
  10. data/build/ext/u/data/general-category.rb +61 -0
  11. data/build/ext/u/data/grapheme-word-break.rb +15 -0
  12. data/build/ext/u/data/marshalled.rb +5 -0
  13. data/build/ext/u/data/script.rb +91 -0
  14. data/build/ext/u/data/soft-dotted.rb +17 -0
  15. data/build/ext/u/data/title-table.rb +30 -0
  16. data/build/ext/u/data/wide.rb +17 -0
  17. data/build/lib/u/build.rb +8 -0
  18. data/build/lib/u/build/data.rb +16 -0
  19. data/build/lib/u/build/data/bidimirroring.rb +26 -0
  20. data/build/lib/u/build/data/break.rb +14 -0
  21. data/build/lib/u/build/data/casefolding.rb +77 -0
  22. data/build/lib/u/build/data/compositionexclusions.rb +14 -0
  23. data/build/lib/u/build/data/derivedeastasianwidth.rb +15 -0
  24. data/build/lib/u/build/data/file.rb +88 -0
  25. data/build/lib/u/build/data/linebreak.rb +14 -0
  26. data/build/lib/u/build/data/proplist.rb +18 -0
  27. data/build/lib/u/build/data/scripts.rb +22 -0
  28. data/build/lib/u/build/data/specialcasing.rb +106 -0
  29. data/build/lib/u/build/data/unicode.rb +41 -0
  30. data/build/lib/u/build/data/unicode/entry.rb +27 -0
  31. data/build/lib/u/build/data/unicode/entry/decomposition.rb +29 -0
  32. data/build/lib/u/build/data/unicode/points.rb +32 -0
  33. data/build/lib/u/build/header.rb +11 -0
  34. data/build/lib/u/build/header/table.rb +19 -0
  35. data/build/lib/u/build/header/table/row.rb +64 -0
  36. data/build/lib/u/build/header/tables.rb +6 -0
  37. data/build/lib/u/build/header/tables/intervals.rb +50 -0
  38. data/build/lib/u/build/header/tables/split.rb +20 -0
  39. data/build/lib/u/build/header/tables/split/data.rb +29 -0
  40. data/build/lib/u/build/header/tables/split/part1.rb +28 -0
  41. data/build/lib/u/build/header/tables/split/part2.rb +13 -0
  42. data/build/lib/u/build/header/tables/split/row.rb +34 -0
  43. data/build/lib/u/build/header/tables/split/rows.rb +22 -0
  44. data/build/test/unit/break.rb +45 -0
  45. data/build/test/unit/case.rb +178 -0
  46. data/build/test/unit/foldcase.rb +44 -0
  47. data/build/test/unit/normalize.rb +81 -0
  48. data/ext/u/attributes.c +62 -0
  49. data/ext/u/attributes.h +5 -0
  50. data/ext/u/case.h +41 -0
  51. data/ext/u/data/attributes.h +3070 -0
  52. data/ext/u/data/bidi-mirroring.h +373 -0
  53. data/ext/u/data/canonical-combining-class.h +2157 -0
  54. data/ext/u/data/case-folding.h +171 -0
  55. data/ext/u/data/cased.h +42 -0
  56. data/ext/u/data/compose.h +1714 -0
  57. data/ext/u/data/constants.h +17 -0
  58. data/ext/u/data/decompose.h +9356 -0
  59. data/ext/u/data/general-category.h +28959 -0
  60. data/ext/u/data/grapheme-break.h +13201 -0
  61. data/ext/u/data/line-break.h +26501 -0
  62. data/ext/u/data/normalization-quick-check.h +3002 -0
  63. data/ext/u/data/script.h +2928 -0
  64. data/ext/u/data/soft-dotted.h +55 -0
  65. data/ext/u/data/title-table.h +41 -0
  66. data/ext/u/data/types.h +11117 -0
  67. data/ext/u/data/wide-cjk.h +197 -0
  68. data/ext/u/data/wide.h +59 -0
  69. data/ext/u/data/word-break.h +10001 -0
  70. data/ext/u/depend +281 -0
  71. data/ext/u/extconf.rb +158 -0
  72. data/ext/u/output.h +51 -0
  73. data/ext/{encoding/character/utf-8 → u}/private.c +11 -15
  74. data/ext/u/private.h +58 -0
  75. data/ext/u/rb_includes.h +10 -0
  76. data/ext/u/rb_private.c +98 -0
  77. data/ext/u/rb_private.h +67 -0
  78. data/ext/u/rb_u.c +251 -0
  79. data/ext/u/rb_u_buffer.c +443 -0
  80. data/ext/u/rb_u_buffer.h +24 -0
  81. data/ext/u/rb_u_re.c +43 -0
  82. data/ext/u/rb_u_re.h +15 -0
  83. data/ext/u/rb_u_string.c +478 -0
  84. data/ext/u/rb_u_string.h +173 -0
  85. data/ext/u/rb_u_string_alnum.c +10 -0
  86. data/ext/u/rb_u_string_alpha.c +10 -0
  87. data/ext/u/rb_u_string_aref.c +142 -0
  88. data/ext/u/rb_u_string_ascii_only.c +13 -0
  89. data/ext/u/rb_u_string_assigned.c +10 -0
  90. data/ext/u/rb_u_string_b.c +18 -0
  91. data/ext/u/rb_u_string_bytesize.c +10 -0
  92. data/ext/u/rb_u_string_byteslice.c +103 -0
  93. data/ext/u/rb_u_string_canonical_combining_class.c +33 -0
  94. data/ext/u/rb_u_string_case_ignorable.c +25 -0
  95. data/ext/u/rb_u_string_casecmp.c +61 -0
  96. data/ext/u/rb_u_string_cased.c +17 -0
  97. data/ext/u/rb_u_string_chomp.c +107 -0
  98. data/ext/u/rb_u_string_chop.c +33 -0
  99. data/ext/u/rb_u_string_chr.c +9 -0
  100. data/ext/u/rb_u_string_cntrl.c +10 -0
  101. data/ext/u/rb_u_string_collate.c +46 -0
  102. data/ext/u/rb_u_string_collation_key.c +18 -0
  103. data/ext/u/rb_u_string_count.c +38 -0
  104. data/ext/u/rb_u_string_defined.c +10 -0
  105. data/ext/u/rb_u_string_delete.c +62 -0
  106. data/ext/u/rb_u_string_digit.c +10 -0
  107. data/ext/u/rb_u_string_downcase.c +13 -0
  108. data/ext/u/rb_u_string_dump.c +153 -0
  109. data/ext/u/rb_u_string_each_byte.c +46 -0
  110. data/ext/u/rb_u_string_each_char.c +49 -0
  111. data/ext/u/rb_u_string_each_codepoint.c +45 -0
  112. data/ext/u/rb_u_string_each_grapheme_cluster.c +36 -0
  113. data/ext/u/rb_u_string_each_line.c +142 -0
  114. data/ext/u/rb_u_string_each_word.c +34 -0
  115. data/ext/u/rb_u_string_empty.c +11 -0
  116. data/ext/u/rb_u_string_end_with.c +31 -0
  117. data/ext/u/rb_u_string_eql.c +30 -0
  118. data/ext/u/rb_u_string_equal.c +33 -0
  119. data/ext/u/rb_u_string_foldcase.c +12 -0
  120. data/ext/u/rb_u_string_folded.c +13 -0
  121. data/ext/u/rb_u_string_format.c +1745 -0
  122. data/ext/u/rb_u_string_general_category.c +109 -0
  123. data/ext/u/rb_u_string_getbyte.c +21 -0
  124. data/ext/u/rb_u_string_graph.c +21 -0
  125. data/ext/u/rb_u_string_grapheme_break.c +61 -0
  126. data/ext/u/rb_u_string_gsub.c +164 -0
  127. data/ext/u/rb_u_string_hash.c +10 -0
  128. data/ext/u/rb_u_string_hex.c +9 -0
  129. data/ext/u/rb_u_string_include.c +10 -0
  130. data/ext/u/rb_u_string_index.c +110 -0
  131. data/ext/u/rb_u_string_inspect.c +189 -0
  132. data/ext/u/rb_u_string_internal_tr.c +148 -0
  133. data/ext/u/rb_u_string_internal_tr.h +29 -0
  134. data/ext/u/rb_u_string_justify.c +169 -0
  135. data/ext/u/rb_u_string_length.c +10 -0
  136. data/ext/u/rb_u_string_line_break.c +115 -0
  137. data/ext/u/rb_u_string_lower.c +13 -0
  138. data/ext/u/rb_u_string_lstrip.c +24 -0
  139. data/ext/u/rb_u_string_match.c +65 -0
  140. data/ext/u/rb_u_string_mirror.c +16 -0
  141. data/ext/u/rb_u_string_newline.c +21 -0
  142. data/ext/u/rb_u_string_normalize.c +70 -0
  143. data/ext/u/rb_u_string_normalized.c +28 -0
  144. data/ext/u/rb_u_string_oct.c +11 -0
  145. data/ext/u/rb_u_string_ord.c +14 -0
  146. data/ext/u/rb_u_string_partition.c +80 -0
  147. data/ext/u/rb_u_string_plus.c +33 -0
  148. data/ext/u/rb_u_string_print.c +10 -0
  149. data/ext/u/rb_u_string_punct.c +10 -0
  150. data/ext/u/rb_u_string_reverse.c +13 -0
  151. data/ext/u/rb_u_string_rindex.c +104 -0
  152. data/ext/u/rb_u_string_rpartition.c +81 -0
  153. data/ext/u/rb_u_string_rstrip.c +29 -0
  154. data/ext/u/rb_u_string_scan.c +109 -0
  155. data/ext/u/rb_u_string_script.c +253 -0
  156. data/ext/u/rb_u_string_soft_dotted.c +13 -0
  157. data/ext/u/rb_u_string_space.c +24 -0
  158. data/ext/u/rb_u_string_split.c +245 -0
  159. data/ext/u/rb_u_string_squeeze.c +75 -0
  160. data/ext/u/rb_u_string_start_with.c +31 -0
  161. data/ext/u/rb_u_string_strip.c +36 -0
  162. data/ext/u/rb_u_string_sub.c +147 -0
  163. data/ext/u/rb_u_string_times.c +35 -0
  164. data/ext/u/rb_u_string_title.c +10 -0
  165. data/ext/u/rb_u_string_titlecase.c +13 -0
  166. data/ext/u/rb_u_string_to_i.c +45 -0
  167. data/ext/u/rb_u_string_to_inum.c +364 -0
  168. data/ext/u/rb_u_string_to_inum.h +1 -0
  169. data/ext/u/rb_u_string_to_str.c +17 -0
  170. data/ext/u/rb_u_string_to_sym.c +12 -0
  171. data/ext/u/rb_u_string_tr.c +290 -0
  172. data/ext/u/rb_u_string_upcase.c +12 -0
  173. data/ext/u/rb_u_string_upper.c +13 -0
  174. data/ext/u/rb_u_string_valid.c +10 -0
  175. data/ext/u/rb_u_string_valid_encoding.c +12 -0
  176. data/ext/u/rb_u_string_wide.c +21 -0
  177. data/ext/u/rb_u_string_wide_cjk.c +21 -0
  178. data/ext/u/rb_u_string_width.c +19 -0
  179. data/ext/u/rb_u_string_word_break.c +63 -0
  180. data/ext/u/rb_u_string_xdigit.c +22 -0
  181. data/ext/u/rb_u_string_zero_width.c +16 -0
  182. data/ext/u/titled.c +55 -0
  183. data/ext/u/titled.h +1 -0
  184. data/ext/u/u.c +23 -0
  185. data/ext/u/u.h +458 -0
  186. data/ext/u/u_char_canonical_combining_class.c +31 -0
  187. data/ext/u/u_char_digit_value.c +21 -0
  188. data/ext/u/u_char_downcase.c +27 -0
  189. data/ext/u/u_char_general_category.c +31 -0
  190. data/ext/u/u_char_grapheme_break.c +28 -0
  191. data/ext/u/u_char_isalnum.c +24 -0
  192. data/ext/u/u_char_isalpha.c +21 -0
  193. data/ext/u/u_char_isassigned.c +16 -0
  194. data/ext/u/u_char_iscased.c +22 -0
  195. data/ext/u/u_char_iscaseignorable.c +29 -0
  196. data/ext/u/u_char_iscntrl.c +17 -0
  197. data/ext/u/u_char_isdefined.c +15 -0
  198. data/ext/u/u_char_isdigit.c +16 -0
  199. data/ext/u/u_char_isgraph.c +22 -0
  200. data/ext/u/u_char_islower.c +16 -0
  201. data/ext/u/u_char_isnewline.c +24 -0
  202. data/ext/u/u_char_isprint.c +21 -0
  203. data/ext/u/u_char_ispunct.c +27 -0
  204. data/ext/u/u_char_issoftdotted.c +18 -0
  205. data/ext/u/u_char_isspace.c +28 -0
  206. data/ext/u/u_char_isupper.c +16 -0
  207. data/ext/u/u_char_isvalid.c +18 -0
  208. data/ext/u/u_char_iswide.c +18 -0
  209. data/ext/u/u_char_iswide_cjk.c +22 -0
  210. data/ext/u/u_char_isxdigit.c +27 -0
  211. data/ext/u/u_char_iszerowidth.c +29 -0
  212. data/ext/u/u_char_line_break.c +29 -0
  213. data/ext/u/u_char_mirror.c +16 -0
  214. data/ext/u/u_char_normalized.c +23 -0
  215. data/ext/u/u_char_script.c +41 -0
  216. data/ext/u/u_char_to_u.c +48 -0
  217. data/ext/u/u_char_upcase.c +24 -0
  218. data/ext/u/u_char_width.c +12 -0
  219. data/ext/u/u_char_word_break.c +28 -0
  220. data/ext/u/u_char_xdigit_value.c +31 -0
  221. data/ext/u/u_collate.c +83 -0
  222. data/ext/u/u_collation_key.c +132 -0
  223. data/ext/u/u_decode.c +156 -0
  224. data/ext/u/u_downcase.c +201 -0
  225. data/ext/u/u_foldcase.c +68 -0
  226. data/ext/u/u_grapheme_clusters.c +57 -0
  227. data/ext/u/u_has_prefix.c +27 -0
  228. data/ext/u/u_index.c +93 -0
  229. data/ext/u/u_is_ascii_only.c +33 -0
  230. data/ext/u/u_locale.c +40 -0
  231. data/ext/u/u_locale.h +14 -0
  232. data/ext/u/u_mirror.c +20 -0
  233. data/ext/u/u_n_bytes.c +16 -0
  234. data/ext/u/u_n_chars.c +43 -0
  235. data/ext/u/u_normalize.c +232 -0
  236. data/ext/u/u_normalized.c +28 -0
  237. data/ext/u/u_offset_to_pointer.c +62 -0
  238. data/ext/u/u_pointer_to_offset.c +23 -0
  239. data/ext/u/u_recode.c +73 -0
  240. data/ext/u/u_reverse.c +21 -0
  241. data/ext/u/u_rindex.c +132 -0
  242. data/ext/u/u_titlecase.c +68 -0
  243. data/ext/u/u_upcase.c +89 -0
  244. data/ext/u/u_width.c +35 -0
  245. data/ext/u/u_words.c +82 -0
  246. data/ext/u/yield.h +27 -0
  247. data/lib/u-1.0.rb +20 -0
  248. data/lib/u-1.0/buffer.rb +10 -0
  249. data/lib/u-1.0/string.rb +9 -0
  250. data/lib/u-1.0/version.rb +287 -0
  251. data/test/unit/case.rb +2080 -0
  252. data/test/unit/foldcase.rb +1136 -0
  253. data/test/unit/graphemebreak.rb +407 -0
  254. data/test/unit/normalize.rb +367545 -0
  255. data/test/unit/u-1.0.rb +10 -0
  256. data/test/unit/u-1.0/buffer.rb +52 -0
  257. data/test/unit/u-1.0/string.rb +1439 -0
  258. data/test/unit/{u.rb → u-1.0/version.rb} +0 -1
  259. data/test/unit/wordbreak.rb +1083 -0
  260. metadata +603 -148
  261. data/README +0 -38
  262. data/Rakefile +0 -64
  263. data/ext/encoding/character/utf-8/break.c +0 -25
  264. data/ext/encoding/character/utf-8/data/break.h +0 -22931
  265. data/ext/encoding/character/utf-8/data/character-tables.h +0 -14358
  266. data/ext/encoding/character/utf-8/data/compose.h +0 -1607
  267. data/ext/encoding/character/utf-8/data/decompose.h +0 -10926
  268. data/ext/encoding/character/utf-8/data/generate-unicode-data.rb +0 -1070
  269. data/ext/encoding/character/utf-8/decompose.c +0 -444
  270. data/ext/encoding/character/utf-8/depend +0 -65
  271. data/ext/encoding/character/utf-8/extconf.rb +0 -67
  272. data/ext/encoding/character/utf-8/private.h +0 -51
  273. data/ext/encoding/character/utf-8/properties.c +0 -1056
  274. data/ext/encoding/character/utf-8/rb_includes.h +0 -19
  275. data/ext/encoding/character/utf-8/rb_methods.h +0 -49
  276. data/ext/encoding/character/utf-8/rb_private.h +0 -52
  277. data/ext/encoding/character/utf-8/rb_utf_aref.c +0 -111
  278. data/ext/encoding/character/utf-8/rb_utf_aset.c +0 -105
  279. data/ext/encoding/character/utf-8/rb_utf_casecmp.c +0 -24
  280. data/ext/encoding/character/utf-8/rb_utf_chomp.c +0 -114
  281. data/ext/encoding/character/utf-8/rb_utf_chop.c +0 -44
  282. data/ext/encoding/character/utf-8/rb_utf_collate.c +0 -13
  283. data/ext/encoding/character/utf-8/rb_utf_count.c +0 -30
  284. data/ext/encoding/character/utf-8/rb_utf_delete.c +0 -60
  285. data/ext/encoding/character/utf-8/rb_utf_downcase.c +0 -13
  286. data/ext/encoding/character/utf-8/rb_utf_each_char.c +0 -27
  287. data/ext/encoding/character/utf-8/rb_utf_foldcase.c +0 -13
  288. data/ext/encoding/character/utf-8/rb_utf_hex.c +0 -14
  289. data/ext/encoding/character/utf-8/rb_utf_index.c +0 -50
  290. data/ext/encoding/character/utf-8/rb_utf_insert.c +0 -48
  291. data/ext/encoding/character/utf-8/rb_utf_internal_bignum.c +0 -332
  292. data/ext/encoding/character/utf-8/rb_utf_internal_bignum.h +0 -12
  293. data/ext/encoding/character/utf-8/rb_utf_internal_tr.c +0 -142
  294. data/ext/encoding/character/utf-8/rb_utf_internal_tr.h +0 -41
  295. data/ext/encoding/character/utf-8/rb_utf_justify.c +0 -96
  296. data/ext/encoding/character/utf-8/rb_utf_length.c +0 -14
  297. data/ext/encoding/character/utf-8/rb_utf_lstrip.c +0 -41
  298. data/ext/encoding/character/utf-8/rb_utf_normalize.c +0 -51
  299. data/ext/encoding/character/utf-8/rb_utf_oct.c +0 -14
  300. data/ext/encoding/character/utf-8/rb_utf_reverse.c +0 -13
  301. data/ext/encoding/character/utf-8/rb_utf_rindex.c +0 -88
  302. data/ext/encoding/character/utf-8/rb_utf_rstrip.c +0 -51
  303. data/ext/encoding/character/utf-8/rb_utf_squeeze.c +0 -70
  304. data/ext/encoding/character/utf-8/rb_utf_strip.c +0 -27
  305. data/ext/encoding/character/utf-8/rb_utf_to_i.c +0 -25
  306. data/ext/encoding/character/utf-8/rb_utf_tr.c +0 -250
  307. data/ext/encoding/character/utf-8/rb_utf_upcase.c +0 -13
  308. data/ext/encoding/character/utf-8/tables.h +0 -38
  309. data/ext/encoding/character/utf-8/unicode.c +0 -319
  310. data/ext/encoding/character/utf-8/unicode.h +0 -216
  311. data/ext/encoding/character/utf-8/utf.c +0 -1334
  312. data/lib/encoding/character/utf-8.rb +0 -201
  313. data/lib/u.rb +0 -16
  314. data/lib/u/string.rb +0 -185
  315. data/lib/u/version.rb +0 -5
  316. data/test/unit/u/string.rb +0 -91
@@ -0,0 +1,10 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ untrust = Object.respond_to?(:untrust)
4
+
5
+ Expectations do
6
+ expect U::String do ''.u end
7
+ expect U::String.new('abc') do 'abc'.u end
8
+ expect result.tainted? do ''.taint.u end
9
+ expect result.untrusted? do ''.untrust.u end if untrust
10
+ end
@@ -0,0 +1,52 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ untrust = Object.respond_to?(:untrust)
4
+
5
+ Expectations do
6
+ expect U::Buffer do U::Buffer.new end
7
+ expect U::Buffer do U::Buffer.new(128) end
8
+ expect U::Buffer do U::Buffer.new(nil) end
9
+ expect TypeError do U::Buffer.new('abc') end
10
+
11
+ expect U::Buffer.new(5).append('abc') do |buffer| buffer.dup end
12
+ expect false do
13
+ original = U::Buffer.new(5).append('abc')
14
+ original.dup.object_id == original.object_id
15
+ end
16
+ expect false do
17
+ original = U::Buffer.new(5).append('abc')
18
+ original.dup.append('de').object_id == original.object_id
19
+ end
20
+
21
+ expect ArgumentError.new('wrong number of arguments (0 for at least 1)') do U::Buffer.new.append end
22
+ expect 'abcde'.u do U::Buffer.new.append('abc', 'de').to_u end
23
+ expect 'abcde'.u do (U::Buffer.new << 'abc' << 'de').to_u end
24
+ expect "abc\0def".u do U::Buffer.new.append('abc', 0, 'def'.u).to_u end
25
+ expect result.tainted? do U::Buffer.new.taint.to_u end
26
+ expect result.tainted? do U::Buffer.new.append(U::Buffer.new.taint).to_u end
27
+ expect result.tainted? do U::Buffer.new.append(''.taint).to_u end
28
+ expect result.untrusted? do U::Buffer.new.untrust.to_u end if untrust
29
+ expect result.untrusted? do U::Buffer.new.append(U::Buffer.new.untrust).to_u end if untrust
30
+ expect result.untrusted? do U::Buffer.new.append(''.untrust).to_u end if untrust
31
+
32
+ expect 'äbc'.u do U::Buffer.new.append_format('%cbc'.u, 'ä').to_u end
33
+ expect result.tainted? do U::Buffer.new.append_format('abc'.taint).to_u end
34
+ expect result.tainted? do U::Buffer.new.append_format('%s', 'abc'.taint).to_u end
35
+ expect result.tainted? do U::Buffer.new.append_format('%p', 'abc'.taint).to_u end
36
+
37
+ expect ''.u do U::Buffer.new.to_u! end
38
+ expect 'äbc'.u do U::Buffer.new.append('äbc').to_u! end
39
+ expect ''.u do U::Buffer.new.append('äbc').tap(&:to_u!).to_u! end
40
+
41
+ expect '#<U::Buffer äbc>' do U::Buffer.new.append('äbc'.u).inspect end
42
+ expect '#<U::Buffer äbcdëwvxÿz>' do U::Buffer.new.append('äbcdëwvxÿz'.u).inspect end
43
+ expect '#<U::Buffer äbcdëfwvxÿz>' do U::Buffer.new.append('äbcdëfwvxÿz'.u).inspect end
44
+ expect '#<U::Buffer äbcdë…wvxÿz>' do U::Buffer.new.append('äbcdëfgwvxÿz'.u).inspect end
45
+
46
+ expect 3 do U::Buffer.new.append('äbc'.u).length end
47
+ expect 3 do U::Buffer.new.append('äbc'.u).size end
48
+ expect 4 do U::Buffer.new.append('äbc'.u).bytesize end
49
+ expect 4 do U::Buffer.new.append('あbc'.u).width end
50
+
51
+ expect result.tainted? do U::Buffer.new.taint.to_s end
52
+ end
@@ -0,0 +1,1439 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ untrust = Object.respond_to?(:untrust)
4
+ word_regex = /\w/u =~ 'ä' ? /\w+/u : Regexp.new('[[:word:]]+')
5
+
6
+ Expectations do
7
+ expect ''.u do U::String.new end
8
+ expect ''.u do U::String.new(nil) end
9
+ expect '' do U::String.new(nil).to_str end
10
+ expect 'äbc' do U::String.new('äbc').to_str end
11
+ if defined? Encoding
12
+ expect 'äbc' do U::String.new('äbc'.encode(Encoding::ISO8859_1)).to_str end
13
+ expect Encoding::UndefinedConversionError do U::String.new('äbc'.encode(Encoding::ASCII_8BIT)) end
14
+ end
15
+ expect result.tainted? do 'u'.taint.u end
16
+ expect result.untrusted? do 'u'.untrust.u end if untrust
17
+
18
+ expect ''.u do ''.u.dup end
19
+ expect false do a = ''.u; a.dup.object_id == a.object_id end
20
+ expect result.tainted? do 'u'.u.taint.dup end
21
+ expect result.untrusted? do 'u'.u.untrust.dup end if untrust
22
+
23
+ expect true do 'äbc'.u.valid_encoding? end
24
+ expect true do "äbc\0def".u.valid_encoding? end
25
+ expect false do "\xc3bc".u.valid_encoding? end
26
+
27
+ expect true do ''.u.alnum? end
28
+ expect true do 'a'.u.alnum? end
29
+ expect true do 'ab'.u.alnum? end
30
+ expect false do '/'.u.alnum? end
31
+
32
+ expect true do ''.u.alpha? end
33
+ expect true do 'a'.u.alpha? end
34
+ expect true do 'ab'.u.alpha? end
35
+ expect false do 'a0'.u.alpha? end
36
+
37
+ expect true do 'abc'.u.ascii_only? end
38
+ expect false do 'äbc'.u.ascii_only? end
39
+
40
+ expect true do ''.u.assigned? end
41
+ expect true do 'a'.u.assigned? end
42
+ expect true do 'ab'.u.assigned? end
43
+ expect false do [0x0588].pack('U').u.assigned? end
44
+
45
+ expect true do ''.u.case_ignorable? end
46
+ expect true do "'".u.case_ignorable? end
47
+ expect true do "'’".u.case_ignorable? end
48
+ expect true do [0x0307].pack('U').u.case_ignorable? end
49
+ expect false do 'a'.u.case_ignorable? end
50
+
51
+ expect true do ''.u.cased? end
52
+ expect true do 'a'.u.cased? end
53
+ expect true do 'ab'.u.cased? end
54
+ expect false do '0'.u.cased? end
55
+
56
+ expect true do ''.u.cntrl? end
57
+ expect true do "\0".u.cntrl? end
58
+ expect true do "\0\1".u.cntrl? end
59
+ expect false do "a".u.cntrl? end
60
+
61
+ expect true do ''.u.defined? end
62
+ expect true do 'a'.u.defined? end
63
+ expect true do 'ab'.u.defined? end
64
+ expect false do [0x0588].pack('U').u.defined? end
65
+ # TODO: This raises an error, as we’re using u_aref_char_validated_n for
66
+ # these functions. Perhaps use u_aref_char_n and don’t raise errors on
67
+ # invalid input.
68
+ # expect false do [0xD800].pack('U').u.defined? end
69
+
70
+ expect true do ''.u.digit? end
71
+ expect true do '0'.u.digit? end
72
+ expect true do '01'.u.digit? end
73
+ expect false do '0a'.u.digit? end
74
+
75
+ expect true do 'ss'.u.folded? end
76
+ expect false do 'ß'.u.folded? end
77
+ expect true do 'abc\0ß'.u.foldcase.folded? end
78
+
79
+ expect true do ''.u.graph? end
80
+ expect true do '0'.u.graph? end
81
+ expect true do '01'.u.graph? end
82
+ expect false do "\0".u.graph? end
83
+
84
+ expect true do 'i'.u.lower? end
85
+ expect true do 'i'.u.lower?('lt') end
86
+ expect false do 'I'.u.lower? end
87
+ expect false do 'I'.u.lower?('lt') end
88
+
89
+ expect true do ''.u.newline? end
90
+ expect true do [0x2028].pack('U').u.newline? end
91
+ expect true do "\r\n".u.newline? end
92
+ expect false do 'a'.u.newline? end
93
+
94
+ expect true do ''.u.print? end
95
+ expect true do 'a'.u.print? end
96
+ expect true do 'ab'.u.print? end
97
+ expect false do "\n".u.print? end
98
+
99
+ expect true do ''.u.punct? end
100
+ expect true do '.'.u.punct? end
101
+ expect true do '()'.u.punct? end
102
+ expect false do 'a'.u.punct? end
103
+
104
+ expect true do ''.u.soft_dotted? end
105
+ expect true do 'i'.u.soft_dotted? end
106
+ expect true do 'ij'.u.soft_dotted? end
107
+ expect false do 'a'.u.soft_dotted? end
108
+
109
+ expect true do ''.u.space? end
110
+ expect true do ' '.u.space? end
111
+ expect true do " \t\n".u.space? end
112
+ expect false do 'a'.u.space? end
113
+
114
+ expect false do 'i'.u.title? end
115
+ expect false do 'I'.u.title? end
116
+ expect false do 'DZ'.u.title? end
117
+ expect true do 'Dz'.u.title? end
118
+
119
+ expect false do 'i'.u.upper? end
120
+ expect false do 'i'.u.upper?('lt') end
121
+ expect false do 'i'.u.upper?('tr') end
122
+ expect true do 'I'.u.upper? end
123
+ expect true do 'I'.u.upper?('lt') end
124
+ expect true do 'I'.u.upper?('tr') end
125
+
126
+ expect true do ''.u.valid? end
127
+
128
+ expect true do ''.u.wide? end
129
+ expect true do '豈'.u.wide? end
130
+ expect true do '豈豈'.u.wide? end
131
+ expect false do 'a'.u.wide? end
132
+
133
+ expect true do ''.u.wide_cjk? end
134
+ expect true do '豈'.u.wide_cjk? end
135
+ expect true do '豈豈'.u.wide_cjk? end
136
+ expect true do '豈♣'.u.wide_cjk? end
137
+ expect false do 'a'.u.wide_cjk? end
138
+
139
+ expect true do ''.u.xdigit? end
140
+ expect true do '0'.u.xdigit? end
141
+ expect true do '0a'.u.xdigit? end
142
+ expect false do 'g'.u.xdigit? end
143
+
144
+ expect true do ''.u.zero_width? end
145
+ expect true do [0x200b].pack('U').u.zero_width? end
146
+ expect true do [0x200b, 0x1160].pack('U*').u.zero_width? end
147
+ expect false do 'a'.u.zero_width? end
148
+
149
+ expect result.normalized?(:nfc) do 'äbc'.u end
150
+ expect result.normalized?(:nfd) do 'äbc'.u.normalize(:nfd) end
151
+ expect result.normalized? do 'äbc'.u.normalize(:nfd) end
152
+
153
+ expect result.not.eql?('abc') do 'abc'.u end
154
+ expect result.not.eql?('äbc'.u) do 'äbc'.u.normalize(:nfd) end
155
+ expect result.eql?('äbc'.u) do 'äbc'.u.normalize(:nfd).normalize(:nfc) end
156
+
157
+ expect TypeError do 'abc'.u =~ 'abc' end
158
+ expect TypeError do 'abc'.u =~ 'abc'.u end
159
+ expect 10 do 'FëëFiëFöö-Fum'.u =~ /Fum$/u end
160
+ expect nil do 'FëëFiëFöö-Fum'.u =~ /FUM$/u end
161
+ expect 'fööbar' do 'föö'.u =~ stub(:=~ => proc{ |t| t + 'bar'.u }) end
162
+
163
+ expect 'a' do 'abc'.u.match(/a/)[0] end
164
+ expect nil do 'abc'.u.match(/d/) end
165
+ expect 'a' do 'abc'.u.match('a')[0] end
166
+ expect nil do 'abc'.u.match('d') end
167
+ expect result.tainted? do 'abc'.u.taint.match(/a/) end
168
+ expect result.untrusted? do 'abc'.u.untrust.match(/a/) end if untrust
169
+ expect result.tainted? do 'abc'.u.taint.match('a') end
170
+ expect result.untrusted? do 'abc'.u.untrust.match('a') end if untrust
171
+ expect result.tainted? do 'abc'.u.match(/a/.taint) end
172
+ expect result.untrusted? do 'abc'.u.match(/a/.untrust) end if untrust
173
+ expect result.tainted? do 'abc'.u.match('a'.taint) end if 'abc'.match('a'.taint).tainted?
174
+ expect result.untrusted? do 'abc'.u.match('a'.untrust) end if untrust
175
+
176
+ expect result.to.be.empty? do ''.u end
177
+ expect result.not.to.be.empty? do 'not'.u end
178
+
179
+ expect result.to.end_with?('c') do 'abc'.u end
180
+ expect result.not.to.end_with?('d') do 'abc'.u end
181
+ expect result.to.end_with?('ä') do 'cbä'.u end
182
+ expect result.not.to.end_with?('äb') do 'cbä'.u end
183
+ expect result.to.end_with?('a', 'ä') do 'cbä'.u end
184
+ expect result.not.to.end_with? do 'cbä'.u end
185
+
186
+ expect result.to.include?('f'.u) do 'fööbär'.u end
187
+ expect result.to.include?('föö'.u) do 'fööbär'.u end
188
+ expect result.to.include?('bär'.u) do 'fööbär'.u end
189
+ expect result.not.to.include?('bäz'.u) do 'fööbär'.u end
190
+ expect result.not.to.include?('z'.u) do 'fööbär'.u end
191
+
192
+ expect 0 do 'hëllö'.u.index('') end
193
+ expect 0 do 'hëllö'.u.index('h') end
194
+ expect 4 do 'hëllö'.u.index('ö') end
195
+ expect 1 do 'hëllö'.u.index('ëll') end
196
+ expect 2 do 'hëllö'.u.index(/ll/u) end
197
+ expect nil do 'hëllö'.u.index('hëllö!') end
198
+ expect nil do 'hëllö'.u.index('z') end
199
+ expect nil do 'hëllö'.u.index(/z./u) end
200
+ expect 3 do 'hëllö'.u.index('l', 3) end
201
+ expect 3 do 'hëllö'.u.index(/l./u, 3) end
202
+ expect nil do 'hëllö'.u.index('hëllö!', 3) end
203
+ expect nil do 'hëllö'.u.index('z', 3) end
204
+ expect nil do 'hëllö'.u.index(/z./u, 3) end
205
+ expect 2 do 'hëllö'.u.index(stub(:to_str => 'llö')) end
206
+ expect TypeError do 'hëllö'.u.index(Object.new) end
207
+ expect nil do 'föö'.u.index(//, -100) end
208
+ expect nil do 'föö'.u.index(//, -100); $~ end
209
+
210
+ expect 5 do 'hëllö'.u.rindex('') end
211
+ expect 3 do 'hëllö'.u.rindex('l') end
212
+ expect 6 do 'ëll, hëllö'.u.rindex('ëll') end
213
+ expect 7 do 'ëll, hëllö'.u.rindex(/ll./u) end
214
+ expect nil do 'hëllö'.u.rindex('hëllö!') end
215
+ expect nil do 'hëllö'.u.rindex('z') end
216
+ expect nil do 'hëllö'.u.rindex(/z./u) end
217
+ expect 3 do 'hëllö,lö'.u.rindex('l', 3) end
218
+ expect 3 do 'hëllö,lö'.u.rindex(/l./u, 3) end
219
+ expect nil do 'hëllö,lö'.u.rindex('hëllö!', 3) end
220
+ expect nil do 'hëllö,lö'.u.rindex('z', 3) end
221
+ expect nil do 'hëllö,lö'.u.rindex(/z./u, 3) end
222
+ expect 6 do 'fööbarbarbaz'.u.rindex(stub(:to_str => 'bar')) end
223
+ expect TypeError do 'hëllö'.u.rindex(Object.new) end
224
+ expect nil do 'föö'.u.rindex(//, -100) end
225
+ expect nil do 'föö'.u.rindex(//, -100); $~ end
226
+
227
+ expect result.to.start_with?('a') do 'abc'.u end
228
+ expect result.not.to.start_with?('b') do 'abc'.u end
229
+ expect result.to.start_with?('ä') do 'äbc'.u end
230
+ expect result.not.to.start_with?('bc') do 'äbc'.u end
231
+ expect result.to.start_with?('a', 'ä') do 'äbc'.u end
232
+ expect result.not.to.start_with? do 'äbc'.u end
233
+
234
+ expect result.>(0) do 'あB'.u.casecmp('あa', 'en_US.UTF-8') end
235
+ expect result.>(0) do 'あB'.u.casecmp('あa'.u, 'en_US.UTF-8') end
236
+
237
+ expect "\0".u do "\0".u.collation_key('en_US.UTF-8') end
238
+ expect U::String do 'äbcdëf'.u.collation_key('en_US.UTF-8') end
239
+ expect U::String do "äbc\0dëf".u.collation_key('en_US.UTF-8') end
240
+ expect result.tainted? do ''.u.taint.collation_key('en_US.UTF-8') end
241
+ expect result.untrusted? do ''.u.untrust.collation_key('en_US.UTF-8') end if untrust
242
+
243
+ expect 0 do 'a'.u.canonical_combining_class end
244
+ expect 230 do [0x0307].pack('U').u.canonical_combining_class end
245
+
246
+ expect :letter_uppercase do 'A'.u.general_category end
247
+ expect :punctuation_other do '.'.u.general_category end
248
+ expect :symbol_currency do '$'.u.general_category end
249
+ expect :separator_space do ' '.u.general_category end
250
+
251
+ expect :cr do "\r".u.grapheme_break end
252
+ expect :other do 'a'.u.grapheme_break end
253
+
254
+ expect :open_punctuation do '('.u.line_break end
255
+ expect :close_parenthesis do ')'.u.line_break end
256
+
257
+ expect ArgumentError do [0x002A, 0x1CED].pack('U*').u.script end
258
+ expect :common do [0x002A].pack('U').u.script end
259
+ expect :inherited do [0x1CED].pack('U').u.script end
260
+ expect :inherited do [0x0670].pack('U').u.script end
261
+ expect :arabic do [0x060D].pack('U').u.script end
262
+ expect :armenian do [0x0559].pack('U').u.script end
263
+ expect :bengali do [0x09CD].pack('U').u.script end
264
+ expect :bopomofo do [0x31B6].pack('U').u.script end
265
+ expect :cherokee do [0x13A2].pack('U').u.script end
266
+ expect :coptic do [0x2CFD].pack('U').u.script end
267
+ expect :cyrillic do [0x0482].pack('U').u.script end
268
+ expect :deseret do [0x10401].pack('U').u.script end
269
+ expect :devanagari do [0x094D].pack('U').u.script end
270
+ expect :ethiopic do [0x1258].pack('U').u.script end
271
+ expect :georgian do [0x10FC].pack('U').u.script end
272
+ expect :gothic do [0x10341].pack('U').u.script end
273
+ expect :greek do [0x0375].pack('U').u.script end
274
+ expect :gujarati do [0x0A83].pack('U').u.script end
275
+ expect :gurmukhi do [0x0A3C].pack('U').u.script end
276
+ expect :han do [0x3005].pack('U').u.script end
277
+ expect :hangul do [0x1100].pack('U').u.script end
278
+ expect :hebrew do [0x05BF].pack('U').u.script end
279
+ expect :hiragana do [0x309F].pack('U').u.script end
280
+ expect :kannada do [0x0CBC].pack('U').u.script end
281
+ expect :katakana do [0x30FF].pack('U').u.script end
282
+ expect :khmer do [0x17DD].pack('U').u.script end
283
+ expect :lao do [0x0EDD].pack('U').u.script end
284
+ expect :latin do [0x0061].pack('U').u.script end
285
+ expect :malayalam do [0x0D3D].pack('U').u.script end
286
+ expect :mongolian do [0x1843].pack('U').u.script end
287
+ expect :myanmar do [0x1031].pack('U').u.script end
288
+ expect :ogham do [0x169C].pack('U').u.script end
289
+ expect :old_italic do [0x10322].pack('U').u.script end
290
+ expect :oriya do [0x0B3C].pack('U').u.script end
291
+ expect :runic do [0x16EF].pack('U').u.script end
292
+ expect :sinhala do [0x0DBD].pack('U').u.script end
293
+ expect :syriac do [0x0711].pack('U').u.script end
294
+ expect :tamil do [0x0B82].pack('U').u.script end
295
+ expect :telugu do [0x0C03].pack('U').u.script end
296
+ expect :thaana do [0x07B1].pack('U').u.script end
297
+ expect :thai do [0x0E31].pack('U').u.script end
298
+ expect :tibetan do [0x0FD4].pack('U').u.script end
299
+ expect :canadian_aboriginal do [0x1400].pack('U').u.script end
300
+ expect :canadian_aboriginal do [0x1401].pack('U').u.script end
301
+ expect :yi do [0xA015].pack('U').u.script end
302
+ expect :tagalog do [0x1700].pack('U').u.script end
303
+ expect :hanunoo do [0x1720].pack('U').u.script end
304
+ expect :buhid do [0x1740].pack('U').u.script end
305
+ expect :tagbanwa do [0x1760].pack('U').u.script end
306
+ expect :braille do [0x2800].pack('U').u.script end
307
+ expect :cypriot do [0x10808].pack('U').u.script end
308
+ expect :limbu do [0x1932].pack('U').u.script end
309
+ expect :osmanya do [0x10480].pack('U').u.script end
310
+ expect :shavian do [0x10450].pack('U').u.script end
311
+ expect :linear_b do [0x10000].pack('U').u.script end
312
+ expect :tai_le do [0x1950].pack('U').u.script end
313
+ expect :ugaritic do [0x1039F].pack('U').u.script end
314
+ expect :new_tai_lue do [0x1980].pack('U').u.script end
315
+ expect :buginese do [0x1A1F].pack('U').u.script end
316
+ expect :glagolitic do [0x2C00].pack('U').u.script end
317
+ expect :tifinagh do [0x2D6F].pack('U').u.script end
318
+ expect :syloti_nagri do [0xA800].pack('U').u.script end
319
+ expect :old_persian do [0x103D0].pack('U').u.script end
320
+ expect :kharoshthi do [0x10A3F].pack('U').u.script end
321
+ expect :unknown do ''.u.script end
322
+ expect :balinese do [0x1B04].pack('U').u.script end
323
+ expect :cuneiform do [0x12000].pack('U').u.script end
324
+ expect :phoenician do [0x10900].pack('U').u.script end
325
+ expect :phags_pa do [0xA840].pack('U').u.script end
326
+ expect :nko do [0x07C0].pack('U').u.script end
327
+ expect :kayah_li do [0xA900].pack('U').u.script end
328
+ expect :lepcha do [0x1C00].pack('U').u.script end
329
+ expect :rejang do [0xA930].pack('U').u.script end
330
+ expect :sundanese do [0x1B80].pack('U').u.script end
331
+ expect :saurashtra do [0xA880].pack('U').u.script end
332
+ expect :cham do [0xAA00].pack('U').u.script end
333
+ expect :ol_chiki do [0x1C50].pack('U').u.script end
334
+ expect :vai do [0xA500].pack('U').u.script end
335
+ expect :carian do [0x102A0].pack('U').u.script end
336
+ expect :lycian do [0x10280].pack('U').u.script end
337
+ expect :lydian do [0x1093F].pack('U').u.script end
338
+ expect :avestan do [0x10B00].pack('U').u.script end
339
+ expect :bamum do [0xA6A0].pack('U').u.script end
340
+ expect :egyptian_hieroglyphs do [0x13000].pack('U').u.script end
341
+ expect :imperial_aramaic do [0x10840].pack('U').u.script end
342
+ expect :inscriptional_pahlavi do [0x10B60].pack('U').u.script end
343
+ expect :inscriptional_parthian do [0x10B40].pack('U').u.script end
344
+ expect :javanese do [0xA980].pack('U').u.script end
345
+ expect :kaithi do [0x11082].pack('U').u.script end
346
+ expect :lisu do [0xA4D0].pack('U').u.script end
347
+ expect :meetei_mayek do [0xABE5].pack('U').u.script end
348
+ expect :old_south_arabian do [0x10A60].pack('U').u.script end
349
+ expect :old_turkic do [0x10C00].pack('U').u.script end
350
+ expect :samaritan do [0x0800].pack('U').u.script end
351
+ expect :tai_tham do [0x1A20].pack('U').u.script end
352
+ expect :tai_viet do [0xAA80].pack('U').u.script end
353
+ expect :batak do [0x1BC0].pack('U').u.script end
354
+ expect :brahmi do [0x11000].pack('U').u.script end
355
+ expect :mandaic do [0x0840].pack('U').u.script end
356
+
357
+ expect :aletter do 'a'.u.word_break end
358
+
359
+ expect 4 do 'äbc'.u.bytesize end
360
+ expect 9 do "äbc\0dëf".u.bytesize end
361
+
362
+ expect 0 do ''.u.length end
363
+ expect 4 do '1234'.u.length end
364
+ expect 6 do "1234\r\n".u.length end
365
+ expect 7 do "\0011234\r\n".u.length end
366
+ expect 5 do 'hëllö'.u.length end
367
+ expect 6 do "\0hëllö".u.length end
368
+ expect 12 do "hëllö\0agäin\303".u.length end
369
+
370
+ expect 0 do ''.u.size end
371
+ expect 4 do '1234'.u.size end
372
+ expect 6 do "1234\r\n".u.size end
373
+ expect 7 do "\0011234\r\n".u.size end
374
+ expect 5 do 'hëllö'.u.size end
375
+ expect 6 do "\0hëllö".u.size end
376
+ expect 12 do "hëllö\0agäin\303".u.size end
377
+
378
+ expect 0 do ''.u.width end
379
+ expect 1 do 'a'.u.width end
380
+ expect 1 do "a\xcc\x87".u.width end
381
+ expect 2 do '豈'.u.width end
382
+ expect 3 do 'a豈'.u.width end
383
+
384
+ expect [0x61, 0x62, 0x63, 0x00, 0x64, 0xc3, 0xab, 0x66] do "abc\0dëf".u.each_byte.to_a end
385
+ expect 8 do "abc\0dëf".u.each_byte.size end if ''.u.each_byte.respond_to? :size
386
+
387
+ expect [0x61, 0x62, 0x63, 0x00, 0x64, 0xc3, 0xab, 0x66] do "abc\0dëf".u.bytes end
388
+
389
+ expect ['h'.u, 'ë'.u, 'l'.u, 'l'.u, 'ö'.u] do 'hëllö'.u.each_char.to_a end
390
+ expect 5 do 'hëllö'.u.each_char.size end if ''.u.each_byte.respond_to? :size
391
+ expect result.tainted? do 'a'.u.taint.each_char.first end
392
+ expect result.untrusted? do 'a'.u.untrust.each_char.first end if untrust
393
+
394
+ expect ['h'.u, 'ë'.u, 'l'.u, 'l'.u, 'ö'.u] do 'hëllö'.u.chars end
395
+ expect result.tainted? do 'a'.u.taint.chars.first end
396
+ expect result.untrusted? do 'a'.u.untrust.chars.first end if untrust
397
+
398
+ expect [0x0068, 0x00eb, 0x006c, 0x006c, 0x00f6] do 'hëllö'.u.each_codepoint.to_a end
399
+ expect 5 do 'hëllö'.u.each_codepoint.size end if ''.u.each_byte.respond_to? :size
400
+
401
+ expect [0x0068, 0x00eb, 0x006c, 0x006c, 0x00f6] do 'hëllö'.u.codepoints end
402
+
403
+ expect ['h'.u, 'ë'.u.normalize(:nfd), 'l'.u, 'l'.u, 'ö'.u.normalize(:nfd)] do 'hëllö'.u.normalize(:nfd).grapheme_clusters.to_a end
404
+
405
+ expect ["hello\n".u, 'world'.u] do with_global(:$/, "\n"){ "hello\nworld".u.each_line.to_a } end
406
+ expect ["hello\n\n\n".u, 'world'.u] do "hello\n\n\nworld".u.each_line('').to_a end
407
+ expect ['hello!'.u, 'world'.u] do with_global(:$/, '!'){ 'hello!world'.u.each_line.to_a } end
408
+ expect ["hello\nworld".u] do with_global(:$/, nil){ "hello\nworld".u.each_line.to_a } end
409
+ expect ['hëll hëllö'.u, ' world'.u] do 'hëll hëllö world'.u.each_line('llö').to_a end
410
+ expect ["hello\0".u, 'world'.u] do "hello\0world".u.each_line("\0").to_a end
411
+ expect result.tainted? do 'a'.u.taint.each_line.first end
412
+ expect result.untrusted? do 'a'.u.untrust.each_line.first end if untrust
413
+
414
+ expect ["hello\n".u, 'world'.u] do with_global(:$/, "\n"){ "hello\nworld".u.lines } end
415
+ expect ["hello\n\n\n".u, 'world'.u] do "hello\n\n\nworld".u.lines('') end
416
+ expect ['hello!'.u, 'world'.u] do with_global(:$/, '!'){ 'hello!world'.u.lines } end
417
+ expect ["hello\nworld".u] do with_global(:$/, nil){ "hello\nworld".u.lines } end
418
+ expect ['hëll hëllö'.u, ' world'.u] do 'hëll hëllö world'.u.lines('llö') end
419
+ expect ["hello\0".u, 'world'.u] do "hello\0world".u.lines("\0") end
420
+ expect result.tainted? do 'a'.u.taint.lines.first end
421
+ expect result.untrusted? do 'a'.u.untrust.lines.first end if untrust
422
+
423
+ expect ['hello'.u, ' '.u, 'world'.u] do 'hello world'.u.words.to_a end
424
+
425
+ expect nil do ''.u[0, -2] end
426
+ expect nil do ''.u[0, -1] end
427
+ expect ''.u do ''.u[0, 0] end
428
+ expect ''.u do ''.u[0, 1] end
429
+ expect ''.u do ''.u[0, 2] end
430
+ expect nil do ''.u[-1, -2] end
431
+ expect nil do ''.u[-1, -1] end
432
+ expect nil do ''.u[-1, 0] end
433
+ expect nil do ''.u[-1, 1] end
434
+ expect nil do ''.u[-1, 2] end
435
+ expect nil do ''.u[1, -2] end
436
+ expect nil do ''.u[1, -1] end
437
+ expect nil do ''.u[1, 0] end
438
+ expect nil do ''.u[1, 1] end
439
+ expect nil do ''.u[1, 2] end
440
+ expect nil do ''.u[0] end
441
+ expect 'h'.u do 'hëllö'.u[0] end
442
+ expect 'ö'.u do 'hëllö'.u[-1] end
443
+ expect nil do 'hëllö'.u[5] end
444
+ expect nil do 'hëllö'.u[-6] end
445
+ expect 'hë'.u do 'hëllö'.u[0, 2] end
446
+ expect 'lö'.u do 'hëllö'.u[-2, 2] end
447
+ expect 'lö'.u do 'hëllö'.u[3, 2] end
448
+ expect 'hël'.u do 'hëllö'.u[0..2] end
449
+ expect 'hël'.u do 'hëllö'.u[0...3] end
450
+ expect 'lö'.u do 'hëllö'.u[-2..-1] end
451
+ expect 'hë'.u do 'hëllö'.u[/\Ah./u] end
452
+ expect 'lö'.u do 'hëllö'.u[/.ö\z/u] end
453
+ expect nil do 'hëllö'.u[/other/u] end
454
+ expect 'hë'.u do 'hëllö'.u['hë'.u] end
455
+ expect 'lö'.u do 'hëllö'.u['lö'.u] end
456
+ expect 'hë'.u do 'hëllö'.u['hë'] end
457
+ expect 'lö'.u do 'hëllö'.u['lö'] end
458
+ expect nil do 'hëllö'.u['other'.u] end
459
+ expect nil do 'hëllö'.u['other'] end
460
+ expect 'hë'.u do 'hëllö'.u[/(..)(..)/u, 1] end
461
+ expect 'll'.u do 'hëllö'.u[/(..)(..)/u, 2] end
462
+ expect nil do 'hëllö'.u[/(..)(..)/u, 3] end
463
+ expect 'll'.u do 'hëllö'.u[/(..)(..)/u, -1] end
464
+ expect 'hë'.u do 'hëllö'.u[/(..)(..)/u, -2] end
465
+ expect nil do 'hëllö'.u[/(..)(..)/u, -3] end
466
+ expect 'l'.u do 'hëllö'.u[stub(:to_int => 2)] end
467
+ expect ArgumentError do 'hëllö'.u[1, 2, 3] end
468
+ expect ArgumentError do 'hëllö'.u[] end
469
+ expect result.tainted? do 'a'.u.taint[0] end
470
+ expect result.untrusted? do 'a'.u.untrust[0] end if untrust
471
+ expect result.tainted? do 'a'.u.taint[0, 1] end
472
+ expect result.untrusted? do 'a'.u.untrust[0, 1] end if untrust
473
+ expect result.tainted? do 'a'.u.taint[0...1] end
474
+ expect result.untrusted? do 'a'.u.untrust[0...1] end if untrust
475
+ expect result.tainted? do 'a'.u.taint[/a/] end
476
+ expect result.untrusted? do 'a'.u.untrust[/a/] end if untrust
477
+ expect result.tainted? do 'a'.u[/a/.taint] end
478
+ expect result.untrusted? do 'a'.u[/a/.untrust] end if untrust
479
+ expect result.tainted? do 'a'.u[/(a)/.taint, 1] end
480
+ expect result.untrusted? do 'a'.u[/(a)/.untrust, 1] end if untrust
481
+ expect result.not.tainted? do 'a'.u.taint['a'.u] end
482
+ expect result.not.untrusted? do 'a'.u.untrust['a'.u] end if untrust
483
+ expect result.not.tainted? do 'a'.u.taint['a'] end
484
+ expect result.not.untrusted? do 'a'.u.untrust['a'] end if untrust
485
+ expect result.tainted? do 'a'.u['a'.u.taint] end
486
+ expect result.untrusted? do 'a'.u['a'.u.untrust] end if untrust
487
+ expect result.tainted? do 'a'.u['a'.taint] end
488
+ expect result.untrusted? do 'a'.u['a'.untrust] end if untrust
489
+
490
+ expect nil do ''.u.byteslice(0, -2) end
491
+ expect nil do ''.u.byteslice(0, -1) end
492
+ expect ''.u do ''.u.byteslice(0, 0) end
493
+ expect ''.u do ''.u.byteslice(0, 1) end
494
+ expect ''.u do ''.u.byteslice(0, 2) end
495
+ expect nil do ''.u.byteslice(-1, -2) end
496
+ expect nil do ''.u.byteslice(-1, -1) end
497
+ expect nil do ''.u.byteslice(-1, 0) end
498
+ expect nil do ''.u.byteslice(-1, 1) end
499
+ expect nil do ''.u.byteslice(-1, 2) end
500
+ expect nil do ''.u.byteslice(1, -2) end
501
+ expect nil do ''.u.byteslice(1, -1) end
502
+ expect nil do ''.u.byteslice(1, 0) end
503
+ expect nil do ''.u.byteslice(1, 1) end
504
+ expect nil do ''.u.byteslice(1, 2) end
505
+ expect nil do ''.u.byteslice(0) end
506
+ expect 'h'.u do 'hëllö'.u.byteslice(0) end
507
+ expect "\xb6".u do 'hëllö'.u.byteslice(-1) end
508
+ expect nil do 'hëllö'.u.byteslice(7) end
509
+ expect nil do 'hëllö'.u.byteslice(-8) end
510
+ expect "h\xc3".u do 'hëllö'.u.byteslice(0, 2) end
511
+ expect 'ö'.u do 'hëllö'.u.byteslice(-2, 2) end
512
+ expect 'll'.u do 'hëllö'.u.byteslice(3, 2) end
513
+ expect 'hë'.u do 'hëllö'.u.byteslice(0..2) end
514
+ expect 'hë'.u do 'hëllö'.u.byteslice(0...3) end
515
+ expect 'ö'.u do 'hëllö'.u.byteslice(-2..-1) end
516
+ expect 'l'.u do 'hëllö'.u.byteslice(stub(:to_int => 3)) end
517
+ expect ArgumentError do 'hëllö'.u.byteslice(1, 2, 3) end
518
+ expect ArgumentError do 'hëllö'.u.byteslice() end
519
+ expect result.tainted? do 'a'.u.taint.byteslice(0) end
520
+ expect result.untrusted? do 'a'.u.untrust.byteslice(0) end if untrust
521
+ expect result.tainted? do 'a'.u.taint.byteslice(0, 1) end
522
+ expect result.untrusted? do 'a'.u.untrust.byteslice(0, 1) end if untrust
523
+ expect result.tainted? do 'a'.u.taint.byteslice(0...1) end
524
+ expect result.untrusted? do 'a'.u.untrust.byteslice(0...1) end if untrust
525
+
526
+ expect 'hello'.u do 'hello'.u.chomp("\n") end
527
+ expect 'hello'.u do "hello\n".u.chomp("\n") end
528
+ expect 'hello'.u do with_global(:$/, "\n"){ 'hello'.u.chomp } end
529
+ expect 'hello'.u do with_global(:$/, "\n"){ "hello\n".u.chomp } end
530
+ expect 'hello'.u do with_global(:$/, '!'){ 'hello'.u.chomp } end
531
+ expect 'hello'.u do with_global(:$/, '!'){ 'hello!'.u.chomp } end
532
+ expect 'hello!!'.u do 'hello!!!'.u.chomp('!') end
533
+ expect "hello\r\n".u do "hello\r\n\r\n".u.chomp("\n") end
534
+ expect 'hello'.u do "hello\r".u.chomp("\n") end
535
+ expect 'hello'.u do "hello\r\n".u.chomp('') end
536
+ expect "hello".u do "hello\r\n\r\n".u.chomp('') end
537
+ # NOTE This differs from Ruby because U treats \r as a newline character and
538
+ # thus removes it.
539
+ expect 'hello'.u do "hello\r".u.chomp('') end
540
+ expect 'a'.u do 'a'.u.chomp("\xC3") end
541
+ expect 'a'.u do 'aā'.u.chomp('ā') end
542
+ expect result.tainted? do 'hello'.u.taint.chomp end
543
+ expect result.untrusted? do 'hello'.u.untrust.chomp end if untrust
544
+
545
+ expect 'hell'.u do 'hellö'.u.chop end
546
+ expect 'hellö'.u do "hellö\r\n".u.chop end
547
+ expect "hellö\n".u do "hellö\n\r".u.chop end
548
+ expect ''.u do ''.u.chop end
549
+ expect ''.u do "\r\n".u.chop end
550
+ expect result.tainted? do 'hello'.u.taint.chop end
551
+ expect result.untrusted? do 'hello'.u.untrust.chop end if untrust
552
+
553
+ expect ''.u do ''.u.chr end
554
+ expect 'ä'.u do 'ä'.u.chr end
555
+ expect 'ä'.u do 'äbc'.u.chr end
556
+ expect result.tainted? do ''.u.taint.chr end
557
+ expect result.untrusted? do ''.u.untrust.chr end if untrust
558
+
559
+ expect 0x00c3 do 'äbc'.u.getbyte(0) end
560
+ expect 0x00a4 do 'äbc'.u.getbyte(1) end
561
+ expect nil do 'äbc'.u.getbyte(4) end
562
+ expect 0x00a4 do 'äbc'.u.getbyte(-3) end
563
+ expect 0x00c3 do 'äbc'.u.getbyte(-4) end
564
+ expect nil do 'äbc'.u.getbyte(-5) end
565
+
566
+ # TODO Add tests for Unicode whitespace characters
567
+ expect 'あ'.u do 'あ'.u.lstrip end
568
+ expect 'あ'.u do ' あ'.u.lstrip end
569
+ expect 'あ '.u do 'あ '.u.lstrip end
570
+ expect result.tainted? do 'あ'.u.taint.lstrip end
571
+ expect result.untrusted? do 'あ'.u.untrust.lstrip end if untrust
572
+
573
+ expect ArgumentError.new('empty string') do ''.u.ord end
574
+ expect 0x00e4 do 'ä'.u.ord end
575
+ expect 0x00e4 do 'äbc'.u.ord end
576
+
577
+ # TODO Add tests for Unicode whitespace characters
578
+ expect 'あ'.u do 'あ'.u.rstrip end
579
+ expect ' あ'.u do ' あ'.u.rstrip end
580
+ expect 'あ'.u do 'あ '.u.rstrip end
581
+ expect result.tainted? do 'あ'.u.taint.rstrip end
582
+ expect result.untrusted? do 'あ'.u.untrust.rstrip end if untrust
583
+
584
+ # TODO Add tests for Unicode whitespace characters
585
+ expect 'あ'.u do 'あ'.u.strip end
586
+ expect 'あ'.u do ' あ'.u.strip end
587
+ expect 'あ'.u do 'あ '.u.strip end
588
+ expect 'あ'.u do ' あ '.u.strip end
589
+ expect result.tainted? do 'あ'.u.taint.strip end
590
+ expect result.untrusted? do 'あ'.u.untrust.strip end if untrust
591
+
592
+ expect 'hëllö'.u do 'hëlLÖ'.u.downcase end
593
+ expect 'hëllö'.u do 'hëllö'.u.downcase end
594
+ expect 'hëllö'.u do 'HËLLÖ'.u.downcase end
595
+ expect "abc\0dëf".u do "ABC\0DËF".u.downcase end
596
+ expect 'σ'.u do 'Σ'.u.downcase end
597
+ expect 'ας'.u do 'ΑΣ'.u.downcase end
598
+ expect 'ασβ'.u do 'ΑΣΒ'.u.downcase end
599
+ expect 'ας '.u do 'ΑΣ '.u.downcase end
600
+ expect 'ας’'.u do 'ΑΣ’'.u.downcase end
601
+ expect '’σ'.u do '’Σ'.u.downcase end
602
+ expect 'i'.u do 'I'.u.downcase('lt') end
603
+ expect "i\xcc\x87\xcc\x80\xcc\x87".u do "I\xcc\x80\xcc\x87".u.downcase('lt') end
604
+ expect "i\xcc\x87\xcc\x87".u do "I\xcc\x87".u.downcase('lt') end
605
+ expect "i\xcc\x87\xcc\x80".u do "I\xcc\x80".u.downcase('lt') end
606
+ expect "j\xcc\x87\xcc\x80".u do "J\xcc\x80".u.downcase('lt') end
607
+ expect "į\xcc\x87\xcc\x80".u do "Į\xcc\x80".u.downcase('lt') end
608
+ expect "i\xcc\x87\xcc\x80".u do 'Ì'.u.downcase('lt') end
609
+ expect "i\xcc\x87\xcc\x81".u do 'Í'.u.downcase('lt') end
610
+ expect "i\xcc\x87\xcc\x83".u do 'Ĩ'.u.downcase('lt') end
611
+ expect 'i'.u do 'İ'.u.downcase('tr') end
612
+ expect 'i'.u do 'İ'.u.downcase('az') end
613
+ expect 'i'.u do 'İ'.u.downcase('tr') end
614
+ expect 'i'.u do 'İ'.u.downcase('az') end
615
+ expect 'ı'.u do 'I'.u.downcase('tr') end
616
+ expect 'ı'.u do 'I'.u.downcase('az') end
617
+ expect result.tainted? do 'A'.u.taint.downcase end
618
+ expect result.untrusted? do 'A'.u.untrust.downcase end if untrust
619
+
620
+ expect "abc\0ss".u do "abc\0ß".u.foldcase end
621
+ expect result.tainted? do 'a'.u.taint.foldcase end
622
+ expect result.untrusted? do 'a'.u.untrust.foldcase end if untrust
623
+
624
+ expect 'Ab Iς Ssσ/Ffi'.u do 'aB iς ßσ/ffi'.u.titlecase end
625
+ expect 'Ijssel Igloo Ijssel'.u do 'ijssEl iglOo IJSSEL'.u.titlecase end
626
+ expect 'IJssel Igloo IJssel'.u do 'ijssEl iglOo IJSSEL'.u.titlecase('nl') end
627
+
628
+ expect 'HËLLÖ'.u do 'hëlLÖ'.u.upcase end
629
+ expect 'HËLLÖ'.u do 'hëllö'.u.upcase end
630
+ expect 'HËLLÖ'.u do 'HËLLÖ'.u.upcase end
631
+ expect "ABC\0DËF".u do "abc\0dëF".u.upcase end
632
+ expect "I\xcc\x87".u do "i\xcc\x87".u.upcase end
633
+ expect 'I'.u do "i\xcc\x87".u.upcase('lt') end
634
+ expect "K\xcc\x87".u do "k\xcc\x87".u.upcase('lt') end
635
+ expect "A\xcc\x81Ι".u do "a\xcd\x85\xcc\x81".u.upcase end
636
+ expect 'I'.u do 'i'.u.upcase end
637
+ expect 'İ'.u do 'i'.u.upcase('tr') end
638
+ expect result.tainted? do 'a'.u.taint.upcase end
639
+ expect result.untrusted? do 'a'.u.untrust.upcase end if untrust
640
+
641
+ expect ''.u do ''.u.mirror end
642
+ expect ')'.u do '('.u.mirror end
643
+ expect ')('.u do '()'.u.mirror end
644
+ expect result.tainted? do ''.u.taint.mirror end
645
+ expect result.untrusted? do ''.u.untrust.mirror end if untrust
646
+
647
+ expect TypeError.new('not a symbol: 1') do ''.u.normalize(1) end
648
+ expect ArgumentError.new('unknown normalization form: :ufc') do ''.u.normalize(:ufc) end
649
+ expect 'Ḋ'.u do "D\xcc\x87".u.normalize(:nfc) end
650
+ expect result.tainted? do ''.u.taint.normalize end
651
+ expect result.untrusted? do ''.u.untrust.normalize end if untrust
652
+
653
+ expect ''.u do ''.u.reverse end
654
+ expect 'a'.u do 'a'.u.reverse end
655
+ expect 'ateb'.u do 'beta'.u.reverse end
656
+ expect 'madamImadam'.u do 'madamImadam'.u.reverse end
657
+ expect "alpha\0beta".u do "ateb\0ahpla".u.reverse end
658
+ expect result.tainted? do 'a'.u.taint.reverse end
659
+ expect result.untrusted? do 'a'.u.untrust.reverse end if untrust
660
+
661
+ expect 'hëllö'.u do 'hëllö'.u.center(4) end
662
+ expect ' hëllö '.u do 'hëllö'.u.center(11) end
663
+ expect 'ababaababa'.u do ''.u.center(10, 'ab') end
664
+ expect 'ababaababab'.u do ''.u.center(11, 'ab') end
665
+ expect 'あ3あ'.u do '3'.u.center(5, 'あ') end
666
+ expect ArgumentError.new('zero-width padding') do '3'.u.center(2, '') end
667
+ expect 'あ3あ'.u do '3'.u.center(5, 'あ ') end
668
+ expect 'あ3あ '.u do '3'.u.center(6, 'あ ') end
669
+ expect 'あ 3あ '.u do '3'.u.center(7, 'あ ') end
670
+ expect ArgumentError.new('padding is too wide to complete rounding (2 > 1)') do '3'.u.center(4, 'あ') end
671
+ # TODO Adjust this to LONG_MAX in Ruby
672
+ # expect ArgumentError do ''.u.center(9223372036854775807) end
673
+ expect result.tainted? do 'a'.u.taint.center(1) end
674
+ expect result.untrusted? do 'a'.u.untrust.center(1) end if untrust
675
+ expect result.tainted? do 'a'.u.taint.center(3) end
676
+ expect result.untrusted? do 'a'.u.untrust.center(3) end if untrust
677
+ expect result.not.tainted? do 'a'.u.center(1, ' '.taint) end
678
+ expect result.not.untrusted? do 'a'.u.center(1, ' '.untrust) end if untrust
679
+ expect result.tainted? do 'a'.u.taint.center(3, ' '.taint) end
680
+ expect result.untrusted? do 'a'.u.untrust.center(3, ' '.untrust) end if untrust
681
+
682
+ expect 'hëllö'.u do 'hëllö'.u.ljust(4) end
683
+ expect 'hëllö '.u do 'hëllö'.u.ljust(11) end
684
+ expect 'ababababab'.u do ''.u.ljust(10, 'ab') end
685
+ expect 'abababababa'.u do ''.u.ljust(11, 'ab') end
686
+ expect '3ああ'.u do '3'.u.ljust(5, 'あ') end
687
+ expect ArgumentError.new('zero-width padding') do '3'.u.ljust(2, '') end
688
+ expect ArgumentError.new('padding is too wide to complete rounding (2 > 1)') do '3'.u.ljust(5, 'あ ') end
689
+ expect '3あ あ'.u do '3'.u.ljust(6, 'あ ') end
690
+ expect '3あ あ '.u do '3'.u.ljust(7, 'あ ') end
691
+ expect ArgumentError.new('padding is too wide to complete rounding (2 > 1)') do '3'.u.ljust(4, 'あ') end
692
+ expect result.tainted? do 'a'.u.taint.ljust(1) end
693
+ expect result.untrusted? do 'a'.u.untrust.ljust(1) end if untrust
694
+ expect result.tainted? do 'a'.u.taint.ljust(3) end
695
+ expect result.untrusted? do 'a'.u.untrust.ljust(3) end if untrust
696
+ expect result.not.tainted? do 'a'.u.ljust(1, ' '.taint) end
697
+ expect result.not.untrusted? do 'a'.u.ljust(1, ' '.untrust) end if untrust
698
+ expect result.tainted? do 'a'.u.taint.ljust(3, ' '.taint) end
699
+ expect result.untrusted? do 'a'.u.untrust.ljust(3, ' '.untrust) end if untrust
700
+
701
+ expect 'hëllö'.u do 'hëllö'.u.rjust(4) end
702
+ expect ' hëllö'.u do 'hëllö'.u.rjust(11) end
703
+ expect 'ababababab'.u do ''.u.rjust(10, 'ab') end
704
+ expect 'abababababa'.u do ''.u.rjust(11, 'ab') end
705
+ expect 'ああ3'.u do '3'.u.rjust(5, 'あ') end
706
+ expect ArgumentError.new('zero-width padding') do '3'.u.rjust(2, '') end
707
+ expect ArgumentError.new('padding is too wide to complete rounding (2 > 1)') do '3'.u.rjust(5, 'あ ') end
708
+ expect 'あ あ3'.u do '3'.u.rjust(6, 'あ ') end
709
+ expect 'あ あ 3'.u do '3'.u.rjust(7, 'あ ') end
710
+ expect ArgumentError.new('padding is too wide to complete rounding (2 > 1)') do '3'.u.rjust(4, 'あ') end
711
+ expect result.tainted? do 'a'.u.taint.rjust(1) end
712
+ expect result.untrusted? do 'a'.u.untrust.rjust(1) end if untrust
713
+ expect result.tainted? do 'a'.u.taint.rjust(3) end
714
+ expect result.untrusted? do 'a'.u.untrust.rjust(3) end if untrust
715
+ expect result.not.tainted? do 'a'.u.rjust(1, ' '.taint) end
716
+ expect result.not.untrusted? do 'a'.u.rjust(1, ' '.untrust) end if untrust
717
+ expect result.tainted? do 'a'.u.taint.rjust(3, ' '.taint) end
718
+ expect result.untrusted? do 'a'.u.untrust.rjust(3, ' '.untrust) end if untrust
719
+
720
+ expect 5 do 'hëllö wörld'.u.count('lö') end
721
+ expect 3 do 'hëllö wörld'.u.count('l', 'lö') end
722
+ expect 2 do 'hëllö wörld'.u.count('lö', 'ö') end
723
+ expect 4 do 'hëllö wörld'.u.count('hëllö', '^l') end
724
+ expect 3 do 'hëllö wörld'.u.count('ej-m') end
725
+ expect 0 do 'y'.u.count('a\\-z') end
726
+ expect 5 do 'abcあいう'.u.count('^a') end
727
+ expect 5 do 'abcあいう'.u.count('^あ') end
728
+ expect 2 do 'abcあいう'.u.count('a-z', '^a') end
729
+ expect ArgumentError.new('wrong number of arguments (0 for at least 1)') do 'föö'.u.count end
730
+
731
+ expect 'hë wrd'.u do 'hëllö wörld'.u.delete('lö') end
732
+ expect 'hëö wörd'.u do 'hëllö wörld'.u.delete('l', 'lö') end
733
+ expect 'hëll wrld'.u do 'hëllö wörld'.u.delete('lö', 'ö') end
734
+ expect 'hëll wrld'.u do 'hëllö wörld'.u.delete('aëiöu', '^ë') end
735
+ expect 'hö wörd'.u do 'hëllö wörld'.u.delete('ëj-m') end
736
+ expect 'a'.u do 'aā'.u.delete('ā') end
737
+ expect 'a'.u do 'abcあいう'.u.delete('^a') end
738
+ expect 'bcあいう'.u do 'abcあいう'.u.delete('a') end
739
+ expect 'あ'.u do 'abcあいう'.u.delete('^あ') end
740
+ expect ArgumentError.new('wrong number of arguments (0 for at least 1)') do 'föö'.u.delete end
741
+ expect result.tainted? do 'a'.u.taint.delete('a') end
742
+ expect result.untrusted? do 'a'.u.untrust.delete('a') end if untrust
743
+
744
+ expect 'äbc'.u do 'äääbbbbccc'.u.squeeze end
745
+ expect 'ää bb cc'.u do 'ää bb cc'.u.squeeze(' ') end
746
+ expect 'BxTÿWz'.u do 'BxTÿÿÿWzzz'.u.squeeze('a-zä-ÿ') end
747
+ expect result.tainted? do 'abc'.u.taint.squeeze end
748
+ expect result.untrusted? do 'abc'.u.untrust.squeeze end if untrust
749
+ expect result.not.tainted? do 'abc'.u.squeeze('b'.taint) end
750
+ expect result.not.untrusted? do 'abc'.u.squeeze('b'.untrust) end if untrust
751
+
752
+ expect 'hïppö' do 'hëllö'.u.tr('ël', 'ïp') end
753
+ expect '*ë**ö' do 'hëllö'.u.tr('^aëiöu', '*') end
754
+ expect 'hal' do 'ibm'.u.tr('b-z', 'a-z') end
755
+ expect 'hal' do 'hal'.u.tr('a-z', 'a-z') end
756
+ expect true do a = 'hal'.u; a.tr('a-z', 'a-z').object_id == a.object_id end
757
+ expect result.tainted? do 'abc'.u.taint.tr('a', 'b') end
758
+ expect result.untrusted? do 'abc'.u.untrust.tr('a', 'b') end if untrust
759
+ expect result.not.tainted? do 'abc'.u.tr('a'.taint, 'b') end
760
+ expect result.not.untrusted? do 'abc'.u.tr('a'.untrust, 'b') end if untrust
761
+ expect result.not.tainted? do 'abc'.u.tr('a', 'b'.taint) end
762
+ expect result.not.untrusted? do 'abc'.u.tr('a', 'b'.untrust) end if untrust
763
+
764
+ expect 'hïpö' do 'hëllö'.u.tr_s('ël', 'ïp') end
765
+ expect '*ë*ö' do 'hëllö'.u.tr_s('^aëiöu', '*') end
766
+ expect 'hal' do 'ibm'.u.tr_s('b-z', 'a-z') end
767
+ expect 'hal' do 'hal'.u.tr_s('a-z', 'a-z') end
768
+ expect true do a = 'hal'.u; a.tr_s('a-z', 'a-z').object_id == a.object_id end
769
+ expect result.tainted? do 'abc'.u.taint.tr_s('a', 'b') end
770
+ expect result.untrusted? do 'abc'.u.untrust.tr_s('a', 'b') end if untrust
771
+ expect result.not.tainted? do 'abc'.u.tr_s('a'.taint, 'b') end
772
+ expect result.not.untrusted? do 'abc'.u.tr_s('a'.untrust, 'b') end if untrust
773
+ expect result.not.tainted? do 'abc'.u.tr_s('a', 'b'.taint) end
774
+ expect result.not.untrusted? do 'abc'.u.tr_s('a', 'b'.untrust) end if untrust
775
+
776
+ expect ['hë'.u, 'l'.u, 'lö'.u] do 'hëllö'.u.partition(/l/u) end
777
+ expect ['hë'.u, 'l'.u, 'lö'.u] do 'hëllö'.u.partition('l'.u) end
778
+ expect ['hë'.u, 'l'.u, 'lö'.u] do 'hëllö'.u.partition('l') end
779
+ expect TypeError do 'hëllö'.u.partition(0) end
780
+ expect ['föö'.u, '-'.u, 'bär'.u] do 'föö-bär'.u.partition(stub(:to_str => '-')) end
781
+ expect [true, true, true] do 'abc'.u.taint.partition(/b/).map(&:tainted?) end
782
+ expect [true, true, true] do 'abc'.u.untrust.partition(/b/).map(&:untrusted?) end if untrust
783
+ expect [false, true, false] do 'abc'.u.partition(/b/.taint).map(&:tainted?) end
784
+ expect [false, true, false] do 'abc'.u.partition(/b/.untrust).map(&:untrusted?) end if untrust
785
+ expect [true, true, true] do 'abc'.u.taint.partition(/b/.taint).map(&:tainted?) end
786
+ expect [true, true, true] do 'abc'.u.untrust.partition(/b/.untrust).map(&:untrusted?) end if untrust
787
+ expect [true, false, true] do 'abc'.u.taint.partition('b').map(&:tainted?) end
788
+ expect [true, false, true] do 'abc'.u.untrust.partition('b').map(&:untrusted?) end if untrust
789
+ expect [false, true, false] do 'abc'.u.partition('b'.taint).map(&:tainted?) end
790
+ expect [false, true, false] do 'abc'.u.partition('b'.untrust).map(&:untrusted?) end if untrust
791
+ expect [true, true, true] do 'abc'.u.taint.partition('b'.taint).map(&:tainted?) end
792
+ expect [true, true, true] do 'abc'.u.untrust.partition('b'.untrust).map(&:untrusted?) end if untrust
793
+
794
+ expect ['hël'.u, 'l'.u, 'ö'.u] do 'hëllö'.u.rpartition(/l/u) end
795
+ expect ['hël'.u, 'l'.u, 'ö'.u] do 'hëllö'.u.rpartition('l'.u) end
796
+ expect ['hël'.u, 'l'.u, 'ö'.u] do 'hëllö'.u.rpartition('l') end
797
+ expect TypeError do 'hëllö'.u.rpartition(0) end
798
+ expect ['föö'.u, '-'.u, 'bär'.u] do 'föö-bär'.u.rpartition(stub(:to_str => '-')) end
799
+ expect [true, true, true] do 'abc'.u.taint.rpartition(/b/).map(&:tainted?) end
800
+ expect [true, true, true] do 'abc'.u.untrust.rpartition(/b/).map(&:untrusted?) end if untrust
801
+ expect [false, true, false] do 'abc'.u.rpartition(/b/.taint).map(&:tainted?) end
802
+ expect [false, true, false] do 'abc'.u.rpartition(/b/.untrust).map(&:untrusted?) end if untrust
803
+ expect [true, true, true] do 'abc'.u.taint.rpartition(/b/.taint).map(&:tainted?) end
804
+ expect [true, true, true] do 'abc'.u.untrust.rpartition(/b/.untrust).map(&:untrusted?) end if untrust
805
+ expect [true, false, true] do 'abc'.u.taint.rpartition('b').map(&:tainted?) end
806
+ expect [true, false, true] do 'abc'.u.untrust.rpartition('b').map(&:untrusted?) end if untrust
807
+ expect [false, true, false] do 'abc'.u.rpartition('b'.taint).map(&:tainted?) end
808
+ expect [false, true, false] do 'abc'.u.rpartition('b'.untrust).map(&:untrusted?) end if untrust
809
+ expect [true, true, true] do 'abc'.u.taint.rpartition('b'.taint).map(&:tainted?) end
810
+ expect [true, true, true] do 'abc'.u.untrust.rpartition('b'.untrust).map(&:untrusted?) end if untrust
811
+
812
+ expect ['crüel'.u, 'wörld'.u] do 'crüel wörld'.u.scan(word_regex) end
813
+ expect ['crü'.u, 'el '.u, 'wör'.u] do 'crüel wörld'.u.scan(/.../u) end
814
+ expect [['crü'.u], ['el '.u], ['wör'.u]] do 'crüel wörld'.u.scan(/(...)/u) end
815
+ expect ['crüel'.u, 'wörld'.u] do 'crüel wörld'.u.to_enum(:scan, word_regex).to_a end
816
+ expect ['crü'.u, 'el '.u, 'wör'.u] do 'crüel wörld'.u.to_enum(:scan, /.../u).to_a end
817
+ expect [['crü'.u], ['el '.u], ['wör'.u]] do 'crüel wörld'.u.to_enum(:scan, /(...)/u).to_a end
818
+ expect [''.u, ''.u, ''.u, ''.u, ''.u, ''.u, ''.u, ''.u, ''.u, ''.u, ''.u, ''.u] do 'crüel wörld'.u.scan(//u) end
819
+ expect [true, true] do 'crüel wörld'.u.taint.scan(word_regex).map(&:tainted?) end
820
+ expect [true, true] do 'crüel wörld'.u.untrust.scan(word_regex).map(&:untrusted?) end if untrust
821
+ expect [true, true] do 'crüel wörld'.u.scan(word_regex.dup.taint).map(&:tainted?) end
822
+ expect [true, true] do 'crüel wörld'.u.scan(word_regex.dup.untrust).map(&:untrusted?) end if untrust
823
+ expect [true] do 'crüel wörld'.u.taint.scan(' ').map(&:tainted?) end
824
+ expect [true] do 'crüel wörld'.u.untrust.scan(' ').map(&:untrusted?) end if untrust
825
+ expect [false] do 'crüel wörld'.u.scan(' '.taint).map(&:tainted?) end
826
+ expect [false] do 'crüel wörld'.u.scan(' '.untrust).map(&:untrusted?) end if untrust
827
+ expect [] do ''.u.split(''.u, 1) end
828
+ expect ['abc'.u] do 'abc'.u.split(''.u, 1) end
829
+ expect [true, true] do 'abc'.u.taint.split(/b/).map(&:tainted?) end
830
+ expect [true, true] do 'abc'.u.untrust.split(/b/).map(&:untrusted?) end if untrust
831
+ expect [false, false] do 'abc'.u.split(/b/.taint).map(&:tainted?) end
832
+ expect [false, false] do 'abc'.u.split(/b/.untrust).map(&:untrusted?) end if untrust
833
+ expect [true, true] do 'abc'.u.taint.split('b').map(&:tainted?) end
834
+ expect [true, true] do 'abc'.u.untrust.split('b').map(&:untrusted?) end if untrust
835
+ expect [false, false] do 'abc'.u.split('b'.taint).map(&:tainted?) end
836
+ expect [false, false] do 'abc'.u.split('b'.untrust).map(&:untrusted?) end if untrust
837
+ expect [' ä '.u, ' b '.u, ' c '.u] do ' ä | b | c '.u.split('|'.u) end
838
+ expect ['ä|b|c'.u] do 'ä|b|c'.u.split('|'.u, 1) end
839
+ expect ['ä'.u, 'b|c'.u] do 'ä|b|c'.u.split('|'.u, 2) end
840
+ expect ['ä'.u, 'b'.u, 'c'.u] do 'ä|b|c'.u.split('|'.u, 3) end
841
+ expect ['ä'.u, 'b'.u, 'c'.u, ''.u] do 'ä|b|c|'.u.split('|'.u, -1) end
842
+ expect ['ä'.u, 'b'.u, 'c'.u, ''.u, ''.u] do 'ä|b|c||'.u.split('|'.u, -1) end
843
+ expect ['ä'.u, ''.u, 'b'.u, 'c'.u] do 'ä||b|c|'.u.split('|'.u) end
844
+ expect ['ä'.u, ''.u, 'b'.u, 'c'.u, ''.u] do 'ä||b|c|'.u.split('|'.u, -1) end
845
+ expect [] do with_global(:$;, nil){ ' '.u.split } end
846
+ expect [''.u] do with_global(:$;, nil){ ' '.u.split(nil, -1) } end
847
+ expect ['ä'.u, 'b c'.u] do with_global(:$;, nil){ 'ä b c'.u.split(nil, 2) } end
848
+ expect ['ä'.u, 'b'.u, 'c'.u] do with_global(:$;, nil){ " ä b\t c ".u.split } end
849
+ expect ['ä'.u, "b\t c ".u] do with_global(:$;, nil){ " ä b\t c ".u.split(nil, 2) } end
850
+ expect ['ä'.u, 'b'.u, 'c'.u] do with_global(:$;, nil){ " ä b\t c".split } end
851
+ expect ['ä'.u, 'b'.u, 'c'.u] do with_global(:$;, nil){ " ä b\t c".u.split(' ') } end
852
+ expect [] do ''.split(//u, 1) end
853
+ expect ['ä'.u, 'b'.u, 'c'.u] do 'äXXbXXcXX'.u.split(/X./u) end
854
+ expect ['ä'.u, 'b'.u, 'c'.u] do 'äbc'.u.split(//u) end
855
+ expect ['b'.u, 'c'.u] do 'bäc'.u.split(/ä?/u) end
856
+
857
+ expect 'bbc'.u do 'abc'.u.gsub('a', 'b') end
858
+ expect 'h*ll*'.u do 'hello'.u.gsub(/[aeiou]/u, '*'.u) end
859
+ expect 'h*ll*'.u do 'hëllö'.u.gsub(/[äëïöü]/u, '*'.u) end
860
+ expect 'h<ë>ll<ö>'.u do 'hëllö'.u.gsub(/([äëïöü])/u, '<\\1>'.u) end
861
+ expect 'h<ë>ll<ö>'.u do 'hëllö'.u.gsub(/([ëö])/u, 'ë'.u => '<ë>'.u, 'ö'.u => '<ö>'.u) end
862
+ expect 'h ë l l ö '.u do 'hëllö'.u.gsub(/./u){ |s| s[0].to_s + ' ' } end
863
+ expect 'HËLL-ö'.u do 'hëllö'.u.gsub(/(hëll)(.)/u){ |s| $1.u.upcase + '-'.u + $2.u } end
864
+ expect ArgumentError do 'hëllö'.gsub end
865
+ expect result.tainted? do 'a'.u.taint.gsub(/a/, 'b') end
866
+ expect result.untrusted? do 'a'.u.untrust.gsub(/a/, 'b') end if untrust
867
+ expect result.not.tainted? do 'a'.u.gsub(/a/.taint, 'b') end
868
+ expect result.not.untrusted? do 'a'.u.gsub(/a/.untrust, 'b') end if untrust
869
+ expect result.tainted? do 'a'.u.gsub(/a/, 'b'.taint) end
870
+ expect result.untrusted? do 'a'.u.gsub(/a/, 'b'.untrust) end if untrust
871
+ expect result.tainted? do 'a'.u.gsub(/a/, {'a'.u => 'b'}.taint) end
872
+ expect result.not.untrusted? do 'a'.u.gsub(/a/, {'a'.u => 'b'}.untrust) end if untrust
873
+ expect result.tainted? do 'a'.u.gsub(/a/, {'a'.u => 'b'.taint}) end
874
+ expect result.untrusted? do 'a'.u.gsub(/a/, {'a'.u => 'b'.untrust}) end if untrust
875
+ expect result.tainted? do 'a'.u.gsub(/a/, Hash.new{ 'b'.taint }) end
876
+ expect result.untrusted? do 'a'.u.gsub(/a/, Hash.new{ 'b'.untrust }) end if untrust
877
+ expect result.tainted? do 'a'.u.gsub(/a/){ 'b'.taint } end
878
+ expect result.untrusted? do 'a'.u.gsub(/a/){ 'b'.untrust } end if untrust
879
+
880
+ expect 'bbc'.u do 'abc'.u.sub('a', 'b') end
881
+ expect 'h*llo'.u do 'hello'.u.sub(/[aeiou]/u, '*'.u) end
882
+ expect 'h*llö'.u do 'hëllö'.u.sub(/[äëïöü]/u, '*'.u) end
883
+ expect 'h<ë>llö'.u do 'hëllö'.u.sub(/([äëïöü])/u, '<\\1>'.u) end
884
+ expect 'h<ë>llö'.u do 'hëllö'.u.sub(/([ëö])/u, 'ë'.u => '<ë>'.u, 'ö'.u => '<ö>'.u) end
885
+ expect 'h ëllö'.u do 'hëllö'.u.sub(/./u){ |s| s[0].to_s + ' ' } end
886
+ expect 'HËLL-ö'.u do 'hëllö'.u.sub(/(hëll)(.)/u){ |s| $1.u.upcase + '-'.u + $2.u } end
887
+ expect ArgumentError do 'hëllö'.sub end
888
+ expect result.tainted? do 'a'.u.taint.sub(/a/, 'b') end
889
+ expect result.untrusted? do 'a'.u.untrust.sub(/a/, 'b') end if untrust
890
+ expect result.not.tainted? do 'a'.u.sub(/a/.taint, 'b') end
891
+ expect result.not.untrusted? do 'a'.u.sub(/a/.untrust, 'b') end if untrust
892
+ expect result.tainted? do 'a'.u.sub(/a/, 'b'.taint) end
893
+ expect result.untrusted? do 'a'.u.sub(/a/, 'b'.untrust) end if untrust
894
+ expect result.tainted? do 'a'.u.sub(/a/, {'a'.u => 'b'}.taint) end
895
+ expect result.untrusted? do 'a'.u.sub(/a/, {'a'.u => 'b'}.untrust) end if untrust
896
+ expect result.tainted? do 'a'.u.sub(/a/, {'a'.u => 'b'.taint}) end
897
+ expect result.untrusted? do 'a'.u.sub(/a/, {'a'.u => 'b'.untrust}) end if untrust
898
+ expect result.tainted? do 'a'.u.sub(/a/, Hash.new{ 'b'.taint }) end
899
+ expect result.untrusted? do 'a'.u.sub(/a/, Hash.new{ 'b'.untrust }) end if untrust
900
+ expect result.tainted? do 'a'.u.sub(/a/){ 'b'.taint } end
901
+ expect result.untrusted? do 'a'.u.sub(/a/){ 'b'.untrust } end if untrust
902
+
903
+ expect 'hëll'.u do 'hëll'.u + ''.u end
904
+ expect 'ö'.u do ''.u + 'ö'.u end
905
+ expect 'hëllö'.u do 'hëll'.u + 'ö'.u end
906
+ expect result.tainted? do ''.u.taint + ''.u end
907
+ expect result.tainted? do ''.u + ''.u.taint end
908
+ expect result.not.untrusted? do ''.u.untrust + ''.u end if untrust
909
+ expect result.not.untrusted? do ''.u + ''.u.untrust end if untrust
910
+
911
+ expect ArgumentError do '*'.u * -1 end
912
+ expect ''.u do ''.u * 10 end
913
+ expect '**********'.u do '*'.u * 10 end
914
+ # TODO Test LONG_MAX.
915
+ expect result.tainted? do ''.u.taint * 10 end
916
+ expect result.untrusted? do ''.u.untrust * 10 end if untrust
917
+
918
+ expect 'äbc'.u do 'äbc'.u % [] end
919
+
920
+ expect ArgumentError.new('invalid flag ‘ ’ given to directive ‘%’') do '% %'.u % [] end
921
+ expect ArgumentError.new('invalid flags “ #” given to directive ‘%’') do '% #%'.u % [] end
922
+ expect ArgumentError.new('invalid flags “ #+-0” given to directive ‘%’') do '% #+-0%'.u % [] end
923
+ expect ArgumentError.new('directive does not take an argument: %') do '%1$%'.u % [1] end
924
+ expect '%'.u do '%%'.u % [] end
925
+ expect 'ä%c'.u do 'ä%%c'.u % [] end
926
+
927
+ expect "%\nb".u do "%\nb".u % [] end
928
+ expect "%\0b".u do "%\0b".u % [] end
929
+ expect "%\0%".u do "%\0%".u % [] end
930
+ expect ArgumentError.new('directive does not allow specifying a width: %') do "%12\nb".u % [] end
931
+ expect 'b%'.u do "b%".u % [] end
932
+ expect ArgumentError.new('directive missing after absolute argument number') do "b%12".u % [] end
933
+ expect ArgumentError.new('directive missing after flags') do "b%#".u % [] end
934
+ expect ArgumentError.new('directive missing after absolute argument number') do "b%1$".u % [] end
935
+ expect ArgumentError.new('directive missing after argument name') do "b%<a>".u % [] end
936
+
937
+ expect ArgumentError.new('invalid flag ‘ ’ given to directive ‘c’') do '% c'.u % 0x00e4 end
938
+ expect ArgumentError.new('directive does not allow specifying a precision: c') do '%.1c'.u % [0x00e4] end
939
+ expect ArgumentError.new('wrong number of arguments (0 for at least 1)') do '%cbc'.u % [] end
940
+ expect 'äbc'.u do '%cbc'.u % 0x00e4 end
941
+ expect ' äbc'.u do '%2cbc'.u % 0x00e4 end
942
+ expect 'ä bc'.u do '%-2cbc'.u % 0x00e4 end
943
+ expect ArgumentError.new('wrong number of arguments (1 for at least 2)') do '%*cbc'.u % 0x00e4 end
944
+ expect ' äbc'.u do '%*cbc'.u % [2, 0x00e4] end
945
+ expect ArgumentError.new('cannot use positional argument numbers after absolute argument numbers') do '%*1$cbc'.u % [2, 0x00e4] end
946
+ expect ' äbc'.u do '%2$*1$cbc'.u % [2, 0x00e4] end
947
+ expect 'äbc'.u do '%<a>cbc'.u % { :a => 0x00e4 } end
948
+ expect ' äbc'.u do '%<a>2cbc'.u % { :a => 0x00e4 } end
949
+ expect 'あ'.u do '%c'.u % 0x3042 end
950
+ expect 'あ'.u do '%2c'.u % 0x3042 end
951
+ expect ' あ'.u do '%3c'.u % 0x3042 end
952
+ expect ' ​'.u do '%3c'.u % 0x200b end
953
+ expect ArgumentError.new('%c requires a character') do '%c'.u % "" end
954
+ expect 'ä'.u do '%c'.u % "ä" end
955
+ expect 'ä'.u do '%c'.u % "äbc" end
956
+ expect ArgumentError.new('cannot use absolute argument number 1: relative argument number already used') do '%c%1$c'.u % [0x00e4] end
957
+ expect ArgumentError.new('cannot use absolute argument number 1: named argument already used') do '%<a>c%1$c'.u % { :a => 0x00e4 } end
958
+ expect ArgumentError.new('absolute argument number beyond end of argument list: 1 > 0') do '%1$%'.u % [] end
959
+ expect ArgumentError.new('cannot use named argument “a”: relative argument number already used') do '%c%<a>c'.u % [0x00e4] end
960
+ expect ArgumentError.new('cannot use named argument “a”: absolute argument number already used') do '%1$c%<a>c'.u % [0x00e4] end
961
+ expect ArgumentError.new('one Hash argument required when using named arguments in format') do '%<a>cbc'.u % 0x00e4 end
962
+ expect((defined?(KeyError) ? KeyError : ArgumentError).new('named argument not found: a')){ '%<a>cbc'.u % { :b => 0x00e4 } }
963
+ expect ArgumentError.new('cannot use positional argument numbers after absolute argument numbers') do '%1$c%c'.u % [0x00e4] end
964
+ expect ArgumentError.new('cannot use positional argument numbers after named arguments') do '%<a>c%c'.u % { :a => 0x00e4 } end
965
+ expect ArgumentError.new('wrong number of arguments (0 for at least 1)') do '%c'.u % [] end
966
+
967
+ # TODO Add flag checks?
968
+ expect 'äbc'.u do '%sc'.u % ['äb'.u] end
969
+ expect 'äc'.u do '%.1sc'.u % ['äb'.u] end
970
+ expect ' äbc'.u do '%3sc'.u % ['äb'.u] end
971
+ expect 'äb c'.u do '%-3sc'.u % ['äb'.u] end
972
+ expect ' äc'.u do '%3.1sc'.u % ['äb'.u] end
973
+ expect 'ä c'.u do '%-3.1sc'.u % ['äb'.u] end
974
+ expect 'äbc'.u do '%{a}c'.u % { :a => 'äb'.u } end
975
+ expect 'äb3.3c'.u do '%{a}3.3c'.u % { :a => 'äb'.u } end
976
+ expect 'あ'.u do '%.1s'.u % ['あbc'.u] end
977
+ expect 'あ'.u do '%.2s'.u % ['あbc'.u] end
978
+ expect 'あb'.u do '%.3s'.u % ['あbc'.u] end
979
+ expect 'あbc'.u do '%.4s'.u % ['あbc'.u] end
980
+ expect ' あbc'.u do '%5s'.u % ['あbc'.u] end
981
+
982
+ # TODO Add flag checks?
983
+ expect '"äbc".u'.u do '%p'.u % ['äbc'.u] end
984
+
985
+ expect '123'.u do '%d'.u % 123 end
986
+ expect '123'.u do '%d'.u % 123.to_f end
987
+ expect '123'.u do '%d'.u % '123' end
988
+ expect '123'.u do '%d'.u % '123'.u end
989
+ expect '123'.u do '%d'.u % [stub(:to_int => 123)] end
990
+ expect ArgumentError do '%d'.u % '123.0' end
991
+ expect ArgumentError do '%d'.u % '123.0'.u end
992
+
993
+ expect ' 123'.u do '% d'.u % 123 end
994
+ expect '+123'.u do '%+d'.u % 123 end
995
+ expect '-123'.u do '%d'.u % -123 end
996
+
997
+ expect ' 123'.u do '%6d'.u % 123 end
998
+ expect ' 123'.u do '% 6d'.u % 123 end
999
+ expect ' +123'.u do '%+6d'.u % 123 end
1000
+ expect ' -123'.u do '%6d'.u % -123 end
1001
+
1002
+ expect '000123'.u do '%06d'.u % 123 end
1003
+ expect ' 00123'.u do '% 06d'.u % 123 end
1004
+ expect '+00123'.u do '%+06d'.u % 123 end
1005
+ expect '-00123'.u do '%06d'.u % -123 end
1006
+
1007
+ expect '123 '.u do '%-6d'.u % 123 end
1008
+ expect ' 123 '.u do '%- 6d'.u % 123 end
1009
+ expect '+123 '.u do '%-+6d'.u % 123 end
1010
+ expect '-123 '.u do '%-6d'.u % -123 end
1011
+
1012
+ expect '123 '.u do with_verbose(nil){ '%-06d'.u % 123 } end
1013
+
1014
+ expect '000123'.u do '%.6d'.u % 123 end
1015
+ expect ' 000123'.u do '% .6d'.u % 123 end
1016
+ expect '+000123'.u do '%+.6d'.u % 123 end
1017
+ expect '-000123'.u do '%.6d'.u % -123 end
1018
+
1019
+ expect ' 000123'.u do with_verbose(nil){ '%09.6d'.u % 123 } end
1020
+ expect ' 000123'.u do '%9.6d'.u % 123 end
1021
+ expect ' 000123'.u do '% 9.6d'.u % 123 end
1022
+ expect ' +000123'.u do '%+9.6d'.u % 123 end
1023
+ expect ' -000123'.u do '%9.6d'.u % -123 end
1024
+
1025
+ expect '000123 '.u do '%-9.6d'.u % 123 end
1026
+ expect ' 000123 '.u do '%- 9.6d'.u % 123 end
1027
+ expect '+000123 '.u do '%-+9.6d'.u % 123 end
1028
+ expect '-000123 '.u do '%-9.6d'.u % -123 end
1029
+
1030
+ # TODO Need a lot more tests for Bignum code-paths.
1031
+ expect Bignum do 12345678901234567890 end
1032
+ expect '12345678901234567890'.u do '%d'.u % 12345678901234567890 end
1033
+
1034
+ expect '173'.u do '%o'.u % 123 end
1035
+
1036
+ expect ' 173'.u do '% o'.u % 123 end
1037
+ expect '+173'.u do '%+o'.u % 123 end
1038
+ expect '-173'.u do '%+o'.u % -123 end
1039
+
1040
+ expect ' 173'.u do '%6o'.u % 123 end
1041
+ expect ' 173'.u do '% 6o'.u % 123 end
1042
+ expect ' +173'.u do '%+6o'.u % 123 end
1043
+ expect ' -173'.u do '%+6o'.u % -123 end
1044
+
1045
+ expect '000173'.u do '%06o'.u % 123 end
1046
+ expect ' 00173'.u do '% 06o'.u % 123 end
1047
+ expect '+00173'.u do '%+06o'.u % 123 end
1048
+ expect '-00173'.u do '%+06o'.u % -123 end
1049
+
1050
+ expect '173 '.u do '%-6o'.u % 123 end
1051
+ expect ' 173 '.u do '%- 6o'.u % 123 end
1052
+ expect '+173 '.u do '%-+6o'.u % 123 end
1053
+ expect '-173 '.u do '%-+6o'.u % -123 end
1054
+
1055
+ expect '000173'.u do '%.6o'.u % 123 end
1056
+ expect ' 000173'.u do '% .6o'.u % 123 end
1057
+ expect '+000173'.u do '%+.6o'.u % 123 end
1058
+ expect '-000173'.u do '%+.6o'.u % -123 end
1059
+
1060
+ expect ' 000173'.u do '%9.6o'.u % 123 end
1061
+ expect ' 000173'.u do '% 9.6o'.u % 123 end
1062
+ expect ' +000173'.u do '%+9.6o'.u % 123 end
1063
+ expect ' -000173'.u do '%+9.6o'.u % -123 end
1064
+
1065
+ expect '+173'.u do with_verbose(nil){ '%+ o'.u % 123 } end
1066
+ expect warning('‘o’ directive ignores ‘ ’ flag when ‘+’ flag has been specified') do '%+ o'.u % 123 end
1067
+ expect '-173'.u do with_verbose(nil){ '%+ o'.u % -123 } end
1068
+ expect '0173'.u do '%#o'.u % 123 end
1069
+ expect '..7605'.u do '%o'.u % -123 end
1070
+ expect '..7605'.u do with_verbose(nil){ '%#o'.u % -123 } end
1071
+ expect warning('‘o’ directive ignores ‘#’ flag when given a negative argument') do '%#o'.u % -123 end
1072
+
1073
+ expect ' ..7777605'.u do '%12.9o'.u % -123 end
1074
+ expect ' 000000173'.u do '%#12.9o'.u % 123 end
1075
+ expect ' ..7777605'.u do with_verbose(nil){ '%#12.9o'.u % -123 } end
1076
+
1077
+ expect '0' do '%o'.u % 0 end
1078
+ expect '0' do '%#o'.u % 0 end
1079
+ expect ' 0' do '%3o'.u % 0 end
1080
+ expect ' 0' do '%#3o'.u % 0 end
1081
+ expect '000' do '%03o'.u % 0 end
1082
+ expect '000' do '%#03o'.u % 0 end
1083
+ expect ' 0' do '%6o'.u % 0 end
1084
+ expect ' 0' do '%#6o'.u % 0 end
1085
+ expect ' 000' do '%6.3o'.u % 0 end
1086
+ expect ' 000' do '%#6.3o'.u % 0 end
1087
+ expect ' 000' do with_verbose(nil){ '%06.3o'.u % 0 } end
1088
+ expect ' 000' do with_verbose(nil){ '%#06.3o'.u % 0 } end
1089
+
1090
+ # TODO Need a lot more Bignum tests.
1091
+ expect Bignum do 01255245230635307605322 end
1092
+ expect '1255245230635307605322'.u do '%o'.u % 01255245230635307605322 end
1093
+
1094
+ expect '10e'.u do '%x'.u % 0x10e end
1095
+
1096
+ expect '0x10e'.u do '%#x'.u % 0x10e end
1097
+
1098
+ expect '0'.u do '%#x'.u % 0x0 end
1099
+
1100
+ expect ' 10e'.u do '% x'.u % +0x10e end
1101
+ expect '+10e'.u do '%+x'.u % +0x10e end
1102
+ expect '-10e'.u do '%+x'.u % -0x10e end
1103
+
1104
+ expect ' 0x10e'.u do '%# x'.u % +0x10e end
1105
+ expect '+0x10e'.u do '%#+x'.u % +0x10e end
1106
+ expect '-0x10e'.u do '%#+x'.u % -0x10e end
1107
+
1108
+ expect ' 10e'.u do '%6x'.u % 0x10e end
1109
+ expect ' 10e'.u do '% 6x'.u % 0x10e end
1110
+ expect ' +10e'.u do '%+6x'.u % 0x10e end
1111
+ expect ' -10e'.u do '%+6x'.u % -0x10e end
1112
+
1113
+ expect ' 0x10e'.u do '%#6x'.u % 0x10e end
1114
+ expect ' 0x10e'.u do '%# 6x'.u % 0x10e end
1115
+ expect '+0x10e'.u do '%#+6x'.u % 0x10e end
1116
+ expect '-0x10e'.u do '%#+6x'.u % -0x10e end
1117
+
1118
+ expect '00010e'.u do '%06x'.u % 0x10e end
1119
+ expect ' 0010e'.u do '% 06x'.u % 0x10e end
1120
+ expect '+0010e'.u do '%+06x'.u % 0x10e end
1121
+ expect '-0010e'.u do '%+06x'.u % -0x10e end
1122
+
1123
+ expect '0x010e'.u do '%#06x'.u % 0x10e end
1124
+ expect ' 0x10e'.u do '%# 06x'.u % 0x10e end
1125
+ expect '+0x10e'.u do '%#+06x'.u % 0x10e end
1126
+ expect '-0x10e'.u do '%#+06x'.u % -0x10e end
1127
+
1128
+ expect '10e '.u do '%-6x'.u % 0x10e end
1129
+ expect ' 10e '.u do '%- 6x'.u % 0x10e end
1130
+ expect '+10e '.u do '%-+6x'.u % 0x10e end
1131
+ expect '-10e '.u do '%-+6x'.u % -0x10e end
1132
+
1133
+ expect '0x10e '.u do '%#-6x'.u % 0x10e end
1134
+ expect ' 0x10e'.u do '%#- 6x'.u % 0x10e end
1135
+ expect '+0x10e'.u do '%#-+6x'.u % 0x10e end
1136
+ expect '-0x10e'.u do '%#-+6x'.u % -0x10e end
1137
+
1138
+ expect '00010e'.u do '%.6x'.u % 0x10e end
1139
+ expect ' 00010e'.u do '% .6x'.u % 0x10e end
1140
+ expect '+00010e'.u do '%+.6x'.u % 0x10e end
1141
+ expect '-00010e'.u do '%+.6x'.u % -0x10e end
1142
+
1143
+ expect '0x00010e'.u do '%#.6x'.u % 0x10e end
1144
+ expect ' 0x00010e'.u do '%# .6x'.u % 0x10e end
1145
+ expect '+0x00010e'.u do '%#+.6x'.u % 0x10e end
1146
+ expect '-0x00010e'.u do '%#+.6x'.u % -0x10e end
1147
+
1148
+ expect ' 00010e'.u do '%9.6x'.u % 0x10e end
1149
+ expect ' 00010e'.u do '% 9.6x'.u % 0x10e end
1150
+ expect ' +00010e'.u do '%+9.6x'.u % 0x10e end
1151
+ expect ' -00010e'.u do '%+9.6x'.u % -0x10e end
1152
+
1153
+ expect ' 0x00010e'.u do '%#9.6x'.u % 0x10e end
1154
+ expect ' 0x00010e'.u do '%# 9.6x'.u % 0x10e end
1155
+ expect '+0x00010e'.u do '%#+9.6x'.u % 0x10e end
1156
+ expect '-0x00010e'.u do '%#+9.6x'.u % -0x10e end
1157
+
1158
+ expect '+10e'.u do with_verbose(nil){ '%+ x'.u % 0x10e } end
1159
+ expect warning('‘x’ directive ignores ‘ ’ flag when ‘+’ flag has been specified') do '%+ x'.u % 0x10e end
1160
+ expect '-10e'.u do with_verbose(nil){ '%+ x'.u % -0x10e } end
1161
+ expect '..fef2'.u do '%x'.u % -0x10e end
1162
+ expect '0x..fef2'.u do '%#x'.u % -0x10e end
1163
+ expect ' ..ffffef2'.u do '%12.9x'.u % -0x10e end
1164
+ expect ' 0x00000010e'.u do '%#12.9x'.u % 0x10e end
1165
+ expect ' 0x..ffffef2'.u do '%#12.9x'.u % -0x10e end
1166
+
1167
+ expect '10E'.u do '%X'.u % 0x10e end
1168
+ expect '0X10E'.u do '%#X'.u % 0x10e end
1169
+ expect '-10E'.u do '%+X'.u % -0x10e end
1170
+ expect '-0X10E'.u do '%#+X'.u % -0x10e end
1171
+ expect '..FEF2'.u do '%-X'.u % -0x10e end
1172
+ expect '0X..FEF2'.u do '%#-X'.u % -0x10e end
1173
+
1174
+ expect '101'.u do '%b'.u % 0b101 end
1175
+
1176
+ expect '0b101'.u do '%#b'.u % 0b101 end
1177
+
1178
+ expect '0'.u do '%#b'.u % 0b0 end
1179
+
1180
+ expect ' 101'.u do '% b'.u % +0b101 end
1181
+ expect '+101'.u do '%+b'.u % +0b101 end
1182
+ expect '-101'.u do '%+b'.u % -0b101 end
1183
+
1184
+ expect ' 0b101'.u do '%# b'.u % +0b101 end
1185
+ expect '+0b101'.u do '%#+b'.u % +0b101 end
1186
+ expect '-0b101'.u do '%#+b'.u % -0b101 end
1187
+
1188
+ expect ' 101'.u do '%6b'.u % 0b101 end
1189
+ expect ' 101'.u do '% 6b'.u % 0b101 end
1190
+ expect ' +101'.u do '%+6b'.u % 0b101 end
1191
+ expect ' -101'.u do '%+6b'.u % -0b101 end
1192
+
1193
+ expect ' 0b101'.u do '%#6b'.u % 0b101 end
1194
+ expect ' 0b101'.u do '%# 6b'.u % 0b101 end
1195
+ expect '+0b101'.u do '%#+6b'.u % 0b101 end
1196
+ expect '-0b101'.u do '%#+6b'.u % -0b101 end
1197
+
1198
+ expect '000101'.u do '%06b'.u % 0b101 end
1199
+ expect ' 00101'.u do '% 06b'.u % 0b101 end
1200
+ expect '+00101'.u do '%+06b'.u % 0b101 end
1201
+ expect '-00101'.u do '%+06b'.u % -0b101 end
1202
+
1203
+ expect '0b0101'.u do '%#06b'.u % 0b101 end
1204
+ expect ' 0b101'.u do '%# 06b'.u % 0b101 end
1205
+ expect '+0b101'.u do '%#+06b'.u % 0b101 end
1206
+ expect '-0b101'.u do '%#+06b'.u % -0b101 end
1207
+
1208
+ expect '101 '.u do '%-6b'.u % 0b101 end
1209
+ expect ' 101 '.u do '%- 6b'.u % 0b101 end
1210
+ expect '+101 '.u do '%-+6b'.u % 0b101 end
1211
+ expect '-101 '.u do '%-+6b'.u % -0b101 end
1212
+
1213
+ expect '0b101 '.u do '%#-6b'.u % 0b101 end
1214
+ expect ' 0b101'.u do '%#- 6b'.u % 0b101 end
1215
+ expect '+0b101'.u do '%#-+6b'.u % 0b101 end
1216
+ expect '-0b101'.u do '%#-+6b'.u % -0b101 end
1217
+
1218
+ expect '000101'.u do '%.6b'.u % 0b101 end
1219
+ expect ' 000101'.u do '% .6b'.u % 0b101 end
1220
+ expect '+000101'.u do '%+.6b'.u % 0b101 end
1221
+ expect '-000101'.u do '%+.6b'.u % -0b101 end
1222
+
1223
+ expect '0b000101'.u do '%#.6b'.u % 0b101 end
1224
+ expect ' 0b000101'.u do '%# .6b'.u % 0b101 end
1225
+ expect '+0b000101'.u do '%#+.6b'.u % 0b101 end
1226
+ expect '-0b000101'.u do '%#+.6b'.u % -0b101 end
1227
+
1228
+ expect ' 000101'.u do '%9.6b'.u % 0b101 end
1229
+ expect ' 000101'.u do '% 9.6b'.u % 0b101 end
1230
+ expect ' +000101'.u do '%+9.6b'.u % 0b101 end
1231
+ expect ' -000101'.u do '%+9.6b'.u % -0b101 end
1232
+
1233
+ expect ' 0b000101'.u do '%#9.6b'.u % 0b101 end
1234
+ expect ' 0b000101'.u do '%# 9.6b'.u % 0b101 end
1235
+ expect '+0b000101'.u do '%#+9.6b'.u % 0b101 end
1236
+ expect '-0b000101'.u do '%#+9.6b'.u % -0b101 end
1237
+
1238
+ expect '+101'.u do with_verbose(nil){ '%+ b'.u % 0b101 } end
1239
+ expect warning('‘b’ directive ignores ‘ ’ flag when ‘+’ flag has been specified') do '%+ b'.u % 0b101 end
1240
+ expect '-101'.u do with_verbose(nil){ '%+ b'.u % -0b101 } end
1241
+ expect '..1011'.u do '%b'.u % -0b101 end
1242
+ expect '0b..1011'.u do '%#b'.u % -0b101 end
1243
+ expect ' ..1111011'.u do '%12.9b'.u % -0b101 end
1244
+ expect ' 0b000000101'.u do '%#12.9b'.u % 0b101 end
1245
+ expect ' 0b..1111011'.u do '%#12.9b'.u % -0b101 end
1246
+
1247
+ expect '0B101'.u do '%#B'.u % 0b101 end
1248
+
1249
+ expect 'NaN'.u do '%f'.u % (0.0/0.0) end
1250
+ expect 'NaN'.u do '%-f'.u % (0.0/0.0) end
1251
+ expect '+NaN'.u do '%+f'.u % (0.0/0.0) end
1252
+ expect ' NaN'.u do '% f'.u % (0.0/0.0) end
1253
+
1254
+ expect ' NaN'.u do '%6f'.u % (0.0/0.0) end
1255
+ expect ' +NaN'.u do '%+6f'.u % (0.0/0.0) end
1256
+ expect ' NaN'.u do '% 6f'.u % (0.0/0.0) end
1257
+ expect ' +NaN'.u do with_verbose(nil){ '%+ 6f'.u % (0.0/0.0) } end
1258
+
1259
+ expect ' NaN'.u do '%06f'.u % (0.0/0.0) end
1260
+ expect ' +NaN'.u do '%+06f'.u % (0.0/0.0) end
1261
+ expect ' NaN'.u do '% 06f'.u % (0.0/0.0) end
1262
+ expect ' +NaN'.u do with_verbose(nil){ '%+ 06f'.u % (0.0/0.0) } end
1263
+
1264
+ expect 'NaN '.u do '%-6f'.u % (0.0/0.0) end
1265
+ expect 'NaN '.u do '%-06f'.u % (0.0/0.0) end
1266
+ expect '+NaN '.u do '%-+6f'.u % (0.0/0.0) end
1267
+ expect '+NaN '.u do '%-+06f'.u % (0.0/0.0) end
1268
+ expect ' NaN '.u do '%- 6f'.u % (0.0/0.0) end
1269
+ expect ' NaN '.u do '%- 06f'.u % (0.0/0.0) end
1270
+
1271
+ expect 'Inf'.u do '%f'.u % (1.0/0.0) end
1272
+ expect 'Inf'.u do '%-f'.u % (1.0/0.0) end
1273
+ expect '+Inf'.u do '%+f'.u % (1.0/0.0) end
1274
+ expect '-Inf'.u do '%+f'.u % -(1.0/0.0) end
1275
+ expect ' Inf'.u do '% f'.u % (1.0/0.0) end
1276
+
1277
+ expect ' Inf'.u do '%6f'.u % (1.0/0.0) end
1278
+ expect ' +Inf'.u do '%+6f'.u % (1.0/0.0) end
1279
+ expect ' -Inf'.u do '%+6f'.u % -(1.0/0.0) end
1280
+ expect ' Inf'.u do '% 6f'.u % (1.0/0.0) end
1281
+ expect ' +Inf'.u do with_verbose(nil){ '%+ 6f'.u % (1.0/0.0) } end
1282
+
1283
+ expect ' Inf'.u do '%06f'.u % (1.0/0.0) end
1284
+ expect ' +Inf'.u do '%+06f'.u % (1.0/0.0) end
1285
+ expect ' -Inf'.u do '%+06f'.u % -(1.0/0.0) end
1286
+ expect ' Inf'.u do '% 06f'.u % (1.0/0.0) end
1287
+ expect ' +Inf'.u do with_verbose(nil){ '%+ 06f'.u % (1.0/0.0) } end
1288
+
1289
+ expect 'Inf '.u do '%-6f'.u % (1.0/0.0) end
1290
+ expect 'Inf '.u do '%-06f'.u % (1.0/0.0) end
1291
+ expect '+Inf '.u do '%-+6f'.u % (1.0/0.0) end
1292
+ expect '+Inf '.u do '%-+06f'.u % (1.0/0.0) end
1293
+ expect '-Inf '.u do '%-+6f'.u % -(1.0/0.0) end
1294
+ expect '-Inf '.u do '%-+06f'.u % -(1.0/0.0) end
1295
+ expect ' Inf '.u do '%- 6f'.u % (1.0/0.0) end
1296
+ expect ' Inf '.u do '%- 06f'.u % (1.0/0.0) end
1297
+
1298
+ # TODO Probably sizeof(double)-dependent.
1299
+ expect '179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368'.u do '%.0f'.u % 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368 end
1300
+
1301
+ expect ' -0.'.u do '%#10.0f'.u % -0.5 end
1302
+
1303
+ # NOTE This needs to be fixed.
1304
+ # expect U::String do '%#+-0 .2147483638f'.u % 1 end
1305
+
1306
+ # TODO These two give different results in Ruby 1.8 and Ruby 1.9.
1307
+ # expect '0x2p+1'.u do '%.0a'.u % 3.875 end
1308
+ # expect '-0x2.0p+1'.u do '%.1a'.u % -3.9921875 end
1309
+ expect '0x0p+0'.u do '%a'.u % 0.0 end
1310
+ expect '-0x0p+0'.u do '%a'.u % -0.0 end
1311
+ expect '0x1p+1'.u do '%a'.u % 2.0 end
1312
+ expect '0x1p+0'.u do '%a'.u % 1.0 end
1313
+ expect '0x1p-1'.u do '%a'.u % 0.5 end
1314
+ expect '0x1p+10'.u do '%a'.u % 1024 end
1315
+ # TODO Probably sizeof(double)-dependent.
1316
+ expect '0x1.23456p+789'.u do '%a'.u % 3.704450999893983e+237 end
1317
+ # TODO This is sizeof(double)-dependent.
1318
+ # expect '0x0.0000000000001p-1022'.u do '%a'.u % 4.9e-324 end
1319
+
1320
+ expect ' -0x1p+0'.u do '%10a'.u % -1 end
1321
+ expect ' -0x1.8p+0'.u do '%10a'.u % -1.5 end
1322
+ expect ' -0x1.4p+0'.u do '%10a'.u % -1.25 end
1323
+ expect ' -0x1.2p+0'.u do '%10a'.u % -1.125 end
1324
+ expect ' -0x1.1p+0'.u do '%10a'.u % -1.0625 end
1325
+ expect '-0x1.08p+0'.u do '%10a'.u % -1.03125 end
1326
+
1327
+ expect '-0x0001p+0'.u do '%010a'.u % -1 end
1328
+ expect '-0x01.8p+0'.u do '%010a'.u % -1.5 end
1329
+ expect '-0x01.4p+0'.u do '%010a'.u % -1.25 end
1330
+ expect '-0x01.2p+0'.u do '%010a'.u % -1.125 end
1331
+ expect '-0x01.1p+0'.u do '%010a'.u % -1.0625 end
1332
+ expect '-0x1.08p+0'.u do '%010a'.u % -1.03125 end
1333
+
1334
+ expect '1.000000e+06'.u do '%e' % 1.000000e+06 end
1335
+ expect '1.000000E+06'.u do '%E' % 1.000000E+06 end
1336
+
1337
+ expect '1e+06'.u do '%g' % 1e+06 end
1338
+ expect '1E+06'.u do '%G' % 1E+06 end
1339
+
1340
+ expect result.tainted? do '%s'.u.taint % ['abc'] end
1341
+ expect result.not.untrusted? do '%s'.u.untrust % ['abc'] end if untrust
1342
+ expect result.tainted? do '%s'.u.taint % ['abc'.taint] end
1343
+ expect result.not.untrusted? do '%s'.u.untrust % ['abc'.untrust] end if untrust
1344
+ expect result.not.tainted? do '%c'.u % ['a'.taint] end
1345
+ expect result.not.untrusted? do '%c'.u % ['a'.untrust] end if untrust
1346
+ expect result.tainted? do '%s'.u % ['abc'.taint] end
1347
+ expect result.not.untrusted? do '%s'.u % ['abc'.untrust] end if untrust
1348
+ expect result.tainted? do '%p'.u % ['abc'.taint] end
1349
+ expect result.not.untrusted? do '%p'.u % ['abc'.untrust] end if untrust
1350
+
1351
+ expect '"abc".u'.u do "abc".u.dump end
1352
+ expect '"\u{e4}bc".u'.u do "äbc".u.dump end
1353
+ expect '"\xC3".u'.u do "\xC3".u.dump end
1354
+ expect '"\xF1\x80\x80".u'.u do "\xF1\x80\x80".u.dump end
1355
+ expect '"\"\\\\\n\r\t\f\v\b\a\e".u'.u do "\"\\\n\r\t\f\v\b\a\e".u.dump end
1356
+ expect '"\#$\#@\#{}".u'.u do '#$#@#{}'.u.dump end
1357
+ expect result.tainted? do ''.u.taint.dump end
1358
+ expect result.untrusted? do ''.u.untrust.dump end if untrust
1359
+
1360
+ expect '"abc".u'.u do "abc".u.inspect end
1361
+ expect '"äbc".u'.u do "äbc".u.inspect end
1362
+ expect '"\xC3".u'.u do "\xC3".u.inspect end
1363
+ expect result.not.print? do [0x007F].pack('U').u end
1364
+ expect '"\u007F".u'.u do [0x007F].pack('U').u.inspect end
1365
+ expect result.not.print? do [0x110BD].pack('U').u end
1366
+ expect '"\u{110BD}".u'.u do [0x110BD].pack('U').u.inspect end
1367
+ expect '"\"\\\\\n\r\t\f\v\b\a\e".u'.u do "\"\\\n\r\t\f\v\b\a\e".u.inspect end
1368
+ expect '"#\xC3".u'.u do "#\xC3".u.inspect end
1369
+ expect '"\#$\#@\#{}".u'.u do '#$#@#{}'.u.inspect end
1370
+ expect result.tainted? do ''.u.taint.inspect end
1371
+ expect result.untrusted? do ''.u.untrust.inspect end if untrust
1372
+
1373
+ expect true do 'hëllö'.u.hash == 'hëllö'.u.hash end
1374
+ expect false do 'hëllö'.u.hash == 'hëlLÖ'.u.hash end
1375
+ expect false do 'a'.u.hash == "a\0".u.hash end
1376
+
1377
+ expect 255 do '0xff'.u.hex end
1378
+ expect(-255) do '-0xff'.u.hex end
1379
+ expect 255 do 'ff'.u.hex end
1380
+ expect(-255) do '-ff'.u.hex end
1381
+ expect 0 do '-ralph'.u.hex end
1382
+ expect(-15) do '-fred'.u.hex end
1383
+ expect 15 do 'fred'.u.hex end
1384
+ # TODO Add tests for Unicode digit values.
1385
+
1386
+ # TODO: Add tests for Unicode digit values.
1387
+ expect 255 do '0377'.u.oct end
1388
+ expect 255 do '377'.u.oct end
1389
+ expect(-255) do '-0377'.u.oct end
1390
+ expect(-255) do '-377'.u.oct end
1391
+ expect 0 do '00'.u.oct end
1392
+ expect 24 do '030OO'.u.oct end
1393
+
1394
+ expect 1480 do '1480ft/sec'.u.to_i end
1395
+ expect 0 do 'speed of sound in water @20C = 1480ft/sec'.u.to_i end
1396
+ expect 0 do ' 0'.u.to_i end
1397
+ expect 0 do '+0'.u.to_i end
1398
+ expect 0 do '-0'.u.to_i end
1399
+ expect 0 do '--0'.u.to_i end
1400
+ expect 16 do '0x10'.u.to_i(0) end
1401
+ expect 16 do '0X10'.u.to_i(0) end
1402
+ expect 2 do '0b10'.u.to_i(0) end
1403
+ expect 2 do '0B10'.u.to_i(0) end
1404
+ expect 8 do '0o10'.u.to_i(0) end
1405
+ expect 8 do '0O10'.u.to_i(0) end
1406
+ expect 10 do '0d10'.u.to_i(0) end
1407
+ expect 10 do '0D10'.u.to_i(0) end
1408
+ expect 8 do '010'.u.to_i(0) end
1409
+ expect ArgumentError do '010'.u.to_i(-10) end
1410
+ expect ArgumentError do '0'.u.to_i(1) end
1411
+ expect ArgumentError do '0'.u.to_i(37) end
1412
+ expect 0 do 'z'.u.to_i(10) end
1413
+ expect 35 do 'z'.u.to_i(36) end
1414
+ expect 12 do '1_2'.u.to_i(10) end
1415
+ expect 0x4000_0000 do '1073741824'.u.to_i(10) end
1416
+ expect 0x4000_0000_0000_0000 do '4611686018427387904'.u.to_i(10) end
1417
+ expect 1 do '1__2'.u.to_i(10) end
1418
+ expect 1 do '1_z'.u.to_i(10) end
1419
+ expect 1 do '١'.u.to_i end
1420
+
1421
+ expect String do ''.u.to_str end
1422
+ expect '' do ''.u.to_str end
1423
+ if defined? Encoding
1424
+ expect Encoding::UTF_8 do ''.u.to_str.encoding end
1425
+ expect Encoding::UTF_8 do ''.encode(Encoding::ASCII).u.to_str.encoding end
1426
+ end
1427
+
1428
+ if defined? Encoding
1429
+ expect Encoding::ASCII_8BIT do ''.u.b.encoding end
1430
+ end
1431
+
1432
+ expect :koala do 'koala'.u.to_sym end
1433
+ expect :'köälä' do 'köälä'.u.to_sym end
1434
+
1435
+ expect :koala do 'koala'.u.intern end
1436
+ expect :'köälä' do 'köälä'.u.intern end
1437
+
1438
+ expect ''.u do |o| o.u end
1439
+ end