ruby/yarvtest/test_jump.rb

297 строки
3.8 KiB
Ruby

require 'yarvtest/yarvtest'
class TestJump < YarvTestBase
def test_redo
ae %q{
def m
yield + 10
end
i=0
m{
if i>10
i*i
else
i+=1
redo
end
}
}
end
def test_next
ae %q{
def m
yield
:ok
end
i=0
m{
if i>10
i*i
else
i+=1
next
end
}
}
end
def test_next_with_val
ae %q{
def m
yield
end
m{
next :ok
}
}
end
def test_return
ae %q{
def m
return 3
end
m
}
ae %q{
def m
:ng1
mm{
return :ok
}
:ng2
end
def mm
:ng3
yield
:ng4
end
m
}
end
def test_return2
ae %q{
$i = 0
def m
begin
iter{
return
}
ensure
$i = 100
end
end
def iter
yield
end
m
$i
}
end
def test_return3
ae %q{
def m
begin
raise
rescue
return :ok
end
:ng
end
m
}
end
def test_break
ae %q{
def m
:ng1
mm{
yield
}
:ng2
end
def mm
:ng3
yield
:ng4
end
m{
break :ok
}
}
end
def test_exception_and_break
ae %q{
def m
yield
end
m{
begin
ensure
break :ok
end
}
}
end
def test_retry
# this test can't run on ruby 1.9(yarv can do)
%q{
def m a
mm{
yield
}
end
def mm
yield
end
i=0
m(i+=1){
retry if i<10
:ok
}
}
ae %q{
def m a
yield
end
i=0
m(i+=1){
retry if i<10
:ok
}
}
end
def test_complex_jump
ae %q{
module Enumerable
def all_?
self.each{|e|
unless yield(e)
return false
end
}
true
end
end
xxx = 0
[1,2].each{|bi|
[3,4].each{|bj|
[true, nil, true].all_?{|be| be}
break
}
xxx += 1
}
xxx
}
end
def test_return_from
ae %q{
def m
begin
raise
rescue
return 1
end
end
m
}
ae %q{
def m
begin
#
ensure
return 1
end
end
m
}
end
def test_break_from_times
ae %q{
3.times{
break :ok
}
}
end
def test_catch_and_throw
ae %q{
catch(:foo){
throw :foo
}
}
ae %q{
catch(:foo){
throw :foo, false
}
}
ae %q{
catch(:foo){
throw :foo, nil
}
}
ae %q{
catch(:foo){
throw :foo, :ok
}
}
ae %q{
catch(:foo){
1.times{
throw :foo
}
}
}
ae %q{
catch(:foo){
1.times{
throw :foo, :ok
}
}
}
ae %q{
catch(:foo){
catch(:bar){
throw :foo, :ok
}
:ng
}
}
ae %q{
catch(:foo){
catch(:bar){
1.times{
throw :foo, :ok
}
}
:ng
}
}
end
end