1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
require 'test/unit'
class TestEval < Test::Unit::TestCase
# eval with binding
def test_ev
local1 = "local1"
lambda {
local2 = "local2"
return binding
}.call
end
def test_eval
assert_nil(eval(""))
$bad=false
eval 'while false; $bad = true; print "foo\n" end'
assert(!$bad)
assert(eval('TRUE'))
assert(eval('true'))
assert(!eval('NIL'))
assert(!eval('nil'))
assert(!eval('FALSE'))
assert(!eval('false'))
$foo = 'assert(true)'
begin
eval $foo
rescue
assert(false)
end
assert_equal('assert(true)', eval("$foo"))
assert_equal(true, eval("true"))
i = 5
assert(eval("i == 5"))
assert_equal(5, eval("i"))
assert(eval("defined? i"))
$x = test_ev
assert_equal("local1", eval("local1", $x)) # normal local var
assert_equal("local2", eval("local2", $x)) # nested local var
$bad = true
begin
p eval("local1")
rescue NameError # must raise error
$bad = false
end
assert(!$bad)
# !! use class_eval to avoid nested definition
self.class.class_eval %q(
module EvTest
EVTEST1 = 25
evtest2 = 125
$x = binding
end
)
assert_equal(25, eval("EVTEST1", $x)) # constant in module
assert_equal(125, eval("evtest2", $x)) # local var in module
$bad = true
begin
eval("EVTEST1")
rescue NameError # must raise error
$bad = false
end
assert(!$bad)
x = proc{}
eval "i4 = 1", x
assert_equal(1, eval("i4", x))
x = proc{proc{}}.call
eval "i4 = 22", x
assert_equal(22, eval("i4", x))
$x = []
x = proc{proc{}}.call
eval "(0..9).each{|i5| $x[i5] = proc{i5*2}}", x
assert_equal(8, $x[4].call)
x = binding
eval "i = 1", x
assert_equal(1, eval("i", x))
x = proc{binding}.call
eval "i = 22", x
assert_equal(22, eval("i", x))
$x = []
x = proc{binding}.call
eval "(0..9).each{|i5| $x[i5] = proc{i5*2}}", x
assert_equal(8, $x[4].call)
x = proc{binding}.call
eval "for i6 in 1..1; j6=i6; end", x
assert(eval("defined? i6", x))
assert(eval("defined? j6", x))
proc {
p = binding
eval "foo11 = 1", p
foo22 = 5
proc{foo11=22}.call
proc{foo22=55}.call
assert_equal(eval("foo11"), eval("foo11", p))
assert_equal(1, eval("foo11"))
assert_equal(eval("foo22"), eval("foo22", p))
assert_equal(55, eval("foo22"))
}.call
p1 = proc{i7 = 0; proc{i7}}.call
assert_equal(0, p1.call)
eval "i7=5", p1
assert_equal(5, p1.call)
assert(!defined?(i7))
p1 = proc{i7 = 0; proc{i7}}.call
i7 = nil
assert_equal(0, p1.call)
eval "i7=1", p1
assert_equal(1, p1.call)
eval "i7=5", p1
assert_equal(5, p1.call)
assert_nil(i7)
end
def test_nil_instance_eval_cvar # [ruby-dev:24103]
def nil.test_binding
binding
end
bb = eval("nil.instance_eval \"binding\"", nil.test_binding)
assert_raise(NameError) { eval("@@a", bb) }
class << nil
remove_method :test_binding
end
end
def test_fixnum_instance_eval_cvar # [ruby-dev:24213]
assert_raise(NameError) { 1.instance_eval "@@a" }
end
def test_cvar_scope_with_instance_eval # [ruby-dev:24223]
Fixnum.class_eval "@@test_cvar_scope_with_instance_eval = 1" # depends on [ruby-dev:24229]
@@test_cvar_scope_with_instance_eval = 4
assert_equal(4, 1.instance_eval("@@test_cvar_scope_with_instance_eval"))
Fixnum.__send__(:remove_class_variable, :@@test_cvar_scope_with_instance_eval)
end
def test_eval_and_define_method # [ruby-dev:24228]
assert_nothing_raised {
def temporally_method_for_test_eval_and_define_method(&block)
lambda {
class << Object.new; self end.__send__(:define_method, :zzz, &block)
}
end
v = eval("temporally_method_for_test_eval_and_define_method {}")
{}[0] = {}
v.call
}
end
end
|