* transcode.c (econv_primitive_convert): add output_byteoffset
[ruby-svn.git] / yarvtest / test_syntax.rb
bloba15159acdf2914a3f505cb3d480bbd29c9d9fa2c
1 require 'yarvtest/yarvtest'
3 # test of syntax
4 class TestSYNTAX < YarvTestBase
6   def test_if_unless
7     ae %q(if true  then 1 ; end)
8     ae %q(if false then 1 ; end)
9     ae %q(if true  then 1 ; else; 2; end)
10     ae %q(if false then 1 ; else; 2; end)
11     ae %q(if true  then   ; elsif true then ; 1 ; end)
12     ae %q(if false then   ; elsif true then ; 1 ; end)
14     ae %q(unless true  then 1 ; end)
15     ae %q(unless false then 1 ; end)
16     ae %q(unless true  then 1 ; else; 2; end)
17     ae %q(unless false then 1 ; else; 2; end)
19     ae %q(1 if true)
20     ae %q(1 if false)
21     ae %q(1 if nil)
22     
23     ae %q(1 unless true)
24     ae %q(1 unless false)
25     ae %q(1 unless nil)
26   end
28   def test_while_until
29     ae %q(
30       i = 0
31       while i < 10
32         i+=1
33       end)
35     ae %q(
36       i = 0
37       while i < 10
38         i+=1
39       end; i)
41     ae %q(
42       i = 0
43       until i > 10
44         i+=1
45       end)
47     ae %q(
48       i = 0
49       until i > 10
50         i+=1
51       end; i)
52     # 
53     ae %q{
54       i = 0
55       begin
56         i+=1
57       end while false
58       i
59     }
60     ae %q{
61       i = 0
62       begin
63         i+=1
64       end until true
65       i
66     }
67   end
69   def test_and
70     ae %q(1 && 2 && 3 && 4)
71     ae %q(1 && nil && 3 && 4)
72     ae %q(1 && 2 && 3 && nil)
73     ae %q(1 && 2 && 3 && false)
75     ae %q(1 and 2 and 3 and 4)
76     ae %q(1 and nil and 3 and 4)
77     ae %q(1 and 2 and 3 and nil)
78     ae %q(1 and 2 and 3 and false)
79     ae %q(nil && true)
80     ae %q(false && true)
82   end
83   
84   def test_or
85     ae %q(1 || 2 || 3 || 4)
86     ae %q(1 || false || 3 || 4)
87     ae %q(nil || 2 || 3 || 4)
88     ae %q(false || 2 || 3 || 4)
89     ae %q(nil || false || nil || false)
91     ae %q(1 or 2 or 3 or 4)
92     ae %q(1 or false or 3 or 4)
93     ae %q(nil or 2 or 3 or 4)
94     ae %q(false or 2 or 3 or 4)
95     ae %q(nil or false or nil or false)
96   end
98   def test_case
99     ae %q(
100       case 1
101       when 2
102         :ng
103       end)
104       
105     ae %q(
106       case 1
107       when 10,20,30
108         :ng1
109       when 1,2,3
110         :ok
111       when 100,200,300
112         :ng2
113       else
114         :elseng
115       end)
116     ae %q(
117       case 123
118       when 10,20,30
119         :ng1
120       when 1,2,3
121         :ng2
122       when 100,200,300
123         :ng3
124       else
125         :elseok
126       end
127     )
128     ae %q(
129       case 'test'
130       when /testx/
131         :ng1
132       when /test/
133         :ok
134       when /tetxx/
135         :ng2
136       else
137         :ng_else
138       end
139     )
140     ae %q(
141       case Object.new
142       when Object
143         :ok
144       end
145     )
146     ae %q(
147       case Object
148       when Object.new
149         :ng
150       else
151         :ok
152       end
153     )
154     ae %q{
155       case 'test'
156       when 'tes'
157         :ng
158       when 'te'
159         :ng
160       else
161         :ok
162       end
163     }
164     ae %q{
165       case 'test'
166       when 'tes'
167         :ng
168       when 'te'
169         :ng
170       when 'test'
171         :ok
172       end
173     }
174     ae %q{
175       case 'test'
176       when 'tes'
177         :ng
178       when /te/
179         :ng
180       else
181         :ok
182       end
183     }
184     ae %q{
185       case 'test'
186       when 'tes'
187         :ng
188       when /test/
189         :ok
190       else
191         :ng
192       end
193     }
194     ae %q{
195       def test(arg)
196         case 1
197         when 2
198           3
199         end
200         return arg
201       end
202       
203       test(100)
204     }
205   end
207   def test_case_splat
208     ae %q{
209       ary = [1, 2]
210       case 1
211       when *ary
212         :ok
213       else
214         :ng
215       end
216     }
217     ae %q{
218       ary = [1, 2]
219       case 3
220       when *ary
221         :ng
222       else
223         :ok
224       end
225     }
226     ae %q{
227       ary = [1, 2]
228       case 1
229       when :x, *ary
230         :ok
231       when :z
232         :ng1
233       else
234         :ng2
235       end
236     }
237     ae %q{
238       ary = [1, 2]
239       case 3
240       when :x, *ary
241         :ng1
242       when :z
243         :ng2
244       else
245         :ok
246       end
247     }
248   end
250   def test_when
251     ae %q(
252       case
253       when 1==2, 2==3
254         :ng1
255       when false, 4==5
256         :ok
257       when false
258         :ng2
259       else
260         :elseng
261       end
262     )
264     ae %q(
265       case
266       when nil, nil
267         :ng1
268       when 1,2,3
269         :ok
270       when false, false
271         :ng2
272       else
273         :elseng
274       end
275     )
276       
277     ae %q(
278       case
279       when nil
280         :ng1
281       when false
282         :ng2
283       else
284         :elseok
285       end)
286       
287     ae %q{
288       case
289       when 1
290       end
291     }
293     ae %q{
294       r = nil
295       ary = []
296       case
297       when false
298         r = :ng1
299       when false, false
300         r = :ng2
301       when *ary
302         r = :ng3
303       when false, *ary
304         r = :ng4
305       when true, *ary
306         r = :ok
307       end
308       r
309     }
310   end
312   def test_when_splat
313     ae %q{
314       ary = []
315       case
316       when false, *ary
317         :ng
318       else
319         :ok
320       end
321     }
322     ae %q{
323       ary = [false, nil]
324       case
325       when *ary
326         :ng
327       else
328         :ok
329       end
330     }
331     ae %q{
332       ary = [false, nil]
333       case
334       when *ary
335         :ng
336       when true
337         :ok
338       else
339         :ng2
340       end
341     }
342     ae %q{
343       ary = [false, nil]
344       case
345       when *ary
346         :ok
347       else
348         :ng
349       end
350     }
351     ae %q{
352       ary = [false, true]
353       case
354       when *ary
355         :ok
356       else
357         :ng
358       end
359     }
360     ae %q{
361       ary = [false, true]
362       case
363       when false, false
364       when false, *ary
365         :ok
366       else
367         :ng
368       end
369     }
370   end
372   def test_flipflop
373     ae %q{
374       sum = 0
375       30.times{|ib|
376         if ib % 10 == 0 .. true
377           sum += ib
378         end
379       }
380       sum
381     }
382     ae %q{
383       sum = 0
384       30.times{|ib|
385         if ib % 10 == 0 ... true
386           sum += ib
387         end
388       }
389       sum
390     }
391     ae %q{
392       t = nil
393       unless ''.respond_to? :lines
394         class String
395           def lines
396             self
397           end
398         end
399       end
400       
401       "this must not print
402       Type: NUM
403       123
404       456
405       Type: ARP
406       aaa
407       bbb
408       \f
409       this must not print
410       hoge
411       Type: ARP
412       aaa
413       bbb
414       ".lines.each{|l|
415         if (t = l[/^Type: (.*)/, 1])..(/^\f/ =~ l)
416           p [t, l]
417         end
418       }
419     }
420   end
422   def test_defined_vars
423     ae %q{
424       defined?(nil) + defined?(self) +
425         defined?(true) + defined?(false)
426     }
427     #ae %q{
428     #  a = 1
429     #  defined?(a) # yarv returns "in block" in eval context
430     #}
431     ae %q{
432       defined?(@a)
433     }
434     ae %q{
435       @a = 1
436       defined?(@a)
437     }
438     ae %q{
439       defined?(@@a)
440     }
441     ae %q{
442       @@a = 1
443       defined?(@@a)
444     }
445     ae %q{
446       defined?($a)
447     }
448     ae %q{
449       $a = 1
450       defined?($a)
451     }
452     ae %q{
453       defined?(C_definedtest)
454     }
455     ae %q{
456       C_definedtest = 1
457       defined?(C_definedtest)
458     } do
459       remove_const :C_definedtest
460     end
461     
462     ae %q{
463       defined?(::C_definedtest)
464     }
465     ae %q{
466       C_definedtest = 1
467       defined?(::C_definedtest)
468     } do
469       remove_const :C_definedtest
470     end
472     ae %q{
473       defined?(C_definedtestA::C_definedtestB::C_definedtestC)
474     }
475     ae %q{
476       class C_definedtestA
477         class C_definedtestB
478           C_definedtestC = 1
479         end
480       end
481       defined?(C_definedtestA::C_definedtestB::C_definedtestC)
482     } do
483       remove_const :C_definedtestA
484     end
485   end
487   def test_defined_method
488     ae %q{
489       defined?(m)
490     }
491     ae %q{
492       def m
493       end
494       defined?(m)
495     }
496     
497     ae %q{
498       defined?(a.class)
499     }
500     ae %q{
501       a = 1
502       defined?(a.class)
503     }
504     ae %q{
505       class C
506         def test
507           [defined?(m1()), defined?(self.m1), defined?(C.new.m1),
508            defined?(m2()), defined?(self.m2), defined?(C.new.m2),
509            defined?(m3()), defined?(self.m3), defined?(C.new.m3)]
510         end
511         def m1
512         end
513         private
514         def m2
515         end
516         protected
517         def m3
518         end
519       end
520       C.new.test + [defined?(C.new.m3)]
521     }
522     ae %q{
523       $ans = [defined?($1), defined?($2), defined?($3), defined?($4)]
524       /(a)(b)/ =~ 'ab'
525       $ans + [defined?($1), defined?($2), defined?($3), defined?($4)]
526     }
527   end
528   
529   def test_condition
530     ae %q{
532       def make_perm ary, num
533         if num == 1
534           ary.map{|e| [e]}
535         else
536           base = make_perm(ary, num-1)
537           res  = []
538           base.each{|b|
539             ary.each{|e|
540               res << [e] + b
541             }
542           }
543           res
544         end
545       end
546       
547       def each_test
548         conds = make_perm(['fv', 'tv'], 3)
549         bangs = make_perm(['', '!'], 3)
550         exprs = make_perm(['and', 'or'], 3)
551         ['if', 'unless'].each{|syn|
552           conds.each{|cs|
553             bangs.each{|bs|
554               exprs.each{|es|
555                 yield(syn, cs, bs, es)
556               }
557             }
558           }
559         }
560       end
561       
562       fv = false
563       tv = true
564       
565       $ans = []
566       each_test{|syn, conds, bangs, exprs|
567         c1, c2, c3 = conds
568         bang1, bang2, bang3 = bangs
569         e1, e2 = exprs
570         eval %Q{
571           #{syn} #{bang1}#{c1} #{e1} #{bang2}#{c2} #{e2} #{bang3}#{c3}
572             $ans << :then
573           else
574             $ans << :false
575           end
576         }
577       }
578     
579       each_test{|syn, conds, bangs, exprs|
580         c1, c2, c3 = conds
581         bang1, bang2, bang3 = bangs
582         e1, e2 = exprs
583         eval %Q{
584           #{syn} #{bang1}#{c1} #{e1} #{bang2}#{c2} #{e2} #{bang3}#{c3}
585             $ans << :then
586           end
587           $ans << :sep
588         }
589       }
590       $ans
591     }
592   end