Apply PIE to nghttpx
[platform/upstream/nghttp2.git] / third-party / mruby / mrbgems / mruby-array-ext / test / array.rb
1 ##
2 # Array(Ext) Test
3
4 assert("Array#assoc") do
5   s1 = [ "colors", "red", "blue", "green" ]
6   s2 = [ "letters", "a", "b", "c" ]
7   s3 = "foo"
8   a  = [ s1, s2, s3 ]
9
10   assert_equal [ "letters", "a", "b", "c" ], a.assoc("letters")
11   assert_nil a.assoc("foo")
12 end
13
14 assert("Array#at") do
15   a = [ "a", "b", "c", "d", "e" ]
16   assert_equal "a", a.at(0)
17   assert_equal "e", a.at(-1)
18 end
19
20 assert("Array#rassoc") do
21   a = [ [ 1, "one"], [2, "two"], [3, "three"], ["ii", "two"] ]
22
23   assert_equal [2, "two"], a.rassoc("two")
24   assert_nil a.rassoc("four")
25 end
26
27 assert("Array#uniq!") do
28   a = [1, 2, 3, 1]
29   a.uniq!
30   assert_equal [1, 2, 3], a
31
32   b = [ "a", "b", "c" ]
33   assert_nil b.uniq!
34
35   c = [["student","sam"], ["student","george"], ["teacher","matz"]]
36   assert_equal [["student", "sam"], ["teacher", "matz"]], c.uniq! { |s| s.first }
37
38   d = [["student","sam"], ["teacher","matz"]]
39   assert_nil d.uniq! { |s| s.first }
40 end
41
42 assert("Array#uniq") do
43   a = [1, 2, 3, 1]
44   assert_equal [1, 2, 3], a.uniq
45   assert_equal [1, 2, 3, 1], a
46
47   b = [["student","sam"], ["student","george"], ["teacher","matz"]]
48   assert_equal [["student", "sam"], ["teacher", "matz"]], b.uniq { |s| s.first }
49 end
50
51 assert("Array#-") do
52   a = [1, 2, 3, 1]
53   b = [1]
54   c = 1
55
56   assert_raise(TypeError) { a - c }
57   assert_equal [2, 3], (a - b)
58   assert_equal [1, 2, 3, 1], a
59 end
60
61 assert("Array#|") do
62   a = [1, 2, 3, 1]
63   b = [1, 4]
64   c = 1
65
66   assert_raise(TypeError) { a | c }
67   assert_equal [1, 2, 3, 4], (a | b)
68   assert_equal [1, 2, 3, 1], a
69 end
70
71 assert("Array#union") do
72   a = [1, 2, 3, 1]
73   b = [1, 4]
74   c = [1, 5]
75
76   assert_equal [1, 2, 3, 4, 5], a.union(b,c)
77 end
78
79 assert("Array#&") do
80   a = [1, 2, 3, 1]
81   b = [1, 4]
82   c = 1
83
84   assert_raise(TypeError) { a & c }
85   assert_equal [1], (a & b)
86   assert_equal [1, 2, 3, 1], a
87 end
88
89 assert("Array#flatten") do
90   assert_equal [1, 2, "3", {4=>5}, :'6'],    [1, 2, "3", {4=>5}, :'6'].flatten
91   assert_equal [1, 2, 3, 4, 5, 6], [1, 2,    [3, 4, 5], 6].flatten
92   assert_equal [1, 2, 3, 4, 5, 6], [1, 2,    [3, [4, 5], 6]].flatten
93   assert_equal [1, [2, [3, [4, [5, [6]]]]]], [1, [2, [3, [4, [5, [6]]]]]].flatten(0)
94   assert_equal [1, 2, [3, [4, [5, [6]]]]],   [1, [2, [3, [4, [5, [6]]]]]].flatten(1)
95   assert_equal [1, 2, 3, [4, [5, [6]]]],     [1, [2, [3, [4, [5, [6]]]]]].flatten(2)
96   assert_equal [1, 2, 3, 4, [5, [6]]],       [1, [2, [3, [4, [5, [6]]]]]].flatten(3)
97   assert_equal [1, 2, 3, 4, 5, [6]],         [1, [2, [3, [4, [5, [6]]]]]].flatten(4)
98   assert_equal [1, 2, 3, 4, 5, 6],           [1, [2, [3, [4, [5, [6]]]]]].flatten(5)
99 end
100
101 assert("Array#flatten!") do
102   assert_equal [1, 2, 3, 4, 5, 6], [1, 2, [3, [4, 5], 6]].flatten!
103 end
104
105 assert("Array#compact") do
106   a = [1, nil, "2", nil, :t, false, nil]
107   assert_equal [1, "2", :t, false], a.compact
108   assert_equal [1, nil, "2", nil, :t, false, nil], a
109 end
110
111 assert("Array#compact!") do
112   a = [1, nil, "2", nil, :t, false, nil]
113   a.compact!
114   assert_equal [1, "2", :t, false], a
115 end
116
117 assert("Array#fetch") do
118   a = [ 11, 22, 33, 44 ]
119   assert_equal 22, a.fetch(1)
120   assert_equal 44, a.fetch(-1)
121   assert_equal 'cat', a.fetch(4, 'cat')
122   ret = 0
123   a.fetch(100) { |i| ret = i }
124   assert_equal 100, ret
125   assert_raise(IndexError) { a.fetch(100) }
126 end
127
128 assert("Array#fill") do
129   a = [ "a", "b", "c", "d" ]
130   assert_equal ["x", "x", "x", "x"], a.fill("x")
131   assert_equal ["x", "x", "x", "w"], a.fill("w", -1)
132   assert_equal ["x", "x", "z", "z"], a.fill("z", 2, 2)
133   assert_equal ["y", "y", "z", "z"], a.fill("y", 0..1)
134   assert_equal [0, 1, 4, 9], a.fill { |i| i*i }
135   assert_equal [0, 1, 8, 27], a.fill(-2) { |i| i*i*i }
136   assert_equal [0, 2, 3, 27], a.fill(1, 2) { |i| i+1 }
137   assert_equal [1, 2, 3, 27], a.fill(0..1) { |i| i+1 }
138   assert_raise(ArgumentError) { a.fill }
139
140   assert_equal([0, 1, 2, 3, -1, 5], [0, 1, 2, 3, 4, 5].fill(-1, -2, 1))
141   assert_equal([0, 1, 2, 3, -1, -1, -1], [0, 1, 2, 3, 4, 5].fill(-1, -2, 3))
142   assert_equal([0, 1, 2, -1, -1, 5], [0, 1, 2, 3, 4, 5].fill(-1, 3..4))
143   assert_equal([0, 1, 2, -1, 4, 5], [0, 1, 2, 3, 4, 5].fill(-1, 3...4))
144   assert_equal([0, 1, -1, -1, -1, 5], [0, 1, 2, 3, 4, 5].fill(-1, 2..-2))
145   assert_equal([0, 1, -1, -1, 4, 5], [0, 1, 2, 3, 4, 5].fill(-1, 2...-2))
146   assert_equal([0, 1, 2, 13, 14, 5], [0, 1, 2, 3, 4, 5].fill(3..4){|i| i+10})
147   assert_equal([0, 1, 2, 13, 4, 5], [0, 1, 2, 3, 4, 5].fill(3...4){|i| i+10})
148   assert_equal([0, 1, 12, 13, 14, 5], [0, 1, 2, 3, 4, 5].fill(2..-2){|i| i+10})
149   assert_equal([0, 1, 12, 13, 4, 5], [0, 1, 2, 3, 4, 5].fill(2...-2){|i| i+10})
150
151   assert_equal [1, 2, 3, 4, 'x', 'x'], [1, 2, 3, 4, 5, 6].fill('x', -2..-1)
152   assert_equal [1, 2, 3, 4, 'x', 6], [1, 2, 3, 4, 5, 6].fill('x', -2...-1)
153   assert_equal [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6].fill('x', -2...-2)
154   assert_equal [1, 2, 3, 4, 'x', 6], [1, 2, 3, 4, 5, 6].fill('x', -2..-2)
155   assert_equal [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6].fill('x', -2..0)
156 end
157
158 assert("Array#reverse_each") do
159   a = [ "a", "b", "c", "d" ]
160   b = []
161   a.reverse_each do |i|
162     b << i
163   end
164   assert_equal [ "d", "c", "b", "a" ], b
165
166   if Object.const_defined?(:Enumerator)
167     assert_equal [ "d", "c", "b", "a" ], a.reverse_each.to_a
168   else
169     true
170   end
171 end
172
173 assert("Array#rotate") do
174   a = ["a", "b", "c", "d"]
175   assert_equal ["b", "c", "d", "a"], a.rotate
176   assert_equal ["a", "b", "c", "d"], a
177   assert_equal ["c", "d", "a", "b"], a.rotate(2)
178   assert_equal ["b", "c", "d", "a"], a.rotate(-3)
179   assert_equal ["c", "d", "a", "b"], a.rotate(10)
180   assert_equal [], [].rotate
181 end
182
183 assert("Array#rotate!") do
184   a = ["a", "b", "c", "d"]
185   assert_equal ["b", "c", "d", "a"], a.rotate!
186   assert_equal ["b", "c", "d", "a"], a
187   assert_equal ["d", "a", "b", "c"], a.rotate!(2)
188   assert_equal ["a", "b", "c", "d"], a.rotate!(-3)
189   assert_equal ["c", "d", "a", "b"], a.rotate(10)
190   assert_equal [], [].rotate!
191 end
192
193 assert("Array#delete_if") do
194   a = [1, 2, 3, 4, 5]
195   assert_equal [1, 2, 3, 4, 5], a.delete_if { false }
196   assert_equal [1, 2, 3, 4, 5], a
197
198   a = [1, 2, 3, 4, 5]
199   assert_equal [], a.delete_if { true }
200   assert_equal [], a
201
202   a = [1, 2, 3, 4, 5]
203   assert_equal [1, 2, 3], a.delete_if { |i| i > 3 }
204   assert_equal [1, 2, 3], a
205 end
206
207 assert("Array#reject!") do
208   a = [1, 2, 3, 4, 5]
209   assert_nil a.reject! { false }
210   assert_equal [1, 2, 3, 4, 5], a
211
212   a = [1, 2, 3, 4, 5]
213   assert_equal [], a.reject! { true }
214   assert_equal [], a
215
216   a = [1, 2, 3, 4, 5]
217   assert_equal [1, 2, 3], a.reject! { |val| val > 3 }
218   assert_equal [1, 2, 3], a
219 end
220
221 assert("Array#insert") do
222   a = ["a", "b", "c", "d"]
223   assert_equal ["a", "b", 99, "c", "d"], a.insert(2, 99)
224   assert_equal ["a", "b", 99, "c", 1, 2, 3, "d"], a.insert(-2, 1, 2, 3)
225
226   b = ["a", "b", "c", "d"]
227   assert_equal ["a", "b", "c", "d", nil, nil, 99], b.insert(6, 99)
228 end
229
230 assert("Array#bsearch") do
231   # Find minimum mode
232   a = [0, 2, 4]
233   assert_equal 0, a.bsearch{ |x| x >= -1 }
234   assert_equal 0, a.bsearch{ |x| x >= 0 }
235   assert_equal 2, a.bsearch{ |x| x >= 1 }
236   assert_equal 2, a.bsearch{ |x| x >= 2 }
237   assert_equal 4, a.bsearch{ |x| x >= 3 }
238   assert_equal 4, a.bsearch{ |x| x >= 4 }
239   assert_nil      a.bsearch{ |x| x >= 5 }
240
241   # Find any mode
242   a = [0, 4, 8]
243   def between(lo, x, hi)
244     if x < lo
245       1
246     elsif x > hi
247       -1
248     else
249       0
250     end
251   end
252   assert_nil      a.bsearch{ |x| between(-3, x, -1) }
253   assert_equal 0, a.bsearch{ |x| between(-1, x,  1) }
254   assert_nil      a.bsearch{ |x| between( 1, x,  3) }
255   assert_equal 4, a.bsearch{ |x| between( 3, x,  5) }
256   assert_nil      a.bsearch{ |x| between( 5, x,  7) }
257   assert_equal 8, a.bsearch{ |x| between( 7, x,  9) }
258   assert_nil      a.bsearch{ |x| between( 9, x, 11) }
259
260   assert_equal 0, a.bsearch{ |x| between( 0, x,  3) }
261   assert_equal 4, a.bsearch{ |x| between( 0, x,  4) }
262   assert_equal 4, a.bsearch{ |x| between( 4, x,  8) }
263   assert_equal 8, a.bsearch{ |x| between( 5, x,  8) }
264
265   # Invalid block result
266   assert_raise TypeError, 'invalid block result (must be numeric, true, false or nil)' do
267     a.bsearch{ 'I like to watch the world burn' }
268   end
269 end
270
271 assert("Array#bsearch_index") do
272   # tested through Array#bsearch
273 end
274
275 assert("Array#delete_if") do
276   a = [1, 2, 3, 4, 5]
277   assert_equal [1, 2, 3, 4, 5], a.delete_if { false }
278   assert_equal [1, 2, 3, 4, 5], a
279
280   a = [1, 2, 3, 4, 5]
281   assert_equal [], a.delete_if { true }
282   assert_equal [], a
283
284   a = [ 1, 2, 3, 4, 5 ]
285   assert_equal [1, 2, 3], a.delete_if { |val| val > 3 }
286 end
287
288 assert("Array#keep_if") do
289   a = [1, 2, 3, 4, 5]
290   assert_equal [1, 2, 3, 4, 5], a.keep_if { true }
291   assert_equal [1, 2, 3, 4, 5], a
292
293   a = [1, 2, 3, 4, 5]
294   assert_equal [], a.keep_if { false }
295   assert_equal [], a
296
297   a = [1, 2, 3, 4, 5]
298   assert_equal [4, 5], a.keep_if { |val| val > 3 }
299   assert_equal [4, 5], a
300 end
301
302 assert("Array#select!") do
303   a = [1, 2, 3, 4, 5]
304   assert_nil a.select! { true }
305   assert_equal [1, 2, 3, 4, 5], a
306
307   a = [1, 2, 3, 4, 5]
308   assert_equal [], a.select! { false }
309   assert_equal [], a
310
311   a = [1, 2, 3, 4, 5]
312   assert_equal [4, 5], a.select! { |val| val > 3 }
313   assert_equal [4, 5], a
314 end
315
316 assert('Array#values_at') do
317   a = %w{red green purple white none}
318
319   assert_equal %w{red purple none}, a.values_at(0, 2, 4)
320   assert_equal ['green', 'white', nil, nil], a.values_at(1, 3, 5, 7)
321   assert_equal ['none', 'white', 'white', nil], a.values_at(-1, -2, -2, -7)
322   assert_equal ['none', nil, nil, 'red', 'green', 'purple'], a.values_at(4..6, 0...3)
323   assert_raise(TypeError) { a.values_at 'tt' }
324 end
325
326 assert('Array#to_h') do
327   assert_equal({}, [].to_h)
328   assert_equal({a: 1, b:2}, [[:a, 1], [:b, 2]].to_h)
329
330   assert_raise(TypeError)     { [1].to_h }
331   assert_raise(ArgumentError) { [[1]].to_h }
332 end
333
334 assert("Array#index (block)") do
335   assert_nil (1..10).to_a.index { |i| i % 5 == 0 and i % 7 == 0 }
336   assert_equal 34, (1..100).to_a.index { |i| i % 5 == 0 and i % 7 == 0 }
337 end
338
339 assert("Array#dig") do
340   h = [[[1]], 0]
341   assert_equal(1, h.dig(0, 0, 0))
342   assert_nil(h.dig(2, 0))
343   assert_raise(TypeError) {h.dig(:a)}
344 end
345
346 assert("Array#slice!") do
347   a = [1, 2, 3]
348   b = a.slice!(0)
349   c = [1, 2, 3, 4, 5]
350   d = c.slice!(0, 2)
351   e = [1, 2, 3, 4, 5]
352   f = e.slice!(1..3)
353   g = [1, 2, 3]
354   h = g.slice!(-1)
355   i = [1, 2, 3]
356   j = i.slice!(0, -1)
357
358   assert_equal(a, [2, 3])
359   assert_equal(b, 1)
360   assert_equal(c, [3, 4, 5])
361   assert_equal(d, [1, 2])
362   assert_equal(e, [1, 5])
363   assert_equal(f, [2, 3, 4])
364   assert_equal(g, [1, 2])
365   assert_equal(h, 3)
366   assert_equal(i, [1, 2, 3])
367   assert_equal(j, nil)
368 end
369
370 assert("Array#permutation") do
371   a = [1, 2, 3]
372   assert_equal([[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]],
373                a.permutation.to_a)
374   assert_equal([[1],[2],[3]],
375                a.permutation(1).to_a)
376   assert_equal([[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]],
377                a.permutation(2).to_a)
378   assert_equal([[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]],
379                a.permutation(3).to_a)
380   assert_equal([[]], a.permutation(0).to_a)
381   assert_equal([], a.permutation(4).to_a)
382 end
383
384 assert("Array#combination") do
385   a = [1, 2, 3, 4]
386   assert_equal([[1],[2],[3],[4]],
387                a.combination(1).to_a)
388   assert_equal([[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]],
389                a.combination(2).to_a)
390   assert_equal([[1,2,3],[1,2,4],[1,3,4],[2,3,4]],
391                a.combination(3).to_a)
392   assert_equal([[1,2,3,4]],
393                a.combination(4).to_a)
394   assert_equal([[]], a.combination(0).to_a)
395   assert_equal([], a.combination(5).to_a)
396 end
397
398 assert('Array#transpose') do
399   assert_equal([].transpose, [])
400   assert_equal([[]].transpose, [])
401   assert_equal([[1]].transpose, [[1]])
402   assert_equal([[1,2,3]].transpose, [[1], [2], [3]])
403   assert_equal([[1], [2], [3]].transpose, [[1,2,3]])
404   assert_equal([[1,2], [3,4], [5,6]].transpose, [[1,3,5], [2,4,6]])
405   assert_raise(TypeError) { [1].transpose }
406   assert_raise(IndexError) { [[1], [2,3,4]].transpose }
407 end