source: EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-enumerator/test/enumerator.rb@ 331

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

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

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