bfts 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+