"""Tests for loot table system.""" from mudlib.loot import LootEntry, roll_loot from mudlib.mobs import MobTemplate, load_mob_template from mudlib.thing import Thing class TestLootEntry: def test_loot_entry_fields(self): entry = LootEntry(name="gold coin", chance=0.5, min_count=1, max_count=3) assert entry.name == "gold coin" assert entry.chance == 0.5 class TestRollLoot: def test_empty_table_returns_empty(self): assert roll_loot([]) == [] def test_guaranteed_drop(self): """chance=1.0 always drops.""" entry = LootEntry(name="gold coin", chance=1.0) items = roll_loot([entry]) assert len(items) == 1 assert items[0].name == "gold coin" def test_zero_chance_never_drops(self): """chance=0.0 never drops.""" entry = LootEntry(name="rare gem", chance=0.0) items = roll_loot([entry]) assert len(items) == 0 def test_count_range(self): """min_count/max_count controls number of items.""" entry = LootEntry(name="coin", chance=1.0, min_count=3, max_count=3) items = roll_loot([entry]) assert len(items) == 3 assert all(item.name == "coin" for item in items) def test_items_are_portable_things(self): entry = LootEntry(name="sword", chance=1.0, description="a rusty sword") items = roll_loot([entry]) assert isinstance(items[0], Thing) assert items[0].portable is True assert items[0].description == "a rusty sword" def test_multiple_entries(self): entries = [ LootEntry(name="coin", chance=1.0, min_count=2, max_count=2), LootEntry(name="gem", chance=1.0), ] items = roll_loot(entries) assert len(items) == 3 # 2 coins + 1 gem class TestMobTemplateLoot: def test_template_default_empty_loot(self): t = MobTemplate( name="rat", description="a rat", pl=10, stamina=10, max_stamina=10 ) assert t.loot == [] def test_load_template_with_loot(self, tmp_path): toml_content = """ name = "goblin" description = "a goblin" pl = 50.0 stamina = 40.0 max_stamina = 40.0 moves = ["punch right"] [[loot]] name = "crude club" chance = 0.8 description = "a crude wooden club" [[loot]] name = "gold coin" chance = 0.5 min_count = 1 max_count = 3 """ f = tmp_path / "goblin.toml" f.write_text(toml_content) template = load_mob_template(f) assert len(template.loot) == 2 assert template.loot[0].name == "crude club" assert template.loot[0].chance == 0.8 assert template.loot[1].min_count == 1 assert template.loot[1].max_count == 3 def test_load_template_without_loot(self, tmp_path): toml_content = """ name = "rat" description = "a rat" pl = 10.0 stamina = 10.0 max_stamina = 10.0 """ f = tmp_path / "rat.toml" f.write_text(toml_content) template = load_mob_template(f) assert template.loot == []