source: EcnlProtoTool/trunk/mruby-1.2.0/test/t/string.rb@ 270

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

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 14.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#chop', '15.2.10.5.11') do
255 a = ''.chop
256 b = 'abc'.chop
257 c = 'abc'
258
259 c.chop
260
261 assert_equal '', a
262 assert_equal 'ab', b
263 assert_equal 'abc', c
264end
265
266assert('String#chop(UTF-8)', '15.2.10.5.11') do
267 a = ''.chop
268 b = 'あいう'.chop
269 c = "あ\nい".chop.chop
270
271 assert_equal '', a
272 assert_equal 'あい', b
273 assert_equal 'あ', c
274end if UTF8STRING
275
276assert('String#chop!', '15.2.10.5.12') do
277 a = ''
278 b = 'abc'
279
280 a.chop!
281 b.chop!
282
283 assert_equal a, ''
284 assert_equal b, 'ab'
285end
286
287assert('String#chop!(UTF-8)', '15.2.10.5.12') do
288 a = ''
289 b = "あいうえ\n"
290 c = "あいうえ\n"
291
292 a.chop!
293 b.chop!
294 c.chop!
295 c.chop!
296
297 assert_equal a, ''
298 assert_equal b, 'あいうえ'
299 assert_equal c, 'あいう'
300end if UTF8STRING
301
302assert('String#downcase', '15.2.10.5.13') do
303 a = 'ABC'.downcase
304 b = 'ABC'
305
306 b.downcase
307
308 assert_equal 'abc', a
309 assert_equal 'ABC', b
310end
311
312assert('String#downcase!', '15.2.10.5.14') do
313 a = 'ABC'
314
315 a.downcase!
316
317 assert_equal 'abc', a
318 assert_equal nil, 'abc'.downcase!
319end
320
321assert('String#each_line', '15.2.10.5.15') do
322 a = "first line\nsecond line\nthird line"
323 list = ["first line\n", "second line\n", "third line"]
324 n_list = []
325
326 a.each_line do |line|
327 n_list << line
328 end
329
330 assert_equal list, n_list
331end
332
333assert('String#empty?', '15.2.10.5.16') do
334 a = ''
335 b = 'not empty'
336
337 assert_true a.empty?
338 assert_false b.empty?
339end
340
341assert('String#eql?', '15.2.10.5.17') do
342 assert_true 'abc'.eql?('abc')
343 assert_false 'abc'.eql?('cba')
344end
345
346assert('String#gsub', '15.2.10.5.18') do
347 assert_equal('aBcaBc', 'abcabc'.gsub('b', 'B'), 'gsub without block')
348 assert_equal('aBcaBc', 'abcabc'.gsub('b'){|w| w.capitalize }, 'gsub with block')
349 assert_equal('$a$a$', '#a#a#'.gsub('#', '$'), 'mruby/mruby#847')
350 assert_equal('$a$a$', '#a#a#'.gsub('#'){|w| '$' }, 'mruby/mruby#847 with block')
351 assert_equal('$$a$$', '##a##'.gsub('##', '$$'), 'mruby/mruby#847 another case')
352 assert_equal('$$a$$', '##a##'.gsub('##'){|w| '$$' }, 'mruby/mruby#847 another case with block')
353 assert_equal('A', 'a'.gsub('a', 'A'))
354 assert_equal('A', 'a'.gsub('a'){|w| w.capitalize })
355end
356
357assert('String#gsub with backslash') do
358 s = 'abXcdXef'
359 assert_equal 'ab<\\>cd<\\>ef', s.gsub('X', '<\\\\>')
360 assert_equal 'ab<X>cd<X>ef', s.gsub('X', '<\\&>')
361 assert_equal 'ab<X>cd<X>ef', s.gsub('X', '<\\0>')
362 assert_equal 'ab<ab>cd<abXcd>ef', s.gsub('X', '<\\`>')
363 assert_equal 'ab<cdXef>cd<ef>ef', s.gsub('X', '<\\\'>')
364end
365
366assert('String#gsub!', '15.2.10.5.19') do
367 a = 'abcabc'
368 a.gsub!('b', 'B')
369
370 b = 'abcabc'
371 b.gsub!('b') { |w| w.capitalize }
372
373 assert_equal 'aBcaBc', a
374 assert_equal 'aBcaBc', b
375end
376
377assert('String#hash', '15.2.10.5.20') do
378 a = 'abc'
379
380 assert_equal 'abc'.hash, a.hash
381end
382
383assert('String#include?', '15.2.10.5.21') do
384 assert_true 'abc'.include?(97)
385 assert_false 'abc'.include?(100)
386 assert_true 'abc'.include?('a')
387 assert_false 'abc'.include?('d')
388end
389
390assert('String#index', '15.2.10.5.22') do
391 assert_equal 0, 'abc'.index('a')
392 assert_nil 'abc'.index('d')
393 assert_equal 3, 'abcabc'.index('a', 1)
394end
395
396assert('String#initialize', '15.2.10.5.23') do
397 a = ''
398 a.initialize('abc')
399 assert_equal 'abc', a
400
401 a.initialize('abcdefghijklmnopqrstuvwxyz')
402 assert_equal 'abcdefghijklmnopqrstuvwxyz', a
403end
404
405assert('String#initialize_copy', '15.2.10.5.24') do
406 a = ''
407 a.initialize_copy('abc')
408
409 assert_equal 'abc', a
410end
411
412assert('String#intern', '15.2.10.5.25') do
413 assert_equal :abc, 'abc'.intern
414end
415
416assert('String#length', '15.2.10.5.26') do
417 assert_equal 3, 'abc'.length
418end
419
420# 'String#match', '15.2.10.5.27' will be tested in mrbgems.
421
422assert('String#replace', '15.2.10.5.28') do
423 a = ''
424 a.replace('abc')
425
426 assert_equal 'abc', a
427 assert_equal 'abc', 'cba'.replace(a)
428
429 b = 'abc' * 10
430 c = ('cba' * 10).dup
431 b.replace(c);
432 c.replace(b);
433 assert_equal c, b
434
435 # shared string
436 s = "foo" * 100
437 a = s[10, 90] # create shared string
438 assert_equal("", s.replace("")) # clear
439 assert_equal("", s) # s is cleared
440 assert_not_equal("", a) # a should not be affected
441end
442
443assert('String#reverse', '15.2.10.5.29') do
444 a = 'abc'
445 a.reverse
446
447 assert_equal 'abc', a
448 assert_equal 'cba', 'abc'.reverse
449end
450
451assert('String#reverse(UTF-8)', '15.2.10.5.29') do
452 assert_equal "ち", "こんにちは世界"[3]
453 assert_equal nil, "こんにちは世界"[20]
454 assert_equal "世", "こんにちは世界"[-2]
455 assert_equal "世界", "こんにちは世界"[-2..-1]
456 assert_equal "んに", "こんにちは世界"[1,2]
457 assert_equal "世", "こんにちは世界"["世"]
458end if UTF8STRING
459
460assert('String#reverse!', '15.2.10.5.30') do
461 a = 'abc'
462 a.reverse!
463
464 assert_equal 'cba', a
465 assert_equal 'cba', 'abc'.reverse!
466end
467
468assert('String#reverse!(UTF-8)', '15.2.10.5.30') do
469 a = 'こんにちは世界!'
470 a.reverse!
471
472 assert_equal '!界世はちにんこ', a
473 assert_equal '!界世はちにんこ', 'こんにちは世界!'.reverse!
474end if UTF8STRING
475
476assert('String#rindex', '15.2.10.5.31') do
477 assert_equal 0, 'abc'.rindex('a')
478 assert_nil 'abc'.rindex('d')
479 assert_equal 0, 'abcabc'.rindex('a', 1)
480 assert_equal 3, 'abcabc'.rindex('a', 4)
481end
482
483assert('String#rindex(UTF-8)', '15.2.10.5.31') do
484 str = "こんにちは世界!\nこんにちは世界!"
485 assert_nil str.index('さ')
486 assert_equal 3, str.index('ち')
487 assert_equal 12, str.index('ち', 10)
488 assert_equal nil, str.index("さ")
489end if UTF8STRING
490
491# 'String#scan', '15.2.10.5.32' will be tested in mrbgems.
492
493assert('String#size', '15.2.10.5.33') do
494 assert_equal 3, 'abc'.size
495end
496
497assert('String#size(UTF-8)', '15.2.10.5.33') do
498 str = 'こんにちは世界!'
499 assert_equal 8, str.size
500 assert_not_equal str.bytesize, str.size
501 assert_equal 2, str[1, 2].size
502end if UTF8STRING
503
504assert('String#slice', '15.2.10.5.34') do
505 # length of args is 1
506 a = 'abc'.slice(0)
507 b = 'abc'.slice(-1)
508 c = 'abc'.slice(10)
509 d = 'abc'.slice(-10)
510
511 # length of args is 2
512 a1 = 'abc'.slice(0, -1)
513 b1 = 'abc'.slice(10, 0)
514 c1 = 'abc'.slice(-10, 0)
515 d1 = 'abc'.slice(0, 0)
516 e1 = 'abc'.slice(1, 2)
517
518 # slice of shared string
519 e11 = e1.slice(0)
520
521 # args is RegExp
522 # It will be tested in mrbgems.
523
524 # args is String
525 a3 = 'abc'.slice('bc')
526 b3 = 'abc'.slice('XX')
527
528 assert_equal 'a', a
529 assert_equal 'c', b
530 assert_nil c
531 assert_nil d
532 assert_nil a1
533 assert_nil b1
534 assert_nil c1
535 assert_equal '', d1
536 assert_equal 'bc', e1
537 assert_equal 'b', e11
538 assert_equal 'bc', a3
539 assert_nil b3
540end
541
542# TODO Broken ATM
543assert('String#split', '15.2.10.5.35') do
544 # without RegExp behavior is actually unspecified
545 assert_equal ['abc', 'abc', 'abc'], 'abc abc abc'.split
546 assert_equal ["a", "b", "c", "", "d"], 'a,b,c,,d'.split(',')
547 assert_equal ['abc', 'abc', 'abc'], 'abc abc abc'.split(nil)
548 assert_equal ['a', 'b', 'c'], 'abc'.split("")
549end
550
551assert('String#split(UTF-8)', '15.2.10.5.35') do
552 got = "こんにちは世界!".split('')
553 assert_equal ['こ', 'ん', 'に', 'ち', 'は', '世', '界', '!'], got
554 got = "こんにちは世界!".split('に')
555 assert_equal ['こん', 'ちは世界!'], got
556end if UTF8STRING
557
558assert('String#sub', '15.2.10.5.36') do
559 assert_equal 'aBcabc', 'abcabc'.sub('b', 'B')
560 assert_equal 'aBcabc', 'abcabc'.sub('b') { |w| w.capitalize }
561 assert_equal 'aa$', 'aa#'.sub('#', '$')
562end
563
564assert('String#sub with backslash') do
565 s = 'abXcdXef'
566 assert_equal 'ab<\\>cdXef', s.sub('X', '<\\\\>')
567 assert_equal 'ab<X>cdXef', s.sub('X', '<\\&>')
568 assert_equal 'ab<X>cdXef', s.sub('X', '<\\0>')
569 assert_equal 'ab<ab>cdXef', s.sub('X', '<\\`>')
570 assert_equal 'ab<cdXef>cdXef', s.sub('X', '<\\\'>')
571end
572
573assert('String#sub!', '15.2.10.5.37') do
574 a = 'abcabc'
575 a.sub!('b', 'B')
576
577 b = 'abcabc'
578 b.sub!('b') { |w| w.capitalize }
579
580 assert_equal 'aBcabc', a
581 assert_equal 'aBcabc', b
582end
583
584assert('String#to_f', '15.2.10.5.38') do
585 a = ''.to_f
586 b = '123456789'.to_f
587 c = '12345.6789'.to_f
588
589 assert_float(0.0, a)
590 assert_float(123456789.0, b)
591 assert_float(12345.6789, c)
592end
593
594assert('String#to_i', '15.2.10.5.39') do
595 a = ''.to_i
596 b = '32143'.to_i
597 c = 'a'.to_i(16)
598 d = '100'.to_i(2)
599 e = '1_000'.to_i
600
601 assert_equal 0, a
602 assert_equal 32143, b
603 assert_equal 10, c
604 assert_equal 4, d
605 assert_equal 1_000, e
606end
607
608assert('String#to_s', '15.2.10.5.40') do
609 assert_equal 'abc', 'abc'.to_s
610end
611
612assert('String#to_sym', '15.2.10.5.41') do
613 assert_equal :abc, 'abc'.to_sym
614end
615
616assert('String#upcase', '15.2.10.5.42') do
617 a = 'abc'.upcase
618 b = 'abc'
619
620 b.upcase
621
622 assert_equal 'ABC', a
623 assert_equal 'abc', b
624end
625
626assert('String#upcase!', '15.2.10.5.43') do
627 a = 'abc'
628
629 a.upcase!
630
631 assert_equal 'ABC', a
632 assert_equal nil, 'ABC'.upcase!
633
634 a = 'abcdefghijklmnopqrstuvwxyz'
635 b = a.dup
636 a.upcase!
637 b.upcase!
638 assert_equal 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', b
639end
640
641assert('String#inspect', '15.2.10.5.46') do
642 # should not raise an exception - regress #1210
643 assert_nothing_raised do
644 ("\1" * 100).inspect
645 end
646
647 assert_equal "\"\\000\"", "\0".inspect
648end
649
650# Not ISO specified
651
652assert('String interpolation (mrb_str_concat for shared strings)') do
653 a = "A" * 32
654 assert_equal "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA:", "#{a}:"
655end
656
657assert('Check the usage of a NUL character') do
658 "qqq\0ppp"
659end
660
661assert('String#bytes') do
662 str1 = "hello"
663 bytes1 = [104, 101, 108, 108, 111]
664
665 str2 = "\xFF"
666 bytes2 = [0xFF]
667
668 assert_equal bytes1, str1.bytes
669 assert_equal bytes2, str2.bytes
670end
671
672assert('String#each_byte') do
673 str1 = "hello"
674 bytes1 = [104, 101, 108, 108, 111]
675 bytes2 = []
676
677 str1.each_byte {|b| bytes2 << b }
678
679 assert_equal bytes1, bytes2
680end
681
682assert('String#freeze') do
683 str = "hello"
684 str.freeze
685
686 assert_raise(RuntimeError) { str.upcase! }
687end
688
Note: See TracBrowser for help on using the repository browser.