mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
ffd0820ab3
This removes the related tests, and puts the related specs behind version guards. This affects all code in lib, including some libraries that may want to support older versions of Ruby.
1610 lines
60 KiB
Ruby
1610 lines
60 KiB
Ruby
# frozen_string_literal: false
|
|
require 'test/unit'
|
|
|
|
class TestProc < Test::Unit::TestCase
|
|
def setup
|
|
@verbose = $VERBOSE
|
|
$VERBOSE = nil
|
|
end
|
|
|
|
def teardown
|
|
$VERBOSE = @verbose
|
|
end
|
|
|
|
def test_proc
|
|
p1 = proc{|i| i}
|
|
assert_equal(2, p1.call(2))
|
|
assert_equal(3, p1.call(3))
|
|
|
|
p1 = proc{|i| i*2}
|
|
assert_equal(4, p1.call(2))
|
|
assert_equal(6, p1.call(3))
|
|
|
|
p2 = nil
|
|
x=0
|
|
|
|
proc{
|
|
iii=5 # nested local variable
|
|
p1 = proc{|i|
|
|
iii = i
|
|
}
|
|
p2 = proc {
|
|
x = iii # nested variables shared by procs
|
|
}
|
|
# scope of nested variables
|
|
assert(defined?(iii))
|
|
}.call
|
|
assert(!defined?(iii)) # out of scope
|
|
|
|
loop{iii=iii=5; assert(eval("defined? iii")); break}
|
|
loop {
|
|
iii=iii = 10
|
|
def self.dyna_var_check
|
|
loop {
|
|
assert(!defined?(iii))
|
|
break
|
|
}
|
|
end
|
|
dyna_var_check
|
|
break
|
|
}
|
|
p1.call(5)
|
|
p2.call
|
|
assert_equal(5, x)
|
|
end
|
|
|
|
def assert_arity(n)
|
|
meta = class << self; self; end
|
|
b = assert_warn(/Capturing the given block using Proc\.new is deprecated/) do
|
|
Proc.new
|
|
end
|
|
meta.class_eval {
|
|
remove_method(:foo) if method_defined?(:foo)
|
|
define_method(:foo, b)
|
|
}
|
|
assert_equal(n, method(:foo).arity)
|
|
end
|
|
|
|
def test_arity
|
|
assert_equal(0, proc{}.arity)
|
|
assert_equal(0, proc{||}.arity)
|
|
assert_equal(1, proc{|x|}.arity)
|
|
assert_equal(0, proc{|x=1|}.arity)
|
|
assert_equal(2, proc{|x, y|}.arity)
|
|
assert_equal(1, proc{|x=0, y|}.arity)
|
|
assert_equal(0, proc{|x=0, y=0|}.arity)
|
|
assert_equal(1, proc{|x, y=0|}.arity)
|
|
assert_equal(-2, proc{|x, *y|}.arity)
|
|
assert_equal(-1, proc{|x=0, *y|}.arity)
|
|
assert_equal(-1, proc{|*x|}.arity)
|
|
assert_equal(-1, proc{|*|}.arity)
|
|
assert_equal(-3, proc{|x, *y, z|}.arity)
|
|
assert_equal(-2, proc{|x=0, *y, z|}.arity)
|
|
assert_equal(2, proc{|(x, y), z|[x,y]}.arity)
|
|
assert_equal(1, proc{|(x, y), z=0|[x,y]}.arity)
|
|
assert_equal(-4, proc{|x, *y, z, a|}.arity)
|
|
assert_equal(0, proc{|**|}.arity)
|
|
assert_equal(0, proc{|**o|}.arity)
|
|
assert_equal(1, proc{|x, **o|}.arity)
|
|
assert_equal(0, proc{|x=0, **o|}.arity)
|
|
assert_equal(1, proc{|x, y=0, **o|}.arity)
|
|
assert_equal(2, proc{|x, y=0, z, **o|}.arity)
|
|
assert_equal(-3, proc{|x, y=0, *z, w, **o|}.arity)
|
|
|
|
assert_equal(2, proc{|x, y=0, z, a:1|}.arity)
|
|
assert_equal(3, proc{|x, y=0, z, a:|}.arity)
|
|
assert_equal(-4, proc{|x, y, *rest, a:, b:, c:|}.arity)
|
|
assert_equal(3, proc{|x, y=0, z, a:, **o|}.arity)
|
|
|
|
assert_equal(0, lambda{}.arity)
|
|
assert_equal(0, lambda{||}.arity)
|
|
assert_equal(1, lambda{|x|}.arity)
|
|
assert_equal(-1, lambda{|x=1|}.arity) # different from proc
|
|
assert_equal(2, lambda{|x, y|}.arity)
|
|
assert_equal(-2, lambda{|x=0, y|}.arity) # different from proc
|
|
assert_equal(-1, lambda{|x=0, y=0|}.arity) # different from proc
|
|
assert_equal(-2, lambda{|x, y=0|}.arity) # different from proc
|
|
assert_equal(-2, lambda{|x, *y|}.arity)
|
|
assert_equal(-1, lambda{|x=0, *y|}.arity)
|
|
assert_equal(-1, lambda{|*x|}.arity)
|
|
assert_equal(-1, lambda{|*|}.arity)
|
|
assert_equal(-3, lambda{|x, *y, z|}.arity)
|
|
assert_equal(-2, lambda{|x=0, *y, z|}.arity)
|
|
assert_equal(2, lambda{|(x, y), z|[x,y]}.arity)
|
|
assert_equal(-2, lambda{|(x, y), z=0|[x,y]}.arity)
|
|
assert_equal(-4, lambda{|x, *y, z, a|}.arity)
|
|
assert_equal(-1, lambda{|**|}.arity)
|
|
assert_equal(-1, lambda{|**o|}.arity)
|
|
assert_equal(-2, lambda{|x, **o|}.arity)
|
|
assert_equal(-1, lambda{|x=0, **o|}.arity)
|
|
assert_equal(-2, lambda{|x, y=0, **o|}.arity)
|
|
assert_equal(-3, lambda{|x, y=0, z, **o|}.arity)
|
|
assert_equal(-3, lambda{|x, y=0, *z, w, **o|}.arity)
|
|
|
|
assert_arity(0) {}
|
|
assert_arity(0) {||}
|
|
assert_arity(1) {|x|}
|
|
assert_arity(2) {|x, y|}
|
|
assert_arity(-2) {|x, *y|}
|
|
assert_arity(-3) {|x, *y, z|}
|
|
assert_arity(-1) {|*x|}
|
|
assert_arity(-1) {|*|}
|
|
assert_arity(-1) {|**o|}
|
|
assert_arity(-1) {|**|}
|
|
assert_arity(-2) {|x, *y, **|}
|
|
assert_arity(-3) {|x, *y, z, **|}
|
|
end
|
|
|
|
def m(x)
|
|
lambda { x }
|
|
end
|
|
|
|
def test_eq
|
|
a = m(1)
|
|
b = m(2)
|
|
assert_not_equal(a, b, "[ruby-dev:22592]")
|
|
assert_not_equal(a.call, b.call, "[ruby-dev:22592]")
|
|
|
|
assert_not_equal(proc {||}, proc {|x,y|}, "[ruby-dev:22599]")
|
|
|
|
a = lambda {|x| lambda {} }.call(1)
|
|
b = lambda {}
|
|
assert_not_equal(a, b, "[ruby-dev:22601]")
|
|
end
|
|
|
|
def test_block_par
|
|
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})
|
|
end
|
|
|
|
def m2
|
|
"OK"
|
|
end
|
|
|
|
def block
|
|
method(:m2).to_proc
|
|
end
|
|
|
|
def m1(var)
|
|
var
|
|
end
|
|
|
|
def m_block_given?
|
|
m1(block_given?)
|
|
end
|
|
|
|
# [yarv-dev:777] block made by Method#to_proc
|
|
def test_method_to_proc
|
|
b = block()
|
|
assert_equal "OK", b.call
|
|
b = b.binding
|
|
assert_instance_of(Binding, b, '[ruby-core:25589]')
|
|
bug10432 = '[ruby-core:65919] [Bug #10432]'
|
|
assert_same(self, b.receiver, bug10432)
|
|
assert_not_send [b, :local_variable_defined?, :value]
|
|
assert_raise(NameError) {
|
|
b.local_variable_get(:value)
|
|
}
|
|
assert_equal 42, b.local_variable_set(:value, 42)
|
|
assert_send [b, :local_variable_defined?, :value]
|
|
assert_equal 42, b.local_variable_get(:value)
|
|
end
|
|
|
|
def test_block_given_method
|
|
m = method(:m_block_given?)
|
|
assert(!m.call, "without block")
|
|
assert(m.call {}, "with block")
|
|
assert(!m.call, "without block second")
|
|
end
|
|
|
|
def test_block_given_method_to_proc
|
|
bug8341 = '[Bug #8341]'
|
|
m = method(:m_block_given?).to_proc
|
|
assert(!m.call, "#{bug8341} without block")
|
|
assert(m.call {}, "#{bug8341} with block")
|
|
assert(!m.call, "#{bug8341} without block second")
|
|
end
|
|
|
|
def test_block_persist_between_calls
|
|
bug8341 = '[Bug #8341]'
|
|
o = Object.new
|
|
def o.m1(top=true)
|
|
if top
|
|
[block_given?, @m.call(false)]
|
|
else
|
|
block_given?
|
|
end
|
|
end
|
|
m = o.method(:m1).to_proc
|
|
o.instance_variable_set(:@m, m)
|
|
assert_equal([true, false], m.call {}, "#{bug8341} nested with block")
|
|
assert_equal([false, false], m.call, "#{bug8341} nested without block")
|
|
end
|
|
|
|
def test_curry_proc
|
|
b = proc {|x, y, z| (x||0) + (y||0) + (z||0) }
|
|
assert_equal(6, b.curry[1][2][3])
|
|
assert_equal(6, b.curry[1, 2][3, 4])
|
|
assert_equal(6, b.curry(5)[1][2][3][4][5])
|
|
assert_equal(6, b.curry(5)[1, 2][3, 4][5])
|
|
assert_equal(1, b.curry(1)[1])
|
|
end
|
|
|
|
def test_curry_proc_splat
|
|
b = proc {|x, y, z, *w| (x||0) + (y||0) + (z||0) + w.inject(0, &:+) }
|
|
assert_equal(6, b.curry[1][2][3])
|
|
assert_equal(10, b.curry[1, 2][3, 4])
|
|
assert_equal(15, b.curry(5)[1][2][3][4][5])
|
|
assert_equal(15, b.curry(5)[1, 2][3, 4][5])
|
|
assert_equal(1, b.curry(1)[1])
|
|
end
|
|
|
|
def test_curry_lambda
|
|
b = lambda {|x, y, z| (x||0) + (y||0) + (z||0) }
|
|
assert_equal(6, b.curry[1][2][3])
|
|
assert_raise(ArgumentError) { b.curry[1, 2][3, 4] }
|
|
assert_raise(ArgumentError) { b.curry(5) }
|
|
assert_raise(ArgumentError) { b.curry(1) }
|
|
end
|
|
|
|
def test_curry_lambda_splat
|
|
b = lambda {|x, y, z, *w| (x||0) + (y||0) + (z||0) + w.inject(0, &:+) }
|
|
assert_equal(6, b.curry[1][2][3])
|
|
assert_equal(10, b.curry[1, 2][3, 4])
|
|
assert_equal(15, b.curry(5)[1][2][3][4][5])
|
|
assert_equal(15, b.curry(5)[1, 2][3, 4][5])
|
|
assert_raise(ArgumentError) { b.curry(1) }
|
|
end
|
|
|
|
def test_curry_no_arguments
|
|
b = proc { :foo }
|
|
assert_equal(:foo, b.curry[])
|
|
end
|
|
|
|
def test_curry_given_blocks
|
|
b = lambda {|x, y, &blk| blk.call(x + y) }.curry
|
|
b = b.call(2) { raise }
|
|
b = b.call(3) {|x| x + 4 }
|
|
assert_equal(9, b)
|
|
end
|
|
|
|
def test_lambda?
|
|
l = proc {}
|
|
assert_equal(false, l.lambda?)
|
|
assert_equal(false, l.curry.lambda?, '[ruby-core:24127]')
|
|
assert_equal(false, proc(&l).lambda?)
|
|
assert_equal(false, lambda(&l).lambda?)
|
|
assert_equal(false, Proc.new(&l).lambda?)
|
|
l = lambda {}
|
|
assert_equal(true, l.lambda?)
|
|
assert_equal(true, l.curry.lambda?, '[ruby-core:24127]')
|
|
assert_equal(true, proc(&l).lambda?)
|
|
assert_equal(true, lambda(&l).lambda?)
|
|
assert_equal(true, Proc.new(&l).lambda?)
|
|
end
|
|
|
|
def test_curry_ski_fib
|
|
s = proc {|f, g, x| f[x][g[x]] }.curry
|
|
k = proc {|x, y| x }.curry
|
|
i = proc {|x| x }.curry
|
|
|
|
fib = []
|
|
inc = proc {|x| fib[-1] += 1; x }.curry
|
|
ret = proc {|x| throw :end if fib.size > 10; fib << 0; x }.curry
|
|
|
|
catch(:end) do
|
|
s[
|
|
s[s[i][i]][k[i]]
|
|
][
|
|
k[inc]
|
|
][
|
|
s[
|
|
s[
|
|
k[s]
|
|
][
|
|
s[k[s[k[s]]]
|
|
][
|
|
s[s[k[s]][s[k[s[k[ret]]]][s[k[s[i]]][k]]]][k]]
|
|
]
|
|
][
|
|
k[s[k[s]][k]]
|
|
]
|
|
]
|
|
end
|
|
|
|
assert_equal(fib, [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89])
|
|
end
|
|
|
|
def test_curry_passed_block
|
|
a = lambda {|x, y, &b| b }
|
|
b = a.curry[1]
|
|
|
|
assert_not_nil(b.call(2){}, '[ruby-core:15551]: passed block to curried block')
|
|
end
|
|
|
|
def test_curry_instance_exec
|
|
a = lambda { |x, y| [x + y, self] }
|
|
b = a.curry.call(1)
|
|
result = instance_exec 2, &b
|
|
|
|
assert_equal(3, result[0])
|
|
assert_equal(self, result[1])
|
|
end
|
|
|
|
def test_curry_optional_params
|
|
obj = Object.new
|
|
def obj.foo(a, b=42); end
|
|
assert_raise(ArgumentError) { obj.method(:foo).to_proc.curry(3) }
|
|
assert_raise(ArgumentError) { ->(a, b=42){}.curry(3) }
|
|
end
|
|
|
|
def test_dup_clone
|
|
b = proc {|x| x + "bar" }
|
|
class << b; attr_accessor :foo; end
|
|
|
|
bd = b.dup
|
|
assert_equal("foobar", bd.call("foo"))
|
|
assert_raise(NoMethodError) { bd.foo = :foo }
|
|
assert_raise(NoMethodError) { bd.foo }
|
|
|
|
bc = b.clone
|
|
assert_equal("foobar", bc.call("foo"))
|
|
bc.foo = :foo
|
|
assert_equal(:foo, bc.foo)
|
|
end
|
|
|
|
def test_binding
|
|
b = proc {|x, y, z| proc {}.binding }.call(1, 2, 3)
|
|
class << b; attr_accessor :foo; end
|
|
|
|
bd = b.dup
|
|
assert_equal([1, 2, 3], bd.eval("[x, y, z]"))
|
|
assert_raise(NoMethodError) { bd.foo = :foo }
|
|
assert_raise(NoMethodError) { bd.foo }
|
|
|
|
bc = b.clone
|
|
assert_equal([1, 2, 3], bc.eval("[x, y, z]"))
|
|
bc.foo = :foo
|
|
assert_equal(:foo, bc.foo)
|
|
|
|
b = nil
|
|
1.times { x, y, z = 1, 2, 3; [x,y,z]; b = binding }
|
|
assert_equal([1, 2, 3], b.eval("[x, y, z]"))
|
|
end
|
|
|
|
def test_binding_source_location
|
|
b, expected_location = binding, [__FILE__, __LINE__]
|
|
assert_equal(expected_location, b.source_location)
|
|
|
|
file, lineno = method(:source_location_test).to_proc.binding.source_location
|
|
assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
|
|
assert_equal(@@line_of_source_location_test, lineno, 'Bug #2427')
|
|
end
|
|
|
|
def test_proc_lambda
|
|
assert_raise(ArgumentError) { proc }
|
|
assert_raise(ArgumentError) { lambda }
|
|
|
|
o = Object.new
|
|
def o.foo
|
|
b = nil
|
|
1.times { b = lambda }
|
|
b
|
|
end
|
|
assert_raise(ArgumentError) {o.foo { :foo }.call}
|
|
|
|
def o.foo(&b)
|
|
b = nil
|
|
1.times { b = lambda }
|
|
b
|
|
end
|
|
assert_raise(ArgumentError) {o.foo { :foo }.call}
|
|
end
|
|
|
|
def test_arity2
|
|
assert_equal(0, method(:proc).to_proc.arity)
|
|
assert_equal(-1, proc {}.curry.arity)
|
|
|
|
c = Class.new
|
|
c.class_eval { attr_accessor :foo }
|
|
assert_equal(1, c.new.method(:foo=).to_proc.arity)
|
|
end
|
|
|
|
def test_proc_location
|
|
t = Thread.new { sleep }
|
|
assert_raise(ThreadError) { t.instance_eval { initialize { } } }
|
|
t.kill
|
|
t.join
|
|
end
|
|
|
|
def test_to_proc
|
|
b = proc { :foo }
|
|
assert_equal(:foo, b.to_proc.call)
|
|
end
|
|
|
|
def test_localjump_error
|
|
o = o = Object.new
|
|
def foo; yield; end
|
|
exc = foo rescue $!
|
|
assert_nil(exc.exit_value)
|
|
assert_equal(:noreason, exc.reason)
|
|
end
|
|
|
|
def test_curry_binding
|
|
assert_raise(ArgumentError) { proc {}.curry.binding }
|
|
end
|
|
|
|
def test_proc_args_plain
|
|
pr = proc {|a,b,c,d,e|
|
|
[a,b,c,d,e]
|
|
}
|
|
assert_equal [nil,nil,nil,nil,nil], pr.call()
|
|
assert_equal [1,nil,nil,nil,nil], pr.call(1)
|
|
assert_equal [1,2,nil,nil,nil], pr.call(1,2)
|
|
assert_equal [1,2,3,nil,nil], pr.call(1,2,3)
|
|
assert_equal [1,2,3,4,nil], pr.call(1,2,3,4)
|
|
assert_equal [1,2,3,4,5], pr.call(1,2,3,4,5)
|
|
assert_equal [1,2,3,4,5], pr.call(1,2,3,4,5,6)
|
|
|
|
assert_equal [nil,nil,nil,nil,nil], pr.call([])
|
|
assert_equal [1,nil,nil,nil,nil], pr.call([1])
|
|
assert_equal [1,2,nil,nil,nil], pr.call([1,2])
|
|
assert_equal [1,2,3,nil,nil], pr.call([1,2,3])
|
|
assert_equal [1,2,3,4,nil], pr.call([1,2,3,4])
|
|
assert_equal [1,2,3,4,5], pr.call([1,2,3,4,5])
|
|
assert_equal [1,2,3,4,5], pr.call([1,2,3,4,5,6])
|
|
|
|
r = proc{|a| a}.call([1,2,3])
|
|
assert_equal [1,2,3], r
|
|
|
|
r = proc{|a,| a}.call([1,2,3])
|
|
assert_equal 1, r
|
|
|
|
r = proc{|a,| a}.call([])
|
|
assert_equal nil, r
|
|
end
|
|
|
|
|
|
def test_proc_args_rest
|
|
pr = proc {|a,b,c,*d|
|
|
[a,b,c,d]
|
|
}
|
|
assert_equal [nil,nil,nil,[]], pr.call()
|
|
assert_equal [1,nil,nil,[]], pr.call(1)
|
|
assert_equal [1,2,nil,[]], pr.call(1,2)
|
|
assert_equal [1,2,3,[]], pr.call(1,2,3)
|
|
assert_equal [1,2,3,[4]], pr.call(1,2,3,4)
|
|
assert_equal [1,2,3,[4,5]], pr.call(1,2,3,4,5)
|
|
assert_equal [1,2,3,[4,5,6]], pr.call(1,2,3,4,5,6)
|
|
|
|
assert_equal [nil,nil,nil,[]], pr.call([])
|
|
assert_equal [1,nil,nil,[]], pr.call([1])
|
|
assert_equal [1,2,nil,[]], pr.call([1,2])
|
|
assert_equal [1,2,3,[]], pr.call([1,2,3])
|
|
assert_equal [1,2,3,[4]], pr.call([1,2,3,4])
|
|
assert_equal [1,2,3,[4,5]], pr.call([1,2,3,4,5])
|
|
assert_equal [1,2,3,[4,5,6]], pr.call([1,2,3,4,5,6])
|
|
|
|
r = proc{|*a| a}.call([1,2,3])
|
|
assert_equal [[1,2,3]], r
|
|
end
|
|
|
|
def test_proc_args_pos_rest_post
|
|
pr = proc {|a,b,*c,d,e|
|
|
[a,b,c,d,e]
|
|
}
|
|
assert_equal [nil, nil, [], nil, nil], pr.call()
|
|
assert_equal [1, nil, [], nil, nil], pr.call(1)
|
|
assert_equal [1, 2, [], nil, nil], pr.call(1,2)
|
|
assert_equal [1, 2, [], 3, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, [], 3, 4], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, [3], 4, 5], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, [3, 4], 5, 6], pr.call(1,2,3,4,5,6)
|
|
assert_equal [1, 2, [3, 4, 5], 6,7], pr.call(1,2,3,4,5,6,7)
|
|
|
|
assert_equal [nil, nil, [], nil, nil], pr.call([])
|
|
assert_equal [1, nil, [], nil, nil], pr.call([1])
|
|
assert_equal [1, 2, [], nil, nil], pr.call([1,2])
|
|
assert_equal [1, 2, [], 3, nil], pr.call([1,2,3])
|
|
assert_equal [1, 2, [], 3, 4], pr.call([1,2,3,4])
|
|
assert_equal [1, 2, [3], 4, 5], pr.call([1,2,3,4,5])
|
|
assert_equal [1, 2, [3, 4], 5, 6], pr.call([1,2,3,4,5,6])
|
|
assert_equal [1, 2, [3, 4, 5], 6,7], pr.call([1,2,3,4,5,6,7])
|
|
end
|
|
|
|
def test_proc_args_rest_post
|
|
pr = proc {|*a,b,c|
|
|
[a,b,c]
|
|
}
|
|
assert_equal [[], nil, nil], pr.call()
|
|
assert_equal [[], 1, nil], pr.call(1)
|
|
assert_equal [[], 1, 2], pr.call(1,2)
|
|
assert_equal [[1], 2, 3], pr.call(1,2,3)
|
|
assert_equal [[1, 2], 3, 4], pr.call(1,2,3,4)
|
|
assert_equal [[1, 2, 3], 4, 5], pr.call(1,2,3,4,5)
|
|
assert_equal [[1, 2, 3, 4], 5, 6], pr.call(1,2,3,4,5,6)
|
|
assert_equal [[1, 2, 3, 4, 5], 6,7], pr.call(1,2,3,4,5,6,7)
|
|
|
|
assert_equal [[], nil, nil], pr.call([])
|
|
assert_equal [[], 1, nil], pr.call([1])
|
|
assert_equal [[], 1, 2], pr.call([1,2])
|
|
assert_equal [[1], 2, 3], pr.call([1,2,3])
|
|
assert_equal [[1, 2], 3, 4], pr.call([1,2,3,4])
|
|
assert_equal [[1, 2, 3], 4, 5], pr.call([1,2,3,4,5])
|
|
assert_equal [[1, 2, 3, 4], 5, 6], pr.call([1,2,3,4,5,6])
|
|
assert_equal [[1, 2, 3, 4, 5], 6,7], pr.call([1,2,3,4,5,6,7])
|
|
end
|
|
|
|
def test_proc_args_pos_opt
|
|
pr = proc {|a,b,c=:c|
|
|
[a,b,c]
|
|
}
|
|
assert_equal [nil, nil, :c], pr.call()
|
|
assert_equal [1, nil, :c], pr.call(1)
|
|
assert_equal [1, 2, :c], pr.call(1,2)
|
|
assert_equal [1, 2, 3], pr.call(1,2,3)
|
|
assert_equal [1, 2, 3], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3], pr.call(1,2,3,4,5,6)
|
|
|
|
assert_equal [nil, nil, :c], pr.call([])
|
|
assert_equal [1, nil, :c], pr.call([1])
|
|
assert_equal [1, 2, :c], pr.call([1,2])
|
|
assert_equal [1, 2, 3], pr.call([1,2,3])
|
|
assert_equal [1, 2, 3], pr.call([1,2,3,4])
|
|
assert_equal [1, 2, 3], pr.call([1,2,3,4,5])
|
|
assert_equal [1, 2, 3], pr.call([1,2,3,4,5,6])
|
|
end
|
|
|
|
def test_proc_args_opt
|
|
pr = proc {|a=:a,b=:b,c=:c|
|
|
[a,b,c]
|
|
}
|
|
assert_equal [:a, :b, :c], pr.call()
|
|
assert_equal [1, :b, :c], pr.call(1)
|
|
assert_equal [1, 2, :c], pr.call(1,2)
|
|
assert_equal [1, 2, 3], pr.call(1,2,3)
|
|
assert_equal [1, 2, 3], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3], pr.call(1,2,3,4,5,6)
|
|
|
|
assert_equal [:a, :b, :c], pr.call([])
|
|
assert_equal [1, :b, :c], pr.call([1])
|
|
assert_equal [1, 2, :c], pr.call([1,2])
|
|
assert_equal [1, 2, 3], pr.call([1,2,3])
|
|
assert_equal [1, 2, 3], pr.call([1,2,3,4])
|
|
assert_equal [1, 2, 3], pr.call([1,2,3,4,5])
|
|
assert_equal [1, 2, 3], pr.call([1,2,3,4,5,6])
|
|
end
|
|
|
|
def test_proc_args_opt_single
|
|
bug7621 = '[ruby-dev:46801]'
|
|
pr = proc {|a=:a|
|
|
a
|
|
}
|
|
assert_equal :a, pr.call()
|
|
assert_equal 1, pr.call(1)
|
|
assert_equal 1, pr.call(1,2)
|
|
|
|
assert_equal [], pr.call([]), bug7621
|
|
assert_equal [1], pr.call([1]), bug7621
|
|
assert_equal [1, 2], pr.call([1,2]), bug7621
|
|
assert_equal [1, 2, 3], pr.call([1,2,3]), bug7621
|
|
assert_equal [1, 2, 3, 4], pr.call([1,2,3,4]), bug7621
|
|
end
|
|
|
|
def test_proc_args_pos_opt_post
|
|
pr = proc {|a,b,c=:c,d,e|
|
|
[a,b,c,d,e]
|
|
}
|
|
assert_equal [nil, nil, :c, nil, nil], pr.call()
|
|
assert_equal [1, nil, :c, nil, nil], pr.call(1)
|
|
assert_equal [1, 2, :c, nil, nil], pr.call(1,2)
|
|
assert_equal [1, 2, :c, 3, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, :c, 3, 4], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, 4, 5], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3, 4, 5], pr.call(1,2,3,4,5,6)
|
|
|
|
assert_equal [nil, nil, :c, nil, nil], pr.call([])
|
|
assert_equal [1, nil, :c, nil, nil], pr.call([1])
|
|
assert_equal [1, 2, :c, nil, nil], pr.call([1,2])
|
|
assert_equal [1, 2, :c, 3, nil], pr.call([1,2,3])
|
|
assert_equal [1, 2, :c, 3, 4], pr.call([1,2,3,4])
|
|
assert_equal [1, 2, 3, 4, 5], pr.call([1,2,3,4,5])
|
|
assert_equal [1, 2, 3, 4, 5], pr.call([1,2,3,4,5,6])
|
|
end
|
|
|
|
def test_proc_args_opt_post
|
|
pr = proc {|a=:a,b=:b,c=:c,d,e|
|
|
[a,b,c,d,e]
|
|
}
|
|
assert_equal [:a, :b, :c, nil, nil], pr.call()
|
|
assert_equal [:a, :b, :c, 1, nil], pr.call(1)
|
|
assert_equal [:a, :b, :c, 1, 2], pr.call(1,2)
|
|
assert_equal [1, :b, :c, 2, 3], pr.call(1,2,3)
|
|
assert_equal [1, 2, :c, 3, 4], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, 4, 5], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3, 4, 5], pr.call(1,2,3,4,5,6)
|
|
|
|
assert_equal [:a, :b, :c, nil, nil], pr.call([])
|
|
assert_equal [:a, :b, :c, 1, nil], pr.call([1])
|
|
assert_equal [:a, :b, :c, 1, 2], pr.call([1,2])
|
|
assert_equal [1, :b, :c, 2, 3], pr.call([1,2,3])
|
|
assert_equal [1, 2, :c, 3, 4], pr.call([1,2,3,4])
|
|
assert_equal [1, 2, 3, 4, 5], pr.call([1,2,3,4,5])
|
|
assert_equal [1, 2, 3, 4, 5], pr.call([1,2,3,4,5,6])
|
|
end
|
|
|
|
def test_proc_args_pos_opt_rest
|
|
pr = proc {|a,b,c=:c,*d|
|
|
[a,b,c,d]
|
|
}
|
|
assert_equal [nil, nil, :c, []], pr.call()
|
|
assert_equal [1, nil, :c, []], pr.call(1)
|
|
assert_equal [1, 2, :c, []], pr.call(1,2)
|
|
assert_equal [1, 2, 3, []], pr.call(1,2,3)
|
|
assert_equal [1, 2, 3, [4]], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, [4, 5]], pr.call(1,2,3,4,5)
|
|
|
|
assert_equal [nil, nil, :c, []], pr.call([])
|
|
assert_equal [1, nil, :c, []], pr.call([1])
|
|
assert_equal [1, 2, :c, []], pr.call([1,2])
|
|
assert_equal [1, 2, 3, []], pr.call([1,2,3])
|
|
assert_equal [1, 2, 3, [4]], pr.call([1,2,3,4])
|
|
assert_equal [1, 2, 3, [4, 5]], pr.call([1,2,3,4,5])
|
|
end
|
|
|
|
def test_proc_args_opt_rest
|
|
pr = proc {|a=:a,b=:b,c=:c,*d|
|
|
[a,b,c,d]
|
|
}
|
|
assert_equal [:a, :b, :c, []], pr.call()
|
|
assert_equal [1, :b, :c, []], pr.call(1)
|
|
assert_equal [1, 2, :c, []], pr.call(1,2)
|
|
assert_equal [1, 2, 3, []], pr.call(1,2,3)
|
|
assert_equal [1, 2, 3, [4]], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, [4, 5]], pr.call(1,2,3,4,5)
|
|
|
|
assert_equal [:a, :b, :c, []], pr.call([])
|
|
assert_equal [1, :b, :c, []], pr.call([1])
|
|
assert_equal [1, 2, :c, []], pr.call([1,2])
|
|
assert_equal [1, 2, 3, []], pr.call([1,2,3])
|
|
assert_equal [1, 2, 3, [4]], pr.call([1,2,3,4])
|
|
assert_equal [1, 2, 3, [4, 5]], pr.call([1,2,3,4,5])
|
|
end
|
|
|
|
def test_proc_args_pos_opt_rest_post
|
|
pr = proc {|a,b,c=:c,*d,e|
|
|
[a,b,c,d,e]
|
|
}
|
|
assert_equal [nil, nil, :c, [], nil], pr.call()
|
|
assert_equal [1, nil, :c, [], nil], pr.call(1)
|
|
assert_equal [1, 2, :c, [], nil], pr.call(1,2)
|
|
assert_equal [1, 2, :c, [], 3], pr.call(1,2,3)
|
|
assert_equal [1, 2, 3, [], 4], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, [4], 5], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3, [4,5], 6], pr.call(1,2,3,4,5,6)
|
|
|
|
assert_equal [nil, nil, :c, [], nil], pr.call([])
|
|
assert_equal [1, nil, :c, [], nil], pr.call([1])
|
|
assert_equal [1, 2, :c, [], nil], pr.call([1,2])
|
|
assert_equal [1, 2, :c, [], 3], pr.call([1,2,3])
|
|
assert_equal [1, 2, 3, [], 4], pr.call([1,2,3,4])
|
|
assert_equal [1, 2, 3, [4], 5], pr.call([1,2,3,4,5])
|
|
assert_equal [1, 2, 3, [4,5], 6], pr.call([1,2,3,4,5,6])
|
|
end
|
|
|
|
def test_proc_args_opt_rest_post
|
|
pr = proc {|a=:a,b=:b,c=:c,*d,e|
|
|
[a,b,c,d,e]
|
|
}
|
|
assert_equal [:a, :b, :c, [], nil], pr.call()
|
|
assert_equal [:a, :b, :c, [], 1], pr.call(1)
|
|
assert_equal [1, :b, :c, [], 2], pr.call(1,2)
|
|
assert_equal [1, 2, :c, [], 3], pr.call(1,2,3)
|
|
assert_equal [1, 2, 3, [], 4], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, [4], 5], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3, [4,5], 6], pr.call(1,2,3,4,5,6)
|
|
|
|
assert_equal [:a, :b, :c, [], nil], pr.call([])
|
|
assert_equal [:a, :b, :c, [], 1], pr.call([1])
|
|
assert_equal [1, :b, :c, [], 2], pr.call([1,2])
|
|
assert_equal [1, 2, :c, [], 3], pr.call([1,2,3])
|
|
assert_equal [1, 2, 3, [], 4], pr.call([1,2,3,4])
|
|
assert_equal [1, 2, 3, [4], 5], pr.call([1,2,3,4,5])
|
|
assert_equal [1, 2, 3, [4,5], 6], pr.call([1,2,3,4,5,6])
|
|
end
|
|
|
|
def test_proc_args_pos_block
|
|
pr = proc {|a,b,&c|
|
|
[a, b, c.class, c&&c.call(:x)]
|
|
}
|
|
assert_equal [nil, nil, NilClass, nil], pr.call()
|
|
assert_equal [1, nil, NilClass, nil], pr.call(1)
|
|
assert_equal [1, 2, NilClass, nil], pr.call(1,2)
|
|
assert_equal [1, 2, NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, NilClass, nil], pr.call(1,2,3,4)
|
|
|
|
assert_equal [nil, nil, NilClass, nil], pr.call([])
|
|
assert_equal [1, nil, NilClass, nil], pr.call([1])
|
|
assert_equal [1, 2, NilClass, nil], pr.call([1,2])
|
|
assert_equal [1, 2, NilClass, nil], pr.call([1,2,3])
|
|
assert_equal [1, 2, NilClass, nil], pr.call([1,2,3,4])
|
|
|
|
assert_equal [nil, nil, Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [1, nil, Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [1, 2, Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [1, 2, Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [1, 2, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
|
|
assert_equal [nil, nil, Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [1, nil, Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [1, 2, Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [1, 2, Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [1, 2, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
end
|
|
|
|
def test_proc_args_pos_rest_block
|
|
pr = proc {|a,b,*c,&d|
|
|
[a, b, c, d.class, d&&d.call(:x)]
|
|
}
|
|
assert_equal [nil, nil, [], NilClass, nil], pr.call()
|
|
assert_equal [1, nil, [], NilClass, nil], pr.call(1)
|
|
assert_equal [1, 2, [], NilClass, nil], pr.call(1,2)
|
|
assert_equal [1, 2, [3], NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, [3,4], NilClass, nil], pr.call(1,2,3,4)
|
|
|
|
assert_equal [nil, nil, [], Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [1, nil, [], Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [1, 2, [], Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [1, 2, [3], Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [1, 2, [3,4], Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
|
|
assert_equal [nil, nil, [], Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [1, nil, [], Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [1, 2, [], Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [1, 2, [3], Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [1, 2, [3,4], Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
end
|
|
|
|
def test_proc_args_rest_block
|
|
pr = proc {|*c,&d|
|
|
[c, d.class, d&&d.call(:x)]
|
|
}
|
|
assert_equal [[], NilClass, nil], pr.call()
|
|
assert_equal [[1], NilClass, nil], pr.call(1)
|
|
assert_equal [[1, 2], NilClass, nil], pr.call(1,2)
|
|
|
|
assert_equal [[], Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [[1], Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [[1, 2], Proc, :proc], (pr.call(1, 2){ :proc })
|
|
|
|
assert_equal [[], Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [[1], Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [[1, 2], Proc, :x], (pr.call(1, 2){|x| x})
|
|
end
|
|
|
|
def test_proc_args_pos_rest_post_block
|
|
pr = proc {|a,b,*c,d,e,&f|
|
|
[a, b, c, d, e, f.class, f&&f.call(:x)]
|
|
}
|
|
assert_equal [nil, nil, [], nil, nil, NilClass, nil], pr.call()
|
|
assert_equal [1, nil, [], nil, nil, NilClass, nil], pr.call(1)
|
|
assert_equal [1, 2, [], nil, nil, NilClass, nil], pr.call(1,2)
|
|
assert_equal [1, 2, [], 3, nil, NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, [], 3, 4, NilClass, nil], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, [3], 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, [3,4], 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
|
|
|
|
assert_equal [nil, nil, [], nil, nil, Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [1, nil, [], nil, nil, Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [1, 2, [], nil, nil, Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [1, 2, [], 3, nil, Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [1, 2, [], 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
assert_equal [1, 2, [3], 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
|
|
assert_equal [1, 2, [3,4], 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
|
|
|
|
assert_equal [nil, nil, [], nil, nil, Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [1, nil, [], nil, nil, Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [1, 2, [], nil, nil, Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [1, 2, [], 3, nil, Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [1, 2, [], 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
assert_equal [1, 2, [3], 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
|
|
assert_equal [1, 2, [3,4], 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
|
|
end
|
|
|
|
def test_proc_args_rest_post_block
|
|
pr = proc {|*c,d,e,&f|
|
|
[c, d, e, f.class, f&&f.call(:x)]
|
|
}
|
|
assert_equal [[], nil, nil, NilClass, nil], pr.call()
|
|
assert_equal [[], 1, nil, NilClass, nil], pr.call(1)
|
|
assert_equal [[], 1, 2, NilClass, nil], pr.call(1,2)
|
|
assert_equal [[1], 2, 3, NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [[1, 2], 3, 4, NilClass, nil], pr.call(1,2,3,4)
|
|
|
|
assert_equal [[], nil, nil, Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [[], 1, nil, Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [[], 1, 2, Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [[1], 2, 3, Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [[1, 2], 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
|
|
assert_equal [[], nil, nil, Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [[], 1, nil, Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [[], 1, 2, Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [[1], 2, 3, Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [[1, 2], 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
end
|
|
|
|
def test_proc_args_pos_opt_block
|
|
pr = proc {|a,b,c=:c,d=:d,&e|
|
|
[a, b, c, d, e.class, e&&e.call(:x)]
|
|
}
|
|
assert_equal [nil, nil, :c, :d, NilClass, nil], pr.call()
|
|
assert_equal [1, nil, :c, :d, NilClass, nil], pr.call(1)
|
|
assert_equal [1, 2, :c, :d, NilClass, nil], pr.call(1,2)
|
|
assert_equal [1, 2, 3, :d, NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, 3, 4, NilClass, nil], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, 4, NilClass, nil], pr.call(1,2,3,4,5)
|
|
|
|
assert_equal [nil, nil, :c, :d, Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [1, nil, :c, :d, Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [1, 2, :c, :d, Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [1, 2, 3, :d, Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [1, 2, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
assert_equal [1, 2, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
|
|
|
|
assert_equal [nil, nil, :c, :d, Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [1, nil, :c, :d, Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [1, 2, :c, :d, Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [1, 2, 3, :d, Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [1, 2, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
assert_equal [1, 2, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
|
|
end
|
|
|
|
def test_proc_args_opt_block
|
|
pr = proc {|a=:a,b=:b,c=:c,d=:d,&e|
|
|
[a, b, c, d, e.class, e&&e.call(:x)]
|
|
}
|
|
assert_equal [:a, :b, :c, :d, NilClass, nil], pr.call()
|
|
assert_equal [1, :b, :c, :d, NilClass, nil], pr.call(1)
|
|
assert_equal [1, 2, :c, :d, NilClass, nil], pr.call(1,2)
|
|
assert_equal [1, 2, 3, :d, NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, 3, 4, NilClass, nil], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, 4, NilClass, nil], pr.call(1,2,3,4,5)
|
|
|
|
assert_equal [:a, :b, :c, :d, Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [1, :b, :c, :d, Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [1, 2, :c, :d, Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [1, 2, 3, :d, Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [1, 2, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
assert_equal [1, 2, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
|
|
|
|
assert_equal [:a, :b, :c, :d, Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [1, :b, :c, :d, Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [1, 2, :c, :d, Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [1, 2, 3, :d, Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [1, 2, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
assert_equal [1, 2, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
|
|
end
|
|
|
|
def test_proc_args_pos_opt_post_block
|
|
pr = proc {|a,b,c=:c,d=:d,e,f,&g|
|
|
[a, b, c, d, e, f, g.class, g&&g.call(:x)]
|
|
}
|
|
assert_equal [nil, nil, :c, :d, nil, nil, NilClass, nil], pr.call()
|
|
assert_equal [1, nil, :c, :d, nil, nil, NilClass, nil], pr.call(1)
|
|
assert_equal [1, 2, :c, :d, nil, nil, NilClass, nil], pr.call(1,2)
|
|
assert_equal [1, 2, :c, :d, 3, nil, NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, :c, :d, 3, 4, NilClass, nil], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, :d, 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3, 4, 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
|
|
assert_equal [1, 2, 3, 4, 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6,7)
|
|
|
|
assert_equal [nil, nil, :c, :d, nil, nil, Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [1, nil, :c, :d, nil, nil, Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [1, 2, :c, :d, nil, nil, Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [1, 2, :c, :d, 3, nil, Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [1, 2, :c, :d, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
assert_equal [1, 2, 3, :d, 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
|
|
assert_equal [1, 2, 3, 4, 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
|
|
assert_equal [1, 2, 3, 4, 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7){ :proc })
|
|
|
|
assert_equal [nil, nil, :c, :d, nil, nil, Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [1, nil, :c, :d, nil, nil, Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [1, 2, :c, :d, nil, nil, Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [1, 2, :c, :d, 3, nil, Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [1, 2, :c, :d, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
assert_equal [1, 2, 3, :d, 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
|
|
assert_equal [1, 2, 3, 4, 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
|
|
assert_equal [1, 2, 3, 4, 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7){|x| x})
|
|
end
|
|
|
|
def test_proc_args_opt_post_block
|
|
pr = proc {|a=:a,b=:b,c=:c,d=:d,e,f,&g|
|
|
[a, b, c, d, e, f, g.class, g&&g.call(:x)]
|
|
}
|
|
assert_equal [:a, :b, :c, :d, nil, nil, NilClass, nil], pr.call()
|
|
assert_equal [:a, :b, :c, :d, 1, nil, NilClass, nil], pr.call(1)
|
|
assert_equal [:a, :b, :c, :d, 1, 2, NilClass, nil], pr.call(1,2)
|
|
assert_equal [1, :b, :c, :d, 2, 3, NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, :c, :d, 3, 4, NilClass, nil], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, :d, 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3, 4, 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
|
|
assert_equal [1, 2, 3, 4, 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6,7)
|
|
|
|
assert_equal [:a, :b, :c, :d, nil, nil, Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [:a, :b, :c, :d, 1, nil, Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [:a, :b, :c, :d, 1, 2, Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [1, :b, :c, :d, 2, 3, Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [1, 2, :c, :d, 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
assert_equal [1, 2, 3, :d, 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
|
|
assert_equal [1, 2, 3, 4, 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
|
|
assert_equal [1, 2, 3, 4, 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7){ :proc })
|
|
|
|
assert_equal [:a, :b, :c, :d, nil, nil, Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [:a, :b, :c, :d, 1, nil, Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [:a, :b, :c, :d, 1, 2, Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [1, :b, :c, :d, 2, 3, Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [1, 2, :c, :d, 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
assert_equal [1, 2, 3, :d, 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
|
|
assert_equal [1, 2, 3, 4, 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
|
|
assert_equal [1, 2, 3, 4, 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7){|x| x})
|
|
end
|
|
|
|
def test_proc_args_pos_opt_rest_block
|
|
pr = proc {|a,b,c=:c,d=:d,*e,&f|
|
|
[a, b, c, d, e, f.class, f&&f.call(:x)]
|
|
}
|
|
assert_equal [nil, nil, :c, :d, [], NilClass, nil], pr.call()
|
|
assert_equal [1, nil, :c, :d, [], NilClass, nil], pr.call(1)
|
|
assert_equal [1, 2, :c, :d, [], NilClass, nil], pr.call(1,2)
|
|
assert_equal [1, 2, 3, :d, [], NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, 3, 4, [], NilClass, nil], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, 4, [5], NilClass, nil], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3, 4, [5,6], NilClass, nil], pr.call(1,2,3,4,5,6)
|
|
|
|
assert_equal [nil, nil, :c, :d, [], Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [1, nil, :c, :d, [], Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [1, 2, :c, :d, [], Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [1, 2, 3, :d, [], Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [1, 2, 3, 4, [], Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
assert_equal [1, 2, 3, 4, [5], Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
|
|
assert_equal [1, 2, 3, 4, [5,6], Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
|
|
|
|
assert_equal [nil, nil, :c, :d, [], Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [1, nil, :c, :d, [], Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [1, 2, :c, :d, [], Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [1, 2, 3, :d, [], Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [1, 2, 3, 4, [], Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
assert_equal [1, 2, 3, 4, [5], Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
|
|
assert_equal [1, 2, 3, 4, [5,6], Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
|
|
end
|
|
|
|
def test_proc_args_opt_rest_block
|
|
pr = proc {|a=:a,b=:b,c=:c,d=:d,*e,&f|
|
|
[a, b, c, d, e, f.class, f&&f.call(:x)]
|
|
}
|
|
assert_equal [:a, :b, :c, :d, [], NilClass, nil], pr.call()
|
|
assert_equal [1, :b, :c, :d, [], NilClass, nil], pr.call(1)
|
|
assert_equal [1, 2, :c, :d, [], NilClass, nil], pr.call(1,2)
|
|
assert_equal [1, 2, 3, :d, [], NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, 3, 4, [], NilClass, nil], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, 4, [5], NilClass, nil], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3, 4, [5,6], NilClass, nil], pr.call(1,2,3,4,5,6)
|
|
|
|
assert_equal [:a, :b, :c, :d, [], Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [1, :b, :c, :d, [], Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [1, 2, :c, :d, [], Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [1, 2, 3, :d, [], Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [1, 2, 3, 4, [], Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
assert_equal [1, 2, 3, 4, [5], Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
|
|
assert_equal [1, 2, 3, 4, [5,6], Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
|
|
|
|
assert_equal [:a, :b, :c, :d, [], Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [1, :b, :c, :d, [], Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [1, 2, :c, :d, [], Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [1, 2, 3, :d, [], Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [1, 2, 3, 4, [], Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
assert_equal [1, 2, 3, 4, [5], Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
|
|
assert_equal [1, 2, 3, 4, [5,6], Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
|
|
end
|
|
|
|
def test_proc_args_pos_opt_rest_post_block
|
|
pr = proc {|a,b,c=:c,d=:d,*e,f,g,&h|
|
|
[a, b, c, d, e, f, g, h.class, h&&h.call(:x)]
|
|
}
|
|
assert_equal [nil, nil, :c, :d, [], nil, nil, NilClass, nil], pr.call()
|
|
assert_equal [1, nil, :c, :d, [], nil, nil, NilClass, nil], pr.call(1)
|
|
assert_equal [1, 2, :c, :d, [], nil, nil, NilClass, nil], pr.call(1,2)
|
|
assert_equal [1, 2, :c, :d, [], 3, nil, NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, :c, :d, [], 3, 4, NilClass, nil], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, :d, [], 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3, 4, [], 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
|
|
assert_equal [1, 2, 3, 4, [5], 6, 7, NilClass, nil], pr.call(1,2,3,4,5,6,7)
|
|
assert_equal [1, 2, 3, 4, [5,6], 7, 8, NilClass, nil], pr.call(1,2,3,4,5,6,7,8)
|
|
|
|
assert_equal [nil, nil, :c, :d, [], nil, nil, Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [1, nil, :c, :d, [], nil, nil, Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [1, 2, :c, :d, [], nil, nil, Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [1, 2, :c, :d, [], 3, nil, Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [1, 2, :c, :d, [], 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
assert_equal [1, 2, 3, :d, [], 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
|
|
assert_equal [1, 2, 3, 4, [], 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
|
|
assert_equal [1, 2, 3, 4, [5], 6, 7, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7){ :proc })
|
|
assert_equal [1, 2, 3, 4, [5,6], 7, 8, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7, 8){ :proc })
|
|
|
|
assert_equal [nil, nil, :c, :d, [], nil, nil, Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [1, nil, :c, :d, [], nil, nil, Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [1, 2, :c, :d, [], nil, nil, Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [1, 2, :c, :d, [], 3, nil, Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [1, 2, :c, :d, [], 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
assert_equal [1, 2, 3, :d, [], 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
|
|
assert_equal [1, 2, 3, 4, [], 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
|
|
assert_equal [1, 2, 3, 4, [5], 6, 7, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7){|x| x})
|
|
assert_equal [1, 2, 3, 4, [5,6], 7, 8, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7, 8){|x| x})
|
|
end
|
|
|
|
def test_proc_args_opt_rest_post_block
|
|
pr = proc {|a=:a,b=:b,c=:c,d=:d,*e,f,g,&h|
|
|
[a, b, c, d, e, f, g, h.class, h&&h.call(:x)]
|
|
}
|
|
assert_equal [:a, :b, :c, :d, [], nil, nil, NilClass, nil], pr.call()
|
|
assert_equal [:a, :b, :c, :d, [], 1, nil, NilClass, nil], pr.call(1)
|
|
assert_equal [:a, :b, :c, :d, [], 1, 2, NilClass, nil], pr.call(1,2)
|
|
assert_equal [1, :b, :c, :d, [], 2, 3, NilClass, nil], pr.call(1,2,3)
|
|
assert_equal [1, 2, :c, :d, [], 3, 4, NilClass, nil], pr.call(1,2,3,4)
|
|
assert_equal [1, 2, 3, :d, [], 4, 5, NilClass, nil], pr.call(1,2,3,4,5)
|
|
assert_equal [1, 2, 3, 4, [], 5, 6, NilClass, nil], pr.call(1,2,3,4,5,6)
|
|
assert_equal [1, 2, 3, 4, [5], 6, 7, NilClass, nil], pr.call(1,2,3,4,5,6,7)
|
|
assert_equal [1, 2, 3, 4, [5,6], 7, 8, NilClass, nil], pr.call(1,2,3,4,5,6,7,8)
|
|
|
|
assert_equal [:a, :b, :c, :d, [], nil, nil, Proc, :proc], (pr.call(){ :proc })
|
|
assert_equal [:a, :b, :c, :d, [], 1, nil, Proc, :proc], (pr.call(1){ :proc })
|
|
assert_equal [:a, :b, :c, :d, [], 1, 2, Proc, :proc], (pr.call(1, 2){ :proc })
|
|
assert_equal [1, :b, :c, :d, [], 2, 3, Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
|
assert_equal [1, 2, :c, :d, [], 3, 4, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
|
assert_equal [1, 2, 3, :d, [], 4, 5, Proc, :proc], (pr.call(1, 2, 3, 4, 5){ :proc })
|
|
assert_equal [1, 2, 3, 4, [], 5, 6, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6){ :proc })
|
|
assert_equal [1, 2, 3, 4, [5], 6, 7, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7){ :proc })
|
|
assert_equal [1, 2, 3, 4, [5,6], 7, 8, Proc, :proc], (pr.call(1, 2, 3, 4, 5, 6, 7, 8){ :proc })
|
|
|
|
assert_equal [:a, :b, :c, :d, [], nil, nil, Proc, :x], (pr.call(){|x| x})
|
|
assert_equal [:a, :b, :c, :d, [], 1, nil, Proc, :x], (pr.call(1){|x| x})
|
|
assert_equal [:a, :b, :c, :d, [], 1, 2, Proc, :x], (pr.call(1, 2){|x| x})
|
|
assert_equal [1, :b, :c, :d, [], 2, 3, Proc, :x], (pr.call(1, 2, 3){|x| x})
|
|
assert_equal [1, 2, :c, :d, [], 3, 4, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
|
assert_equal [1, 2, 3, :d, [], 4, 5, Proc, :x], (pr.call(1, 2, 3, 4, 5){|x| x})
|
|
assert_equal [1, 2, 3, 4, [], 5, 6, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6){|x| x})
|
|
assert_equal [1, 2, 3, 4, [5], 6, 7, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7){|x| x})
|
|
assert_equal [1, 2, 3, 4, [5,6], 7, 8, Proc, :x], (pr.call(1, 2, 3, 4, 5, 6, 7, 8){|x| x})
|
|
end
|
|
|
|
def test_proc_args_pos_unleashed
|
|
r = proc {|a,b=1,*c,d,e|
|
|
[a,b,c,d,e]
|
|
}.call(1,2,3,4,5)
|
|
assert_equal([1,2,[3],4,5], r, "[ruby-core:19485]")
|
|
end
|
|
|
|
def test_parameters
|
|
assert_equal([], proc {}.parameters)
|
|
assert_equal([], proc {||}.parameters)
|
|
assert_equal([[:opt, :a]], proc {|a|}.parameters)
|
|
assert_equal([[:opt, :a], [:opt, :b]], proc {|a, b|}.parameters)
|
|
assert_equal([[:opt, :a], [:block, :b]], proc {|a=:a, &b|}.parameters)
|
|
assert_equal([[:opt, :a], [:opt, :b]], proc {|a, b=:b|}.parameters)
|
|
assert_equal([[:rest, :a]], proc {|*a|}.parameters)
|
|
assert_equal([[:opt, :a], [:rest, :b], [:block, :c]], proc {|a, *b, &c|}.parameters)
|
|
assert_equal([[:opt, :a], [:rest, :b], [:opt, :c]], proc {|a, *b, c|}.parameters)
|
|
assert_equal([[:opt, :a], [:rest, :b], [:opt, :c], [:block, :d]], proc {|a, *b, c, &d|}.parameters)
|
|
assert_equal([[:opt, :a], [:opt, :b], [:rest, :c], [:opt, :d], [:block, :e]], proc {|a, b=:b, *c, d, &e|}.parameters)
|
|
assert_equal([[:opt, nil], [:block, :b]], proc {|(a), &b|a}.parameters)
|
|
assert_equal([[:opt, :a], [:opt, :b], [:opt, :c], [:opt, :d], [:rest, :e], [:opt, :f], [:opt, :g], [:block, :h]], proc {|a,b,c=:c,d=:d,*e,f,g,&h|}.parameters)
|
|
|
|
assert_equal([[:req]], method(:putc).parameters)
|
|
assert_equal([[:rest]], method(:p).parameters)
|
|
|
|
pr = eval("proc{|"+"(_),"*30+"|}")
|
|
assert_empty(pr.parameters.map{|_,n|n}.compact)
|
|
end
|
|
|
|
def pm0() end
|
|
def pm1(a) end
|
|
def pm2(a, b) end
|
|
def pmo1(a = :a, &b) end
|
|
def pmo2(a, b = :b) end
|
|
def pmo3(*a) end
|
|
def pmo4(a, *b, &c) end
|
|
def pmo5(a, *b, c) end
|
|
def pmo6(a, *b, c, &d) end
|
|
def pmo7(a, b = :b, *c, d, &e) end
|
|
def pma1((a), &b) a; end
|
|
def pmk1(**) end
|
|
def pmk2(**o) nil && o end
|
|
def pmk3(a, **o) nil && o end
|
|
def pmk4(a = nil, **o) nil && o end
|
|
def pmk5(a, b = nil, **o) nil && o end
|
|
def pmk6(a, b = nil, c, **o) nil && o end
|
|
def pmk7(a, b = nil, *c, d, **o) nil && o end
|
|
|
|
|
|
def test_bound_parameters
|
|
assert_equal([], method(:pm0).to_proc.parameters)
|
|
assert_equal([[:req, :a]], method(:pm1).to_proc.parameters)
|
|
assert_equal([[:req, :a], [:req, :b]], method(:pm2).to_proc.parameters)
|
|
assert_equal([[:opt, :a], [:block, :b]], method(:pmo1).to_proc.parameters)
|
|
assert_equal([[:req, :a], [:opt, :b]], method(:pmo2).to_proc.parameters)
|
|
assert_equal([[:rest, :a]], method(:pmo3).to_proc.parameters)
|
|
assert_equal([[:req, :a], [:rest, :b], [:block, :c]], method(:pmo4).to_proc.parameters)
|
|
assert_equal([[:req, :a], [:rest, :b], [:req, :c]], method(:pmo5).to_proc.parameters)
|
|
assert_equal([[:req, :a], [:rest, :b], [:req, :c], [:block, :d]], method(:pmo6).to_proc.parameters)
|
|
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :e]], method(:pmo7).to_proc.parameters)
|
|
assert_equal([[:req], [:block, :b]], method(:pma1).to_proc.parameters)
|
|
assert_equal([[:keyrest]], method(:pmk1).to_proc.parameters)
|
|
assert_equal([[:keyrest, :o]], method(:pmk2).to_proc.parameters)
|
|
assert_equal([[:req, :a], [:keyrest, :o]], method(:pmk3).to_proc.parameters)
|
|
assert_equal([[:opt, :a], [:keyrest, :o]], method(:pmk4).to_proc.parameters)
|
|
assert_equal([[:req, :a], [:opt, :b], [:keyrest, :o]], method(:pmk5).to_proc.parameters)
|
|
assert_equal([[:req, :a], [:opt, :b], [:req, :c], [:keyrest, :o]], method(:pmk6).to_proc.parameters)
|
|
assert_equal([[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:keyrest, :o]], method(:pmk7).to_proc.parameters)
|
|
|
|
assert_equal([], "".method(:empty?).to_proc.parameters)
|
|
assert_equal([[:rest]], "".method(:gsub).to_proc.parameters)
|
|
assert_equal([[:rest]], proc {}.curry.parameters)
|
|
end
|
|
|
|
def test_to_s
|
|
assert_match(/^#<Proc:0x\h+ #{ Regexp.quote(__FILE__) }:\d+>$/, proc {}.to_s)
|
|
assert_match(/^#<Proc:0x\h+ #{ Regexp.quote(__FILE__) }:\d+ \(lambda\)>$/, lambda {}.to_s)
|
|
assert_match(/^#<Proc:0x\h+ \(lambda\)>$/, method(:p).to_proc.to_s)
|
|
name = "Proc\u{1f37b}"
|
|
assert_include(EnvUtil.labeled_class(name, Proc).new {}.to_s, name)
|
|
end
|
|
|
|
@@line_of_source_location_test = __LINE__ + 1
|
|
def source_location_test a=1,
|
|
b=2
|
|
end
|
|
|
|
def test_source_location
|
|
file, lineno = method(:source_location_test).source_location
|
|
assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
|
|
assert_equal(@@line_of_source_location_test, lineno, 'Bug #2427')
|
|
end
|
|
|
|
@@line_of_attr_reader_source_location_test = __LINE__ + 3
|
|
@@line_of_attr_writer_source_location_test = __LINE__ + 3
|
|
@@line_of_attr_accessor_source_location_test = __LINE__ + 3
|
|
attr_reader :attr_reader_source_location_test
|
|
attr_writer :attr_writer_source_location_test
|
|
attr_accessor :attr_accessor_source_location_test
|
|
|
|
def test_attr_source_location
|
|
file, lineno = method(:attr_reader_source_location_test).source_location
|
|
assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
|
|
assert_equal(@@line_of_attr_reader_source_location_test, lineno)
|
|
|
|
file, lineno = method(:attr_writer_source_location_test=).source_location
|
|
assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
|
|
assert_equal(@@line_of_attr_writer_source_location_test, lineno)
|
|
|
|
file, lineno = method(:attr_accessor_source_location_test).source_location
|
|
assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
|
|
assert_equal(@@line_of_attr_accessor_source_location_test, lineno)
|
|
|
|
file, lineno = method(:attr_accessor_source_location_test=).source_location
|
|
assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
|
|
assert_equal(@@line_of_attr_accessor_source_location_test, lineno)
|
|
end
|
|
|
|
def block_source_location_test(*args, &block)
|
|
block.source_location
|
|
end
|
|
|
|
def test_block_source_location
|
|
exp_lineno = __LINE__ + 3
|
|
file, lineno = block_source_location_test(1,
|
|
2,
|
|
3) do
|
|
end
|
|
assert_match(/^#{ Regexp.quote(__FILE__) }$/, file)
|
|
assert_equal(exp_lineno, lineno)
|
|
end
|
|
|
|
def test_splat_without_respond_to
|
|
def (obj = Object.new).respond_to?(m,*); false end
|
|
[obj].each do |a, b|
|
|
assert_equal([obj, nil], [a, b], '[ruby-core:24139]')
|
|
end
|
|
end
|
|
|
|
def test_curry_with_trace
|
|
# bug3751 = '[ruby-core:31871]'
|
|
set_trace_func(proc {})
|
|
methods.grep(/\Atest_curry/) do |test|
|
|
next if test == __method__
|
|
__send__(test)
|
|
end
|
|
ensure
|
|
set_trace_func(nil)
|
|
end
|
|
|
|
def test_block_propagation
|
|
bug3792 = '[ruby-core:32075]'
|
|
c = Class.new do
|
|
def foo
|
|
yield
|
|
end
|
|
end
|
|
|
|
o = c.new
|
|
f = :foo.to_proc
|
|
assert_nothing_raised(LocalJumpError, bug3792) {
|
|
assert_equal('bar', f.(o) {'bar'}, bug3792)
|
|
}
|
|
assert_nothing_raised(LocalJumpError, bug3792) {
|
|
assert_equal('zot', o.method(:foo).to_proc.() {'zot'}, bug3792)
|
|
}
|
|
end
|
|
|
|
def test_overridden_lambda
|
|
bug8345 = '[ruby-core:54687] [Bug #8345]'
|
|
assert_normal_exit('def lambda; end; method(:puts).to_proc', bug8345)
|
|
end
|
|
|
|
def test_overridden_proc
|
|
bug8345 = '[ruby-core:54688] [Bug #8345]'
|
|
assert_normal_exit('def proc; end; ->{}.curry', bug8345)
|
|
end
|
|
|
|
def get_binding if: 1, case: 2, when: 3, begin: 4, end: 5
|
|
a ||= 0
|
|
binding
|
|
end
|
|
|
|
def test_local_variables
|
|
b = get_binding
|
|
assert_equal(%i'if case when begin end a', b.local_variables)
|
|
a = tap {|;x, y| x = y = x; break binding.local_variables}
|
|
assert_equal(%i[a b x y], a.sort)
|
|
end
|
|
|
|
def test_local_variables_nested
|
|
b = tap {break binding}
|
|
assert_equal(%i[b], b.local_variables, '[ruby-dev:48351] [Bug #10001]')
|
|
end
|
|
|
|
def local_variables_of(bind)
|
|
this_should_not_be_in_bind = this_should_not_be_in_bind = 2
|
|
bind.local_variables
|
|
end
|
|
|
|
def test_local_variables_in_other_context
|
|
feature8773 = '[Feature #8773]'
|
|
assert_equal([:feature8773], local_variables_of(binding), feature8773)
|
|
end
|
|
|
|
def test_local_variable_get
|
|
b = get_binding
|
|
assert_equal(0, b.local_variable_get(:a))
|
|
assert_raise(NameError){ b.local_variable_get(:b) }
|
|
|
|
# access keyword named local variables
|
|
assert_equal(1, b.local_variable_get(:if))
|
|
assert_equal(2, b.local_variable_get(:case))
|
|
assert_equal(3, b.local_variable_get(:when))
|
|
assert_equal(4, b.local_variable_get(:begin))
|
|
assert_equal(5, b.local_variable_get(:end))
|
|
end
|
|
|
|
def test_local_variable_set
|
|
b = get_binding
|
|
b.local_variable_set(:a, 10)
|
|
b.local_variable_set(:b, 20)
|
|
assert_equal(10, b.local_variable_get(:a))
|
|
assert_equal(20, b.local_variable_get(:b))
|
|
assert_equal(10, b.eval("a"))
|
|
assert_equal(20, b.eval("b"))
|
|
end
|
|
|
|
def test_local_variable_set_wb
|
|
assert_ruby_status([], <<-'end;', '[Bug #13605]', timeout: 30)
|
|
b = binding
|
|
n = 20_000
|
|
|
|
n.times do |i|
|
|
v = rand(2_000)
|
|
name = "n#{v}"
|
|
value = Object.new
|
|
b.local_variable_set name, value
|
|
end
|
|
end;
|
|
end
|
|
|
|
def test_local_variable_defined?
|
|
b = get_binding
|
|
assert_equal(true, b.local_variable_defined?(:a))
|
|
assert_equal(false, b.local_variable_defined?(:b))
|
|
end
|
|
|
|
def test_binding_receiver
|
|
feature8779 = '[ruby-dev:47613] [Feature #8779]'
|
|
|
|
assert_same(self, binding.receiver, feature8779)
|
|
|
|
obj = Object.new
|
|
def obj.b; binding; end
|
|
assert_same(obj, obj.b.receiver, feature8779)
|
|
end
|
|
|
|
def test_proc_mark
|
|
assert_normal_exit(<<-'EOS')
|
|
def f
|
|
Enumerator.new{
|
|
100000.times {|i|
|
|
yield
|
|
s = "#{i}"
|
|
}
|
|
}
|
|
end
|
|
|
|
def g
|
|
x = proc{}
|
|
f(&x)
|
|
end
|
|
e = g
|
|
e.each {}
|
|
EOS
|
|
end
|
|
|
|
def test_prepended_call
|
|
assert_in_out_err([], "#{<<~"begin;"}\n#{<<~'end;'}", ["call"])
|
|
begin;
|
|
Proc.prepend Module.new {def call() puts "call"; super; end}
|
|
def m(&blk) blk.call; end
|
|
m {}
|
|
end;
|
|
end
|
|
|
|
def test_refined_call
|
|
assert_in_out_err([], "#{<<~"begin;"}\n#{<<~'end;'}", ["call"])
|
|
begin;
|
|
using Module.new {refine(Proc) {def call() puts "call"; super; end}}
|
|
def m(&blk) blk.call; end
|
|
m {}
|
|
end;
|
|
end
|
|
|
|
def method_for_test_proc_without_block_for_symbol
|
|
assert_warn(/Capturing the given block using Kernel#proc is deprecated/) do
|
|
binding.eval('proc')
|
|
end
|
|
end
|
|
|
|
def test_proc_without_block_for_symbol
|
|
assert_equal('1', method_for_test_proc_without_block_for_symbol(&:to_s).call(1), '[Bug #14782]')
|
|
end
|
|
|
|
def test_compose
|
|
f = proc {|x| x * 2}
|
|
g = proc {|x| x + 1}
|
|
|
|
assert_equal(6, (f << g).call(2))
|
|
assert_equal(6, (g >> f).call(2))
|
|
end
|
|
|
|
def test_compose_with_multiple_args
|
|
f = proc {|x| x * 2}
|
|
g = proc {|x, y| x + y}
|
|
|
|
assert_equal(6, (f << g).call(1, 2))
|
|
assert_equal(6, (g >> f).call(1, 2))
|
|
end
|
|
|
|
def test_compose_with_block
|
|
f = proc {|x| x * 2}
|
|
g = proc {|&blk| blk.call(1) }
|
|
|
|
assert_equal(8, (f << g).call { |x| x + 3 })
|
|
assert_equal(8, (g >> f).call { |x| x + 3 })
|
|
end
|
|
|
|
def test_compose_with_lambda
|
|
f = lambda {|x| x * 2}
|
|
g = lambda {|x| x}
|
|
|
|
assert_predicate((f << g), :lambda?)
|
|
assert_predicate((g >> f), :lambda?)
|
|
end
|
|
|
|
def test_compose_with_method
|
|
f = proc {|x| x * 2}
|
|
c = Class.new {
|
|
def g(x) x + 1 end
|
|
}
|
|
g = c.new.method(:g)
|
|
|
|
assert_equal(6, (f << g).call(2))
|
|
assert_equal(5, (f >> g).call(2))
|
|
end
|
|
|
|
def test_compose_with_callable
|
|
f = proc {|x| x * 2}
|
|
c = Class.new {
|
|
def call(x) x + 1 end
|
|
}
|
|
g = c.new
|
|
|
|
assert_equal(6, (f << g).call(2))
|
|
assert_equal(5, (f >> g).call(2))
|
|
end
|
|
|
|
def test_compose_with_noncallable
|
|
f = proc {|x| x * 2}
|
|
|
|
assert_raise(TypeError) {
|
|
(f << 5).call(2)
|
|
}
|
|
assert_raise(TypeError) {
|
|
(f >> 5).call(2)
|
|
}
|
|
end
|
|
|
|
def test_orphan_return
|
|
assert_equal(42, Module.new { extend self
|
|
def m1(&b) b.call end; def m2(); m1 { return 42 } end }.m2)
|
|
assert_equal(42, Module.new { extend self
|
|
def m1(&b) b end; def m2(); m1 { return 42 }.call end }.m2)
|
|
assert_raise(LocalJumpError) { Module.new { extend self
|
|
def m1(&b) b end; def m2(); m1 { return 42 } end }.m2.call }
|
|
end
|
|
|
|
def test_orphan_break
|
|
assert_equal(42, Module.new { extend self
|
|
def m1(&b) b.call end; def m2(); m1 { break 42 } end }.m2 )
|
|
assert_raise(LocalJumpError) { Module.new { extend self
|
|
def m1(&b) b end; def m2(); m1 { break 42 }.call end }.m2 }
|
|
assert_raise(LocalJumpError) { Module.new { extend self
|
|
def m1(&b) b end; def m2(); m1 { break 42 } end }.m2.call }
|
|
end
|
|
|
|
def test_not_orphan_next
|
|
assert_equal(42, Module.new { extend self
|
|
def m1(&b) b.call end; def m2(); m1 { next 42 } end }.m2)
|
|
assert_equal(42, Module.new { extend self
|
|
def m1(&b) b end; def m2(); m1 { next 42 }.call end }.m2)
|
|
assert_equal(42, Module.new { extend self
|
|
def m1(&b) b end; def m2(); m1 { next 42 } end }.m2.call)
|
|
end
|
|
end
|
|
|
|
class TestProcKeywords < Test::Unit::TestCase
|
|
def test_compose_keywords
|
|
f = ->(**kw) { kw.merge(:a=>1) }
|
|
g = ->(kw) { kw.merge(:a=>2) }
|
|
|
|
assert_equal(2, (f >> g).call(a: 3)[:a])
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (f << g).call(a: 3)[:a])
|
|
end
|
|
assert_equal(2, (f >> g).call(a: 3)[:a])
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (f << g).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(2, (f >> g).call({a: 3})[:a])
|
|
end
|
|
assert_equal(2, (g << f).call(a: 3)[:a])
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (g >> f).call(a: 3)[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(2, (g << f).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (g >> f).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The keyword argument is passed as the last hash parameter.*The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (f << g).call(**{})[:a])
|
|
end
|
|
assert_equal(2, (f >> g).call(**{})[:a])
|
|
end
|
|
|
|
def test_compose_keywords_method
|
|
f = ->(**kw) { kw.merge(:a=>1) }.method(:call)
|
|
g = ->(kw) { kw.merge(:a=>2) }.method(:call)
|
|
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (f << g).call(a: 3)[:a])
|
|
end
|
|
assert_equal(2, (f >> g).call(a: 3)[:a])
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (f << g).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(2, (f >> g).call({a: 3})[:a])
|
|
end
|
|
assert_equal(2, (g << f).call(a: 3)[:a])
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (g >> f).call(a: 3)[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(2, (g << f).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (g >> f).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The keyword argument is passed as the last hash parameter.*The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (f << g).call(**{})[:a])
|
|
end
|
|
assert_equal(2, (f >> g).call(**{})[:a])
|
|
end
|
|
|
|
def test_compose_keywords_non_proc
|
|
f = ->(**kw) { kw.merge(:a=>1) }
|
|
g = Object.new
|
|
def g.call(kw) kw.merge(:a=>2) end
|
|
def g.to_proc; method(:call).to_proc; end
|
|
def g.<<(f) to_proc << f end
|
|
def g.>>(f) to_proc >> f end
|
|
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (f << g).call(a: 3)[:a])
|
|
end
|
|
assert_equal(2, (f >> g).call(a: 3)[:a])
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (f << g).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(2, (f >> g).call({a: 3})[:a])
|
|
end
|
|
assert_equal(2, (g << f).call(a: 3)[:a])
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (g >> f).call(a: 3)[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(2, (g << f).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for method/m) do
|
|
assert_equal(1, (g >> f).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The keyword argument is passed as the last hash parameter.*for `call'/m) do
|
|
assert_equal(1, (f << g).call(**{})[:a])
|
|
end
|
|
assert_equal(2, (f >> g).call(**{})[:a])
|
|
|
|
f = ->(kw) { kw.merge(:a=>1) }
|
|
g = Object.new
|
|
def g.call(**kw) kw.merge(:a=>2) end
|
|
def g.to_proc; method(:call).to_proc; end
|
|
def g.<<(f) to_proc << f end
|
|
def g.>>(f) to_proc >> f end
|
|
|
|
assert_equal(1, (f << g).call(a: 3)[:a])
|
|
assert_warn(/The last argument is used as the keyword parameter.*for `call'/m) do
|
|
assert_equal(2, (f >> g).call(a: 3)[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for `call'/m) do
|
|
assert_equal(1, (f << g).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for `call'/m) do
|
|
assert_equal(2, (f >> g).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for `call'/m) do
|
|
assert_equal(2, (g << f).call(a: 3)[:a])
|
|
end
|
|
assert_equal(1, (g >> f).call(a: 3)[:a])
|
|
assert_warn(/The last argument is used as the keyword parameter.*for `call'/m) do
|
|
assert_equal(2, (g << f).call({a: 3})[:a])
|
|
end
|
|
assert_warn(/The last argument is used as the keyword parameter.*for `call'/m) do
|
|
assert_equal(1, (g >> f).call({a: 3})[:a])
|
|
end
|
|
assert_equal(1, (f << g).call(**{})[:a])
|
|
assert_warn(/The keyword argument is passed as the last hash parameter.*The last argument is used as the keyword parameter.*for `call'/m) do
|
|
assert_equal(2, (f >> g).call(**{})[:a])
|
|
end
|
|
end
|
|
end
|
|
|