"""Tests for bencode — TDD: tests before implementation.""" import pytest from i2p_apps.snark.bencode import bencode, bdecode class TestBencode: def test_encode_int(self): assert bencode(42) == b"i42e" def test_encode_negative_int(self): assert bencode(-1) == b"i-1e" def test_encode_zero(self): assert bencode(0) == b"i0e" def test_encode_string(self): assert bencode(b"spam") == b"4:spam" def test_encode_empty_string(self): assert bencode(b"") == b"0:" def test_encode_list(self): assert bencode([b"spam", b"eggs"]) == b"l4:spam4:eggse" def test_encode_dict(self): assert bencode({b"cow": b"moo", b"spam": b"eggs"}) == b"d3:cow3:moo4:spam4:eggse" def test_encode_nested(self): assert bencode({b"list": [1, 2, 3]}) == b"d4:listli1ei2ei3eee" class TestBdecode: def test_decode_int(self): assert bdecode(b"i42e") == 42 def test_decode_negative_int(self): assert bdecode(b"i-1e") == -1 def test_decode_string(self): assert bdecode(b"4:spam") == b"spam" def test_decode_empty_string(self): assert bdecode(b"0:") == b"" def test_decode_list(self): assert bdecode(b"l4:spam4:eggse") == [b"spam", b"eggs"] def test_decode_dict(self): result = bdecode(b"d3:cow3:moo4:spam4:eggse") assert result == {b"cow": b"moo", b"spam": b"eggs"} def test_decode_nested(self): result = bdecode(b"d4:listli1ei2ei3eee") assert result == {b"list": [1, 2, 3]} def test_roundtrip(self): original = {b"announce": b"http://tracker.i2p/announce", b"info": {b"name": b"test", b"length": 1024}} assert bdecode(bencode(original)) == original