source: EcnlProtoTool/trunk/mruby-2.1.1/test/t/string.rb@ 439

Last change on this file since 439 was 439, checked in by coas-nagasima, 4 years ago

mrubyを2.1.1に更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
File size: 21.7 KB
Line 
1# coding: utf-8
2##
3# String ISO Test
4
5UTF8STRING = __ENCODING__ == "UTF-8"
6
7assert('String', '15.2.10') do
8 assert_equal Class, String.class
9end
10
11assert('String#<=>', '15.2.10.5.1') do
12 a = '' <=> ''
13 b = '' <=> 'not empty'
14 c = 'not empty' <=> ''
15 d = 'abc' <=> 'cba'
16 e = 'cba' <=> 'abc'
17
18 assert_equal 0, a
19 assert_equal(-1, b)
20 assert_equal 1, c
21 assert_equal(-1, d)
22 assert_equal 1, e
23 assert_nil 'a' <=> 1024
24end
25
26assert('String#==', '15.2.10.5.2') do
27 assert_equal 'abc', 'abc'
28 assert_not_equal 'abc', 'cba'
29end
30
31# 'String#=~', '15.2.10.5.3' will be tested in mrbgems.
32
33assert('String#+', '15.2.10.5.4') do
34 assert_equal 'ab', 'a' + 'b'
35end
36
37assert('String#*', '15.2.10.5.5') do
38 assert_equal 'aaaaa', 'a' * 5
39 assert_equal '', 'a' * 0
40 assert_raise(ArgumentError) { 'a' * -1 }
41 assert_raise(TypeError) { 'a' * '1' }
42 assert_raise(TypeError) { 'a' * nil }
43
44 skip unless Object.const_defined?(:Float)
45 assert_equal 'aa', 'a' * 2.1
46 assert_raise(RangeError) { '' * 1e30 }
47 assert_raise(RangeError) { '' * Float::INFINITY }
48 assert_raise(RangeError) { '' * Float::NAN }
49end
50
51assert('String#[]', '15.2.10.5.6') do
52 # length of args is 1
53 assert_equal 'a', 'abc'[0]
54 assert_equal 'c', 'abc'[-1]
55 assert_nil 'abc'[10]
56 assert_nil 'abc'[-10]
57 assert_equal 'b', 'abc'[1.1] if Object.const_defined?(:Float)
58
59 # length of args is 2
60 assert_nil 'abc'[0, -1]
61 assert_nil 'abc'[10, 0]
62 assert_nil 'abc'[-10, 0]
63 assert_equal '', 'abc'[0, 0]
64 assert_equal 'bc', 'abc'[1, 2]
65
66 # args is String
67 assert_equal 'bc', 'abc'['bc']
68 assert_nil 'abc'['XX']
69
70 assert_raise(TypeError) { 'abc'[nil] }
71end
72
73assert('String#[](UTF-8)', '15.2.10.5.6') do
74 assert_equal "ち", "こんにちは世界"[3]
75 assert_equal nil, "こんにちは世界"[20]
76 assert_equal "世", "こんにちは世界"[-2]
77 assert_equal "世界", "こんにちは世界"[-2..-1]
78 assert_equal "んに", "こんにちは世界"[1,2]
79 assert_equal "世", "こんにちは世界"["世"]
80end if UTF8STRING
81
82assert('String#[] with Range') do
83 a1 = 'abc'[1..0]
84 b1 = 'abc'[1..1]
85 c1 = 'abc'[1..2]
86 d1 = 'abc'[1..3]
87 e1 = 'abc'[1..4]
88 f1 = 'abc'[0..-2]
89 g1 = 'abc'[-2..3]
90 h1 = 'abc'[3..4]
91 i1 = 'abc'[4..5]
92 j1 = 'abcdefghijklmnopqrstuvwxyz'[1..3]
93 a2 = 'abc'[1...0]
94 b2 = 'abc'[1...1]
95 c2 = 'abc'[1...2]
96 d2 = 'abc'[1...3]
97 e2 = 'abc'[1...4]
98 f2 = 'abc'[0...-2]
99 g2 = 'abc'[-2...3]
100 h2 = 'abc'[3...4]
101 i2 = 'abc'[4...5]
102 j2 = 'abcdefghijklmnopqrstuvwxyz'[1...3]
103
104 assert_equal '', a1
105 assert_equal 'b', b1
106 assert_equal 'bc', c1
107 assert_equal 'bc', d1
108 assert_equal 'bc', e1
109 assert_equal 'ab', f1
110 assert_equal 'bc', g1
111 assert_equal '', h1
112 assert_nil i2
113 assert_equal 'bcd', j1
114 assert_equal '', a2
115 assert_equal '', b2
116 assert_equal 'b', c2
117 assert_equal 'bc', d2
118 assert_equal 'bc', e2
119 assert_equal 'a', f2
120 assert_equal 'bc', g2
121 assert_equal '', h2
122 assert_nil i2
123 assert_equal 'bc', j2
124end
125
126assert('String#[]=') do
127 # length of args is 1
128 a = 'abc'
129 a[0] = 'X'
130 assert_equal 'Xbc', a
131
132 b = 'abc'
133 b[-1] = 'X'
134 assert_equal 'abX', b
135
136 c = 'abc'
137 assert_raise(IndexError) do
138 c[10] = 'X'
139 end
140
141 d = 'abc'
142 assert_raise(IndexError) do
143 d[-10] = 'X'
144 end
145
146 if Object.const_defined?(:Float)
147 e = 'abc'
148 e[1.1] = 'X'
149 assert_equal 'aXc', e
150 end
151
152 assert_raise(TypeError) { 'a'[0] = 1 }
153 assert_raise(TypeError) { 'a'[:a] = '1' }
154
155 # length of args is 2
156 a1 = 'abc'
157 assert_raise(IndexError) do
158 a1[0, -1] = 'X'
159 end
160
161 b1 = 'abc'
162 assert_raise(IndexError) do
163 b1[10, 0] = 'X'
164 end
165
166 c1 = 'abc'
167 assert_raise(IndexError) do
168 c1[-10, 0] = 'X'
169 end
170
171 d1 = 'abc'
172 d1[0, 0] = 'X'
173 assert_equal 'Xabc', d1
174
175 e1 = 'abc'
176 e1[1, 3] = 'X'
177 assert_equal 'aX', e1
178
179 # args is RegExp
180 # It will be tested in mrbgems.
181
182 # args is String
183 a3 = 'abc'
184 a3['bc'] = 'X'
185 assert_equal a3, 'aX'
186
187 b3 = 'abc'
188 assert_raise(IndexError) do
189 b3['XX'] = 'Y'
190 end
191
192 assert_raise(TypeError) { 'a'[:a, 0] = '1' }
193 assert_raise(TypeError) { 'a'[0, :a] = '1' }
194 assert_raise(TypeError) { 'a'[0, 1] = 1 }
195end
196
197assert('String[]=(UTF-8)') do
198 a = "➀➁➂➃➄"
199 a[3] = "⚃"
200 assert_equal "➀➁➂⚃➄", a
201
202 b = "➀➁➂➃➄"
203 b[3, 0] = "⛄"
204 assert_equal "➀➁➂⛄➃➄", b
205
206 c = "➀➁➂➃➄"
207 c[3, 2] = "⚃⚄"
208 assert_equal "➀➁➂⚃⚄", c
209
210 d = "➀➁➂➃➄"
211 d[5] = "⛄"
212 assert_equal "➀➁➂➃➄⛄", d
213
214 e = "➀➁➂➃➄"
215 e[5, 0] = "⛄"
216 assert_equal "➀➁➂➃➄⛄", e
217
218 f = "➀➁➂➃➄"
219 f[5, 2] = "⛄"
220 assert_equal "➀➁➂➃➄⛄", f
221
222 g = "➀➁➂➃➄"
223 assert_raise(IndexError) { g[6] = "⛄" }
224
225 h = "➀➁➂➃➄"
226 assert_raise(IndexError) { h[6, 0] = "⛄" }
227
228 i = "➀➁➂➃➄"
229 assert_raise(IndexError) { i[6, 2] = "⛄" }
230
231 j = "➀➁➂➃➄"
232 j["➃"] = "⚃"
233 assert_equal "➀➁➂⚃➄", j
234
235 k = "➀➁➂➃➄"
236 assert_raise(IndexError) { k["⛄"] = "⛇" }
237
238 l = "➀➁➂➃➄"
239 assert_nothing_raised { l["➂"] = "" }
240 assert_equal "➀➁➃➄", l
241
242 m = "➀➁➂➃➄"
243 assert_raise(TypeError) { m["➂"] = nil }
244 assert_equal "➀➁➂➃➄", m
245end if UTF8STRING
246
247assert('String#capitalize', '15.2.10.5.7') do
248 a = 'abc'
249 a.capitalize
250
251 assert_equal 'abc', a
252 assert_equal 'Abc', 'abc'.capitalize
253end
254
255assert('String#capitalize!', '15.2.10.5.8') do
256 a = 'abc'
257 a.capitalize!
258
259 assert_equal 'Abc', a
260 assert_equal nil, 'Abc'.capitalize!
261end
262
263assert('String#chomp', '15.2.10.5.9') do
264 a = 'abc'.chomp
265 b = ''.chomp
266 c = "abc\n".chomp
267 d = "abc\n\n".chomp
268 e = "abc\t".chomp("\t")
269 f = "abc\n"
270
271 f.chomp
272
273 assert_equal 'abc', a
274 assert_equal '', b
275 assert_equal 'abc', c
276 assert_equal "abc\n", d
277 assert_equal 'abc', e
278 assert_equal "abc\n", f
279end
280
281assert('String#chomp!', '15.2.10.5.10') do
282 a = 'abc'
283 b = ''
284 c = "abc\n"
285 d = "abc\n\n"
286 e = "abc\t"
287
288 a.chomp!
289 b.chomp!
290 c.chomp!
291 d.chomp!
292 e.chomp!("\t")
293
294 assert_equal 'abc', a
295 assert_equal '', b
296 assert_equal 'abc', c
297 assert_equal "abc\n", d
298 assert_equal 'abc', e
299end
300
301assert('String#chop', '15.2.10.5.11') do
302 a = ''.chop
303 b = 'abc'.chop
304 c = 'abc'
305
306 c.chop
307
308 assert_equal '', a
309 assert_equal 'ab', b
310 assert_equal 'abc', c
311end
312
313assert('String#chop(UTF-8)', '15.2.10.5.11') do
314 a = ''.chop
315 b = 'あいう'.chop
316 c = "あ\nい".chop.chop
317
318 assert_equal '', a
319 assert_equal 'あい', b
320 assert_equal 'あ', c
321end if UTF8STRING
322
323assert('String#chop!', '15.2.10.5.12') do
324 a = ''
325 b = 'abc'
326
327 a.chop!
328 b.chop!
329
330 assert_equal a, ''
331 assert_equal b, 'ab'
332end
333
334assert('String#chop!(UTF-8)', '15.2.10.5.12') do
335 a = ''
336 b = "あいうえ\n"
337 c = "あいうえ\n"
338
339 a.chop!
340 b.chop!
341 c.chop!
342 c.chop!
343
344 assert_equal a, ''
345 assert_equal b, 'あいうえ'
346 assert_equal c, 'あいう'
347end if UTF8STRING
348
349assert('String#downcase', '15.2.10.5.13') do
350 a = 'ABC'.downcase
351 b = 'ABC'
352
353 b.downcase
354
355 assert_equal 'abc', a
356 assert_equal 'ABC', b
357end
358
359assert('String#downcase!', '15.2.10.5.14') do
360 a = 'ABC'
361
362 a.downcase!
363
364 assert_equal 'abc', a
365 assert_equal nil, 'abc'.downcase!
366end
367
368assert('String#each_line', '15.2.10.5.15') do
369 a = "first line\nsecond line\nthird line"
370 list = ["first line\n", "second line\n", "third line"]
371 n_list = []
372
373 a.each_line do |line|
374 n_list << line
375 end
376
377 assert_equal list, n_list
378
379 n_list.clear
380 a.each_line("li") do |line|
381 n_list << line
382 end
383 assert_equal ["first li", "ne\nsecond li", "ne\nthird li", "ne"], n_list
384end
385
386assert('String#empty?', '15.2.10.5.16') do
387 a = ''
388 b = 'not empty'
389
390 assert_true a.empty?
391 assert_false b.empty?
392end
393
394assert('String#eql?', '15.2.10.5.17') do
395 assert_true 'abc'.eql?('abc')
396 assert_false 'abc'.eql?('cba')
397end
398
399assert('String#gsub', '15.2.10.5.18') do
400 assert_equal('aBcaBc', 'abcabc'.gsub('b', 'B'), 'gsub without block')
401 assert_equal('aBcaBc', 'abcabc'.gsub('b'){|w| w.capitalize }, 'gsub with block')
402 assert_equal('$a$a$', '#a#a#'.gsub('#', '$'), 'mruby/mruby#847')
403 assert_equal('$a$a$', '#a#a#'.gsub('#'){|_w| '$' }, 'mruby/mruby#847 with block')
404 assert_equal('$$a$$', '##a##'.gsub('##', '$$'), 'mruby/mruby#847 another case')
405 assert_equal('$$a$$', '##a##'.gsub('##'){|_w| '$$' }, 'mruby/mruby#847 another case with block')
406 assert_equal('A', 'a'.gsub('a', 'A'))
407 assert_equal('A', 'a'.gsub('a'){|w| w.capitalize })
408 assert_equal("<a><><>", 'a'.gsub('a', '<\0><\1><\2>'))
409 assert_equal(".h.e.l.l.o.", "hello".gsub("", "."))
410 a = []
411 assert_equal(".h.e.l.l.o.", "hello".gsub("") { |i| a << i; "." })
412 assert_equal(["", "", "", "", "", ""], a)
413 assert_raise(ArgumentError) { "".gsub }
414 assert_raise(ArgumentError) { "".gsub("", "", "") }
415end
416
417assert('String#gsub with backslash') do
418 s = 'abXcdXef'
419 assert_equal 'ab<\\>cd<\\>ef', s.gsub('X', '<\\\\>')
420 assert_equal 'ab<X>cd<X>ef', s.gsub('X', '<\\&>')
421 assert_equal 'ab<X>cd<X>ef', s.gsub('X', '<\\0>')
422 assert_equal 'ab<ab>cd<abXcd>ef', s.gsub('X', '<\\`>')
423 assert_equal 'ab<cdXef>cd<ef>ef', s.gsub('X', '<\\\'>')
424end
425
426assert('String#gsub!', '15.2.10.5.19') do
427 a = 'abcabc'
428 a.gsub!('b', 'B')
429
430 b = 'abcabc'
431 b.gsub!('b') { |w| w.capitalize }
432
433 assert_equal 'aBcaBc', a
434 assert_equal 'aBcaBc', b
435end
436
437assert('String#hash', '15.2.10.5.20') do
438 a = 'abc'
439
440 assert_equal 'abc'.hash, a.hash
441end
442
443assert('String#include?', '15.2.10.5.21') do
444 assert_true 'abc'.include?('a')
445 assert_false 'abc'.include?('d')
446end
447
448assert('String#index', '15.2.10.5.22') do
449 assert_equal 0, 'abc'.index('a')
450 assert_nil 'abc'.index('d')
451 assert_equal 3, 'abcabc'.index('a', 1)
452 assert_equal 5, "hello".index("", 5)
453 assert_equal nil, "hello".index("", 6)
454 assert_equal 3, "hello".index("l", -2)
455 assert_raise(ArgumentError) { "hello".index }
456 assert_raise(TypeError) { "hello".index(101) }
457end
458
459assert('String#index(UTF-8)', '15.2.10.5.22') do
460 assert_equal 0, '⓿➊➋➌➍➎'.index('⓿')
461 assert_nil '⓿➊➋➌➍➎'.index('➓')
462 assert_equal 6, '⓿➊➋➌➍➎⓿➊➋➌➍➎'.index('⓿', 1)
463 assert_equal 6, '⓿➊➋➌➍➎⓿➊➋➌➍➎'.index('⓿', -7)
464 assert_equal 6, "⓿➊➋➌➍➎".index("", 6)
465 assert_equal nil, "⓿➊➋➌➍➎".index("", 7)
466 assert_equal 0, '⓿➊➋➌➍➎'.index("\xe2")
467 assert_equal nil, '⓿➊➋➌➍➎'.index("\xe3")
468 assert_equal 6, "\xd1\xd1\xd1\xd1\xd1\xd1⓿➊➋➌➍➎".index('⓿')
469end if UTF8STRING
470
471assert('String#initialize', '15.2.10.5.23') do
472 a = ''
473 a.initialize('abc')
474 assert_equal 'abc', a
475
476 a.initialize('abcdefghijklmnopqrstuvwxyz')
477 assert_equal 'abcdefghijklmnopqrstuvwxyz', a
478end
479
480assert('String#initialize_copy', '15.2.10.5.24') do
481 a = ''
482 a.initialize_copy('abc')
483
484 assert_equal 'abc', a
485end
486
487assert('String#intern', '15.2.10.5.25') do
488 assert_equal :abc, 'abc'.intern
489end
490
491assert('String#length', '15.2.10.5.26') do
492 assert_equal 3, 'abc'.length
493end
494
495# 'String#match', '15.2.10.5.27' will be tested in mrbgems.
496
497assert('String#replace', '15.2.10.5.28') do
498 a = ''
499 a.replace('abc')
500
501 assert_equal 'abc', a
502 assert_equal 'abc', 'cba'.replace(a)
503
504 b = 'abc' * 10
505 c = ('cba' * 10).dup
506 b.replace(c);
507 c.replace(b);
508 assert_equal c, b
509
510 # shared string
511 s = "foo" * 100
512 a = s[10, 90] # create shared string
513 assert_equal("", s.replace("")) # clear
514 assert_equal("", s) # s is cleared
515 assert_not_equal("", a) # a should not be affected
516end
517
518assert('String#reverse', '15.2.10.5.29') do
519 a = 'abc'
520 a.reverse
521
522 assert_equal 'abc', a
523 assert_equal 'cba', 'abc'.reverse
524end
525
526assert('String#reverse(UTF-8)', '15.2.10.5.29') do
527 a = 'こんにちは世界!'
528 a.reverse
529
530 assert_equal 'こんにちは世界!', a
531 assert_equal '!界世はちにんこ', 'こんにちは世界!'.reverse
532 assert_equal 'あ', 'あ'.reverse
533end if UTF8STRING
534
535assert('String#reverse!', '15.2.10.5.30') do
536 a = 'abc'
537 a.reverse!
538
539 assert_equal 'cba', a
540 assert_equal 'cba', 'abc'.reverse!
541end
542
543assert('String#reverse!(UTF-8)', '15.2.10.5.30') do
544 a = 'こんにちは世界!'
545 a.reverse!
546
547 assert_equal '!界世はちにんこ', a
548 assert_equal '!界世はちにんこ', 'こんにちは世界!'.reverse!
549
550 b = 'あ'
551 b.reverse!
552 assert_equal 'あ', b
553end if UTF8STRING
554
555assert('String#rindex', '15.2.10.5.31') do
556 assert_equal 0, 'abc'.rindex('a')
557 assert_equal 0, 'abc'.rindex('a', 3)
558 assert_nil 'abc'.rindex('a', -4)
559 assert_nil 'abc'.rindex('d')
560 assert_equal 6, 'abcabc'.rindex('')
561 assert_equal 3, 'abcabc'.rindex('a')
562 assert_equal 0, 'abcabc'.rindex('a', 1)
563 assert_equal 3, 'abcabc'.rindex('a', 4)
564 assert_equal 0, 'abcabc'.rindex('a', -4)
565 assert_raise(ArgumentError) { "hello".rindex }
566 assert_raise(TypeError) { "hello".rindex(101) }
567end
568
569assert('String#rindex(UTF-8)', '15.2.10.5.31') do
570 str = "こんにちは世界!\nこんにちは世界!"
571 assert_nil str.rindex('さ')
572 assert_equal 12, str.rindex('ち')
573 assert_equal 3, str.rindex('ち', 10)
574 assert_equal 3, str.rindex('ち', -6)
575
576 broken = "\xf0\xf1\xf2\xf3\xf0\xf1\xf2\xf3☃"
577 assert_nil broken.rindex("\x81") # "\x81" is a part of "☁" ("\xe2\x98\x81")
578 assert_equal 11, broken.rindex("☁")
579 assert_equal 11, broken.rindex("☁", 12)
580 assert_equal 11, broken.rindex("☁", 11)
581 assert_equal 3, broken.rindex("☁", 10)
582end if UTF8STRING
583
584# assert('String#scan', '15.2.10.5.32') do
585# # Not implemented yet
586# end
587
588assert('String#size', '15.2.10.5.33') do
589 assert_equal 3, 'abc'.size
590end
591
592assert('String#size(UTF-8)', '15.2.10.5.33') do
593 str = 'こんにちは世界!'
594 assert_equal 8, str.size
595 assert_not_equal str.bytesize, str.size
596 assert_equal 2, str[1, 2].size
597end if UTF8STRING
598
599assert('String#slice', '15.2.10.5.34') do
600 # length of args is 1
601 a = 'abc'.slice(0)
602 b = 'abc'.slice(-1)
603 c = 'abc'.slice(10)
604 d = 'abc'.slice(-10)
605
606 # length of args is 2
607 a1 = 'abc'.slice(0, -1)
608 b1 = 'abc'.slice(10, 0)
609 c1 = 'abc'.slice(-10, 0)
610 d1 = 'abc'.slice(0, 0)
611 e1 = 'abc'.slice(1, 2)
612
613 # slice of shared string
614 e11 = e1.slice(0)
615
616 # args is RegExp
617 # It will be tested in mrbgems.
618
619 # args is String
620 a3 = 'abc'.slice('bc')
621 b3 = 'abc'.slice('XX')
622
623 assert_equal 'a', a
624 assert_equal 'c', b
625 assert_nil c
626 assert_nil d
627 assert_nil a1
628 assert_nil b1
629 assert_nil c1
630 assert_equal '', d1
631 assert_equal 'bc', e1
632 assert_equal 'b', e11
633 assert_equal 'bc', a3
634 assert_nil b3
635end
636
637# TODO Broken ATM
638assert('String#split', '15.2.10.5.35') do
639 # without RegExp behavior is actually unspecified
640 assert_equal ['abc', 'abc', 'abc'], 'abc abc abc'.split
641 assert_equal ["a", "b", "c", "", "d"], 'a,b,c,,d'.split(',')
642 assert_equal ['abc', 'abc', 'abc'], 'abc abc abc'.split(nil)
643 assert_equal ['a', 'b', 'c'], 'abc'.split("")
644end
645
646assert('String#split(UTF-8)', '15.2.10.5.35') do
647 got = "こんにちは世界!".split('')
648 assert_equal ['こ', 'ん', 'に', 'ち', 'は', '世', '界', '!'], got
649 got = "こんにちは世界!".split('に')
650 assert_equal ['こん', 'ちは世界!'], got
651end if UTF8STRING
652
653assert('String#sub', '15.2.10.5.36') do
654 assert_equal 'aBcabc', 'abcabc'.sub('b', 'B')
655 assert_equal 'aBcabc', 'abcabc'.sub('b') { |w| w.capitalize }
656 assert_equal 'aa$', 'aa#'.sub('#', '$')
657 assert_equal '.abc', "abc".sub("", ".")
658
659 str = "abc"
660 miss = str.sub("X", "Z")
661 assert_equal str, miss
662 assert_not_same str, miss
663
664 a = []
665 assert_equal '.abc', "abc".sub("") { |i| a << i; "." }
666 assert_equal [""], a
667end
668
669assert('String#sub with backslash') do
670 s = 'abXcdXef'
671 assert_equal 'ab<\\>cdXef', s.sub('X', '<\\\\>')
672 assert_equal 'ab<X>cdXef', s.sub('X', '<\\&>')
673 assert_equal 'ab<X>cdXef', s.sub('X', '<\\0>')
674 assert_equal 'ab<ab>cdXef', s.sub('X', '<\\`>')
675 assert_equal 'ab<cdXef>cdXef', s.sub('X', '<\\\'>')
676end
677
678assert('String#sub!', '15.2.10.5.37') do
679 a = 'abcabc'
680 a.sub!('b', 'B')
681
682 b = 'abcabc'
683 b.sub!('b') { |w| w.capitalize }
684
685 assert_equal 'aBcabc', a
686 assert_equal 'aBcabc', b
687end
688
689assert('String#to_f', '15.2.10.5.38') do
690 assert_operator(0.0, :eql?, ''.to_f)
691 assert_operator(123456789.0, :eql?, '123456789'.to_f)
692 assert_operator(12345.6789, :eql?, '12345.6789'.to_f)
693 assert_operator(0.0, :eql?, '1e-2147483648'.to_f)
694 assert_operator(Float::INFINITY, :eql?, '1e2147483648'.to_f)
695 assert_operator(0.0, :eql?, 'a'.to_f)
696 assert_operator(4.0, :eql?, '4a5'.to_f)
697 assert_operator(12.0, :eql?, '1_2__3'.to_f)
698 assert_operator(123.0, :eql?, '1_2_3'.to_f)
699 assert_operator(68.0, :eql?, '68_'.to_f)
700 assert_operator(68.0, :eql?, '68._7'.to_f)
701 assert_operator(68.7, :eql?, '68.7_'.to_f)
702 assert_operator(68.7, :eql?, '68.7_ '.to_f)
703 assert_operator(6.0, :eql?, '6 8.7'.to_f)
704 assert_operator(68.0, :eql?, '68. 7'.to_f)
705 assert_operator(0.0, :eql?, '_68'.to_f)
706 assert_operator(0.0, :eql?, ' _68'.to_f)
707 assert_operator(12.34, :eql?, '1_2.3_4'.to_f)
708 assert_operator(12.3, :eql?, '1_2.3__4'.to_f)
709 assert_operator(0.9, :eql?, '.9'.to_f)
710 assert_operator(0.9, :eql?, "\t\r\n\f\v .9 \t\r\n\f\v".to_f)
711end if Object.const_defined?(:Float)
712
713assert('String#to_i', '15.2.10.5.39') do
714 assert_operator 0, :eql?, ''.to_i
715 assert_operator 32143, :eql?, '32143'.to_i
716 assert_operator 10, :eql?, 'a'.to_i(16)
717 assert_operator 4, :eql?, '100'.to_i(2)
718 assert_operator 1_000, :eql?, '1_000'.to_i
719 assert_operator 0, :eql?, 'a'.to_i
720 assert_operator 4, :eql?, '4a5'.to_i
721 assert_operator 12, :eql?, '1_2__3'.to_i
722 assert_operator 123, :eql?, '1_2_3'.to_i
723 assert_operator 68, :eql?, '68_'.to_i
724 assert_operator 68, :eql?, '68_ '.to_i
725 assert_operator 0, :eql?, '_68'.to_i
726 assert_operator 0, :eql?, ' _68'.to_i
727 assert_operator 68, :eql?, "\t\r\n\f\v 68 \t\r\n\f\v".to_i
728 assert_operator 6, :eql?, ' 6 8 '.to_i
729end
730
731assert('String#to_s', '15.2.10.5.40') do
732 assert_equal 'abc', 'abc'.to_s
733end
734
735assert('String#to_sym', '15.2.10.5.41') do
736 assert_equal :abc, 'abc'.to_sym
737end
738
739assert('String#upcase', '15.2.10.5.42') do
740 a = 'abc'.upcase
741 b = 'abc'
742
743 b.upcase
744
745 assert_equal 'ABC', a
746 assert_equal 'abc', b
747end
748
749assert('String#upcase!', '15.2.10.5.43') do
750 a = 'abc'
751
752 a.upcase!
753
754 assert_equal 'ABC', a
755 assert_equal nil, 'ABC'.upcase!
756
757 a = 'abcdefghijklmnopqrstuvwxyz'
758 b = a.dup
759 a.upcase!
760 b.upcase!
761 assert_equal 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', b
762end
763
764assert('String#inspect', '15.2.10.5.46') do
765 assert_equal "\"\\x00\"", "\0".inspect
766 assert_equal "\"foo\"", "foo".inspect
767 if UTF8STRING
768 assert_equal '"る"', "る".inspect
769 else
770 assert_equal '"\xe3\x82\x8b"', "る".inspect
771 end
772
773 # should not raise an exception - regress #1210
774 assert_nothing_raised do
775 ("\1" * 100).inspect
776 end
777end
778
779# Not ISO specified
780
781assert('String interpolation (mrb_str_concat for shared strings)') do
782 a = "A" * 32
783 assert_equal "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:", "#{a}:"
784end
785
786assert('String#bytes') do
787 str1 = "hello"
788 bytes1 = [104, 101, 108, 108, 111]
789
790 str2 = "\xFF"
791 bytes2 = [0xFF]
792
793 assert_equal bytes1, str1.bytes
794 assert_equal bytes2, str2.bytes
795end
796
797assert('String#each_byte') do
798 str1 = "hello"
799 bytes1 = [104, 101, 108, 108, 111]
800 bytes2 = []
801
802 str1.each_byte {|b| bytes2 << b }
803
804 assert_equal bytes1, bytes2
805end
806
807assert('String#freeze') do
808 str = "hello"
809 str.freeze
810
811 assert_raise(FrozenError) { str.upcase! }
812end
813
814assert('String literal concatenation') do
815 assert_equal 2, ("A" "B").size
816 assert_equal 3, ('A' "B" 'C').size
817 assert_equal 4, (%(A) "B#{?C}" "D").size
818end
819
820assert('String#getbyte') do
821 str1 = "hello"
822 bytes1 = [104, 101, 108, 108, 111]
823 assert_equal bytes1[0], str1.getbyte(0)
824 assert_equal bytes1[-1], str1.getbyte(-1)
825 assert_equal bytes1[6], str1.getbyte(6)
826
827 str2 = "\xFF"
828 bytes2 = [0xFF]
829 assert_equal bytes2[0], str2.getbyte(0)
830end
831
832assert('String#setbyte') do
833 str1 = "hello"
834 h = "H".getbyte(0)
835 str1.setbyte(0, h)
836 assert_equal(h, str1.getbyte(0))
837 assert_equal("Hello", str1)
838end
839
840assert('String#byteslice') do
841 str1 = "hello"
842 str2 = "\u3042ab" # "\xE3\x81\x82ab"
843
844 assert_equal("h", str1.byteslice(0))
845 assert_equal("e", str1.byteslice(1))
846 assert_equal(nil, str1.byteslice(5))
847 assert_equal("o", str1.byteslice(-1))
848 assert_equal(nil, str1.byteslice(-6))
849 assert_equal("\xE3", str2.byteslice(0))
850 assert_equal("\x81", str2.byteslice(1))
851 assert_equal(nil, str2.byteslice(5))
852 assert_equal("b", str2.byteslice(-1))
853 assert_equal(nil, str2.byteslice(-6))
854
855 assert_equal("", str1.byteslice(0, 0))
856 assert_equal(str1, str1.byteslice(0, 6))
857 assert_equal("el", str1.byteslice(1, 2))
858 assert_equal("", str1.byteslice(5, 1))
859 assert_equal("o", str1.byteslice(-1, 6))
860 assert_equal(nil, str1.byteslice(-6, 1))
861 assert_equal(nil, str1.byteslice(0, -1))
862 assert_equal("", str2.byteslice(0, 0))
863 assert_equal(str2, str2.byteslice(0, 6))
864 assert_equal("\x81\x82", str2.byteslice(1, 2))
865 assert_equal("", str2.byteslice(5, 1))
866 assert_equal("b", str2.byteslice(-1, 6))
867 assert_equal(nil, str2.byteslice(-6, 1))
868 assert_equal(nil, str2.byteslice(0, -1))
869
870 assert_equal("ell", str1.byteslice(1..3))
871 assert_equal("el", str1.byteslice(1...3))
872 assert_equal("h", str1.byteslice(0..0))
873 assert_equal("", str1.byteslice(5..0))
874 assert_equal("o", str1.byteslice(4..5))
875 assert_equal(nil, str1.byteslice(6..0))
876 assert_equal("", str1.byteslice(-1..0))
877 assert_equal("llo", str1.byteslice(-3..5))
878 assert_equal("\x81\x82a", str2.byteslice(1..3))
879 assert_equal("\x81\x82", str2.byteslice(1...3))
880 assert_equal("\xE3", str2.byteslice(0..0))
881 assert_equal("", str2.byteslice(5..0))
882 assert_equal("b", str2.byteslice(4..5))
883 assert_equal(nil, str2.byteslice(6..0))
884 assert_equal("", str2.byteslice(-1..0))
885 assert_equal("\x82ab", str2.byteslice(-3..5))
886
887 assert_raise(ArgumentError) { str1.byteslice }
888 assert_raise(ArgumentError) { str1.byteslice(1, 2, 3) }
889 assert_raise(TypeError) { str1.byteslice("1") }
890 assert_raise(TypeError) { str1.byteslice("1", 2) }
891 assert_raise(TypeError) { str1.byteslice(1, "2") }
892 assert_raise(TypeError) { str1.byteslice(1..2, 3) }
893
894 skip unless Object.const_defined?(:Float)
895 assert_equal("o", str1.byteslice(4.0))
896 assert_equal("\x82ab", str2.byteslice(2.0, 3.0))
897end
Note: See TracBrowser for help on using the repository browser.