cbor 0.5.6.2

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 (55) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.travis.yml +5 -0
  4. data/ChangeLog +87 -0
  5. data/README.rdoc +180 -0
  6. data/Rakefile +94 -0
  7. data/cbor.gemspec +26 -0
  8. data/doclib/cbor.rb +80 -0
  9. data/doclib/cbor/buffer.rb +193 -0
  10. data/doclib/cbor/core_ext.rb +133 -0
  11. data/doclib/cbor/error.rb +14 -0
  12. data/doclib/cbor/packer.rb +133 -0
  13. data/doclib/cbor/simple.rb +15 -0
  14. data/doclib/cbor/tagged.rb +16 -0
  15. data/doclib/cbor/unpacker.rb +138 -0
  16. data/ext/cbor/buffer.c +693 -0
  17. data/ext/cbor/buffer.h +469 -0
  18. data/ext/cbor/buffer_class.c +516 -0
  19. data/ext/cbor/buffer_class.h +41 -0
  20. data/ext/cbor/cbor.h +69 -0
  21. data/ext/cbor/compat.h +136 -0
  22. data/ext/cbor/core_ext.c +181 -0
  23. data/ext/cbor/core_ext.h +35 -0
  24. data/ext/cbor/extconf.rb +25 -0
  25. data/ext/cbor/packer.c +169 -0
  26. data/ext/cbor/packer.h +337 -0
  27. data/ext/cbor/packer_class.c +304 -0
  28. data/ext/cbor/packer_class.h +39 -0
  29. data/ext/cbor/rbinit.c +51 -0
  30. data/ext/cbor/renamer.h +56 -0
  31. data/ext/cbor/rmem.c +103 -0
  32. data/ext/cbor/rmem.h +118 -0
  33. data/ext/cbor/sysdep.h +135 -0
  34. data/ext/cbor/sysdep_endian.h +59 -0
  35. data/ext/cbor/sysdep_types.h +55 -0
  36. data/ext/cbor/unpacker.c +735 -0
  37. data/ext/cbor/unpacker.h +133 -0
  38. data/ext/cbor/unpacker_class.c +417 -0
  39. data/ext/cbor/unpacker_class.h +39 -0
  40. data/lib/cbor.rb +9 -0
  41. data/lib/cbor/version.rb +3 -0
  42. data/spec/buffer_io_spec.rb +260 -0
  43. data/spec/buffer_spec.rb +576 -0
  44. data/spec/cases.cbor +0 -0
  45. data/spec/cases.cbor_stream +0 -0
  46. data/spec/cases.json +1 -0
  47. data/spec/cases.msg +0 -0
  48. data/spec/cases_compact.msg +0 -0
  49. data/spec/cases_spec.rb +39 -0
  50. data/spec/format_spec.rb +445 -0
  51. data/spec/packer_spec.rb +127 -0
  52. data/spec/random_compat.rb +24 -0
  53. data/spec/spec_helper.rb +45 -0
  54. data/spec/unpacker_spec.rb +238 -0
  55. metadata +196 -0
@@ -0,0 +1,39 @@
1
+ /*
2
+ * CBOR for Ruby
3
+ *
4
+ * Copyright (C) 2013 Carsten Bormann
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License").
7
+ *
8
+ * Based on:
9
+ ***********/
10
+ /*
11
+ * MessagePack for Ruby
12
+ *
13
+ * Copyright (C) 2008-2013 Sadayuki Furuhashi
14
+ *
15
+ * Licensed under the Apache License, Version 2.0 (the "License");
16
+ * you may not use this file except in compliance with the License.
17
+ * You may obtain a copy of the License at
18
+ *
19
+ * http://www.apache.org/licenses/LICENSE-2.0
20
+ *
21
+ * Unless required by applicable law or agreed to in writing, software
22
+ * distributed under the License is distributed on an "AS IS" BASIS,
23
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24
+ * See the License for the specific language governing permissions and
25
+ * limitations under the License.
26
+ */
27
+ #ifndef MSGPACK_RUBY_UNPACKER_CLASS_H__
28
+ #define MSGPACK_RUBY_UNPACKER_CLASS_H__
29
+
30
+ #include "unpacker.h"
31
+
32
+ extern VALUE cMessagePack_Unpacker;
33
+
34
+ void MessagePack_Unpacker_module_init(VALUE mMessagePack);
35
+
36
+ VALUE MessagePack_unpack(int argc, VALUE* argv);
37
+
38
+ #endif
39
+
data/lib/cbor.rb ADDED
@@ -0,0 +1,9 @@
1
+ here = File.expand_path(File.dirname(__FILE__))
2
+ require File.join(here, 'cbor', 'version')
3
+ begin
4
+ m = /(\d+.\d+)/.match(RUBY_VERSION)
5
+ ver = m[1]
6
+ require File.join(here, 'cbor', ver, 'cbor')
7
+ rescue LoadError
8
+ require File.join(here, 'cbor', 'cbor')
9
+ end
@@ -0,0 +1,3 @@
1
+ module CBOR
2
+ VERSION = "0.5.6.2"
3
+ end
@@ -0,0 +1,260 @@
1
+ require 'spec_helper'
2
+ require 'random_compat'
3
+
4
+ require 'stringio'
5
+ if defined?(Encoding)
6
+ Encoding.default_external = 'ASCII-8BIT'
7
+ end
8
+
9
+ describe Buffer do
10
+ r = Random.new
11
+ random_seed = r.seed
12
+ puts "buffer_io random seed: 0x#{random_seed.to_s(16)}"
13
+
14
+ let :source do
15
+ ''
16
+ end
17
+
18
+ def set_source(s)
19
+ source.replace(s)
20
+ end
21
+
22
+ let :io do
23
+ StringIO.new(source.dup)
24
+ end
25
+
26
+ let :buffer do
27
+ Buffer.new(io)
28
+ end
29
+
30
+ let :repetition do
31
+ ENV['SLOW'] ? 3 : 50
32
+ end
33
+
34
+ it 'io returns internal io' do
35
+ buffer.io.should == io
36
+ end
37
+
38
+ it 'close closes internal io' do
39
+ io.should_receive(:close)
40
+ buffer.close
41
+ end
42
+
43
+ it 'short feed and read all' do
44
+ set_source 'aa'
45
+ buffer.read.should == 'aa'
46
+ end
47
+
48
+ it 'short feed and read short' do
49
+ set_source 'aa'
50
+ buffer.read(1).should == 'a'
51
+ buffer.read(1).should == 'a'
52
+ buffer.read(1).should == nil
53
+ end
54
+
55
+ it 'long feed and read all' do
56
+ set_source ' '*(1024*1024)
57
+ s = buffer.read
58
+ s.size.should == source.size
59
+ s.should == source
60
+ end
61
+
62
+ it 'long feed and read mixed' do
63
+ set_source ' '*(1024*1024)
64
+ buffer.read(10).should == source.slice!(0, 10)
65
+ buffer.read(10).should == source.slice!(0, 10)
66
+ buffer.read(10).should == source.slice!(0, 10)
67
+ s = buffer.read
68
+ s.size.should == source.size
69
+ s.should == source
70
+ end
71
+
72
+ it 'eof' do
73
+ set_source ''
74
+ buffer.read.should == ''
75
+ end
76
+
77
+ it 'eof 2' do
78
+ set_source 'a'
79
+ buffer.read.should == 'a'
80
+ buffer.read.should == ''
81
+ end
82
+
83
+ it 'write short once and flush' do
84
+ buffer.write('aa')
85
+ buffer.flush
86
+ io.string.should == 'aa'
87
+ end
88
+
89
+ it 'write short twice and flush' do
90
+ buffer.write('a')
91
+ buffer.write('a')
92
+ buffer.flush
93
+ io.string.should == 'aa'
94
+ end
95
+
96
+ it 'write long once and flush' do
97
+ s = ' '*(1024*1024)
98
+ buffer.write s
99
+ buffer.flush
100
+ io.string.size.should == s.size
101
+ io.string.should == s
102
+ end
103
+
104
+ it 'write short multi and flush' do
105
+ s = ' '*(1024*1024)
106
+ 1024.times {
107
+ buffer.write ' '*1024
108
+ }
109
+ buffer.flush
110
+ io.string.size.should == s.size
111
+ io.string.should == s
112
+ end
113
+
114
+ it 'random read' do
115
+ r = Random.new(random_seed)
116
+
117
+ repetition.times {
118
+ fragments = []
119
+
120
+ r.rand(4).times do
121
+ n = r.rand(1024*1400)
122
+ s = r.bytes(n)
123
+ fragments << s
124
+ end
125
+
126
+ io = StringIO.new(fragments.join)
127
+ b = Buffer.new(io)
128
+
129
+ fragments.each {|s|
130
+ x = b.read(s.size)
131
+ x.size.should == s.size
132
+ x.should == s
133
+ }
134
+ b.empty?.should == true
135
+ b.read.should == ''
136
+ }
137
+ end
138
+
139
+ it 'random read_all' do
140
+ r = Random.new(random_seed)
141
+
142
+ repetition.times {
143
+ fragments = []
144
+ sx = r.bytes(0)
145
+
146
+ r.rand(4).times do
147
+ n = r.rand(1024*1400)
148
+ s = r.bytes(n)
149
+ fragments << s
150
+ end
151
+
152
+ io = StringIO.new(fragments.join)
153
+ b = Buffer.new(io)
154
+
155
+ fragments.each {|s|
156
+ x = b.read_all(s.size)
157
+ x.size.should == s.size
158
+ x.should == s
159
+ }
160
+ b.empty?.should == true
161
+ lambda {
162
+ b.read_all(1)
163
+ }.should raise_error(EOFError)
164
+ }
165
+ end
166
+
167
+ it 'random skip' do
168
+ r = Random.new(random_seed)
169
+
170
+ repetition.times {
171
+ fragments = []
172
+
173
+ r.rand(4).times do
174
+ n = r.rand(1024*1400)
175
+ s = r.bytes(n)
176
+ fragments << s
177
+ end
178
+
179
+ io = StringIO.new(fragments.join)
180
+ b = Buffer.new(io)
181
+
182
+ fragments.each {|s|
183
+ b.skip(s.size).should == s.size
184
+ }
185
+ b.empty?.should == true
186
+ b.skip(1).should == 0
187
+ }
188
+ end
189
+
190
+ it 'random skip_all' do
191
+ r = Random.new(random_seed)
192
+
193
+ repetition.times {
194
+ fragments = []
195
+
196
+ r.rand(4).times do
197
+ n = r.rand(1024*1400)
198
+ s = r.bytes(n)
199
+ fragments << s
200
+ end
201
+
202
+ io = StringIO.new(fragments.join)
203
+ b = Buffer.new(io)
204
+
205
+ fragments.each {|s|
206
+ lambda {
207
+ b.skip_all(s.size)
208
+ }.should_not raise_error()
209
+ }
210
+ b.empty?.should == true
211
+ lambda {
212
+ b.skip_all(1)
213
+ }.should raise_error(EOFError)
214
+ }
215
+ end
216
+
217
+ it 'random write and flush' do
218
+ r = Random.new(random_seed)
219
+
220
+ repetition.times {
221
+ s = r.bytes(0)
222
+ io = StringIO.new
223
+ b = Buffer.new(io)
224
+
225
+ r.rand(4).times do
226
+ n = r.rand(1024*1400)
227
+ x = r.bytes(n)
228
+ s << x
229
+ b.write(x)
230
+ end
231
+
232
+ (io.string.size + b.size).should == s.size
233
+
234
+ b.flush
235
+
236
+ io.string.size.should == s.size
237
+ io.string.should == s
238
+ }
239
+ end
240
+
241
+ it 'random write and clear' do
242
+ r = Random.new(random_seed)
243
+ b = Buffer.new
244
+
245
+ repetition.times {
246
+ s = r.bytes(0)
247
+
248
+ r.rand(4).times do
249
+ n = r.rand(1024*1400)
250
+ x = r.bytes(n)
251
+ s << x
252
+ b.write(x)
253
+ end
254
+
255
+ b.size.should == s.size
256
+ b.clear
257
+ }
258
+ end
259
+ end
260
+
@@ -0,0 +1,576 @@
1
+ require 'spec_helper'
2
+ require 'random_compat'
3
+
4
+ describe Buffer do
5
+ STATIC_EXAMPLES = {}
6
+ STATIC_EXAMPLES[:empty01] = ''
7
+ STATIC_EXAMPLES[:empty02] = ''
8
+ STATIC_EXAMPLES[:copy01] = 'short'
9
+ STATIC_EXAMPLES[:copy02] = 'short'*2
10
+ STATIC_EXAMPLES[:ref01] = 'short'*128
11
+ STATIC_EXAMPLES[:ref02] = 'short'*128*2
12
+ STATIC_EXAMPLES[:ref03] = 'a'*((1024*1024+2)*2)
13
+ STATIC_EXAMPLES[:refcopy01] = 'short'*128
14
+ STATIC_EXAMPLES[:expand01] = 'short'*1024
15
+ STATIC_EXAMPLES[:expand02] = 'short'*(127+1024)
16
+ STATIC_EXAMPLES[:offset01] = 'ort'+'short'
17
+ STATIC_EXAMPLES[:offset02] = 'ort'+'short'*127
18
+ STATIC_EXAMPLES[:offset03] = 'ort'+'short'*(126+1024)
19
+
20
+ if ''.respond_to?(:force_encoding)
21
+ STATIC_EXAMPLES.each_value {|v| v.force_encoding('ASCII-8BIT') }
22
+ end
23
+ STATIC_EXAMPLES.each_value {|v| v.freeze }
24
+
25
+ r = Random.new
26
+ random_seed = r.seed
27
+ puts "buffer random seed: 0x#{random_seed.to_s(16)}"
28
+
29
+ let :repetition do
30
+ ENV['SLOW'] ? 2 : 10
31
+ end
32
+
33
+ let :random_cases_examples do
34
+ r = Random.new(random_seed)
35
+ cases = {}
36
+ examples = {}
37
+
38
+ repetition.times do |i|
39
+ b = Buffer.new
40
+ s = r.bytes(0)
41
+ r.rand(3).times do
42
+ n = r.rand(1024*1400)
43
+ x = r.bytes(n)
44
+ s << x
45
+ b << x
46
+ end
47
+ r.rand(2).times do
48
+ n = r.rand(1024*1400)
49
+ b.read(n)
50
+ s.slice!(0, n)
51
+ end
52
+ key = :"random#{"%02d"%i}"
53
+ cases[key] = b
54
+ examples[key] = s
55
+ end
56
+
57
+ [cases, examples]
58
+ end
59
+
60
+ let :static_cases do
61
+ map = {}
62
+ map[:empty01] = empty01
63
+ map[:empty02] = empty02
64
+ map[:copy01] = copy01
65
+ map[:copy02] = copy02
66
+ map[:ref01] = ref01
67
+ map[:ref02] = ref02
68
+ map[:ref03] = ref03
69
+ map[:refcopy01] = refcopy01
70
+ map[:expand01] = expand01
71
+ map[:expand02] = expand02
72
+ map[:offset01] = offset01
73
+ map[:offset02] = offset02
74
+ map[:offset03] = offset03
75
+ map
76
+ end
77
+
78
+ let :static_examples do
79
+ STATIC_EXAMPLES
80
+ end
81
+
82
+ let :random_cases do
83
+ random_cases_examples[0]
84
+ end
85
+
86
+ let :random_examples do
87
+ random_cases_examples[1]
88
+ end
89
+
90
+ let :cases do
91
+ static_cases.merge(random_cases)
92
+ end
93
+
94
+ let :examples do
95
+ static_examples.merge(random_examples)
96
+ end
97
+
98
+ let :case_keys do
99
+ examples.keys
100
+ end
101
+
102
+ let :empty01 do
103
+ Buffer.new
104
+ end
105
+
106
+ let :empty02 do
107
+ b = Buffer.new
108
+ b << 'a'
109
+ b.read_all(1)
110
+ b
111
+ end
112
+
113
+ let :copy01 do
114
+ # one copy chunk
115
+ b = Buffer.new
116
+ b << 'short'
117
+ b
118
+ end
119
+
120
+ let :copy02 do
121
+ # one copy chunk
122
+ b = Buffer.new
123
+ b << 'short'
124
+ b << 'short'
125
+ b
126
+ end
127
+
128
+ let :expand02 do
129
+ # one copy chunk / expanded
130
+ b = Buffer.new
131
+ 1024.times do
132
+ b << 'short'
133
+ end
134
+ b
135
+ end
136
+
137
+ let :ref01 do
138
+ # one reference chunk
139
+ b = Buffer.new
140
+ b << 'short'*128
141
+ b.to_s
142
+ b
143
+ end
144
+
145
+ let :ref02 do
146
+ # two reference chunks
147
+ b = Buffer.new
148
+ b << 'short'*128
149
+ b.to_s
150
+ b << 'short'*128
151
+ b.to_a
152
+ b
153
+ end
154
+
155
+ let :ref03 do
156
+ # two reference chunks
157
+ b = Buffer.new
158
+ b << 'a'*(1024*1024+2)
159
+ b << 'a'*(1024*1024+2)
160
+ b
161
+ end
162
+
163
+ let :refcopy01 do
164
+ # one reference chunk + one copy chunk
165
+ b = Buffer.new
166
+ b << 'short'*127
167
+ b.to_s
168
+ b << 'short'
169
+ b
170
+ end
171
+
172
+ let :expand01 do
173
+ # one copy chunk / expanded
174
+ b = Buffer.new
175
+ 1024.times do
176
+ b << 'short'
177
+ end
178
+ b
179
+ end
180
+
181
+ let :expand02 do
182
+ # one reference chunk + one copy chunk / expanded
183
+ b = Buffer.new
184
+ b << 'short'*127
185
+ b.to_s
186
+ 1024.times do
187
+ b << 'short'
188
+ end
189
+ b
190
+ end
191
+
192
+ let :offset01 do
193
+ # one copy chunk / offset
194
+ b = Buffer.new
195
+ b << 'short'
196
+ b << 'short'
197
+ b.skip(2)
198
+ b
199
+ end
200
+
201
+ let :offset02 do
202
+ # one reference chunk / offset
203
+ b = Buffer.new
204
+ b << 'short'*127
205
+ b.to_s
206
+ b.skip(2)
207
+ b << 'short'
208
+ b
209
+ end
210
+
211
+ let :offset03 do
212
+ # one reference chunk / offset + one copy chunk / expanded
213
+ b = Buffer.new
214
+ b << 'short'*127
215
+ b.to_s
216
+ 1024.times do
217
+ b << 'short'
218
+ end
219
+ b.skip(2)
220
+ b
221
+ end
222
+
223
+ it 'empty?' do
224
+ empty01.empty?.should == true
225
+ empty02.empty?.should == true
226
+ end
227
+
228
+ it 'size' do
229
+ case_keys.each {|k|
230
+ cases[k].size.should == examples[k].size
231
+ }
232
+ end
233
+
234
+ it 'short write increments size' do
235
+ case_keys.each {|k|
236
+ sz = examples[k].size
237
+ 10.times do |i|
238
+ cases[k].write 'short'
239
+ sz += 'short'.size
240
+ cases[k].size.should == sz
241
+ end
242
+ }
243
+ end
244
+
245
+ it 'read with limit decrements size' do
246
+ case_keys.each {|k|
247
+ sz = examples[k].size
248
+ next if sz < 2
249
+
250
+ cases[k].read(1).should == examples[k][0,1]
251
+ sz -= 1
252
+ cases[k].size.should == sz
253
+
254
+ cases[k].read(1).should == examples[k][1,1]
255
+ sz -= 1
256
+ cases[k].size.should == sz
257
+ }
258
+ end
259
+
260
+ it 'read_all with limit decrements size' do
261
+ case_keys.each {|k|
262
+ sz = examples[k].size
263
+ next if sz < 2
264
+
265
+ cases[k].read_all(1).should == examples[k][0,1]
266
+ sz -= 1
267
+ cases[k].size.should == sz
268
+
269
+ cases[k].read_all(1).should == examples[k][1,1]
270
+ sz -= 1
271
+ cases[k].size.should == sz
272
+ }
273
+ end
274
+
275
+ it 'skip decrements size' do
276
+ case_keys.each {|k|
277
+ sz = examples[k].size
278
+ next if sz < 2
279
+
280
+ cases[k].skip(1).should == 1
281
+ sz -= 1
282
+ cases[k].size.should == sz
283
+
284
+ cases[k].skip(1).should == 1
285
+ sz -= 1
286
+ cases[k].size.should == sz
287
+ }
288
+ end
289
+
290
+ it 'skip_all decrements size' do
291
+ case_keys.each {|k|
292
+ sz = examples[k].size
293
+ next if sz < 2
294
+
295
+ cases[k].skip_all(1)
296
+ sz -= 1
297
+ cases[k].size.should == sz
298
+
299
+ cases[k].skip_all(1)
300
+ sz -= 1
301
+ cases[k].size.should == sz
302
+ }
303
+ end
304
+
305
+ it 'read_all against insufficient buffer raises EOFError and consumes nothing' do
306
+ case_keys.each {|k|
307
+ sz = examples[k].size
308
+ lambda {
309
+ cases[k].read_all(sz+1)
310
+ }.should raise_error(EOFError)
311
+ cases[k].size.should == sz
312
+ }
313
+ end
314
+
315
+ it 'skip_all against insufficient buffer raises EOFError and consumes nothing' do
316
+ case_keys.each {|k|
317
+ sz = examples[k].size
318
+ lambda {
319
+ cases[k].skip_all(sz+1)
320
+ }.should raise_error(EOFError)
321
+ cases[k].size.should == sz
322
+ }
323
+ end
324
+
325
+ it 'read against insufficient buffer consumes all buffer or return nil' do
326
+ case_keys.each {|k|
327
+ sz = examples[k].size
328
+ if sz == 0
329
+ cases[k].read(sz+1).should == nil
330
+ else
331
+ cases[k].read(sz+1).should == examples[k]
332
+ end
333
+ cases[k].size.should == 0
334
+ }
335
+ end
336
+
337
+ it 'skip against insufficient buffer consumes all buffer' do
338
+ case_keys.each {|k|
339
+ sz = examples[k].size
340
+ cases[k].skip(sz+1).should == examples[k].size
341
+ cases[k].size.should == 0
342
+ }
343
+ end
344
+
345
+ it 'read with no arguments consumes all buffer and returns string and do not return nil' do
346
+ case_keys.each {|k|
347
+ cases[k].read_all.should == examples[k]
348
+ cases[k].size.should == 0
349
+ }
350
+ end
351
+
352
+ it 'read_all with no arguments consumes all buffer and returns string' do
353
+ case_keys.each {|k|
354
+ cases[k].read_all.should == examples[k]
355
+ cases[k].size.should == 0
356
+ }
357
+ end
358
+
359
+ it 'to_s returns a string and consume nothing' do
360
+ case_keys.each {|k|
361
+ cases[k].to_s.should == examples[k]
362
+ cases[k].size.should == examples[k].size
363
+ }
364
+ end
365
+
366
+ it 'to_s and modify' do
367
+ case_keys.each {|k|
368
+ s = cases[k].to_s
369
+ s << 'x'
370
+ cases[k].to_s.should == examples[k]
371
+ }
372
+ end
373
+
374
+ it 'big write and modify reference' do
375
+ big2 = "a" * (1024*1024 + 2)
376
+
377
+ case_keys.each {|k|
378
+ big1 = "a" * (1024*1024 + 2)
379
+ cases[k].write(big1)
380
+ big1 << 'x'
381
+ cases[k].read.should == examples[k] + big2
382
+ }
383
+ end
384
+
385
+ it 'big write -> short write' do
386
+ biglen = 1024*1024 + 2
387
+ big1 = "a" * (1024*1024 + 2)
388
+
389
+ case_keys.each {|k|
390
+ sz = examples[k].size
391
+
392
+ cases[k].write big1
393
+ cases[k].size.should == sz + big1.size
394
+
395
+ cases[k].write("c")
396
+ cases[k].size.should == sz + big1.size + 1
397
+
398
+ cases[k].read_all.should == examples[k] + big1 + "c"
399
+ cases[k].size.should == 0
400
+ cases[k].empty?.should == true
401
+ }
402
+ end
403
+
404
+ it 'big write 2'do
405
+ big1 = "a" * (1024*1024 + 2)
406
+ big2 = "b" * (1024*1024 + 2)
407
+
408
+ case_keys.each {|k|
409
+ sz = examples[k].size
410
+
411
+ cases[k].write big1
412
+ cases[k].write big2
413
+ cases[k].size.should == sz + big1.size + big2.size
414
+
415
+ cases[k].read_all(sz + big1.size).should == examples[k] + big1
416
+ cases[k].size.should == big2.size
417
+
418
+ cases[k].read.should == big2
419
+ cases[k].size.should == 0
420
+ cases[k].empty?.should == true
421
+ }
422
+ end
423
+
424
+ it 'read 0' do
425
+ case_keys.each {|k|
426
+ cases[k].read(0).should == ''
427
+ cases[k].read.should == examples[k]
428
+ }
429
+ end
430
+
431
+ it 'skip 0' do
432
+ case_keys.each {|k|
433
+ cases[k].skip(0).should == 0
434
+ cases[k].read.should == examples[k]
435
+ }
436
+ end
437
+
438
+ it 'read_all 0' do
439
+ case_keys.each {|k|
440
+ cases[k].read_all(0).should == ''
441
+ cases[k].read_all.should == examples[k]
442
+ }
443
+ end
444
+
445
+ it 'skip_all 0' do
446
+ case_keys.each {|k|
447
+ cases[k].skip_all(0)
448
+ cases[k].read_all.should == examples[k]
449
+ }
450
+ end
451
+
452
+ it 'write_to' do
453
+ case_keys.each {|k|
454
+ sio = StringIO.new
455
+ cases[k].write_to(sio).should == examples[k].size
456
+ cases[k].size.should == 0
457
+ sio.string.should == examples[k]
458
+ }
459
+ end
460
+
461
+ it 'random read/write' do
462
+ r = Random.new(random_seed)
463
+ s = r.bytes(0)
464
+ b = Buffer.new
465
+
466
+ 10.times {
467
+ # write
468
+ r.rand(4).times do
469
+ n = r.rand(1024*1400)
470
+ x = r.bytes(n)
471
+ s << x
472
+ b.write(x)
473
+ end
474
+
475
+ # read
476
+ r.rand(3).times do
477
+ n = r.rand(1024*1400)
478
+ ex = s.slice!(0, n)
479
+ ex = nil if ex.empty?
480
+ x = b.read(n)
481
+ x.size == ex.size if x != nil
482
+ x.should == ex
483
+ b.size.should == s.size
484
+ end
485
+ }
486
+ end
487
+
488
+ it 'random read_all/write' do
489
+ r = Random.new(random_seed)
490
+ s = r.bytes(0)
491
+ b = Buffer.new
492
+
493
+ 10.times {
494
+ # write
495
+ r.rand(4).times do
496
+ n = r.rand(1024*1400)
497
+ x = r.bytes(n)
498
+ s << x
499
+ b.write(x)
500
+ end
501
+
502
+ # read_all
503
+ r.rand(3).times do
504
+ n = r.rand(1024*1400)
505
+ begin
506
+ x = b.read_all(n)
507
+ ex = s.slice!(0, n)
508
+ x.size == n
509
+ x.should == ex
510
+ b.size.should == s.size
511
+ rescue EOFError
512
+ b.size.should == s.size
513
+ b.read.should == s
514
+ s.clear
515
+ break
516
+ end
517
+ end
518
+ }
519
+ end
520
+
521
+ it 'random skip write' do
522
+ r = Random.new(random_seed)
523
+ s = r.bytes(0)
524
+ b = Buffer.new
525
+
526
+ 10.times {
527
+ # write
528
+ r.rand(4).times do
529
+ n = r.rand(1024*1400)
530
+ x = r.bytes(n)
531
+ s << x
532
+ b.write(x)
533
+ end
534
+
535
+ # skip
536
+ r.rand(3).times do
537
+ n = r.rand(1024*1400)
538
+ ex = s.slice!(0, n)
539
+ b.skip(n).should == ex.size
540
+ b.size.should == s.size
541
+ end
542
+ }
543
+ end
544
+
545
+ it 'random skip_all write' do
546
+ r = Random.new(random_seed)
547
+ s = r.bytes(0)
548
+ b = Buffer.new
549
+
550
+ 10.times {
551
+ # write
552
+ r.rand(4).times do
553
+ n = r.rand(1024*1400)
554
+ x = r.bytes(n)
555
+ s << x
556
+ b.write(x)
557
+ end
558
+
559
+ # skip_all
560
+ r.rand(3).times do
561
+ n = r.rand(1024*1400)
562
+ begin
563
+ b.skip_all(n)
564
+ ex = s.slice!(0, n)
565
+ b.size.should == s.size
566
+ ensure EOFError
567
+ b.size.should == s.size
568
+ b.read.should == s
569
+ s.clear
570
+ break
571
+ end
572
+ end
573
+ }
574
+ end
575
+ end
576
+