[270] | 1 | ##
|
---|
| 2 | # Proc ISO Test
|
---|
| 3 |
|
---|
| 4 | assert('Proc', '15.2.17') do
|
---|
| 5 | assert_equal Class, Proc.class
|
---|
| 6 | end
|
---|
| 7 |
|
---|
| 8 | assert('Proc.new', '15.2.17.3.1') do
|
---|
| 9 | assert_raise ArgumentError do
|
---|
| 10 | Proc.new
|
---|
| 11 | end
|
---|
| 12 |
|
---|
| 13 | assert_equal (Proc.new {}).class, Proc
|
---|
| 14 | end
|
---|
| 15 |
|
---|
| 16 | assert('Proc#[]', '15.2.17.4.1') do
|
---|
| 17 | a = 0
|
---|
| 18 | b = Proc.new { a += 1 }
|
---|
| 19 | b.[]
|
---|
| 20 |
|
---|
| 21 | a2 = 0
|
---|
| 22 | b2 = Proc.new { |i| a2 += i }
|
---|
| 23 | b2.[](5)
|
---|
| 24 |
|
---|
| 25 | assert_equal 1, a
|
---|
| 26 | assert_equal 5, a2
|
---|
| 27 | end
|
---|
| 28 |
|
---|
| 29 | assert('Proc#arity', '15.2.17.4.2') do
|
---|
| 30 | a = Proc.new {|x, y|}.arity
|
---|
| 31 | b = Proc.new {|x, *y, z|}.arity
|
---|
| 32 | c = Proc.new {|x=0, y|}.arity
|
---|
| 33 | d = Proc.new {|(x, y), z=0|}.arity
|
---|
| 34 |
|
---|
| 35 | assert_equal 2, a
|
---|
| 36 | assert_equal(-3, b)
|
---|
| 37 | assert_equal 1, c
|
---|
| 38 | assert_equal 1, d
|
---|
| 39 |
|
---|
| 40 | e = ->(x=0, y){}.arity
|
---|
| 41 | f = ->((x, y), z=0){}.arity
|
---|
| 42 | g = ->(x=0){}.arity
|
---|
| 43 |
|
---|
| 44 | assert_equal(-2, e)
|
---|
| 45 | assert_equal(-2, f)
|
---|
| 46 | assert_equal(-1, g)
|
---|
| 47 | end
|
---|
| 48 |
|
---|
| 49 | assert('Proc#call', '15.2.17.4.3') do
|
---|
| 50 | a = 0
|
---|
| 51 | b = Proc.new { a += 1 }
|
---|
| 52 | b.call
|
---|
| 53 |
|
---|
| 54 | a2 = 0
|
---|
| 55 | b2 = Proc.new { |i| a2 += i }
|
---|
| 56 | b2.call(5)
|
---|
| 57 |
|
---|
| 58 | assert_equal 1, a
|
---|
| 59 | assert_equal 5, a2
|
---|
| 60 | end
|
---|
| 61 |
|
---|
| 62 | assert('Proc#call proc args pos block') do
|
---|
| 63 | pr = Proc.new {|a,b,&c|
|
---|
| 64 | [a, b, c.class, c&&c.call(:x)]
|
---|
| 65 | }
|
---|
| 66 | assert_equal [nil, nil, Proc, :proc], (pr.call(){ :proc })
|
---|
| 67 | assert_equal [1, nil, Proc, :proc], (pr.call(1){ :proc })
|
---|
| 68 | assert_equal [1, 2, Proc, :proc], (pr.call(1, 2){ :proc })
|
---|
| 69 | assert_equal [1, 2, Proc, :proc], (pr.call(1, 2, 3){ :proc })
|
---|
| 70 | assert_equal [1, 2, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
|
---|
| 71 |
|
---|
| 72 | assert_equal [nil, nil, Proc, :x], (pr.call(){|x| x})
|
---|
| 73 | assert_equal [1, nil, Proc, :x], (pr.call(1){|x| x})
|
---|
| 74 | assert_equal [1, 2, Proc, :x], (pr.call(1, 2){|x| x})
|
---|
| 75 | assert_equal [1, 2, Proc, :x], (pr.call(1, 2, 3){|x| x})
|
---|
| 76 | assert_equal [1, 2, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
|
---|
| 77 | end
|
---|
| 78 |
|
---|
| 79 | assert('Proc#call proc args pos rest post') do
|
---|
| 80 | pr = Proc.new {|a,b,*c,d,e|
|
---|
| 81 | [a,b,c,d,e]
|
---|
| 82 | }
|
---|
| 83 | assert_equal [nil, nil, [], nil, nil], pr.call()
|
---|
| 84 | assert_equal [1, nil, [], nil, nil], pr.call(1)
|
---|
| 85 | assert_equal [1, 2, [], nil, nil], pr.call(1,2)
|
---|
| 86 | assert_equal [1, 2, [], 3, nil], pr.call(1,2,3)
|
---|
| 87 | assert_equal [1, 2, [], 3, 4], pr.call(1,2,3,4)
|
---|
| 88 | assert_equal [1, 2, [3], 4, 5], pr.call(1,2,3,4,5)
|
---|
| 89 | assert_equal [1, 2, [3, 4], 5, 6], pr.call(1,2,3,4,5,6)
|
---|
| 90 | assert_equal [1, 2, [3, 4, 5], 6,7], pr.call(1,2,3,4,5,6,7)
|
---|
| 91 |
|
---|
| 92 | assert_equal [nil, nil, [], nil, nil], pr.call([])
|
---|
| 93 | assert_equal [1, nil, [], nil, nil], pr.call([1])
|
---|
| 94 | assert_equal [1, 2, [], nil, nil], pr.call([1,2])
|
---|
| 95 | assert_equal [1, 2, [], 3, nil], pr.call([1,2,3])
|
---|
| 96 | assert_equal [1, 2, [], 3, 4], pr.call([1,2,3,4])
|
---|
| 97 | assert_equal [1, 2, [3], 4, 5], pr.call([1,2,3,4,5])
|
---|
| 98 | assert_equal [1, 2, [3, 4], 5, 6], pr.call([1,2,3,4,5,6])
|
---|
| 99 | assert_equal [1, 2, [3, 4, 5], 6,7], pr.call([1,2,3,4,5,6,7])
|
---|
| 100 | end
|
---|
| 101 |
|
---|
| 102 | assert('Proc#return_does_not_break_self') do
|
---|
| 103 | class TestClass
|
---|
| 104 | attr_accessor :block
|
---|
| 105 | def initialize
|
---|
| 106 | end
|
---|
| 107 | def return_array
|
---|
| 108 | @block = Proc.new { self }
|
---|
| 109 | return []
|
---|
| 110 | end
|
---|
| 111 | def return_instance_variable
|
---|
| 112 | @block = Proc.new { self }
|
---|
| 113 | return @block
|
---|
| 114 | end
|
---|
| 115 | def return_const_fixnum
|
---|
| 116 | @block = Proc.new { self }
|
---|
| 117 | return 123
|
---|
| 118 | end
|
---|
| 119 | def return_nil
|
---|
| 120 | @block = Proc.new { self }
|
---|
| 121 | return nil
|
---|
| 122 | end
|
---|
| 123 | end
|
---|
| 124 |
|
---|
| 125 | c = TestClass.new
|
---|
| 126 | assert_equal [], c.return_array
|
---|
| 127 | assert_equal c, c.block.call
|
---|
| 128 |
|
---|
| 129 | c.return_instance_variable
|
---|
| 130 | assert_equal c, c.block.call
|
---|
| 131 |
|
---|
| 132 | assert_equal 123, c.return_const_fixnum
|
---|
| 133 | assert_equal c, c.block.call
|
---|
| 134 |
|
---|
| 135 | assert_equal nil, c.return_nil
|
---|
| 136 | assert_equal c, c.block.call
|
---|
| 137 | end
|
---|
| 138 |
|
---|
[331] | 139 | assert('call Proc#initialize if defined') do
|
---|
| 140 | a = []
|
---|
| 141 | c = Class.new(Proc) do
|
---|
| 142 | define_method(:initialize) do
|
---|
| 143 | a << :ok
|
---|
| 144 | end
|
---|
| 145 | end
|
---|
| 146 |
|
---|
| 147 | assert_kind_of c, c.new{}
|
---|
| 148 | assert_equal [:ok], a
|
---|
| 149 | end
|
---|
| 150 |
|
---|
[270] | 151 | assert('&obj call to_proc if defined') do
|
---|
| 152 | pr = Proc.new{}
|
---|
| 153 | def mock(&b)
|
---|
| 154 | b
|
---|
| 155 | end
|
---|
| 156 | assert_equal pr.object_id, mock(&pr).object_id
|
---|
| 157 | assert_equal pr, mock(&pr)
|
---|
| 158 |
|
---|
| 159 | obj = Object.new
|
---|
| 160 | def obj.to_proc
|
---|
| 161 | Proc.new{ :from_to_proc }
|
---|
| 162 | end
|
---|
| 163 | assert_equal :from_to_proc, mock(&obj).call
|
---|
| 164 |
|
---|
| 165 | assert_raise(TypeError){ mock(&(Object.new)) }
|
---|
| 166 | end
|
---|