5 UTF8STRING = ("\343\201\202".size == 1)
7 assert('String', '15.2.10') do
8 assert_equal Class, String.class
11 assert('String#<=>', '15.2.10.5.1') do
13 b = '' <=> 'not empty'
14 c = 'not empty' <=> ''
23 assert_nil 'a' <=> 1024
26 assert('String#==', '15.2.10.5.2') do
27 assert_equal 'abc', 'abc'
28 assert_not_equal 'abc', 'cba'
31 # 'String#=~', '15.2.10.5.3' will be tested in mrbgems.
33 assert('String#+', '15.2.10.5.4') do
34 assert_equal 'ab', 'a' + 'b'
37 assert('String#*', '15.2.10.5.5') do
38 assert_equal 'aaaaa', 'a' * 5
39 assert_equal '', 'a' * 0
40 assert_raise(ArgumentError) do
45 assert('String#[]', '15.2.10.5.6') do
61 # It will be tested in mrbgems.
76 # assert_equal 'bc', e1
77 # assert_equal 'bc', a3
80 # assert_raise(TypeError) do
85 assert('String#[](UTF-8)', '15.2.10.5.6') do
86 assert_equal "ち", "こんにちは世界"[3]
87 assert_equal nil, "こんにちは世界"[20]
88 assert_equal "世", "こんにちは世界"[-2]
89 assert_equal "世界", "こんにちは世界"[-2..-1]
90 assert_equal "んに", "こんにちは世界"[1,2]
91 assert_equal "世", "こんにちは世界"["世"]
94 assert('String#[] with Range') do
104 j1 = 'abcdefghijklmnopqrstuvwxyz'[1..3]
114 j2 = 'abcdefghijklmnopqrstuvwxyz'[1...3]
118 assert_equal 'bc', c1
119 assert_equal 'bc', d1
120 assert_equal 'bc', e1
121 assert_equal 'ab', f1
122 assert_equal 'bc', g1
125 assert_equal 'bcd', j1
129 assert_equal 'bc', d2
130 assert_equal 'bc', e2
132 assert_equal 'bc', g2
135 assert_equal 'bc', j2
138 assert('String#[]=') do
139 # length of args is 1
142 assert_equal 'Xbc', a
146 assert_equal 'abX', b
149 assert_raise(IndexError) do
154 assert_raise(IndexError) do
158 if Object.const_defined?(:Float)
161 assert_equal 'aXc', e
164 # length of args is 2
166 assert_raise(IndexError) do
171 assert_raise(IndexError) do
176 assert_raise(IndexError) do
182 assert_equal 'Xabc', d1
186 assert_equal 'aX', e1
189 # It will be tested in mrbgems.
194 assert_equal a3, 'aX'
197 assert_raise(IndexError) do
202 assert('String#capitalize', '15.2.10.5.7') do
206 assert_equal 'abc', a
207 assert_equal 'Abc', 'abc'.capitalize
210 assert('String#capitalize!', '15.2.10.5.8') do
214 assert_equal 'Abc', a
215 assert_equal nil, 'Abc'.capitalize!
218 assert('String#chomp', '15.2.10.5.9') do
223 e = "abc\t".chomp("\t")
228 assert_equal 'abc', a
230 assert_equal 'abc', c
231 assert_equal "abc\n", d
232 assert_equal 'abc', e
233 assert_equal "abc\n", f
236 assert('String#chomp!', '15.2.10.5.10') do
249 assert_equal 'abc', a
251 assert_equal 'abc', c
252 assert_equal "abc\n", d
253 assert_equal 'abc', e
256 assert('String#chop', '15.2.10.5.11') do
265 assert_equal 'abc', c
268 assert('String#chop(UTF-8)', '15.2.10.5.11') do
278 assert('String#chop!', '15.2.10.5.12') do
289 assert('String#chop!(UTF-8)', '15.2.10.5.12') do
300 assert_equal b, 'あいうえ'
301 assert_equal c, 'あいう'
304 assert('String#downcase', '15.2.10.5.13') do
310 assert_equal 'abc', a
311 assert_equal 'ABC', b
314 assert('String#downcase!', '15.2.10.5.14') do
319 assert_equal 'abc', a
320 assert_equal nil, 'abc'.downcase!
323 assert('String#each_line', '15.2.10.5.15') do
324 a = "first line\nsecond line\nthird line"
325 list = ["first line\n", "second line\n", "third line"]
328 a.each_line do |line|
332 assert_equal list, n_list
335 a.each_line("li") do |line|
338 assert_equal ["first li", "ne\nsecond li", "ne\nthird li", "ne"], n_list
341 assert('String#empty?', '15.2.10.5.16') do
346 assert_false b.empty?
349 assert('String#eql?', '15.2.10.5.17') do
350 assert_true 'abc'.eql?('abc')
351 assert_false 'abc'.eql?('cba')
354 assert('String#gsub', '15.2.10.5.18') do
355 assert_equal('aBcaBc', 'abcabc'.gsub('b', 'B'), 'gsub without block')
356 assert_equal('aBcaBc', 'abcabc'.gsub('b'){|w| w.capitalize }, 'gsub with block')
357 assert_equal('$a$a$', '#a#a#'.gsub('#', '$'), 'mruby/mruby#847')
358 assert_equal('$a$a$', '#a#a#'.gsub('#'){|_w| '$' }, 'mruby/mruby#847 with block')
359 assert_equal('$$a$$', '##a##'.gsub('##', '$$'), 'mruby/mruby#847 another case')
360 assert_equal('$$a$$', '##a##'.gsub('##'){|_w| '$$' }, 'mruby/mruby#847 another case with block')
361 assert_equal('A', 'a'.gsub('a', 'A'))
362 assert_equal('A', 'a'.gsub('a'){|w| w.capitalize })
363 assert_equal("<a><><>", 'a'.gsub('a', '<\0><\1><\2>'))
364 assert_equal(".h.e.l.l.o.", "hello".gsub("", "."))
366 assert_equal(".h.e.l.l.o.", "hello".gsub("") { |i| a << i; "." })
367 assert_equal(["", "", "", "", "", ""], a)
368 assert_raise(ArgumentError) { "".gsub }
369 assert_raise(ArgumentError) { "".gsub("", "", "") }
372 assert('String#gsub with backslash') do
374 assert_equal 'ab<\\>cd<\\>ef', s.gsub('X', '<\\\\>')
375 assert_equal 'ab<X>cd<X>ef', s.gsub('X', '<\\&>')
376 assert_equal 'ab<X>cd<X>ef', s.gsub('X', '<\\0>')
377 assert_equal 'ab<ab>cd<abXcd>ef', s.gsub('X', '<\\`>')
378 assert_equal 'ab<cdXef>cd<ef>ef', s.gsub('X', '<\\\'>')
381 assert('String#gsub!', '15.2.10.5.19') do
386 b.gsub!('b') { |w| w.capitalize }
388 assert_equal 'aBcaBc', a
389 assert_equal 'aBcaBc', b
392 assert('String#hash', '15.2.10.5.20') do
395 assert_equal 'abc'.hash, a.hash
398 assert('String#include?', '15.2.10.5.21') do
399 assert_true 'abc'.include?('a')
400 assert_false 'abc'.include?('d')
403 assert('String#index', '15.2.10.5.22') do
404 assert_equal 0, 'abc'.index('a')
405 assert_nil 'abc'.index('d')
406 assert_equal 3, 'abcabc'.index('a', 1)
407 assert_equal 5, "hello".index("", 5)
408 assert_equal nil, "hello".index("", 6)
411 assert('String#initialize', '15.2.10.5.23') do
414 assert_equal 'abc', a
416 a.initialize('abcdefghijklmnopqrstuvwxyz')
417 assert_equal 'abcdefghijklmnopqrstuvwxyz', a
420 assert('String#initialize_copy', '15.2.10.5.24') do
422 a.initialize_copy('abc')
424 assert_equal 'abc', a
427 assert('String#intern', '15.2.10.5.25') do
428 assert_equal :abc, 'abc'.intern
431 assert('String#length', '15.2.10.5.26') do
432 assert_equal 3, 'abc'.length
435 # 'String#match', '15.2.10.5.27' will be tested in mrbgems.
437 assert('String#replace', '15.2.10.5.28') do
441 assert_equal 'abc', a
442 assert_equal 'abc', 'cba'.replace(a)
452 a = s[10, 90] # create shared string
453 assert_equal("", s.replace("")) # clear
454 assert_equal("", s) # s is cleared
455 assert_not_equal("", a) # a should not be affected
458 assert('String#reverse', '15.2.10.5.29') do
462 assert_equal 'abc', a
463 assert_equal 'cba', 'abc'.reverse
466 assert('String#reverse(UTF-8)', '15.2.10.5.29') do
470 assert_equal 'こんにちは世界!', a
471 assert_equal '!界世はちにんこ', 'こんにちは世界!'.reverse
474 assert('String#reverse!', '15.2.10.5.30') do
478 assert_equal 'cba', a
479 assert_equal 'cba', 'abc'.reverse!
482 assert('String#reverse!(UTF-8)', '15.2.10.5.30') do
486 assert_equal '!界世はちにんこ', a
487 assert_equal '!界世はちにんこ', 'こんにちは世界!'.reverse!
490 assert('String#rindex', '15.2.10.5.31') do
491 assert_equal 0, 'abc'.rindex('a')
492 assert_nil 'abc'.rindex('d')
493 assert_equal 0, 'abcabc'.rindex('a', 1)
494 assert_equal 3, 'abcabc'.rindex('a', 4)
497 assert('String#rindex(UTF-8)', '15.2.10.5.31') do
498 str = "こんにちは世界!\nこんにちは世界!"
499 assert_nil str.index('さ')
500 assert_equal 3, str.index('ち')
501 assert_equal 12, str.index('ち', 10)
502 assert_equal nil, str.index("さ")
505 # 'String#scan', '15.2.10.5.32' will be tested in mrbgems.
507 assert('String#size', '15.2.10.5.33') do
508 assert_equal 3, 'abc'.size
511 assert('String#size(UTF-8)', '15.2.10.5.33') do
513 assert_equal 8, str.size
514 assert_not_equal str.bytesize, str.size
515 assert_equal 2, str[1, 2].size
518 assert('String#slice', '15.2.10.5.34') do
519 # length of args is 1
525 # length of args is 2
526 a1 = 'abc'.slice(0, -1)
527 b1 = 'abc'.slice(10, 0)
528 c1 = 'abc'.slice(-10, 0)
529 d1 = 'abc'.slice(0, 0)
530 e1 = 'abc'.slice(1, 2)
532 # slice of shared string
536 # It will be tested in mrbgems.
539 a3 = 'abc'.slice('bc')
540 b3 = 'abc'.slice('XX')
550 assert_equal 'bc', e1
551 assert_equal 'b', e11
552 assert_equal 'bc', a3
557 assert('String#split', '15.2.10.5.35') do
558 # without RegExp behavior is actually unspecified
559 assert_equal ['abc', 'abc', 'abc'], 'abc abc abc'.split
560 assert_equal ["a", "b", "c", "", "d"], 'a,b,c,,d'.split(',')
561 assert_equal ['abc', 'abc', 'abc'], 'abc abc abc'.split(nil)
562 assert_equal ['a', 'b', 'c'], 'abc'.split("")
565 assert('String#split(UTF-8)', '15.2.10.5.35') do
566 got = "こんにちは世界!".split('')
567 assert_equal ['こ', 'ん', 'に', 'ち', 'は', '世', '界', '!'], got
568 got = "こんにちは世界!".split('に')
569 assert_equal ['こん', 'ちは世界!'], got
572 assert('String#sub', '15.2.10.5.36') do
573 assert_equal 'aBcabc', 'abcabc'.sub('b', 'B')
574 assert_equal 'aBcabc', 'abcabc'.sub('b') { |w| w.capitalize }
575 assert_equal 'aa$', 'aa#'.sub('#', '$')
576 assert_equal '.abc', "abc".sub("", ".")
579 miss = str.sub("X", "Z")
580 assert_equal str, miss
581 assert_not_same str, miss
584 assert_equal '.abc', "abc".sub("") { |i| a << i; "." }
588 assert('String#sub with backslash') do
590 assert_equal 'ab<\\>cdXef', s.sub('X', '<\\\\>')
591 assert_equal 'ab<X>cdXef', s.sub('X', '<\\&>')
592 assert_equal 'ab<X>cdXef', s.sub('X', '<\\0>')
593 assert_equal 'ab<ab>cdXef', s.sub('X', '<\\`>')
594 assert_equal 'ab<cdXef>cdXef', s.sub('X', '<\\\'>')
597 assert('String#sub!', '15.2.10.5.37') do
602 b.sub!('b') { |w| w.capitalize }
604 assert_equal 'aBcabc', a
605 assert_equal 'aBcabc', b
608 assert('String#to_f', '15.2.10.5.38') do
611 c = '12345.6789'.to_f
612 d = '1e-2147483648'.to_f
613 e = '1e2147483648'.to_f
616 assert_float(123456789.0, b)
617 assert_float(12345.6789, c)
619 assert_float(Float::INFINITY, e)
620 end if Object.const_defined?(:Float)
622 assert('String#to_i', '15.2.10.5.39') do
630 assert_equal 32143, b
633 assert_equal 1_000, e
636 assert('String#to_s', '15.2.10.5.40') do
637 assert_equal 'abc', 'abc'.to_s
640 assert('String#to_sym', '15.2.10.5.41') do
641 assert_equal :abc, 'abc'.to_sym
644 assert('String#upcase', '15.2.10.5.42') do
650 assert_equal 'ABC', a
651 assert_equal 'abc', b
654 assert('String#upcase!', '15.2.10.5.43') do
659 assert_equal 'ABC', a
660 assert_equal nil, 'ABC'.upcase!
662 a = 'abcdefghijklmnopqrstuvwxyz'
666 assert_equal 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', b
669 assert('String#inspect', '15.2.10.5.46') do
670 # should not raise an exception - regress #1210
671 assert_nothing_raised do
675 assert_equal "\"\\x00\"", "\0".inspect
680 assert('String interpolation (mrb_str_concat for shared strings)') do
682 assert_equal "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:", "#{a}:"
685 assert('Check the usage of a NUL character') do
689 assert('String#bytes') do
691 bytes1 = [104, 101, 108, 108, 111]
696 assert_equal bytes1, str1.bytes
697 assert_equal bytes2, str2.bytes
700 assert('String#each_byte') do
702 bytes1 = [104, 101, 108, 108, 111]
705 str1.each_byte {|b| bytes2 << b }
707 assert_equal bytes1, bytes2
710 assert('String#freeze') do
714 assert_raise(FrozenError) { str.upcase! }
717 assert('String literal concatenation') do
718 assert_equal 2, ("A" "B").size
719 assert_equal 3, ('A' "B" 'C').size
720 assert_equal 4, (%(A) "B#{?C}" "D").size