* io.c (rb_open_file): encoding in mode string was ignored if perm is
[ruby-svn.git] / yarvtest / test_flow.rb
blobbc4d84e5fd33ac4a8204358d475ad669bab0b88f
2 # This test program is contributed by   George Marrows
3 # Re: [Yarv-devel] Some tests   for test_jump.rb
6 require 'yarvtest/yarvtest'
8 class TestFlow < YarvTestBase
9   def ae_flow(src, for_value=true)
10     # Tracks flow through the code
11     # A test like
12     #   begin
13     #   ensure
14     #   end
15     # gets transformed into
16     #   a = []
17     #   begin
18     #     begin; a << 1
19     #     ensure; a << 2
20     #     end; a << 3
21     #   rescue Exception
22     #     a << 99
23     #   end
24     #   a
25     # before being run. This tracks control flow through the code.
26     
27     cnt = 0
28     src = src.gsub(/(\n|$)/) { "; $a << #{cnt+=1}\n" }
29     src = "$a = []; begin; #{src}; rescue Exception; $a << 99; end; $a"
30     
31     if false#||true
32       STDERR.puts
33       STDERR.puts '#----'
34       STDERR.puts src
35       STDERR.puts '#----'
36     end
37     
38     ae(src)
39   end
41   def test_while_with_ensure
42     ae %q{
43       a = []
44       i = 0
45       begin
46         while i < 1
47           i+=1
48           begin
49             begin
50               next
51             ensure
52               a << :ok
53             end
54           ensure
55             a << :ok2
56           end
57         end
58       ensure
59         a << :last
60       end
61     }
62     ae %q{
63       a = []
64       i = 0
65       begin
66         while i < 1
67           i+=1
68           begin
69             begin
70               break
71             ensure
72               a << :ok
73             end
74           ensure
75             a << :ok2
76           end
77         end
78       ensure
79         a << :last
80       end
81     }
82     ae %q{
83       a = []
84       i = 0
85       begin
86         while i < 1
87           if i>0
88             break
89           end
90           i+=1
91           begin
92             begin
93               redo
94             ensure
95               a << :ok
96             end
97           ensure
98             a << :ok2
99           end
100         end
101       ensure
102         a << :last
103       end
104    }
105   end
106   
107   def test_ensure_normal_flow
108     ae_flow %{ 
109       begin
110       ensure
111       end }
112   end
114   def test_ensure_exception
115     ae_flow %{
116       begin
117         raise StandardError
118       ensure
119       end
120     }
121   end
123   def test_break_in_block_runs_ensure
124     ae_flow %{ 
125       [1,2].each do
126         begin
127           break
128         ensure
129         end
130       end
131     }
132   end
134   def test_next_in_block_runs_ensure
135     ae_flow %{ 
136       [1,2].each do
137         begin
138           next
139         ensure
140         end
141       end
142     }
143   end
144   def test_return_from_method_runs_ensure
145     ae_flow %{ 
146       o = "test"
147       def o.test(a)
148         return a
149       ensure
150       end
151       o.test(123)
152     }
153   end
155   def test_break_from_ifunc
156     ae %q{
157       ["a"].inject("ng"){|x,y|
158         break :ok
159       }
160     }
161     ae %q{
162       unless ''.respond_to? :lines
163         class String
164           def lines
165             self
166           end
167         end
168       end
169       
170       ('a').lines.map{|e|
171         break :ok
172       }
173     }
174     ae_flow %q{
175       ["a"].inject("ng"){|x,y|
176         break :ok
177       }
178     }
179     ae_flow %q{
180       ('a'..'b').map{|e|
181         break :ok
182       }
183     }
184   end
185   
186   def test_break_ensure_interaction1
187     # make sure that any 'break state' set up in the VM is c
188     # the time of the ensure
189     ae_flow %{ 
190       [1,2].each{
191         break
192       }
193       begin
194       ensure
195       end
196     }
197   end
198   
199   def test_break_ensure_interaction2
200     # ditto, different arrangement
201     ae_flow %{ 
202       begin
203         [1,2].each do
204           break
205         end
206       ensure
207       end
208     }
209   end
210   
211   def test_break_through_2_ensures
212     ae_flow %{ 
213       [1,2].each do
214         begin
215           begin
216             break
217           ensure
218           end
219         ensure
220         end
221       end
222     }
223   end
224   
225   def test_ensure_break_ensure
226     # break through an ensure; run 2nd normally
227     ae_flow %{ 
228       begin
229         [1,2].each do
230           begin
231             break
232           ensure
233           end
234         end
235       ensure
236       end
237     }
238   end
239   
240   def test_exception_overrides_break
241     ae_flow %{ 
242       [1,2].each do
243         begin
244           break
245         ensure
246           raise StandardError
247         end
248       end
249     }
250   end
252   def test_break_overrides_exception
253     ae_flow %{ 
254       [1,2].each do
255         begin
256           raise StandardError
257         ensure
258           break
259         end
260       end
261     }
262     ae_flow %{ 
263       [1,2].each do
264         begin
265           raise StandardError
266         rescue
267           break
268         end
269       end
270     }
271   end
273   def test_break_in_exception
274     ae_flow %q{
275       i=0
276       while i<3
277         i+=1
278         begin
279         ensure
280           break
281         end
282       end
283     }
284     ae_flow %q{
285       i=0
286       while i<3
287         i+=1
288         begin
289           raise
290         ensure
291           break
292         end
293       end
294     }
295     ae_flow %q{
296       i=0
297       while i<3
298         i+=1
299         begin
300           raise
301         rescue
302           break
303         end
304       end
305     }
306   end
308   def test_next_in_exception
309     return
310     ae_flow %q{
311       i=0
312       while i<3
313         i+=1
314         begin
315         ensure
316           next
317         end
318       end
319     }
320     ae_flow %q{
321       i=0
322       while i<3
323         i+=1
324         begin
325           raise
326         ensure
327           next
328         end
329       end
330     }
331     ae_flow %q{
332       i=0
333       while i<3
334         i+=1
335         begin
336           raise
337         rescue
338           next
339         end
340       end
341     }
342   end
344   def test_complex_break
345     ae_flow %q{
346       i = 0
347       while i<3
348         i+=1
349         j = 0
350         while j<3
351           j+=1
352           begin
353             raise
354           rescue
355             break
356           end
357         end
358       end
359     }
360     ae_flow %q{
361       i = 0
362       while i<3
363         i+=1
364         j = 0
365         while j<3
366           j+=1
367           1.times{
368             begin
369               raise
370             rescue
371               break
372             end
373           }
374         end
375       end
376     }
377     ae_flow %q{
378       i = 0
379       while i<3
380         i+=1
381         j = 0
382         while j<3
383           j+=1
384           begin
385             raise
386           ensure
387             break
388           end
389         end
390       end
391     }
392     ae_flow %q{
393       i = 0
394       while i<3
395         i+=1
396         j = 0
397         while j<3
398           j+=1
399           1.times{
400             begin
401               raise
402             ensure
403               break
404             end
405           }
406         end
407       end
408     }
409     ae_flow %q{
410       while true
411         begin
412           break
413         ensure
414           break
415         end
416       end
417     }
418     ae_flow %q{
419       while true
420         begin
421           break
422         ensure
423           raise
424         end
425       end
426     }
427   end
429   def test_jump_from_class
430     ae_flow %q{
431       3.times{
432         class C
433           break
434         end
435       }
436     }
437     ae_flow %q{
438       3.times{
439         class A
440           class B
441             break
442           end
443         end
444       }
445     }
446     ae_flow %q{
447       3.times{
448         class C
449           next
450         end
451       }
452     }
453     ae_flow %q{
454       3.times{
455         class C
456           class D
457             next
458           end
459         end
460       }
461     }
462     ae_flow %q{
463       while true
464         class C
465           break
466         end
467       end
468     }
469     ae_flow %q{
470       while true
471         class C
472           class D
473             break
474           end
475         end
476       end
477     }
478     ae_flow %q{
479       i=0
480       while i<3
481         i+=1
482         class C
483           next 10
484         end
485       end
486     }
487     ae %q{
488       1.times{
489         while true
490           class C
491             begin
492               break
493             ensure
494               break
495             end
496           end
497         end
498       }
499     }
500   end
502   def test_flow_with_cont_sp
503     ae %q{
504       def m a, b
505         a + b
506       end
507       m(1,
508         while true
509           break 2
510         end
511         )
512     }
513     ae %q{
514       def m a, b
515         a + b
516       end
517       m(1,
518         (i=0; while i<2
519            i+=1
520            class C
521              next 2
522            end
523          end; 3)
524         )
525     }
526     ae %q{
527       def m a, b
528         a+b
529       end
530       m(1, 1.times{break 3}) +
531       m(10, (1.times{next 3}; 20))
532     }
533   end
535   def test_return_in_deep_stack
536     ae_flow %q{
537       def m1 *args
538         
539       end
540       def m2
541         m1(:a, :b, (return 1; :c))
542       end
543       m2
544     }
545   end
546   
547   def test_return_in_ensure
548     ae_flow %q{
549       def m()
550         begin
551           2
552         ensure
553           return 3
554         end
555       end
556       m
557     }
558     ae_flow %q{
559       def m2
560       end
561       def m()
562         m2(begin
563              2
564            ensure
565              return 3
566            end)
567         4
568       end
569       m()
570     }
571     ae_flow %q{
572       def m
573         1
574         1.times{
575           2
576           begin
577             3
578             return
579             4
580           ensure
581             5
582           end
583           6
584         }
585         7
586       end
587       m()
588     }
589   end