4 UTF8STRING = __ENCODING__ == "UTF-8"
6 def assert_upto(exp, receiver, *args)
8 receiver.upto(*args) { |v| act << v }
12 assert('String#dump') do
13 assert_equal("\"\\x00\"", "\0".dump)
14 assert_equal("\"foo\"", "foo".dump)
15 assert_equal('"\xe3\x82\x8b"', "る".dump)
16 assert_nothing_raised { ("\1" * 100).dump } # regress #1210
19 assert('String#strip') do
21 assert_equal("abc", s.strip)
22 assert_equal(" abc ", s)
23 assert_equal("", "".strip)
24 assert_equal("", " \t\r\n\f\v".strip)
25 assert_equal("\0a", "\0a\0".strip)
26 assert_equal("abc", "abc".strip)
27 assert_equal("abc", " abc".strip)
28 assert_equal("abc", "abc ".strip)
31 assert('String#lstrip') do
33 assert_equal("abc ", s.lstrip)
34 assert_equal(" abc ", s)
35 assert_equal("", "".lstrip)
36 assert_equal("", " \t\r\n\f\v".lstrip)
37 assert_equal("\0a\0", "\0a\0".lstrip)
38 assert_equal("abc", "abc".lstrip)
39 assert_equal("abc", " abc".lstrip)
40 assert_equal("abc ", "abc ".lstrip)
43 assert('String#rstrip') do
45 assert_equal(" abc", s.rstrip)
46 assert_equal(" abc ", s)
47 assert_equal("", "".rstrip)
48 assert_equal("", " \t\r\n\f\v".rstrip)
49 assert_equal("\0a", "\0a\0".rstrip)
50 assert_equal("abc", "abc".rstrip)
51 assert_equal(" abc", " abc".rstrip)
52 assert_equal("abc", "abc ".rstrip)
55 assert('String#strip!') do
58 assert_equal("abc", s.strip!)
59 assert_equal("abc", s)
61 assert_equal("abc", t)
64 assert('String#lstrip!') do
67 assert_equal("abc ", s.lstrip!)
68 assert_equal("abc ", s)
70 assert_equal("abc ", t)
73 assert('String#rstrip!') do
76 assert_equal(" abc", s.rstrip!)
77 assert_equal(" abc", s)
79 assert_equal(" abc", t)
82 assert('String#swapcase') do
83 assert_equal "hELLO", "Hello".swapcase
84 assert_equal "CyBeR_pUnK11", "cYbEr_PuNk11".swapcase
87 assert('String#swapcase!') do
91 assert_equal s.swapcase, t
94 assert('String#concat') do
95 assert_equal "Hello World!", "Hello " << "World" << 33
96 assert_equal "Hello World!", "Hello ".concat("World").concat(33)
97 assert_raise(TypeError) { "".concat(Object.new) }
100 assert_equal "H«", "H" << 0xab
101 assert_equal "Hは", "H" << 12399
103 assert_equal "H\xab", "H" << 0xab
104 assert_raise(RangeError) { "H" << 12399 }
108 assert('String#casecmp') do
109 assert_equal 1, "abcdef".casecmp("abcde")
110 assert_equal 0, "aBcDeF".casecmp("abcdef")
111 assert_equal(-1, "abcdef".casecmp("abcdefg"))
112 assert_equal 0, "abcdef".casecmp("ABCDEF")
115 assert('String#count') do
117 assert_equal 0, s.count("")
118 assert_equal 1, s.count("a")
119 assert_equal 2, s.count("ab")
120 assert_equal 9, s.count("^c")
121 assert_equal 8, s.count("a-z")
122 assert_equal 4, s.count("a0-9")
125 assert('String#tr') do
126 assert_equal "ABC", "abc".tr('a-z', 'A-Z')
127 assert_equal "hippo", "hello".tr('el', 'ip')
128 assert_equal "Ruby", "Lisp".tr("Lisp", "Ruby")
129 assert_equal "*e**o", "hello".tr('^aeiou', '*')
130 assert_equal "heo", "hello".tr('l', '')
133 assert('String#tr!') do
134 s = "abcdefghijklmnopqR"
135 assert_equal "ab12222hijklmnopqR", s.tr!("cdefg", "12")
136 assert_equal "ab12222hijklmnopqR", s
139 assert('String#tr_s') do
140 assert_equal "hero", "hello".tr_s('l', 'r')
141 assert_equal "h*o", "hello".tr_s('el', '*')
142 assert_equal "hhxo", "hello".tr_s('el', 'hx')
145 assert('String#tr_s!') do
147 assert_equal "hero", s.tr_s!('l', 'r')
148 assert_equal "hero", s
149 assert_nil s.tr_s!('l', 'r')
152 assert('String#squeeze') do
153 assert_equal "yelow mon", "yellow moon".squeeze
154 assert_equal " now is the", " now is the".squeeze(" ")
155 assert_equal "puters shot balls", "putters shoot balls".squeeze("m-z")
158 assert('String#squeeze!') do
160 assert_equal " now is the", s.squeeze!(" ")
161 assert_equal " now is the", s
164 assert('String#delete') do
165 assert_equal "he", "hello".delete("lo")
166 assert_equal "hll", "hello".delete("aeiou")
167 assert_equal "ll", "hello".delete("^l")
168 assert_equal "ho", "hello".delete("ej-m")
171 assert('String#delete!') do
173 assert_equal "he", s.delete!("lo")
175 assert_nil s.delete!("lz")
178 assert('String#start_with?') do
179 assert_true "hello".start_with?("heaven", "hell")
180 assert_true !"hello".start_with?("heaven", "paradise")
181 assert_true !"h".start_with?("heaven", "hell")
182 assert_raise TypeError do "hello".start_with?(true) end
185 assert('String#end_with?') do
186 assert_true "string".end_with?("ing", "mng")
187 assert_true !"string".end_with?("str", "tri")
188 assert_true !"ng".end_with?("ing", "mng")
189 assert_raise TypeError do "hello".end_with?(true) end
192 assert('String#partition') do
193 assert_equal ["a", "x", "axa"], "axaxa".partition("x")
194 assert_equal ["aaaaa", "", ""], "aaaaa".partition("x")
195 assert_equal ["", "", "aaaaa"], "aaaaa".partition("")
196 assert_equal ["", "a", "aaaa"], "aaaaa".partition("a")
197 assert_equal ["aaaa", "b", ""], "aaaab".partition("b")
198 assert_equal ["", "b", "aaaa"], "baaaa".partition("b")
199 assert_equal ["", "", ""], "".partition("a")
202 assert('String#rpartition') do
203 assert_equal ["axa", "x", "a"], "axaxa".rpartition("x")
204 assert_equal ["", "", "aaaaa"], "aaaaa".rpartition("x")
205 assert_equal ["aaaaa", "", ""], "aaaaa".rpartition("")
206 assert_equal ["aaaa", "a", ""], "aaaaa".rpartition("a")
207 assert_equal ["aaaa", "b", ""], "aaaab".rpartition("b")
208 assert_equal ["", "b", "aaaa"], "baaaa".rpartition("b")
209 assert_equal ["", "", ""], "".rpartition("a")
212 assert('String#hex') do
213 assert_equal 16, "10".hex
214 assert_equal 255, "ff".hex
215 assert_equal 16, "0x10".hex
216 assert_equal (-16), "-0x10".hex
217 assert_equal 0, "xyz".hex
218 assert_equal 16, "10z".hex
219 assert_equal 16, "1_0".hex
220 assert_equal 0, "".hex
223 assert('String#oct') do
224 assert_equal 8, "10".oct
225 assert_equal 7, "7".oct
226 assert_equal 0, "8".oct
227 assert_equal 0, "9".oct
228 assert_equal 0, "xyz".oct
229 assert_equal 8, "10z".oct
230 assert_equal 8, "1_0".oct
231 assert_equal 8, "010".oct
232 assert_equal (-8), "-10".oct
235 assert('String#lines') do
236 assert_equal ["Hel\n", "lo\n", "World!"], "Hel\nlo\nWorld!".lines
237 assert_equal ["Hel\n", "lo\n", "World!\n"], "Hel\nlo\nWorld!\n".lines
238 assert_equal ["\n", "\n", "\n"], "\n\n\n".lines
239 assert_equal [], "".lines
242 assert('String#clear') do
245 assert_equal("", s.clear)
248 # not embed string and not shared string
251 assert_equal("", s.clear)
257 a = s[10, 90] # create shared string
258 assert_equal("", s.clear) # clear
259 assert_equal("", s) # s is cleared
260 assert_not_equal("", a) # a should not be affected
263 assert('String#slice!') do
266 assert_equal "A", a.slice!(0)
267 assert_equal "AooBar", b
270 assert_equal "r", a.slice!(-1)
271 assert_equal "FooBa", a
274 assert_nil a.slice!(6)
275 assert_nil a.slice!(-7)
276 assert_equal "FooBar", a
279 assert_equal "Foo", a.slice!(0, 3)
280 assert_equal "Bar", a
283 assert_equal "Bar", a.slice!(-3, 3)
284 assert_equal "Foo", a
287 assert_equal "", a.slice!(6, 2)
288 assert_equal "FooBar", a
291 assert_nil a.slice!(-7,10)
292 assert_equal "FooBar", a
295 assert_equal "Foo", a.slice!(0..2)
296 assert_equal "Bar", a
299 assert_equal "Bar", a.slice!(-3..-1)
300 assert_equal "Foo", a
303 assert_equal "", a.slice!(6..2)
304 assert_equal "FooBar", a
307 assert_nil a.slice!(-10..-7)
308 assert_equal "FooBar", a
311 assert_equal "Foo", a.slice!("Foo")
312 assert_equal "Bar", a
315 assert_nil a.slice!("xyzzy")
316 assert_equal "FooBar", a
318 assert_raise(ArgumentError) { "foo".slice! }
321 assert('String#succ') do
322 assert_equal "", "".succ
323 assert_equal "1", "0".succ
324 assert_equal "10", "9".succ
325 assert_equal "01", "00".succ
326 assert_equal "a1", "a0".succ
327 assert_equal "A1", "A0".succ
328 assert_equal "10", "09".succ
329 assert_equal "b0", "a9".succ
330 assert_equal "B0", "A9".succ
332 assert_equal "b", "a".succ
333 assert_equal "aa", "z".succ
334 assert_equal "ab", "aa".succ
335 assert_equal "Ab", "Aa".succ
336 assert_equal "0b", "0a".succ
337 assert_equal "ba", "az".succ
338 assert_equal "Ba", "Az".succ
339 assert_equal "1a", "0z".succ
341 assert_equal "B", "A".succ
342 assert_equal "AA", "Z".succ
343 assert_equal "AB", "AA".succ
344 assert_equal "aB", "aA".succ
345 assert_equal "0B", "0A".succ
346 assert_equal "BA", "AZ".succ
347 assert_equal "bA", "aZ".succ
348 assert_equal "1A", "0Z".succ
350 assert_equal ".", "-".succ
351 assert_equal "\x01\x00", "\xff".succ
352 assert_equal "-b", "-a".succ
353 assert_equal "-aa", "-z".succ
354 assert_equal "-a-b-", "-a-a-".succ
355 assert_equal "-b-", "-a-".succ
356 assert_equal "-aa-", "-z-".succ
357 assert_equal "あb", "あa".succ
358 assert_equal "あba", "あaz".succ
416 assert_equal "\x01\x00", a
420 assert_equal "-aa", a
422 assert_equal "-a-b-", a
424 assert_equal "-b-", a
426 assert_equal "-aa-", a
430 assert_equal "あba", a
433 assert('String#next') do
434 assert_equal "01", "00".next
440 assert('String#insert') do
441 assert_equal "Xabcd", "abcd".insert(0, 'X')
442 assert_equal "abcXd", "abcd".insert(3, 'X')
443 assert_equal "abcdX", "abcd".insert(4, 'X')
444 assert_equal "abXcd", "abcd".insert(-3, 'X')
445 assert_equal "abcdX", "abcd".insert(-1, 'X')
446 assert_raise(IndexError) { "abcd".insert(5, 'X') }
447 assert_raise(IndexError) { "abcd".insert(-6, 'X') }
451 assert_equal "Xabcd", a
454 assert('String#prepend') do
456 assert_equal "hello world", a.prepend("hello ")
457 assert_equal "hello world", a
460 assert('String#ljust') do
461 assert_equal "hello", "hello".ljust(4)
462 assert_equal "hello ", "hello".ljust(20)
463 assert_equal 20, "hello".ljust(20).length
464 assert_equal "hello123412341234123", "hello".ljust(20, '1234')
465 assert_equal "hello", "hello".ljust(-3)
468 assert('String#rjust') do
469 assert_equal "hello", "hello".rjust(4)
470 assert_equal " hello", "hello".rjust(20)
471 assert_equal 20, "hello".rjust(20).length
472 assert_equal "123412341234123hello", "hello".rjust(20, '1234')
473 assert_equal "hello", "hello".rjust(-3)
476 assert('String#center') do
477 assert_equal "hello", "hello".center(4)
478 assert_equal " hello ", "hello".center(20)
479 assert_equal 20, "hello".center(20).length
480 assert_equal "1231231hello12312312", "hello".center(20, '123')
481 assert_equal "hello", "hello".center(-3)
485 assert('String#ljust with UTF8') do
486 assert_equal "helloん ", "helloん".ljust(20)
487 assert_equal "helloó ", "helloó".ljust(34)
488 assert_equal 34, "helloó".ljust(34).length
489 assert_equal "helloんんんんんんんんんんんんんん", "hello".ljust(19, 'ん')
490 assert_equal "helloんんんんんんんんんんんんんんん", "hello".ljust(20, 'ん')
493 assert('String#rjust with UTF8') do
494 assert_equal " helloん", "helloん".rjust(20)
495 assert_equal " helloó", "helloó".rjust(34)
496 # assert_equal 34, "helloó".rjust(34).length
497 assert_equal "んんんんんんんんんんんんんんhello", "hello".rjust(19, 'ん')
498 assert_equal "んんんんんんんんんんんんんんんhello", "hello".rjust(20, 'ん')
501 assert('UTF8 byte counting') do
503 ret[-6..-1] = "helloó"
504 assert_equal 34, ret.length
508 assert('String#ljust should not change string') do
511 assert_equal "hello", a
514 assert('String#rjust should not change string') do
517 assert_equal "hello", a
520 assert('String#ljust should raise on zero width padding') do
521 assert_raise(ArgumentError) { "foo".ljust(10, '') }
524 assert('String#rjust should raise on zero width padding') do
525 assert_raise(ArgumentError) { "foo".rjust(10, '') }
528 assert('String#upto') do
529 assert_upto %w(a8 a9 b0 b1 b2 b3 b4 b5 b6), "a8", "b6"
530 assert_upto ["9", "10", "11"], "9", "11"
531 assert_upto [], "25", "5"
532 assert_upto ["07", "08", "09", "10", "11"], "07", "11"
533 assert_upto ["9", ":", ";", "<", "=", ">", "?", "@", "A"], "9", "A"
536 assert_upto %w(あ ぃ い ぅ う ぇ え ぉ お), "あ", "お"
542 assert_equal("aa", a.upto("zz") {|s|
543 assert_equal(start, s)
547 assert_equal(676, count)
552 assert_equal("a", a.upto("a") {|s|
553 assert_equal(start, s)
557 assert_equal(1, count)
562 assert_equal("a", a.upto("b", true) {|s|
563 assert_equal(start, s)
567 assert_equal(1, count)
572 assert_equal("0", a.upto("0") {|s|
573 assert_equal(start, s)
577 assert_equal(1, count)
582 assert_equal("0", a.upto("-1") {|s|
583 assert_equal(start, s)
587 assert_equal(0, count)
592 assert_equal("-1", a.upto("-2") {|s|
593 assert_equal(start, s)
597 assert_equal(2, count)
599 assert_raise(TypeError) { "a".upto(:c) {} }
602 assert('String#ord') do
603 got = "hello!".split('').map {|x| x.ord}
604 expect = [104, 101, 108, 108, 111, 33]
609 assert_equal expect, got
612 assert('String#ord(UTF-8)') do
613 got = "こんにちは世界!".split('').map {|x| x.ord}
614 expect = [0x3053,0x3093,0x306b,0x3061,0x306f,0x4e16,0x754c,0x21]
615 assert_equal expect, got
618 assert('String#chr') do
619 assert_equal "a", "abcde".chr
620 assert_equal "h", "hello!".chr
621 assert_equal "", "".chr
624 assert('String#chr(UTF-8)') do
625 assert_equal "こ", "こんにちは世界!".chr
628 assert('String#chars') do
629 expect = ["h", "e", "l", "l", "o", "!"]
630 assert_equal expect, "hello!".chars
632 "hello!".chars do |x|
635 assert_equal "hello!", s
638 assert('String#chars(UTF-8)') do
639 expect = ['こ', 'ん', 'に', 'ち', 'は', '世', '界', '!']
640 assert_equal expect, "こんにちは世界!".chars
642 "こんにちは世界!".chars do |x|
645 assert_equal "こんにちは世界!", s
648 assert('String#each_char') do
650 "hello!".each_char do |x|
653 assert_equal ["h", "e", "l", "l", "o", "!"], chars
656 assert('String#each_char(UTF-8)') do
658 "こんにちは世界!".each_char do |x|
661 assert_equal ["こ", "ん", "に", "ち", "は", "世", "界", "!"], chars
664 assert('String#codepoints') do
665 expect = [104, 101, 108, 108, 111, 33]
666 assert_equal expect, "hello!".codepoints
668 "hello!".codepoints do |x|
671 assert_equal expect, cp
674 assert('String#codepoints(UTF-8)') do
675 expect = [12371, 12435, 12395, 12385, 12399, 19990, 30028, 33]
676 assert_equal expect, "こんにちは世界!".codepoints
678 "こんにちは世界!".codepoints do |x|
681 assert_equal expect, cp
684 assert('String#each_codepoint') do
685 expect = [104, 101, 108, 108, 111, 33]
687 "hello!".each_codepoint do |x|
690 assert_equal expect, cp
693 assert('String#each_codepoint(UTF-8)') do
694 expect = [12371, 12435, 12395, 12385, 12399, 19990, 30028, 33]
696 "こんにちは世界!".each_codepoint do |x|
699 assert_equal expect, cp
702 assert('String#delete_prefix') do
703 assert_equal "llo", "hello".delete_prefix("he")
704 assert_equal "hello", "hello".delete_prefix("llo")
705 assert_equal "llo", "hello".delete_prefix!("he")
706 assert_nil "hello".delete_prefix!("llo")
709 assert('String#delete_suffix') do
710 assert_equal "he", "hello".delete_suffix("llo")
711 assert_equal "hello", "hello".delete_suffix("he")
712 assert_equal "he", "hello".delete_suffix!("llo")
713 assert_nil "hello".delete_suffix!("he")
716 assert('String#+@') do
718 assert_false(a.frozen?)
720 assert_false(a.frozen?)
723 assert('String#-@') do
725 assert_true(a.frozen?)
727 assert_true(a.frozen?)