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 |
|
---|
139 | assert('&obj call to_proc if defined') do
|
---|
140 | pr = Proc.new{}
|
---|
141 | def mock(&b)
|
---|
142 | b
|
---|
143 | end
|
---|
144 | assert_equal pr.object_id, mock(&pr).object_id
|
---|
145 | assert_equal pr, mock(&pr)
|
---|
146 |
|
---|
147 | obj = Object.new
|
---|
148 | def obj.to_proc
|
---|
149 | Proc.new{ :from_to_proc }
|
---|
150 | end
|
---|
151 | assert_equal :from_to_proc, mock(&obj).call
|
---|
152 |
|
---|
153 | assert_raise(TypeError){ mock(&(Object.new)) }
|
---|
154 | end
|
---|