A Python port of the Invisible Internet Project (I2P)
1"""Tests for bencode — TDD: tests before implementation."""
2
3import pytest
4from i2p_apps.snark.bencode import bencode, bdecode
5
6
7class TestBencode:
8 def test_encode_int(self):
9 assert bencode(42) == b"i42e"
10
11 def test_encode_negative_int(self):
12 assert bencode(-1) == b"i-1e"
13
14 def test_encode_zero(self):
15 assert bencode(0) == b"i0e"
16
17 def test_encode_string(self):
18 assert bencode(b"spam") == b"4:spam"
19
20 def test_encode_empty_string(self):
21 assert bencode(b"") == b"0:"
22
23 def test_encode_list(self):
24 assert bencode([b"spam", b"eggs"]) == b"l4:spam4:eggse"
25
26 def test_encode_dict(self):
27 assert bencode({b"cow": b"moo", b"spam": b"eggs"}) == b"d3:cow3:moo4:spam4:eggse"
28
29 def test_encode_nested(self):
30 assert bencode({b"list": [1, 2, 3]}) == b"d4:listli1ei2ei3eee"
31
32
33class TestBdecode:
34 def test_decode_int(self):
35 assert bdecode(b"i42e") == 42
36
37 def test_decode_negative_int(self):
38 assert bdecode(b"i-1e") == -1
39
40 def test_decode_string(self):
41 assert bdecode(b"4:spam") == b"spam"
42
43 def test_decode_empty_string(self):
44 assert bdecode(b"0:") == b""
45
46 def test_decode_list(self):
47 assert bdecode(b"l4:spam4:eggse") == [b"spam", b"eggs"]
48
49 def test_decode_dict(self):
50 result = bdecode(b"d3:cow3:moo4:spam4:eggse")
51 assert result == {b"cow": b"moo", b"spam": b"eggs"}
52
53 def test_decode_nested(self):
54 result = bdecode(b"d4:listli1ei2ei3eee")
55 assert result == {b"list": [1, 2, 3]}
56
57 def test_roundtrip(self):
58 original = {b"announce": b"http://tracker.i2p/announce", b"info": {b"name": b"test", b"length": 1024}}
59 assert bdecode(bencode(original)) == original