ruby--ruby/bootstraptest/test_eval.rb

201 lines
2.6 KiB
Ruby

assert_equal %q{ok}, %q{
def m
a = :ok
$b = binding
end
m
eval('a', $b)
}
assert_equal %q{[:ok, :ok2]}, %q{
def m
a = :ok
$b = binding
end
m
eval('b = :ok2', $b)
eval('[a, b]', $b)
}
assert_equal %q{[nil, 1]}, %q{
$ans = []
def m
$b = binding
end
m
$ans << eval(%q{
$ans << eval(%q{
a
}, $b)
a = 1
}, $b)
$ans
}
assert_equal %q{C}, %q{
Const = :top
class C
Const = :C
def m
binding
end
end
eval('Const', C.new.m)
}
assert_equal %q{top}, %q{
Const = :top
a = 1
class C
Const = :C
def m
eval('Const', TOPLEVEL_BINDING)
end
end
C.new.m
}
assert_equal %q{:ok
ok}, %q{
class C
$b = binding
end
eval %q{
def m
:ok
end
}, $b
p C.new.m
}
assert_equal %q{ok}, %q{
b = proc{
a = :ok
binding
}.call
a = :ng
eval("a", b)
}
assert_equal %q{C}, %q{
class C
def foo
binding
end
end
C.new.foo.eval("self.class.to_s")
}
assert_equal %q{1}, %q{
eval('1')
}
assert_equal %q{1}, %q{
eval('a=1; a')
}
assert_equal %q{1}, %q{
a = 1
eval('a')
}
assert_equal %q{ok}, %q{
__send__ :eval, %{
:ok
}
}
assert_equal %q{ok}, %q{
1.__send__ :instance_eval, %{
:ok
}
}
assert_equal %q{1}, %q{
1.instance_eval{
self
}
}
assert_equal %q{foo}, %q{
'foo'.instance_eval{
self
}
}
assert_equal %q{1}, %q{
class Fixnum
Const = 1
end
1.instance_eval %{
Const
}
}
assert_equal %q{C}, %q{
Const = :top
class C
Const = :C
end
C.module_eval{
Const
}
}
assert_equal %q{C}, %q{
Const = :top
class C
Const = :C
end
C.class_eval %{
def m
Const
end
}
C.new.m
}
assert_equal %q{C}, %q{
Const = :top
class C
Const = :C
end
C.class_eval{
def m
Const
end
}
C.new.m
}
assert_equal %q{[:top, :C, :top, :C]}, %q{
Const = :top
class C
Const = :C
end
$nest = false
$ans = []
def m
$ans << Const
C.module_eval %{
$ans << Const
Boo = false unless defined? Boo
unless $nest
$nest = true
m
end
}
end
m
$ans
}
assert_equal %q{[10, main]}, %q{
$nested = false
$ans = []
$pr = proc{
$ans << self
unless $nested
$nested = true
$pr.call
end
}
class C
def initialize &b
10.instance_eval(&b)
end
end
C.new(&$pr)
$ans
}
%w[break next redo].each do |keyword|
assert_match %r"Can't escape from eval with #{keyword}\z", %{
begin
eval "0 rescue #{keyword}"
rescue SyntaxError => e
e.message
end
}, '[ruby-dev:31372]'
end