msgpack 0.5.10-java
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.
- checksums.yaml +7 -0
- data/lib/msgpack.rb +13 -0
- data/lib/msgpack/msgpack.jar +0 -0
- data/lib/msgpack/version.rb +3 -0
- data/spec/cases.json +1 -0
- data/spec/cases.msg +0 -0
- data/spec/cases_compact.msg +0 -0
- data/spec/cases_spec.rb +39 -0
- data/spec/cruby/buffer_io_spec.rb +256 -0
- data/spec/cruby/buffer_packer.rb +29 -0
- data/spec/cruby/buffer_spec.rb +572 -0
- data/spec/cruby/buffer_unpacker.rb +19 -0
- data/spec/cruby/packer_spec.rb +120 -0
- data/spec/cruby/unpacker_spec.rb +299 -0
- data/spec/format_spec.rb +227 -0
- data/spec/jruby/benchmarks/shootout_bm.rb +73 -0
- data/spec/jruby/benchmarks/symbolize_keys_bm.rb +25 -0
- data/spec/jruby/msgpack/unpacker_spec.rb +290 -0
- data/spec/jruby/msgpack_spec.rb +136 -0
- data/spec/pack_spec.rb +67 -0
- data/spec/random_compat.rb +24 -0
- data/spec/spec_helper.rb +27 -0
- data/spec/unpack_spec.rb +72 -0
- metadata +172 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d07eeab3d2c7fc9c0d225855561ccc9ad55cb7cb
|
4
|
+
data.tar.gz: 4e6a1646d60d10aa49a5cc65d190dac4ef5de39e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 53ee1f839a89bd60d9f3b80d053391973e5729cf106b5e3ef62cb53c954c62964bf62a6f76ca3754a152e1e025edcc81465742b7859fc342636a40353068895f
|
7
|
+
data.tar.gz: d997c52d92fa6e744e567d0a17f52c24f4b6804963308b1bb0a96fdfba4b0c8b71708b814ab0df584de194e058599acab591e3a6c6517511134721f4f2b921c9
|
data/lib/msgpack.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require "msgpack/version"
|
2
|
+
|
3
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby" # This is same with `/java/ =~ RUBY_VERSION`
|
4
|
+
require "java"
|
5
|
+
require "msgpack/msgpack.jar"
|
6
|
+
org.msgpack.jruby.MessagePackLibrary.new.load(JRuby.runtime, false)
|
7
|
+
else
|
8
|
+
begin
|
9
|
+
require "msgpack/#{RUBY_VERSION[/\d+.\d+/]}/msgpack"
|
10
|
+
rescue LoadError
|
11
|
+
require "msgpack/msgpack"
|
12
|
+
end
|
13
|
+
end
|
Binary file
|
data/spec/cases.json
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
[false,true,null,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,127,127,255,65535,4294967295,-32,-32,-128,-32768,-2147483648,0.0,-0.0,1.0,-1.0,"a","a","a","","","",[0],[0],[0],[],[],[],{},{},{},{"a":97},{"a":97},{"a":97},[[]],[["a"]]]
|
data/spec/cases.msg
ADDED
Binary file
|
Binary file
|
data/spec/cases_spec.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
describe MessagePack do
|
5
|
+
here = File.dirname(__FILE__)
|
6
|
+
CASES = File.read("#{here}/cases.msg")
|
7
|
+
CASES_JSON = File.read("#{here}/cases.json")
|
8
|
+
CASES_COMPACT = File.read("#{here}/cases_compact.msg")
|
9
|
+
|
10
|
+
it 'compare with json' do
|
11
|
+
ms = []
|
12
|
+
MessagePack::Unpacker.new.feed_each(CASES) {|m|
|
13
|
+
ms << m
|
14
|
+
}
|
15
|
+
|
16
|
+
js = JSON.load(CASES_JSON)
|
17
|
+
|
18
|
+
ms.zip(js) {|m,j|
|
19
|
+
m.should == j
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'compare with compat' do
|
24
|
+
ms = []
|
25
|
+
MessagePack::Unpacker.new.feed_each(CASES) {|m|
|
26
|
+
ms << m
|
27
|
+
}
|
28
|
+
|
29
|
+
cs = []
|
30
|
+
MessagePack::Unpacker.new.feed_each(CASES_COMPACT) {|c|
|
31
|
+
cs << c
|
32
|
+
}
|
33
|
+
|
34
|
+
ms.zip(cs) {|m,c|
|
35
|
+
m.should == c
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,256 @@
|
|
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
|
+
it 'io returns internal io' do
|
31
|
+
buffer.io.should == io
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'close closes internal io' do
|
35
|
+
io.should_receive(:close)
|
36
|
+
buffer.close
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'short feed and read all' do
|
40
|
+
set_source 'aa'
|
41
|
+
buffer.read.should == 'aa'
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'short feed and read short' do
|
45
|
+
set_source 'aa'
|
46
|
+
buffer.read(1).should == 'a'
|
47
|
+
buffer.read(1).should == 'a'
|
48
|
+
buffer.read(1).should == nil
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'long feed and read all' do
|
52
|
+
set_source ' '*(1024*1024)
|
53
|
+
s = buffer.read
|
54
|
+
s.size.should == source.size
|
55
|
+
s.should == source
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'long feed and read mixed' do
|
59
|
+
set_source ' '*(1024*1024)
|
60
|
+
buffer.read(10).should == source.slice!(0, 10)
|
61
|
+
buffer.read(10).should == source.slice!(0, 10)
|
62
|
+
buffer.read(10).should == source.slice!(0, 10)
|
63
|
+
s = buffer.read
|
64
|
+
s.size.should == source.size
|
65
|
+
s.should == source
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'eof' do
|
69
|
+
set_source ''
|
70
|
+
buffer.read.should == ''
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'eof 2' do
|
74
|
+
set_source 'a'
|
75
|
+
buffer.read.should == 'a'
|
76
|
+
buffer.read.should == ''
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'write short once and flush' do
|
80
|
+
buffer.write('aa')
|
81
|
+
buffer.flush
|
82
|
+
io.string.should == 'aa'
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'write short twice and flush' do
|
86
|
+
buffer.write('a')
|
87
|
+
buffer.write('a')
|
88
|
+
buffer.flush
|
89
|
+
io.string.should == 'aa'
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'write long once and flush' do
|
93
|
+
s = ' '*(1024*1024)
|
94
|
+
buffer.write s
|
95
|
+
buffer.flush
|
96
|
+
io.string.size.should == s.size
|
97
|
+
io.string.should == s
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'write short multi and flush' do
|
101
|
+
s = ' '*(1024*1024)
|
102
|
+
1024.times {
|
103
|
+
buffer.write ' '*1024
|
104
|
+
}
|
105
|
+
buffer.flush
|
106
|
+
io.string.size.should == s.size
|
107
|
+
io.string.should == s
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'random read' do
|
111
|
+
r = Random.new(random_seed)
|
112
|
+
|
113
|
+
50.times {
|
114
|
+
fragments = []
|
115
|
+
|
116
|
+
r.rand(4).times do
|
117
|
+
n = r.rand(1024*1400)
|
118
|
+
s = r.bytes(n)
|
119
|
+
fragments << s
|
120
|
+
end
|
121
|
+
|
122
|
+
io = StringIO.new(fragments.join)
|
123
|
+
b = Buffer.new(io)
|
124
|
+
|
125
|
+
fragments.each {|s|
|
126
|
+
x = b.read(s.size)
|
127
|
+
x.size.should == s.size
|
128
|
+
x.should == s
|
129
|
+
}
|
130
|
+
b.empty?.should == true
|
131
|
+
b.read.should == ''
|
132
|
+
}
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'random read_all' do
|
136
|
+
r = Random.new(random_seed)
|
137
|
+
|
138
|
+
50.times {
|
139
|
+
fragments = []
|
140
|
+
sx = r.bytes(0)
|
141
|
+
|
142
|
+
r.rand(4).times do
|
143
|
+
n = r.rand(1024*1400)
|
144
|
+
s = r.bytes(n)
|
145
|
+
fragments << s
|
146
|
+
end
|
147
|
+
|
148
|
+
io = StringIO.new(fragments.join)
|
149
|
+
b = Buffer.new(io)
|
150
|
+
|
151
|
+
fragments.each {|s|
|
152
|
+
x = b.read_all(s.size)
|
153
|
+
x.size.should == s.size
|
154
|
+
x.should == s
|
155
|
+
}
|
156
|
+
b.empty?.should == true
|
157
|
+
lambda {
|
158
|
+
b.read_all(1)
|
159
|
+
}.should raise_error(EOFError)
|
160
|
+
}
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'random skip' do
|
164
|
+
r = Random.new(random_seed)
|
165
|
+
|
166
|
+
50.times {
|
167
|
+
fragments = []
|
168
|
+
|
169
|
+
r.rand(4).times do
|
170
|
+
n = r.rand(1024*1400)
|
171
|
+
s = r.bytes(n)
|
172
|
+
fragments << s
|
173
|
+
end
|
174
|
+
|
175
|
+
io = StringIO.new(fragments.join)
|
176
|
+
b = Buffer.new(io)
|
177
|
+
|
178
|
+
fragments.each {|s|
|
179
|
+
b.skip(s.size).should == s.size
|
180
|
+
}
|
181
|
+
b.empty?.should == true
|
182
|
+
b.skip(1).should == 0
|
183
|
+
}
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'random skip_all' do
|
187
|
+
r = Random.new(random_seed)
|
188
|
+
|
189
|
+
50.times {
|
190
|
+
fragments = []
|
191
|
+
|
192
|
+
r.rand(4).times do
|
193
|
+
n = r.rand(1024*1400)
|
194
|
+
s = r.bytes(n)
|
195
|
+
fragments << s
|
196
|
+
end
|
197
|
+
|
198
|
+
io = StringIO.new(fragments.join)
|
199
|
+
b = Buffer.new(io)
|
200
|
+
|
201
|
+
fragments.each {|s|
|
202
|
+
lambda {
|
203
|
+
b.skip_all(s.size)
|
204
|
+
}.should_not raise_error
|
205
|
+
}
|
206
|
+
b.empty?.should == true
|
207
|
+
lambda {
|
208
|
+
b.skip_all(1)
|
209
|
+
}.should raise_error(EOFError)
|
210
|
+
}
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'random write and flush' do
|
214
|
+
r = Random.new(random_seed)
|
215
|
+
|
216
|
+
50.times {
|
217
|
+
s = r.bytes(0)
|
218
|
+
io = StringIO.new
|
219
|
+
b = Buffer.new(io)
|
220
|
+
|
221
|
+
r.rand(4).times do
|
222
|
+
n = r.rand(1024*1400)
|
223
|
+
x = r.bytes(n)
|
224
|
+
s << x
|
225
|
+
b.write(x)
|
226
|
+
end
|
227
|
+
|
228
|
+
(io.string.size + b.size).should == s.size
|
229
|
+
|
230
|
+
b.flush
|
231
|
+
|
232
|
+
io.string.size.should == s.size
|
233
|
+
io.string.should == s
|
234
|
+
}
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'random write and clear' do
|
238
|
+
r = Random.new(random_seed)
|
239
|
+
b = Buffer.new
|
240
|
+
|
241
|
+
50.times {
|
242
|
+
s = r.bytes(0)
|
243
|
+
|
244
|
+
r.rand(4).times do
|
245
|
+
n = r.rand(1024*1400)
|
246
|
+
x = r.bytes(n)
|
247
|
+
s << x
|
248
|
+
b.write(x)
|
249
|
+
end
|
250
|
+
|
251
|
+
b.size.should == s.size
|
252
|
+
b.clear
|
253
|
+
}
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: ascii-8bit
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
require 'stringio'
|
5
|
+
if defined?(Encoding)
|
6
|
+
Encoding.default_external = 'ASCII-8BIT'
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Packer do
|
10
|
+
let :packer do
|
11
|
+
Packer.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'initialize' do
|
15
|
+
Packer.new
|
16
|
+
Packer.new(nil)
|
17
|
+
Packer.new(StringIO.new)
|
18
|
+
Packer.new({})
|
19
|
+
Packer.new(StringIO.new, {})
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'buffer' do
|
23
|
+
o1 = packer.buffer.object_id
|
24
|
+
packer.buffer << 'frsyuki'
|
25
|
+
packer.buffer.to_s.should == 'frsyuki'
|
26
|
+
packer.buffer.object_id.should == o1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,572 @@
|
|
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 :random_cases_examples do
|
30
|
+
r = Random.new(random_seed)
|
31
|
+
cases = {}
|
32
|
+
examples = {}
|
33
|
+
|
34
|
+
10.times do |i|
|
35
|
+
b = Buffer.new
|
36
|
+
s = r.bytes(0)
|
37
|
+
r.rand(3).times do
|
38
|
+
n = r.rand(1024*1400)
|
39
|
+
x = r.bytes(n)
|
40
|
+
s << x
|
41
|
+
b << x
|
42
|
+
end
|
43
|
+
r.rand(2).times do
|
44
|
+
n = r.rand(1024*1400)
|
45
|
+
b.read(n)
|
46
|
+
s.slice!(0, n)
|
47
|
+
end
|
48
|
+
key = :"random#{"%02d"%i}"
|
49
|
+
cases[key] = b
|
50
|
+
examples[key] = s
|
51
|
+
end
|
52
|
+
|
53
|
+
[cases, examples]
|
54
|
+
end
|
55
|
+
|
56
|
+
let :static_cases do
|
57
|
+
map = {}
|
58
|
+
map[:empty01] = empty01
|
59
|
+
map[:empty02] = empty02
|
60
|
+
map[:copy01] = copy01
|
61
|
+
map[:copy02] = copy02
|
62
|
+
map[:ref01] = ref01
|
63
|
+
map[:ref02] = ref02
|
64
|
+
map[:ref03] = ref03
|
65
|
+
map[:refcopy01] = refcopy01
|
66
|
+
map[:expand01] = expand01
|
67
|
+
map[:expand02] = expand02
|
68
|
+
map[:offset01] = offset01
|
69
|
+
map[:offset02] = offset02
|
70
|
+
map[:offset03] = offset03
|
71
|
+
map
|
72
|
+
end
|
73
|
+
|
74
|
+
let :static_examples do
|
75
|
+
STATIC_EXAMPLES
|
76
|
+
end
|
77
|
+
|
78
|
+
let :random_cases do
|
79
|
+
random_cases_examples[0]
|
80
|
+
end
|
81
|
+
|
82
|
+
let :random_examples do
|
83
|
+
random_cases_examples[1]
|
84
|
+
end
|
85
|
+
|
86
|
+
let :cases do
|
87
|
+
static_cases.merge(random_cases)
|
88
|
+
end
|
89
|
+
|
90
|
+
let :examples do
|
91
|
+
static_examples.merge(random_examples)
|
92
|
+
end
|
93
|
+
|
94
|
+
let :case_keys do
|
95
|
+
examples.keys
|
96
|
+
end
|
97
|
+
|
98
|
+
let :empty01 do
|
99
|
+
Buffer.new
|
100
|
+
end
|
101
|
+
|
102
|
+
let :empty02 do
|
103
|
+
b = Buffer.new
|
104
|
+
b << 'a'
|
105
|
+
b.read_all(1)
|
106
|
+
b
|
107
|
+
end
|
108
|
+
|
109
|
+
let :copy01 do
|
110
|
+
# one copy chunk
|
111
|
+
b = Buffer.new
|
112
|
+
b << 'short'
|
113
|
+
b
|
114
|
+
end
|
115
|
+
|
116
|
+
let :copy02 do
|
117
|
+
# one copy chunk
|
118
|
+
b = Buffer.new
|
119
|
+
b << 'short'
|
120
|
+
b << 'short'
|
121
|
+
b
|
122
|
+
end
|
123
|
+
|
124
|
+
let :expand02 do
|
125
|
+
# one copy chunk / expanded
|
126
|
+
b = Buffer.new
|
127
|
+
1024.times do
|
128
|
+
b << 'short'
|
129
|
+
end
|
130
|
+
b
|
131
|
+
end
|
132
|
+
|
133
|
+
let :ref01 do
|
134
|
+
# one reference chunk
|
135
|
+
b = Buffer.new
|
136
|
+
b << 'short'*128
|
137
|
+
b.to_s
|
138
|
+
b
|
139
|
+
end
|
140
|
+
|
141
|
+
let :ref02 do
|
142
|
+
# two reference chunks
|
143
|
+
b = Buffer.new
|
144
|
+
b << 'short'*128
|
145
|
+
b.to_s
|
146
|
+
b << 'short'*128
|
147
|
+
b.to_a
|
148
|
+
b
|
149
|
+
end
|
150
|
+
|
151
|
+
let :ref03 do
|
152
|
+
# two reference chunks
|
153
|
+
b = Buffer.new
|
154
|
+
b << 'a'*(1024*1024+2)
|
155
|
+
b << 'a'*(1024*1024+2)
|
156
|
+
b
|
157
|
+
end
|
158
|
+
|
159
|
+
let :refcopy01 do
|
160
|
+
# one reference chunk + one copy chunk
|
161
|
+
b = Buffer.new
|
162
|
+
b << 'short'*127
|
163
|
+
b.to_s
|
164
|
+
b << 'short'
|
165
|
+
b
|
166
|
+
end
|
167
|
+
|
168
|
+
let :expand01 do
|
169
|
+
# one copy chunk / expanded
|
170
|
+
b = Buffer.new
|
171
|
+
1024.times do
|
172
|
+
b << 'short'
|
173
|
+
end
|
174
|
+
b
|
175
|
+
end
|
176
|
+
|
177
|
+
let :expand02 do
|
178
|
+
# one reference chunk + one copy chunk / expanded
|
179
|
+
b = Buffer.new
|
180
|
+
b << 'short'*127
|
181
|
+
b.to_s
|
182
|
+
1024.times do
|
183
|
+
b << 'short'
|
184
|
+
end
|
185
|
+
b
|
186
|
+
end
|
187
|
+
|
188
|
+
let :offset01 do
|
189
|
+
# one copy chunk / offset
|
190
|
+
b = Buffer.new
|
191
|
+
b << 'short'
|
192
|
+
b << 'short'
|
193
|
+
b.skip(2)
|
194
|
+
b
|
195
|
+
end
|
196
|
+
|
197
|
+
let :offset02 do
|
198
|
+
# one reference chunk / offset
|
199
|
+
b = Buffer.new
|
200
|
+
b << 'short'*127
|
201
|
+
b.to_s
|
202
|
+
b.skip(2)
|
203
|
+
b << 'short'
|
204
|
+
b
|
205
|
+
end
|
206
|
+
|
207
|
+
let :offset03 do
|
208
|
+
# one reference chunk / offset + one copy chunk / expanded
|
209
|
+
b = Buffer.new
|
210
|
+
b << 'short'*127
|
211
|
+
b.to_s
|
212
|
+
1024.times do
|
213
|
+
b << 'short'
|
214
|
+
end
|
215
|
+
b.skip(2)
|
216
|
+
b
|
217
|
+
end
|
218
|
+
|
219
|
+
it 'empty?' do
|
220
|
+
empty01.empty?.should == true
|
221
|
+
empty02.empty?.should == true
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'size' do
|
225
|
+
case_keys.each {|k|
|
226
|
+
cases[k].size.should == examples[k].size
|
227
|
+
}
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'short write increments size' do
|
231
|
+
case_keys.each {|k|
|
232
|
+
sz = examples[k].size
|
233
|
+
10.times do |i|
|
234
|
+
cases[k].write 'short'
|
235
|
+
sz += 'short'.size
|
236
|
+
cases[k].size.should == sz
|
237
|
+
end
|
238
|
+
}
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'read with limit decrements size' do
|
242
|
+
case_keys.each {|k|
|
243
|
+
sz = examples[k].size
|
244
|
+
next if sz < 2
|
245
|
+
|
246
|
+
cases[k].read(1).should == examples[k][0,1]
|
247
|
+
sz -= 1
|
248
|
+
cases[k].size.should == sz
|
249
|
+
|
250
|
+
cases[k].read(1).should == examples[k][1,1]
|
251
|
+
sz -= 1
|
252
|
+
cases[k].size.should == sz
|
253
|
+
}
|
254
|
+
end
|
255
|
+
|
256
|
+
it 'read_all with limit decrements size' do
|
257
|
+
case_keys.each {|k|
|
258
|
+
sz = examples[k].size
|
259
|
+
next if sz < 2
|
260
|
+
|
261
|
+
cases[k].read_all(1).should == examples[k][0,1]
|
262
|
+
sz -= 1
|
263
|
+
cases[k].size.should == sz
|
264
|
+
|
265
|
+
cases[k].read_all(1).should == examples[k][1,1]
|
266
|
+
sz -= 1
|
267
|
+
cases[k].size.should == sz
|
268
|
+
}
|
269
|
+
end
|
270
|
+
|
271
|
+
it 'skip decrements size' do
|
272
|
+
case_keys.each {|k|
|
273
|
+
sz = examples[k].size
|
274
|
+
next if sz < 2
|
275
|
+
|
276
|
+
cases[k].skip(1).should == 1
|
277
|
+
sz -= 1
|
278
|
+
cases[k].size.should == sz
|
279
|
+
|
280
|
+
cases[k].skip(1).should == 1
|
281
|
+
sz -= 1
|
282
|
+
cases[k].size.should == sz
|
283
|
+
}
|
284
|
+
end
|
285
|
+
|
286
|
+
it 'skip_all decrements size' do
|
287
|
+
case_keys.each {|k|
|
288
|
+
sz = examples[k].size
|
289
|
+
next if sz < 2
|
290
|
+
|
291
|
+
cases[k].skip_all(1)
|
292
|
+
sz -= 1
|
293
|
+
cases[k].size.should == sz
|
294
|
+
|
295
|
+
cases[k].skip_all(1)
|
296
|
+
sz -= 1
|
297
|
+
cases[k].size.should == sz
|
298
|
+
}
|
299
|
+
end
|
300
|
+
|
301
|
+
it 'read_all against insufficient buffer raises EOFError and consumes nothing' do
|
302
|
+
case_keys.each {|k|
|
303
|
+
sz = examples[k].size
|
304
|
+
lambda {
|
305
|
+
cases[k].read_all(sz+1)
|
306
|
+
}.should raise_error(EOFError)
|
307
|
+
cases[k].size.should == sz
|
308
|
+
}
|
309
|
+
end
|
310
|
+
|
311
|
+
it 'skip_all against insufficient buffer raises EOFError and consumes nothing' do
|
312
|
+
case_keys.each {|k|
|
313
|
+
sz = examples[k].size
|
314
|
+
lambda {
|
315
|
+
cases[k].skip_all(sz+1)
|
316
|
+
}.should raise_error(EOFError)
|
317
|
+
cases[k].size.should == sz
|
318
|
+
}
|
319
|
+
end
|
320
|
+
|
321
|
+
it 'read against insufficient buffer consumes all buffer or return nil' do
|
322
|
+
case_keys.each {|k|
|
323
|
+
sz = examples[k].size
|
324
|
+
if sz == 0
|
325
|
+
cases[k].read(sz+1).should == nil
|
326
|
+
else
|
327
|
+
cases[k].read(sz+1).should == examples[k]
|
328
|
+
end
|
329
|
+
cases[k].size.should == 0
|
330
|
+
}
|
331
|
+
end
|
332
|
+
|
333
|
+
it 'skip against insufficient buffer consumes all buffer' do
|
334
|
+
case_keys.each {|k|
|
335
|
+
sz = examples[k].size
|
336
|
+
cases[k].skip(sz+1).should == examples[k].size
|
337
|
+
cases[k].size.should == 0
|
338
|
+
}
|
339
|
+
end
|
340
|
+
|
341
|
+
it 'read with no arguments consumes all buffer and returns string and do not return nil' do
|
342
|
+
case_keys.each {|k|
|
343
|
+
cases[k].read_all.should == examples[k]
|
344
|
+
cases[k].size.should == 0
|
345
|
+
}
|
346
|
+
end
|
347
|
+
|
348
|
+
it 'read_all with no arguments consumes all buffer and returns string' do
|
349
|
+
case_keys.each {|k|
|
350
|
+
cases[k].read_all.should == examples[k]
|
351
|
+
cases[k].size.should == 0
|
352
|
+
}
|
353
|
+
end
|
354
|
+
|
355
|
+
it 'to_s returns a string and consume nothing' do
|
356
|
+
case_keys.each {|k|
|
357
|
+
cases[k].to_s.should == examples[k]
|
358
|
+
cases[k].size.should == examples[k].size
|
359
|
+
}
|
360
|
+
end
|
361
|
+
|
362
|
+
it 'to_s and modify' do
|
363
|
+
case_keys.each {|k|
|
364
|
+
s = cases[k].to_s
|
365
|
+
s << 'x'
|
366
|
+
cases[k].to_s.should == examples[k]
|
367
|
+
}
|
368
|
+
end
|
369
|
+
|
370
|
+
it 'big write and modify reference' do
|
371
|
+
big2 = "a" * (1024*1024 + 2)
|
372
|
+
|
373
|
+
case_keys.each {|k|
|
374
|
+
big1 = "a" * (1024*1024 + 2)
|
375
|
+
cases[k].write(big1)
|
376
|
+
big1 << 'x'
|
377
|
+
cases[k].read.should == examples[k] + big2
|
378
|
+
}
|
379
|
+
end
|
380
|
+
|
381
|
+
it 'big write -> short write' do
|
382
|
+
biglen = 1024*1024 + 2
|
383
|
+
big1 = "a" * (1024*1024 + 2)
|
384
|
+
|
385
|
+
case_keys.each {|k|
|
386
|
+
sz = examples[k].size
|
387
|
+
|
388
|
+
cases[k].write big1
|
389
|
+
cases[k].size.should == sz + big1.size
|
390
|
+
|
391
|
+
cases[k].write("c")
|
392
|
+
cases[k].size.should == sz + big1.size + 1
|
393
|
+
|
394
|
+
cases[k].read_all.should == examples[k] + big1 + "c"
|
395
|
+
cases[k].size.should == 0
|
396
|
+
cases[k].empty?.should == true
|
397
|
+
}
|
398
|
+
end
|
399
|
+
|
400
|
+
it 'big write 2'do
|
401
|
+
big1 = "a" * (1024*1024 + 2)
|
402
|
+
big2 = "b" * (1024*1024 + 2)
|
403
|
+
|
404
|
+
case_keys.each {|k|
|
405
|
+
sz = examples[k].size
|
406
|
+
|
407
|
+
cases[k].write big1
|
408
|
+
cases[k].write big2
|
409
|
+
cases[k].size.should == sz + big1.size + big2.size
|
410
|
+
|
411
|
+
cases[k].read_all(sz + big1.size).should == examples[k] + big1
|
412
|
+
cases[k].size.should == big2.size
|
413
|
+
|
414
|
+
cases[k].read.should == big2
|
415
|
+
cases[k].size.should == 0
|
416
|
+
cases[k].empty?.should == true
|
417
|
+
}
|
418
|
+
end
|
419
|
+
|
420
|
+
it 'read 0' do
|
421
|
+
case_keys.each {|k|
|
422
|
+
cases[k].read(0).should == ''
|
423
|
+
cases[k].read.should == examples[k]
|
424
|
+
}
|
425
|
+
end
|
426
|
+
|
427
|
+
it 'skip 0' do
|
428
|
+
case_keys.each {|k|
|
429
|
+
cases[k].skip(0).should == 0
|
430
|
+
cases[k].read.should == examples[k]
|
431
|
+
}
|
432
|
+
end
|
433
|
+
|
434
|
+
it 'read_all 0' do
|
435
|
+
case_keys.each {|k|
|
436
|
+
cases[k].read_all(0).should == ''
|
437
|
+
cases[k].read_all.should == examples[k]
|
438
|
+
}
|
439
|
+
end
|
440
|
+
|
441
|
+
it 'skip_all 0' do
|
442
|
+
case_keys.each {|k|
|
443
|
+
cases[k].skip_all(0)
|
444
|
+
cases[k].read_all.should == examples[k]
|
445
|
+
}
|
446
|
+
end
|
447
|
+
|
448
|
+
it 'write_to' do
|
449
|
+
case_keys.each {|k|
|
450
|
+
sio = StringIO.new
|
451
|
+
cases[k].write_to(sio).should == examples[k].size
|
452
|
+
cases[k].size.should == 0
|
453
|
+
sio.string.should == examples[k]
|
454
|
+
}
|
455
|
+
end
|
456
|
+
|
457
|
+
it 'random read/write' do
|
458
|
+
r = Random.new(random_seed)
|
459
|
+
s = r.bytes(0)
|
460
|
+
b = Buffer.new
|
461
|
+
|
462
|
+
10.times {
|
463
|
+
# write
|
464
|
+
r.rand(4).times do
|
465
|
+
n = r.rand(1024*1400)
|
466
|
+
x = r.bytes(n)
|
467
|
+
s << x
|
468
|
+
b.write(x)
|
469
|
+
end
|
470
|
+
|
471
|
+
# read
|
472
|
+
r.rand(3).times do
|
473
|
+
n = r.rand(1024*1400)
|
474
|
+
ex = s.slice!(0, n)
|
475
|
+
ex = nil if ex.empty?
|
476
|
+
x = b.read(n)
|
477
|
+
x.size == ex.size if x != nil
|
478
|
+
x.should == ex
|
479
|
+
b.size.should == s.size
|
480
|
+
end
|
481
|
+
}
|
482
|
+
end
|
483
|
+
|
484
|
+
it 'random read_all/write' do
|
485
|
+
r = Random.new(random_seed)
|
486
|
+
s = r.bytes(0)
|
487
|
+
b = Buffer.new
|
488
|
+
|
489
|
+
10.times {
|
490
|
+
# write
|
491
|
+
r.rand(4).times do
|
492
|
+
n = r.rand(1024*1400)
|
493
|
+
x = r.bytes(n)
|
494
|
+
s << x
|
495
|
+
b.write(x)
|
496
|
+
end
|
497
|
+
|
498
|
+
# read_all
|
499
|
+
r.rand(3).times do
|
500
|
+
n = r.rand(1024*1400)
|
501
|
+
begin
|
502
|
+
x = b.read_all(n)
|
503
|
+
ex = s.slice!(0, n)
|
504
|
+
x.size == n
|
505
|
+
x.should == ex
|
506
|
+
b.size.should == s.size
|
507
|
+
rescue EOFError
|
508
|
+
b.size.should == s.size
|
509
|
+
b.read.should == s
|
510
|
+
s.clear
|
511
|
+
break
|
512
|
+
end
|
513
|
+
end
|
514
|
+
}
|
515
|
+
end
|
516
|
+
|
517
|
+
it 'random skip write' do
|
518
|
+
r = Random.new(random_seed)
|
519
|
+
s = r.bytes(0)
|
520
|
+
b = Buffer.new
|
521
|
+
|
522
|
+
10.times {
|
523
|
+
# write
|
524
|
+
r.rand(4).times do
|
525
|
+
n = r.rand(1024*1400)
|
526
|
+
x = r.bytes(n)
|
527
|
+
s << x
|
528
|
+
b.write(x)
|
529
|
+
end
|
530
|
+
|
531
|
+
# skip
|
532
|
+
r.rand(3).times do
|
533
|
+
n = r.rand(1024*1400)
|
534
|
+
ex = s.slice!(0, n)
|
535
|
+
b.skip(n).should == ex.size
|
536
|
+
b.size.should == s.size
|
537
|
+
end
|
538
|
+
}
|
539
|
+
end
|
540
|
+
|
541
|
+
it 'random skip_all write' do
|
542
|
+
r = Random.new(random_seed)
|
543
|
+
s = r.bytes(0)
|
544
|
+
b = Buffer.new
|
545
|
+
|
546
|
+
10.times {
|
547
|
+
# write
|
548
|
+
r.rand(4).times do
|
549
|
+
n = r.rand(1024*1400)
|
550
|
+
x = r.bytes(n)
|
551
|
+
s << x
|
552
|
+
b.write(x)
|
553
|
+
end
|
554
|
+
|
555
|
+
# skip_all
|
556
|
+
r.rand(3).times do
|
557
|
+
n = r.rand(1024*1400)
|
558
|
+
begin
|
559
|
+
b.skip_all(n)
|
560
|
+
ex = s.slice!(0, n)
|
561
|
+
b.size.should == s.size
|
562
|
+
ensure EOFError
|
563
|
+
b.size.should == s.size
|
564
|
+
b.read.should == s
|
565
|
+
s.clear
|
566
|
+
break
|
567
|
+
end
|
568
|
+
end
|
569
|
+
}
|
570
|
+
end
|
571
|
+
end
|
572
|
+
|