adsp 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/AUTHORS +1 -0
- data/LICENSE +21 -0
- data/README.md +300 -0
- data/lib/adsp/error.rb +14 -0
- data/lib/adsp/file.rb +76 -0
- data/lib/adsp/option.rb +51 -0
- data/lib/adsp/stream/abstract.rb +206 -0
- data/lib/adsp/stream/delegates.rb +39 -0
- data/lib/adsp/stream/raw/abstract.rb +69 -0
- data/lib/adsp/stream/raw/compressor.rb +110 -0
- data/lib/adsp/stream/raw/decompressor.rb +80 -0
- data/lib/adsp/stream/raw/native_compressor.rb +58 -0
- data/lib/adsp/stream/raw/native_decompressor.rb +44 -0
- data/lib/adsp/stream/reader.rb +234 -0
- data/lib/adsp/stream/reader_helpers.rb +219 -0
- data/lib/adsp/stream/stat.rb +80 -0
- data/lib/adsp/stream/writer.rb +206 -0
- data/lib/adsp/stream/writer_helpers.rb +102 -0
- data/lib/adsp/string.rb +58 -0
- data/lib/adsp/validation.rb +46 -0
- data/lib/adsp/version.rb +7 -0
- data/lib/adsp.rb +8 -0
- data/test/common.rb +108 -0
- data/test/coverage_helper.rb +18 -0
- data/test/file.test.rb +120 -0
- data/test/minitest.rb +20 -0
- data/test/mock/common.rb +57 -0
- data/test/mock/file.rb +60 -0
- data/test/mock/stream/raw/compressor.rb +20 -0
- data/test/mock/stream/raw/decompressor.rb +20 -0
- data/test/mock/stream/raw/native_compressor.rb +82 -0
- data/test/mock/stream/raw/native_decompressor.rb +70 -0
- data/test/mock/stream/reader.rb +18 -0
- data/test/mock/stream/writer.rb +18 -0
- data/test/mock/string.rb +44 -0
- data/test/option.rb +66 -0
- data/test/stream/abstract.rb +125 -0
- data/test/stream/minitar.test.rb +50 -0
- data/test/stream/raw/abstract.rb +45 -0
- data/test/stream/raw/compressor.test.rb +166 -0
- data/test/stream/raw/decompressor.test.rb +166 -0
- data/test/stream/reader.test.rb +643 -0
- data/test/stream/reader_helpers.test.rb +421 -0
- data/test/stream/writer.test.rb +610 -0
- data/test/stream/writer_helpers.test.rb +267 -0
- data/test/string.test.rb +95 -0
- data/test/validation.rb +71 -0
- data/test/version.test.rb +18 -0
- metadata +274 -0
data/test/option.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Abstract data stream processor.
|
2
|
+
# Copyright (c) 2021 AUTHORS, MIT License.
|
3
|
+
|
4
|
+
require "ocg"
|
5
|
+
require "adsp/option"
|
6
|
+
|
7
|
+
require_relative "validation"
|
8
|
+
|
9
|
+
module ADSP
|
10
|
+
module Test
|
11
|
+
module Option
|
12
|
+
private_class_method def self.get_common_invalid_options(buffer_length_names, &block)
|
13
|
+
Validation::INVALID_HASHES.each(&block)
|
14
|
+
|
15
|
+
buffer_length_names.each do |name|
|
16
|
+
(Validation::INVALID_NOT_NEGATIVE_INTEGERS - [nil]).each do |invalid_integer|
|
17
|
+
yield({ name => invalid_integer })
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.get_invalid_compressor_options(buffer_length_names, &block)
|
23
|
+
get_common_invalid_options buffer_length_names, &block
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.get_invalid_decompressor_options(buffer_length_names, &block)
|
27
|
+
get_common_invalid_options buffer_length_names, &block
|
28
|
+
end
|
29
|
+
|
30
|
+
# -----
|
31
|
+
|
32
|
+
# "0" means default buffer length.
|
33
|
+
BUFFER_LENGTHS = [
|
34
|
+
0,
|
35
|
+
2
|
36
|
+
]
|
37
|
+
.freeze
|
38
|
+
|
39
|
+
BOOLS = [
|
40
|
+
true,
|
41
|
+
false
|
42
|
+
]
|
43
|
+
.freeze
|
44
|
+
|
45
|
+
private_class_method def self.get_buffer_length_option_generator(buffer_length_names)
|
46
|
+
OCG.new(
|
47
|
+
buffer_length_names.to_h { |name| [name, self::BUFFER_LENGTHS] }
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.get_compressor_options_generator(buffer_length_names)
|
52
|
+
get_buffer_length_option_generator buffer_length_names
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.get_compatible_decompressor_options(compressor_options, buffer_length_name_mapping, &_block)
|
56
|
+
decompressor_options = {}
|
57
|
+
|
58
|
+
buffer_length_name_mapping.each do |compressor_name, decompressor_name|
|
59
|
+
decompressor_options[decompressor_name] = compressor_options[compressor_name]
|
60
|
+
end
|
61
|
+
|
62
|
+
yield decompressor_options
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# Abstract data stream processor.
|
2
|
+
# Copyright (c) 2021 AUTHORS, MIT License.
|
3
|
+
|
4
|
+
require "fcntl"
|
5
|
+
require "stringio"
|
6
|
+
|
7
|
+
require_relative "../common"
|
8
|
+
require_relative "../minitest"
|
9
|
+
require_relative "../validation"
|
10
|
+
|
11
|
+
module ADSP
|
12
|
+
module Test
|
13
|
+
module Stream
|
14
|
+
class Abstract < Minitest::Test
|
15
|
+
SOURCE_PATH = Common::SOURCE_PATH
|
16
|
+
|
17
|
+
def test_invalid_initialize
|
18
|
+
(Validation::INVALID_STRINGS - [nil] + Validation::INVALID_ENCODINGS).each do |invalid_encoding|
|
19
|
+
assert_raises ValidateError do
|
20
|
+
target.new ::StringIO.new, {}, :external_encoding => invalid_encoding
|
21
|
+
end
|
22
|
+
|
23
|
+
assert_raises ValidateError do
|
24
|
+
target.new ::StringIO.new, {}, :internal_encoding => invalid_encoding
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
(Validation::INVALID_HASHES - [nil]).each do |invalid_hash|
|
29
|
+
assert_raises ValidateError do
|
30
|
+
target.new ::StringIO.new, {}, :transcode_options => invalid_hash
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_invalid_set_encoding
|
36
|
+
instance = target.new ::StringIO.new
|
37
|
+
|
38
|
+
(Validation::INVALID_STRINGS - [nil] + Validation::INVALID_ENCODINGS).each do |invalid_encoding|
|
39
|
+
assert_raises ValidateError do
|
40
|
+
instance.set_encoding invalid_encoding
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_raises ValidateError do
|
44
|
+
instance.set_encoding ::Encoding::BINARY, invalid_encoding
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
Validation::INVALID_ENCODINGS.each do |invalid_encoding|
|
49
|
+
assert_raises ValidateError do
|
50
|
+
instance.set_encoding "#{::Encoding::BINARY}:#{invalid_encoding}"
|
51
|
+
end
|
52
|
+
|
53
|
+
assert_raises ValidateError do
|
54
|
+
instance.set_encoding "#{invalid_encoding}:#{::Encoding::BINARY}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
(Validation::INVALID_HASHES - [nil]).each do |invalid_hash|
|
59
|
+
assert_raises ValidateError do
|
60
|
+
instance.set_encoding ::Encoding::BINARY, ::Encoding::BINARY, invalid_hash
|
61
|
+
end
|
62
|
+
|
63
|
+
assert_raises ValidateError do
|
64
|
+
instance.set_encoding "#{::Encoding::BINARY}:#{::Encoding::BINARY}", invalid_hash
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_to_io
|
70
|
+
instance = target.new ::StringIO.new
|
71
|
+
assert_equal instance, instance.to_io
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_io_delegates
|
75
|
+
::File.open SOURCE_PATH, "wb+" do |file|
|
76
|
+
instance = target.new file
|
77
|
+
|
78
|
+
instance.autoclose = true
|
79
|
+
assert_predicate instance, :autoclose?
|
80
|
+
|
81
|
+
instance.binmode
|
82
|
+
assert_predicate instance, :binmode
|
83
|
+
|
84
|
+
instance.close_on_exec = true
|
85
|
+
assert_predicate instance, :close_on_exec?
|
86
|
+
|
87
|
+
# Fcntl is not available on windows.
|
88
|
+
if Fcntl.const_defined? :F_GETFL
|
89
|
+
stats = instance.fcntl Fcntl::F_GETFL, 0
|
90
|
+
refute_nil stats
|
91
|
+
end
|
92
|
+
|
93
|
+
instance.fdatasync
|
94
|
+
|
95
|
+
fd = instance.fileno
|
96
|
+
refute_nil fd
|
97
|
+
|
98
|
+
refute_predicate instance, :isatty
|
99
|
+
assert_nil instance.pid
|
100
|
+
|
101
|
+
instance.sync = true
|
102
|
+
assert_predicate instance, :sync
|
103
|
+
|
104
|
+
refute_nil instance.to_i
|
105
|
+
refute_predicate instance, :tty?
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_stat
|
110
|
+
instance = target.new $stdout
|
111
|
+
|
112
|
+
refute_predicate instance.stat, :file?
|
113
|
+
refute_predicate instance.stat, :pipe?
|
114
|
+
refute_predicate instance.stat, :socket?
|
115
|
+
end
|
116
|
+
|
117
|
+
# -----
|
118
|
+
|
119
|
+
protected def target
|
120
|
+
self.class::Target
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# Abstract data stream processor.
|
2
|
+
# Copyright (c) 2021 AUTHORS, MIT License.
|
3
|
+
|
4
|
+
require "minitar"
|
5
|
+
|
6
|
+
require_relative "../common"
|
7
|
+
require_relative "../minitest"
|
8
|
+
require_relative "../mock/stream/reader"
|
9
|
+
require_relative "../mock/stream/writer"
|
10
|
+
|
11
|
+
module ADSP
|
12
|
+
module Test
|
13
|
+
module Stream
|
14
|
+
class MinitarTest < Minitest::Test
|
15
|
+
Reader = Mock::Stream::Reader
|
16
|
+
Writer = Mock::Stream::Writer
|
17
|
+
|
18
|
+
ARCHIVE_PATH = Common::ARCHIVE_PATH
|
19
|
+
LARGE_TEXTS = Common::LARGE_TEXTS
|
20
|
+
|
21
|
+
def test_tar
|
22
|
+
Common.parallel LARGE_TEXTS do |text, worker_index|
|
23
|
+
archive_path = Common.get_path ARCHIVE_PATH, worker_index
|
24
|
+
|
25
|
+
Writer.open archive_path do |writer|
|
26
|
+
Minitar::Writer.open writer do |tar|
|
27
|
+
tar.add_file_simple "file", :data => text
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Reader.open archive_path do |reader|
|
32
|
+
Minitar::Reader.open reader do |tar|
|
33
|
+
tar.each_entry do |entry|
|
34
|
+
assert_equal "file", entry.name
|
35
|
+
|
36
|
+
decompressed_text = entry.read
|
37
|
+
decompressed_text.force_encoding text.encoding
|
38
|
+
|
39
|
+
assert_equal text, decompressed_text
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
Minitest << MinitarTest
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Abstract data stream processor.
|
2
|
+
# Copyright (c) 2021 AUTHORS, MIT License.
|
3
|
+
|
4
|
+
require_relative "../../minitest"
|
5
|
+
require_relative "../../validation"
|
6
|
+
|
7
|
+
module ADSP
|
8
|
+
module Test
|
9
|
+
module Stream
|
10
|
+
module Raw
|
11
|
+
class Abstract < Minitest::Test
|
12
|
+
NOOP_PROC = Validation::NOOP_PROC
|
13
|
+
|
14
|
+
def test_invalid_flush
|
15
|
+
instance = target.new
|
16
|
+
|
17
|
+
assert_raises ValidateError do
|
18
|
+
instance.flush
|
19
|
+
end
|
20
|
+
|
21
|
+
instance.close(&NOOP_PROC)
|
22
|
+
|
23
|
+
assert_raises UsedAfterCloseError do
|
24
|
+
instance.flush(&NOOP_PROC)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_invalid_close
|
29
|
+
instance = target.new
|
30
|
+
|
31
|
+
assert_raises ValidateError do
|
32
|
+
instance.close
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# -----
|
37
|
+
|
38
|
+
protected def target
|
39
|
+
self.class::Target
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
# Abstract data stream processor.
|
2
|
+
# Copyright (c) 2021 AUTHORS, MIT License.
|
3
|
+
|
4
|
+
require_relative "abstract"
|
5
|
+
require_relative "../../common"
|
6
|
+
require_relative "../../minitest"
|
7
|
+
require_relative "../../mock/stream/raw/compressor"
|
8
|
+
require_relative "../../mock/string"
|
9
|
+
require_relative "../../option"
|
10
|
+
require_relative "../../validation"
|
11
|
+
|
12
|
+
module ADSP
|
13
|
+
module Test
|
14
|
+
module Stream
|
15
|
+
module Raw
|
16
|
+
class Compressor < Abstract
|
17
|
+
Target = Mock::Stream::Raw::Compressor
|
18
|
+
String = Mock::String
|
19
|
+
|
20
|
+
TEXTS = Common::TEXTS
|
21
|
+
LARGE_TEXTS = Common::LARGE_TEXTS
|
22
|
+
PORTION_LENGTHS = Common::PORTION_LENGTHS
|
23
|
+
LARGE_PORTION_LENGTHS = Common::LARGE_PORTION_LENGTHS
|
24
|
+
|
25
|
+
BUFFER_LENGTH_NAMES = %i[destination_buffer_length].freeze
|
26
|
+
BUFFER_LENGTH_MAPPING = { :destination_buffer_length => :destination_buffer_length }.freeze
|
27
|
+
|
28
|
+
def test_invalid_initialize
|
29
|
+
get_invalid_compressor_options do |invalid_options|
|
30
|
+
assert_raises ValidateError do
|
31
|
+
Target.new invalid_options
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_invalid_write
|
37
|
+
compressor = Target.new
|
38
|
+
|
39
|
+
Validation::INVALID_STRINGS.each do |invalid_string|
|
40
|
+
assert_raises ValidateError do
|
41
|
+
compressor.write invalid_string, &NOOP_PROC
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
assert_raises ValidateError do
|
46
|
+
compressor.write ""
|
47
|
+
end
|
48
|
+
|
49
|
+
compressor.close(&NOOP_PROC)
|
50
|
+
|
51
|
+
assert_raises UsedAfterCloseError do
|
52
|
+
compressor.write "", &NOOP_PROC
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_texts
|
57
|
+
parallel_compressor_options do |compressor_options|
|
58
|
+
TEXTS.each do |text|
|
59
|
+
PORTION_LENGTHS.each do |portion_length|
|
60
|
+
compressed_buffer = ::StringIO.new
|
61
|
+
compressed_buffer.set_encoding ::Encoding::BINARY
|
62
|
+
|
63
|
+
writer = proc { |portion| compressed_buffer << portion }
|
64
|
+
compressor = Target.new compressor_options
|
65
|
+
|
66
|
+
begin
|
67
|
+
source = "".b
|
68
|
+
text_offset = 0
|
69
|
+
index = 0
|
70
|
+
|
71
|
+
loop do
|
72
|
+
portion = text.byteslice text_offset, portion_length
|
73
|
+
break if portion.nil?
|
74
|
+
|
75
|
+
text_offset += portion_length
|
76
|
+
source << portion
|
77
|
+
|
78
|
+
bytes_written = compressor.write source, &writer
|
79
|
+
source = source.byteslice bytes_written, source.bytesize - bytes_written
|
80
|
+
|
81
|
+
compressor.flush(&writer) if index.even?
|
82
|
+
index += 1
|
83
|
+
end
|
84
|
+
|
85
|
+
ensure
|
86
|
+
refute_predicate compressor, :closed?
|
87
|
+
compressor.close(&writer)
|
88
|
+
assert_predicate compressor, :closed?
|
89
|
+
end
|
90
|
+
|
91
|
+
compressed_text = compressed_buffer.string
|
92
|
+
|
93
|
+
get_compatible_decompressor_options compressor_options do |decompressor_options|
|
94
|
+
decompressed_text = String.decompress compressed_text, decompressor_options
|
95
|
+
decompressed_text.force_encoding text.encoding
|
96
|
+
|
97
|
+
assert_equal text, decompressed_text
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_large_texts
|
105
|
+
options_generator = OCG.new(
|
106
|
+
:text => LARGE_TEXTS,
|
107
|
+
:portion_length => LARGE_PORTION_LENGTHS
|
108
|
+
)
|
109
|
+
|
110
|
+
Common.parallel_options options_generator do |options|
|
111
|
+
text = options[:text]
|
112
|
+
portion_length = options[:portion_length]
|
113
|
+
|
114
|
+
compressed_buffer = ::StringIO.new
|
115
|
+
compressed_buffer.set_encoding ::Encoding::BINARY
|
116
|
+
|
117
|
+
writer = proc { |portion| compressed_buffer << portion }
|
118
|
+
compressor = Target.new
|
119
|
+
|
120
|
+
begin
|
121
|
+
source = "".b
|
122
|
+
text_offset = 0
|
123
|
+
|
124
|
+
loop do
|
125
|
+
portion = text.byteslice text_offset, portion_length
|
126
|
+
break if portion.nil?
|
127
|
+
|
128
|
+
text_offset += portion_length
|
129
|
+
source << portion
|
130
|
+
|
131
|
+
bytes_written = compressor.write source, &writer
|
132
|
+
source = source.byteslice bytes_written, source.bytesize - bytes_written
|
133
|
+
end
|
134
|
+
ensure
|
135
|
+
compressor.close(&writer)
|
136
|
+
end
|
137
|
+
|
138
|
+
compressed_text = compressed_buffer.string
|
139
|
+
|
140
|
+
decompressed_text = String.decompress compressed_text
|
141
|
+
decompressed_text.force_encoding text.encoding
|
142
|
+
|
143
|
+
assert_equal text, decompressed_text
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# -----
|
148
|
+
|
149
|
+
def get_invalid_compressor_options(&block)
|
150
|
+
Option.get_invalid_compressor_options BUFFER_LENGTH_NAMES, &block
|
151
|
+
end
|
152
|
+
|
153
|
+
def parallel_compressor_options(&block)
|
154
|
+
Common.parallel_options Option.get_compressor_options_generator(BUFFER_LENGTH_NAMES), &block
|
155
|
+
end
|
156
|
+
|
157
|
+
def get_compatible_decompressor_options(compressor_options, &block)
|
158
|
+
Option.get_compatible_decompressor_options compressor_options, BUFFER_LENGTH_MAPPING, &block
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
Minitest << Compressor
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,166 @@
|
|
1
|
+
# Abstract data stream processor.
|
2
|
+
# Copyright (c) 2021 AUTHORS, MIT License.
|
3
|
+
|
4
|
+
require_relative "abstract"
|
5
|
+
require_relative "../../common"
|
6
|
+
require_relative "../../minitest"
|
7
|
+
require_relative "../../mock/stream/raw/decompressor"
|
8
|
+
require_relative "../../mock/string"
|
9
|
+
require_relative "../../option"
|
10
|
+
require_relative "../../validation"
|
11
|
+
|
12
|
+
module ADSP
|
13
|
+
module Test
|
14
|
+
module Stream
|
15
|
+
module Raw
|
16
|
+
class Decompressor < Abstract
|
17
|
+
Target = Mock::Stream::Raw::Decompressor
|
18
|
+
String = Mock::String
|
19
|
+
|
20
|
+
TEXTS = Common::TEXTS
|
21
|
+
LARGE_TEXTS = Common::LARGE_TEXTS
|
22
|
+
PORTION_LENGTHS = Common::PORTION_LENGTHS
|
23
|
+
LARGE_PORTION_LENGTHS = Common::LARGE_PORTION_LENGTHS
|
24
|
+
|
25
|
+
BUFFER_LENGTH_NAMES = %i[destination_buffer_length].freeze
|
26
|
+
BUFFER_LENGTH_MAPPING = { :destination_buffer_length => :destination_buffer_length }.freeze
|
27
|
+
|
28
|
+
def test_invalid_initialize
|
29
|
+
get_invalid_decompressor_options do |invalid_options|
|
30
|
+
assert_raises ValidateError do
|
31
|
+
Target.new invalid_options
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_invalid_read
|
37
|
+
decompressor = Target.new
|
38
|
+
|
39
|
+
Validation::INVALID_STRINGS.each do |invalid_string|
|
40
|
+
assert_raises ValidateError do
|
41
|
+
decompressor.read invalid_string, &NOOP_PROC
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
assert_raises ValidateError do
|
46
|
+
decompressor.read ""
|
47
|
+
end
|
48
|
+
|
49
|
+
decompressor.close(&NOOP_PROC)
|
50
|
+
|
51
|
+
assert_raises UsedAfterCloseError do
|
52
|
+
decompressor.read "", &NOOP_PROC
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_texts
|
57
|
+
parallel_compressor_options do |compressor_options|
|
58
|
+
TEXTS.each do |text|
|
59
|
+
compressed_text = String.compress text, compressor_options
|
60
|
+
|
61
|
+
PORTION_LENGTHS.each do |portion_length|
|
62
|
+
get_compatible_decompressor_options compressor_options do |decompressor_options|
|
63
|
+
decompressed_buffer = ::StringIO.new
|
64
|
+
decompressed_buffer.set_encoding ::Encoding::BINARY
|
65
|
+
|
66
|
+
writer = proc { |portion| decompressed_buffer << portion }
|
67
|
+
decompressor = Target.new decompressor_options
|
68
|
+
|
69
|
+
begin
|
70
|
+
source = "".b
|
71
|
+
compressed_text_offset = 0
|
72
|
+
index = 0
|
73
|
+
|
74
|
+
loop do
|
75
|
+
portion = compressed_text.byteslice compressed_text_offset, portion_length
|
76
|
+
break if portion.nil?
|
77
|
+
|
78
|
+
compressed_text_offset += portion_length
|
79
|
+
source << portion
|
80
|
+
|
81
|
+
bytes_read = decompressor.read source, &writer
|
82
|
+
source = source.byteslice bytes_read, source.bytesize - bytes_read
|
83
|
+
|
84
|
+
decompressor.flush(&writer) if index.even?
|
85
|
+
index += 1
|
86
|
+
end
|
87
|
+
|
88
|
+
ensure
|
89
|
+
refute_predicate decompressor, :closed?
|
90
|
+
decompressor.close(&writer)
|
91
|
+
assert_predicate decompressor, :closed?
|
92
|
+
end
|
93
|
+
|
94
|
+
decompressed_text = decompressed_buffer.string
|
95
|
+
decompressed_text.force_encoding text.encoding
|
96
|
+
|
97
|
+
assert_equal text, decompressed_text
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_large_texts
|
105
|
+
options_generator = OCG.new(
|
106
|
+
:text => LARGE_TEXTS,
|
107
|
+
:portion_length => LARGE_PORTION_LENGTHS
|
108
|
+
)
|
109
|
+
|
110
|
+
Common.parallel_options options_generator do |options|
|
111
|
+
text = options[:text]
|
112
|
+
portion_length = options[:portion_length]
|
113
|
+
|
114
|
+
compressed_text = String.compress text
|
115
|
+
|
116
|
+
decompressed_buffer = ::StringIO.new
|
117
|
+
decompressed_buffer.set_encoding ::Encoding::BINARY
|
118
|
+
|
119
|
+
writer = proc { |portion| decompressed_buffer << portion }
|
120
|
+
decompressor = Target.new
|
121
|
+
|
122
|
+
begin
|
123
|
+
source = "".b
|
124
|
+
compressed_text_offset = 0
|
125
|
+
|
126
|
+
loop do
|
127
|
+
portion = compressed_text.byteslice compressed_text_offset, portion_length
|
128
|
+
break if portion.nil?
|
129
|
+
|
130
|
+
compressed_text_offset += portion_length
|
131
|
+
source << portion
|
132
|
+
|
133
|
+
bytes_read = decompressor.read source, &writer
|
134
|
+
source = source.byteslice bytes_read, source.bytesize - bytes_read
|
135
|
+
end
|
136
|
+
ensure
|
137
|
+
decompressor.close(&writer)
|
138
|
+
end
|
139
|
+
|
140
|
+
decompressed_text = decompressed_buffer.string
|
141
|
+
decompressed_text.force_encoding text.encoding
|
142
|
+
|
143
|
+
assert_equal text, decompressed_text
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# -----
|
148
|
+
|
149
|
+
def get_invalid_decompressor_options(&block)
|
150
|
+
Option.get_invalid_decompressor_options BUFFER_LENGTH_NAMES, &block
|
151
|
+
end
|
152
|
+
|
153
|
+
def parallel_compressor_options(&block)
|
154
|
+
Common.parallel_options Option.get_compressor_options_generator(BUFFER_LENGTH_NAMES), &block
|
155
|
+
end
|
156
|
+
|
157
|
+
def get_compatible_decompressor_options(compressor_options, &block)
|
158
|
+
Option.get_compatible_decompressor_options compressor_options, BUFFER_LENGTH_MAPPING, &block
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
Minitest << Decompressor
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|