source: EcnlProtoTool/trunk/mruby-1.2.0/test/t/proc.rb@ 270

Last change on this file since 270 was 270, checked in by coas-nagasima, 7 years ago

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 3.7 KB
Line 
1##
2# Proc ISO Test
3
4assert('Proc', '15.2.17') do
5 assert_equal Class, Proc.class
6end
7
8assert('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
14end
15
16assert('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
27end
28
29assert('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)
47end
48
49assert('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
60end
61
62assert('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})
77end
78
79assert('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])
100end
101
102assert('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
137end
138
139assert('&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)) }
154end
Note: See TracBrowser for help on using the repository browser.