source: EcnlProtoTool/trunk/mruby-1.3.0/test/t/string.rb@ 331

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

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
File size: 15.0 KB
Line 
1# coding: utf-8
2##
3# String ISO Test
4
5UTF8STRING = ("\343\201\202".size == 1)
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
23end
24
25assert('String#==', '15.2.10.5.2') do
26 assert_equal 'abc', 'abc'
27 assert_not_equal 'abc', 'cba'
28end
29
30# 'String#=~', '15.2.10.5.3' will be tested in mrbgems.
31
32assert('String#+', '15.2.10.5.4') do
33 assert_equal 'ab', 'a' + 'b'
34end
35
36assert('String#*', '15.2.10.5.5') do
37 assert_equal 'aaaaa', 'a' * 5
38 assert_equal '', 'a' * 0
39 assert_raise(ArgumentError) do
40 'a' * -1
41 end
42end
43
44assert('String#[]', '15.2.10.5.6') do
45 # length of args is 1
46 a = 'abc'[0]
47 b = 'abc'[-1]
48 c = 'abc'[10]
49 d = 'abc'[-10]
50 e = 'abc'[1.1]
51
52 # length of args is 2
53 a1 = 'abc'[0, -1]
54 b1 = 'abc'[10, 0]
55 c1 = 'abc'[-10, 0]
56 d1 = 'abc'[0, 0]
57 e1 = 'abc'[1, 2]
58
59 # args is RegExp
60 # It will be tested in mrbgems.
61
62 # args is String
63 a3 = 'abc'['bc']
64 b3 = 'abc'['XX']
65
66 assert_equal 'a', 'a'
67 # assert_equal 'c', b
68 # assert_nil c
69 # assert_nil d
70 # assert_equal 'b', e
71 # assert_nil a1
72 # assert_nil b1
73 # assert_nil c1
74 # assert_equal '', d1
75 # assert_equal 'bc', e1
76 # assert_equal 'bc', a3
77 # assert_nil b3
78
79 # assert_raise(TypeError) do
80 # a[nil]
81 # end
82end
83
84assert('String#[](UTF-8)', '15.2.10.5.6') do
85 assert_equal "ち", "こんにちは世界"[3]
86 assert_equal nil, "こんにちは世界"[20]
87 assert_equal "世", "こんにちは世界"[-2]
88 assert_equal "世界", "こんにちは世界"[-2..-1]
89 assert_equal "んに", "こんにちは世界"[1,2]
90 assert_equal "世", "こんにちは世界"["世"]
91end if UTF8STRING
92
93assert('String#[] with Range') do
94 a1 = 'abc'[1..0]
95 b1 = 'abc'[1..1]
96 c1 = 'abc'[1..2]
97 d1 = 'abc'[1..3]
98 e1 = 'abc'[1..4]
99 f1 = 'abc'[0..-2]
100 g1 = 'abc'[-2..3]
101 h1 = 'abc'[3..4]
102 i1 = 'abc'[4..5]
103 j1 = 'abcdefghijklmnopqrstuvwxyz'[1..3]
104 a2 = 'abc'[1...0]
105 b2 = 'abc'[1...1]
106 c2 = 'abc'[1...2]
107 d2 = 'abc'[1...3]
108 e2 = 'abc'[1...4]
109 f2 = 'abc'[0...-2]
110 g2 = 'abc'[-2...3]
111 h2 = 'abc'[3...4]
112 i2 = 'abc'[4...5]
113 j2 = 'abcdefghijklmnopqrstuvwxyz'[1...3]
114
115 assert_equal '', a1
116 assert_equal 'b', b1
117 assert_equal 'bc', c1
118 assert_equal 'bc', d1
119 assert_equal 'bc', e1
120 assert_equal 'ab', f1
121 assert_equal 'bc', g1
122 assert_equal '', h1
123 assert_nil i2
124 assert_equal 'bcd', j1
125 assert_equal '', a2
126 assert_equal '', b2
127 assert_equal 'b', c2
128 assert_equal 'bc', d2
129 assert_equal 'bc', e2
130 assert_equal 'a', f2
131 assert_equal 'bc', g2
132 assert_equal '', h2
133 assert_nil i2
134 assert_equal 'bc', j2
135end
136
137assert('String#[]=') do
138 # length of args is 1
139 a = 'abc'
140 a[0] = 'X'
141 assert_equal 'Xbc', a
142
143 b = 'abc'
144 b[-1] = 'X'
145 assert_equal 'abX', b
146
147 c = 'abc'
148 assert_raise(IndexError) do
149 c[10] = 'X'
150 end
151
152 d = 'abc'
153 assert_raise(IndexError) do
154 d[-10] = 'X'
155 end
156
157 e = 'abc'
158 e[1.1] = 'X'
159 assert_equal 'aXc', e
160
161
162 # length of args is 2
163 a1 = 'abc'
164 assert_raise(IndexError) do
165 a1[0, -1] = 'X'
166 end
167
168 b1 = 'abc'
169 assert_raise(IndexError) do
170 b1[10, 0] = 'X'
171 end
172
173 c1 = 'abc'
174 assert_raise(IndexError) do
175 c1[-10, 0] = 'X'
176 end
177
178 d1 = 'abc'
179 d1[0, 0] = 'X'
180 assert_equal 'Xabc', d1
181
182 e1 = 'abc'
183 e1[1, 3] = 'X'
184 assert_equal 'aX', e1
185
186 # args is RegExp
187 # It will be tested in mrbgems.
188
189 # args is String
190 a3 = 'abc'
191 a3['bc'] = 'X'
192 assert_equal a3, 'aX'
193
194 b3 = 'abc'
195 assert_raise(IndexError) do
196 b3['XX'] = 'Y'
197 end
198end
199
200assert('String#capitalize', '15.2.10.5.7') do
201 a = 'abc'
202 a.capitalize
203
204 assert_equal 'abc', a
205 assert_equal 'Abc', 'abc'.capitalize
206end
207
208assert('String#capitalize!', '15.2.10.5.8') do
209 a = 'abc'
210 a.capitalize!
211
212 assert_equal 'Abc', a
213 assert_equal nil, 'Abc'.capitalize!
214end
215
216assert('String#chomp', '15.2.10.5.9') do
217 a = 'abc'.chomp
218 b = ''.chomp
219 c = "abc\n".chomp
220 d = "abc\n\n".chomp
221 e = "abc\t".chomp("\t")
222 f = "abc\n"
223
224 f.chomp
225
226 assert_equal 'abc', a
227 assert_equal '', b
228 assert_equal 'abc', c
229 assert_equal "abc\n", d
230 assert_equal 'abc', e
231 assert_equal "abc\n", f
232end
233
234assert('String#chomp!', '15.2.10.5.10') do
235 a = 'abc'
236 b = ''
237 c = "abc\n"
238 d = "abc\n\n"
239 e = "abc\t"
240
241 a.chomp!
242 b.chomp!
243 c.chomp!
244 d.chomp!
245 e.chomp!("\t")
246
247 assert_equal 'abc', a
248 assert_equal '', b
249 assert_equal 'abc', c
250 assert_equal "abc\n", d
251 assert_equal 'abc', e
252end
253
254assert('String#chomp! uses the correct length') do
255 class A
256 def to_str
257 $s.replace("AA")
258 "A"
259 end
260 end
261
262 $s = "AAA"
263 $s.chomp!(A.new)
264 assert_equal $s, "A"
265end
266
267assert('String#chop', '15.2.10.5.11') do
268 a = ''.chop
269 b = 'abc'.chop
270 c = 'abc'
271
272 c.chop
273
274 assert_equal '', a
275 assert_equal 'ab', b
276 assert_equal 'abc', c
277end
278
279assert('String#chop(UTF-8)', '15.2.10.5.11') do
280 a = ''.chop
281 b = 'あいう'.chop
282 c = "あ\nい".chop.chop
283
284 assert_equal '', a
285 assert_equal 'あい', b
286 assert_equal 'あ', c
287end if UTF8STRING
288
289assert('String#chop!', '15.2.10.5.12') do
290 a = ''
291 b = 'abc'
292
293 a.chop!
294 b.chop!
295
296 assert_equal a, ''
297 assert_equal b, 'ab'
298end
299
300assert('String#chop!(UTF-8)', '15.2.10.5.12') do
301 a = ''
302 b = "あいうえ\n"
303 c = "あいうえ\n"
304
305 a.chop!
306 b.chop!
307 c.chop!
308 c.chop!
309
310 assert_equal a, ''
311 assert_equal b, 'あいうえ'
312 assert_equal c, 'あいう'
313end if UTF8STRING
314
315assert('String#downcase', '15.2.10.5.13') do
316 a = 'ABC'.downcase
317 b = 'ABC'
318
319 b.downcase
320
321 assert_equal 'abc', a
322 assert_equal 'ABC', b
323end
324
325assert('String#downcase!', '15.2.10.5.14') do
326 a = 'ABC'
327
328 a.downcase!
329
330 assert_equal 'abc', a
331 assert_equal nil, 'abc'.downcase!
332end
333
334assert('String#each_line', '15.2.10.5.15') do
335 a = "first line\nsecond line\nthird line"
336 list = ["first line\n", "second line\n", "third line"]
337 n_list = []
338
339 a.each_line do |line|
340 n_list << line
341 end
342
343 assert_equal list, n_list
344
345 n_list.clear
346 a.each_line("li") do |line|
347 n_list << line
348 end
349 assert_equal ["first li", "ne\nsecond li", "ne\nthird li", "ne"], n_list
350end
351
352assert('String#empty?', '15.2.10.5.16') do
353 a = ''
354 b = 'not empty'
355
356 assert_true a.empty?
357 assert_false b.empty?
358end
359
360assert('String#eql?', '15.2.10.5.17') do
361 assert_true 'abc'.eql?('abc')
362 assert_false 'abc'.eql?('cba')
363end
364
365assert('String#gsub', '15.2.10.5.18') do
366 assert_equal('aBcaBc', 'abcabc'.gsub('b', 'B'), 'gsub without block')
367 assert_equal('aBcaBc', 'abcabc'.gsub('b'){|w| w.capitalize }, 'gsub with block')
368 assert_equal('$a$a$', '#a#a#'.gsub('#', '$'), 'mruby/mruby#847')
369 assert_equal('$a$a$', '#a#a#'.gsub('#'){|w| '$' }, 'mruby/mruby#847 with block')
370 assert_equal('$$a$$', '##a##'.gsub('##', '$$'), 'mruby/mruby#847 another case')
371 assert_equal('$$a$$', '##a##'.gsub('##'){|w| '$$' }, 'mruby/mruby#847 another case with block')
372 assert_equal('A', 'a'.gsub('a', 'A'))
373 assert_equal('A', 'a'.gsub('a'){|w| w.capitalize })
374 assert_equal("<a><><>", 'a'.gsub('a', '<\0><\1><\2>'))
375 assert_equal(".h.e.l.l.o.", "hello".gsub("", "."))
376 a = []
377 assert_equal(".h.e.l.l.o.", "hello".gsub("") { |i| a << i; "." })
378 assert_equal(["", "", "", "", "", ""], a)
379 assert_raise(ArgumentError) { "".gsub }
380 assert_raise(ArgumentError) { "".gsub("", "", "") }
381end
382
383assert('String#gsub with backslash') do
384 s = 'abXcdXef'
385 assert_equal 'ab<\\>cd<\\>ef', s.gsub('X', '<\\\\>')
386 assert_equal 'ab<X>cd<X>ef', s.gsub('X', '<\\&>')
387 assert_equal 'ab<X>cd<X>ef', s.gsub('X', '<\\0>')
388 assert_equal 'ab<ab>cd<abXcd>ef', s.gsub('X', '<\\`>')
389 assert_equal 'ab<cdXef>cd<ef>ef', s.gsub('X', '<\\\'>')
390end
391
392assert('String#gsub!', '15.2.10.5.19') do
393 a = 'abcabc'
394 a.gsub!('b', 'B')
395
396 b = 'abcabc'
397 b.gsub!('b') { |w| w.capitalize }
398
399 assert_equal 'aBcaBc', a
400 assert_equal 'aBcaBc', b
401end
402
403assert('String#hash', '15.2.10.5.20') do
404 a = 'abc'
405
406 assert_equal 'abc'.hash, a.hash
407end
408
409assert('String#include?', '15.2.10.5.21') do
410 assert_true 'abc'.include?('a')
411 assert_false 'abc'.include?('d')
412end
413
414assert('String#index', '15.2.10.5.22') do
415 assert_equal 0, 'abc'.index('a')
416 assert_nil 'abc'.index('d')
417 assert_equal 3, 'abcabc'.index('a', 1)
418 assert_equal 5, "hello".index("", 5)
419 assert_equal nil, "hello".index("", 6)
420end
421
422assert('String#initialize', '15.2.10.5.23') do
423 a = ''
424 a.initialize('abc')
425 assert_equal 'abc', a
426
427 a.initialize('abcdefghijklmnopqrstuvwxyz')
428 assert_equal 'abcdefghijklmnopqrstuvwxyz', a
429end
430
431assert('String#initialize_copy', '15.2.10.5.24') do
432 a = ''
433 a.initialize_copy('abc')
434
435 assert_equal 'abc', a
436end
437
438assert('String#intern', '15.2.10.5.25') do
439 assert_equal :abc, 'abc'.intern
440end
441
442assert('String#length', '15.2.10.5.26') do
443 assert_equal 3, 'abc'.length
444end
445
446# 'String#match', '15.2.10.5.27' will be tested in mrbgems.
447
448assert('String#replace', '15.2.10.5.28') do
449 a = ''
450 a.replace('abc')
451
452 assert_equal 'abc', a
453 assert_equal 'abc', 'cba'.replace(a)
454
455 b = 'abc' * 10
456 c = ('cba' * 10).dup
457 b.replace(c);
458 c.replace(b);
459 assert_equal c, b
460
461 # shared string
462 s = "foo" * 100
463 a = s[10, 90] # create shared string
464 assert_equal("", s.replace("")) # clear
465 assert_equal("", s) # s is cleared
466 assert_not_equal("", a) # a should not be affected
467end
468
469assert('String#reverse', '15.2.10.5.29') do
470 a = 'abc'
471 a.reverse
472
473 assert_equal 'abc', a
474 assert_equal 'cba', 'abc'.reverse
475end
476
477assert('String#reverse(UTF-8)', '15.2.10.5.29') do
478 assert_equal "ち", "こんにちは世界"[3]
479 assert_equal nil, "こんにちは世界"[20]
480 assert_equal "世", "こんにちは世界"[-2]
481 assert_equal "世界", "こんにちは世界"[-2..-1]
482 assert_equal "んに", "こんにちは世界"[1,2]
483 assert_equal "世", "こんにちは世界"["世"]
484end if UTF8STRING
485
486assert('String#reverse!', '15.2.10.5.30') do
487 a = 'abc'
488 a.reverse!
489
490 assert_equal 'cba', a
491 assert_equal 'cba', 'abc'.reverse!
492end
493
494assert('String#reverse!(UTF-8)', '15.2.10.5.30') do
495 a = 'こんにちは世界!'
496 a.reverse!
497
498 assert_equal '!界世はちにんこ', a
499 assert_equal '!界世はちにんこ', 'こんにちは世界!'.reverse!
500end if UTF8STRING
501
502assert('String#rindex', '15.2.10.5.31') do
503 assert_equal 0, 'abc'.rindex('a')
504 assert_nil 'abc'.rindex('d')
505 assert_equal 0, 'abcabc'.rindex('a', 1)
506 assert_equal 3, 'abcabc'.rindex('a', 4)
507end
508
509assert('String#rindex(UTF-8)', '15.2.10.5.31') do
510 str = "こんにちは世界!\nこんにちは世界!"
511 assert_nil str.index('さ')
512 assert_equal 3, str.index('ち')
513 assert_equal 12, str.index('ち', 10)
514 assert_equal nil, str.index("さ")
515end if UTF8STRING
516
517# 'String#scan', '15.2.10.5.32' will be tested in mrbgems.
518
519assert('String#size', '15.2.10.5.33') do
520 assert_equal 3, 'abc'.size
521end
522
523assert('String#size(UTF-8)', '15.2.10.5.33') do
524 str = 'こんにちは世界!'
525 assert_equal 8, str.size
526 assert_not_equal str.bytesize, str.size
527 assert_equal 2, str[1, 2].size
528end if UTF8STRING
529
530assert('String#slice', '15.2.10.5.34') do
531 # length of args is 1
532 a = 'abc'.slice(0)
533 b = 'abc'.slice(-1)
534 c = 'abc'.slice(10)
535 d = 'abc'.slice(-10)
536
537 # length of args is 2
538 a1 = 'abc'.slice(0, -1)
539 b1 = 'abc'.slice(10, 0)
540 c1 = 'abc'.slice(-10, 0)
541 d1 = 'abc'.slice(0, 0)
542 e1 = 'abc'.slice(1, 2)
543
544 # slice of shared string
545 e11 = e1.slice(0)
546
547 # args is RegExp
548 # It will be tested in mrbgems.
549
550 # args is String
551 a3 = 'abc'.slice('bc')
552 b3 = 'abc'.slice('XX')
553
554 assert_equal 'a', a
555 assert_equal 'c', b
556 assert_nil c
557 assert_nil d
558 assert_nil a1
559 assert_nil b1
560 assert_nil c1
561 assert_equal '', d1
562 assert_equal 'bc', e1
563 assert_equal 'b', e11
564 assert_equal 'bc', a3
565 assert_nil b3
566end
567
568# TODO Broken ATM
569assert('String#split', '15.2.10.5.35') do
570 # without RegExp behavior is actually unspecified
571 assert_equal ['abc', 'abc', 'abc'], 'abc abc abc'.split
572 assert_equal ["a", "b", "c", "", "d"], 'a,b,c,,d'.split(',')
573 assert_equal ['abc', 'abc', 'abc'], 'abc abc abc'.split(nil)
574 assert_equal ['a', 'b', 'c'], 'abc'.split("")
575end
576
577assert('String#split(UTF-8)', '15.2.10.5.35') do
578 got = "こんにちは世界!".split('')
579 assert_equal ['こ', 'ん', 'に', 'ち', 'は', '世', '界', '!'], got
580 got = "こんにちは世界!".split('に')
581 assert_equal ['こん', 'ちは世界!'], got
582end if UTF8STRING
583
584assert('String#sub', '15.2.10.5.36') do
585 assert_equal 'aBcabc', 'abcabc'.sub('b', 'B')
586 assert_equal 'aBcabc', 'abcabc'.sub('b') { |w| w.capitalize }
587 assert_equal 'aa$', 'aa#'.sub('#', '$')
588 assert_equal '.abc', "abc".sub("", ".")
589
590 str = "abc"
591 miss = str.sub("X", "Z")
592 assert_equal str, miss
593 assert_not_equal str.object_id, miss.object_id
594
595 a = []
596 assert_equal '.abc', "abc".sub("") { |i| a << i; "." }
597 assert_equal [""], a
598end
599
600assert('String#sub with backslash') do
601 s = 'abXcdXef'
602 assert_equal 'ab<\\>cdXef', s.sub('X', '<\\\\>')
603 assert_equal 'ab<X>cdXef', s.sub('X', '<\\&>')
604 assert_equal 'ab<X>cdXef', s.sub('X', '<\\0>')
605 assert_equal 'ab<ab>cdXef', s.sub('X', '<\\`>')
606 assert_equal 'ab<cdXef>cdXef', s.sub('X', '<\\\'>')
607end
608
609assert('String#sub!', '15.2.10.5.37') do
610 a = 'abcabc'
611 a.sub!('b', 'B')
612
613 b = 'abcabc'
614 b.sub!('b') { |w| w.capitalize }
615
616 assert_equal 'aBcabc', a
617 assert_equal 'aBcabc', b
618end
619
620assert('String#to_f', '15.2.10.5.38') do
621 a = ''.to_f
622 b = '123456789'.to_f
623 c = '12345.6789'.to_f
624 d = '1e-2147483648'.to_f
625 e = '1e2147483648'.to_f
626
627 assert_float(0.0, a)
628 assert_float(123456789.0, b)
629 assert_float(12345.6789, c)
630 assert_float(0, d)
631 assert_float(Float::INFINITY, e)
632end
633
634assert('String#to_i', '15.2.10.5.39') do
635 a = ''.to_i
636 b = '32143'.to_i
637 c = 'a'.to_i(16)
638 d = '100'.to_i(2)
639 e = '1_000'.to_i
640
641 assert_equal 0, a
642 assert_equal 32143, b
643 assert_equal 10, c
644 assert_equal 4, d
645 assert_equal 1_000, e
646end
647
648assert('String#to_s', '15.2.10.5.40') do
649 assert_equal 'abc', 'abc'.to_s
650end
651
652assert('String#to_sym', '15.2.10.5.41') do
653 assert_equal :abc, 'abc'.to_sym
654end
655
656assert('String#upcase', '15.2.10.5.42') do
657 a = 'abc'.upcase
658 b = 'abc'
659
660 b.upcase
661
662 assert_equal 'ABC', a
663 assert_equal 'abc', b
664end
665
666assert('String#upcase!', '15.2.10.5.43') do
667 a = 'abc'
668
669 a.upcase!
670
671 assert_equal 'ABC', a
672 assert_equal nil, 'ABC'.upcase!
673
674 a = 'abcdefghijklmnopqrstuvwxyz'
675 b = a.dup
676 a.upcase!
677 b.upcase!
678 assert_equal 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', b
679end
680
681assert('String#inspect', '15.2.10.5.46') do
682 # should not raise an exception - regress #1210
683 assert_nothing_raised do
684 ("\1" * 100).inspect
685 end
686
687 assert_equal "\"\\000\"", "\0".inspect
688end
689
690# Not ISO specified
691
692assert('String interpolation (mrb_str_concat for shared strings)') do
693 a = "A" * 32
694 assert_equal "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:", "#{a}:"
695end
696
697assert('Check the usage of a NUL character') do
698 "qqq\0ppp"
699end
700
701assert('String#bytes') do
702 str1 = "hello"
703 bytes1 = [104, 101, 108, 108, 111]
704
705 str2 = "\xFF"
706 bytes2 = [0xFF]
707
708 assert_equal bytes1, str1.bytes
709 assert_equal bytes2, str2.bytes
710end
711
712assert('String#each_byte') do
713 str1 = "hello"
714 bytes1 = [104, 101, 108, 108, 111]
715 bytes2 = []
716
717 str1.each_byte {|b| bytes2 << b }
718
719 assert_equal bytes1, bytes2
720end
721
722assert('String#freeze') do
723 str = "hello"
724 str.freeze
725
726 assert_raise(RuntimeError) { str.upcase! }
727end
Note: See TracBrowser for help on using the repository browser.