bfts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ *** 1.0.0 / 2005-10-28
2
+
3
+ + 1 major enhancement
4
+ + Birthday!
@@ -0,0 +1,17 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ rubicon_testcase.rb
6
+ test_array.rb
7
+ test_comparable.rb
8
+ test_exception.rb
9
+ test_false_class.rb
10
+ test_file_test.rb
11
+ test_hash.rb
12
+ test_nil_class.rb
13
+ test_range.rb
14
+ test_string.rb
15
+ test_struct.rb
16
+ test_time.rb
17
+ test_true_class.rb
@@ -0,0 +1,61 @@
1
+ bfts
2
+ http://rubyforge.org/projects/bfts
3
+
4
+ ** DESCRIPTION:
5
+
6
+ BFTS is a branch of rubicon with the intent of auditing all of rubicon
7
+ against the latest version of 1.8.x, stripping all the cruft, and
8
+ getting everything up to date again. rubicon is dead and the authors
9
+ have shown no interest in getting things moving again. BFTS hopes to
10
+ fix that.
11
+
12
+ ** STATUS: (imported, audited, polished)
13
+
14
+ + test_array.rb: audited
15
+ + test_comparable.rb: imported
16
+ + test_falseclass.rb: imported
17
+ + test_filetest.rb: imported
18
+ + test_hash.rb: imported
19
+ + test_nilclass.rb: imported
20
+ + test_range.rb: imported
21
+ + test_string.rb: imported
22
+ + test_struct.rb: imported
23
+ + test_time.rb: imported
24
+ + test_trueclass.rb: imported
25
+
26
+ ** FEATURES/PROBLEMS:
27
+
28
+ + Rubicon port import/audit not yet complete.
29
+
30
+ ** REQUIREMENTS:
31
+
32
+ + Ruby 1.8+
33
+
34
+ ** INSTALL:
35
+
36
+ + sudo gem install bfts
37
+
38
+ ** LICENSE:
39
+
40
+ (The MIT License)
41
+
42
+ Copyright (c) 2005-2006 Ryan Davis, Seattle.rb
43
+
44
+ Permission is hereby granted, free of charge, to any person obtaining
45
+ a copy of this software and associated documentation files (the
46
+ "Software"), to deal in the Software without restriction, including
47
+ without limitation the rights to use, copy, modify, merge, publish,
48
+ distribute, sublicense, and/or sell copies of the Software, and to
49
+ permit persons to whom the Software is furnished to do so, subject to
50
+ the following conditions:
51
+
52
+ The above copyright notice and this permission notice shall be
53
+ included in all copies or substantial portions of the Software.
54
+
55
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
56
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
57
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
58
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
59
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
60
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
61
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,17 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './rubicon_testcase.rb'
6
+
7
+ Hoe.new('bfts', RubiconTestCase::VERSION) do |p|
8
+ p.rubyforge_name = 'bfts'
9
+ p.summary = 'Big "Formal" Test Suite'
10
+ p.description = p.paragraphs_of('README.txt', 2).join("\n\n")
11
+ p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
12
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
13
+ p.extra_deps << "miniunit"
14
+ p.test_globs = "test*.rb"
15
+ end
16
+
17
+ # vim: syntax=Ruby
@@ -0,0 +1,29 @@
1
+ require "test/unit/testcase"
2
+
3
+ # TODO: rename this... drop rubicon lineage.
4
+ class RubiconTestCase < Test::Unit::TestCase
5
+
6
+ VERSION = "1.0.0"
7
+
8
+ MsWin32 = :gak # TODO: fix
9
+ JRuby = :gak
10
+ $os = :not_gak
11
+
12
+ def ruby_version
13
+ defined?(RUBY_VERSION) ? RUBY_VERSION : VERSION
14
+ end
15
+
16
+ def test_nathanial_talbott_is_my_archenemy
17
+ # do nothing but appease nathanial's inability to envision
18
+ # abstract test classes... stabity stab stab
19
+ end
20
+
21
+ # TODO: this is overly complicated and dumb
22
+ def truth_table(method, *result)
23
+ for a in [ false, true ]
24
+ expected = result.shift
25
+ assert_equal(expected, method.call(a))
26
+ assert_equal(expected, method.call(a ? self : nil))
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,1261 @@
1
+ require 'test/unit'
2
+ require 'rubicon_testcase'
3
+
4
+ class TestArray < RubiconTestCase
5
+
6
+ def setup
7
+ super
8
+ @cls = Array
9
+ end
10
+
11
+ def test_and
12
+ assert_equal(@cls[1, 3], @cls[ 1, 1, 3, 5 ] & @cls[ 1, 2, 3 ])
13
+ assert_equal(@cls[1, 3], @cls[ 1, 1, 3, 5 ] & @cls[ 3, 2, 1 ])
14
+ assert_equal(@cls[1, 3], @cls[ 1, 1, 3, 5 ] & @cls[ 3, 3, 2, 1 ])
15
+ assert_equal(@cls[], @cls[ 1, 1, 3, 5 ] & @cls[ ])
16
+ assert_equal(@cls[], @cls[ ] & @cls[ 1, 2, 3 ])
17
+ assert_equal(@cls[], @cls[ 1, 2, 3 ] & @cls[ 4, 5, 6 ])
18
+
19
+ # == is not used
20
+ a1 = 1
21
+ a2 = 1.0
22
+ assert_equal(true, a1 == a2)
23
+ assert_equal(false, a1.eql?(a2))
24
+ assert_equal(@cls[2], @cls[ a1, 2, 3 ] & @cls[ a2, 2, 4 ])
25
+
26
+ # eql? is used
27
+ a1 = [1,2]
28
+ a2 = [1,2]
29
+ assert_equal(true, a1 == a2)
30
+ assert_equal(true, a1.eql?(a2))
31
+ assert_equal(@cls[[1,2], 2], @cls[ a1, 2, 3 ] & @cls[ a2, 2, 4 ])
32
+
33
+ # error case
34
+ assert_raises(TypeError) { @cls[ 1, 1, 3, 5 ] & Object.new }
35
+ end
36
+
37
+ def test_assoc
38
+ a1 = @cls[*%w( cat feline )]
39
+ a2 = @cls[*%w( dog canine )]
40
+ a3 = @cls[*%w( mule asinine )]
41
+ a4 = @cls[*%w( mule asinine )]
42
+
43
+ a = @cls[ a1, a2, a3, a4 ]
44
+
45
+ assert_same(a1, a.assoc('cat'))
46
+ assert_same(a3, a.assoc('mule'))
47
+ assert_same(nil, a.assoc('asinine'))
48
+ assert_same(nil, a.assoc('wombat'))
49
+ assert_same(nil, a.assoc(1..2))
50
+ end
51
+
52
+ def test_at
53
+ a = @cls[*(0..99).to_a]
54
+ assert_equal(0, a.at(0))
55
+ assert_equal(10, a.at(10))
56
+ assert_equal(99, a.at(99))
57
+ assert_equal(nil, a.at(100))
58
+ assert_equal(99, a.at(-1))
59
+ assert_equal(0, a.at(-100))
60
+ assert_equal(nil, a.at(-101))
61
+ assert_raises(TypeError) { a.at('cat') }
62
+ end
63
+
64
+ def test_class_index
65
+ a = @cls[ 5, 4, 3, 2, 1 ]
66
+ assert_instance_of(@cls, a)
67
+ assert_equal(5, a.length)
68
+ 5.times { |i| assert_equal(5-i, a[i]) }
69
+ assert_nil(a[6])
70
+
71
+ a = @cls[]
72
+ assert_instance_of(@cls, a)
73
+ assert_equal(0, a.length)
74
+ end
75
+
76
+ def test_clear
77
+ a = @cls[1, 2, 3]
78
+ b = a.clear
79
+ assert_equal(@cls[], a)
80
+ assert_equal(@cls[], b)
81
+ assert_equal(a.__id__, b.__id__)
82
+ end
83
+
84
+ def test_clone
85
+ for taint in [ false, true ]
86
+ for frozen in [ false, true ]
87
+ a = @cls[*(0..99).to_a]
88
+ a.taint if taint
89
+ a.freeze if frozen
90
+ b = a.clone
91
+
92
+ assert_equal(a, b)
93
+ assert(a.__id__ != b.__id__)
94
+ assert_equal(a.frozen?, b.frozen?)
95
+ assert_equal(a.tainted?, b.tainted?)
96
+ end
97
+ end
98
+ end
99
+
100
+ def test_collect
101
+ a = @cls[ 1, 'cat', 1..1 ]
102
+ assert_equal([ Fixnum, String, Range], a.collect {|e| e.class} )
103
+ assert_equal([ 99, 99, 99], a.collect { 99 } )
104
+
105
+ assert_equal([], @cls[].collect { 99 })
106
+
107
+ assert_equal([1, 2, 3], @cls[1, 2, 3].collect)
108
+ end
109
+
110
+ def test_collect_bang
111
+ util_collect_bang(:collect!)
112
+ end
113
+
114
+ def util_collect_bang(method)
115
+ a = @cls[ 1, 'cat', 1..1 ]
116
+ res = a.send(method) {|e| e.class}
117
+ assert_equal([ Fixnum, String, Range], a)
118
+ assert_same(a, res)
119
+
120
+ a = @cls[ 1, 'cat', 1..1 ]
121
+ res = a.send(method) { 99 }
122
+ assert_equal([ 99, 99, 99], a)
123
+ assert_equal(a, res)
124
+
125
+ a = @cls[ ]
126
+ res = a.send(method) { 99 }
127
+ assert_equal([], a)
128
+ assert_equal(a, res)
129
+ end
130
+
131
+ def test_compact
132
+ a = @cls[ 1, nil, nil, 2, 3, nil, 4 ]
133
+ assert_equal(@cls[1, 2, 3, 4], a.compact)
134
+
135
+ a = @cls[ nil, 1, nil, 2, 3, nil, 4 ]
136
+ assert_equal(@cls[1, 2, 3, 4], a.compact)
137
+
138
+ a = @cls[ 1, nil, nil, 2, 3, nil, 4, nil ]
139
+ assert_equal(@cls[1, 2, 3, 4], a.compact)
140
+
141
+ a = @cls[ 1, 2, 3, 4 ]
142
+ assert_equal(@cls[1, 2, 3, 4], a.compact)
143
+ end
144
+
145
+ def test_compact_bang
146
+ a = @cls[ 1, nil, nil, 2, 3, nil, 4 ]
147
+ assert_equal(@cls[1, 2, 3, 4], a.compact!)
148
+ assert_equal(@cls[1, 2, 3, 4], a)
149
+
150
+ a = @cls[ nil, 1, nil, 2, 3, nil, 4 ]
151
+ assert_equal(@cls[1, 2, 3, 4], a.compact!)
152
+ assert_equal(@cls[1, 2, 3, 4], a)
153
+
154
+ a = @cls[ 1, nil, nil, 2, 3, nil, 4, nil ]
155
+ assert_equal(@cls[1, 2, 3, 4], a.compact!)
156
+ assert_equal(@cls[1, 2, 3, 4], a)
157
+
158
+ a = @cls[ 1, 2, 3, 4 ]
159
+ assert_equal(nil, a.compact!)
160
+ assert_equal(@cls[1, 2, 3, 4], a)
161
+ end
162
+
163
+ def test_concat
164
+ assert_equal(@cls[1, 2, 3, 4], @cls[1, 2].concat(@cls[3, 4]))
165
+ assert_equal(@cls[1, 2, 3, 4], @cls[].concat(@cls[1, 2, 3, 4]))
166
+ assert_equal(@cls[1, 2, 3, 4], @cls[1, 2, 3, 4].concat(@cls[]))
167
+ assert_equal(@cls[], @cls[].concat(@cls[]))
168
+ assert_equal(@cls[@cls[1, 2], @cls[3, 4]], @cls[@cls[1, 2]].concat(@cls[@cls[3, 4]]))
169
+
170
+ a = @cls[1, 2, 3]
171
+ a.concat(a)
172
+ assert_equal([1, 2, 3, 1, 2, 3], a)
173
+ end
174
+
175
+ def test_delete
176
+ a = @cls[*('cab'..'cat').to_a]
177
+ assert_equal('cap', a.delete('cap'))
178
+ assert_equal(@cls[*('cab'..'cao').to_a] + @cls[*('caq'..'cat').to_a], a)
179
+
180
+ a = @cls[*('cab'..'cat').to_a]
181
+ assert_equal('cab', a.delete('cab'))
182
+ assert_equal(@cls[*('cac'..'cat').to_a], a)
183
+
184
+ a = @cls[*('cab'..'cat').to_a]
185
+ assert_equal('cat', a.delete('cat'))
186
+ assert_equal(@cls[*('cab'..'cas').to_a], a)
187
+
188
+ a = @cls[*('cab'..'cat').to_a]
189
+ assert_equal(nil, a.delete('cup'))
190
+ assert_equal(@cls[*('cab'..'cat').to_a], a)
191
+
192
+ a = @cls[*('cab'..'cat').to_a]
193
+ assert_equal(99, a.delete('cup') { 99 } )
194
+ assert_equal(@cls[*('cab'..'cat').to_a], a)
195
+ end
196
+
197
+ def test_delete_at
198
+ a = @cls[*(1..5).to_a]
199
+ assert_equal(3, a.delete_at(2))
200
+ assert_equal(@cls[1, 2, 4, 5], a)
201
+
202
+ a = @cls[*(1..5).to_a]
203
+ assert_equal(4, a.delete_at(-2))
204
+ assert_equal(@cls[1, 2, 3, 5], a)
205
+
206
+ a = @cls[*(1..5).to_a]
207
+ assert_equal(nil, a.delete_at(5))
208
+ assert_equal(@cls[1, 2, 3, 4, 5], a)
209
+
210
+ a = @cls[*(1..5).to_a]
211
+ assert_equal(nil, a.delete_at(-6))
212
+ assert_equal(@cls[1, 2, 3, 4, 5], a)
213
+ end
214
+
215
+ # almost identical to reject!
216
+ def test_delete_if
217
+ a = @cls[ 1, 2, 3, 4, 5 ]
218
+ assert_equal(a, a.delete_if { false }) # reject! returns nil here
219
+ assert_equal(@cls[1, 2, 3, 4, 5], a)
220
+
221
+ a = @cls[ 1, 2, 3, 4, 5 ]
222
+ assert_equal(a, a.delete_if { true })
223
+ assert_equal(@cls[], a)
224
+
225
+ a = @cls[ 1, 2, 3, 4, 5 ]
226
+ assert_equal(a, a.delete_if { |i| i > 3 })
227
+ assert_equal(@cls[1, 2, 3], a)
228
+ end
229
+
230
+ def test_dup
231
+ for taint in [ false, true ]
232
+ for frozen in [ false, true ]
233
+ a = @cls[*(0..99).to_a]
234
+ a.taint if taint
235
+ a.freeze if frozen
236
+ b = a.dup
237
+
238
+ assert_equal(a, b)
239
+ assert(a.__id__ != b.__id__)
240
+ assert_equal(false, b.frozen?)
241
+ assert_equal(a.tainted?, b.tainted?)
242
+ end
243
+ end
244
+ end
245
+
246
+ def test_each
247
+ a = @cls[*%w( ant bat cat dog )]
248
+ i = 0
249
+ a.each { |e|
250
+ assert_equal(a[i], e)
251
+ i += 1
252
+ }
253
+ assert_equal(4, i)
254
+
255
+ a = @cls[]
256
+ i = 0
257
+ a.each { |e|
258
+ assert_equal(a[i], e)
259
+ i += 1
260
+ }
261
+ assert_equal(0, i)
262
+
263
+ assert_equal(a, a.each {})
264
+ end
265
+
266
+ def test_each_index
267
+ a = @cls[*%w( ant bat cat dog )]
268
+ i = 0
269
+ a.each_index { |ind|
270
+ assert_equal(i, ind)
271
+ i += 1
272
+ }
273
+ assert_equal(4, i)
274
+
275
+ a = @cls[]
276
+ i = 0
277
+ a.each_index { |ind|
278
+ assert_equal(i, ind)
279
+ i += 1
280
+ }
281
+ assert_equal(0, i)
282
+
283
+ assert_equal(a, a.each_index {})
284
+ end
285
+
286
+ def test_empty_eh
287
+ assert(@cls[].empty?)
288
+ assert(!@cls[1].empty?)
289
+ end
290
+
291
+ def test_eql_eh
292
+ assert(@cls[].eql?(@cls[]))
293
+ assert(@cls[1].eql?(@cls[1]))
294
+ assert(@cls[1, 1, 2, 2].eql?(@cls[1, 1, 2, 2]))
295
+ assert(!@cls[1.0, 1.0, 2.0, 2.0].eql?(@cls[1, 1, 2, 2]))
296
+ end
297
+
298
+ def test_equals2
299
+ assert_equal(true, @cls[] == @cls[])
300
+ assert_equal(false, @cls[] == @cls[nil])
301
+ assert_equal(false, @cls[] == @cls[9])
302
+ assert_equal(false, @cls[8] == @cls[9])
303
+ assert_equal(false, @cls[8] == @cls[])
304
+ assert_equal(false, @cls[nil] == @cls[])
305
+ assert_equal(true, @cls[1] == @cls[1])
306
+ assert_equal(false, @cls[1] == Object.new)
307
+
308
+ assert_equal(true, @cls[1, 1, 2, 2] == @cls[1, 1, 2, 2])
309
+ assert_equal(false, @cls[1, 9, 2, 2] == @cls[1, 1, 2, 2])
310
+ assert_equal(false, @cls[1, 1, 2, 2] == @cls[1, 1, 2, 2, 9])
311
+ assert_equal(false, @cls[1, 1, 2, 2] == @cls[1, 1, 2])
312
+
313
+ # elements are compared with ==
314
+ assert_equal(true, @cls[1] == @cls[1.000])
315
+ assert_equal(false, @cls[1] == @cls[1.001])
316
+ assert_equal(true, @cls[1.0, 1.0, 2.0, 2.0] == @cls[1, 1, 2, 2])
317
+ assert_equal(false, @cls[1.0, 1.0, 2.001, 2.0] == @cls[1, 1, 2, 2])
318
+
319
+ # nested arrays
320
+ assert_equal(true, @cls[11,@cls[22,33],44] == @cls[11,@cls[22,33],44])
321
+ assert_equal(true, @cls[11,@cls[22,33],44] == @cls[11,@cls[22,33.0],44])
322
+ assert_equal(false, @cls[11,@cls[22,33],44] == @cls[11,@cls[22,99],44])
323
+ assert_equal(false, @cls[11,@cls[22,33],44] == @cls[11,@cls[22,33,99],44])
324
+ end
325
+
326
+ # FIX!!! stupid fuckers!
327
+ def test_equals3
328
+ # === is the same as == for arrays
329
+ # copies of the ones in test_equals2 (WHAT?!?! DUMB!)
330
+
331
+ assert_equal(true, @cls[] == @cls[])
332
+ assert_equal(false, @cls[] == @cls[nil])
333
+ assert_equal(false, @cls[] == @cls[9])
334
+ assert_equal(false, @cls[8] == @cls[9])
335
+ assert_equal(false, @cls[8] == @cls[])
336
+ assert_equal(false, @cls[nil] == @cls[])
337
+ assert_equal(true, @cls[1] == @cls[1])
338
+ assert_equal(false, @cls[1] == Object.new)
339
+
340
+ assert_equal(true, @cls[1, 1, 2, 2] == @cls[1, 1, 2, 2])
341
+ assert_equal(false, @cls[1, 9, 2, 2] == @cls[1, 1, 2, 2])
342
+ assert_equal(false, @cls[1, 1, 2, 2] == @cls[1, 1, 2, 2, 9])
343
+ assert_equal(false, @cls[1, 1, 2, 2] == @cls[1, 1, 2])
344
+
345
+ # elements are compared with ==
346
+ assert_equal(true, @cls[1] == @cls[1.000])
347
+ assert_equal(false, @cls[1] == @cls[1.001])
348
+ assert_equal(true, @cls[1.0, 1.0, 2.0, 2.0] == @cls[1, 1, 2, 2])
349
+ assert_equal(false, @cls[1.0, 1.0, 2.001, 2.0] == @cls[1, 1, 2, 2])
350
+
351
+ # nested arrays
352
+ assert_equal(true, @cls[11,@cls[22,33],44] == @cls[11,@cls[22,33],44])
353
+ assert_equal(true, @cls[11,@cls[22,33],44] == @cls[11,@cls[22,33.0],44])
354
+ assert_equal(false, @cls[11,@cls[22,33],44] == @cls[11,@cls[22,99],44])
355
+ assert_equal(false, @cls[11,@cls[22,33],44] == @cls[11,@cls[22,33,99],44])
356
+ end
357
+
358
+ def test_fetch
359
+ a = %w(a b c d)
360
+ assert_equal('a', a.fetch(0))
361
+ assert_equal('c', a.fetch(2))
362
+ assert_raises(IndexError) { a.fetch(4) }
363
+ assert_equal(8, a.fetch(4) {|k| k*2} )
364
+ assert_equal('default', a.fetch(4, 'default'))
365
+
366
+ assert_equal('d', a.fetch(-1))
367
+ assert_equal('b', a.fetch(-3))
368
+ assert_raises(IndexError) { a.fetch(-5) }
369
+ assert_equal(-10, a.fetch(-5) {|k| k*2} )
370
+ assert_equal('default', a.fetch(-5, 'default'))
371
+ end
372
+
373
+ def test_fill
374
+ assert_equal @cls[], @cls[] .fill(99)
375
+ assert_equal @cls[], @cls[] .fill(99, nil)
376
+ assert_equal @cls[], @cls[] .fill(99, 0)
377
+ assert_equal @cls[], @cls[] .fill(99, -1)
378
+ assert_equal @cls[], @cls[] .fill(99, -9)
379
+ assert_equal @cls[], @cls[] .fill(99, 0, nil)
380
+ assert_equal @cls[99], @cls[] .fill(99, 0, 1)
381
+ assert_equal @cls[99], @cls[1] .fill(99, -1, 1)
382
+ assert_equal @cls[99], @cls[1] .fill(99, -9, 1), "Underflow"
383
+ assert_equal @cls[99], @cls[] .fill(99, 0..0)
384
+
385
+ assert_raises ArgumentError do
386
+ @cls[] .fill(99, 0, 0, 0)
387
+ end
388
+
389
+ assert_raises TypeError, "Can't convert Range into Integer" do
390
+ @cls[] .fill(99, 0..0, :X)
391
+ end
392
+
393
+ assert_equal @cls[99], @cls[1] .fill(99)
394
+ assert_equal @cls[99], @cls[1] .fill(99, nil)
395
+ assert_equal @cls[99], @cls[1] .fill(99, 0)
396
+ assert_equal @cls[99], @cls[1] .fill(99, -1)
397
+ assert_equal @cls[99], @cls[1] .fill(99, -9)
398
+ assert_equal @cls[99], @cls[1] .fill(99, 0, nil)
399
+ assert_equal @cls[99], @cls[1] .fill(99, 0, 1)
400
+ assert_equal @cls[99], @cls[1] .fill(99, -1, 1)
401
+ assert_equal @cls[99], @cls[1] .fill(99, -9, 1), "Underflow"
402
+ assert_equal @cls[99], @cls[1] .fill(99, 0..0)
403
+
404
+ assert_equal @cls[99, 99], @cls[1, 2].fill(99)
405
+ assert_equal @cls[99, 99], @cls[1, 2].fill(99, nil)
406
+ assert_equal @cls[99, 99], @cls[1, 2].fill(99, 0)
407
+ assert_equal @cls[ 1, 99], @cls[1, 2].fill(99, -1)
408
+ assert_equal @cls[99, 99], @cls[1, 2].fill(99, -9)
409
+ assert_equal @cls[ 1, 99], @cls[1, 2].fill(99, 1, nil)
410
+ assert_equal @cls[99, 2], @cls[1, 2].fill(99, 0, 1)
411
+ assert_equal @cls[ 1, 99], @cls[1, 2].fill(99, -1, 1)
412
+ assert_equal @cls[99, 2], @cls[1, 2].fill(99, -2, 1)
413
+ assert_equal @cls[99, 2], @cls[1, 2].fill(99, -9, 1), "Underflow"
414
+ assert_equal @cls[99, 2], @cls[1, 2].fill(99, 0..0)
415
+
416
+ assert_equal @cls[1, 2, 99, 99], @cls[1, 2].fill(99, 2, 2), "Out of bounds"
417
+ assert_equal @cls[1, 2, 99, 99], @cls[1, 2].fill(99, 2..3), "Out of bounds"
418
+
419
+ assert_equal @cls[1, 102], @cls[1, 2].fill(1) { |i| 101 + i }
420
+ assert_equal @cls[1, 2], @cls[1, 2].fill(2) { |i| 101 + i }
421
+ assert_equal @cls[101, 102], @cls[1, 2].fill( 0, nil) { |i| 101 + i }
422
+ assert_equal @cls[101, 2], @cls[1, 2].fill( 0, 1) { |i| 101 + i }
423
+ assert_equal @cls[101, 102], @cls[1, 2].fill( 0, 2) { |i| 101 + i }
424
+ assert_equal @cls[1, 2, 103], @cls[1, 2].fill( 2, 1) { |i| 101 + i }
425
+ assert_equal @cls[1, 102], @cls[1, 2].fill(-1, 1) { |i| 101 + i }
426
+ assert_equal @cls[101, 2], @cls[1, 2].fill(-2, 1) { |i| 101 + i }
427
+ assert_equal @cls[101, 2], @cls[1, 2].fill(-9, 1) { |i| 101 + i }
428
+
429
+ assert_equal @cls[101, 102], @cls[1, 2].fill(0..1) { |i| 101 + i }
430
+ assert_equal @cls[1, 102, 103], @cls[1, 2].fill(1..2) { |i| 101 + i }
431
+ assert_equal @cls[1, 2, 103, 104], @cls[1, 2].fill(2..3) { |i| 101 + i }
432
+
433
+ assert_raises TypeError do
434
+ @cls[].fill(4..6, 1) { }
435
+ end
436
+
437
+ assert_raises ArgumentError do
438
+ @cls[].fill(1, 1, 1) { }
439
+ end
440
+
441
+ assert_raises ArgumentError do
442
+ @cls[].fill(4..6, 1, 1) { }
443
+ end
444
+
445
+ assert_raises ArgumentError do
446
+ @cls[].fill(99, 0..0, :X, :Y)
447
+ end
448
+ end
449
+
450
+ def test_first
451
+ assert_equal(3, @cls[3,4,5].first)
452
+ assert_equal(4, @cls[4,5].first)
453
+ assert_equal(5, @cls[5].first)
454
+ assert_equal(nil, @cls[].first)
455
+
456
+ # with argument
457
+ assert_equal([], @cls[3,4,5].first(0))
458
+ assert_equal([3], @cls[3,4,5].first(1))
459
+ assert_equal([3,4], @cls[3,4,5].first(2))
460
+ assert_equal([3,4,5], @cls[3,4,5].first(3))
461
+ assert_equal([3,4,5], @cls[3,4,5].first(4))
462
+ assert_equal([3,4,5], @cls[3,4,5].first(999))
463
+
464
+ # error cases
465
+ assert_raises(ArgumentError) { @cls[3,4,5].first(-1) }
466
+ assert_raises(TypeError) { @cls[3,4,5].first(Object.new) }
467
+ end
468
+
469
+ def test_flatten
470
+ a1 = @cls[ 1, 2, 3]
471
+ a2 = @cls[ 5, 6 ]
472
+ a3 = @cls[ 4, a2 ]
473
+ a4 = @cls[ a1, a3 ]
474
+ assert_equal(@cls[1, 2, 3, 4, 5, 6], a4.flatten)
475
+ assert_equal(@cls[ a1, a3], a4)
476
+
477
+ a5 = @cls[ a1, @cls[], a3 ]
478
+ assert_equal(@cls[1, 2, 3, 4, 5, 6], a5.flatten)
479
+ assert_equal(@cls[], @cls[].flatten)
480
+ assert_equal(@cls[],
481
+ @cls[@cls[@cls[@cls[],@cls[]],@cls[@cls[]],@cls[]],@cls[@cls[@cls[]]]].flatten)
482
+ end
483
+
484
+ def test_flatten_bang
485
+ a1 = @cls[ 1, 2, 3]
486
+ a2 = @cls[ 5, 6 ]
487
+ a3 = @cls[ 4, a2 ]
488
+ a4 = @cls[ a1, a3 ]
489
+ assert_equal(@cls[1, 2, 3, 4, 5, 6], a4.flatten!)
490
+ assert_equal(@cls[1, 2, 3, 4, 5, 6], a4)
491
+
492
+ a5 = @cls[ a1, @cls[], a3 ]
493
+ assert_equal(@cls[1, 2, 3, 4, 5, 6], a5.flatten!)
494
+ assert_equal(@cls[1, 2, 3, 4, 5, 6], a5)
495
+
496
+ assert_equal(@cls[], @cls[].flatten)
497
+ assert_equal(@cls[],
498
+ @cls[@cls[@cls[@cls[],@cls[]],@cls[@cls[]],@cls[]],@cls[@cls[@cls[]]]].flatten)
499
+ end
500
+
501
+ def test_frozen_eh
502
+ # TODO: raise NotImplementedError, 'Need to write test_frozen_eh'
503
+ end
504
+
505
+ def test_hash
506
+ a1 = @cls[ 'cat', 'dog' ]
507
+ a2 = @cls[ 'cat', 'dog' ]
508
+ a3 = @cls[ 'dog', 'cat' ]
509
+ assert(a1.hash == a2.hash)
510
+ assert(a1.hash != a3.hash)
511
+ end
512
+
513
+ def test_include_eh
514
+ a = @cls[ 'cat', 99, /a/, @cls[ 1, 2, 3] ]
515
+ assert(a.include?('cat'))
516
+ assert(a.include?(99))
517
+ assert(a.include?(/a/))
518
+ assert(a.include?([1,2,3]))
519
+ assert(!a.include?('ca'))
520
+ assert(!a.include?([1,2]))
521
+ end
522
+
523
+ def test_index
524
+ a = @cls[*(1..100).to_a]
525
+
526
+ assert_equal(1, a[0])
527
+ assert_equal(100, a[99])
528
+ assert_nil(a[100])
529
+ assert_equal(100, a[-1])
530
+ assert_equal(99, a[-2])
531
+ assert_equal(1, a[-100])
532
+ assert_nil(a[-101])
533
+ assert_nil(a[-101,0])
534
+ assert_nil(a[-101,1])
535
+ assert_nil(a[-101,-1])
536
+ assert_nil(a[10,-1])
537
+
538
+ assert_equal(@cls[1], a[0,1])
539
+ assert_equal(@cls[100], a[99,1])
540
+ assert_equal(@cls[], a[100,1])
541
+ assert_equal(@cls[100], a[99,100])
542
+ assert_equal(@cls[100], a[-1,1])
543
+ assert_equal(@cls[99], a[-2,1])
544
+ assert_equal(@cls[], a[-100,0])
545
+ assert_equal(@cls[1], a[-100,1])
546
+
547
+ assert_equal(@cls[10, 11, 12], a[9, 3])
548
+ assert_equal(@cls[10, 11, 12], a[-91, 3])
549
+
550
+ assert_equal(@cls[1], a[0..0])
551
+ assert_equal(@cls[100], a[99..99])
552
+ assert_equal(@cls[], a[100..100])
553
+ assert_equal(@cls[100], a[99..200])
554
+ assert_equal(@cls[100], a[-1..-1])
555
+ assert_equal(@cls[99], a[-2..-2])
556
+
557
+ assert_equal(@cls[10, 11, 12], a[9..11])
558
+ assert_equal(@cls[10, 11, 12], a[-91..-89])
559
+
560
+ assert_nil(a[10, -3])
561
+ assert_equal([], a[10..7])
562
+
563
+ assert_raises(TypeError) {a['cat']}
564
+ end
565
+
566
+ def test_index_equals
567
+ a = @cls[*(0..99).to_a]
568
+ assert_equal(0, a[0] = 0)
569
+ assert_equal(@cls[0] + @cls[*(1..99).to_a], a)
570
+
571
+ a = @cls[*(0..99).to_a]
572
+ assert_equal(0, a[10,10] = 0)
573
+ assert_equal(@cls[*(0..9).to_a] + @cls[0] + @cls[*(20..99).to_a], a)
574
+
575
+ a = @cls[*(0..99).to_a]
576
+ assert_equal(0, a[-1] = 0)
577
+ assert_equal(@cls[*(0..98).to_a] + @cls[0], a)
578
+
579
+ a = @cls[*(0..99).to_a]
580
+ assert_equal(0, a[-10, 10] = 0)
581
+ assert_equal(@cls[*(0..89).to_a] + @cls[0], a)
582
+
583
+ a = @cls[*(0..99).to_a]
584
+ assert_equal(0, a[0,1000] = 0)
585
+ assert_equal(@cls[0] , a)
586
+
587
+ a = @cls[*(0..99).to_a]
588
+ assert_equal(0, a[10..19] = 0)
589
+ assert_equal(@cls[*(0..9).to_a] + @cls[0] + @cls[*(20..99).to_a], a)
590
+
591
+ b = @cls[*%w( a b c )]
592
+ a = @cls[*(0..99).to_a]
593
+ assert_equal(b, a[0,1] = b)
594
+ assert_equal(b + @cls[*(1..99).to_a], a)
595
+
596
+ a = @cls[*(0..99).to_a]
597
+ assert_equal(b, a[10,10] = b)
598
+ assert_equal(@cls[*(0..9).to_a] + b + @cls[*(20..99).to_a], a)
599
+
600
+ a = @cls[*(0..99).to_a]
601
+ assert_equal(b, a[-1, 1] = b)
602
+ assert_equal(@cls[*(0..98).to_a] + b, a)
603
+
604
+ a = @cls[*(0..99).to_a]
605
+ assert_equal(b, a[-10, 10] = b)
606
+ assert_equal(@cls[*(0..89).to_a] + b, a)
607
+
608
+ a = @cls[*(0..99).to_a]
609
+ assert_equal(b, a[0,1000] = b)
610
+ assert_equal(b , a)
611
+
612
+ a = @cls[*(0..99).to_a]
613
+ assert_equal(b, a[10..19] = b)
614
+ assert_equal(@cls[*(0..9).to_a] + b + @cls[*(20..99).to_a], a)
615
+
616
+ if ruby_version < "1.9.0" then
617
+ # Before 1.9.0 assigning nil to an array slice deletes
618
+ # the elements from the array.
619
+
620
+ a = @cls[*(0..99).to_a]
621
+ assert_equal(nil, a[0,1] = nil)
622
+ assert_equal(@cls[*(1..99).to_a], a)
623
+
624
+ a = @cls[*(0..99).to_a]
625
+ assert_equal(nil, a[10,10] = nil)
626
+ assert_equal(@cls[*(0..9).to_a] + @cls[*(20..99).to_a], a)
627
+
628
+ a = @cls[*(0..99).to_a]
629
+ assert_equal(nil, a[-1, 1] = nil)
630
+ assert_equal(@cls[*(0..98).to_a], a)
631
+
632
+ a = @cls[*(0..99).to_a]
633
+ assert_equal(nil, a[-10, 10] = nil)
634
+ assert_equal(@cls[*(0..89).to_a], a)
635
+
636
+ a = @cls[*(0..99).to_a]
637
+ assert_equal(nil, a[0,1000] = nil)
638
+ assert_equal(@cls[] , a)
639
+
640
+ a = @cls[*(0..99).to_a]
641
+ assert_equal(nil, a[10..19] = nil)
642
+ assert_equal(@cls[*(0..9).to_a] + @cls[*(20..99).to_a], a)
643
+ else
644
+
645
+ # From 1.9.0 assigning nil to an array slice removes
646
+ # the elements from the array and then inserts the
647
+ # nil element there.
648
+
649
+ a = @cls[*(0..99).to_a]
650
+ assert_equal(nil, a[0,1] = nil)
651
+ assert_equal(@cls[nil] + @cls[*(1..99).to_a], a)
652
+
653
+ a = @cls[*(0..99).to_a]
654
+ assert_equal(nil, a[10,10] = nil)
655
+ assert_equal(@cls[*(0..9).to_a] + @cls[nil] + @cls[*(20..99).to_a], a)
656
+
657
+ a = @cls[*(0..99).to_a]
658
+ assert_equal(nil, a[-1, 1] = nil)
659
+ assert_equal(@cls[*(0..98).to_a] + @cls[nil], a)
660
+
661
+ a = @cls[*(0..99).to_a]
662
+ assert_equal(nil, a[-10, 10] = nil)
663
+ assert_equal(@cls[*(0..89).to_a] + @cls[nil], a)
664
+
665
+ a = @cls[*(0..99).to_a]
666
+ assert_equal(nil, a[0,1000] = nil)
667
+ assert_equal(@cls[nil], a)
668
+
669
+ a = @cls[*(0..99).to_a]
670
+ assert_equal(nil, a[10..19] = nil)
671
+ assert_equal(@cls[*(0..9).to_a] + @cls[nil] + @cls[*(20..99).to_a], a)
672
+ end
673
+
674
+ a = @cls[1, 2, 3]
675
+ a[1, 0] = a
676
+ assert_equal([1, 1, 2, 3, 2, 3], a)
677
+
678
+ a = @cls[1, 2, 3]
679
+ a[-1, 0] = a
680
+ assert_equal([1, 2, 1, 2, 3, 3], a)
681
+ end
682
+
683
+ def test_index_real
684
+ a = @cls[ 'cat', 99, /a/, 99, @cls[ 1, 2, 3] ]
685
+ assert_equal(0, a.index('cat'))
686
+ assert_equal(1, a.index(99))
687
+ assert_equal(4, a.index([1,2,3]))
688
+ assert_nil(a.index('ca'))
689
+ assert_nil(a.index([1,2]))
690
+ end
691
+
692
+ def test_indexes
693
+ # TODO: raise NotImplementedError, 'Need to write test_indexes'
694
+ end
695
+
696
+ def test_indices
697
+ # TODO: raise NotImplementedError, 'Need to write test_indices'
698
+ end
699
+
700
+ def test_initialize
701
+ # no argument
702
+ a = @cls.new()
703
+ assert_instance_of(@cls, a)
704
+ assert_equal(0, a.length)
705
+ assert_nil(a[0])
706
+
707
+ # a length argument
708
+ a = @cls.new(3)
709
+ assert_instance_of(@cls, a)
710
+ assert_equal(3, a.length)
711
+ assert_nil(a[0])
712
+ assert_nil(a[1])
713
+ assert_nil(a[2])
714
+
715
+ # length and value arguments
716
+ a = @cls.new(3, "value")
717
+ assert_instance_of(@cls, a)
718
+ assert_equal(3, a.length)
719
+ assert_equal("value", a[0])
720
+ assert_equal("value", a[1])
721
+ assert_equal("value", a[2])
722
+
723
+ # length and value arguments:
724
+ # even same instance in all array entries
725
+ v = ["some", "complex", "value"]
726
+ a = @cls.new(3, v)
727
+ assert_instance_of(@cls, a)
728
+ assert_equal(3, a.length)
729
+ assert_same(v, a[0])
730
+ assert_same(v, a[1])
731
+ assert_same(v, a[2])
732
+
733
+ # one argument that is an array:
734
+ # like a "replace"
735
+ v = @cls["some", "array", "value"]
736
+ a = @cls.new(v)
737
+ assert_instance_of(@cls, a)
738
+ assert_equal(3, a.length)
739
+ assert_not_same(v, a)
740
+ assert_same(v[0], a[0])
741
+ assert_same(v[1], a[1])
742
+ assert_same(v[2], a[2])
743
+
744
+ # with a block
745
+ a = @cls.new(3) {|i| [i + 10] }
746
+ assert_instance_of(@cls, a)
747
+ assert_equal(3, a.length)
748
+ 3.times {|i| assert_equal([i + 10], a[i]) }
749
+
750
+ # error cases
751
+ assert_raises(ArgumentError) { @cls.new(-10) }
752
+
753
+ end
754
+
755
+ def generic_index_test(symbol) # TODO: rename
756
+ a = @cls[*('a'..'j').to_a]
757
+ assert_equal(@cls['a', 'c', 'e'], a.send(symbol, 0, 2, 4))
758
+ assert_equal(@cls['j', 'h', 'f'], a.send(symbol,-1, -3, -5))
759
+ assert_equal(@cls['h', nil, 'a'], a.send(symbol,-3, 99, 0))
760
+ end
761
+
762
+ def test_insert
763
+ x = %w(a b c)
764
+ assert_equal(%w(a b c), x.insert(2))
765
+ assert_equal(%w(a b x c), x.insert(2, 'x'))
766
+ assert_equal(%w(a b x c), x)
767
+ assert_equal(%w(a b x y z w c), x.insert(-2, 'y', 'z', 'w'))
768
+ assert_equal(%w(a b x y z w c) + [nil, nil] + %w(Q), x.insert(9, 'Q'))
769
+ assert_raises(IndexError) { x.insert(-12, 'Z') }
770
+ end
771
+
772
+ def test_inspect
773
+ # TODO: raise NotImplementedError, 'Need to write test_inspect'
774
+ end
775
+
776
+ def test_join
777
+ $, = ""
778
+ a = @cls[]
779
+ assert_equal("", a.join)
780
+ assert_equal("", a.join(','))
781
+
782
+ $, = ""
783
+ a = @cls[1, 2]
784
+ assert_equal("12", a.join)
785
+ assert_equal("1,2", a.join(','))
786
+
787
+ $, = ""
788
+ a = @cls[1, 2, 3]
789
+ assert_equal("123", a.join)
790
+ assert_equal("1,2,3", a.join(','))
791
+
792
+ $, = ":"
793
+ a = @cls[1, 2, 3]
794
+ assert_equal("1:2:3", a.join)
795
+ assert_equal("1,2,3", a.join(','))
796
+
797
+ $, = ""
798
+ end
799
+
800
+ def test_last
801
+ assert_equal(5, @cls[3,4,5].last)
802
+ assert_equal(4, @cls[3,4].last)
803
+ assert_equal(3, @cls[3].last)
804
+ assert_equal(nil, @cls[].last)
805
+
806
+ # with argument
807
+ assert_equal([], @cls[3,4,5].last(0))
808
+ assert_equal([5], @cls[3,4,5].last(1))
809
+ assert_equal([4,5], @cls[3,4,5].last(2))
810
+ assert_equal([3,4,5], @cls[3,4,5].last(3))
811
+ assert_equal([3,4,5], @cls[3,4,5].last(4))
812
+ assert_equal([3,4,5], @cls[3,4,5].last(999))
813
+
814
+ # error cases
815
+ assert_raises(ArgumentError) { @cls[3,4,5].last(-1) }
816
+ assert_raises(TypeError) { @cls[3,4,5].last(Object.new) }
817
+
818
+ # misc
819
+ assert_equal(nil, @cls[].last)
820
+ assert_equal(1, @cls[1].last)
821
+ assert_equal(99, @cls[*(3..99).to_a].last)
822
+ end
823
+
824
+ def test_length
825
+ assert_equal(0, @cls[].length)
826
+ assert_equal(1, @cls[1].length)
827
+ assert_equal(2, @cls[1, nil].length)
828
+ assert_equal(2, @cls[nil, 1].length)
829
+ assert_equal(234, @cls[*(0..233).to_a].length)
830
+ end
831
+
832
+ def test_lt2
833
+ a = @cls[]
834
+ res = a << 1
835
+ assert_equal(@cls[1], a)
836
+ assert_same(a, res)
837
+
838
+ res = a << 2 << 3
839
+ assert_equal(@cls[1, 2, 3], a)
840
+ assert_same(a, res)
841
+
842
+ res = a << nil << 'cat'
843
+ assert_equal(@cls[1, 2, 3, nil, 'cat'], a)
844
+ assert_same(a, res)
845
+
846
+ res = a << a
847
+ assert_equal(@cls[1, 2, 3, nil, 'cat', a], a)
848
+ assert_same(a, res)
849
+ end
850
+
851
+ def test_map_bang
852
+ util_collect_bang(:map!)
853
+ end
854
+
855
+ def test_minus
856
+ assert_equal(@cls[], @cls[1] - @cls[1])
857
+ assert_equal(@cls[1], @cls[1, 2, 3, 4, 5] - @cls[2, 3, 4, 5])
858
+ assert_equal(@cls[1,1,1,1], @cls[1, 2, 1, 3, 1, 4, 1, 5] - @cls[2, 3, 4, 5])
859
+ a = @cls[]
860
+ to_contrast = @cls[]
861
+ 1000.times { a << 1 }
862
+ 1000.times { to_contrast << 1}
863
+ assert_equal(1000, a.length)
864
+ assert_equal(to_contrast, a - @cls[2])
865
+ assert_equal(@cls[1,1], @cls[ 1, 2, 1] - @cls[2])
866
+ assert_equal(@cls[1, 2, 3], @cls[1, 2, 3] - @cls[4, 5, 6])
867
+ end
868
+
869
+ def test_nitems
870
+ assert_equal(0, @cls[].nitems)
871
+ assert_equal(1, @cls[1].nitems)
872
+ assert_equal(1, @cls[1, nil].nitems)
873
+ assert_equal(1, @cls[nil, 1].nitems)
874
+ assert_equal(3, @cls[1, nil, nil, 2, nil, 3, nil].nitems)
875
+ end
876
+
877
+ def test_or
878
+ assert_equal(@cls[], @cls[] | @cls[])
879
+ assert_equal(@cls[1], @cls[1] | @cls[])
880
+ assert_equal(@cls[1], @cls[] | @cls[1])
881
+ assert_equal(@cls[1], @cls[1] | @cls[1])
882
+
883
+ assert_equal(@cls[1,2], @cls[1] | @cls[2])
884
+ assert_equal(@cls[1,2], @cls[1, 1] | @cls[2, 2])
885
+ assert_equal(@cls[1,2], @cls[1, 2] | @cls[1, 2])
886
+ end
887
+
888
+ def test_plus
889
+ assert_equal(@cls[], @cls[] + @cls[])
890
+ assert_equal(@cls[1], @cls[1] + @cls[])
891
+ assert_equal(@cls[1], @cls[] + @cls[1])
892
+ assert_equal(@cls[1, 1], @cls[1] + @cls[1])
893
+ assert_equal(@cls['cat', 'dog', 1, 2, 3], %w(cat dog) + (1..3).to_a)
894
+ end
895
+
896
+ def test_pop
897
+ a = @cls[ 'cat', 'dog' ]
898
+ assert_equal('dog', a.pop)
899
+ assert_equal(@cls['cat'], a)
900
+ assert_equal('cat', a.pop)
901
+ assert_equal(@cls[], a)
902
+ assert_nil(a.pop)
903
+ assert_equal(@cls[], a)
904
+ end
905
+
906
+ def test_push
907
+ a = @cls[1, 2, 3]
908
+ assert_equal(@cls[1, 2, 3, 4, 5], a.push(4, 5))
909
+ assert_equal(@cls[1, 2, 3, 4, 5], a.push())
910
+ assert_equal(@cls[1, 2, 3, 4, 5, nil], a.push(nil))
911
+ end
912
+
913
+ def test_rassoc
914
+ a1 = @cls[*%w( cat feline )]
915
+ a2 = @cls[*%w( dog canine )]
916
+ a3 = @cls[*%w( mule asinine )]
917
+ a4 = @cls[*%w( mule asinine )]
918
+ a = @cls[ a1, a2, a3, a4 ]
919
+
920
+ assert_same(a1, a.rassoc('feline'))
921
+ assert_same(a3, a.rassoc('asinine'))
922
+ assert_same(nil, a.rassoc('dog'))
923
+ assert_same(nil, a.rassoc('mule'))
924
+ assert_same(nil, a.rassoc(1..2))
925
+ end
926
+
927
+ # almost identical to delete_if
928
+ def test_reject_bang
929
+ a = @cls[ 1, 2, 3, 4, 5 ]
930
+ assert_equal(nil, a.reject! { false }) # delete_if returns a here
931
+ assert_equal(@cls[1, 2, 3, 4, 5], a)
932
+
933
+ a = @cls[ 1, 2, 3, 4, 5 ]
934
+ assert_equal(a, a.reject! { true })
935
+ assert_equal(@cls[], a)
936
+
937
+ a = @cls[ 1, 2, 3, 4, 5 ]
938
+ assert_equal(a, a.reject! { |i| i > 3 })
939
+ assert_equal(@cls[1, 2, 3], a)
940
+ end
941
+
942
+ def test_replace
943
+ a = @cls[ 1, 2, 3]
944
+ a_id = a.__id__
945
+ assert_equal(@cls[4, 5, 6], a.replace(@cls[4, 5, 6]))
946
+ assert_equal(@cls[4, 5, 6], a)
947
+ assert_equal(a_id, a.__id__)
948
+ assert_equal(@cls[], a.replace(@cls[]))
949
+ end
950
+
951
+ def test_reverse
952
+ a = @cls[*%w( dog cat bee ant )]
953
+ assert_equal(@cls[*%w(ant bee cat dog)], a.reverse)
954
+ assert_equal(@cls[*%w(dog cat bee ant)], a)
955
+ assert_equal(@cls[], @cls[].reverse)
956
+ end
957
+
958
+ def test_reverse_bang
959
+ a = @cls[*%w( dog cat bee ant )]
960
+ assert_equal(@cls[*%w(ant bee cat dog)], a.reverse!)
961
+ assert_equal(@cls[*%w(ant bee cat dog)], a)
962
+ assert_equal(@cls[],@cls[].reverse!)
963
+ end
964
+
965
+ def test_reverse_each
966
+ a = @cls[*%w( dog cat bee ant )]
967
+ i = a.length
968
+ a.reverse_each { |e|
969
+ i -= 1
970
+ assert_equal(a[i], e)
971
+ }
972
+ assert_equal(0, i)
973
+
974
+ a = @cls[]
975
+ i = 0
976
+ a.reverse_each { |e|
977
+ assert(false, "Never get here")
978
+ }
979
+ assert_equal(0, i)
980
+ end
981
+
982
+ def test_rindex
983
+ a = @cls[ 'cat', 99, /a/, 99, [ 1, 2, 3] ]
984
+ assert_equal(0, a.rindex('cat'))
985
+ assert_equal(3, a.rindex(99))
986
+ assert_equal(4, a.rindex([1,2,3]))
987
+ assert_nil(a.rindex('ca'))
988
+ assert_nil(a.rindex([1,2]))
989
+ end
990
+
991
+ def test_select
992
+ # TODO: raise NotImplementedError, 'Need to write test_select'
993
+ end
994
+
995
+ def test_shift
996
+ a = @cls[ 'cat', 'dog' ]
997
+ assert_equal('cat', a.shift)
998
+ assert_equal(@cls['dog'], a)
999
+ assert_equal('dog', a.shift)
1000
+ assert_equal(@cls[], a)
1001
+ assert_nil(a.shift)
1002
+ assert_equal(@cls[], a)
1003
+ end
1004
+
1005
+ def test_size
1006
+ assert_equal(0, @cls[].size)
1007
+ assert_equal(1, @cls[1].size)
1008
+ assert_equal(100, @cls[*(0..99).to_a].size)
1009
+ end
1010
+
1011
+ def test_slice
1012
+ a = @cls[*(1..100).to_a]
1013
+
1014
+ assert_equal(1, a.slice(0))
1015
+ assert_equal(100, a.slice(99))
1016
+ assert_nil(a.slice(100))
1017
+ assert_equal(100, a.slice(-1))
1018
+ assert_equal(99, a.slice(-2))
1019
+ assert_equal(1, a.slice(-100))
1020
+ assert_nil(a.slice(-101))
1021
+
1022
+ assert_equal(@cls[1], a.slice(0,1))
1023
+ assert_equal(@cls[100], a.slice(99,1))
1024
+ assert_equal(@cls[], a.slice(100,1))
1025
+ assert_equal(@cls[100], a.slice(99,100))
1026
+ assert_equal(@cls[100], a.slice(-1,1))
1027
+ assert_equal(@cls[99], a.slice(-2,1))
1028
+
1029
+ assert_equal(@cls[10, 11, 12], a.slice(9, 3))
1030
+ assert_equal(@cls[10, 11, 12], a.slice(-91, 3))
1031
+
1032
+ assert_equal(@cls[1], a.slice(0..0))
1033
+ assert_equal(@cls[100], a.slice(99..99))
1034
+ assert_equal(@cls[], a.slice(100..100))
1035
+ assert_equal(@cls[100], a.slice(99..200))
1036
+ assert_equal(@cls[100], a.slice(-1..-1))
1037
+ assert_equal(@cls[99], a.slice(-2..-2))
1038
+
1039
+ assert_equal(@cls[10, 11, 12], a.slice(9..11))
1040
+ assert_equal(@cls[10, 11, 12], a.slice(-91..-89))
1041
+
1042
+ assert_nil(a.slice(10, -3))
1043
+ assert_equal([], a.slice(10..7))
1044
+ end
1045
+
1046
+ def test_slice_bang
1047
+ a = @cls[1, 2, 3, 4, 5]
1048
+ assert_equal(3, a.slice!(2))
1049
+ assert_equal(@cls[1, 2, 4, 5], a)
1050
+
1051
+ a = @cls[1, 2, 3, 4, 5]
1052
+ assert_equal(4, a.slice!(-2))
1053
+ assert_equal(@cls[1, 2, 3, 5], a)
1054
+
1055
+ a = @cls[1, 2, 3, 4, 5]
1056
+ assert_equal(@cls[3,4], a.slice!(2,2))
1057
+ assert_equal(@cls[1, 2, 5], a)
1058
+
1059
+ a = @cls[1, 2, 3, 4, 5]
1060
+ assert_equal(@cls[4,5], a.slice!(-2,2))
1061
+ assert_equal(@cls[1, 2, 3], a)
1062
+
1063
+ a = @cls[1, 2, 3, 4, 5]
1064
+ assert_equal(@cls[3,4], a.slice!(2..3))
1065
+ assert_equal(@cls[1, 2, 5], a)
1066
+
1067
+ a = @cls[1, 2, 3, 4, 5]
1068
+ assert_equal(nil, a.slice!(20))
1069
+ assert_equal(@cls[1, 2, 3, 4, 5], a)
1070
+ end
1071
+
1072
+ def test_sort
1073
+ a = @cls[ 4, 1, 2, 3 ]
1074
+ assert_equal(@cls[1, 2, 3, 4], a.sort)
1075
+ assert_equal(@cls[4, 1, 2, 3], a)
1076
+
1077
+ assert_equal(@cls[4, 3, 2, 1], a.sort { |x, y| y <=> x} )
1078
+ assert_equal(@cls[4, 1, 2, 3], a)
1079
+
1080
+ a.fill(1)
1081
+ assert_equal(@cls[1, 1, 1, 1], a.sort)
1082
+
1083
+ assert_equal(@cls[], @cls[].sort)
1084
+ end
1085
+
1086
+ def test_sort_bang
1087
+ a = @cls[ 4, 1, 2, 3 ]
1088
+ assert_equal(@cls[1, 2, 3, 4], a.sort!)
1089
+ assert_equal(@cls[1, 2, 3, 4], a)
1090
+
1091
+ assert_equal(@cls[4, 3, 2, 1], a.sort! { |x, y| y <=> x} )
1092
+ assert_equal(@cls[4, 3, 2, 1], a)
1093
+
1094
+ a.fill(1)
1095
+ assert_equal(@cls[1, 1, 1, 1], a.sort!)
1096
+
1097
+ assert_equal(@cls[1], @cls[1].sort!)
1098
+ assert_equal(@cls[], @cls[].sort!)
1099
+ end
1100
+
1101
+ def test_spaceship
1102
+ assert_equal(0, @cls[] <=> @cls[])
1103
+ assert_equal(0, @cls[1] <=> @cls[1])
1104
+ assert_equal(0, @cls[1, 2, 3, 'cat'] <=> @cls[1, 2, 3, 'cat'])
1105
+ assert_equal(-1, @cls[] <=> @cls[1])
1106
+ assert_equal(1, @cls[1] <=> @cls[])
1107
+ assert_equal(-1, @cls[1, 2, 3] <=> @cls[1, 2, 3, 'cat'])
1108
+ assert_equal(1, @cls[1, 2, 3, 'cat'] <=> @cls[1, 2, 3])
1109
+ assert_equal(-1, @cls[1, 2, 3, 'cat'] <=> @cls[1, 2, 3, 'dog'])
1110
+ assert_equal(1, @cls[1, 2, 3, 'dog'] <=> @cls[1, 2, 3, 'cat'])
1111
+
1112
+ assert_equal(0, @cls[1] <=> @cls[1.000])
1113
+ assert_equal(-1, @cls[1] <=> @cls[1.001])
1114
+ assert_equal(1, @cls[1] <=> @cls[0.999])
1115
+
1116
+ # nested arrays
1117
+ assert_equal(0, @cls[1, @cls[0, 3], 5] <=> @cls[1, @cls[0, 3], 5])
1118
+ assert_equal(1, @cls[1, @cls[0, 3], 5] <=> @cls[1, @cls[0, 2], 5])
1119
+ assert_equal(-1, @cls[1, @cls[0, 3], 5] <=> @cls[1, @cls[0, 4], 5])
1120
+ assert_equal(1, @cls[1, @cls[0, 3], 5] <=> @cls[1, @cls[0, 3], 4])
1121
+ assert_equal(-1, @cls[1, @cls[0, 3], 5] <=> @cls[1, @cls[0, 3], 6])
1122
+
1123
+ # error cases
1124
+ assert_equal(nil, @cls[1,2,3] <=> @cls[1, "two", 3])
1125
+
1126
+ a = @cls[1,2,3]
1127
+ a.push(a)
1128
+ assert_raises(SystemStackError) { a <=> a }
1129
+ end
1130
+
1131
+ def test_times
1132
+ assert_equal(@cls[], @cls[]*3)
1133
+ assert_equal(@cls[1, 1, 1], @cls[1]*3)
1134
+ assert_equal(@cls[1, 2, 1, 2, 1, 2], @cls[1, 2]*3)
1135
+ assert_equal(@cls[], @cls[1, 2, 3] * 0)
1136
+ assert_raises(ArgumentError) { @cls[1, 2]*(-3) }
1137
+ assert_raises(TypeError) { @cls[1, 2]*(Object.new) }
1138
+
1139
+ assert_equal('1-2-3-4-5', @cls[1, 2, 3, 4, 5] * '-')
1140
+ assert_equal('12345', @cls[1, 2, 3, 4, 5] * '')
1141
+
1142
+ end
1143
+
1144
+ def test_to_a
1145
+ a = @cls[ 1, 2, 3 ]
1146
+ a_id = a.__id__
1147
+ assert_equal(a, a.to_a)
1148
+ assert_equal(a_id, a.to_a.__id__)
1149
+ end
1150
+
1151
+ def test_to_ary
1152
+ a = [ 1, 2, 3 ]
1153
+ b = @cls[*a]
1154
+
1155
+ a_id = a.__id__
1156
+ assert_equal(a, b.to_ary)
1157
+ if (@cls == Array)
1158
+ assert_equal(a_id, a.to_ary.__id__)
1159
+ end
1160
+ end
1161
+
1162
+ def test_to_s
1163
+ $, = ""
1164
+ a = @cls[]
1165
+ assert_equal("", a.to_s)
1166
+
1167
+ $, = ""
1168
+ a = @cls[1, 2]
1169
+ assert_equal("12", a.to_s)
1170
+
1171
+ $, = ""
1172
+ a = @cls[1, 2, 3]
1173
+ assert_equal("123", a.to_s)
1174
+
1175
+ $, = ":"
1176
+ a = @cls[1, 2, 3]
1177
+ assert_equal("1:2:3", a.to_s)
1178
+
1179
+ $, = ""
1180
+ end
1181
+
1182
+ def test_transpose
1183
+ # normal case
1184
+ ary = [%w(a b c), %w(d e f), %w(g h i), %w(j k l)]
1185
+ exp = [%w(a d g j), %w(b e h k), %w(c f i l)]
1186
+ assert_equal(exp, ary.transpose)
1187
+ assert_equal(ary, ary.transpose.transpose)
1188
+ # the following happens in case of malformed data
1189
+ e = assert_raises(IndexError) { [%w(a b c), %w(d)].transpose }
1190
+ assert_match(/1 should be 3/, e.message)
1191
+ end
1192
+
1193
+ def test_uniq
1194
+ a = @cls[ 1, 2, 3, 2, 1, 2, 3, 4, nil ]
1195
+ b = a.dup
1196
+ assert_equal(@cls[1, 2, 3, 4, nil], a.uniq)
1197
+ assert_equal(b, a)
1198
+
1199
+ assert_equal(@cls[1, 2, 3], @cls[1, 2, 3].uniq)
1200
+ end
1201
+
1202
+ def test_uniq_bang
1203
+ a = @cls[ 1, 2, 3, 2, 1, 2, 3, 4, nil ]
1204
+ assert_equal(@cls[1, 2, 3, 4, nil], a.uniq!)
1205
+ assert_equal(@cls[1, 2, 3, 4, nil], a)
1206
+
1207
+ assert_nil(@cls[1, 2, 3].uniq!)
1208
+ end
1209
+
1210
+ def test_unshift
1211
+ a = @cls[]
1212
+ assert_equal(@cls['cat'], a.unshift('cat'))
1213
+ assert_equal(@cls['dog', 'cat'], a.unshift('dog'))
1214
+ assert_equal(@cls[nil, 'dog', 'cat'], a.unshift(nil))
1215
+ assert_equal(@cls[@cls[1,2], nil, 'dog', 'cat'], a.unshift(@cls[1, 2]))
1216
+ end
1217
+
1218
+ def test_values_at
1219
+ generic_index_test(:values_at)
1220
+ end
1221
+
1222
+ def test_values_at_extra_wtf # FIX
1223
+ assert_equal([], %w(a b c d e).values_at)
1224
+ assert_equal(%w(c), %w(a b c d e).values_at(2))
1225
+ assert_equal(%w(b d), %w(a b c d e).values_at(1, 3))
1226
+ assert_equal([nil, nil], %w(a b c d e).values_at(5, 300))
1227
+ assert_equal(%w(e), %w(a b c d e).values_at(-1))
1228
+ assert_equal(%w(d b), %w(a b c d e).values_at(-2, -4))
1229
+ assert_equal([nil, nil], %w(a b c d e).values_at(-6, -500))
1230
+ assert_equal(%w(a c e), %w(a b c d e).values_at(0.0, 2.0, 4.0)) # float as index
1231
+ assert_equal(%w(b), %w(a b c d e).values_at(1.8)) # float as index
1232
+ assert_equal(%w(b c d), %w(a b c d e).values_at(1..3))
1233
+ assert_raises(TypeError) { %w(a b c).values_at(nil) }
1234
+ assert_raises(TypeError) { %w(a b c).values_at("x") }
1235
+ assert_raises(TypeError) { %w(a b c).values_at([]) }
1236
+ assert_raises(TypeError) { %w(a b c).values_at(true) }
1237
+ end
1238
+
1239
+ def test_zip
1240
+ a = @cls[4, 5, 6]
1241
+ b = @cls[7, 8, 9]
1242
+
1243
+ assert_equal([[1, 4, 7], [2, 5, 8], [3, 6, 9]], @cls[1, 2, 3].zip(a, b))
1244
+ assert_equal([[1, 4, 7], [2, 5, 8]], @cls[1, 2].zip(a, b))
1245
+ assert_equal([[4, 1, 8], [5, 2, nil], [6, nil, nil]], a.zip([1, 2], [8]))
1246
+ end
1247
+
1248
+ # TODO: question these:
1249
+ # def ===(*args)
1250
+ # raise NotImplementedError, 'Need to write ==='
1251
+ # end
1252
+
1253
+ # def clone(*args)
1254
+ # raise NotImplementedError, 'Need to write clone'
1255
+ # end
1256
+
1257
+ # def dup(*args)
1258
+ # raise NotImplementedError, 'Need to write dup'
1259
+ # end
1260
+ end
1261
+