bencode 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,8 +5,8 @@
5
5
  #
6
6
  # == Synopsis
7
7
  #
8
- # Bencoding (pronounced <i>bee-encode</i>) is a simple protocol, consisting of
9
- # only 4 value types.
8
+ # Bencoding (pronounced <i>bee-encode</i>) is a simple protocol,
9
+ # consisting of only 4 value types.
10
10
  #
11
11
  # === Integers
12
12
  #
@@ -21,8 +21,8 @@
21
21
  # === Strings
22
22
  #
23
23
  # Strings are sequences of zero or more bytes. They are encoded as
24
- # <i>&lt;length&gt;:&lt;contents&gt;</i>, where _length_ is the length of _contents_. _length_
25
- # must be non-negative.
24
+ # <i>&lt;length&gt;:&lt;contents&gt;</i>, where _length_ is the
25
+ # length of _contents_. _length_ must be non-negative.
26
26
  #
27
27
  # "".bencode #=> "0:"
28
28
  # "foo".bencode #=> "3:foo"
@@ -36,9 +36,9 @@
36
36
  #
37
37
  # === Dictionaries
38
38
  #
39
- # Dictionaries are encoded as _d_ followed by a sequence of key-value pairs, followed by _e_.
40
- # Each value must be immediately preceded by a key. Keys must be strings, and must appear in
41
- # lexicographical order.
39
+ # Dictionaries are encoded as _d_ followed by a sequence of key-value
40
+ # pairs, followed by _e_. Each value must be immediately preceded by
41
+ # a key. Keys must be strings, and must appear in lexicographical order.
42
42
  #
43
43
  # {"foo" => 3, "bar" => 1, "baz" => 2}.bencode
44
44
  # #=> "d3:bari1e3:bazi2e3:fooi3ee"
@@ -62,179 +62,17 @@
62
62
  # version.
63
63
  #
64
64
  # Bencode is distributed in the hope that it will be useful, but WITHOUT ANY
65
- # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
66
- # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
67
- #
68
-
69
- class Object
70
- #
71
- # Raises an exception. Subclasses of Object must themselves
72
- # define meaningful #bencode methods.
73
- def bencode
74
- raise BencodeError, "object cannot be bencoded"
75
- end
76
- end
65
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
66
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
67
+ # details.
77
68
 
78
- class Integer
79
- #
80
- # Bencodes the Integer object. Bencoded integers are represented
81
- # as +ixe+, where +x+ is the integer with an optional
82
- # hyphen prepended, indicating negativity.
83
- #
84
- # 42.bencode #=> "i42e"
85
- # -7.bencode #=> "i-7e"
86
- def bencode
87
- "i#{self}e"
88
- end
89
- end
90
-
91
- class String
92
- #
93
- # Bencodes the String object. Bencoded strings are represented
94
- # as <code>x</code>:<code>y</code>, where +y+ is the string and +x+ is the length of the
95
- # string.
96
- #
97
- # "foo".bencode #=> "3:foo"
98
- # "".bencode #=> "0:"
99
- #
100
- def bencode
101
- "#{length}:#{self}"
102
- end
103
69
 
104
- #
105
- # Bdecodes the String object and returns the data serialized
106
- # through bencoding.
107
- #
108
- # "li1ei2ei3ee".bdecode #=> [1, 2, 3]
109
- #
110
- def bdecode
111
- Bencode.load(self)
112
- end
70
+ prefix = File.dirname(__FILE__)
113
71
 
114
- #
115
- # Tests whether the String object is a valid bencoded string.
116
- def bencoded?
117
- bdecode
118
- rescue BdecodeError
119
- false
120
- else
121
- true
122
- end
72
+ %w[object integer string array hash].each do |type|
73
+ require prefix + '/bencode/encode/' + type
123
74
  end
124
75
 
125
- class Array
126
- #
127
- # Bencodes the Array object. Bencoded arrays are represented as
128
- # +lxe+, where +x+ is zero or more bencoded objects.
129
- #
130
- # [1, "foo"].bencode #=> "li1e3:fooe"
131
- #
132
- def bencode
133
- "l#{map{|obj| obj.bencode }.join('')}e"
134
- rescue BencodeError
135
- raise BencodeError, "list items must be bencodable"
136
- end
137
- end
138
-
139
- class Hash
140
- #
141
- # Bencodes the Hash object. Bencoded hashes are represented as
142
- # +dxe+, where +x+ is zero or a power of two bencoded objects.
143
- # each key is immediately followed by its associated value.
144
- # All keys must be strings. The keys of the bencoded hash will
145
- # be in lexicographical order.
146
- def bencode
147
- pairs = sort.map{|key, val| [key.to_str.bencode, val.bencode] }
148
- "d#{pairs.join('')}e"
149
- rescue NoMethodError => error
150
- if error.name == :to_str
151
- raise BencodeError, "dictionary keys must be strings"
152
- else
153
- raise
154
- end
155
- end
156
- end
157
-
158
- class IO
159
- def self.bdecode(filename)
160
- open(filename, 'r').bdecode
161
- end
162
-
163
- def self.bencode(filename)
164
- open(filename, 'r').bencode
165
- end
166
-
167
- def bdecode
168
- read.chomp.bdecode
169
- end
170
-
171
- def bencode
172
- read.chomp.bencode
173
- end
174
- end
175
-
176
- class BencodeError < StandardError; end
177
-
178
- class BdecodeError < StandardError; end
179
-
180
- module Bencode
181
- class << self
182
- # Bencodes +obj+
183
- def dump(obj)
184
- obj.bencode
185
- end
186
-
187
- # Bdecodes +str+
188
- def load(str)
189
- require 'strscan'
190
-
191
- scanner = StringScanner.new(str)
192
- obj = parse(scanner)
193
- raise BdecodeError unless scanner.eos?
194
- return obj
195
- end
196
-
197
- # Bdecodes the file located at +path+
198
- def load_file(path)
199
- load(File.open(path).read)
200
- end
201
-
202
- def parse(scanner) # :nodoc:
203
- case token = scanner.scan(/[ild]|\d+:|\s/)
204
- when nil
205
- raise BdecodeError
206
- when "i"
207
- number = scanner.scan(/0|(?:-?[1-9][0-9]*)/)
208
- raise BdecodeError unless number and scanner.scan(/e/)
209
- return number.to_i
210
- when "l"
211
- ary = []
212
- until scanner.peek(1) == "e"
213
- ary.push(parse(scanner))
214
- end
215
- scanner.pos += 1
216
- return ary
217
- when "d"
218
- hsh = {}
219
- until scanner.peek(1) == "e"
220
- key, value = parse(scanner), parse(scanner)
221
- raise BdecodeError, "key must be a string" unless key.is_a? String
222
- hsh.store(key, value)
223
- end
224
- scanner.pos += 1
225
- return hsh
226
- when /\d+:/
227
- length = token.chop.to_i
228
- str = scanner.peek(length)
229
- scanner.pos += length
230
- return str
231
- when /\s/
232
- nil
233
- else
234
- raise BdecodeError
235
- end
236
- end
237
-
238
- private :parse
239
- end
76
+ %w[decode io encode_error decode_error].each do |file|
77
+ require prefix + '/bencode/' + file
240
78
  end
@@ -0,0 +1,82 @@
1
+
2
+ module BEncode
3
+ class << self
4
+ # BEncodes +obj+
5
+ def dump(obj)
6
+ obj.bencode
7
+ end
8
+
9
+ # Bdecodes +str+
10
+ def load(str)
11
+ require 'strscan'
12
+
13
+ scanner = StringScanner.new(str)
14
+ obj = parse(scanner)
15
+ raise BEncode::DecodeError unless scanner.eos?
16
+ return obj
17
+ end
18
+
19
+ # Bdecodes the file located at +path+
20
+ def load_file(path)
21
+ load(File.open(path).read)
22
+ end
23
+
24
+ def parse(scanner) # :nodoc:
25
+ case token = scanner.scan(/[ild]|\d+:|\s/)
26
+ when nil
27
+ raise BEncode::DecodeError
28
+ when "i"
29
+ number = scanner.scan(/0|(?:-?[1-9][0-9]*)/)
30
+ raise BEncode::DecodeError unless number and scanner.scan(/e/)
31
+ return number.to_i
32
+ when "l"
33
+ ary = []
34
+ until scanner.peek(1) == "e"
35
+ ary.push(parse(scanner))
36
+ end
37
+ scanner.pos += 1
38
+ return ary
39
+ when "d"
40
+ hsh = {}
41
+ until scanner.peek(1) == "e"
42
+ key, value = parse(scanner), parse(scanner)
43
+
44
+ unless key.is_a? String
45
+ raise BEncode::DecodeError, "key must be a string"
46
+ end
47
+
48
+ hsh.store(key, value)
49
+ end
50
+ scanner.pos += 1
51
+ return hsh
52
+ when /\d+:/
53
+ length = token.chop.to_i
54
+ str = scanner.peek(length)
55
+
56
+ begin
57
+ scanner.pos += length
58
+ rescue RangeError
59
+ raise BEncode::DecodeError, "invalid string length"
60
+ end
61
+
62
+ return str
63
+ else
64
+ raise BEncode::DecodeError
65
+ end
66
+ end
67
+
68
+ private :parse
69
+ end
70
+ end
71
+
72
+ class String
73
+ #
74
+ # Bdecodes the String object and returns the data serialized
75
+ # through bencoding.
76
+ #
77
+ # "li1ei2ei3ee".bdecode #=> [1, 2, 3]
78
+ #
79
+ def bdecode
80
+ BEncode.load(self)
81
+ end
82
+ end
@@ -0,0 +1,4 @@
1
+
2
+ unless BEncode.const_defined? :DecodeError
3
+ BEncode::DecodeError = Class.new(StandardError)
4
+ end
@@ -0,0 +1,19 @@
1
+
2
+ class Array
3
+ #
4
+ # Bencodes the Array object. Bencoded arrays are represented as
5
+ # +lxe+, where +x+ is zero or more bencoded objects.
6
+ #
7
+ # [1, "foo"].bencode #=> "li1e3:fooe"
8
+ #
9
+ def bencode
10
+ begin
11
+ "l#{map{|obj| obj.bencode }.join('')}e"
12
+ rescue BEncode::EncodeError
13
+ raise BEncode::EncodeError, "array items must be bencodable"
14
+ # TODO: This is probably a bad idea...
15
+ rescue SystemStackError
16
+ raise BEncode::EncodeError, "cannot encode recursive array"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+
2
+ class Hash
3
+ #
4
+ # Bencodes the Hash object. Bencoded hashes are represented as
5
+ # +dxe+, where +x+ is zero or a power of two bencoded objects.
6
+ # each key is immediately followed by its associated value.
7
+ # All keys must be strings. The keys of the bencoded hash will
8
+ # be in lexicographical order.
9
+ def bencode
10
+ pairs = sort.map{|key, val| [key.to_str.bencode, val.bencode] }
11
+ "d#{pairs.join('')}e"
12
+ rescue NoMethodError => error
13
+ if error.name == :to_str
14
+ raise BEncode::EncodeError, "dictionary keys must be strings"
15
+ else
16
+ raise
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+
2
+ class Integer
3
+ #
4
+ # Bencodes the Integer object. Bencoded integers are represented
5
+ # as +ixe+, where +x+ is the integer with an optional
6
+ # hyphen prepended, indicating negativity.
7
+ #
8
+ # 42.bencode #=> "i42e"
9
+ # -7.bencode #=> "i-7e"
10
+ def bencode
11
+ "i#{self}e"
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+
2
+ class Object
3
+ #
4
+ # Raises an exception. Subclasses of Object must themselves
5
+ # define meaningful #bencode methods.
6
+ def bencode
7
+ raise BEncode::EncodeError, "cannot bencode #{self.class}"
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+
2
+ class String
3
+ #
4
+ # Bencodes the String object. Bencoded strings are represented
5
+ # as <code>x</code>:<code>y</code>, where +y+ is the string and +x+
6
+ # is the length of the string.
7
+ #
8
+ # "foo".bencode #=> "3:foo"
9
+ # "".bencode #=> "0:"
10
+ #
11
+ def bencode
12
+ "#{length}:#{self}"
13
+ end
14
+ end
@@ -0,0 +1,4 @@
1
+
2
+ unless BEncode.const_defined? :EncodeError
3
+ BEncode::EncodeError = Class.new(StandardError)
4
+ end
@@ -0,0 +1,18 @@
1
+
2
+ class IO
3
+ def self.bdecode(filename)
4
+ open(filename, 'r').bdecode
5
+ end
6
+
7
+ def self.bencode(filename)
8
+ open(filename, 'r').bencode
9
+ end
10
+
11
+ def bdecode
12
+ read.chomp.bdecode
13
+ end
14
+
15
+ def bencode
16
+ read.chomp.bencode
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + "/../../lib/bencode.rb"
4
+
5
+ class BdecodeDictionaryTest < Test::Unit::TestCase
6
+ def test_empty
7
+ assert_equal Hash.new, "de".bdecode
8
+ end
9
+
10
+ def test_single_pair
11
+ assert_equal({"a" => 42}, 'd1:ai42ee'.bdecode)
12
+ end
13
+
14
+ def test_multi_pair
15
+ hsh = {"a" => "monkey", "h" => "elephant", "z" => "zebra"}
16
+ assert_equal hsh, "d1:a6:monkey1:h8:elephant1:z5:zebrae".bdecode
17
+ end
18
+ end
@@ -0,0 +1,32 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../../lib/bencode.rb"
4
+
5
+ class BdecodeIntegerTest < Test::Unit::TestCase
6
+ def test_zero
7
+ assert_equal 0, 'i0e'.bdecode
8
+ end
9
+
10
+ def test_single_digit
11
+ (1..9).each do |digit|
12
+ assert_equal digit, "i#{digit}e".bdecode
13
+ end
14
+ end
15
+
16
+ def test_multi_digit
17
+ (1..10).each do |digit|
18
+ assert_equal digit * 10, "i#{digit * 10}e".bdecode
19
+ end
20
+ end
21
+
22
+ def test_negative
23
+ (-9..-1).each do |digit|
24
+ assert_equal digit, "i#{digit}e".bdecode
25
+ end
26
+ end
27
+
28
+ def test_invalid
29
+ assert_raise(BEncode::DecodeError){ 'i01e'.bdecode }
30
+ assert_raise(BEncode::DecodeError){ 'i-0e'.bdecode }
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../../lib/bencode.rb"
4
+
5
+ class BdecodeInvalidTest < Test::Unit::TestCase
6
+ errors = {:empty_string => '',
7
+ :space_string => ' ',
8
+ :unencoded_string => 'foobar',
9
+ :multiple_top_items => 'i1ei2e',
10
+ :string_length => '4:foo'}
11
+
12
+ errors.each do |error, data|
13
+ define_method("test_#{error}") do
14
+ assert_raise(BEncode::DecodeError){ data.bdecode }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../../lib/bencode.rb"
4
+
5
+ class BdecodeListTest < Test::Unit::TestCase
6
+ def test_empty
7
+ assert_equal [], 'le'.bdecode
8
+ end
9
+
10
+ def test_string_list
11
+ assert_equal %w[foo], 'l3:fooe'.bdecode
12
+ assert_equal %w[a b c], 'l1:a1:b1:ce'.bdecode
13
+ end
14
+
15
+ def test_integer_list
16
+ assert_equal [0], 'li0ee'.bdecode
17
+ assert_equal [1, 2, 3], 'li1ei2ei3ee'.bdecode
18
+ end
19
+
20
+ def test_list_list
21
+ assert_equal [[]], 'llee'.bdecode
22
+ assert_equal [[], [], []], 'llelelee'.bdecode
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../../lib/bencode.rb"
4
+
5
+ class BdecodeStringTest < Test::Unit::TestCase
6
+ def test_empty
7
+ assert_equal '', '0:'.bdecode
8
+ end
9
+
10
+ def test_single_line
11
+ assert_equal 'foo', '3:foo'.bdecode
12
+ end
13
+
14
+ def test_multi_line
15
+ assert_equal "a\nb", "3:a\nb".bdecode
16
+ end
17
+
18
+ def test_whitespace
19
+ [" ", "\t", "\n", "\r"].each do |char|
20
+ assert_equal char, "1:#{char}".bdecode
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,55 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../../lib/bencode.rb"
4
+
5
+ class BencodeListTest < Test::Unit::TestCase
6
+ # Asserts that an empty array is encoded correctly.
7
+ def test_empty
8
+ assert_equal 'le', [].bencode
9
+ end
10
+
11
+ # Asserts that arrays of integers are encoded correctly.
12
+ def test_integer_list
13
+ assert_equal 'li1ee', [1].bencode
14
+ assert_equal 'li1ei2ei3ei4ee', [1, 2, 3, 4].bencode
15
+ end
16
+
17
+ # Asserts that trying to encode a list containing a
18
+ # floating point number raises a +BEncode::EncodeError+.
19
+ def test_float_list
20
+ assert_raise BEncode::EncodeError do
21
+ [13.37].bencode
22
+ end
23
+ end
24
+
25
+ def test_string_list
26
+ assert_equal 'l3:fooe', %w[foo].bencode
27
+ assert_equal 'l1:a1:b1:ce', %w[a b c].bencode
28
+ end
29
+
30
+ def test_list_list
31
+ assert_equal 'llee', [[]].bencode
32
+ assert_equal 'llleee', [[[]]].bencode
33
+ assert_equal 'llelelee', [[], [], []].bencode
34
+ end
35
+
36
+ # Asserts that a recursive array is not bencoded.
37
+ # TODO: Uses waaaaay too much time. What to do?
38
+ def _test_recursive_list
39
+ assert_raise BEncode::EncodeError do
40
+ list = []
41
+ list << list
42
+ list.bencode
43
+ end
44
+
45
+ assert_raise BEncode::EncodeError do
46
+ list = [[]]
47
+ list.first << list
48
+ list.bencode
49
+ end
50
+ end
51
+
52
+ def test_dict_list
53
+ assert_equal 'ldee', [{}].bencode
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../../lib/bencode.rb"
4
+
5
+ class BencodeFloatTest < Test::Unit::TestCase
6
+ def test_illegal_number
7
+ assert_raise BEncode::EncodeError do
8
+ 13.37.bencode
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../../lib/bencode.rb"
4
+
5
+ class BencodeDictionaryTest < Test::Unit::TestCase
6
+ def test_empty
7
+ assert_equal 'de', {}.bencode
8
+ end
9
+
10
+ def test_integer_hash
11
+ assert_equal 'd1:ai1ee', {'a' => 1}.bencode
12
+ assert_equal 'd1:ai1e1:bi2e1:ci3ee',
13
+ {'a' => 1, 'b' => 2, 'c' => 3}.bencode
14
+ end
15
+
16
+ def test_illegal_keys
17
+ assert_raise BEncode::EncodeError do
18
+ {1 => 'foo'}.bencode
19
+ end
20
+ end
21
+
22
+ # Thank you, Julien
23
+ def test_key_order
24
+ assert_equal 'd1:ai1e2:bbi3e1:ci2ee',
25
+ {'a' => 1, 'c' => 2, 'bb' => 3}.bencode
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../../lib/bencode.rb"
4
+
5
+ class BencodeIntegerTest < Test::Unit::TestCase
6
+ def test_zero
7
+ assert_equal 'i0e', 0.bencode
8
+ end
9
+
10
+ def test_single_digit
11
+ (1..9).each do |digit|
12
+ assert_equal "i#{digit}e", digit.bencode
13
+ end
14
+ end
15
+
16
+ def test_multi_digit
17
+ (1..10).each do |digit|
18
+ assert_equal "i#{digit * 10}e", (digit * 10).bencode
19
+ end
20
+ end
21
+
22
+ def test_negative
23
+ (-9..-1).each do |digit|
24
+ assert_equal "i#{digit}e", digit.bencode
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,32 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../../lib/bencode.rb"
4
+
5
+ class BencodeStringTest < Test::Unit::TestCase
6
+ def test_empty
7
+ assert_equal '0:', ''.bencode
8
+ end
9
+
10
+ def test_single_char
11
+ ('a'..'z').each do |char|
12
+ assert_equal '1:' + char, char.bencode
13
+ end
14
+ end
15
+
16
+ def test_single_line
17
+ assert_equal '2:ab', 'ab'.bencode
18
+ assert_equal '3:abc', 'abc'.bencode
19
+ assert_equal '4:abcd', 'abcd'.bencode
20
+ end
21
+
22
+ def test_whitespace
23
+ [" ", "\t", "\n", "\r"].each do |char|
24
+ assert_equal '1:' + char, char.bencode
25
+ assert_equal '2:' + char * 2, (char * 2).bencode
26
+ end
27
+ end
28
+
29
+ def test_multi_line
30
+ assert_equal "3:a\nb", "a\nb".bencode
31
+ end
32
+ end
@@ -0,0 +1,5 @@
1
+
2
+ prefix = File.dirname(__FILE__)
3
+
4
+ require prefix + '/test_encode'
5
+ require prefix + '/test_decode'
@@ -0,0 +1,4 @@
1
+
2
+ %w[string integer list dictionary invalid].each do |str|
3
+ require File.dirname(__FILE__) + "/decode/test_#{str}"
4
+ end
@@ -0,0 +1,4 @@
1
+
2
+ %w[string integer float array hash].each do |str|
3
+ require File.dirname(__FILE__) + "/encode/test_#{str}"
4
+ end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: bencode
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.4.0
7
- date: 2006-12-26 00:00:00 +01:00
6
+ version: 0.5.0
7
+ date: 2007-02-07 00:00:00 +01:00
8
8
  summary: A Ruby implementation of the Bencode encoding used by BitTorrent
9
9
  require_paths:
10
10
  - lib
@@ -30,10 +30,42 @@ authors:
30
30
  - Daniel Schierbeck
31
31
  files:
32
32
  - lib/bencode.rb
33
+ - lib/bencode/io.rb
34
+ - lib/bencode/encode_error.rb
35
+ - lib/bencode/decode.rb
36
+ - lib/bencode/decode_error.rb
37
+ - lib/bencode/encode/object.rb
38
+ - lib/bencode/encode/integer.rb
39
+ - lib/bencode/encode/hash.rb
40
+ - lib/bencode/encode/array.rb
41
+ - lib/bencode/encode/string.rb
42
+ - test/test_decode.rb
43
+ - test/test_encode.rb
44
+ - test/suite.rb
45
+ - test/decode/test_invalid.rb
46
+ - test/decode/test_dictionary.rb
47
+ - test/decode/test_integer.rb
48
+ - test/decode/test_string.rb
49
+ - test/decode/test_list.rb
50
+ - test/encode/test_float.rb
51
+ - test/encode/test_hash.rb
52
+ - test/encode/test_integer.rb
53
+ - test/encode/test_string.rb
54
+ - test/encode/test_array.rb
33
55
  test_files:
34
- - test/test_suite.rb
35
- - test/tc_bencode.rb
36
- - test/tc_bdecode.rb
56
+ - test/test_decode.rb
57
+ - test/test_encode.rb
58
+ - test/suite.rb
59
+ - test/decode/test_invalid.rb
60
+ - test/decode/test_dictionary.rb
61
+ - test/decode/test_integer.rb
62
+ - test/decode/test_string.rb
63
+ - test/decode/test_list.rb
64
+ - test/encode/test_float.rb
65
+ - test/encode/test_hash.rb
66
+ - test/encode/test_integer.rb
67
+ - test/encode/test_string.rb
68
+ - test/encode/test_array.rb
37
69
  rdoc_options: []
38
70
 
39
71
  extra_rdoc_files: []
@@ -1,55 +0,0 @@
1
-
2
- require 'test/unit'
3
- require "#{File.dirname(__FILE__)}/../lib/bencode"
4
-
5
- class BdecodeTest < Test::Unit::TestCase
6
- def test_string
7
- assert_equal "", "0:".bdecode
8
- assert_equal "foo", "3:foo".bdecode
9
- assert_equal "foo bar", "7:foo bar".bdecode
10
- end
11
-
12
- def test_integer
13
- assert_equal 0, "i0e".bdecode
14
- assert_equal 42, "i42e".bdecode
15
- assert_equal -7, "i-7e".bdecode
16
- end
17
-
18
- def test_invalid_integer
19
- assert_raise BdecodeError do
20
- "i01e".bdecode
21
- end
22
- assert_raise BdecodeError do
23
- "i-01e".bdecode
24
- end
25
- end
26
-
27
- def test_array
28
- assert_equal [], "le".bdecode
29
- assert_equal ["foo"], "l3:fooe".bdecode
30
- assert_equal [1, 2, 3], "li1ei2ei3ee".bdecode
31
- end
32
-
33
- def test_hash
34
- assert_equal Hash.new, "de".bdecode
35
-
36
- hsh = {"a" => "monkey", "h" => "elephant", "z" => "zebra"}
37
- assert_equal hsh, "d1:a6:monkey1:h8:elephant1:z5:zebrae".bdecode
38
- end
39
-
40
- def test_invalid
41
- assert_raises BdecodeError do
42
- "foobar".bdecode
43
- "i1ei2e".bdecode
44
- "4:foo".bdecode
45
- "2:bar".bdecode
46
- end
47
- end
48
-
49
- def test_valid
50
- assert "3:foo".bencoded?
51
- assert !"3:foo3:bar".bencoded?
52
- assert "i42e".bencoded?
53
- assert !"i42ei101e".bencoded?
54
- end
55
- end
@@ -1,57 +0,0 @@
1
-
2
- require 'test/unit'
3
- require "#{File.dirname(__FILE__)}/../lib/bencode"
4
-
5
- class BencodeTest < Test::Unit::TestCase
6
- def test_string
7
- assert_equal "3:foo", "foo".bencode
8
- assert_equal "0:", "".bencode
9
- end
10
-
11
- def test_tab_string
12
- assert_equal "1:\t", "\t".bencode
13
- assert_equal "2:\t\t", "\t\t".bencode
14
- end
15
-
16
- def test_multiline_string
17
- assert_equal "1:\n", "\n".bencode
18
- assert_equal "2:\n\n", "\n\n".bencode
19
- end
20
-
21
- def test_integer
22
- assert_equal "i0e", 0.bencode
23
- assert_equal "i42e", 42.bencode
24
- assert_equal "i-3e", -3.bencode
25
- end
26
-
27
- def test_float
28
- assert_raise BencodeError do
29
- 42.4.bencode
30
- end
31
- end
32
-
33
- def test_array
34
- assert_equal "le", [].bencode
35
- assert_equal "li1ei2ei3ee", [1, 2, 3].bencode
36
- end
37
-
38
- def test_hash
39
- assert_equal "de", {}.bencode
40
- assert_equal "d1:a3:foo1:g3:bar1:z3:baze",
41
- {"a" => "foo", "g" => "bar", "z" => "baz"}.bencode
42
- end
43
-
44
- def test_illegal_hash_keys
45
- assert_raise BencodeError do
46
- {1 => 'foo'}.bencode
47
- end
48
- assert_raise BencodeError do
49
- {1 => 'foo', 2 => 'bar'}.bencode
50
- end
51
- end
52
-
53
- def test_hash_julien
54
- assert_equal "d1:ai1e2:bbi1e1:ci1ee",
55
- {'a' => 1, 'c' => 1, 'bb' => 1}.bencode
56
- end
57
- end
@@ -1,3 +0,0 @@
1
-
2
- require 'tc_bencode'
3
- require 'tc_bdecode'