mochilo 1.3.0 → 2.0

Sign up to get free protection for your applications and to get access to all the features.
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