* transcode.c (econv_primitive_convert): add output_byteoffset
[ruby-svn.git] / yarvtest / test_block.rb
blobeae8b077fea77c11ce652d6e02239743ed2278cd
1 require 'yarvtest/yarvtest'
3 class TestBlock < YarvTestBase
4   def test_simple
5     ae %q(
6       def m
7         yield
8       end
9       m{
10         1
11       }
12     )
13   end
15   def test_param
16     ae %q(
17       def m
18         yield 1
19       end
20       m{|ib|
21         ib*2
22       }
23     )
24     
25     ae %q(
26       def m
27         yield 12345, 67890
28       end
29       m{|ib,jb|
30         ib*2+jb
31       }
32     )
33   end
35   def test_param2
36     ae %q{
37       def iter
38         yield 10
39       end
41       a = nil
42       [iter{|a|
43         a
44       }, a]
45     }
46     ae %q{
47       def iter
48         yield 10
49       end
51       iter{|a|
52         iter{|a|
53           a + 1
54         } + a
55       }
56     }
57     ae %q{
58       def iter
59         yield 10, 20, 30, 40
60       end
62       a = b = c = d = nil
63       iter{|a, b, c, d|
64         [a, b, c, d]
65       } + [a, b, c, d]
66     }
67     ae %q{
68       def iter
69         yield 10, 20, 30, 40
70       end
72       a = b = nil
73       iter{|a, b, c, d|
74         [a, b, c, d]
75       } + [a, b]
76     }
77     ae %q{
78       def iter
79         yield 10, 20, 30, 40
80       end
82       a = nil
83       iter{|a, $b, @c, d|
84         [a, $b]
85       } + [a, $b, @c]
86     } if false # 1.9 doesn't support expr block parameters
87   end
89   def test_param3
90     if false
91       # TODO: Ruby 1.9 doesn't support expr block parameter
92       ae %q{
93         h = {}
94         [1].each{|h[:foo]|}
95         h
96       }
97       ae %q{
98         obj = Object.new
99         def obj.x=(y)
100         $ans = y
101       end
102       [1].each{|obj.x|}
103         $ans
104       }
105     end
106   end
108   def test_blocklocal
109     ae %q{
110       1.times{
111         begin
112           a = 1
113         ensure
114           foo = nil
115         end
116       }
117     }
118   end
120   def test_simplenest
121     ae %q(
122       def m
123         yield 123
124       end
125       m{|ib|
126         m{|jb|
127           ib*jb
128         }
129       }
130     )
131   end
133   def test_simplenest2
134     ae %q(
135       def m a
136         yield a
137       end
138       m(1){|ib|
139         m(2){|jb|
140           ib*jb
141         }
142       }
143     )
144   end
146   def test_nest2
147     ae %q(
148       def m
149         yield
150       end
151       def n
152         yield
153       end
155       m{
156         n{
157           100
158         }
159       }
160     )
162     ae %q(
163       def m
164         yield 1
165       end
166       
167       m{|ib|
168         m{|jb|
169           i = 20
170         }
171       }
172     )
174     ae %q(
175       def m
176         yield 1
177       end
178       
179       m{|ib|
180         m{|jb|
181           ib = 20
182           kb = 2
183         }
184       }
185     )
187     ae %q(
188       def iter1
189         iter2{
190           yield
191         }
192       end
193       
194       def iter2
195         yield
196       end
197       
198       iter1{
199         jb = 2
200         iter1{
201           jb = 3
202         }
203         jb
204       }
205     )
206     
207     ae %q(
208       def iter1
209         iter2{
210           yield
211         }
212       end
213       
214       def iter2
215         yield
216       end
217       
218       iter1{
219         jb = 2
220         iter1{
221           jb
222         }
223         jb
224       }
225     )
226   end
228   def test_ifunc
229     ae %q{
230       (1..3).to_a
231     }
233     ae %q{
234       (1..3).map{|e|
235         e * 4
236       }
237     }
239     ae %q{
240       class C
241         include Enumerable
242         def each
243           [1,2,3].each{|e|
244             yield e
245           }
246         end
247       end
248       
249       C.new.to_a
250     }
252     ae %q{
253       class C
254         include Enumerable
255         def each
256           [1,2,3].each{|e|
257             yield e
258           }
259         end
260       end
261       
262       C.new.map{|e|
263         e + 3
264       }
265     }
266   end
268   def test_times
269     ae %q{
270       sum = 0
271       3.times{|ib|
272         2.times{|jb|
273           sum += ib + jb
274         }}
275       sum
276     }
277     ae %q{
278       3.times{|bl|
279         break 10
280       }
281     }
282   end
284   def test_for
285     ae %q{
286       sum = 0
287       for x in [1, 2, 3]
288         sum += x
289       end
290       sum
291     }
292     ae %q{
293       sum = 0
294       for x in (1..5)
295         sum += x
296       end
297       sum
298     }
299     ae %q{
300       sum = 0
301       for x in []
302         sum += x
303       end
304       sum
305     }
306     ae %q{
307       ans = []
308       1.times{
309         for n in 1..3
310           a = n
311           ans << a
312         end
313       }
314     }
315     ae %q{
316       ans = []
317       for m in 1..3
318         for n in 1..3
319           a = [m, n]
320           ans << a
321         end
322       end
323     }
324   end
325   
326   def test_unmatched_params
327     ae %q{
328       def iter
329         yield 1,2,3
330       end
332       iter{|i, j|
333         [i, j]
334       }
335     }
336     ae %q{
337       def iter
338         yield 1
339       end
341       iter{|i, j|
342         [i, j]
343       }
344     }
345   end
347   def test_rest
348     # TODO: known bug
349     #ae %q{
350     #  def iter
351     #    yield 1, 2
352     #  end
353     #
354     #  iter{|a, |
355     #    [a]
356     #  }
357     #}
358     ae %q{
359       def iter
360         yield 1, 2
361       end
363       iter{|a, *b|
364         [a, b]
365       }
366     }
367     ae %q{
368       def iter
369         yield 1, 2
370       end
372       iter{|*a|
373         [a]
374       }
375     }
376     ae %q{
377       def iter
378         yield 1, 2
379       end
381       iter{|a, b, *c|
382         [a, b, c]
383       }
384     }
385     ae %q{
386       def iter
387         yield 1, 2
388       end
390       iter{|a, b, c, *d|
391         [a, b, c, d]
392       }
393     }
394   end
396   def test_param_and_locals
397     ae %q{
398       $a = []
399       
400       def iter
401         yield 1
402       end
403       
404       def m
405         x = iter{|x|
406           $a << x
407           y = 0
408         }
409       end
410       m
411       $a
412     }
413   end
415   def test_c_break
416     ae %q{
417       [1,2,3].find{|x| x == 2}
418     }
419     ae %q{
420       class E
421         include Enumerable
422         def each(&block)
423           [1, 2, 3].each(&block)
424         end
425       end
426       E.new.find {|x| x == 2 }
427     }
428   end