u 0.5.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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