adsp 1.0.2 → 1.0.6

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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/{test → lib/adsp/test}/common.rb +4 -1
  3. data/{test → lib/adsp/test}/coverage_helper.rb +0 -0
  4. data/lib/adsp/test/file.rb +120 -0
  5. data/{test → lib/adsp/test}/minitest.rb +1 -0
  6. data/{test → lib/adsp/test}/mock/common.rb +1 -0
  7. data/{test → lib/adsp/test}/mock/file.rb +1 -0
  8. data/{test → lib/adsp/test}/mock/stream/raw/compressor.rb +1 -0
  9. data/{test → lib/adsp/test}/mock/stream/raw/decompressor.rb +1 -0
  10. data/{test → lib/adsp/test}/mock/stream/raw/native_compressor.rb +1 -0
  11. data/{test → lib/adsp/test}/mock/stream/raw/native_decompressor.rb +1 -0
  12. data/{test → lib/adsp/test}/mock/stream/reader.rb +1 -0
  13. data/{test → lib/adsp/test}/mock/stream/writer.rb +1 -0
  14. data/{test → lib/adsp/test}/mock/string.rb +1 -0
  15. data/{test → lib/adsp/test}/option.rb +1 -0
  16. data/{test → lib/adsp/test}/stream/abstract.rb +1 -0
  17. data/lib/adsp/test/stream/minitar.rb +50 -0
  18. data/{test → lib/adsp/test}/stream/raw/abstract.rb +1 -0
  19. data/lib/adsp/test/stream/raw/compressor.rb +165 -0
  20. data/lib/adsp/test/stream/raw/decompressor.rb +165 -0
  21. data/lib/adsp/test/stream/reader.rb +642 -0
  22. data/lib/adsp/test/stream/reader_helpers.rb +421 -0
  23. data/lib/adsp/test/stream/writer.rb +609 -0
  24. data/lib/adsp/test/stream/writer_helpers.rb +267 -0
  25. data/lib/adsp/test/string.rb +95 -0
  26. data/{test → lib/adsp/test}/validation.rb +7 -0
  27. data/lib/adsp/test/version.rb +18 -0
  28. data/lib/adsp/version.rb +1 -1
  29. data/test/file.test.rb +3 -116
  30. data/test/stream/minitar.test.rb +3 -46
  31. data/test/stream/raw/compressor.test.rb +3 -162
  32. data/test/stream/raw/decompressor.test.rb +3 -162
  33. data/test/stream/reader.test.rb +3 -639
  34. data/test/stream/reader_helpers.test.rb +3 -417
  35. data/test/stream/writer.test.rb +3 -606
  36. data/test/stream/writer_helpers.test.rb +3 -263
  37. data/test/string.test.rb +3 -91
  38. data/test/version.test.rb +3 -14
  39. metadata +28 -19
@@ -0,0 +1,267 @@
1
+ # Abstract data stream processor.
2
+ # Copyright (c) 2021 AUTHORS, MIT License.
3
+
4
+ require "English"
5
+ require "stringio"
6
+
7
+ require_relative "../common"
8
+ require_relative "../minitest"
9
+ require_relative "../option"
10
+ require_relative "../validation"
11
+ require_relative "../mock/stream/writer"
12
+ require_relative "../mock/string"
13
+
14
+ module ADSP
15
+ module Test
16
+ # ADSP::Test::Stream module.
17
+ module Stream
18
+ # ADSP::Test::Stream::WriterHelpers class.
19
+ class WriterHelpers < Minitest::Test
20
+ Target = Mock::Stream::Writer
21
+ String = Mock::String
22
+
23
+ ARCHIVE_PATH = Common::ARCHIVE_PATH
24
+ TEXTS = Common::TEXTS
25
+ LARGE_TEXTS = Common::LARGE_TEXTS
26
+ PORTION_LENGTHS = Common::PORTION_LENGTHS
27
+ LARGE_PORTION_LENGTHS = Common::LARGE_PORTION_LENGTHS
28
+
29
+ BUFFER_LENGTH_NAMES = %i[destination_buffer_length].freeze
30
+ BUFFER_LENGTH_MAPPING = { :destination_buffer_length => :destination_buffer_length }.freeze
31
+
32
+ def test_write
33
+ parallel_compressor_options do |compressor_options, worker_index|
34
+ archive_path = Common.get_path ARCHIVE_PATH, worker_index
35
+
36
+ TEXTS.each do |text|
37
+ PORTION_LENGTHS.each do |portion_length|
38
+ sources = get_sources text, portion_length
39
+
40
+ Target.open archive_path, compressor_options do |instance|
41
+ sources.each { |current_source| instance << current_source }
42
+ end
43
+
44
+ compressed_text = ::File.read archive_path, :mode => "rb"
45
+
46
+ get_compatible_decompressor_options compressor_options do |decompressor_options|
47
+ check_text text, compressed_text, decompressor_options
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def test_print
55
+ parallel_compressor_options do |compressor_options, worker_index|
56
+ archive_path = Common.get_path ARCHIVE_PATH, worker_index
57
+
58
+ TEXTS.reject(&:empty?).each do |text|
59
+ PORTION_LENGTHS.each do |portion_length|
60
+ sources = get_sources text, portion_length
61
+ field_separator = " ".encode text.encoding
62
+ record_separator = "\n".encode text.encoding
63
+
64
+ target_text = "".encode text.encoding
65
+ sources.each { |source| target_text << (source + field_separator) }
66
+ target_text << record_separator
67
+
68
+ Target.open archive_path, compressor_options do |instance|
69
+ keyword_args = { :field_separator => field_separator, :record_separator => record_separator }
70
+ instance.print(*sources, **keyword_args)
71
+ end
72
+
73
+ compressed_text = ::File.read archive_path, :mode => "rb"
74
+
75
+ get_compatible_decompressor_options compressor_options do |decompressor_options|
76
+ check_text target_text, compressed_text, decompressor_options
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ def test_printf
84
+ parallel_compressor_options do |compressor_options, worker_index|
85
+ archive_path = Common.get_path ARCHIVE_PATH, worker_index
86
+
87
+ TEXTS.each do |text|
88
+ PORTION_LENGTHS.each do |portion_length|
89
+ sources = get_sources text, portion_length
90
+
91
+ Target.open archive_path, compressor_options do |instance|
92
+ sources.each { |source| instance.printf "%s", source }
93
+ end
94
+
95
+ compressed_text = ::File.read archive_path, :mode => "rb"
96
+
97
+ get_compatible_decompressor_options compressor_options do |decompressor_options|
98
+ check_text text, compressed_text, decompressor_options
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ def test_invalid_putc
106
+ instance = target.new ::StringIO.new
107
+
108
+ Validation::INVALID_CHARS.each do |invalid_char|
109
+ assert_raises ValidateError do
110
+ instance.putc invalid_char
111
+ end
112
+ end
113
+ end
114
+
115
+ def test_putc
116
+ parallel_compressor_options do |compressor_options, worker_index|
117
+ archive_path = Common.get_path ARCHIVE_PATH, worker_index
118
+
119
+ TEXTS.each do |text|
120
+ Target.open archive_path, compressor_options do |instance|
121
+ # Putc should process numbers and strings.
122
+ text.chars.each.with_index do |char, index|
123
+ if index.even?
124
+ instance.putc char.ord, :encoding => text.encoding
125
+ else
126
+ instance.putc char
127
+ end
128
+ end
129
+ end
130
+
131
+ compressed_text = ::File.read archive_path, :mode => "rb"
132
+
133
+ get_compatible_decompressor_options compressor_options do |decompressor_options|
134
+ check_text text, compressed_text, decompressor_options
135
+ end
136
+ end
137
+ end
138
+ end
139
+
140
+ def test_puts
141
+ parallel_compressor_options do |compressor_options, worker_index|
142
+ archive_path = Common.get_path ARCHIVE_PATH, worker_index
143
+
144
+ TEXTS.each do |text|
145
+ PORTION_LENGTHS.each do |portion_length|
146
+ newline = "\n".encode text.encoding
147
+
148
+ sources = get_sources text, portion_length
149
+ sources = sources.map do |source|
150
+ source.delete_suffix! newline while source.end_with? newline
151
+ source
152
+ end
153
+
154
+ target_text = "".encode text.encoding
155
+ sources.each { |source| target_text << (source + newline) }
156
+
157
+ Target.open archive_path, compressor_options do |instance|
158
+ # Puts should ignore additional newlines and process arrays.
159
+ args = sources.map.with_index do |source, index|
160
+ if index.even?
161
+ source + newline
162
+ else
163
+ [source]
164
+ end
165
+ end
166
+
167
+ instance.puts(*args)
168
+ end
169
+
170
+ compressed_text = ::File.read archive_path, :mode => "rb"
171
+
172
+ get_compatible_decompressor_options compressor_options do |decompressor_options|
173
+ check_text target_text, compressed_text, decompressor_options
174
+ end
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+ def test_invalid_open
181
+ Validation::INVALID_STRINGS.each do |invalid_string|
182
+ assert_raises ValidateError do
183
+ Target.open(invalid_string) {} # no-op
184
+ end
185
+ end
186
+
187
+ # Proc is required.
188
+ assert_raises ValidateError do
189
+ Target.open ARCHIVE_PATH
190
+ end
191
+ end
192
+
193
+ def test_open
194
+ parallel_compressor_options do |compressor_options, worker_index|
195
+ archive_path = Common.get_path ARCHIVE_PATH, worker_index
196
+
197
+ TEXTS.each do |text|
198
+ Target.open(archive_path, compressor_options) { |instance| instance.write text }
199
+
200
+ compressed_text = ::File.read archive_path, :mode => "rb"
201
+
202
+ get_compatible_decompressor_options compressor_options do |decompressor_options|
203
+ check_text text, compressed_text, decompressor_options
204
+ end
205
+ end
206
+ end
207
+ end
208
+
209
+ def test_open_with_large_texts
210
+ options_generator = OCG.new(
211
+ :text => LARGE_TEXTS,
212
+ :portion_length => LARGE_PORTION_LENGTHS
213
+ )
214
+
215
+ Common.parallel_options options_generator do |options, worker_index|
216
+ text = options[:text]
217
+ portion_length = options[:portion_length]
218
+
219
+ archive_path = Common.get_path ARCHIVE_PATH, worker_index
220
+
221
+ sources = get_sources text, portion_length
222
+
223
+ Target.open archive_path do |instance|
224
+ sources.each { |source| instance.write source }
225
+ end
226
+
227
+ compressed_text = ::File.read archive_path, :mode => "rb"
228
+
229
+ check_text text, compressed_text, {}
230
+ end
231
+ end
232
+
233
+ # -----
234
+
235
+ protected def get_sources(text, portion_length)
236
+ sources = text
237
+ .chars
238
+ .each_slice(portion_length)
239
+ .map(&:join)
240
+
241
+ return [""] if sources.empty?
242
+
243
+ sources
244
+ end
245
+
246
+ protected def check_text(text, compressed_text, decompressor_options)
247
+ decompressed_text = String.decompress compressed_text, decompressor_options
248
+ decompressed_text.force_encoding text.encoding
249
+
250
+ assert_equal text, decompressed_text
251
+ end
252
+
253
+ def parallel_compressor_options(&block)
254
+ Common.parallel_options Option.get_compressor_options_generator(BUFFER_LENGTH_NAMES), &block
255
+ end
256
+
257
+ def get_compatible_decompressor_options(compressor_options, &block)
258
+ Option.get_compatible_decompressor_options compressor_options, BUFFER_LENGTH_MAPPING, &block
259
+ end
260
+
261
+ protected def target
262
+ self.class::Target
263
+ end
264
+ end
265
+ end
266
+ end
267
+ end
@@ -0,0 +1,95 @@
1
+ # Abstract data stream processor.
2
+ # Copyright (c) 2021 AUTHORS, MIT License.
3
+
4
+ require "adsp/string"
5
+
6
+ require_relative "common"
7
+ require_relative "minitest"
8
+ require_relative "mock/string"
9
+ require_relative "option"
10
+ require_relative "validation"
11
+
12
+ module ADSP
13
+ # ADSP::Test module.
14
+ module Test
15
+ # ADSP::Test::String class.
16
+ class String < Minitest::Test
17
+ Option = Test::Option
18
+ Target = Mock::String
19
+
20
+ TEXTS = Common::TEXTS
21
+ LARGE_TEXTS = Common::LARGE_TEXTS
22
+
23
+ BUFFER_LENGTH_NAMES = %i[destination_buffer_length].freeze
24
+ BUFFER_LENGTH_MAPPING = { :destination_buffer_length => :destination_buffer_length }.freeze
25
+
26
+ def test_invalid_arguments
27
+ Validation::INVALID_STRINGS.each do |invalid_string|
28
+ assert_raises ValidateError do
29
+ Target.compress invalid_string
30
+ end
31
+
32
+ assert_raises ValidateError do
33
+ Target.decompress invalid_string
34
+ end
35
+ end
36
+
37
+ get_invalid_compressor_options do |invalid_options|
38
+ assert_raises ValidateError do
39
+ Target.compress "", invalid_options
40
+ end
41
+ end
42
+
43
+ get_invalid_decompressor_options do |invalid_options|
44
+ assert_raises ValidateError do
45
+ Target.decompress "", invalid_options
46
+ end
47
+ end
48
+ end
49
+
50
+ def test_texts
51
+ parallel_compressor_options do |compressor_options|
52
+ TEXTS.each do |text|
53
+ compressed_text = Target.compress text, compressor_options
54
+
55
+ get_compatible_decompressor_options compressor_options do |decompressor_options|
56
+ decompressed_text = Target.decompress compressed_text, decompressor_options
57
+ decompressed_text.force_encoding text.encoding
58
+
59
+ assert_equal text, decompressed_text
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ def test_large_texts
66
+ Common.parallel LARGE_TEXTS do |text|
67
+ compressed_text = Target.compress text
68
+
69
+ decompressed_text = Target.decompress compressed_text
70
+ decompressed_text.force_encoding text.encoding
71
+
72
+ assert_equal text, decompressed_text
73
+ end
74
+ end
75
+
76
+ # -----
77
+
78
+ def get_invalid_compressor_options(&block)
79
+ self.class::Option.get_invalid_compressor_options BUFFER_LENGTH_NAMES, &block
80
+ end
81
+
82
+ def get_invalid_decompressor_options(&block)
83
+ self.class::Option.get_invalid_decompressor_options BUFFER_LENGTH_NAMES, &block
84
+ end
85
+
86
+ def parallel_compressor_options(&block)
87
+ Common.parallel_options self.class::Option.get_compressor_options_generator(BUFFER_LENGTH_NAMES), &block
88
+ end
89
+
90
+ def get_compatible_decompressor_options(compressor_options, &block)
91
+ self.class::Option.get_compatible_decompressor_options compressor_options, BUFFER_LENGTH_MAPPING, &block
92
+ end
93
+ end
94
+ end
95
+ end
@@ -5,6 +5,7 @@ require "stringio"
5
5
 
6
6
  module ADSP
7
7
  module Test
8
+ # ADSP::Test::Validation module.
8
9
  module Validation
9
10
  NOOP_PROC = proc {} # no-op
10
11
 
@@ -43,26 +44,32 @@ module ADSP
43
44
  ]
44
45
  .freeze
45
46
 
47
+ # ADSP::Test::Validation::StringIOWithoutEOF class.
46
48
  class StringIOWithoutEOF < ::StringIO
47
49
  undef :eof?
48
50
  end
49
51
 
52
+ # ADSP::Test::Validation::StringIOWithoutRead class.
50
53
  class StringIOWithoutRead < ::StringIO
51
54
  undef :read
52
55
  end
53
56
 
57
+ # ADSP::Test::Validation::StringIOWithoutReadNonblock class.
54
58
  class StringIOWithoutReadNonblock < ::StringIO
55
59
  undef :read_nonblock
56
60
  end
57
61
 
62
+ # ADSP::Test::Validation::StringIOWithoutReadpartial class.
58
63
  class StringIOWithoutReadpartial < ::StringIO
59
64
  undef :readpartial
60
65
  end
61
66
 
67
+ # ADSP::Test::Validation::StringIOWithoutWrite class.
62
68
  class StringIOWithoutWrite < ::StringIO
63
69
  undef :write
64
70
  end
65
71
 
72
+ # ADSP::Test::Validation::StringIOWithoutWriteNonblock class.
66
73
  class StringIOWithoutWriteNonblock < ::StringIO
67
74
  undef :write_nonblock
68
75
  end
@@ -0,0 +1,18 @@
1
+ # Abstract data stream processor.
2
+ # Copyright (c) 2021 AUTHORS, MIT License.
3
+
4
+ require "adsp"
5
+
6
+ require_relative "minitest"
7
+
8
+ module ADSP
9
+ # ADSP::Test module.
10
+ module Test
11
+ # ADSP::Test::Version class.
12
+ class Version < Minitest::Test
13
+ def test_version
14
+ refute_nil ADSP::VERSION
15
+ end
16
+ end
17
+ end
18
+ end
data/lib/adsp/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
 
4
4
  module ADSP
5
5
  # Abstract data stream processor version.
6
- VERSION = "1.0.2".freeze
6
+ VERSION = "1.0.6".freeze
7
7
  end
data/test/file.test.rb CHANGED
@@ -1,120 +1,7 @@
1
1
  # Abstract data stream processor.
2
2
  # Copyright (c) 2021 AUTHORS, MIT License.
3
3
 
4
- require "adsp/file"
4
+ require "adsp/test/minitest"
5
+ require "adsp/test/file"
5
6
 
6
- require_relative "common"
7
- require_relative "minitest"
8
- require_relative "mock/file"
9
- require_relative "option"
10
- require_relative "validation"
11
-
12
- module ADSP
13
- module Test
14
- class File < Minitest::Test
15
- Option = Test::Option
16
- Target = Mock::File
17
-
18
- SOURCE_PATH = Common::SOURCE_PATH
19
- ARCHIVE_PATH = Common::ARCHIVE_PATH
20
- TEXTS = Common::TEXTS
21
- LARGE_TEXTS = Common::LARGE_TEXTS
22
-
23
- BUFFER_LENGTH_NAMES = %i[source_buffer_length destination_buffer_length].freeze
24
- BUFFER_LENGTH_MAPPING = {
25
- :source_buffer_length => :destination_buffer_length,
26
- :destination_buffer_length => :source_buffer_length
27
- }
28
- .freeze
29
-
30
- def test_invalid_arguments
31
- Validation::INVALID_STRINGS.each do |invalid_path|
32
- assert_raises ValidateError do
33
- Target.compress invalid_path, ARCHIVE_PATH
34
- end
35
-
36
- assert_raises ValidateError do
37
- Target.compress SOURCE_PATH, invalid_path
38
- end
39
-
40
- assert_raises ValidateError do
41
- Target.decompress invalid_path, SOURCE_PATH
42
- end
43
-
44
- assert_raises ValidateError do
45
- Target.decompress ARCHIVE_PATH, invalid_path
46
- end
47
- end
48
-
49
- get_invalid_compressor_options do |invalid_options|
50
- assert_raises ValidateError do
51
- Target.compress SOURCE_PATH, ARCHIVE_PATH, invalid_options
52
- end
53
- end
54
-
55
- get_invalid_decompressor_options do |invalid_options|
56
- assert_raises ValidateError do
57
- Target.decompress ARCHIVE_PATH, SOURCE_PATH, invalid_options
58
- end
59
- end
60
- end
61
-
62
- def test_texts
63
- parallel_compressor_options do |compressor_options, worker_index|
64
- source_path = Common.get_path SOURCE_PATH, worker_index
65
- archive_path = Common.get_path ARCHIVE_PATH, worker_index
66
-
67
- TEXTS.each do |text|
68
- ::File.write source_path, text, :mode => "wb"
69
- Target.compress source_path, archive_path, compressor_options
70
-
71
- get_compatible_decompressor_options compressor_options do |decompressor_options|
72
- Target.decompress archive_path, source_path, decompressor_options
73
-
74
- decompressed_text = ::File.read source_path, :mode => "rb"
75
- decompressed_text.force_encoding text.encoding
76
-
77
- assert_equal text, decompressed_text
78
- end
79
- end
80
- end
81
- end
82
-
83
- def test_large_texts
84
- Common.parallel LARGE_TEXTS do |text, worker_index|
85
- source_path = Common.get_path SOURCE_PATH, worker_index
86
- archive_path = Common.get_path ARCHIVE_PATH, worker_index
87
-
88
- ::File.write source_path, text, :mode => "wb"
89
- Target.compress source_path, archive_path
90
- Target.decompress archive_path, source_path
91
-
92
- decompressed_text = ::File.read source_path, :mode => "rb"
93
- decompressed_text.force_encoding text.encoding
94
-
95
- assert_equal text, decompressed_text
96
- end
97
- end
98
-
99
- # -----
100
-
101
- def get_invalid_compressor_options(&block)
102
- self.class::Option.get_invalid_compressor_options BUFFER_LENGTH_NAMES, &block
103
- end
104
-
105
- def get_invalid_decompressor_options(&block)
106
- self.class::Option.get_invalid_decompressor_options BUFFER_LENGTH_NAMES, &block
107
- end
108
-
109
- def parallel_compressor_options(&block)
110
- Common.parallel_options self.class::Option.get_compressor_options_generator(BUFFER_LENGTH_NAMES), &block
111
- end
112
-
113
- def get_compatible_decompressor_options(compressor_options, &block)
114
- self.class::Option.get_compatible_decompressor_options compressor_options, BUFFER_LENGTH_MAPPING, &block
115
- end
116
- end
117
-
118
- Minitest << File
119
- end
120
- end
7
+ Minitest << ADSP::Test::File
@@ -1,50 +1,7 @@
1
1
  # Abstract data stream processor.
2
2
  # Copyright (c) 2021 AUTHORS, MIT License.
3
3
 
4
- require "minitar"
4
+ require "adsp/test/minitest"
5
+ require "adsp/test/stream/minitar"
5
6
 
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
7
+ Minitest << ADSP::Test::Stream::MinitarTest