source: EcnlProtoTool/trunk/mruby-1.2.0/mrbgems/mruby-enumerator/test/enumerator.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: 11.0 KB
Line 
1@obj = Object.new
2class << @obj
3 include Enumerable
4 def foo *a
5 a.each { |x| yield x }
6 end
7end
8
9assert 'Enumerator' do
10 assert_equal Class, Enumerator.class
11end
12
13assert 'Enumerator' do
14 assert_equal Object, Enumerator.superclass
15end
16
17assert 'Enumerator.new' do
18 assert_equal [0,1,2], 3.times.map{|i| i}.sort
19 assert_equal [:x,:y,:z], [:x,:y,:z].each.map{|i| i}.sort
20 assert_equal [[:x,1],[:y,2]], {x:1, y:2}.each.map{|i| i}.sort
21 assert_equal [1,2,3], @obj.to_enum(:foo, 1,2,3).to_a
22 assert_equal [1,2,3], Enumerator.new(@obj, :foo, 1,2,3).to_a
23 assert_equal [1,2,3], Enumerator.new { |y| i = 0; loop { y << (i += 1) } }.take(3)
24 assert_raise(ArgumentError) { Enumerator.new }
25 enum = @obj.to_enum
26 assert_raise(NoMethodError) { enum.each {} }
27
28 # examples
29 fib = Enumerator.new do |y|
30 a = b = 1
31 loop do
32 y << a
33 a, b = b, a + b
34 end
35 end
36 assert_equal fib.take(10), [1,1,2,3,5,8,13,21,34,55]
37end
38
39assert 'Enumerator#initialize_copy' do
40 assert_equal [1, 2, 3], @obj.to_enum(:foo, 1, 2, 3).dup.to_a
41 e = @obj.to_enum :foo, 1, 2, 3
42 assert_nothing_raised { assert_equal(1, e.next) }
43 assert_raise(TypeError) { e.dup }
44
45 e = Enumerator.new { |y| i = 0; loop { y << (i += 1) } }.dup
46 assert_nothing_raised { assert_equal(1, e.next) }
47 assert_raise(TypeError) { e.dup }
48end
49
50assert 'Enumerator#with_index' do
51 assert_equal([[1,0],[2,1],[3,2]], @obj.to_enum(:foo, 1, 2, 3).with_index.to_a)
52 assert_equal([[1,5],[2,6],[3,7]], @obj.to_enum(:foo, 1, 2, 3).with_index(5).to_a)
53end
54
55assert 'Enumerator#with_index nonnum offset' do
56 s = Object.new
57 def s.to_int; 1 end
58 assert_equal([[1,1],[2,2],[3,3]], @obj.to_enum(:foo, 1, 2, 3).with_index(s).to_a)
59end
60
61assert 'Enumerator#with_index string offset' do
62 assert_raise(TypeError){ @obj.to_enum(:foo, 1, 2, 3).with_index('1').to_a }
63end
64
65assert 'Enumerator#with_object' do
66 obj = [0, 1]
67 ret = (1..10).each.with_object(obj) {|i, memo|
68 memo[0] += i
69 memo[1] *= i
70 }
71 assert_true(obj.equal?(ret))
72 assert_equal([55, 3628800], ret)
73end
74
75assert 'Enumerator#with_object arguments' do
76 to_three = Enumerator.new do |y|
77 3.times do |x|
78 y << x
79 end
80 end
81
82 a = []
83 to_three_with_string = to_three.with_object("foo")
84 to_three_with_string.each do |x,string|
85 a << "#{string}:#{x}"
86 end
87 assert_equal ["foo:0","foo:1","foo:2"], a
88end
89
90assert 'Enumerator#inspect' do
91 e = (0..10).each
92 assert_equal("#<Enumerator: 0..10:each>", e.inspect)
93 e = Enumerator.new("FooObject", :foo, 1)
94 assert_equal("#<Enumerator: FooObject:foo(1)>", e.inspect)
95 e = Enumerator.new("FooObject", :foo, 1, 2, 3)
96 assert_equal("#<Enumerator: FooObject:foo(1, 2, 3)>", e.inspect)
97end
98
99assert 'Enumerator#each' do
100 o = Object.new
101 def o.each(ary)
102 ary << 1
103 yield
104 end
105 ary = []
106 e = o.to_enum.each(ary)
107 e.next
108 assert_equal([1], ary)
109end
110
111assert 'Enumerator#each arguments' do
112 obj = Object.new
113
114 def obj.each_arg(a, b=:b, *rest)
115 yield a
116 yield b
117 yield rest
118 :method_returned
119 end
120
121 enum = obj.to_enum :each_arg, :a, :x
122
123 assert_equal [:a, :x, []], enum.each.to_a
124 assert_true enum.each.equal?(enum)
125 assert_equal :method_returned, enum.each { |elm| elm }
126
127 assert_equal [:a, :x, [:y, :z]], enum.each(:y, :z).to_a
128 assert_false enum.each(:y, :z).equal?(enum)
129 assert_equal :method_returned, enum.each(:y, :z) { |elm| elm }
130end
131
132assert 'Enumerator#next' do
133 e = 3.times
134 3.times { |i|
135 assert_equal i, e.next
136 }
137 assert_raise(StopIteration) { e.next }
138end
139
140assert 'Enumerator#next_values' do
141 o = Object.new
142 def o.each
143 yield
144 yield 1
145 yield 1, 2
146 end
147 e = o.to_enum
148 assert_equal nil, e.next
149 assert_equal 1, e.next
150 assert_equal [1,2], e.next
151 e = o.to_enum
152 assert_equal [], e.next_values
153 assert_equal [1], e.next_values
154 assert_equal [1,2], e.next_values
155end
156
157assert 'Enumerator#peek' do
158 a = [1]
159 e = a.each
160 assert_equal 1, e.peek
161 assert_equal 1, e.peek
162 assert_equal 1, e.next
163 assert_raise(StopIteration) { e.peek }
164 assert_raise(StopIteration) { e.peek }
165end
166
167assert 'Enumerator#peek modify' do
168 o = Object.new
169 def o.each
170 yield 1,2
171 end
172 e = o.to_enum
173 a = e.peek
174 a << 3
175 assert_equal([1,2], e.peek)
176end
177
178assert 'Enumerator#peek_values' do
179 o = Object.new
180 def o.each
181 yield
182 yield 1
183 yield 1, 2
184 end
185 e = o.to_enum
186 assert_equal nil, e.peek
187 assert_equal nil, e.next
188 assert_equal 1, e.peek
189 assert_equal 1, e.next
190 assert_equal [1,2], e.peek
191 assert_equal [1,2], e.next
192 e = o.to_enum
193 assert_equal [], e.peek_values
194 assert_equal [], e.next_values
195 assert_equal [1], e.peek_values
196 assert_equal [1], e.next_values
197 assert_equal [1,2], e.peek_values
198 assert_equal [1,2], e.next_values
199 e = o.to_enum
200 assert_equal [], e.peek_values
201 assert_equal nil, e.next
202 assert_equal [1], e.peek_values
203 assert_equal 1, e.next
204 assert_equal [1,2], e.peek_values
205 assert_equal [1,2], e.next
206 e = o.to_enum
207 assert_equal nil, e.peek
208 assert_equal [], e.next_values
209 assert_equal 1, e.peek
210 assert_equal [1], e.next_values
211 assert_equal [1,2], e.peek
212 assert_equal [1,2], e.next_values
213end
214
215assert 'Enumerator#peek_values modify' do
216 o = Object.new
217 def o.each
218 yield 1,2
219 end
220 e = o.to_enum
221 a = e.peek_values
222 a << 3
223 assert_equal [1,2], e.peek
224end
225
226assert 'Enumerator#feed' do
227 o = Object.new
228 def o.each(ary)
229 ary << yield
230 ary << yield
231 ary << yield
232 end
233 ary = []
234 e = o.to_enum :each, ary
235 e.next
236 e.feed 1
237 e.next
238 e.feed 2
239 e.next
240 e.feed 3
241 assert_raise(StopIteration) { e.next }
242 assert_equal [1,2,3], ary
243end
244
245assert 'Enumerator#feed mixed' do
246 o = Object.new
247 def o.each(ary)
248 ary << yield
249 ary << yield
250 ary << yield
251 end
252 ary = []
253 e = o.to_enum :each, ary
254 e.next
255 e.feed 1
256 e.next
257 e.next
258 e.feed 3
259 assert_raise(StopIteration) { e.next }
260 assert_equal [1,nil,3], ary
261end
262
263assert 'Enumerator#feed twice' do
264 o = Object.new
265 def o.each(ary)
266 ary << yield
267 ary << yield
268 ary << yield
269 end
270 ary = []
271 e = o.to_enum :each, ary
272 e.feed 1
273 assert_raise(TypeError) { e.feed 2 }
274end
275
276assert 'Enumerator#feed before first next' do
277 o = Object.new
278 def o.each(ary)
279 ary << yield
280 ary << yield
281 ary << yield
282 end
283 ary = []
284 e = o.to_enum :each, ary
285 e.feed 1
286 e.next
287 e.next
288 assert_equal [1], ary
289end
290
291assert 'Enumerator#feed yielder' do
292 x = nil
293 e = Enumerator.new {|y| x = y.yield; 10 }
294 e.next
295 e.feed 100
296 assert_raise(StopIteration) { e.next }
297 assert_equal 100, x
298end
299
300assert 'Enumerator#rewind' do
301 e = @obj.to_enum(:foo, 1, 2, 3)
302 assert_equal 1, e.next
303 assert_equal 2, e.next
304 e.rewind
305 assert_equal 1, e.next
306 assert_equal 2, e.next
307 assert_equal 3, e.next
308 assert_raise(StopIteration) { e.next }
309end
310
311assert 'Enumerator#rewind clear feed' do
312 o = Object.new
313 def o.each(ary)
314 ary << yield
315 ary << yield
316 ary << yield
317 end
318 ary = []
319 e = o.to_enum(:each, ary)
320 e.next
321 e.feed 1
322 e.next
323 e.feed 2
324 e.rewind
325 e.next
326 e.next
327 assert_equal([1,nil], ary)
328end
329
330assert 'Enumerator#rewind clear' do
331 o = Object.new
332 def o.each(ary)
333 ary << yield
334 ary << yield
335 ary << yield
336 end
337 ary = []
338 e = o.to_enum :each, ary
339 e.next
340 e.feed 1
341 e.next
342 e.feed 2
343 e.rewind
344 e.next
345 e.next
346 assert_equal [1,nil], ary
347end
348
349assert 'Enumerator::Generator' do
350 # note: Enumerator::Generator is a class just for internal
351 g = Enumerator::Generator.new {|y| y << 1 << 2 << 3; :foo }
352 g2 = g.dup
353 a = []
354 assert_equal(:foo, g.each {|x| a << x })
355 assert_equal([1, 2, 3], a)
356 a = []
357 assert_equal(:foo, g2.each {|x| a << x })
358 assert_equal([1, 2, 3], a)
359end
360
361assert 'Enumerator::Generator args' do
362 g = Enumerator::Generator.new {|y, x| y << 1 << 2 << 3; x }
363 a = []
364 assert_equal(:bar, g.each(:bar) {|x| a << x })
365 assert_equal([1, 2, 3], a)
366end
367
368assert 'Enumerator::Yielder' do
369 # note: Enumerator::Yielder is a class just for internal
370 a = []
371 y = Enumerator::Yielder.new {|x| a << x }
372 assert_equal(y, y << 1 << 2 << 3)
373 assert_equal([1, 2, 3], a)
374
375 a = []
376 y = Enumerator::Yielder.new {|x| a << x }
377 assert_equal([1], y.yield(1))
378 assert_equal([1, 2], y.yield(2))
379 assert_equal([1, 2, 3], y.yield(3))
380
381 assert_raise(LocalJumpError) { Enumerator::Yielder.new }
382end
383
384assert 'next after StopIteration' do
385 a = [1]
386 e = a.each
387 assert_equal(1, e.next)
388 assert_raise(StopIteration) { e.next }
389 assert_raise(StopIteration) { e.next }
390 e.rewind
391 assert_equal(1, e.next)
392 assert_raise(StopIteration) { e.next }
393 assert_raise(StopIteration) { e.next }
394end
395
396assert 'gc' do
397 assert_nothing_raised do
398 1.times do
399 foo = [1,2,3].to_enum
400 GC.start
401 end
402 GC.start
403 end
404end
405
406assert 'nested iteration' do
407 def (o = Object.new).each
408 yield :ok1
409 yield [:ok2, :x].each.next
410 end
411 e = o.to_enum
412 assert_equal :ok1, e.next
413 assert_equal :ok2, e.next
414 assert_raise(StopIteration) { e.next }
415end
416
417assert 'Kernel#to_enum' do
418 assert_equal Enumerator, [].to_enum.class
419 assert_raise(ArgumentError){ nil.to_enum }
420end
421
422assert 'modifying existing methods' do
423 assert_equal Enumerator, loop.class
424 e = 3.times
425 i = 0
426 loop_ret = loop {
427 assert_equal i, e.next
428 i += 1
429 }
430end
431
432assert 'Integral#times' do
433 a = 3
434 b = a.times
435 c = []
436 b.with_object(c) do |i, obj|
437 obj << i
438 end
439 assert_equal 3, a
440 assert_equal Enumerator, b.class
441 assert_equal [0,1,2], c
442end
443
444assert 'Enumerable#each_with_index' do
445 assert_equal [['a',0],['b',1],['c',2]], ['a','b','c'].each_with_index.to_a
446end
447
448assert 'Enumerable#map' do
449 a = [1,2,3]
450 b = a.map
451 c = b.with_index do |i, index|
452 [i*i, index*index]
453 end
454 assert_equal [1,2,3], a
455 assert_equal [[1,0],[4,1],[9,4]], c
456end
457
458assert 'Enumerable#find_all' do
459 assert_equal [[3,4]], [[1,2],[3,4],[5,6]].find_all.each{ |i| i[1] == 4 }
460end
461
462assert 'Array#each_index' do
463 a = [1,2,3]
464 b = a.each_index
465 c = []
466 b.with_index do |index1,index2|
467 c << [index1+2,index2+5]
468 end
469 assert_equal [1,2,3], a
470 assert_equal [[2,5],[3,6],[4,7]], c
471end
472
473assert 'Array#map!' do
474 a = [1,2,3]
475 b = a.map!
476 b.with_index do |i, index|
477 [i*i, index*index]
478 end
479 assert_equal [[1,0],[4,1],[9,4]], a
480end
481
482assert 'Hash#each' do
483 a = {a:1,b:2}
484 b = a.each
485 c = []
486 b.each do |k,v|
487 c << [k,v]
488 end
489 assert_equal [[:a,1], [:b,2]], c.sort
490end
491
492assert 'Hash#each_key' do
493 assert_equal [:a,:b], {a:1,b:2}.each_key.to_a.sort
494end
495
496assert 'Hash#each_value' do
497 assert_equal [1,2], {a:1,b:2}.each_value.to_a.sort
498end
499
500assert 'Hash#select' do
501 h = {1=>2,3=>4,5=>6}
502 hret = h.select.with_index {|a,b| a[1] == 4}
503 assert_equal({3=>4}, hret)
504 assert_equal({1=>2,3=>4,5=>6}, h)
505end
506
507assert 'Hash#select!' do
508 h = {1=>2,3=>4,5=>6}
509 hret = h.select!.with_index {|a,b| a[1] == 4}
510 assert_equal h, hret
511 assert_equal({3=>4}, h)
512end
513
514assert 'Hash#reject' do
515 h = {1=>2,3=>4,5=>6}
516 hret = h.reject.with_index {|a,b| a[1] == 4}
517 assert_equal({1=>2,5=>6}, hret)
518 assert_equal({1=>2,3=>4,5=>6}, h)
519end
520
521assert 'Hash#reject!' do
522 h = {1=>2,3=>4,5=>6}
523 hret = h.reject!.with_index {|a,b| a[1] == 4}
524 assert_equal h, hret
525 assert_equal({1=>2,5=>6}, h)
526end
527
528assert 'Range#each' do
529 a = (1..5)
530 b = a.each
531 c = []
532 b.each do |i|
533 c << i
534 end
535 assert_equal [1,2,3,4,5], c
536end
Note: See TracBrowser for help on using the repository browser.