* transcode.c (econv_primitive_convert): add output_byteoffset
[ruby-svn.git] / yarvtest / test_jump.rb
blob4c806380a80d44e1f4f5ecf0100727c45104bae7
1 require 'yarvtest/yarvtest'
3 class TestJump < YarvTestBase
5   def test_redo
6     ae %q{
7       def m
8         yield + 10
9       end
10       i=0
11       m{
12         if i>10
13           i*i
14         else
15           i+=1
16           redo
17         end
18       }
19     }
20   end
22   def test_next
23     ae %q{
24       def m
25         yield
26         :ok
27       end
28       i=0
29       m{
30         if i>10
31           i*i
32         else
33           i+=1
34           next
35         end
36       }
37     }
38   end
40   def test_next_with_val
41     ae %q{
42       def m
43         yield
44       end
46       m{
47         next :ok
48       }
49     }
50   end
51   
52   def test_return
53     ae %q{
54       def m
55         return 3
56       end
57       m
58     }
59     
60     ae %q{
61       def m
62         :ng1
63         mm{
64           return :ok
65         }
66         :ng2
67       end
69       def mm
70         :ng3
71         yield
72         :ng4
73       end
74       m
75     }
76   end
78   def test_return2
79     ae %q{
80       $i = 0
81       def m
82         begin
83           iter{
84             return
85           }
86         ensure
87           $i = 100
88         end
89       end
90       
91       def iter
92         yield
93       end
94       m
95       $i
96     }
97   end
99   def test_return3
100     ae %q{
101       def m
102         begin
103           raise
104         rescue
105           return :ok
106         end
107         :ng
108       end
109       m
110     }
111   end
112   
113   def test_break
114     ae %q{
115       def m
116         :ng1
117         mm{
118           yield
119         }
120         :ng2
121       end
123       def mm
124         :ng3
125         yield
126         :ng4
127       end
129       m{
130         break :ok
131       }
132     }
133   end
135   def test_exception_and_break
136     ae %q{
137       def m
138         yield
139       end
140       
141       m{
142         begin
143         ensure
144           break :ok
145         end
146       }
147     }
148   end
149   
150   def test_retry
151     # this test can't run on ruby 1.9(yarv can do)
152     %q{
153       def m a
154         mm{
155           yield
156         }
157       end
159       def mm
160         yield
161       end
163       i=0
164       m(i+=1){
165         retry if i<10
166         :ok
167       }
168     }
170     ae %q{
171       def m a
172         yield
173       end
174       
175       i=0
176       m(i+=1){
177         retry if i<10
178         :ok
179       }
180     }
181   end
183   def test_complex_jump
184     ae %q{
185       module Enumerable
186         def all_?
187           self.each{|e|
188             unless yield(e)
189               return false
190             end
191           }
192           true
193         end
194       end
196       xxx = 0
197       [1,2].each{|bi|
198         [3,4].each{|bj|
199           [true, nil, true].all_?{|be| be}
200           break
201         }
202         xxx += 1
203       }
204       xxx
205     }
206   end
208   def test_return_from
209     ae %q{
210       def m
211         begin
212           raise
213         rescue
214           return 1
215         end
216       end
217       
218       m
219     }
220     ae %q{
221       def m
222         begin
223           #
224         ensure
225           return 1
226         end
227       end
228       
229       m
230     }
231   end
233   def test_break_from_times
234     ae %q{
235       3.times{
236         break :ok
237       }
238     }
239   end
241   def test_catch_and_throw
242     ae %q{
243       catch(:foo){
244         throw :foo
245       }
246     }
247     ae %q{
248       catch(:foo){
249         throw :foo, false
250       }
251     }
252     ae %q{
253       catch(:foo){
254         throw :foo, nil
255       }
256     }
257     ae %q{
258       catch(:foo){
259         throw :foo, :ok
260       }
261     }
262     ae %q{
263       catch(:foo){
264         1.times{
265           throw :foo
266         }
267       }
268     }
269     ae %q{
270       catch(:foo){
271         1.times{
272           throw :foo, :ok
273         }
274       }
275     }
276     ae %q{
277       catch(:foo){
278         catch(:bar){
279           throw :foo, :ok
280         }
281         :ng
282       }
283     }
284     ae %q{
285       catch(:foo){
286         catch(:bar){
287           1.times{
288             throw :foo, :ok
289           }
290         }
291         :ng
292       }
293     }
294   end