external 0.1.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.
- data/History +5 -0
- data/MIT-LICENSE +21 -0
- data/README +168 -0
- data/lib/ext_arc.rb +108 -0
- data/lib/ext_arr.rb +727 -0
- data/lib/ext_ind.rb +1120 -0
- data/lib/external/base.rb +85 -0
- data/lib/external/chunkable.rb +105 -0
- data/lib/external/enumerable.rb +137 -0
- data/lib/external/io.rb +398 -0
- data/lib/external.rb +3 -0
- data/test/benchmarks/benchmarks_20070918.txt +45 -0
- data/test/benchmarks/benchmarks_20070921.txt +91 -0
- data/test/benchmarks/benchmarks_20071006.txt +147 -0
- data/test/benchmarks/test_copy_file.rb +80 -0
- data/test/benchmarks/test_pos_speed.rb +47 -0
- data/test/benchmarks/test_read_time.rb +55 -0
- data/test/cached_ext_ind_test.rb +219 -0
- data/test/check/benchmark_check.rb +441 -0
- data/test/check/namespace_conflicts_check.rb +23 -0
- data/test/check/pack_check.rb +90 -0
- data/test/ext_arc_test.rb +286 -0
- data/test/ext_arr/alt_sep.txt +3 -0
- data/test/ext_arr/cr_lf_input.txt +3 -0
- data/test/ext_arr/input.index +0 -0
- data/test/ext_arr/input.txt +1 -0
- data/test/ext_arr/inputb.index +0 -0
- data/test/ext_arr/inputb.txt +1 -0
- data/test/ext_arr/lf_input.txt +3 -0
- data/test/ext_arr/lines.txt +19 -0
- data/test/ext_arr/without_index.txt +1 -0
- data/test/ext_arr_test.rb +534 -0
- data/test/ext_ind_test.rb +1472 -0
- data/test/external/base_test.rb +74 -0
- data/test/external/chunkable_test.rb +182 -0
- data/test/external/index/input.index +0 -0
- data/test/external/index/inputb.index +0 -0
- data/test/external/io_test.rb +414 -0
- data/test/external_test_helper.rb +31 -0
- data/test/external_test_suite.rb +4 -0
- data/test/test_array.rb +1192 -0
- metadata +104 -0
@@ -0,0 +1,1472 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'external_test_helper.rb')
|
2
|
+
require 'ext_ind'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
require 'ext_arr'
|
6
|
+
|
7
|
+
class ExtIndTest < Test::Unit::TestCase
|
8
|
+
include Benchmark
|
9
|
+
include External
|
10
|
+
include TestArray
|
11
|
+
|
12
|
+
attr_reader :index, :tempfile
|
13
|
+
|
14
|
+
def setup
|
15
|
+
# cls represents an array
|
16
|
+
@cls = ExtInd
|
17
|
+
|
18
|
+
@tempfile = Tempfile.new("indextest")
|
19
|
+
@tempfile << array.pack(format)
|
20
|
+
@tempfile.pos = 0
|
21
|
+
|
22
|
+
@index = ExtInd.new(@tempfile)
|
23
|
+
end
|
24
|
+
|
25
|
+
def array
|
26
|
+
[1,2,3,4,5]
|
27
|
+
end
|
28
|
+
|
29
|
+
def framed_array
|
30
|
+
[[1],[2],[3],[4],[5]]
|
31
|
+
end
|
32
|
+
|
33
|
+
def format
|
34
|
+
"I*"
|
35
|
+
end
|
36
|
+
|
37
|
+
def teardown
|
38
|
+
@tempfile.close unless @tempfile.closed?
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
# readme doc test
|
43
|
+
#
|
44
|
+
|
45
|
+
def test_readme_doc_for_ext_ind
|
46
|
+
ea = ExtArr.new
|
47
|
+
assert_equal ExtInd, ea.index.class
|
48
|
+
index = ea.index
|
49
|
+
assert_equal 'I*', index.format
|
50
|
+
assert_equal 2, index.frame
|
51
|
+
index << [1,2]
|
52
|
+
index << [3,4]
|
53
|
+
assert_equal [[1,2],[3,4]], index.to_a
|
54
|
+
|
55
|
+
Tempfile.open('test_readme_doc_for_ext_ind') do |file|
|
56
|
+
file << [1,2,3].pack("IQS")
|
57
|
+
file << [4,5,6].pack("IQS")
|
58
|
+
file << [7,8,9].pack("IQS")
|
59
|
+
file.flush
|
60
|
+
|
61
|
+
index = ExtInd.new(file, :format => "IQS")
|
62
|
+
assert_equal [4,5,6], index[1]
|
63
|
+
assert_equal [[1,2,3],[4,5,6],[7,8,9]], index.to_a
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
#
|
68
|
+
# setup tests
|
69
|
+
#
|
70
|
+
|
71
|
+
def test_setup
|
72
|
+
assert_equal ExtInd, @cls
|
73
|
+
|
74
|
+
assert_equal 0, index.pos
|
75
|
+
assert_equal 5, index.length
|
76
|
+
assert_equal 4, index.frame_size
|
77
|
+
assert_equal 8 * 2**20, index.buffer_size
|
78
|
+
assert_equal [0], index.nil_value
|
79
|
+
assert !index.cached?
|
80
|
+
assert_nil index.cache
|
81
|
+
assert_equal({:format => "I", :buffer_size => 8 * 2**20, :nil_value => [0], :cached => false}, index.options)
|
82
|
+
|
83
|
+
tempfile.pos = 0
|
84
|
+
assert_equal array.pack(format), tempfile.read
|
85
|
+
assert_equal tempfile.path, index.io.path
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
# class read tests
|
90
|
+
#
|
91
|
+
|
92
|
+
def test_read_returns_the_index_file_in_frame
|
93
|
+
assert_equal framed_array, ExtInd.read(tempfile.path)
|
94
|
+
|
95
|
+
tempfile.pos = tempfile.length
|
96
|
+
tempfile << [6].pack("I")
|
97
|
+
tempfile.flush
|
98
|
+
tempfile.pos = 0
|
99
|
+
assert_equal [1,2,3,4,5,6].pack("I*"), tempfile.read
|
100
|
+
|
101
|
+
assert_equal [[1,2],[3,4],[5,6]], ExtInd.read(tempfile.path, :format => 'II')
|
102
|
+
end
|
103
|
+
|
104
|
+
#
|
105
|
+
# class directive size tests
|
106
|
+
#
|
107
|
+
|
108
|
+
def test_directive_size_returns_the_number_of_bytes_to_pack_a_directive
|
109
|
+
# @ | Moves to absolute position
|
110
|
+
# not implemented
|
111
|
+
assert_nil ExtInd.directive_size('@')
|
112
|
+
# A | ASCII string (space padded, count is width)
|
113
|
+
assert_equal 1, ["a"].pack("A").length
|
114
|
+
assert_equal 1, ExtInd.directive_size('A')
|
115
|
+
# a | ASCII string (null padded, count is width)
|
116
|
+
assert_equal 1, ["a"].pack("a").length
|
117
|
+
assert_equal 1, ExtInd.directive_size('a')
|
118
|
+
# B | Bit string (descending bit order)
|
119
|
+
assert_equal 1, ['a'].pack("B").length
|
120
|
+
assert_equal 1, ExtInd.directive_size('B')
|
121
|
+
# b | Bit string (ascending bit order)
|
122
|
+
assert_equal 1, ['a'].pack("b").length
|
123
|
+
assert_equal 1, ExtInd.directive_size('b')
|
124
|
+
# C | Unsigned char
|
125
|
+
assert_equal 1, [1].pack("C").length
|
126
|
+
assert_equal 1, ExtInd.directive_size('C')
|
127
|
+
# c | Char
|
128
|
+
assert_equal 1, [1].pack("c").length
|
129
|
+
assert_equal 1, ExtInd.directive_size('c')
|
130
|
+
# D, d | Double-precision float, native format
|
131
|
+
assert_equal 8, [1].pack("D").length
|
132
|
+
assert_equal 8, ExtInd.directive_size('D')
|
133
|
+
assert_equal 8, [1].pack("d").length
|
134
|
+
assert_equal 8, ExtInd.directive_size('d')
|
135
|
+
# E | Double-precision float, little-endian byte order
|
136
|
+
assert_equal 8, [1].pack("E").length
|
137
|
+
assert_equal 8, ExtInd.directive_size('E')
|
138
|
+
# e | Single-precision float, little-endian byte order
|
139
|
+
assert_equal 4, [1].pack("e").length
|
140
|
+
assert_equal 4, ExtInd.directive_size('e')
|
141
|
+
# F, f | Single-precision float, native format
|
142
|
+
assert_equal 4, [1].pack("F").length
|
143
|
+
assert_equal 4, ExtInd.directive_size('F')
|
144
|
+
assert_equal 4, [1].pack("f").length
|
145
|
+
assert_equal 4, ExtInd.directive_size('f')
|
146
|
+
# G | Double-precision float, network (big-endian) byte order
|
147
|
+
assert_equal 8, [1].pack("G").length
|
148
|
+
assert_equal 8, ExtInd.directive_size('G')
|
149
|
+
# g | Single-precision float, network (big-endian) byte order
|
150
|
+
assert_equal 4, [1].pack("g").length
|
151
|
+
assert_equal 4, ExtInd.directive_size('g')
|
152
|
+
# H | Hex string (high nibble first)
|
153
|
+
assert_equal 1, ['a'].pack("H").length
|
154
|
+
assert_equal 1, ExtInd.directive_size('H')
|
155
|
+
# h | Hex string (low nibble first)
|
156
|
+
assert_equal 1, ['a'].pack("h").length
|
157
|
+
assert_equal 1, ExtInd.directive_size('h')
|
158
|
+
# I | Unsigned integer
|
159
|
+
assert_equal 4, [1].pack("I").length
|
160
|
+
assert_equal 4, ExtInd.directive_size('I')
|
161
|
+
# i | Integer
|
162
|
+
assert_equal 4, [1].pack("i").length
|
163
|
+
assert_equal 4, ExtInd.directive_size('i')
|
164
|
+
# L | Unsigned long
|
165
|
+
assert_equal 4, [1].pack("L").length
|
166
|
+
assert_equal 4, ExtInd.directive_size('L')
|
167
|
+
# l | Long
|
168
|
+
assert_equal 4, [1].pack("l").length
|
169
|
+
assert_equal 4, ExtInd.directive_size('l')
|
170
|
+
# M | Quoted printable, MIME encoding (see RFC2045)
|
171
|
+
assert_equal 3, ['a'].pack("M").length
|
172
|
+
assert_equal 3, ExtInd.directive_size('M')
|
173
|
+
# m | Base64 encoded string
|
174
|
+
assert_equal 5, ['a'].pack("m").length
|
175
|
+
assert_equal 5, ExtInd.directive_size('m')
|
176
|
+
# N | Long, network (big-endian) byte order
|
177
|
+
assert_equal 4, [1].pack("N").length
|
178
|
+
assert_equal 4, ExtInd.directive_size('N')
|
179
|
+
# n | Short, network (big-endian) byte-order
|
180
|
+
assert_equal 2, [1].pack("n").length
|
181
|
+
assert_equal 2, ExtInd.directive_size('n')
|
182
|
+
# P | Pointer to a structure (fixed-length string)
|
183
|
+
assert_equal 4, ['a'].pack("P").length
|
184
|
+
assert_equal 4, ExtInd.directive_size('P')
|
185
|
+
# p | Pointer to a null-terminated string
|
186
|
+
assert_equal 4, ['a'].pack("p").length
|
187
|
+
assert_equal 4, ExtInd.directive_size('p')
|
188
|
+
# Q, q | 64-bit number
|
189
|
+
assert_equal 8, [1].pack("Q").length
|
190
|
+
assert_equal 8, ExtInd.directive_size('Q')
|
191
|
+
assert_equal 8, [1].pack("q").length
|
192
|
+
assert_equal 8, ExtInd.directive_size('q')
|
193
|
+
# S | Unsigned short
|
194
|
+
assert_equal 2, [1].pack("S").length
|
195
|
+
assert_equal 2, ExtInd.directive_size('S')
|
196
|
+
# s | Short
|
197
|
+
assert_equal 2, [1].pack("s").length
|
198
|
+
assert_equal 2, ExtInd.directive_size('s')
|
199
|
+
# U | UTF-8
|
200
|
+
assert_equal 1, [1].pack("U").length
|
201
|
+
assert_equal 1, ExtInd.directive_size('U')
|
202
|
+
# u | UU-encoded string
|
203
|
+
assert_equal 6, ['a'].pack("u").length
|
204
|
+
assert_equal 6, ExtInd.directive_size('u')
|
205
|
+
# V | Long, little-endian byte order
|
206
|
+
assert_equal 4, [1].pack("V").length
|
207
|
+
assert_equal 4, ExtInd.directive_size('V')
|
208
|
+
# v | Short, little-endian byte order
|
209
|
+
assert_equal 2, [1].pack("v").length
|
210
|
+
assert_equal 2, ExtInd.directive_size('v')
|
211
|
+
# w | BER-compressed integer\fnm
|
212
|
+
# not implemented
|
213
|
+
assert_equal 1, [1].pack("w").length
|
214
|
+
assert_equal 1, ExtInd.directive_size('w')
|
215
|
+
# X | Back up a byte
|
216
|
+
# not implemented
|
217
|
+
assert_nil ExtInd.directive_size('X')
|
218
|
+
# x | Null byte
|
219
|
+
assert_equal 1, [nil].pack("x").length
|
220
|
+
assert_equal 1, ExtInd.directive_size('x')
|
221
|
+
# Z | Same as ``a'', except that null is added with *
|
222
|
+
assert_equal 1, ['a'].pack("Z").length
|
223
|
+
assert_equal 1, ExtInd.directive_size('Z')
|
224
|
+
end
|
225
|
+
|
226
|
+
#
|
227
|
+
# initialize tests
|
228
|
+
#
|
229
|
+
|
230
|
+
def test_index_initialized_to_single_int_format_by_default
|
231
|
+
index = @cls.new
|
232
|
+
|
233
|
+
assert_equal 'I*', index.format
|
234
|
+
assert_equal 1, index.frame
|
235
|
+
assert_equal 4, index.frame_size
|
236
|
+
assert_equal [0], index.nil_value
|
237
|
+
assert !index.cached?
|
238
|
+
assert_nil index.cache
|
239
|
+
end
|
240
|
+
|
241
|
+
def test_initialize_calculates_frame_and_frame_size_from_format
|
242
|
+
{
|
243
|
+
'I' => [1, 4],
|
244
|
+
'II' => [2, 8],
|
245
|
+
'IQS' => [3, 14]
|
246
|
+
}.each_pair do |format, expected|
|
247
|
+
index = @cls.new(nil, :format => format)
|
248
|
+
|
249
|
+
assert_equal expected, [index.frame, index.frame_size]
|
250
|
+
assert_equal Array.new(expected.first, 0), index.nil_value
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_format_with_unknown_directive_raises_error
|
255
|
+
assert_raise(ArgumentError) { @cls.new(nil, :format => 'x') }
|
256
|
+
end
|
257
|
+
|
258
|
+
def test_default_nil_value_is_calculated_according_to_frame
|
259
|
+
index = @cls.new(nil, :format => "I")
|
260
|
+
assert_equal [0], index.nil_value
|
261
|
+
|
262
|
+
index = @cls.new(nil, :format => "II")
|
263
|
+
assert_equal [0, 0], index.nil_value
|
264
|
+
end
|
265
|
+
|
266
|
+
def test_nil_value_can_be_provided_in_options
|
267
|
+
index = @cls.new(nil, :nil_value => [8])
|
268
|
+
assert_equal [8], index.nil_value
|
269
|
+
|
270
|
+
index = @cls.new(nil, :format => "II", :nil_value => [8,9])
|
271
|
+
assert_equal [8,9], index.nil_value
|
272
|
+
end
|
273
|
+
|
274
|
+
def test_nil_value_option_raises_error_if_out_of_frame
|
275
|
+
assert_raise(ArgumentError) { @cls.new(nil, :nil_value => [8, 9]) }
|
276
|
+
assert_raise(ArgumentError) { @cls.new(nil, :format => 'II', :nil_value => [0]) }
|
277
|
+
end
|
278
|
+
|
279
|
+
#
|
280
|
+
# buffer_size test
|
281
|
+
#
|
282
|
+
|
283
|
+
def test_index_and_io_chunk_and_gap_size_are_calculated_relative_to_buffer_size
|
284
|
+
index = @cls.new(nil, :buffer_size => 40000)
|
285
|
+
assert_equal 40000, index.buffer_size
|
286
|
+
assert_equal 4, index.frame_size
|
287
|
+
assert_equal 10000, index.default_blksize
|
288
|
+
assert_equal 40000, index.io.default_blksize
|
289
|
+
|
290
|
+
index.buffer_size = 80000
|
291
|
+
assert_equal 20000, index.default_blksize
|
292
|
+
assert_equal 80000, index.io.default_blksize
|
293
|
+
end
|
294
|
+
|
295
|
+
def test_buffer_size_is_io_default_blksize
|
296
|
+
index = @cls.new
|
297
|
+
|
298
|
+
index.io.default_blksize = 1000
|
299
|
+
assert_equal 1000, index.io.default_blksize
|
300
|
+
assert_equal 1000, index.buffer_size
|
301
|
+
end
|
302
|
+
|
303
|
+
#
|
304
|
+
# default_blksize test
|
305
|
+
#
|
306
|
+
|
307
|
+
def test_default_blksize_sets_io_default_blksize
|
308
|
+
index = @cls.new
|
309
|
+
assert_equal 4, index.frame_size
|
310
|
+
|
311
|
+
index.default_blksize = 10000
|
312
|
+
assert_equal 10000, index.default_blksize
|
313
|
+
assert_equal 40000, index.io.default_blksize
|
314
|
+
end
|
315
|
+
|
316
|
+
#
|
317
|
+
# nil_value tests
|
318
|
+
#
|
319
|
+
|
320
|
+
def test_nil_value_documentation
|
321
|
+
i = @cls.new
|
322
|
+
assert_equal [0], i.nil_value
|
323
|
+
assert_equal "\000\000\000\000", i.nil_value(false)
|
324
|
+
end
|
325
|
+
|
326
|
+
#
|
327
|
+
# length test
|
328
|
+
#
|
329
|
+
|
330
|
+
def test_length_returns_io_length_divided_by_frame_size
|
331
|
+
assert_equal 20, tempfile.length
|
332
|
+
assert_equal 5, index.length
|
333
|
+
|
334
|
+
tempfile.length = 4
|
335
|
+
assert_equal 1, index.length
|
336
|
+
|
337
|
+
tempfile.length = 0
|
338
|
+
assert_equal 0, index.length
|
339
|
+
end
|
340
|
+
|
341
|
+
#
|
342
|
+
# pos test
|
343
|
+
#
|
344
|
+
|
345
|
+
def test_pos_returns_io_pos_divided_by_frame_size
|
346
|
+
assert_equal 0, index.io.pos
|
347
|
+
assert_equal 0, index.pos
|
348
|
+
|
349
|
+
index.io.pos = 4
|
350
|
+
assert_equal 1, index.pos
|
351
|
+
|
352
|
+
index.io.pos = 20
|
353
|
+
assert_equal 5, index.pos
|
354
|
+
end
|
355
|
+
|
356
|
+
#
|
357
|
+
# pos= test
|
358
|
+
#
|
359
|
+
|
360
|
+
def test_pos_set_documentation
|
361
|
+
i = @cls[[1],[2],[3]]
|
362
|
+
assert_equal 3, i.length
|
363
|
+
i.pos = 2
|
364
|
+
assert_equal 2, i.pos
|
365
|
+
i.pos = -1
|
366
|
+
assert_equal 2, i.pos
|
367
|
+
end
|
368
|
+
|
369
|
+
def test_pos_set_sets_io_pos_to_index_value_of_input_times_frame_size
|
370
|
+
index.pos = 1
|
371
|
+
assert_equal 1, index.pos
|
372
|
+
assert_equal 4, index.io.pos
|
373
|
+
|
374
|
+
index.pos = -1
|
375
|
+
assert_equal 4, index.pos
|
376
|
+
assert_equal 16, index.io.pos
|
377
|
+
end
|
378
|
+
|
379
|
+
def test_positions_can_be_set_beyond_the_index_length
|
380
|
+
index.pos = 10
|
381
|
+
assert_equal 10, index.pos
|
382
|
+
end
|
383
|
+
|
384
|
+
def test_pos_set_raises_error_if_out_of_bounds
|
385
|
+
assert_raise(ArgumentError) { index.pos = -6 }
|
386
|
+
end
|
387
|
+
|
388
|
+
#
|
389
|
+
# readbytes test
|
390
|
+
#
|
391
|
+
|
392
|
+
def test_readbytes_documentation
|
393
|
+
i = @cls[[1],[2],[3]]
|
394
|
+
assert_equal [1,2,3], i.readbytes.unpack("I*")
|
395
|
+
assert_equal [1], i.readbytes(1,0).unpack("I*")
|
396
|
+
assert_equal [2,3], i.readbytes(10,1).unpack("I*")
|
397
|
+
i.pos = 3
|
398
|
+
assert_equal "", i.readbytes
|
399
|
+
assert_equal nil, i.readbytes(1)
|
400
|
+
end
|
401
|
+
|
402
|
+
def test_readbytes_returns_bytestring_for_n_and_pos
|
403
|
+
assert_equal array.pack(format), index.readbytes(5,0)
|
404
|
+
assert_equal array.pack(format), index.readbytes(5,-5)
|
405
|
+
assert_equal [2,3].pack(format), index.readbytes(2,1)
|
406
|
+
|
407
|
+
assert_equal array.pack(format), index.readbytes(10,0)
|
408
|
+
assert_equal array.pack(format), index.readbytes(10,-5)
|
409
|
+
|
410
|
+
index.pos = 0
|
411
|
+
assert_equal array.pack(format), index.readbytes
|
412
|
+
|
413
|
+
index.pos = 3
|
414
|
+
assert_equal [4,5].pack(format), index.readbytes
|
415
|
+
|
416
|
+
index.pos = 3
|
417
|
+
assert_equal [4].pack(format), index.readbytes(1)
|
418
|
+
end
|
419
|
+
|
420
|
+
def test_readbytes_returns_nil_if_n_is_specified_and_no_entries_can_be_read
|
421
|
+
assert_nil index.readbytes(1,5)
|
422
|
+
end
|
423
|
+
|
424
|
+
def test_readbytes_returns_empty_string_if_n_is_nil_and_no_entries_can_be_read
|
425
|
+
assert_equal "", index.readbytes(nil, 5)
|
426
|
+
end
|
427
|
+
|
428
|
+
def test_readbytes_raises_error_if_position_is_out_of_bounds
|
429
|
+
assert_raise(ArgumentError) { index.readbytes(1,-6) }
|
430
|
+
end
|
431
|
+
|
432
|
+
def test_readbytes_behavior_is_like_io_behavior
|
433
|
+
tempfile.pos = 20
|
434
|
+
assert_equal "", tempfile.read(nil)
|
435
|
+
assert_nil tempfile.read(1)
|
436
|
+
end
|
437
|
+
|
438
|
+
#
|
439
|
+
# unpack tests
|
440
|
+
#
|
441
|
+
|
442
|
+
def test_unpack_documentation
|
443
|
+
assert_equal "I*", index.format
|
444
|
+
assert_equal [1], index.unpack( [1].pack('I*') )
|
445
|
+
assert_equal [[1], [2], [3]], index.unpack( [1,2,3].pack('I*') )
|
446
|
+
assert_equal [], index.unpack("")
|
447
|
+
end
|
448
|
+
|
449
|
+
def test_unpack_unpacks_string_into_frames_using_format
|
450
|
+
assert_equal [[1],[2],[3],[4],[5]], index.unpack(array.pack(format))
|
451
|
+
assert_equal [1], index.unpack([1].pack(format))
|
452
|
+
assert_equal [], index.unpack("")
|
453
|
+
end
|
454
|
+
|
455
|
+
#
|
456
|
+
# read tests
|
457
|
+
#
|
458
|
+
|
459
|
+
def test_read_documentation
|
460
|
+
i = @cls[[1],[2],[3]]
|
461
|
+
assert_equal 0, i.pos
|
462
|
+
assert_equal [[1],[2],[3]], i.read
|
463
|
+
assert_equal [1], i.read(1,0)
|
464
|
+
assert_equal [[2],[3]], i.read(10,1)
|
465
|
+
|
466
|
+
i.pos = 3
|
467
|
+
assert_equal [], i.read
|
468
|
+
assert_equal nil, i.read(1)
|
469
|
+
end
|
470
|
+
|
471
|
+
def test_read_returns_unpacked_array_for_n_and_pos
|
472
|
+
assert_equal framed_array, index.read(5,0)
|
473
|
+
assert_equal framed_array, index.read(5,-5)
|
474
|
+
assert_equal [[2],[3]], index.read(2,1)
|
475
|
+
|
476
|
+
assert_equal framed_array, index.read(10,0)
|
477
|
+
assert_equal framed_array, index.read(10,-5)
|
478
|
+
|
479
|
+
index.pos = 0
|
480
|
+
assert_equal framed_array, index.read
|
481
|
+
|
482
|
+
index.pos = 3
|
483
|
+
assert_equal [[4],[5]], index.read
|
484
|
+
|
485
|
+
index.pos = 3
|
486
|
+
assert_equal [4], index.read(1)
|
487
|
+
end
|
488
|
+
|
489
|
+
def test_read_returns_nil_if_n_is_specified_and_no_entries_can_be_read
|
490
|
+
assert_nil index.read(1,5)
|
491
|
+
end
|
492
|
+
|
493
|
+
def test_read_returns_empty_array_if_n_is_nil_and_no_entries_can_be_read
|
494
|
+
assert_equal [], index.read(nil, 5)
|
495
|
+
end
|
496
|
+
|
497
|
+
def test_read_raises_error_if_position_is_out_of_bounds
|
498
|
+
assert_raise(ArgumentError) { index.read(1,-6) }
|
499
|
+
end
|
500
|
+
|
501
|
+
#
|
502
|
+
# test unframed_write
|
503
|
+
#
|
504
|
+
|
505
|
+
def test_documentation
|
506
|
+
i = @cls[]
|
507
|
+
i.unframed_write([2,3], 1)
|
508
|
+
i.pos = 0
|
509
|
+
i.unframed_write([1])
|
510
|
+
assert_equal [[1],[2],[3]], i.read(3, 0)
|
511
|
+
end
|
512
|
+
|
513
|
+
def test_unframed_write_unframed_writes_packed_array_to_io_at_pos_and_adjusts_io_length
|
514
|
+
index = @cls.new
|
515
|
+
index.unframed_write([1,2,3])
|
516
|
+
assert_equal 12, index.io.length
|
517
|
+
assert_equal 12, index.io.pos
|
518
|
+
|
519
|
+
index.io.pos = 0
|
520
|
+
assert_equal [1,2,3].pack("I*"), index.io.read
|
521
|
+
|
522
|
+
index.unframed_write([-2], 1)
|
523
|
+
assert_equal 12, index.io.length
|
524
|
+
assert_equal 8, index.io.pos
|
525
|
+
|
526
|
+
index.io.pos = 0
|
527
|
+
assert_equal [1,-2,3].pack("I*"), index.io.read
|
528
|
+
end
|
529
|
+
|
530
|
+
def test_unframed_write_pads_with_nil_value_if_position_is_past_length
|
531
|
+
index = @cls.new nil, :nil_value => [8]
|
532
|
+
assert_equal 0, index.length
|
533
|
+
|
534
|
+
index.unframed_write([1,2,3], 2)
|
535
|
+
|
536
|
+
index.io.pos = 0
|
537
|
+
assert_equal [8,8,1,2,3], index.io.read.unpack("I*")
|
538
|
+
end
|
539
|
+
|
540
|
+
def test_unframed_write_unframed_writes_nothing_with_empty_array
|
541
|
+
assert_equal 20, index.io.length
|
542
|
+
|
543
|
+
index.unframed_write([])
|
544
|
+
index.pos = 0
|
545
|
+
assert_equal 20, index.io.length
|
546
|
+
|
547
|
+
index.unframed_write([], 0)
|
548
|
+
index.pos = 0
|
549
|
+
assert_equal 20, index.io.length
|
550
|
+
end
|
551
|
+
|
552
|
+
def test_unframed_write_raises_error_if_array_is_not_in_frame
|
553
|
+
index = @cls.new(nil, :format => "II")
|
554
|
+
assert_raise(ArgumentError) { index.unframed_write([1]) }
|
555
|
+
assert_raise(ArgumentError) { index.unframed_write([1,2,3]) }
|
556
|
+
end
|
557
|
+
|
558
|
+
#
|
559
|
+
# mixed formats test
|
560
|
+
#
|
561
|
+
|
562
|
+
def test_read_handles_mixed_formats
|
563
|
+
index = @cls.new tempfile, :format => "IQS"
|
564
|
+
tempfile.pos = 0
|
565
|
+
a = [1,2,3].pack("IQS")
|
566
|
+
b = [4,5,6].pack("IQS")
|
567
|
+
c = [7,8,9].pack("IQS")
|
568
|
+
tempfile << a + b + c
|
569
|
+
|
570
|
+
index.pos=0
|
571
|
+
assert_equal [[1,2,3],[4,5,6],[7,8,9]], index.read
|
572
|
+
|
573
|
+
index.pos=1
|
574
|
+
assert_equal [4,5,6], index.read(1)
|
575
|
+
end
|
576
|
+
|
577
|
+
def test_unframed_write_handles_mixed_formats
|
578
|
+
index = @cls.new tempfile, :format => "IQS"
|
579
|
+
a = [1,2,3].pack("IQS")
|
580
|
+
b = [4,5,6].pack("IQS")
|
581
|
+
c = [7,8,9].pack("IQS")
|
582
|
+
d = [-4,-5,-6].pack("IQS")
|
583
|
+
|
584
|
+
index.unframed_write([1,2,3,4,5,6,7,8,9])
|
585
|
+
tempfile.pos=0
|
586
|
+
assert_equal a+b+c, tempfile.read
|
587
|
+
|
588
|
+
index.pos=1
|
589
|
+
index.unframed_write([-4,-5,-6])
|
590
|
+
tempfile.pos=0
|
591
|
+
assert_equal a+d+c, tempfile.read
|
592
|
+
end
|
593
|
+
|
594
|
+
#
|
595
|
+
# numeric format range tests
|
596
|
+
#
|
597
|
+
|
598
|
+
unless defined?(SHRT_MIN)
|
599
|
+
SHRT_MIN = -32768
|
600
|
+
SHRT_MAX = 32767
|
601
|
+
|
602
|
+
USHRT_MIN = 0
|
603
|
+
USHRT_MAX = 65535
|
604
|
+
|
605
|
+
LONG_MIN = -2147483648
|
606
|
+
LONG_MAX = 2147483647
|
607
|
+
|
608
|
+
ULONG_MIN = 0
|
609
|
+
ULONG_MAX = 4294967295
|
610
|
+
|
611
|
+
LLONG_MIN = -9223372036854775808
|
612
|
+
LLONG_MAX = 9223372036854775807
|
613
|
+
|
614
|
+
ULLONG_MIN = 0
|
615
|
+
ULLONG_MAX = 18446744073709551615
|
616
|
+
end
|
617
|
+
|
618
|
+
def test_read_and_unframed_write_handles_full_numeric_range_for_numeric_formats
|
619
|
+
# S handles an unsigned short
|
620
|
+
i = @cls.new tempfile, :format => 'S'
|
621
|
+
|
622
|
+
i.unframed_write([USHRT_MIN], 0)
|
623
|
+
assert_equal [USHRT_MIN], i.read(1,0)
|
624
|
+
i.unframed_write([USHRT_MAX], 0)
|
625
|
+
assert_equal [USHRT_MAX], i.read(1,0)
|
626
|
+
|
627
|
+
i.unframed_write([USHRT_MIN-1], 0)
|
628
|
+
assert_equal [USHRT_MAX], i.read(1,0)
|
629
|
+
|
630
|
+
# s handles an signed short
|
631
|
+
i = @cls.new tempfile, :format => 's'
|
632
|
+
|
633
|
+
i.unframed_write([SHRT_MIN], 0)
|
634
|
+
assert_equal [SHRT_MIN], i.read(1,0)
|
635
|
+
i.unframed_write([SHRT_MAX], 0)
|
636
|
+
assert_equal [SHRT_MAX], i.read(1,0)
|
637
|
+
|
638
|
+
i.unframed_write([SHRT_MIN], 0)
|
639
|
+
assert_equal [SHRT_MIN], i.read(1,0)
|
640
|
+
i.unframed_write([SHRT_MIN-1], 0)
|
641
|
+
assert_equal [SHRT_MAX], i.read(1,0)
|
642
|
+
|
643
|
+
# I,L handle an unsigned long
|
644
|
+
['I', 'L'].each do |format|
|
645
|
+
i = @cls.new tempfile, :format => format
|
646
|
+
|
647
|
+
i.unframed_write([ULONG_MIN], 0)
|
648
|
+
assert_equal [ULONG_MIN], i.read(1,0)
|
649
|
+
i.unframed_write([ULONG_MAX], 0)
|
650
|
+
assert_equal [ULONG_MAX], i.read(1,0)
|
651
|
+
|
652
|
+
i.unframed_write([ULONG_MIN-1], 0)
|
653
|
+
assert_equal [ULONG_MAX], i.read(1,0)
|
654
|
+
end
|
655
|
+
|
656
|
+
# i,l handle an signed long
|
657
|
+
['i', 'l'].each do |format|
|
658
|
+
i = @cls.new tempfile, :format => format
|
659
|
+
|
660
|
+
i.unframed_write([LONG_MIN], 0)
|
661
|
+
assert_equal [LONG_MIN], i.read(1,0)
|
662
|
+
i.unframed_write([LONG_MAX], 0)
|
663
|
+
assert_equal [LONG_MAX], i.read(1,0)
|
664
|
+
|
665
|
+
i.unframed_write([LONG_MIN], 0)
|
666
|
+
assert_equal [LONG_MIN], i.read(1,0)
|
667
|
+
i.unframed_write([LONG_MIN-1], 0)
|
668
|
+
assert_equal [LONG_MAX], i.read(1,0)
|
669
|
+
end
|
670
|
+
|
671
|
+
# Q handles an unsigned long long
|
672
|
+
i = @cls.new tempfile, :format => 'Q'
|
673
|
+
|
674
|
+
i.unframed_write([ULLONG_MIN], 0)
|
675
|
+
assert_equal [ULLONG_MIN], i.read(1,0)
|
676
|
+
i.unframed_write([ULLONG_MAX], 0)
|
677
|
+
assert_equal [ULLONG_MAX], i.read(1,0)
|
678
|
+
|
679
|
+
i.unframed_write([ULLONG_MIN-1], 0)
|
680
|
+
assert_equal [ULLONG_MAX], i.read(1,0)
|
681
|
+
|
682
|
+
# q handles an signed long long
|
683
|
+
i = @cls.new tempfile, :format => 'q'
|
684
|
+
|
685
|
+
i.unframed_write([LLONG_MIN], 0)
|
686
|
+
assert_equal [LLONG_MIN], i.read(1,0)
|
687
|
+
i.unframed_write([LLONG_MAX], 0)
|
688
|
+
assert_equal [LLONG_MAX], i.read(1,0)
|
689
|
+
|
690
|
+
i.unframed_write([LLONG_MIN], 0)
|
691
|
+
assert_equal [LLONG_MIN], i.read(1,0)
|
692
|
+
i.unframed_write([LLONG_MIN-1], 0)
|
693
|
+
assert_equal [LLONG_MAX], i.read(1,0)
|
694
|
+
end
|
695
|
+
|
696
|
+
def test_read_and_unframed_write_cycle_numerics_beyond_natural_range
|
697
|
+
# S handles an unsigned short
|
698
|
+
i = @cls.new tempfile, :format => 'S'
|
699
|
+
|
700
|
+
i.unframed_write([-USHRT_MAX], 0)
|
701
|
+
assert_equal [1], i.read(1,0)
|
702
|
+
i.unframed_write([USHRT_MIN-1], 0)
|
703
|
+
assert_equal [USHRT_MAX], i.read(1,0)
|
704
|
+
|
705
|
+
# s handles an signed short
|
706
|
+
i = @cls.new tempfile, :format => 's'
|
707
|
+
|
708
|
+
i.unframed_write([SHRT_MIN], 0)
|
709
|
+
assert_equal [SHRT_MIN], i.read(1,0)
|
710
|
+
i.unframed_write([SHRT_MIN-1], 0)
|
711
|
+
assert_equal [SHRT_MAX], i.read(1,0)
|
712
|
+
|
713
|
+
# I,L handle an unsigned long
|
714
|
+
['I', 'L'].each do |format|
|
715
|
+
i = @cls.new tempfile, :format => format
|
716
|
+
|
717
|
+
i.unframed_write([-ULONG_MAX], 0)
|
718
|
+
assert_equal [1], i.read(1,0)
|
719
|
+
i.unframed_write([ULONG_MIN-1], 0)
|
720
|
+
assert_equal [ULONG_MAX], i.read(1,0)
|
721
|
+
end
|
722
|
+
|
723
|
+
# i,l handle an signed long
|
724
|
+
['i', 'l'].each do |format|
|
725
|
+
i = @cls.new tempfile, :format => format
|
726
|
+
|
727
|
+
i.unframed_write([LONG_MIN], 0)
|
728
|
+
assert_equal [LONG_MIN], i.read(1,0)
|
729
|
+
i.unframed_write([LONG_MIN-1], 0)
|
730
|
+
assert_equal [LONG_MAX], i.read(1,0)
|
731
|
+
end
|
732
|
+
|
733
|
+
# Q handles an unsigned long long
|
734
|
+
i = @cls.new tempfile, :format => 'Q'
|
735
|
+
|
736
|
+
i.unframed_write([-ULLONG_MAX], 0)
|
737
|
+
assert_equal [1], i.read(1,0)
|
738
|
+
i.unframed_write([ULLONG_MIN-1], 0)
|
739
|
+
assert_equal [ULLONG_MAX], i.read(1,0)
|
740
|
+
|
741
|
+
# q handles an signed long long
|
742
|
+
i = @cls.new tempfile, :format => 'q'
|
743
|
+
|
744
|
+
i.unframed_write([LLONG_MIN], 0)
|
745
|
+
assert_equal [LLONG_MIN], i.read(1,0)
|
746
|
+
i.unframed_write([LLONG_MIN-1], 0)
|
747
|
+
assert_equal [LLONG_MAX], i.read(1,0)
|
748
|
+
end
|
749
|
+
|
750
|
+
def test_numerics_cycle_up_to_the_unsigned_max_in_either_sign
|
751
|
+
# S,s,I,i,L,l all can cycle up to the size of an ULONG
|
752
|
+
['S','s','I','i','L','l'].each do |format|
|
753
|
+
i = @cls.new tempfile, :format => format
|
754
|
+
|
755
|
+
assert_raise(RangeError) { i.unframed_write([-(ULONG_MAX+1)]) }
|
756
|
+
assert_raise(RangeError) { i.unframed_write([(ULONG_MAX+1)]) }
|
757
|
+
end
|
758
|
+
|
759
|
+
# Q,q can cycle up to the size of an ULLONG
|
760
|
+
['Q', 'q'].each do |format|
|
761
|
+
i = @cls.new tempfile, :format => format
|
762
|
+
|
763
|
+
assert_raise(RangeError) { i.unframed_write([-(ULLONG_MAX+1)]) }
|
764
|
+
assert_raise(RangeError) { i.unframed_write([(ULLONG_MAX+1)]) }
|
765
|
+
end
|
766
|
+
end
|
767
|
+
|
768
|
+
#############################
|
769
|
+
# Array method documentation
|
770
|
+
#############################
|
771
|
+
|
772
|
+
def test_AREF_doc
|
773
|
+
io = StringIO.new [1,2,3,4,5].pack("I*")
|
774
|
+
i = ExtInd.new(io, :format => 'I')
|
775
|
+
assert_equal [3], i[2]
|
776
|
+
assert_equal nil, i[6]
|
777
|
+
assert_equal [[2],[3]], i[1,2]
|
778
|
+
assert_equal [[2],[3],[4]], i[1..3]
|
779
|
+
assert_equal [[5]], i[4..7]
|
780
|
+
assert_equal nil, i[6..10]
|
781
|
+
assert_equal [[3],[4],[5]], i[-3,3]
|
782
|
+
assert_equal nil, i[5]
|
783
|
+
assert_equal [], i[5,1]
|
784
|
+
assert_equal [], i[5..10]
|
785
|
+
end
|
786
|
+
|
787
|
+
def test_ASET_doc
|
788
|
+
io = StringIO.new ""
|
789
|
+
i = ExtInd.new(io, :format => 'I')
|
790
|
+
assert_equal [0], i.nil_value
|
791
|
+
|
792
|
+
i[4] = [4]
|
793
|
+
assert_equal [[0], [0], [0], [0], [4]], i.to_a
|
794
|
+
|
795
|
+
i[0, 3] = [ [1], [2], [3] ]
|
796
|
+
assert_equal [[1], [2], [3], [0], [4]], i.to_a
|
797
|
+
|
798
|
+
i[1..2] = [ [5], [6] ]
|
799
|
+
assert_equal [[1], [5], [6], [0], [4]], i.to_a
|
800
|
+
|
801
|
+
i[0, 2] = [[7]]
|
802
|
+
assert_equal [[7], [6], [0], [4]], i.to_a
|
803
|
+
|
804
|
+
i[0..2] = [[8]]
|
805
|
+
assert_equal [[8], [4]], i.to_a
|
806
|
+
|
807
|
+
i[-1] = [9]
|
808
|
+
assert_equal [[8], [9]], i.to_a
|
809
|
+
|
810
|
+
i[1..-1] = nil
|
811
|
+
assert_equal [[8]], i.to_a
|
812
|
+
end
|
813
|
+
|
814
|
+
#############################
|
815
|
+
# Modified Array methods tests
|
816
|
+
#############################
|
817
|
+
|
818
|
+
def test_01_square_brackets
|
819
|
+
# Changes: results returned in frame
|
820
|
+
|
821
|
+
a = @cls[ 5, 4, 3, 2, 1 ]
|
822
|
+
assert_instance_of(@cls, a)
|
823
|
+
assert_equal(5, a.length)
|
824
|
+
#5.times { |i| assert_equal(5-i, a[i]) }
|
825
|
+
5.times { |i| assert_equal([5-i], a[i]) }
|
826
|
+
assert_nil(a[6])
|
827
|
+
end
|
828
|
+
|
829
|
+
def test_PLUS # '+'
|
830
|
+
# Changes: strings not allowed in ExtInd
|
831
|
+
# replace 'cat' with 4, 'dog' with 5
|
832
|
+
|
833
|
+
assert_equal(@cls[], @cls[] + @cls[])
|
834
|
+
assert_equal(@cls[1], @cls[1] + @cls[])
|
835
|
+
assert_equal(@cls[1], @cls[] + @cls[1])
|
836
|
+
assert_equal(@cls[1, 1], @cls[1] + @cls[1])
|
837
|
+
#assert_equal(@cls['cat', 'dog', 1, 2, 3], %w(cat dog) + (1..3).to_a)
|
838
|
+
assert_equal(@cls[4, 5, 1, 2, 3], @cls[4,5] + @cls[*(1..3).to_a])
|
839
|
+
|
840
|
+
# Additional:
|
841
|
+
# check addition of Array to ExtInd (can't add ExtInd to Array)
|
842
|
+
assert_equal(@cls[4, 5, 1, 2, 3], @cls[4,5] + [[1],[2],[3]])
|
843
|
+
assert_raise(TypeError) { [4,5] + @cls[*(1..3).to_a] }
|
844
|
+
|
845
|
+
# check result is distinct from factors
|
846
|
+
a = @cls[1]
|
847
|
+
b = @cls[2]
|
848
|
+
c = a + b
|
849
|
+
assert_equal [[1],[2]], c.to_a
|
850
|
+
|
851
|
+
a.concat [[1]]
|
852
|
+
b.concat [[2]]
|
853
|
+
c.concat [[3]]
|
854
|
+
assert_equal [[1],[1]], a.to_a
|
855
|
+
assert_equal [[2],[2]], b.to_a
|
856
|
+
assert_equal [[1],[2],[3]], c.to_a
|
857
|
+
end
|
858
|
+
|
859
|
+
def test_LSHIFT # '<<'
|
860
|
+
# Changes: inputs must be in frame and can't take
|
861
|
+
# strings. And ExtInd can't accept itself as an entry
|
862
|
+
|
863
|
+
a = @cls[]
|
864
|
+
#a << 1
|
865
|
+
a << [1]
|
866
|
+
assert_equal(@cls[1], a)
|
867
|
+
#a << 2 << 3
|
868
|
+
a << [2] << [3]
|
869
|
+
assert_equal(@cls[1, 2, 3], a)
|
870
|
+
#a << nil << 'cat'
|
871
|
+
#assert_equal(@cls[1, 2, 3, nil, 'cat'], a)
|
872
|
+
#a << a
|
873
|
+
#assert_equal(@cls[1, 2, 3, nil, 'cat', a], a)
|
874
|
+
end
|
875
|
+
|
876
|
+
def test_CMP # '<=>'
|
877
|
+
# Changes: strings not allowed in ExtInd
|
878
|
+
# replace 'cat' with 4, 'dog' with 5
|
879
|
+
assert_equal(-1, 4 <=> 5)
|
880
|
+
|
881
|
+
assert_equal(0, @cls[] <=> @cls[])
|
882
|
+
assert_equal(0, @cls[1] <=> @cls[1])
|
883
|
+
#assert_equal(0, @cls[1, 2, 3, 'cat'] <=> @cls[1, 2, 3, 'cat'])
|
884
|
+
assert_equal(0, @cls[1, 2, 3] <=> @cls[1, 2, 3])
|
885
|
+
assert_equal(-1, @cls[] <=> @cls[1])
|
886
|
+
assert_equal(1, @cls[1] <=> @cls[])
|
887
|
+
#assert_equal(-1, @cls[1, 2, 3] <=> @cls[1, 2, 3, 'cat'])
|
888
|
+
assert_equal(-1, @cls[1, 2, 3] <=> @cls[1, 2, 3, 4])
|
889
|
+
#assert_equal(1, @cls[1, 2, 3, 'cat'] <=> @cls[1, 2, 3])
|
890
|
+
assert_equal(1, @cls[1, 2, 3, 4] <=> @cls[1, 2, 3])
|
891
|
+
#assert_equal(-1, @cls[1, 2, 3, 'cat'] <=> @cls[1, 2, 3, 'dog'])
|
892
|
+
assert_equal(-1, @cls[1, 2, 3, 4] <=> @cls[1, 2, 3, 5])
|
893
|
+
#assert_equal(1, @cls[1, 2, 3, 'dog'] <=> @cls[1, 2, 3, 'cat'])
|
894
|
+
assert_equal(1, @cls[1, 2, 3, 5] <=> @cls[1, 2, 3, 4])
|
895
|
+
end
|
896
|
+
|
897
|
+
def test_AREF # '[]'
|
898
|
+
# Changes: results returned in frame
|
899
|
+
|
900
|
+
a = @cls[*(1..100).to_a]
|
901
|
+
|
902
|
+
#assert_equal(1, a[0])
|
903
|
+
assert_equal([1], a[0])
|
904
|
+
#assert_equal(100, a[99])
|
905
|
+
assert_equal([100], a[99])
|
906
|
+
assert_nil(a[100])
|
907
|
+
#assert_equal(100, a[-1])
|
908
|
+
assert_equal([100], a[-1])
|
909
|
+
#assert_equal(99, a[-2])
|
910
|
+
assert_equal([99], a[-2])
|
911
|
+
#assert_equal(1, a[-100])
|
912
|
+
assert_equal([1], a[-100])
|
913
|
+
assert_nil(a[-101])
|
914
|
+
assert_nil(a[-101,0])
|
915
|
+
assert_nil(a[-101,1])
|
916
|
+
assert_nil(a[-101,-1])
|
917
|
+
assert_nil(a[10,-1])
|
918
|
+
|
919
|
+
# assert_equal(@cls[1], a[0,1])
|
920
|
+
assert_equal([[1]], a[0,1])
|
921
|
+
#assert_equal(@cls[100], a[99,1])
|
922
|
+
assert_equal([[100]], a[99,1])
|
923
|
+
#assert_equal(@cls[], a[100,1])
|
924
|
+
assert_equal([], a[100,1])
|
925
|
+
#assert_equal(@cls[100], a[99,100])
|
926
|
+
assert_equal([[100]], a[99,100])
|
927
|
+
#assert_equal(@cls[100], a[-1,1])
|
928
|
+
assert_equal([[100]], a[-1,1])
|
929
|
+
#assert_equal(@cls[99], a[-2,1])
|
930
|
+
assert_equal([[99]], a[-2,1])
|
931
|
+
#assert_equal(@cls[], a[-100,0])
|
932
|
+
assert_equal([], a[-100,0])
|
933
|
+
#assert_equal(@cls[1], a[-100,1])
|
934
|
+
assert_equal([[1]], a[-100,1])
|
935
|
+
|
936
|
+
assert_equal(@cls[10, 11, 12], a[9, 3])
|
937
|
+
assert_equal(@cls[10, 11, 12], a[-91, 3])
|
938
|
+
|
939
|
+
# assert_equal(@cls[1], a[0..0])
|
940
|
+
assert_equal([[1]], a[0..0])
|
941
|
+
# assert_equal(@cls[100], a[99..99])
|
942
|
+
assert_equal([[100]], a[99..99])
|
943
|
+
# assert_equal(@cls[], a[100..100])
|
944
|
+
assert_equal([], a[100..100])
|
945
|
+
# assert_equal(@cls[100], a[99..200])
|
946
|
+
assert_equal([[100]], a[99..200])
|
947
|
+
# assert_equal(@cls[100], a[-1..-1])
|
948
|
+
assert_equal([[100]], a[-1..-1])
|
949
|
+
# assert_equal(@cls[99], a[-2..-2])
|
950
|
+
assert_equal([[99]], a[-2..-2])
|
951
|
+
|
952
|
+
assert_equal(@cls[10, 11, 12], a[9..11])
|
953
|
+
assert_equal(@cls[10, 11, 12], a[-91..-89])
|
954
|
+
|
955
|
+
assert_nil(a[10, -3])
|
956
|
+
# Ruby 1.8 feature change:
|
957
|
+
# Array#[size..x] returns [] instead of nil.
|
958
|
+
#assert_nil(a[10..7])
|
959
|
+
assert_equal [], a[10..7]
|
960
|
+
|
961
|
+
assert_raise(TypeError) {a['cat']}
|
962
|
+
end
|
963
|
+
|
964
|
+
def test_ASET # '[]='
|
965
|
+
# Changes: values and results specified in frame
|
966
|
+
# added mirror tests to ensure testing using array
|
967
|
+
# and index inputs
|
968
|
+
|
969
|
+
# -- pair --
|
970
|
+
a = @cls[*(0..99).to_a]
|
971
|
+
#assert_equal(0, a[0] = 0)
|
972
|
+
assert_equal([0], a[0] = [0])
|
973
|
+
assert_equal(@cls[0] + @cls[*(1..99).to_a], a)
|
974
|
+
|
975
|
+
a = @cls[*(0..99).to_a]
|
976
|
+
b = @cls[0]
|
977
|
+
assert_equal(b, a[0] = b)
|
978
|
+
assert_equal(@cls[0] + @cls[*(1..99).to_a], a)
|
979
|
+
|
980
|
+
# -- pair --
|
981
|
+
a = @cls[*(0..99).to_a]
|
982
|
+
#assert_equal(0, a[10,10] = 0)
|
983
|
+
assert_equal([[0]], a[10,10] = [[0]])
|
984
|
+
assert_equal(@cls[*(0..9).to_a] + @cls[0] + @cls[*(20..99).to_a], a)
|
985
|
+
|
986
|
+
a = @cls[*(0..99).to_a]
|
987
|
+
b = @cls[0]
|
988
|
+
assert_equal(b, a[10,10] = b)
|
989
|
+
assert_equal(@cls[*(0..9).to_a] + @cls[0] + @cls[*(20..99).to_a], a)
|
990
|
+
|
991
|
+
# -- pair --
|
992
|
+
a = @cls[*(0..99).to_a]
|
993
|
+
#assert_equal(0, a[-1] = 0)
|
994
|
+
assert_equal([0], a[-1] = [0])
|
995
|
+
assert_equal(@cls[*(0..98).to_a] + @cls[0], a)
|
996
|
+
|
997
|
+
a = @cls[*(0..99).to_a]
|
998
|
+
b = @cls[0]
|
999
|
+
assert_equal(b, a[-1] = b)
|
1000
|
+
assert_equal(@cls[*(0..98).to_a] + @cls[0], a)
|
1001
|
+
|
1002
|
+
# -- pair --
|
1003
|
+
a = @cls[*(0..99).to_a]
|
1004
|
+
#assert_equal(0, a[-10, 10] = 0)
|
1005
|
+
assert_equal([[0]], a[-10, 10] = [[0]])
|
1006
|
+
assert_equal(@cls[*(0..89).to_a] + @cls[0], a)
|
1007
|
+
|
1008
|
+
a = @cls[*(0..99).to_a]
|
1009
|
+
b = @cls[0]
|
1010
|
+
assert_equal(b, a[-10, 10] = b)
|
1011
|
+
assert_equal(@cls[*(0..89).to_a] + @cls[0], a)
|
1012
|
+
|
1013
|
+
# -- pair --
|
1014
|
+
a = @cls[*(0..99).to_a]
|
1015
|
+
#assert_equal(0, a[0,1000] = 0)
|
1016
|
+
assert_equal([[0]], a[0,1000] = [[0]])
|
1017
|
+
assert_equal(@cls[0] , a)
|
1018
|
+
|
1019
|
+
a = @cls[*(0..99).to_a]
|
1020
|
+
b = @cls[0]
|
1021
|
+
assert_equal(b, a[0,1000] = b)
|
1022
|
+
assert_equal(@cls[0] , a)
|
1023
|
+
|
1024
|
+
# -- pair --
|
1025
|
+
a = @cls[*(0..99).to_a]
|
1026
|
+
#assert_equal(0, a[10..19] = 0)
|
1027
|
+
assert_equal([[0]], a[10..19] = [[0]])
|
1028
|
+
assert_equal(@cls[*(0..9).to_a] + @cls[0] + @cls[*(20..99).to_a], a)
|
1029
|
+
|
1030
|
+
a = @cls[*(0..99).to_a]
|
1031
|
+
b = @cls[0]
|
1032
|
+
assert_equal(b, a[10..19] = b)
|
1033
|
+
assert_equal(@cls[*(0..9).to_a] + @cls[0] + @cls[*(20..99).to_a], a)
|
1034
|
+
|
1035
|
+
# -- pair --
|
1036
|
+
# Changes: cannot take strings,
|
1037
|
+
# replace a,b,c with 1001, 1002, 10003
|
1038
|
+
#b = @cls[*%w( a b c )]
|
1039
|
+
b = @cls[1001, 1002, 10003]
|
1040
|
+
c = [[1001],[1002],[10003]]
|
1041
|
+
a = @cls[*(0..99).to_a]
|
1042
|
+
assert_equal(b, a[0,1] = b)
|
1043
|
+
assert_equal(b + @cls[*(1..99).to_a], a)
|
1044
|
+
|
1045
|
+
a = @cls[*(0..99).to_a]
|
1046
|
+
assert_equal(c, a[0,1] = c)
|
1047
|
+
assert_equal(b + @cls[*(1..99).to_a], a)
|
1048
|
+
|
1049
|
+
# -- pair --
|
1050
|
+
a = @cls[*(0..99).to_a]
|
1051
|
+
assert_equal(b, a[10,10] = b)
|
1052
|
+
assert_equal(@cls[*(0..9).to_a] + b + @cls[*(20..99).to_a], a)
|
1053
|
+
|
1054
|
+
a = @cls[*(0..99).to_a]
|
1055
|
+
assert_equal(c, a[10,10] = c)
|
1056
|
+
assert_equal(@cls[*(0..9).to_a] + c + @cls[*(20..99).to_a], a)
|
1057
|
+
|
1058
|
+
# -- pair --
|
1059
|
+
a = @cls[*(0..99).to_a]
|
1060
|
+
assert_equal(b, a[-1, 1] = b)
|
1061
|
+
assert_equal(@cls[*(0..98).to_a] + b, a)
|
1062
|
+
|
1063
|
+
a = @cls[*(0..99).to_a]
|
1064
|
+
assert_equal(c, a[-1, 1] = c)
|
1065
|
+
assert_equal(@cls[*(0..98).to_a] + c, a)
|
1066
|
+
|
1067
|
+
# -- pair --
|
1068
|
+
a = @cls[*(0..99).to_a]
|
1069
|
+
assert_equal(b, a[-10, 10] = b)
|
1070
|
+
assert_equal(@cls[*(0..89).to_a] + b, a)
|
1071
|
+
|
1072
|
+
a = @cls[*(0..99).to_a]
|
1073
|
+
assert_equal(c, a[-10, 10] = c)
|
1074
|
+
assert_equal(@cls[*(0..89).to_a] + c, a)
|
1075
|
+
|
1076
|
+
# -- pair --
|
1077
|
+
a = @cls[*(0..99).to_a]
|
1078
|
+
assert_equal(b, a[0,1000] = b)
|
1079
|
+
assert_equal(b , a)
|
1080
|
+
|
1081
|
+
a = @cls[*(0..99).to_a]
|
1082
|
+
assert_equal(c, a[0,1000] = c)
|
1083
|
+
assert_equal(c , a.to_a)
|
1084
|
+
|
1085
|
+
# -- pair --
|
1086
|
+
a = @cls[*(0..99).to_a]
|
1087
|
+
assert_equal(b, a[10..19] = b)
|
1088
|
+
assert_equal(@cls[*(0..9).to_a] + b + @cls[*(20..99).to_a], a)
|
1089
|
+
|
1090
|
+
a = @cls[*(0..99).to_a]
|
1091
|
+
assert_equal(c, a[10..19] = c)
|
1092
|
+
assert_equal(@cls[*(0..9).to_a] + c + @cls[*(20..99).to_a], a)
|
1093
|
+
|
1094
|
+
# Ruby 1.8 feature change:
|
1095
|
+
# assigning nil does not remove elements.
|
1096
|
+
=begin
|
1097
|
+
a = @cls[*(0..99).to_a]
|
1098
|
+
assert_equal(nil, a[0,1] = nil)
|
1099
|
+
assert_equal(@cls[*(1..99).to_a], a)
|
1100
|
+
|
1101
|
+
a = @cls[*(0..99).to_a]
|
1102
|
+
assert_equal(nil, a[10,10] = nil)
|
1103
|
+
assert_equal(@cls[*(0..9).to_a] + @cls[*(20..99).to_a], a)
|
1104
|
+
|
1105
|
+
a = @cls[*(0..99).to_a]
|
1106
|
+
assert_equal(nil, a[-1, 1] = nil)
|
1107
|
+
assert_equal(@cls[*(0..98).to_a], a)
|
1108
|
+
|
1109
|
+
a = @cls[*(0..99).to_a]
|
1110
|
+
assert_equal(nil, a[-10, 10] = nil)
|
1111
|
+
assert_equal(@cls[*(0..89).to_a], a)
|
1112
|
+
|
1113
|
+
a = @cls[*(0..99).to_a]
|
1114
|
+
assert_equal(nil, a[0,1000] = nil)
|
1115
|
+
assert_equal(@cls[] , a)
|
1116
|
+
|
1117
|
+
a = @cls[*(0..99).to_a]
|
1118
|
+
assert_equal(nil, a[10..19] = nil)
|
1119
|
+
assert_equal(@cls[*(0..9).to_a] + @cls[*(20..99).to_a], a)
|
1120
|
+
=end
|
1121
|
+
|
1122
|
+
# Changes: should have @cls in definition
|
1123
|
+
|
1124
|
+
a = @cls[1, 2, 3]
|
1125
|
+
a[1, 0] = a
|
1126
|
+
#assert_equal([1, 1, 2, 3, 2, 3], a)
|
1127
|
+
assert_equal(@cls[1, 1, 2, 3, 2, 3], a)
|
1128
|
+
|
1129
|
+
a = @cls[1, 2, 3]
|
1130
|
+
a[-1, 0] = a
|
1131
|
+
#assert_equal([1, 2, 1, 2, 3, 3], a)
|
1132
|
+
assert_equal(@cls[1, 2, 1, 2, 3, 3], a)
|
1133
|
+
|
1134
|
+
# Additional:
|
1135
|
+
|
1136
|
+
# -- test self insertions --
|
1137
|
+
a = @cls[1, 2, 3]
|
1138
|
+
a[1, 3] = a
|
1139
|
+
assert_equal(@cls[1,1,2,3], a)
|
1140
|
+
|
1141
|
+
a = @cls[1, 2, 3]
|
1142
|
+
a[3, 3] = a
|
1143
|
+
assert_equal(@cls[1,2,3,1,2,3], a)
|
1144
|
+
|
1145
|
+
a = @cls[1, 2, 3]
|
1146
|
+
a[4, 3] = a
|
1147
|
+
assert_equal(@cls[1,2,3,0,1,2,3], a)
|
1148
|
+
|
1149
|
+
# -- test insertions where padding is necessary --
|
1150
|
+
# -- pair --
|
1151
|
+
a = @cls[1,2,3, {:nil_value => [8]}]
|
1152
|
+
b = @cls[1001, 1002, 10003, {:nil_value => [8]}]
|
1153
|
+
assert_equal(b, a[4, 3] = b)
|
1154
|
+
assert_equal(@cls[1,2,3,8,1001,1002,10003, {:nil_value => [8]}], a.to_a)
|
1155
|
+
|
1156
|
+
a = @cls[1,2,3, {:nil_value => [8]}]
|
1157
|
+
c = [[1001], [1002], [10003]]
|
1158
|
+
assert_equal(c, a[4, 3] = c)
|
1159
|
+
assert_equal(@cls[1,2,3,8,1001,1002,10003, {:nil_value => [8]}], a)
|
1160
|
+
|
1161
|
+
# -- pair --
|
1162
|
+
a = @cls[1,2,3, {:nil_value => [8]}]
|
1163
|
+
b = @cls[1001, 1002, 10003, {:nil_value => [8]}]
|
1164
|
+
assert_equal(b, a[4, 1] = b)
|
1165
|
+
assert_equal(@cls[1,2,3,8,1001,1002,10003, {:nil_value => [8]}], a)
|
1166
|
+
|
1167
|
+
a = @cls[1,2,3, {:nil_value => [8]}]
|
1168
|
+
c = [[1001], [1002], [10003]]
|
1169
|
+
assert_equal(c, a[4, 1] = c)
|
1170
|
+
assert_equal(@cls[1,2,3,8,1001,1002,10003, {:nil_value => [8]}], a)
|
1171
|
+
|
1172
|
+
# -- test insertions with nils --
|
1173
|
+
# -- pair --
|
1174
|
+
a = @cls[1,2,3]
|
1175
|
+
b = @cls[1001, nil, nil, 10003]
|
1176
|
+
assert_equal(b, a[1, 3] = b)
|
1177
|
+
assert_equal(@cls[1,1001,0,0,10003], a)
|
1178
|
+
|
1179
|
+
a = @cls[1,2,3]
|
1180
|
+
c = [[1001], nil, nil, [10003]]
|
1181
|
+
assert_equal(c, a[1, 3] = c)
|
1182
|
+
assert_equal(@cls[1,1001,0,0,10003], a)
|
1183
|
+
|
1184
|
+
# -- insert beyond end of index, with inconsistent range --
|
1185
|
+
# first check the array behavior, then assert the same with ExtInd
|
1186
|
+
a = (0..5).to_a
|
1187
|
+
assert_equal([11,12,13], a[11..12] = [11,12,13])
|
1188
|
+
assert_equal((0..5).to_a + [nil,nil,nil,nil,nil] + (11..13).to_a, a)
|
1189
|
+
|
1190
|
+
# -- pair --
|
1191
|
+
a = @cls[*(0..5).to_a]
|
1192
|
+
b = @cls[11,12,13]
|
1193
|
+
assert_equal(b, a[11..12] = b)
|
1194
|
+
assert_equal(@cls[*(0..5).to_a] + @cls[0,0,0,0,0] + b, a)
|
1195
|
+
|
1196
|
+
a = @cls[*(0..5).to_a]
|
1197
|
+
c = [[11],[12],[13]]
|
1198
|
+
assert_equal(c, a[11..12] = c)
|
1199
|
+
assert_equal(@cls[*(0..5).to_a] + @cls[0,0,0,0,0] + c, a)
|
1200
|
+
end
|
1201
|
+
|
1202
|
+
def test_at
|
1203
|
+
# Chagnes: values must be in frame
|
1204
|
+
|
1205
|
+
a = @cls[*(0..99).to_a]
|
1206
|
+
# assert_equal(0, a.at(0))
|
1207
|
+
assert_equal([0], a.at(0))
|
1208
|
+
# assert_equal(10, a.at(10))
|
1209
|
+
assert_equal([10], a.at(10))
|
1210
|
+
# assert_equal(99, a.at(99))
|
1211
|
+
assert_equal([99], a.at(99))
|
1212
|
+
assert_equal(nil, a.at(100))
|
1213
|
+
# assert_equal(99, a.at(-1))
|
1214
|
+
assert_equal([99], a.at(-1))
|
1215
|
+
# assert_equal(0, a.at(-100))
|
1216
|
+
assert_equal([0], a.at(-100))
|
1217
|
+
assert_equal(nil, a.at(-101))
|
1218
|
+
|
1219
|
+
assert_raise(TypeError) { a.at('cat') }
|
1220
|
+
end
|
1221
|
+
|
1222
|
+
def test_concat
|
1223
|
+
# Changes: ExtInd does not support Array/ExtInd nesting
|
1224
|
+
|
1225
|
+
assert_equal(@cls[1, 2, 3, 4], @cls[1, 2].concat(@cls[3, 4]))
|
1226
|
+
assert_equal(@cls[1, 2, 3, 4], @cls[].concat(@cls[1, 2, 3, 4]))
|
1227
|
+
assert_equal(@cls[1, 2, 3, 4], @cls[1, 2, 3, 4].concat(@cls[]))
|
1228
|
+
assert_equal(@cls[], @cls[].concat(@cls[]))
|
1229
|
+
#assert_equal(@cls[@cls[1, 2], @cls[3, 4]], @cls[@cls[1, 2]].concat(@cls[@cls[3, 4]]))
|
1230
|
+
|
1231
|
+
# Changes: should have @cls in definition
|
1232
|
+
|
1233
|
+
a = @cls[1, 2, 3]
|
1234
|
+
a.concat(a)
|
1235
|
+
#assert_equal([1, 2, 3, 1, 2, 3], a)
|
1236
|
+
assert_equal(@cls[1, 2, 3, 1, 2, 3], a)
|
1237
|
+
end
|
1238
|
+
|
1239
|
+
def test_each
|
1240
|
+
# Changes: cannot take strings,
|
1241
|
+
# replace (ant bat cat dog) with [1,2,3,4]
|
1242
|
+
|
1243
|
+
#a = @cls[*%w( ant bat cat dog )]
|
1244
|
+
a = @cls[*(1..4).to_a]
|
1245
|
+
i = 0
|
1246
|
+
a.each { |e|
|
1247
|
+
assert_equal(a[i], e)
|
1248
|
+
i += 1
|
1249
|
+
}
|
1250
|
+
assert_equal(4, i)
|
1251
|
+
|
1252
|
+
a = @cls[]
|
1253
|
+
i = 0
|
1254
|
+
a.each { |e|
|
1255
|
+
assert_equal(a[i], e)
|
1256
|
+
i += 1
|
1257
|
+
}
|
1258
|
+
assert_equal(0, i)
|
1259
|
+
|
1260
|
+
assert_equal(a, a.each {})
|
1261
|
+
end
|
1262
|
+
|
1263
|
+
def test_each_index
|
1264
|
+
# Changes: cannot take strings,
|
1265
|
+
# replace (ant bat cat dog) with [1,2,3,4]
|
1266
|
+
|
1267
|
+
#a = @cls[*%w( ant bat cat dog )]
|
1268
|
+
a = @cls[*(1..4).to_a]
|
1269
|
+
i = 0
|
1270
|
+
a.each_index { |ind|
|
1271
|
+
assert_equal(i, ind)
|
1272
|
+
i += 1
|
1273
|
+
}
|
1274
|
+
assert_equal(4, i)
|
1275
|
+
|
1276
|
+
a = @cls[]
|
1277
|
+
i = 0
|
1278
|
+
a.each_index { |ind|
|
1279
|
+
assert_equal(i, ind)
|
1280
|
+
i += 1
|
1281
|
+
}
|
1282
|
+
assert_equal(0, i)
|
1283
|
+
|
1284
|
+
assert_equal(a, a.each_index {})
|
1285
|
+
end
|
1286
|
+
|
1287
|
+
def test_eql?
|
1288
|
+
assert(@cls[].eql?(@cls[]))
|
1289
|
+
assert(@cls[1].eql?(@cls[1]))
|
1290
|
+
assert(@cls[1, 1, 2, 2].eql?(@cls[1, 1, 2, 2]))
|
1291
|
+
|
1292
|
+
# Changes: all values are treated according to the format
|
1293
|
+
# so these floats are converted to ints and the ExtInds
|
1294
|
+
# are equal
|
1295
|
+
#assert(!@cls[1.0, 1.0, 2.0, 2.0].eql?(@cls[1, 1, 2, 2]))
|
1296
|
+
assert(@cls[1.0, 1.0, 2.0, 2.0].eql?(@cls[1, 1, 2, 2]))
|
1297
|
+
end
|
1298
|
+
|
1299
|
+
def test_first
|
1300
|
+
# Changes: must be in frame
|
1301
|
+
#assert_equal(3, @cls[3, 4, 5].first)
|
1302
|
+
assert_equal([3], @cls[3, 4, 5].first)
|
1303
|
+
assert_equal(nil, @cls[].first)
|
1304
|
+
end
|
1305
|
+
|
1306
|
+
def test_last
|
1307
|
+
# Changes: must be in frame
|
1308
|
+
|
1309
|
+
assert_equal(nil, @cls[].last)
|
1310
|
+
# assert_equal(1, @cls[1].last)
|
1311
|
+
assert_equal([1], @cls[1].last)
|
1312
|
+
# assert_equal(99, @cls[*(3..99).to_a].last)
|
1313
|
+
assert_equal([99], @cls[*(3..99).to_a].last)
|
1314
|
+
end
|
1315
|
+
|
1316
|
+
def test_to_a
|
1317
|
+
a = @cls[ 1, 2, 3 ]
|
1318
|
+
# Changes: can't do this comparison by object id
|
1319
|
+
#a_id = a.__id__
|
1320
|
+
#assert_equal(a, a.to_a)
|
1321
|
+
assert_equal [[1],[2],[3]], a.to_a
|
1322
|
+
#assert_equal(a_id, a.to_a.__id__)
|
1323
|
+
end
|
1324
|
+
|
1325
|
+
#############################
|
1326
|
+
# Additional Array methods tests
|
1327
|
+
#############################
|
1328
|
+
|
1329
|
+
#
|
1330
|
+
# ASET tests
|
1331
|
+
#
|
1332
|
+
|
1333
|
+
def test_ASET_raises_error_if_input_is_not_in_frame
|
1334
|
+
a = @cls.new
|
1335
|
+
assert_raise(ArgumentError) { a[0] = 1 }
|
1336
|
+
assert_raise(ArgumentError) { a[0,1] = [1] }
|
1337
|
+
assert_raise(ArgumentError) { a[0,1] = [[1,2]] }
|
1338
|
+
end
|
1339
|
+
|
1340
|
+
def test_ASET_raises_error_if_input_is_index_with_different_attributes
|
1341
|
+
a = @cls.new(nil, :format => "I")
|
1342
|
+
b = @cls.new(nil, :format => "II")
|
1343
|
+
assert_raise(ArgumentError) { a[0,1] = b }
|
1344
|
+
end
|
1345
|
+
|
1346
|
+
#######################
|
1347
|
+
# Benchmark tests
|
1348
|
+
#######################
|
1349
|
+
|
1350
|
+
#
|
1351
|
+
# benchmarks
|
1352
|
+
#
|
1353
|
+
|
1354
|
+
def index_bm_test(mode, length=20, array=nil, &block)
|
1355
|
+
benchmark_test(length) do |x|
|
1356
|
+
['I', 'IIIIIIIIII'].each do |format|
|
1357
|
+
unless array
|
1358
|
+
array = []
|
1359
|
+
1.upto(10000) {|i| array << i }
|
1360
|
+
end
|
1361
|
+
|
1362
|
+
Tempfile.open('benchmark') do |file|
|
1363
|
+
file << array.pack('I*')
|
1364
|
+
|
1365
|
+
begin
|
1366
|
+
index = @cls.new(file, :format => format)
|
1367
|
+
yield(x, format, index)
|
1368
|
+
ensure
|
1369
|
+
index.close if index
|
1370
|
+
end
|
1371
|
+
end
|
1372
|
+
end
|
1373
|
+
|
1374
|
+
yield(x, "array reference", array)
|
1375
|
+
end
|
1376
|
+
|
1377
|
+
array
|
1378
|
+
end
|
1379
|
+
|
1380
|
+
def test_element_reference_speed_for_index
|
1381
|
+
n = 100
|
1382
|
+
index_bm_test('r') do |x, type, index|
|
1383
|
+
puts type
|
1384
|
+
|
1385
|
+
x.report("#{n}kx [index]") { (n*1000).times { index[1000] } }
|
1386
|
+
x.report("#{n}kx [range]") { (n*1000).times { index[1000..1000] } }
|
1387
|
+
x.report("#{n}kx [s,1]") { (n*1000).times { index[1000, 1] } }
|
1388
|
+
x.report("#{n}kx [s,10]") { (n*1000).times { index[1000, 10] } }
|
1389
|
+
x.report("#{n}kx [s,100]") { (n*1000).times { index[1000, 100] } }
|
1390
|
+
|
1391
|
+
puts
|
1392
|
+
end
|
1393
|
+
end
|
1394
|
+
|
1395
|
+
def test_element_assignment_speed_for_index
|
1396
|
+
index_bm_test('r+') do |x, type, index|
|
1397
|
+
puts type
|
1398
|
+
|
1399
|
+
n = 10
|
1400
|
+
obj = Array.new(index.respond_to?(:frame) ? index.frame : 1, 0)
|
1401
|
+
|
1402
|
+
x.report("#{n}kx [index]=") do
|
1403
|
+
(n*1000).times { index[1000] = obj}
|
1404
|
+
end
|
1405
|
+
x.report("#{n}kx [range]=") do
|
1406
|
+
(n*1000).times { index[1000..1000] = [obj] }
|
1407
|
+
end
|
1408
|
+
x.report("#{n}kx [s,1]=") do
|
1409
|
+
(n*1000).times { index[1000,1] = [obj] }
|
1410
|
+
end
|
1411
|
+
|
1412
|
+
puts
|
1413
|
+
end
|
1414
|
+
end
|
1415
|
+
end
|
1416
|
+
|
1417
|
+
|
1418
|
+
|
1419
|
+
class Hold
|
1420
|
+
def btest_each_speed
|
1421
|
+
indexbm_test('r') do |x, type, index|
|
1422
|
+
x.report("10x #{type} - cs100k") { 10.times { index.each {|e|} } }
|
1423
|
+
#x.report("10x #{type} - cs100") { 10.times { index.each(0,index.length, 100) {|e|} } }
|
1424
|
+
end
|
1425
|
+
end
|
1426
|
+
|
1427
|
+
|
1428
|
+
def btest_push_speed
|
1429
|
+
indexbm_test('r+') do |x, type, index|
|
1430
|
+
obj = Array.new(index.frame, 0)
|
1431
|
+
x.report("10kx #{type} index=") do
|
1432
|
+
10000.times { index << obj}
|
1433
|
+
end
|
1434
|
+
end
|
1435
|
+
end
|
1436
|
+
|
1437
|
+
def btest_sort_speed
|
1438
|
+
benchmark_test(20) do |x|
|
1439
|
+
n = 1
|
1440
|
+
unsorted, sorted = sort_arrays(n*10**6)
|
1441
|
+
|
1442
|
+
x.report("#{n}M array sort") do
|
1443
|
+
unsorted.sort
|
1444
|
+
end
|
1445
|
+
|
1446
|
+
index = setup_index({:default_blksize => 100000}, unsorted)
|
1447
|
+
x.report("#{n}M index sort") do
|
1448
|
+
index.sort.close
|
1449
|
+
end
|
1450
|
+
index.close
|
1451
|
+
|
1452
|
+
index = setup_index({:frame => 2, :default_blksize => 100000}, unsorted)
|
1453
|
+
x.report("#{n}M frame with block") do
|
1454
|
+
index.sort {|a, b| b <=> a }.close
|
1455
|
+
end
|
1456
|
+
index.close
|
1457
|
+
|
1458
|
+
sindex = setup_sindex({:default_blksize => 100000}, unsorted)
|
1459
|
+
x.report("#{n}M sindex sort") do
|
1460
|
+
sindex.sort.close
|
1461
|
+
end
|
1462
|
+
sindex.close
|
1463
|
+
|
1464
|
+
# cannot finish... not sure why
|
1465
|
+
# sindex = setup_sindex({:frame => 2, :default_blksize => 100000}, unsorted)
|
1466
|
+
# x.report("#{n}M frame with block") do
|
1467
|
+
# sindex.sort {|a, b| b <=> a }.close
|
1468
|
+
# end
|
1469
|
+
# sindex.close
|
1470
|
+
end
|
1471
|
+
end
|
1472
|
+
end
|