external 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/History +7 -0
  2. data/MIT-LICENSE +1 -3
  3. data/README +162 -127
  4. data/lib/external.rb +2 -3
  5. data/lib/external/base.rb +174 -47
  6. data/lib/external/chunkable.rb +131 -105
  7. data/lib/external/enumerable.rb +78 -33
  8. data/lib/external/io.rb +163 -398
  9. data/lib/external/patches/ruby_1_8_io.rb +31 -0
  10. data/lib/external/patches/windows_io.rb +53 -0
  11. data/lib/external/patches/windows_utils.rb +27 -0
  12. data/lib/external/utils.rb +148 -0
  13. data/lib/external_archive.rb +840 -0
  14. data/lib/external_array.rb +57 -0
  15. data/lib/external_index.rb +1053 -0
  16. metadata +42 -58
  17. data/lib/ext_arc.rb +0 -108
  18. data/lib/ext_arr.rb +0 -727
  19. data/lib/ext_ind.rb +0 -1120
  20. data/test/benchmarks/benchmarks_20070918.txt +0 -45
  21. data/test/benchmarks/benchmarks_20070921.txt +0 -91
  22. data/test/benchmarks/benchmarks_20071006.txt +0 -147
  23. data/test/benchmarks/test_copy_file.rb +0 -80
  24. data/test/benchmarks/test_pos_speed.rb +0 -47
  25. data/test/benchmarks/test_read_time.rb +0 -55
  26. data/test/cached_ext_ind_test.rb +0 -219
  27. data/test/check/benchmark_check.rb +0 -441
  28. data/test/check/namespace_conflicts_check.rb +0 -23
  29. data/test/check/pack_check.rb +0 -90
  30. data/test/ext_arc_test.rb +0 -286
  31. data/test/ext_arr/alt_sep.txt +0 -3
  32. data/test/ext_arr/cr_lf_input.txt +0 -3
  33. data/test/ext_arr/input.index +0 -0
  34. data/test/ext_arr/input.txt +0 -1
  35. data/test/ext_arr/inputb.index +0 -0
  36. data/test/ext_arr/inputb.txt +0 -1
  37. data/test/ext_arr/lf_input.txt +0 -3
  38. data/test/ext_arr/lines.txt +0 -19
  39. data/test/ext_arr/without_index.txt +0 -1
  40. data/test/ext_arr_test.rb +0 -534
  41. data/test/ext_ind_test.rb +0 -1472
  42. data/test/external/base_test.rb +0 -74
  43. data/test/external/chunkable_test.rb +0 -182
  44. data/test/external/index/input.index +0 -0
  45. data/test/external/index/inputb.index +0 -0
  46. data/test/external/io_test.rb +0 -414
  47. data/test/external_test_helper.rb +0 -31
  48. data/test/external_test_suite.rb +0 -4
  49. data/test/test_array.rb +0 -1192
data/test/ext_ind_test.rb DELETED
@@ -1,1472 +0,0 @@
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