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,80 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../external_test_helper.rb')
|
2
|
+
require 'tempfile'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
ENV['ALL'] = 'true'
|
6
|
+
|
7
|
+
class TestCopyFile < Test::Unit::TestCase
|
8
|
+
include Benchmark
|
9
|
+
include Tap::Test::SubsetMethods
|
10
|
+
|
11
|
+
|
12
|
+
# The lesson from this test is that chunky copy can be
|
13
|
+
# faster than FileUtils.cp It's interesting to note
|
14
|
+
# that if you look up the code, you can see that a
|
15
|
+
# chunky copy is exactly what cp is... with chunks of
|
16
|
+
# 1024 bytes.
|
17
|
+
def test_copy_vs_chunky_rewrite
|
18
|
+
t = Tempfile.new "large_file"
|
19
|
+
t.close
|
20
|
+
puts t.path
|
21
|
+
|
22
|
+
prompt_test(:path_to_large_file) do |config|
|
23
|
+
path = config[:path_to_large_file]
|
24
|
+
|
25
|
+
benchmark_test do |x|
|
26
|
+
x.report("copy") { FileUtils.cp(path, t.path) }
|
27
|
+
assert FileUtils.cmp(path, t.path)
|
28
|
+
|
29
|
+
# tenmb = 1 * 2097152
|
30
|
+
# x.report("chunk 2MB") do
|
31
|
+
# File.open(path, "r") do |src|
|
32
|
+
# File.open(t.path, "w") do |target|
|
33
|
+
# str = ""
|
34
|
+
# while src.read(tenmb, str)
|
35
|
+
# target << str
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
|
41
|
+
tenmb = 4 * 2097152
|
42
|
+
x.report("chunk 8MB") do
|
43
|
+
File.open(path, "r") do |src|
|
44
|
+
File.open(t.path, "w") do |target|
|
45
|
+
str = ""
|
46
|
+
while src.read(tenmb, str)
|
47
|
+
target << str
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
assert FileUtils.cmp(path, t.path)
|
53
|
+
|
54
|
+
# tenmb = 4 * 2097152
|
55
|
+
# x.report("chunk 8MB - no buf") do
|
56
|
+
# File.open(path, "r") do |src|
|
57
|
+
# File.open(t.path, "w") do |target|
|
58
|
+
# while str = src.read(tenmb)
|
59
|
+
# target << str
|
60
|
+
# end
|
61
|
+
# end
|
62
|
+
# end
|
63
|
+
# end
|
64
|
+
|
65
|
+
# tenmb = 10 * 2097152
|
66
|
+
# x.report("chunk 20MB") do
|
67
|
+
# File.open(path, "r") do |src|
|
68
|
+
# File.open(t.path, "w") do |target|
|
69
|
+
# str = ""
|
70
|
+
# while src.read(tenmb, str)
|
71
|
+
# target << str
|
72
|
+
# end
|
73
|
+
# end
|
74
|
+
# end
|
75
|
+
# end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../external_test_helper.rb')
|
2
|
+
require 'tempfile'
|
3
|
+
require 'enumerator'
|
4
|
+
require 'scanf'
|
5
|
+
|
6
|
+
class TestPosSpeed < Test::Unit::TestCase
|
7
|
+
include Benchmark
|
8
|
+
|
9
|
+
attr_reader :path
|
10
|
+
|
11
|
+
def setup
|
12
|
+
t = Tempfile.new('integers')
|
13
|
+
ints = [*(1..100000).to_a]
|
14
|
+
t << ints.pack("I*")
|
15
|
+
t.close
|
16
|
+
@path = t.path
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_pos_speed
|
20
|
+
file = File.open(path, "r")
|
21
|
+
length = file.stat.size
|
22
|
+
positions = Array.new(1000) do
|
23
|
+
p = rand(length)
|
24
|
+
end
|
25
|
+
|
26
|
+
benchmark_test(20) do |x|
|
27
|
+
x.report("100kx pos=") do
|
28
|
+
(1000).times do
|
29
|
+
positions.each do |p|
|
30
|
+
file.pos = p
|
31
|
+
file.pos = p
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
x.report("100kx pos= with check") do
|
37
|
+
(1000).times do
|
38
|
+
positions.each do |p|
|
39
|
+
file.pos = p
|
40
|
+
file.pos = p unless file.pos = p
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '../external_test_helper.rb')
|
2
|
+
require 'tempfile'
|
3
|
+
require 'enumerator'
|
4
|
+
require 'scanf'
|
5
|
+
|
6
|
+
class TestReadTime < Test::Unit::TestCase
|
7
|
+
include Benchmark
|
8
|
+
|
9
|
+
attr_reader :path, :ints
|
10
|
+
|
11
|
+
def setup
|
12
|
+
t = Tempfile.new('integers')
|
13
|
+
ints = [*(1..100000).to_a]
|
14
|
+
t << ints.pack("I*")
|
15
|
+
t.close
|
16
|
+
@path = t.path
|
17
|
+
|
18
|
+
@ints = []
|
19
|
+
ints.each_slice(1) do |s|
|
20
|
+
@ints << s
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_read_time
|
25
|
+
file = File.open(path, "r")
|
26
|
+
results = nil
|
27
|
+
|
28
|
+
benchmark_test(20) do |x|
|
29
|
+
x.report("10x full (1)") do
|
30
|
+
(10).times do
|
31
|
+
file.pos = 0
|
32
|
+
str = file.read
|
33
|
+
results = []
|
34
|
+
str.unpack("I*").each_slice(1) do |s|
|
35
|
+
results << s
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
assert_equal ints, results
|
40
|
+
|
41
|
+
x.report("10x singles (1)") do
|
42
|
+
(10).times do
|
43
|
+
file.pos = 0
|
44
|
+
|
45
|
+
results = []
|
46
|
+
ints.length.times do
|
47
|
+
results << file.read(4).unpack("I")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
assert_equal ints, results
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,219 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'ext_ind_test.rb')
|
2
|
+
|
3
|
+
class CachedExtIndTest < ExtIndTest
|
4
|
+
class CachedExtInd < ExtInd
|
5
|
+
def initialize(io=nil, options={})
|
6
|
+
options = {
|
7
|
+
:cached => true
|
8
|
+
}.merge(options)
|
9
|
+
|
10
|
+
super(io, options)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def setup
|
15
|
+
# cls represents an array
|
16
|
+
@cls = CachedExtInd
|
17
|
+
|
18
|
+
@index = CachedExtInd.new
|
19
|
+
@index.cache.concat(framed_array)
|
20
|
+
end
|
21
|
+
|
22
|
+
def teardown
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
# setup tests
|
27
|
+
#
|
28
|
+
|
29
|
+
def test_setup
|
30
|
+
assert_equal CachedExtInd, @cls
|
31
|
+
|
32
|
+
assert_equal 0, index.pos
|
33
|
+
assert_equal 5, index.length
|
34
|
+
assert_equal 4, index.frame_size
|
35
|
+
assert index.cached?
|
36
|
+
assert_equal framed_array, index.cache
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
#
|
41
|
+
# initialize tests
|
42
|
+
#
|
43
|
+
|
44
|
+
undef_method :test_index_initialized_to_single_int_format_by_default
|
45
|
+
|
46
|
+
def test_cache_initialized_to_empty_array_in_cached_mode
|
47
|
+
index = @cls.new
|
48
|
+
|
49
|
+
assert_equal 'I*', index.format
|
50
|
+
assert_equal 1, index.frame
|
51
|
+
assert_equal 4, index.frame_size
|
52
|
+
assert_equal [0], index.nil_value
|
53
|
+
assert index.cached?
|
54
|
+
assert_equal [], index.cache
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_cache_initialized_to_empty_array_in_cached_mode_regardless_of_format
|
58
|
+
index = @cls.new nil, :format => "IQS"
|
59
|
+
|
60
|
+
assert index.cached?
|
61
|
+
assert_equal [], index.cache
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# class read tests
|
66
|
+
#
|
67
|
+
|
68
|
+
undef_method :test_read_returns_the_index_file_in_frame
|
69
|
+
|
70
|
+
#
|
71
|
+
# class directive size tests
|
72
|
+
#
|
73
|
+
|
74
|
+
undef_method :test_directive_size_returns_the_number_of_bytes_to_pack_a_directive
|
75
|
+
|
76
|
+
#
|
77
|
+
# length test
|
78
|
+
#
|
79
|
+
|
80
|
+
undef_method :test_length_returns_io_length_divided_by_frame_size
|
81
|
+
|
82
|
+
def test_length_returns_cache_length
|
83
|
+
assert_equal index.cache.length, index.length
|
84
|
+
|
85
|
+
index.cache.clear
|
86
|
+
assert_equal 0, index.length
|
87
|
+
|
88
|
+
index.cache.concat([[1],[2],[3]])
|
89
|
+
assert_equal 3, index.length
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_length_is_separate_from_io_length
|
93
|
+
index.cache.clear
|
94
|
+
assert_equal 0, index.length
|
95
|
+
|
96
|
+
index.io.length = 10
|
97
|
+
assert_equal 0, index.length
|
98
|
+
end
|
99
|
+
|
100
|
+
#
|
101
|
+
# pos test
|
102
|
+
#
|
103
|
+
|
104
|
+
undef_method :test_pos_returns_io_pos_divided_by_frame_size
|
105
|
+
|
106
|
+
def test_pos_is_kept_separate_from_io_pos_in_cached_mode
|
107
|
+
assert_equal 0, index.io.pos
|
108
|
+
assert_equal 0, index.pos
|
109
|
+
|
110
|
+
index.io.pos = 4
|
111
|
+
assert_equal 4, index.io.pos
|
112
|
+
assert_equal 0, index.pos
|
113
|
+
end
|
114
|
+
|
115
|
+
#
|
116
|
+
# pos= test
|
117
|
+
#
|
118
|
+
|
119
|
+
undef_method :test_pos_set_sets_io_pos_to_index_value_of_input_times_frame_size
|
120
|
+
|
121
|
+
def test_pos_set_sets_pos_to_index_value_of_input
|
122
|
+
index.pos = 1
|
123
|
+
assert_equal 1, index.pos
|
124
|
+
|
125
|
+
index.pos = -1
|
126
|
+
assert_equal 4, index.pos
|
127
|
+
end
|
128
|
+
|
129
|
+
#
|
130
|
+
# readbytes test
|
131
|
+
#
|
132
|
+
|
133
|
+
undef_method :test_readbytes_behavior_is_like_io_behavior
|
134
|
+
|
135
|
+
#
|
136
|
+
# unframed_write tests
|
137
|
+
#
|
138
|
+
|
139
|
+
undef_method :test_unframed_write_unframed_writes_packed_array_to_io_at_pos_and_adjusts_io_length
|
140
|
+
|
141
|
+
def test_unframed_write_unframed_writes_packed_array_to_cache_in_frame_and_does_not_affect_io
|
142
|
+
index = @cls.new
|
143
|
+
index.unframed_write([1,2,3])
|
144
|
+
assert_equal 0, index.io.length
|
145
|
+
assert_equal 0, index.io.pos
|
146
|
+
|
147
|
+
assert_equal [[1],[2],[3]], index.cache
|
148
|
+
|
149
|
+
index.unframed_write([-2], 1)
|
150
|
+
assert_equal 0, index.io.length
|
151
|
+
assert_equal 0, index.io.pos
|
152
|
+
|
153
|
+
assert_equal [[1],[-2],[3]], index.cache
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_unframed_write_pads_with_nil_value_if_position_is_past_length
|
157
|
+
index = @cls.new nil, :nil_value => [8]
|
158
|
+
assert_equal 0, index.length
|
159
|
+
|
160
|
+
index.unframed_write([1,2,3], 2)
|
161
|
+
assert_equal [[8],[8],[1],[2],[3]], index.cache
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_unframed_write_unframed_writes_nothing_with_empty_array
|
165
|
+
assert_equal framed_array, index.cache
|
166
|
+
|
167
|
+
index.unframed_write([])
|
168
|
+
assert_equal framed_array, index.cache
|
169
|
+
|
170
|
+
index.unframed_write([], 0)
|
171
|
+
assert_equal framed_array, index.cache
|
172
|
+
end
|
173
|
+
|
174
|
+
#
|
175
|
+
# mixed formats test
|
176
|
+
#
|
177
|
+
|
178
|
+
def test_read_handles_mixed_formats
|
179
|
+
index = @cls.new nil, :format => "IQS"
|
180
|
+
|
181
|
+
index.cache << [1,2,3]
|
182
|
+
index.cache << [4,5,6]
|
183
|
+
index.cache << [7,8,9]
|
184
|
+
|
185
|
+
assert_equal [[1,2,3],[4,5,6],[7,8,9]], index.read
|
186
|
+
|
187
|
+
index.pos = 1
|
188
|
+
assert_equal [4,5,6], index.read(1)
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_unframed_write_handles_mixed_formats
|
192
|
+
index = @cls.new nil, :format => "IQS"
|
193
|
+
a = [1,2,3]
|
194
|
+
b = [4,5,6]
|
195
|
+
c = [7,8,9]
|
196
|
+
d = [-4,-5,-6]
|
197
|
+
|
198
|
+
index.unframed_write([1,2,3,4,5,6,7,8,9])
|
199
|
+
assert_equal [a,b,c], index.cache
|
200
|
+
|
201
|
+
index.pos = 1
|
202
|
+
index.unframed_write([-4,-5,-6])
|
203
|
+
assert_equal [a,d,c], index.cache
|
204
|
+
end
|
205
|
+
|
206
|
+
#
|
207
|
+
# numeric format range tests
|
208
|
+
#
|
209
|
+
|
210
|
+
undef_method :test_read_and_unframed_write_handles_full_numeric_range_for_numeric_formats
|
211
|
+
undef_method :test_read_and_unframed_write_cycle_numerics_beyond_natural_range
|
212
|
+
undef_method :test_numerics_cycle_up_to_the_unsigned_max_in_either_sign
|
213
|
+
|
214
|
+
def test_unframed_write_does_NOT_check_formatting_of_input_in_cached_mode
|
215
|
+
index = @cls.new nil, :format => "S"
|
216
|
+
assert_raise(RangeError) { [ExtIndTest::ULLONG_MAX].pack("S") }
|
217
|
+
assert_nothing_raised { index.unframed_write([ExtIndTest::ULLONG_MAX]) }
|
218
|
+
end
|
219
|
+
end
|