OSDN Git Service

ruby-1.9.1-rc1
[splhack/AndroidRuby.git] / lib / ruby-1.9.1-rc1 / bootstraptest / test_method.rb
1 # regular argument
2 assert_equal '1',       'def m() 1 end; m()'
3 assert_equal '1',       'def m(a) a end; m(1)'
4 assert_equal '[1, 2]',  'def m(a,b) [a, b] end; m(1,2)'
5 assert_equal '[1, 2, 3]', 'def m(a,b,c) [a, b, c] end; m(1,2,3)'
6 assert_equal 'wrong number of arguments (1 for 0)', %q{
7   def m; end
8   begin
9     m(1)
10   rescue => e
11     e.message
12   end
13 }
14
15 assert_equal 'wrong number of arguments (0 for 1)', %q{
16   def m a; end
17   begin
18     m
19   rescue => e
20     e.message
21   end
22 }
23
24 # default argument
25 assert_equal '1',       'def m(x=1) x end; m()'
26 assert_equal '1',       'def m(x=7) x end; m(1)'
27 assert_equal '1',       'def m(a,x=1) x end; m(7)'
28 assert_equal '1',       'def m(a,x=7) x end; m(7,1)'
29 assert_equal '1',       'def m(a,b,x=1) x end; m(7,7)'
30 assert_equal '1',       'def m(a,b,x=7) x end; m(7,7,1)'
31 assert_equal '1',       'def m(a,x=1,y=1) x end; m(7)'
32 assert_equal '1',       'def m(a,x=1,y=1) y end; m(7)'
33 assert_equal '1',       'def m(a,x=7,y=1) x end; m(7,1)'
34 assert_equal '1',       'def m(a,x=7,y=1) y end; m(7,1)'
35 assert_equal '1',       'def m(a,x=7,y=7) x end; m(7,1,1)'
36 assert_equal '1',       'def m(a,x=7,y=7) y end; m(7,1,1)'
37
38 # rest argument
39 assert_equal '[]',      'def m(*a) a end; m().inspect'
40 assert_equal '[1]',     'def m(*a) a end; m(1).inspect'
41 assert_equal '[1, 2]',  'def m(*a) a end; m(1,2).inspect'
42 assert_equal '[]',      'def m(x,*a) a end; m(7).inspect'
43 assert_equal '[1]',     'def m(x,*a) a end; m(7,1).inspect'
44 assert_equal '[1, 2]',  'def m(x,*a) a end; m(7,1,2).inspect'
45 assert_equal '[]',      'def m(x,y,*a) a end; m(7,7).inspect'
46 assert_equal '[1]',     'def m(x,y,*a) a end; m(7,7,1).inspect'
47 assert_equal '[1, 2]',  'def m(x,y,*a) a end; m(7,7,1,2).inspect'
48 assert_equal '[]',      'def m(x,y=7,*a) a end; m(7).inspect'
49 assert_equal '[]',      'def m(x,y,z=7,*a) a end; m(7,7).inspect'
50 assert_equal '[]',      'def m(x,y,z=7,*a) a end; m(7,7,7).inspect'
51 assert_equal '[]',      'def m(x,y,z=7,zz=7,*a) a end; m(7,7,7).inspect'
52 assert_equal '[]',      'def m(x,y,z=7,zz=7,*a) a end; m(7,7,7,7).inspect'
53 assert_equal '1',       'def m(x,y,z=7,zz=1,*a) zz end; m(7,7,7).inspect'
54 assert_equal '1',       'def m(x,y,z=7,zz=1,*a) zz end; m(7,7,7).inspect'
55 assert_equal '1',       'def m(x,y,z=7,zz=7,*a) zz end; m(7,7,7,1).inspect'
56
57 # block argument
58 assert_equal 'Proc',    'def m(&block) block end; m{}.class'
59 assert_equal 'nil',     'def m(&block) block end; m().inspect'
60 assert_equal 'Proc',    'def m(a,&block) block end; m(7){}.class'
61 assert_equal 'nil',     'def m(a,&block) block end; m(7).inspect'
62 assert_equal '1',       'def m(a,&block) a end; m(1){}'
63 assert_equal 'Proc',    'def m(a,b=nil,&block) block end; m(7){}.class'
64 assert_equal 'nil',     'def m(a,b=nil,&block) block end; m(7).inspect'
65 assert_equal 'Proc',    'def m(a,b=nil,&block) block end; m(7,7){}.class'
66 assert_equal '1',       'def m(a,b=nil,&block) b end; m(7,1){}'
67 assert_equal 'Proc',    'def m(a,b=nil,*c,&block) block end; m(7){}.class'
68 assert_equal 'nil',     'def m(a,b=nil,*c,&block) block end; m(7).inspect'
69 assert_equal '1',       'def m(a,b=nil,*c,&block) a end; m(1).inspect'
70 assert_equal '1',       'def m(a,b=1,*c,&block) b end; m(7).inspect'
71 assert_equal '1',       'def m(a,b=7,*c,&block) b end; m(7,1).inspect'
72 assert_equal '[1]',     'def m(a,b=7,*c,&block) c end; m(7,7,1).inspect'
73
74 # splat
75 assert_equal '1',       'def m(a) a end; m(*[1])'
76 assert_equal '1',       'def m(x,a) a end; m(7,*[1])'
77 assert_equal '1',       'def m(x,y,a) a end; m(7,7,*[1])'
78 assert_equal '1',       'def m(a,b) a end; m(*[1,7])'
79 assert_equal '1',       'def m(a,b) b end; m(*[7,1])'
80 assert_equal '1',       'def m(x,a,b) b end; m(7,*[7,1])'
81 assert_equal '1',       'def m(x,y,a,b) b end; m(7,7,*[7,1])'
82 assert_equal '1',       'def m(a,b,c) a end; m(*[1,7,7])'
83 assert_equal '1',       'def m(a,b,c) b end; m(*[7,1,7])'
84 assert_equal '1',       'def m(a,b,c) c end; m(*[7,7,1])'
85 assert_equal '1',       'def m(x,a,b,c) a end; m(7,*[1,7,7])'
86 assert_equal '1',       'def m(x,y,a,b,c) a end; m(7,7,*[1,7,7])'
87
88 # hash argument
89 assert_equal '1',       'def m(h) h end; m(7=>1)[7]'
90 assert_equal '1',       'def m(h) h end; m(7=>1).size'
91 assert_equal '1',       'def m(h) h end; m(7=>1, 8=>7)[7]'
92 assert_equal '2',       'def m(h) h end; m(7=>1, 8=>7).size'
93 assert_equal '1',       'def m(h) h end; m(7=>1, 8=>7, 9=>7)[7]'
94 assert_equal '3',       'def m(h) h end; m(7=>1, 8=>7, 9=>7).size'
95 assert_equal '1',       'def m(x,h) h end; m(7, 7=>1)[7]'
96 assert_equal '1',       'def m(x,h) h end; m(7, 7=>1, 8=>7)[7]'
97 assert_equal '1',       'def m(x,h) h end; m(7, 7=>1, 8=>7, 9=>7)[7]'
98 assert_equal '1',       'def m(x,y,h) h end; m(7,7, 7=>1)[7]'
99 assert_equal '1',       'def m(x,y,h) h end; m(7,7, 7=>1, 8=>7)[7]'
100 assert_equal '1',       'def m(x,y,h) h end; m(7,7, 7=>1, 8=>7, 9=>7)[7]'
101
102 # block argument
103 assert_equal '1',       %q(def m(&block) mm(&block) end
104                            def mm() yield 1 end
105                            m {|a| a })
106 assert_equal '1',       %q(def m(x,&block) mm(x,&block) end
107                            def mm(x) yield 1 end
108                            m(7) {|a| a })
109 assert_equal '1',       %q(def m(x,y,&block) mm(x,y,&block) end
110                            def mm(x,y) yield 1 end
111                            m(7,7) {|a| a })
112
113 # recursive call
114 assert_equal '1',       %q(def m(n) n == 0 ? 1 : m(n-1) end; m(5))
115
116 # instance method
117 assert_equal '1',       %q(class C; def m() 1 end end;  C.new.m)
118 assert_equal '1',       %q(class C; def m(a) a end end;  C.new.m(1))
119 assert_equal '1',       %q(class C; def m(a = 1) a end end;  C.new.m)
120 assert_equal '[1]',     %q(class C; def m(*a) a end end;  C.new.m(1).inspect)
121 assert_equal '1',       %q( class C
122                               def m() mm() end
123                               def mm() 1 end
124                             end
125                             C.new.m )
126
127 # singleton method (const)
128 assert_equal '1',       %q(class C; def C.m() 1 end end;  C.m)
129 assert_equal '1',       %q(class C; def C.m(a) a end end;  C.m(1))
130 assert_equal '1',       %q(class C; def C.m(a = 1) a end end;  C.m)
131 assert_equal '[1]',     %q(class C; def C.m(*a) a end end;  C.m(1).inspect)
132 assert_equal '1',       %q(class C; end; def C.m() 1 end;  C.m)
133 assert_equal '1',       %q(class C; end; def C.m(a) a end;  C.m(1))
134 assert_equal '1',       %q(class C; end; def C.m(a = 1) a end;  C.m)
135 assert_equal '[1]',     %q(class C; end; def C.m(*a) a end;  C.m(1).inspect)
136 assert_equal '1',       %q(class C; def m() 7 end end; def C.m() 1 end;  C.m)
137 assert_equal '1',       %q( class C
138                               def C.m() mm() end
139                               def C.mm() 1 end
140                             end
141                             C.m )
142
143 # singleton method (lvar)
144 assert_equal '1',       %q(obj = Object.new; def obj.m() 1 end;  obj.m)
145 assert_equal '1',       %q(obj = Object.new; def obj.m(a) a end;  obj.m(1))
146 assert_equal '1',       %q(obj = Object.new; def obj.m(a=1) a end;  obj.m)
147 assert_equal '[1]',     %q(obj = Object.new; def obj.m(*a) a end;  obj.m(1))
148 assert_equal '1',       %q(class C; def m() 7 end; end
149                            obj = C.new
150                            def obj.m() 1 end
151                            obj.m)
152
153 # inheritance
154 assert_equal '1',       %q(class A; def m(a) a end end
155                            class B < A; end
156                            B.new.m(1))
157 assert_equal '1',       %q(class A; end
158                            class B < A; def m(a) a end end
159                            B.new.m(1))
160 assert_equal '1',       %q(class A; def m(a) a end end
161                            class B < A; end
162                            class C < B; end
163                            C.new.m(1))
164
165 # include
166 assert_equal '1',       %q(class A; def m(a) a end end
167                            module M; end
168                            class B < A; include M; end
169                            B.new.m(1))
170 assert_equal '1',       %q(class A; end
171                            module M; def m(a) a end end
172                            class B < A; include M; end
173                            B.new.m(1))
174
175 # alias
176 assert_equal '1',       %q( def a() 1 end
177                             alias m a
178                             m() )
179 assert_equal '1',       %q( class C
180                               def a() 1 end
181                               alias m a
182                             end
183                             C.new.m )
184 assert_equal '1',       %q( class C
185                               def a() 1 end
186                               alias :m a
187                             end
188                             C.new.m )
189 assert_equal '1',       %q( class C
190                               def a() 1 end
191                               alias m :a
192                             end
193                             C.new.m )
194 assert_equal '1',       %q( class C
195                               def a() 1 end
196                               alias :m :a
197                             end
198                             C.new.m )
199 assert_equal '1',       %q( class C
200                               def a() 1 end
201                               alias m a
202                               undef a
203                             end
204                             C.new.m )
205
206 # undef
207 assert_equal '1',       %q( class C
208                               def m() end
209                               undef m
210                             end
211                             begin C.new.m; rescue NoMethodError; 1 end )
212 assert_equal '1',       %q( class A
213                               def m() end
214                             end
215                             class C < A
216                               def m() end
217                               undef m
218                             end
219                             begin C.new.m; rescue NoMethodError; 1 end )
220 assert_equal '1',       %q( class A; def a() end end   # [yarv-dev:999]
221                             class B < A
222                               def b() end
223                               undef a, b
224                             end
225                             begin B.new.a; rescue NoMethodError; 1 end )
226 assert_equal '1',       %q( class A; def a() end end   # [yarv-dev:999]
227                             class B < A
228                               def b() end
229                               undef a, b
230                             end
231                             begin B.new.b; rescue NoMethodError; 1 end )
232
233 assert_equal '3',  %q{
234   def m1
235     1
236   end
237   alias m2 m1
238   alias :"#{'m3'}" m1
239   m1 + m2 + m3
240 }, '[ruby-dev:32308]'
241 assert_equal '1', %q{
242   def foobar
243   end
244   undef :"foo#{:bar}"
245   1
246 }, '[ruby-dev:32308]'
247 assert_equal '1', %q{
248   def foobar
249     1
250   end
251   alias :"bar#{:baz}" :"foo#{:bar}"
252   barbaz
253 }, '[ruby-dev:32308]'
254
255 # private
256 assert_equal '1',       %q( class C
257                               def m() mm() end
258                               def mm() 1 end
259                               private :mm
260                             end
261                             C.new.m )
262 assert_equal '1',       %q( class C
263                               def m() 7 end
264                               private :m
265                             end
266                             begin C.m; rescue NoMethodError; 1 end )
267 assert_equal '1',       %q( class C
268                               def C.m() mm() end
269                               def C.mm() 1 end
270                               private_class_method :mm
271                             end
272                             C.m )
273 assert_equal '1',       %q( class C
274                               def C.m() 7 end
275                               private_class_method :m
276                             end
277                             begin C.m; rescue NoMethodError; 1 end )
278 assert_equal '1',       %q( class C; def m() 1 end end
279                             C.new.m   # cache
280                             class C
281                               alias mm m; private :mm
282                             end
283                             C.new.m
284                             begin C.new.mm; 7; rescue NoMethodError; 1 end )
285
286 # nested method
287 assert_equal '1',       %q( class C
288                               def m
289                                 def mm() 1 end
290                               end
291                             end
292                             C.new.m
293                             C.new.mm )
294 assert_equal '1',       %q( class C
295                               def m
296                                 def mm() 1 end
297                               end
298                             end
299                             instance_eval "C.new.m; C.new.mm" )
300
301 # method_missing
302 assert_equal ':m',      %q( class C
303                               def method_missing(mid, *args) mid end
304                             end
305                             C.new.m.inspect )
306 assert_equal ':mm',     %q( class C
307                               def method_missing(mid, *args) mid end
308                             end
309                             C.new.mm.inspect )
310 assert_equal '[1, 2]',  %q( class C
311                               def method_missing(mid, *args) args end
312                             end
313                             C.new.m(1,2).inspect )
314 assert_equal '1',       %q( class C
315                               def method_missing(mid, *args) yield 1 end
316                             end
317                             C.new.m {|a| a })
318 assert_equal 'nil',     %q( class C
319                               def method_missing(mid, *args, &block) block end
320                             end
321                             C.new.m.inspect )
322
323 # send
324 assert_equal '1',       %q( class C; def m() 1 end end;
325                             C.new.__send__(:m) )
326 assert_equal '1',       %q( class C; def m() 1 end end;
327                             C.new.send(:m) )
328 assert_equal '1',       %q( class C; def m(a) a end end;
329                             C.new.send(:m,1) )
330 assert_equal '1',       %q( class C; def m(a,b) a end end;
331                             C.new.send(:m,1,7) )
332 assert_equal '1',       %q( class C; def m(x,a=1) a end end;
333                             C.new.send(:m,7) )
334 assert_equal '1',       %q( class C; def m(x,a=7) a end end;
335                             C.new.send(:m,7,1) )
336 assert_equal '[1, 2]',  %q( class C; def m(*a) a end end;
337                             C.new.send(:m,1,2).inspect )
338 assert_equal '1',       %q( class C; def m() 7 end; private :m end
339                             begin C.new.public_send(:m); rescue NoMethodError; 1 end )
340 assert_equal '1',       %q( class C; def m() 1 end; private :m end
341                             C.new.send(:m) )
342
343 # with block
344 assert_equal '[[:ok1, :foo], [:ok2, :foo, :bar]]',
345 %q{
346   class C
347     def [](a)
348       $ary << [yield, a]
349     end
350     def []=(a, b)
351       $ary << [yield, a, b]
352     end
353   end
354
355   $ary = []
356   C.new[:foo, &lambda{:ok1}]
357   C.new[:foo, &lambda{:ok2}] = :bar
358   $ary
359 }
360
361 # with
362 assert_equal '[:ok1, [:ok2, 11]]', %q{
363   class C
364     def []
365       $ary << :ok1
366       10
367     end
368     def []=(a)
369       $ary << [:ok2, a]
370     end
371   end
372   $ary = []
373   C.new[]+=1
374   $ary
375 }
376
377 # splat and block arguments
378 assert_equal %q{[[[:x, :y, :z], NilClass], [[1, :x, :y, :z], NilClass], [[1, 2, :x, :y, :z], NilClass], [[:obj], NilClass], [[1, :obj], NilClass], [[1, 2, :obj], NilClass], [[], Proc], [[1], Proc], [[1, 2], Proc], [[], Proc], [[1], Proc], [[1, 2], Proc], [[:x, :y, :z], Proc], [[1, :x, :y, :z], Proc], [[1, 2, :x, :y, :z], Proc]]}, %q{
379 def m(*args, &b)
380   $result << [args, b.class]
381 end
382 $result = []
383 ary = [:x, :y, :z]
384 obj = :obj
385 b = Proc.new{}
386
387 m(*ary)
388 m(1,*ary)
389 m(1,2,*ary)
390 m(*obj)
391 m(1,*obj)
392 m(1,2,*obj)
393 m(){}
394 m(1){}
395 m(1,2){}
396 m(&b)
397 m(1,&b)
398 m(1,2,&b)
399 m(*ary,&b)
400 m(1,*ary,&b)
401 m(1,2,*ary,&b)
402 $result
403 }
404
405 # post test
406 assert_equal %q{[1, 2, :o1, :o2, [], 3, 4, NilClass, nil, nil]}, %q{
407 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
408   x, y = :x, :y if $foo
409   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
410 end
411 ; m(1, 2, 3, 4)}
412
413 assert_equal %q{[1, 2, 3, :o2, [], 4, 5, NilClass, nil, nil]}, %q{
414 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
415   x, y = :x, :y if $foo
416   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
417 end
418 ; m(1, 2, 3, 4, 5)}
419
420 assert_equal %q{[1, 2, 3, 4, [], 5, 6, NilClass, nil, nil]}, %q{
421 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
422   x, y = :x, :y if $foo
423   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
424 end
425 ; m(1, 2, 3, 4, 5, 6)}
426
427 assert_equal %q{[1, 2, 3, 4, [5], 6, 7, NilClass, nil, nil]}, %q{
428 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
429   x, y = :x, :y if $foo
430   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
431 end
432 ; m(1, 2, 3, 4, 5, 6, 7)}
433
434 assert_equal %q{[1, 2, 3, 4, [5, 6], 7, 8, NilClass, nil, nil]}, %q{
435 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
436   x, y = :x, :y if $foo
437   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
438 end
439 ; m(1, 2, 3, 4, 5, 6, 7, 8)}
440
441 assert_equal %q{[1, 2, 3, 4, [5, 6, 7], 8, 9, NilClass, nil, nil]}, %q{
442 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
443   x, y = :x, :y if $foo
444   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
445 end
446 ; m(1, 2, 3, 4, 5, 6, 7, 8, 9)}
447
448 assert_equal %q{[1, 2, 3, 4, [5, 6, 7, 8], 9, 10, NilClass, nil, nil]}, %q{
449 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
450   x, y = :x, :y if $foo
451   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
452 end
453 ; m(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)}
454
455 assert_equal %q{[1, 2, 3, 4, [5, 6, 7, 8, 9], 10, 11, NilClass, nil, nil]}, %q{
456 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
457   x, y = :x, :y if $foo
458   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
459 end
460 ; m(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)}
461
462 assert_equal %q{[1, 2, :o1, :o2, [], 3, 4, Proc, nil, nil]}, %q{
463 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
464   x, y = :x, :y if $foo
465   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
466 end
467 ; m(1, 2, 3, 4){}}
468
469 assert_equal %q{[1, 2, 3, :o2, [], 4, 5, Proc, nil, nil]}, %q{
470 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
471   x, y = :x, :y if $foo
472   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
473 end
474 ; m(1, 2, 3, 4, 5){}}
475
476 assert_equal %q{[1, 2, 3, 4, [], 5, 6, Proc, nil, nil]}, %q{
477 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
478   x, y = :x, :y if $foo
479   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
480 end
481 ; m(1, 2, 3, 4, 5, 6){}}
482
483 assert_equal %q{[1, 2, 3, 4, [5], 6, 7, Proc, nil, nil]}, %q{
484 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
485   x, y = :x, :y if $foo
486   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
487 end
488 ; m(1, 2, 3, 4, 5, 6, 7){}}
489
490 assert_equal %q{[1, 2, 3, 4, [5, 6], 7, 8, Proc, nil, nil]}, %q{
491 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
492   x, y = :x, :y if $foo
493   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
494 end
495 ; m(1, 2, 3, 4, 5, 6, 7, 8){}}
496
497 assert_equal %q{[1, 2, 3, 4, [5, 6, 7], 8, 9, Proc, nil, nil]}, %q{
498 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
499   x, y = :x, :y if $foo
500   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
501 end
502 ; m(1, 2, 3, 4, 5, 6, 7, 8, 9){}}
503
504 assert_equal %q{[1, 2, 3, 4, [5, 6, 7, 8], 9, 10, Proc, nil, nil]}, %q{
505 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
506   x, y = :x, :y if $foo
507   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
508 end
509 ; m(1, 2, 3, 4, 5, 6, 7, 8, 9, 10){}}
510
511 assert_equal %q{[1, 2, 3, 4, [5, 6, 7, 8, 9], 10, 11, Proc, nil, nil]}, %q{
512 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2, &b)
513   x, y = :x, :y if $foo
514   [m1, m2, o1, o2, r, p1, p2, b.class, x, y]
515 end
516 ; m(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11){}}
517
518 assert_equal %q{[1, 2, :o1, :o2, [], 3, 4, nil, nil]}, %q{
519 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2)
520   x, y = :x, :y if $foo
521   [m1, m2, o1, o2, r, p1, p2, x, y]
522 end
523 ; m(1, 2, 3, 4)}
524
525 assert_equal %q{[1, 2, 3, :o2, [], 4, 5, nil, nil]}, %q{
526 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2)
527   x, y = :x, :y if $foo
528   [m1, m2, o1, o2, r, p1, p2, x, y]
529 end
530 ; m(1, 2, 3, 4, 5)}
531
532 assert_equal %q{[1, 2, 3, 4, [], 5, 6, nil, nil]}, %q{
533 def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2)
534   x, y = :x, :y if $foo
535   [m1, m2, o1, o2, r, p1, p2, x, y]
536 end
537 ; m(1, 2, 3, 4, 5, 6)}
538
539
540 #
541 # super
542 #
543 =begin
544 # below programs are generated by this program:
545
546 BASE = <<EOS__
547 class C0; def m *args; [:C0_m, args]; end; end
548 class C1 < C0; <TEST>; super; end; end
549 EOS__
550
551 tests = {
552 %q{
553   def m
554 } => %q{
555   C1.new.m
556 },
557 #
558 %q{
559   def m a
560 } => %q{
561   C1.new.m 1
562 },
563 %q{
564   def m a
565     a = :a
566 } => %q{
567   C1.new.m 1
568 },
569 #
570 %q{
571   def m a, o=:o
572 } => %q{
573   C1.new.m 1
574   C1.new.m 1, 2
575 },
576 %q{
577   def m a, o=:o
578     a = :a
579 } => %q{
580   C1.new.m 1
581   C1.new.m 1, 2
582 },
583 %q{
584   def m a, o=:o
585     o = :x
586 } => %q{
587   C1.new.m 1
588   C1.new.m 1, 2
589 },
590 #
591 %q{
592   def m a, *r
593 } => %q{
594   C1.new.m 1
595   C1.new.m 1, 2
596   C1.new.m 1, 2, 3
597 },
598 %q{
599   def m a, *r
600     r = [:x, :y]
601 } => %q{
602   C1.new.m 1
603   C1.new.m 1, 2
604   C1.new.m 1, 2, 3
605 },
606 #
607 %q{
608   def m a, o=:o, *r
609 } => %q{
610   C1.new.m 1
611   C1.new.m 1, 2
612   C1.new.m 1, 2, 3
613   C1.new.m 1, 2, 3, 4
614 },
615 #
616 %q{
617   def m a, o=:o, *r, &b
618 } => %q{
619   C1.new.m 1
620   C1.new.m 1, 2
621   C1.new.m 1, 2, 3
622   C1.new.m 1, 2, 3, 4
623   C1.new.m(1){}
624   C1.new.m(1, 2){}
625   C1.new.m(1, 2, 3){}
626   C1.new.m(1, 2, 3, 4){}
627 },
628 #
629 "def m(m1, m2, o1=:o1, o2=:o2, p1, p2)" =>
630 %q{
631 C1.new.m(1,2,3,4)
632 C1.new.m(1,2,3,4,5)
633 C1.new.m(1,2,3,4,5,6)
634 },
635 #
636 "def m(m1, m2, *r, p1, p2)" =>
637 %q{
638 C1.new.m(1,2,3,4)
639 C1.new.m(1,2,3,4,5)
640 C1.new.m(1,2,3,4,5,6)
641 C1.new.m(1,2,3,4,5,6,7)
642 C1.new.m(1,2,3,4,5,6,7,8)
643 },
644 #
645 "def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2)" =>
646 %q{
647 C1.new.m(1,2,3,4)
648 C1.new.m(1,2,3,4,5)
649 C1.new.m(1,2,3,4,5,6)
650 C1.new.m(1,2,3,4,5,6,7)
651 C1.new.m(1,2,3,4,5,6,7,8)
652 C1.new.m(1,2,3,4,5,6,7,8,9)
653 },
654
655 ###
656 }
657
658
659 tests.each{|setup, methods| setup = setup.dup; setup.strip!
660   setup = BASE.gsub(/<TEST>/){setup}
661   methods.split(/\n/).each{|m| m = m.dup; m.strip!
662     next if m.empty?
663     expr = "#{setup}; #{m}"
664     result = eval(expr)
665     puts "assert_equal %q{#{result.inspect}}, %q{\n#{expr}}"
666     puts
667   }
668 }
669
670 =end
671
672 assert_equal %q{[:C0_m, [1, 2, :o1, :o2, 3, 4]]}, %q{
673 class C0; def m *args; [:C0_m, args]; end; end
674 class C1 < C0; def m(m1, m2, o1=:o1, o2=:o2, p1, p2); super; end; end
675 ; C1.new.m(1,2,3,4)}
676
677 assert_equal %q{[:C0_m, [1, 2, 3, :o2, 4, 5]]}, %q{
678 class C0; def m *args; [:C0_m, args]; end; end
679 class C1 < C0; def m(m1, m2, o1=:o1, o2=:o2, p1, p2); super; end; end
680 ; C1.new.m(1,2,3,4,5)}
681
682 assert_equal %q{[:C0_m, [1, 2, 3, 4, 5, 6]]}, %q{
683 class C0; def m *args; [:C0_m, args]; end; end
684 class C1 < C0; def m(m1, m2, o1=:o1, o2=:o2, p1, p2); super; end; end
685 ; C1.new.m(1,2,3,4,5,6)}
686
687 assert_equal %q{[:C0_m, [1, :o]]}, %q{
688 class C0; def m *args; [:C0_m, args]; end; end
689 class C1 < C0; def m a, o=:o, *r; super; end; end
690 ; C1.new.m 1}
691
692 assert_equal %q{[:C0_m, [1, 2]]}, %q{
693 class C0; def m *args; [:C0_m, args]; end; end
694 class C1 < C0; def m a, o=:o, *r; super; end; end
695 ; C1.new.m 1, 2}
696
697 assert_equal %q{[:C0_m, [1, 2, 3]]}, %q{
698 class C0; def m *args; [:C0_m, args]; end; end
699 class C1 < C0; def m a, o=:o, *r; super; end; end
700 ; C1.new.m 1, 2, 3}
701
702 assert_equal %q{[:C0_m, [1, 2, 3, 4]]}, %q{
703 class C0; def m *args; [:C0_m, args]; end; end
704 class C1 < C0; def m a, o=:o, *r; super; end; end
705 ; C1.new.m 1, 2, 3, 4}
706
707 assert_equal %q{[:C0_m, [:a]]}, %q{
708 class C0; def m *args; [:C0_m, args]; end; end
709 class C1 < C0; def m a
710     a = :a; super; end; end
711 ; C1.new.m 1}
712
713 assert_equal %q{[:C0_m, [1, 2, 3, 4]]}, %q{
714 class C0; def m *args; [:C0_m, args]; end; end
715 class C1 < C0; def m(m1, m2, *r, p1, p2); super; end; end
716 ; C1.new.m(1,2,3,4)}
717
718 assert_equal %q{[:C0_m, [1, 2, 3, 4, 5]]}, %q{
719 class C0; def m *args; [:C0_m, args]; end; end
720 class C1 < C0; def m(m1, m2, *r, p1, p2); super; end; end
721 ; C1.new.m(1,2,3,4,5)}
722
723 assert_equal %q{[:C0_m, [1, 2, 3, 4, 5, 6]]}, %q{
724 class C0; def m *args; [:C0_m, args]; end; end
725 class C1 < C0; def m(m1, m2, *r, p1, p2); super; end; end
726 ; C1.new.m(1,2,3,4,5,6)}
727
728 assert_equal %q{[:C0_m, [1, 2, 3, 4, 5, 6, 7]]}, %q{
729 class C0; def m *args; [:C0_m, args]; end; end
730 class C1 < C0; def m(m1, m2, *r, p1, p2); super; end; end
731 ; C1.new.m(1,2,3,4,5,6,7)}
732
733 assert_equal %q{[:C0_m, [1, 2, 3, 4, 5, 6, 7, 8]]}, %q{
734 class C0; def m *args; [:C0_m, args]; end; end
735 class C1 < C0; def m(m1, m2, *r, p1, p2); super; end; end
736 ; C1.new.m(1,2,3,4,5,6,7,8)}
737
738 assert_equal %q{[:C0_m, [1, :o]]}, %q{
739 class C0; def m *args; [:C0_m, args]; end; end
740 class C1 < C0; def m a, o=:o, *r, &b; super; end; end
741 ; C1.new.m 1}
742
743 assert_equal %q{[:C0_m, [1, 2]]}, %q{
744 class C0; def m *args; [:C0_m, args]; end; end
745 class C1 < C0; def m a, o=:o, *r, &b; super; end; end
746 ; C1.new.m 1, 2}
747
748 assert_equal %q{[:C0_m, [1, 2, 3]]}, %q{
749 class C0; def m *args; [:C0_m, args]; end; end
750 class C1 < C0; def m a, o=:o, *r, &b; super; end; end
751 ; C1.new.m 1, 2, 3}
752
753 assert_equal %q{[:C0_m, [1, 2, 3, 4]]}, %q{
754 class C0; def m *args; [:C0_m, args]; end; end
755 class C1 < C0; def m a, o=:o, *r, &b; super; end; end
756 ; C1.new.m 1, 2, 3, 4}
757
758 assert_equal %q{[:C0_m, [1, :o]]}, %q{
759 class C0; def m *args; [:C0_m, args]; end; end
760 class C1 < C0; def m a, o=:o, *r, &b; super; end; end
761 ; C1.new.m(1){}}
762
763 assert_equal %q{[:C0_m, [1, 2]]}, %q{
764 class C0; def m *args; [:C0_m, args]; end; end
765 class C1 < C0; def m a, o=:o, *r, &b; super; end; end
766 ; C1.new.m(1, 2){}}
767
768 assert_equal %q{[:C0_m, [1, 2, 3]]}, %q{
769 class C0; def m *args; [:C0_m, args]; end; end
770 class C1 < C0; def m a, o=:o, *r, &b; super; end; end
771 ; C1.new.m(1, 2, 3){}}
772
773 assert_equal %q{[:C0_m, [1, 2, 3, 4]]}, %q{
774 class C0; def m *args; [:C0_m, args]; end; end
775 class C1 < C0; def m a, o=:o, *r, &b; super; end; end
776 ; C1.new.m(1, 2, 3, 4){}}
777
778 assert_equal %q{[:C0_m, [1, :x]]}, %q{
779 class C0; def m *args; [:C0_m, args]; end; end
780 class C1 < C0; def m a, o=:o
781     o = :x; super; end; end
782 ; C1.new.m 1}
783
784 assert_equal %q{[:C0_m, [1, :x]]}, %q{
785 class C0; def m *args; [:C0_m, args]; end; end
786 class C1 < C0; def m a, o=:o
787     o = :x; super; end; end
788 ; C1.new.m 1, 2}
789
790 assert_equal %q{[:C0_m, [:a, :o]]}, %q{
791 class C0; def m *args; [:C0_m, args]; end; end
792 class C1 < C0; def m a, o=:o
793     a = :a; super; end; end
794 ; C1.new.m 1}
795
796 assert_equal %q{[:C0_m, [:a, 2]]}, %q{
797 class C0; def m *args; [:C0_m, args]; end; end
798 class C1 < C0; def m a, o=:o
799     a = :a; super; end; end
800 ; C1.new.m 1, 2}
801
802 assert_equal %q{[:C0_m, [1]]}, %q{
803 class C0; def m *args; [:C0_m, args]; end; end
804 class C1 < C0; def m a; super; end; end
805 ; C1.new.m 1}
806
807 assert_equal %q{[:C0_m, [1, :x, :y]]}, %q{
808 class C0; def m *args; [:C0_m, args]; end; end
809 class C1 < C0; def m a, *r
810     r = [:x, :y]; super; end; end
811 ; C1.new.m 1}
812
813 assert_equal %q{[:C0_m, [1, :x, :y]]}, %q{
814 class C0; def m *args; [:C0_m, args]; end; end
815 class C1 < C0; def m a, *r
816     r = [:x, :y]; super; end; end
817 ; C1.new.m 1, 2}
818
819 assert_equal %q{[:C0_m, [1, :x, :y]]}, %q{
820 class C0; def m *args; [:C0_m, args]; end; end
821 class C1 < C0; def m a, *r
822     r = [:x, :y]; super; end; end
823 ; C1.new.m 1, 2, 3}
824
825 assert_equal %q{[:C0_m, [1, 2, :o1, :o2, 3, 4]]}, %q{
826 class C0; def m *args; [:C0_m, args]; end; end
827 class C1 < C0; def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2); super; end; end
828 ; C1.new.m(1,2,3,4)}
829
830 assert_equal %q{[:C0_m, [1, 2, 3, :o2, 4, 5]]}, %q{
831 class C0; def m *args; [:C0_m, args]; end; end
832 class C1 < C0; def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2); super; end; end
833 ; C1.new.m(1,2,3,4,5)}
834
835 assert_equal %q{[:C0_m, [1, 2, 3, 4, 5, 6]]}, %q{
836 class C0; def m *args; [:C0_m, args]; end; end
837 class C1 < C0; def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2); super; end; end
838 ; C1.new.m(1,2,3,4,5,6)}
839
840 assert_equal %q{[:C0_m, [1, 2, 3, 4, 5, 6, 7]]}, %q{
841 class C0; def m *args; [:C0_m, args]; end; end
842 class C1 < C0; def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2); super; end; end
843 ; C1.new.m(1,2,3,4,5,6,7)}
844
845 assert_equal %q{[:C0_m, [1, 2, 3, 4, 5, 6, 7, 8]]}, %q{
846 class C0; def m *args; [:C0_m, args]; end; end
847 class C1 < C0; def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2); super; end; end
848 ; C1.new.m(1,2,3,4,5,6,7,8)}
849
850 assert_equal %q{[:C0_m, [1, 2, 3, 4, 5, 6, 7, 8, 9]]}, %q{
851 class C0; def m *args; [:C0_m, args]; end; end
852 class C1 < C0; def m(m1, m2, o1=:o1, o2=:o2, *r, p1, p2); super; end; end
853 ; C1.new.m(1,2,3,4,5,6,7,8,9)}
854
855 assert_equal %q{[:C0_m, [1]]}, %q{
856 class C0; def m *args; [:C0_m, args]; end; end
857 class C1 < C0; def m a, *r; super; end; end
858 ; C1.new.m 1}
859
860 assert_equal %q{[:C0_m, [1, 2]]}, %q{
861 class C0; def m *args; [:C0_m, args]; end; end
862 class C1 < C0; def m a, *r; super; end; end
863 ; C1.new.m 1, 2}
864
865 assert_equal %q{[:C0_m, [1, 2, 3]]}, %q{
866 class C0; def m *args; [:C0_m, args]; end; end
867 class C1 < C0; def m a, *r; super; end; end
868 ; C1.new.m 1, 2, 3}
869
870 assert_equal %q{[:C0_m, []]}, %q{
871 class C0; def m *args; [:C0_m, args]; end; end
872 class C1 < C0; def m; super; end; end
873 ; C1.new.m}
874
875 assert_equal %q{[:C0_m, [1, :o]]}, %q{
876 class C0; def m *args; [:C0_m, args]; end; end
877 class C1 < C0; def m a, o=:o; super; end; end
878 ; C1.new.m 1}
879
880 assert_equal %q{[:C0_m, [1, 2]]}, %q{
881 class C0; def m *args; [:C0_m, args]; end; end
882 class C1 < C0; def m a, o=:o; super; end; end
883 ; C1.new.m 1, 2}
884
885 assert_equal %q{[:ok, :ok, :ok, :ok, :ok, :ok, :ng, :ng]}, %q{
886   $ans = []
887   class Foo
888     def m
889     end
890   end
891
892   c1 = c2 = nil
893
894   lambda{
895     $SAFE = 4
896     c1 = Class.new{
897       def m
898       end
899     }
900     c2 = Class.new(Foo){
901       alias mm m
902     }
903   }.call
904
905   def test
906     begin
907       yield
908     rescue SecurityError
909       $ans << :ok
910     else
911       $ans << :ng
912     end
913   end
914
915   o1 = c1.new
916   o2 = c2.new
917   
918   test{o1.m}
919   test{o2.mm}
920   test{o1.send :m}
921   test{o2.send :mm}
922   test{o1.public_send :m}
923   test{o2.public_send :mm}
924   test{o1.method(:m).call}
925   test{o2.method(:mm).call}
926   $ans
927 }
928
929 assert_equal 'ok', %q{
930   class C
931     def x=(n)
932     end
933     def m
934       self.x = :ok
935     end
936   end
937   C.new.m
938 }
939
940 assert_equal 'ok', %q{
941   proc{
942     $SAFE = 1
943     class C
944       def m
945         :ok
946       end
947     end
948   }.call
949   C.new.m
950 }, '[ruby-core:11998]'
951
952 assert_equal 'ok', %q{
953   proc{
954     $SAFE = 2
955     class C
956       def m
957         :ok
958       end
959     end
960   }.call
961   C.new.m
962 }, '[ruby-core:11998]'
963
964 assert_equal 'ok', %q{
965   proc{
966     $SAFE = 3
967     class C
968       def m
969         :ng
970       end
971     end
972   }.call
973   begin
974     C.new.m
975   rescue SecurityError
976     :ok
977   end
978 }, '[ruby-core:11998]'
979
980 assert_equal 'ok', %q{
981   class B
982     def m() :fail end
983   end
984   class C < B
985     undef m
986     begin
987       remove_method :m
988     rescue NameError
989     end
990   end
991   begin
992     C.new.m
993   rescue NameError
994     :ok
995   end
996 }, '[ruby-dev:31816], [ruby-dev:31817]'
997
998 assert_normal_exit %q{
999   begin
1000     Process.setrlimit(Process::RLIMIT_STACK, 4_202_496)
1001     # FreeBSD fails this less than 4M + 8K bytes.
1002   rescue Exception
1003     exit
1004   end
1005   class C
1006     attr "a" * (10*1024*1024)
1007   end
1008 }, '[ruby-dev:31818]'
1009
1010 assert_equal 'ok', %q{
1011   class Module
1012     def define_method2(name, &block)
1013       define_method(name, &block)
1014     end
1015   end
1016   class C
1017     define_method2(:m) {|x, y| :fail }
1018   end
1019   begin
1020     C.new.m([1,2])
1021   rescue ArgumentError
1022     :ok
1023   end
1024 }
1025
1026 assert_not_match /method_missing/, %q{
1027   STDERR.reopen(STDOUT)
1028   variable_or_mehtod_not_exist
1029 }
1030
1031 assert_equal '[false, false, false, false, true, true]', %q{
1032   class C
1033     define_method(:foo) {
1034       block_given?
1035     }
1036   end
1037
1038   C.new.foo {}
1039
1040   class D
1041     def foo
1042       D.module_eval{
1043         define_method(:m1){
1044           block_given?
1045         }
1046       }
1047     end
1048     def bar
1049       D.module_eval{
1050         define_method(:m2){
1051           block_given?
1052         }
1053       }
1054     end
1055   end
1056
1057   D.new.foo
1058   D.new.bar{}
1059   [C.new.foo, C.new.foo{}, D.new.m1, D.new.m1{}, D.new.m2, D.new.m2{}]
1060 }, '[ruby-core:14813]'
1061
1062 assert_equal 'ok', %q{
1063   class Foo
1064     define_method(:foo) do |&b|
1065       b.call
1066     end
1067   end
1068   Foo.new.foo do
1069     break :ok
1070   end
1071 }, '[ruby-dev:36028]'
1072
1073 assert_equal '[1, 2, [3, 4]]', %q{
1074   def regular(a, b, *c)
1075     [a, b, c]
1076   end
1077   regular(*[], 1, *[], *[2, 3], *[], 4) 
1078 }, '[ruby-core:19413]'
1079
1080 assert_equal '[1, [:foo, 3, 4, :foo]]', %q{
1081   def regular(a, *b)
1082     [a, b]
1083   end
1084   a = b = [:foo]
1085   regular(1, *a, *[3, 4], *b)
1086 }
1087
1088 assert_equal '["B", "A"]', %q{
1089   class A
1090     def m
1091       'A'
1092     end
1093   end
1094
1095   class B < A
1096     define_method(:m) do    
1097       ['B', super()]
1098     end
1099   end
1100
1101   class C < B
1102   end
1103
1104   C.new.m
1105 }
1106
1107 assert_equal 'ok', %q{
1108   module Foo
1109     def foo
1110       begin
1111         super
1112       rescue NoMethodError
1113         :ok
1114       end
1115     end
1116     module_function :foo
1117   end
1118   Foo.foo
1119 }, '[ruby-dev:37587]'
1120
1121 assert_equal 'Object#foo', %q{
1122   class Object
1123     def self.foo
1124       "Object.foo"
1125     end
1126     def foo
1127       "Object#foo"
1128     end
1129   end
1130
1131   module Foo
1132     def foo
1133       begin
1134         super
1135       rescue NoMethodError
1136         :ok
1137       end
1138     end
1139     module_function :foo
1140   end
1141   Foo.foo
1142 }, '[ruby-dev:37587]'