2003-09-04 12:18:59 -04:00
|
|
|
require 'test/unit'
|
|
|
|
|
|
|
|
class TestProc < Test::Unit::TestCase
|
|
|
|
def test_proc
|
2003-11-27 14:45:17 -05:00
|
|
|
p1 = proc{|i| i}
|
|
|
|
assert_equal(2, p1.call(2))
|
|
|
|
assert_equal(3, p1.call(3))
|
2003-09-05 11:15:43 -04:00
|
|
|
|
2003-11-27 14:45:17 -05:00
|
|
|
p1 = proc{|i| i*2}
|
|
|
|
assert_equal(4, p1.call(2))
|
|
|
|
assert_equal(6, p1.call(3))
|
|
|
|
|
|
|
|
p2 = nil
|
|
|
|
x=0
|
2003-09-05 11:15:43 -04:00
|
|
|
|
2003-09-04 12:18:59 -04:00
|
|
|
proc{
|
|
|
|
iii=5 # nested local variable
|
2003-11-27 14:45:17 -05:00
|
|
|
p1 = proc{|i|
|
2003-09-04 12:18:59 -04:00
|
|
|
iii = i
|
|
|
|
}
|
2003-11-27 14:45:17 -05:00
|
|
|
p2 = proc {
|
|
|
|
x = iii # nested variables shared by procs
|
2003-09-04 12:18:59 -04:00
|
|
|
}
|
|
|
|
# scope of nested variables
|
|
|
|
assert(defined?(iii))
|
|
|
|
}.call
|
|
|
|
assert(!defined?(iii)) # out of scope
|
2003-09-05 11:15:43 -04:00
|
|
|
|
2003-09-04 12:18:59 -04:00
|
|
|
loop{iii=5; assert(eval("defined? iii")); break}
|
|
|
|
loop {
|
|
|
|
iii = 10
|
2003-09-05 11:15:43 -04:00
|
|
|
def self.dyna_var_check
|
2003-09-04 12:18:59 -04:00
|
|
|
loop {
|
|
|
|
assert(!defined?(iii))
|
|
|
|
break
|
|
|
|
}
|
|
|
|
end
|
|
|
|
dyna_var_check
|
|
|
|
break
|
|
|
|
}
|
2003-11-27 14:45:17 -05:00
|
|
|
p1.call(5)
|
|
|
|
p2.call
|
|
|
|
assert_equal(5, x)
|
|
|
|
end
|
|
|
|
|
|
|
|
def assert_arity(n)
|
|
|
|
meta = class << self; self; end
|
|
|
|
meta.class_eval {define_method(:foo, Proc.new)}
|
|
|
|
assert_equal(n, method(:foo).arity)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_arity
|
2004-03-18 05:09:43 -05:00
|
|
|
assert_equal(0, proc{}.arity)
|
2003-11-27 14:45:17 -05:00
|
|
|
assert_equal(0, proc{||}.arity)
|
|
|
|
assert_equal(1, proc{|x|}.arity)
|
|
|
|
assert_equal(2, proc{|x, y|}.arity)
|
|
|
|
assert_equal(-2, proc{|x, *y|}.arity)
|
|
|
|
assert_equal(-1, proc{|*x|}.arity)
|
|
|
|
assert_equal(-1, proc{|*|}.arity)
|
2007-05-01 00:35:58 -04:00
|
|
|
assert_equal(-3, proc{|x, *y, z|}.arity)
|
|
|
|
assert_equal(-4, proc{|x, *y, z, a|}.arity)
|
2003-11-27 14:45:17 -05:00
|
|
|
|
2004-03-18 05:09:43 -05:00
|
|
|
assert_arity(0) {}
|
2003-11-27 14:45:17 -05:00
|
|
|
assert_arity(0) {||}
|
|
|
|
assert_arity(1) {|x|}
|
|
|
|
assert_arity(2) {|x, y|}
|
|
|
|
assert_arity(-2) {|x, *y|}
|
2007-05-01 00:35:58 -04:00
|
|
|
assert_arity(-3) {|x, *y, z|}
|
2003-11-27 14:45:17 -05:00
|
|
|
assert_arity(-1) {|*x|}
|
|
|
|
assert_arity(-1) {|*|}
|
2003-09-04 12:18:59 -04:00
|
|
|
end
|
2004-02-06 04:27:53 -05:00
|
|
|
|
|
|
|
# [ruby-dev:22592]
|
|
|
|
def m(x)
|
|
|
|
lambda { x }
|
|
|
|
end
|
2006-12-31 10:02:22 -05:00
|
|
|
|
2004-02-06 04:27:53 -05:00
|
|
|
def test_eq
|
|
|
|
# [ruby-dev:22592]
|
|
|
|
a = m(1)
|
|
|
|
b = m(2)
|
2004-02-06 04:55:43 -05:00
|
|
|
assert_not_equal(a, b)
|
|
|
|
assert_not_equal(a.call, b.call)
|
|
|
|
|
|
|
|
# [ruby-dev:22599]
|
|
|
|
assert_not_equal(proc {||}, proc {|x,y|})
|
2004-02-06 04:27:53 -05:00
|
|
|
|
|
|
|
# [ruby-dev:22601]
|
|
|
|
a = lambda {|x| lambda {} }.call(1)
|
|
|
|
b = lambda {}
|
2004-02-06 04:55:43 -05:00
|
|
|
assert_not_equal(a, b)
|
2004-02-06 04:27:53 -05:00
|
|
|
end
|
2004-05-24 22:54:22 -04:00
|
|
|
|
|
|
|
def test_block_par
|
2007-05-01 00:35:58 -04:00
|
|
|
assert_equal(10, Proc.new{|&b| b.call(10)}.call {|x| x})
|
|
|
|
assert_equal(12, Proc.new{|a,&b| b.call(a)}.call(12) {|x| x})
|
2004-05-24 22:54:22 -04:00
|
|
|
end
|
2004-06-19 00:27:08 -04:00
|
|
|
|
|
|
|
def test_safe
|
|
|
|
safe = $SAFE
|
|
|
|
c = Class.new
|
|
|
|
x = c.new
|
|
|
|
|
|
|
|
p = proc {
|
|
|
|
$SAFE += 1
|
|
|
|
proc {$SAFE}
|
|
|
|
}.call
|
|
|
|
assert_equal(safe, $SAFE)
|
|
|
|
assert_equal(safe + 1, p.call)
|
|
|
|
assert_equal(safe, $SAFE)
|
|
|
|
|
|
|
|
c.class_eval {define_method(:safe, p)}
|
|
|
|
assert_equal(safe, x.safe)
|
|
|
|
assert_equal(safe, x.method(:safe).call)
|
|
|
|
assert_equal(safe, x.method(:safe).to_proc.call)
|
|
|
|
|
|
|
|
p = proc {$SAFE += 1}
|
|
|
|
assert_equal(safe + 1, p.call)
|
|
|
|
assert_equal(safe, $SAFE)
|
|
|
|
|
|
|
|
c.class_eval {define_method(:inc, p)}
|
|
|
|
assert_equal(safe + 1, proc {x.inc; $SAFE}.call)
|
|
|
|
assert_equal(safe, $SAFE)
|
|
|
|
assert_equal(safe + 1, proc {x.method(:inc).call; $SAFE}.call)
|
|
|
|
assert_equal(safe, $SAFE)
|
|
|
|
assert_equal(safe + 1, proc {x.method(:inc).to_proc.call; $SAFE}.call)
|
|
|
|
assert_equal(safe, $SAFE)
|
|
|
|
end
|
2006-12-31 10:02:22 -05:00
|
|
|
|
|
|
|
def m2
|
|
|
|
"OK"
|
|
|
|
end
|
|
|
|
|
|
|
|
def block
|
|
|
|
method(:m2).to_proc
|
|
|
|
end
|
|
|
|
|
|
|
|
# [yarv-dev:777] block made by Method#to_proc
|
|
|
|
def test_method_to_proc
|
|
|
|
b = block()
|
|
|
|
assert_equal "OK", b.call
|
|
|
|
end
|
|
|
|
|
2003-09-04 12:18:59 -04:00
|
|
|
end
|