"""Tests for piece management — TDD: tests before implementation.""" import pytest from i2p_apps.snark.pieces import PieceManager, PieceState class TestPieceManager: def test_creation(self): pm = PieceManager(total_pieces=10, piece_length=16384, total_size=163840) assert pm.total_pieces == 10 assert pm.completed_count == 0 def test_initial_state(self): pm = PieceManager(total_pieces=5, piece_length=16384, total_size=81920) for i in range(5): assert pm.state(i) == PieceState.MISSING def test_mark_complete(self): pm = PieceManager(total_pieces=5, piece_length=16384, total_size=81920) pm.mark_complete(0) assert pm.state(0) == PieceState.COMPLETE assert pm.completed_count == 1 def test_mark_requested(self): pm = PieceManager(total_pieces=5, piece_length=16384, total_size=81920) pm.mark_requested(2) assert pm.state(2) == PieceState.REQUESTED def test_next_needed(self): pm = PieceManager(total_pieces=3, piece_length=16384, total_size=49152) pm.mark_complete(0) available = {0, 1, 2} needed = pm.next_needed(available) assert needed is not None assert needed != 0 # Already complete def test_next_needed_none(self): pm = PieceManager(total_pieces=2, piece_length=16384, total_size=32768) pm.mark_complete(0) pm.mark_complete(1) assert pm.next_needed({0, 1}) is None def test_is_complete(self): pm = PieceManager(total_pieces=2, piece_length=16384, total_size=32768) assert pm.is_complete is False pm.mark_complete(0) pm.mark_complete(1) assert pm.is_complete is True def test_bitfield(self): pm = PieceManager(total_pieces=8, piece_length=16384, total_size=131072) pm.mark_complete(0) pm.mark_complete(3) pm.mark_complete(7) bf = pm.bitfield() assert len(bf) == 1 # 8 pieces = 1 byte assert bf[0] & 0x80 # bit 0 assert bf[0] & 0x10 # bit 3 assert bf[0] & 0x01 # bit 7 def test_percent_complete(self): pm = PieceManager(total_pieces=4, piece_length=16384, total_size=65536) pm.mark_complete(0) pm.mark_complete(1) assert pm.percent_complete == 50.0