mochilo 1.3.0 → 2.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/test/pack_test.rb CHANGED
@@ -4,7 +4,7 @@ require File.expand_path('../setup', __FILE__)
4
4
  require 'mochilo'
5
5
  require 'stringio'
6
6
 
7
- class MochiloPackTest < MiniTest::Unit::TestCase
7
+ class MochiloPackTest < Minitest::Test
8
8
 
9
9
  OBJECTS = [
10
10
  {"hello" => "world"},
@@ -52,122 +52,222 @@ class MochiloPackTest < MiniTest::Unit::TestCase
52
52
  end
53
53
 
54
54
  def test_pack_positive_fixed
55
- assert_equal "\x15", Mochilo.pack(21)
55
+ [0,127].each do |int|
56
+ assert_equal int.chr, Mochilo.pack(int)
57
+ end
56
58
  end
57
59
 
58
60
  def test_pack_negative_fixed
59
- assert_equal "\xEB", Mochilo.pack(-21)
61
+ assert_equal "\xFF", Mochilo.pack(-1)
62
+ assert_equal "\xE0", Mochilo.pack(-32)
60
63
  end
61
64
 
62
65
  def test_pack_uint8
63
- assert_equal "\xCC\xD6", Mochilo.pack(214)
66
+ [128,255].each do |int|
67
+ assert_equal "\xCC#{int.chr}", Mochilo.pack(int)
68
+ end
64
69
  end
65
70
 
66
71
  def test_pack_uint16
67
- assert_equal "\xCDS\xE2", Mochilo.pack(21474)
72
+ [256,((2**16)-1)].each do |int|
73
+ packed = [int].pack("n")
74
+ assert_equal "\xCD#{packed}", Mochilo.pack(int)
75
+ end
68
76
  end
69
77
 
70
78
  def test_pack_uint32
71
- assert_equal "\xCE\x7F\xFF\xFF\xFF", Mochilo.pack(2147483647)
79
+ [(2**16),((2**32)-1)].each do |int|
80
+ packed = [int].pack("N")
81
+ assert_equal "\xCE#{packed}", Mochilo.pack(int)
82
+ end
72
83
  end
73
84
 
74
85
  def test_pack_uint64
75
- assert_equal "\xCF\x00\x00\x00\x04\xFF\xFF\xFF\xFF", Mochilo.pack(21474836479)
86
+ [(2**32),((2**64)-1)].each do |int|
87
+ packed = [int].pack("Q>")
88
+ assert_equal "\xCF#{packed}", Mochilo.pack(int)
89
+ end
76
90
  end
77
91
 
78
92
  def test_pack_int8
79
- assert_equal "\xD0\xDE", Mochilo.pack(-34)
93
+ assert_equal "\xD0\xDF", Mochilo.pack(-33)
94
+ assert_equal "\xD0\x80", Mochilo.pack(-128)
80
95
  end
81
96
 
82
97
  def test_pack_int16
83
- assert_equal "\xD1\xAC\x1E", Mochilo.pack(-21474)
98
+ assert_equal "\xD1\xFF\x7F", Mochilo.pack(-129)
99
+ assert_equal "\xD1\x80\x00", Mochilo.pack(-32768)
84
100
  end
85
101
 
86
102
  def test_pack_int32
87
- assert_equal "\xD2\x80\x00\x00\x01", Mochilo.pack(-2147483647)
103
+ assert_equal "\xD2\xFF\xFF\x7F\xFF", Mochilo.pack(-32769)
104
+ assert_equal "\xD2\x80\x00\x00\x00", Mochilo.pack(-2147483648)
88
105
  end
89
106
 
90
107
  def test_pack_int64
91
- assert_equal "\xD3\xFF\xFF\xFF\xFB\x00\x00\x00\x01", Mochilo.pack(-21474836479)
108
+ assert_equal "\xD3\xFF\xFF\xFF\xFF\x7F\xFF\xFF\xFF", Mochilo.pack(-2147483649)
109
+ assert_equal "\xD3\x80\x00\x00\x00\x00\x00\x00\x00", Mochilo.pack(-9223372036854775808)
92
110
  end
93
111
 
94
- if defined?(Encoding)
95
- def test_pack_str16
96
- str = "this is a test".force_encoding('UTF-8')
97
- assert_equal "\xD8\x00\x0E\x00#{str}", Mochilo.pack(str)
98
- end
112
+ def test_pack_fixed_str
113
+ str = "a".force_encoding('UTF-8')
114
+ assert_equal "\xA1#{str}", Mochilo.pack(str)
115
+
116
+ str = ("a"*31).force_encoding('UTF-8')
117
+ assert_equal "\xBF#{str}", Mochilo.pack(str)
99
118
  end
100
119
 
101
- def xtest_pack_str32
102
- # TODO: not sure how to test this without making a massive 66k string
120
+ def test_pack_str8
121
+ str = ("a"*32).force_encoding('UTF-8')
122
+ assert_equal "\xD9#{str.bytesize.chr}#{str}", Mochilo.pack(str)
123
+
124
+ str = ("a"*255).force_encoding('UTF-8')
125
+ assert_equal "\xD9#{str.bytesize.chr}#{str}", Mochilo.pack(str)
103
126
  end
104
127
 
105
- def test_pack_fixed_raw
106
- str = "this is a test"
107
- assert_equal "\xAE#{str}", Mochilo.pack(str)
128
+ def test_pack_str16
129
+ str = ("a"*256).force_encoding('UTF-8')
130
+ assert_equal "\xDA\x01\x00#{str}", Mochilo.pack(str)
131
+
132
+ str = ("a"*(2**16-1)).force_encoding('UTF-8')
133
+ assert_equal "\xDA\xFF\xFF#{str}", Mochilo.pack(str)
108
134
  end
109
135
 
110
- def test_pack_raw16
111
- str = ("a"*255)
112
- assert_equal "\xDA\x00\xFF#{str}", Mochilo.pack(str)
136
+ def test_pack_str32
137
+ str = ("a"*(2**16)).force_encoding('UTF-8')
138
+ assert_equal "\xDB\x00\x01\x00\x00#{str}", Mochilo.pack(str)
139
+
140
+ # This will create a 4GB string, so let's just skip that ;)
141
+ # str = ("a"*(2**32-1)).force_encoding('UTF-8')
142
+ # assert_equal "\xDB\x00\x01\x00\x00#{str}", Mochilo.pack(str)
113
143
  end
114
144
 
115
- def xtest_pack_raw32
116
- # TODO: not sure how to test this without making a massive 66k string
145
+ def test_pack_enc8
146
+ str = ("a"*32).force_encoding('ISO-8859-1')
147
+ assert_equal "\xC7#{str.bytesize.chr}\x0C#{str}", Mochilo.pack(str)
148
+
149
+ str = ("a"*255).force_encoding('ISO-8859-1')
150
+ assert_equal "\xC7#{str.bytesize.chr}\x0C#{str}", Mochilo.pack(str)
117
151
  end
118
152
 
119
- def test_pack_fixed_array
120
- assert_equal "\x90", Mochilo.pack([])
121
- assert_equal "\x91\x01", Mochilo.pack([1])
153
+ def test_pack_enc16
154
+ str = ("a"*256).force_encoding('ISO-8859-1')
155
+ assert_equal "\xC8\x01\x00\x0C#{str}", Mochilo.pack(str)
156
+
157
+ str = ("a"*(2**16-1)).force_encoding('ISO-8859-1')
158
+ assert_equal "\xC8\xFF\xFF\x0C#{str}", Mochilo.pack(str)
122
159
  end
123
160
 
124
- def test_pack_array16
125
- bytes = ("a"*34).bytes.to_a
126
- assert_equal "\xDC\x00\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", Mochilo.pack(bytes)
161
+ def test_pack_enc32
162
+ str = ("a"*(2**16)).force_encoding('ISO-8859-1')
163
+ assert_equal "\xC9\x00\x01\x00\x00\x0C#{str}", Mochilo.pack(str)
164
+
165
+ # This would create a 4GB string, so let's just skip that ;)
166
+ # str = ("a"*(2**32-1)).force_encoding('ISO-8859-1')
167
+ # assert_equal "\xC9\x00\x01\x00\x00\x0C#{str}", Mochilo.pack(str)
127
168
  end
128
169
 
129
- def xtest_pack_array32
130
- # TODO: not sure how to test this without making a massive 66k item array
170
+ def test_pack_bin8
171
+ str = ("a"*32).force_encoding('binary')
172
+ assert_equal "\xC4#{str.bytesize.chr}#{str}", Mochilo.pack(str)
173
+
174
+ str = ("a"*255).force_encoding('binary')
175
+ assert_equal "\xC4#{str.bytesize.chr}#{str}", Mochilo.pack(str)
131
176
  end
132
177
 
133
- def test_pack_fixed_map
134
- assert_equal "\x80", Mochilo.pack({})
135
- assert_equal "\x81\x01\x02", Mochilo.pack({1 => 2})
178
+ def test_pack_bin16
179
+ str = ("a"*256).force_encoding('binary')
180
+ assert_equal "\xC5\x01\x00#{str}", Mochilo.pack(str)
181
+
182
+ str = ("a"*(2**16-1)).force_encoding('binary')
183
+ assert_equal "\xC5\xFF\xFF#{str}", Mochilo.pack(str)
136
184
  end
137
185
 
138
- def test_pack_symbol
139
- assert_equal "\xD8\x00\x04\x01test", Mochilo.pack(:test)
140
- assert_equal "\xD4\x04test", Mochilo.pack_unsafe(:test)
186
+ def test_pack_bin32
187
+ str = ("a"*(2**16)).force_encoding('binary')
188
+ assert_equal "\xC6\x00\x01\x00\x00#{str}", Mochilo.pack(str)
189
+
190
+ # This would create a 4GB string, so let's just skip that ;)
191
+ # str = ("a"*(2**32-1)).force_encoding('UTF-8')
192
+ # assert_equal "\xC6\x00\x01\x00\x00#{str}", Mochilo.pack(str)
141
193
  end
142
194
 
143
- def test_pack_symbol_size
144
- too_big = ("a"*0x100).to_sym
145
- fine = ("a"*0xff).to_sym
195
+ def test_pack_fixed_array
196
+ assert_equal "\x90", Mochilo.pack([])
146
197
 
147
- assert_raises Mochilo::PackError do
148
- Mochilo.pack_unsafe(too_big)
149
- end
198
+ arr = (1..15).to_a
199
+ expected = "\x9F"
200
+ arr.each {|i| expected << Mochilo.pack(i)}
201
+ assert_equal expected, Mochilo.pack(arr)
202
+ end
150
203
 
151
- begin
152
- Mochilo.pack_unsafe(fine)
153
- rescue Mochilo::PackError => boom
154
- assert_nil boom, "exception raised, expected nothing"
155
- end
204
+ def test_pack_array16
205
+ arr = (1..16).to_a
206
+ expected = "\xDC\x00\x10"
207
+ arr.each {|i| expected << Mochilo.pack(i)}
208
+ assert_equal expected, Mochilo.pack(arr)
209
+
210
+ arr = (1..2**16-1).to_a
211
+ expected = "\xDC\xFF\xFF"
212
+ arr.each {|i| expected << Mochilo.pack(i)}
213
+ assert_equal expected, Mochilo.pack(arr)
156
214
  end
157
215
 
158
- def test_pack_map16
159
- bytes = ("a"*34).bytes.to_a
160
- assert_equal "\xDC\x00\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", Mochilo.pack(bytes)
216
+ def test_pack_array32
217
+ arr = (1..2**16).to_a
218
+ expected = "\xDD\x00\x01\x00\x00"
219
+ arr.each {|i| expected << Mochilo.pack(i)}
220
+ assert_equal expected, Mochilo.pack(arr)
221
+
222
+ # This would create an array with 4294967295 entries in it, so let's not
223
+ # arr = (1..2**32-1).to_a
224
+ # expected = "\xDD\xFF\xFF\xFF\xFF"
225
+ # arr.each {|i| expected << Mochilo.pack(i)}
226
+ # assert_equal expected, Mochilo.pack(arr)
161
227
  end
162
228
 
163
- def test_pack_map32
164
- # TODO: not sure how to test this without making a massive 66k item hash
229
+ def test_pack_fixed_map
230
+ assert_equal "\x80", Mochilo.pack({})
231
+
232
+ arr = (1..15).to_a
233
+ hash = {}
234
+ arr.each {|i| hash[i] = i }
235
+ expected = "\x8F"
236
+ arr.each {|i| expected << (Mochilo.pack(i) + Mochilo.pack(i))}
237
+ assert_equal expected, Mochilo.pack(hash)
165
238
  end
166
239
 
167
- def test_pack_custom_type
168
- obj = CustomType.new("custom")
240
+ def test_pack_map16
241
+ arr = (1..16).to_a
242
+ hash = {}
243
+ arr.each {|i| hash[i] = i }
244
+ expected = "\xDE\x00\x10"
245
+ arr.each {|i| expected << (Mochilo.pack(i) + Mochilo.pack(i))}
246
+ assert_equal expected, Mochilo.pack(hash)
247
+
248
+ arr = (1..2**16-1).to_a
249
+ hash = {}
250
+ arr.each {|i| hash[i] = i }
251
+ expected = "\xDE\xFF\xFF"
252
+ arr.each {|i| expected << (Mochilo.pack(i) + Mochilo.pack(i))}
253
+ assert_equal expected, Mochilo.pack(hash)
254
+ end
169
255
 
170
- assert_equal "\xA6custom", Mochilo.pack(obj)
256
+ def test_pack_map32
257
+ arr = (1..2**16).to_a
258
+ hash = {}
259
+ arr.each {|i| hash[i] = i }
260
+ expected = "\xDF\x00\x01\x00\x00"
261
+ arr.each {|i| expected << (Mochilo.pack(i) + Mochilo.pack(i))}
262
+ assert_equal expected, Mochilo.pack(hash)
263
+
264
+ # This would create a hash with 4294967295 entries in it, so let's not
265
+ # arr = (1..2**32-1).to_a
266
+ # hash = {}
267
+ # arr.each {|i| hash[i] = i }
268
+ # expected = "\xDF\xFF\xFF\xFF\xFF"
269
+ # arr.each {|i| expected << (Mochilo.pack(i) + Mochilo.pack(i))}
270
+ # assert_equal expected, Mochilo.pack(hash)
171
271
  end
172
272
 
173
273
  def test_pack_unsupported_type
@@ -176,27 +276,9 @@ class MochiloPackTest < MiniTest::Unit::TestCase
176
276
  end
177
277
  end
178
278
 
179
- def test_pack_regexp
180
- expected = "\xD5\x00\x07\x00\x00\x00\x00\x01pa.tern"
181
- assert_equal expected, Mochilo.pack(/pa.tern/)
182
- [
183
- /pa.tern/,
184
- /thing/im,
185
- ].each do |re|
186
- assert_equal re, Mochilo.unpack(Mochilo.pack(re))
279
+ def test_pack_symbol_fails
280
+ assert_raises Mochilo::PackError do
281
+ Mochilo.pack(:symbol)
187
282
  end
188
283
  end
189
-
190
- def test_time
191
- offset = -13*60*60 # I don't know if this is possible. There shouldn't be anything with a greater absolute value.
192
- t = Time.gm(2042, 7, 21, 3, 32, 37, 974010).getlocal(offset)
193
- expected = "\xD6" +
194
- "\x00\x00\x00\x00\x88\x77\x66\x55" + # sec
195
- "\x00\x00\x00\x00\x00\x0E\xDC\xBA" + # usec
196
- "\xFF\xFF\x49\x30" # utc_offset
197
- assert_equal expected, Mochilo.pack(t)
198
- unpacked = Mochilo.unpack(expected)
199
- assert_equal t, unpacked
200
- assert_equal t.utc_offset, unpacked.utc_offset
201
- end
202
284
  end
data/test/setup.rb CHANGED
@@ -14,12 +14,3 @@ require 'minitest/autorun'
14
14
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
15
15
  $LOAD_PATH.unshift File.expand_path('..', __FILE__)
16
16
 
17
- class CustomType
18
- def initialize(str)
19
- @str = str
20
- end
21
-
22
- def to_bpack
23
- Mochilo.pack(@str)
24
- end
25
- end
data/test/unpack_test.rb CHANGED
@@ -1,9 +1,9 @@
1
- # encoding: utf-8
1
+ # encoding: ascii-8bit
2
2
  require File.expand_path('../setup', __FILE__)
3
3
 
4
4
  require 'mochilo'
5
5
 
6
- class MochiloUnpackTest < MiniTest::Unit::TestCase
6
+ class MochiloUnpackTest < Minitest::Test
7
7
  BUFFERS = [
8
8
  "\xCC\x80",
9
9
  "\xCD\x04\xD2",
@@ -39,14 +39,14 @@ class MochiloUnpackTest < MiniTest::Unit::TestCase
39
39
  assert_equal nil, Mochilo.unpack("\xC0")
40
40
  end
41
41
 
42
- def test_unpack_true
43
- assert_equal true, Mochilo.unpack("\xC3")
44
- end
45
-
46
42
  def test_unpack_false
47
43
  assert_equal false, Mochilo.unpack("\xC2")
48
44
  end
49
45
 
46
+ def test_unpack_true
47
+ assert_equal true, Mochilo.unpack("\xC3")
48
+ end
49
+
50
50
  def xtest_unpack_float
51
51
  # ruby uses double's internally so we can't reliably
52
52
  # test for a float without some hacks
@@ -57,103 +57,261 @@ class MochiloUnpackTest < MiniTest::Unit::TestCase
57
57
  end
58
58
 
59
59
  def test_unpack_positive_fixed
60
- assert_equal 21, Mochilo.unpack("\x15")
60
+ (0..127).each do |int|
61
+ assert_equal int, Mochilo.unpack(int.chr)
62
+ end
61
63
  end
62
64
 
63
65
  def test_unpack_negative_fixed
64
- assert_equal -21, Mochilo.unpack("\xEB")
66
+ assert_equal -1, Mochilo.unpack("\xFF")
67
+ assert_equal -32, Mochilo.unpack("\xE0")
65
68
  end
66
69
 
67
70
  def test_unpack_uint8
68
- assert_equal 214, Mochilo.unpack("\xCC\xD6")
71
+ [128,255].each do |int|
72
+ assert_equal int, Mochilo.unpack("\xCC#{int.chr}")
73
+ end
69
74
  end
70
75
 
71
76
  def test_unpack_uint16
72
- assert_equal 21474, Mochilo.unpack("\xCDS\xE2")
77
+ [256,((2**16)-1)].each do |int|
78
+ packed = [int].pack("n")
79
+ assert_equal int, Mochilo.unpack("\xCD#{packed}")
80
+ end
73
81
  end
74
82
 
75
83
  def test_unpack_uint32
76
- assert_equal 2147483647, Mochilo.unpack("\xCE\x7F\xFF\xFF\xFF")
84
+ [(2**16),((2**32)-1)].each do |int|
85
+ packed = [int].pack("N")
86
+ assert_equal int, Mochilo.unpack("\xCE#{packed}")
87
+ end
77
88
  end
78
89
 
79
90
  def test_unpack_uint64
80
- assert_equal 21474836479, Mochilo.unpack("\xCF\x00\x00\x00\x04\xFF\xFF\xFF\xFF")
91
+ [(2**32),((2**64)-1)].each do |int|
92
+ packed = [int].pack("Q>")
93
+ assert_equal int, Mochilo.unpack("\xCF#{packed}")
94
+ end
81
95
  end
82
96
 
83
97
  def test_unpack_int8
84
- assert_equal -34, Mochilo.unpack("\xD0\xDE")
98
+ assert_equal -33, Mochilo.unpack("\xD0\xDF")
99
+ assert_equal -128, Mochilo.unpack("\xD0\x80")
85
100
  end
86
101
 
87
102
  def test_unpack_int16
88
- assert_equal -21474, Mochilo.unpack("\xD1\xAC\x1E")
103
+ assert_equal -129, Mochilo.unpack("\xD1\xFF\x7F")
104
+ assert_equal -32768, Mochilo.unpack("\xD1\x80\x00")
89
105
  end
90
106
 
91
107
  def test_unpack_int32
92
- assert_equal -2147483647, Mochilo.unpack("\xD2\x80\x00\x00\x01")
108
+ assert_equal -32769, Mochilo.unpack("\xD2\xFF\xFF\x7F\xFF")
109
+ assert_equal -2147483648, Mochilo.unpack("\xD2\x80\x00\x00\x00")
93
110
  end
94
111
 
95
112
  def test_unpack_int64
96
- assert_equal -21474836479, Mochilo.unpack("\xD3\xFF\xFF\xFF\xFB\x00\x00\x00\x01")
113
+ assert_equal -2147483649, Mochilo.unpack("\xD3\xFF\xFF\xFF\xFF\x7F\xFF\xFF\xFF")
114
+ assert_equal -9223372036854775808, Mochilo.unpack("\xD3\x80\x00\x00\x00\x00\x00\x00\x00")
97
115
  end
98
116
 
99
- if defined?(Encoding)
100
- def test_unpack_str16
101
- str = "this is a test".force_encoding('UTF-8')
102
- assert_equal str, Mochilo.unpack("\xD8\x00\x0E\x00#{str}")
103
- end
117
+ def test_unpack_fixed_str
118
+ str = "a".force_encoding('UTF-8')
119
+ val = Mochilo.unpack("\xA1#{str}")
120
+ assert_equal str, val
121
+ assert_equal Encoding::UTF_8, val.encoding
122
+
123
+ str = ("a"*31).force_encoding('UTF-8')
124
+ val = Mochilo.unpack("\xBF#{str}")
125
+ assert_equal str, val
126
+ assert_equal Encoding::UTF_8, val.encoding
104
127
  end
105
128
 
106
- def xtest_unpack_str32
107
- # TODO: not sure how to test this without making a massive 66k string
129
+ def test_unpack_str8
130
+ str = ("a"*32).force_encoding('UTF-8')
131
+ val = Mochilo.unpack("\xD9#{str.bytesize.chr}#{str}")
132
+ assert_equal str, val
133
+ assert_equal Encoding::UTF_8, val.encoding
134
+
135
+ str = ("a"*255).force_encoding('UTF-8')
136
+ val = Mochilo.unpack("\xD9#{str.bytesize.chr}#{str}")
137
+ assert_equal str, val
138
+ assert_equal Encoding::UTF_8, val.encoding
108
139
  end
109
140
 
110
- def test_unpack_fixed_raw
111
- str = "this is a test"
112
- assert_equal str, Mochilo.unpack("\xAE#{str}")
141
+ def test_unpack_str16
142
+ str = ("a"*256).force_encoding('UTF-8')
143
+ val = Mochilo.unpack("\xDA\x01\x00#{str}")
144
+ assert_equal str, val
145
+ assert_equal Encoding::UTF_8, val.encoding
146
+
147
+ str = ("a"*(2**16-1)).force_encoding('UTF-8')
148
+ val = Mochilo.unpack("\xDA\xFF\xFF#{str}")
149
+ assert_equal str, val
150
+ assert_equal Encoding::UTF_8, val.encoding
113
151
  end
114
152
 
115
- def test_unpack_symbol
116
- assert_raises Mochilo::UnpackError do
117
- Mochilo.unpack("\xD4\x04test")
118
- end
153
+ def test_unpack_str32
154
+ str = ("a"*(2**16)).force_encoding('UTF-8')
155
+ val = Mochilo.unpack("\xDB\x00\x01\x00\x00#{str}")
156
+ assert_equal str, val
157
+ assert_equal Encoding::UTF_8, val.encoding
158
+
159
+ # This will create a 4GB string, so let's just skip that ;)
160
+ # str = ("a"*(2**32-1)).force_encoding('UTF-8')
161
+ # val = Mochilo.unpack("\xDB\xFF\xFF\xFF\xFF#{str}")
162
+ # assert_equal str, val
163
+ # assert_equal Encoding::UTF_8, val.encoding
164
+ end
165
+
166
+ def test_unpack_enc8
167
+ str = ("a"*32).force_encoding('ISO-8859-1')
168
+ val = Mochilo.unpack("\xC7#{str.bytesize.chr}\x0C#{str}")
169
+ assert_equal str, val
170
+ assert_equal Encoding::ISO_8859_1, val.encoding
171
+
172
+ str = ("a"*255).force_encoding('ISO-8859-1')
173
+ val = Mochilo.unpack("\xC7#{str.bytesize.chr}\x0C#{str}")
174
+ assert_equal str, val
175
+ assert_equal Encoding::ISO_8859_1, val.encoding
176
+ end
177
+
178
+ def test_unpack_enc16
179
+ str = ("a"*256).force_encoding('ISO-8859-1')
180
+ val = Mochilo.unpack("\xC8\x01\x00\x0C#{str}")
181
+ assert_equal str, val
182
+ assert_equal Encoding::ISO_8859_1, val.encoding
119
183
 
120
- assert_equal :test, Mochilo.unpack_unsafe("\xD4\x04test")
184
+ str = ("a"*(2**16-1)).force_encoding('ISO-8859-1')
185
+ val = Mochilo.unpack("\xC8\xFF\xFF\x0C#{str}")
186
+ assert_equal str, val
187
+ assert_equal Encoding::ISO_8859_1, val.encoding
121
188
  end
122
189
 
123
- def test_unpack_raw16
124
- str = ("a"*255)
125
- assert_equal str, Mochilo.unpack("\xDA\x00\xFF#{str}")
190
+ def test_unpack_enc32
191
+ str = ("a"*(2**16)).force_encoding('ISO-8859-1')
192
+ val = Mochilo.unpack("\xC9\x00\x01\x00\x00\x0C#{str}")
193
+ assert_equal str, val
194
+ assert_equal Encoding::ISO_8859_1, val.encoding
195
+
196
+ # This would create a 4GB string, so let's just skip that ;)
197
+ # str = ("a"*(2**32-1)).force_encoding('ISO-8859-1')
198
+ # val = Mochilo.unpack("\xC9\x00\x01\x00\x00\x0C#{str}")
199
+ # assert_equal str, val
200
+ # assert_equal Encoding::ISO_8859_1, val.encoding
126
201
  end
127
202
 
128
- def xtest_unpack_raw32
129
- # TODO: not sure how to test this without making a massive 66k string
203
+ def test_unpack_bin8
204
+ str = ("a"*32).force_encoding('binary')
205
+ val = Mochilo.unpack("\xC4#{str.bytesize.chr}#{str}")
206
+ assert_equal str, val
207
+ assert_equal Encoding::ASCII_8BIT, val.encoding
208
+
209
+ str = ("a"*255).force_encoding('binary')
210
+ val = Mochilo.unpack("\xC4#{str.bytesize.chr}#{str}")
211
+ assert_equal str, val
212
+ assert_equal Encoding::ASCII_8BIT, val.encoding
213
+ end
214
+
215
+ def test_unpack_bin16
216
+ str = ("a"*256).force_encoding('binary')
217
+ val = Mochilo.unpack("\xC5\x01\x00#{str}")
218
+ assert_equal str, val
219
+ assert_equal Encoding::ASCII_8BIT, val.encoding
220
+
221
+ str = ("a"*(2**16-1)).force_encoding('binary')
222
+ val = Mochilo.unpack("\xC5\xFF\xFF#{str}")
223
+ assert_equal str, val
224
+ assert_equal Encoding::ASCII_8BIT, val.encoding
225
+ end
226
+
227
+ def test_unpack_bin32
228
+ str = ("a"*(2**16)).force_encoding('binary')
229
+ val = Mochilo.unpack("\xC6\x00\x01\x00\x00#{str}")
230
+ assert_equal str, val
231
+ assert_equal Encoding::ASCII_8BIT, val.encoding
232
+
233
+ # This would create a 4GB string, so let's just skip that ;)
234
+ # str = ("a"*(2**32-1)).force_encoding('UTF-8')
235
+ # val = Mochilo.unpack("\xC6\x00\x01\x00\x00#{str}")
236
+ # assert_equal str, val
237
+ # assert_equal Encoding::ASCII_8BIT, val.encoding
130
238
  end
131
239
 
132
240
  def test_unpack_fixed_array
133
241
  assert_equal [], Mochilo.unpack("\x90")
134
- assert_equal [1], Mochilo.unpack("\x91\x01")
242
+
243
+ arr = (1..15).to_a
244
+ data = "\x9F"
245
+ arr.each {|i| data << Mochilo.pack(i)}
246
+ assert_equal arr, Mochilo.unpack(data)
135
247
  end
136
248
 
137
249
  def test_unpack_array16
138
- bytes = ("a"*34).bytes.to_a
139
- assert_equal bytes, Mochilo.unpack("\xDC\x00\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
250
+ arr = (1..16).to_a
251
+ data = "\xDC\x00\x10"
252
+ arr.each {|i| data << Mochilo.pack(i)}
253
+ assert_equal arr, Mochilo.unpack(data)
254
+
255
+ arr = (1..2**16-1).to_a
256
+ data = "\xDC\xFF\xFF"
257
+ arr.each {|i| data << Mochilo.pack(i)}
258
+ assert_equal arr, Mochilo.unpack(data)
140
259
  end
141
260
 
142
- def xtest_unpack_array32
143
- # TODO: not sure how to test this without making a massive 66k item array
261
+ def test_unpack_array32
262
+ arr = (1..2**16).to_a
263
+ data = "\xDD\x00\x01\x00\x00"
264
+ arr.each {|i| data << Mochilo.pack(i)}
265
+ assert_equal arr, Mochilo.unpack(data)
266
+
267
+ # This would create an array with 4294967295 entries in it, so let's not
268
+ # arr = (1..2**32-1).to_a
269
+ # data = "\xDD\xFF\xFF\xFF\xFF"
270
+ # arr.each {|i| data << Mochilo.pack(i)}
271
+ # assert_equal arr, Mochilo.unpack(data)
144
272
  end
145
273
 
146
- def test_unpack_fixed_map
274
+ def test_pack_fixed_map
147
275
  assert_equal({}, Mochilo.unpack("\x80"))
148
- assert_equal({1 => 2}, Mochilo.unpack("\x81\x01\x02"))
276
+
277
+ arr = (1..15).to_a
278
+ hash = {}
279
+ arr.each {|i| hash[i] = i }
280
+ data = "\x8F"
281
+ arr.each {|i| data << (Mochilo.pack(i) + Mochilo.pack(i))}
282
+ assert_equal hash, Mochilo.unpack(data)
149
283
  end
150
284
 
151
- def test_unpack_map16
152
- bytes = ("a"*34).bytes.to_a
153
- assert_equal bytes, Mochilo.unpack("\xDC\x00\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
285
+ def test_pack_map16
286
+ arr = (1..16).to_a
287
+ hash = {}
288
+ arr.each {|i| hash[i] = i }
289
+ data = "\xDE\x00\x10"
290
+ arr.each {|i| data << (Mochilo.pack(i) + Mochilo.pack(i))}
291
+ assert_equal hash, Mochilo.unpack(data)
292
+
293
+ arr = (1..2**16-1).to_a
294
+ hash = {}
295
+ arr.each {|i| hash[i] = i }
296
+ data = "\xDE\xFF\xFF"
297
+ arr.each {|i| data << (Mochilo.pack(i) + Mochilo.pack(i))}
298
+ assert_equal hash, Mochilo.unpack(data)
154
299
  end
155
300
 
156
- def test_unpack_map32
157
- # TODO: not sure how to test this without making a massive 66k item hash
301
+ def test_pack_map32
302
+ arr = (1..2**16).to_a
303
+ hash = {}
304
+ arr.each {|i| hash[i] = i }
305
+ data = "\xDF\x00\x01\x00\x00"
306
+ arr.each {|i| data << (Mochilo.pack(i) + Mochilo.pack(i))}
307
+ assert_equal hash, Mochilo.unpack(data)
308
+
309
+ # This would create a hash with 4294967295 entries in it, so let's not
310
+ # arr = (1..2**32-1).to_a
311
+ # hash = {}
312
+ # arr.each {|i| hash[i] = i }
313
+ # data = "\xDF\xFF\xFF\xFF\xFF"
314
+ # arr.each {|i| data << (Mochilo.pack(i) + Mochilo.pack(i))}
315
+ # assert_equal hash, Mochilo.unpack(data)
158
316
  end
159
317
  end