ruby/yarvtest/test_syntax.rb

595 строки
9.2 KiB
Ruby

require 'yarvtest/yarvtest'
# test of syntax
class TestSYNTAX < YarvTestBase
def test_if_unless
ae %q(if true then 1 ; end)
ae %q(if false then 1 ; end)
ae %q(if true then 1 ; else; 2; end)
ae %q(if false then 1 ; else; 2; end)
ae %q(if true then ; elsif true then ; 1 ; end)
ae %q(if false then ; elsif true then ; 1 ; end)
ae %q(unless true then 1 ; end)
ae %q(unless false then 1 ; end)
ae %q(unless true then 1 ; else; 2; end)
ae %q(unless false then 1 ; else; 2; end)
ae %q(1 if true)
ae %q(1 if false)
ae %q(1 if nil)
ae %q(1 unless true)
ae %q(1 unless false)
ae %q(1 unless nil)
end
def test_while_until
ae %q(
i = 0
while i < 10
i+=1
end)
ae %q(
i = 0
while i < 10
i+=1
end; i)
ae %q(
i = 0
until i > 10
i+=1
end)
ae %q(
i = 0
until i > 10
i+=1
end; i)
#
ae %q{
i = 0
begin
i+=1
end while false
i
}
ae %q{
i = 0
begin
i+=1
end until true
i
}
end
def test_and
ae %q(1 && 2 && 3 && 4)
ae %q(1 && nil && 3 && 4)
ae %q(1 && 2 && 3 && nil)
ae %q(1 && 2 && 3 && false)
ae %q(1 and 2 and 3 and 4)
ae %q(1 and nil and 3 and 4)
ae %q(1 and 2 and 3 and nil)
ae %q(1 and 2 and 3 and false)
ae %q(nil && true)
ae %q(false && true)
end
def test_or
ae %q(1 || 2 || 3 || 4)
ae %q(1 || false || 3 || 4)
ae %q(nil || 2 || 3 || 4)
ae %q(false || 2 || 3 || 4)
ae %q(nil || false || nil || false)
ae %q(1 or 2 or 3 or 4)
ae %q(1 or false or 3 or 4)
ae %q(nil or 2 or 3 or 4)
ae %q(false or 2 or 3 or 4)
ae %q(nil or false or nil or false)
end
def test_case
ae %q(
case 1
when 2
:ng
end)
ae %q(
case 1
when 10,20,30
:ng1
when 1,2,3
:ok
when 100,200,300
:ng2
else
:elseng
end)
ae %q(
case 123
when 10,20,30
:ng1
when 1,2,3
:ng2
when 100,200,300
:ng3
else
:elseok
end
)
ae %q(
case 'test'
when /testx/
:ng1
when /test/
:ok
when /tetxx/
:ng2
else
:ng_else
end
)
ae %q(
case Object.new
when Object
:ok
end
)
ae %q(
case Object
when Object.new
:ng
else
:ok
end
)
ae %q{
case 'test'
when 'tes'
:ng
when 'te'
:ng
else
:ok
end
}
ae %q{
case 'test'
when 'tes'
:ng
when 'te'
:ng
when 'test'
:ok
end
}
ae %q{
case 'test'
when 'tes'
:ng
when /te/
:ng
else
:ok
end
}
ae %q{
case 'test'
when 'tes'
:ng
when /test/
:ok
else
:ng
end
}
ae %q{
def test(arg)
case 1
when 2
3
end
return arg
end
test(100)
}
end
def test_case_splat
ae %q{
ary = [1, 2]
case 1
when *ary
:ok
else
:ng
end
}
ae %q{
ary = [1, 2]
case 3
when *ary
:ng
else
:ok
end
}
ae %q{
ary = [1, 2]
case 1
when :x, *ary
:ok
when :z
:ng1
else
:ng2
end
}
ae %q{
ary = [1, 2]
case 3
when :x, *ary
:ng1
when :z
:ng2
else
:ok
end
}
end
def test_when
ae %q(
case
when 1==2, 2==3
:ng1
when false, 4==5
:ok
when false
:ng2
else
:elseng
end
)
ae %q(
case
when nil, nil
:ng1
when 1,2,3
:ok
when false, false
:ng2
else
:elseng
end
)
ae %q(
case
when nil
:ng1
when false
:ng2
else
:elseok
end)
ae %q{
case
when 1
end
}
ae %q{
r = nil
ary = []
case
when false
r = :ng1
when false, false
r = :ng2
when *ary
r = :ng3
when false, *ary
r = :ng4
when true, *ary
r = :ok
end
r
}
end
def test_when_splat
ae %q{
ary = []
case
when false, *ary
:ng
else
:ok
end
}
ae %q{
ary = [false, nil]
case
when *ary
:ng
else
:ok
end
}
ae %q{
ary = [false, nil]
case
when *ary
:ng
when true
:ok
else
:ng2
end
}
ae %q{
ary = [false, nil]
case
when *ary
:ok
else
:ng
end
}
ae %q{
ary = [false, true]
case
when *ary
:ok
else
:ng
end
}
ae %q{
ary = [false, true]
case
when false, false
when false, *ary
:ok
else
:ng
end
}
end
def test_flipflop
ae %q{
sum = 0
30.times{|ib|
if ib % 10 == 0 .. true
sum += ib
end
}
sum
}
ae %q{
sum = 0
30.times{|ib|
if ib % 10 == 0 ... true
sum += ib
end
}
sum
}
ae %q{
t = nil
unless ''.respond_to? :lines
class String
def lines
self
end
end
end
"this must not print
Type: NUM
123
456
Type: ARP
aaa
bbb
\f
this must not print
hoge
Type: ARP
aaa
bbb
".lines.each{|l|
if (t = l[/^Type: (.*)/, 1])..(/^\f/ =~ l)
p [t, l]
end
}
}
end
def test_defined_vars
ae %q{
defined?(nil) + defined?(self) +
defined?(true) + defined?(false)
}
#ae %q{
# a = 1
# defined?(a) # yarv returns "in block" in eval context
#}
ae %q{
defined?(@a)
}
ae %q{
@a = 1
defined?(@a)
}
ae %q{
defined?(@@a)
}
ae %q{
@@a = 1
defined?(@@a)
}
ae %q{
defined?($a)
}
ae %q{
$a = 1
defined?($a)
}
ae %q{
defined?(C_definedtest)
}
ae %q{
C_definedtest = 1
defined?(C_definedtest)
} do
remove_const :C_definedtest
end
ae %q{
defined?(::C_definedtest)
}
ae %q{
C_definedtest = 1
defined?(::C_definedtest)
} do
remove_const :C_definedtest
end
ae %q{
defined?(C_definedtestA::C_definedtestB::C_definedtestC)
}
ae %q{
class C_definedtestA
class C_definedtestB
C_definedtestC = 1
end
end
defined?(C_definedtestA::C_definedtestB::C_definedtestC)
} do
remove_const :C_definedtestA
end
end
def test_defined_method
ae %q{
defined?(m)
}
ae %q{
def m
end
defined?(m)
}
ae %q{
defined?(a.class)
}
ae %q{
a = 1
defined?(a.class)
}
ae %q{
class C
def test
[defined?(m1()), defined?(self.m1), defined?(C.new.m1),
defined?(m2()), defined?(self.m2), defined?(C.new.m2),
defined?(m3()), defined?(self.m3), defined?(C.new.m3)]
end
def m1
end
private
def m2
end
protected
def m3
end
end
C.new.test + [defined?(C.new.m3)]
}
ae %q{
$ans = [defined?($1), defined?($2), defined?($3), defined?($4)]
/(a)(b)/ =~ 'ab'
$ans + [defined?($1), defined?($2), defined?($3), defined?($4)]
}
end
def test_condition
ae %q{
def make_perm ary, num
if num == 1
ary.map{|e| [e]}
else
base = make_perm(ary, num-1)
res = []
base.each{|b|
ary.each{|e|
res << [e] + b
}
}
res
end
end
def each_test
conds = make_perm(['fv', 'tv'], 3)
bangs = make_perm(['', '!'], 3)
exprs = make_perm(['and', 'or'], 3)
['if', 'unless'].each{|syn|
conds.each{|cs|
bangs.each{|bs|
exprs.each{|es|
yield(syn, cs, bs, es)
}
}
}
}
end
fv = false
tv = true
$ans = []
each_test{|syn, conds, bangs, exprs|
c1, c2, c3 = conds
bang1, bang2, bang3 = bangs
e1, e2 = exprs
eval %Q{
#{syn} #{bang1}#{c1} #{e1} #{bang2}#{c2} #{e2} #{bang3}#{c3}
$ans << :then
else
$ans << :false
end
}
}
each_test{|syn, conds, bangs, exprs|
c1, c2, c3 = conds
bang1, bang2, bang3 = bangs
e1, e2 = exprs
eval %Q{
#{syn} #{bang1}#{c1} #{e1} #{bang2}#{c2} #{e2} #{bang3}#{c3}
$ans << :then
end
$ans << :sep
}
}
$ans
}
end
end