import unittest import os from pathlib import Path from dungeonsheets import make_sheets, character, monsters, random_tables EG_DIR = Path(__file__).parent.parent.resolve() / "examples" CHARFILE = EG_DIR / "rogue1.py" GMFILE = EG_DIR / "gm-session-notes.py" class MakeSheetsTestCase(unittest.TestCase): char_pdf = Path(f"{CHARFILE.stem}.pdf") gm_pdf = Path(f"{GMFILE.stem}.pdf").resolve() def tearDown(self): if self.char_pdf.exists(): self.char_pdf.unlink() if self.gm_pdf.exists(): self.gm_pdf.unlink() def test_main(self): make_sheets.main(args=[str(CHARFILE), "--debug"]) def test_make_sheets(self): # Character PDF make_sheets.make_sheet(sheet_file=CHARFILE) # Was the PDF created? self.assertTrue(self.char_pdf.exists(), f"Character PDF ({self.char_pdf.resolve()}) not created.") # GM PDF make_sheets.make_sheet(sheet_file=GMFILE) self.assertTrue(self.gm_pdf.exists) # Was the PDF created? self.assertTrue(self.gm_pdf.exists(), f"GM PDF ({self.gm_pdf.resolve()}) not created.") def test_make_fancy_sheets(self): # Character PDF make_sheets.make_sheet(sheet_file=CHARFILE, fancy_decorations=True) # Was the PDF created? self.assertTrue(self.char_pdf.exists(), f"Character PDF ({self.char_pdf.resolve()}) not created.") # GM PDF make_sheets.make_sheet(sheet_file=GMFILE, fancy_decorations=True) self.assertTrue(self.gm_pdf.exists) # Was the PDF created? self.assertTrue(self.gm_pdf.exists(), f"GM PDF ({self.gm_pdf.resolve()}) not created.") class EpubOutputTestCase(unittest.TestCase): gm_epub = Path(f"{GMFILE.stem}.epub").resolve() char_epub = Path(f"{CHARFILE.stem}.epub").resolve() def new_character(self): char = character.Character( name="Dr. Who", classes=["Monk", "Druid", "Artificer"], levels=[1, 1, 1], subclasses=["way of the open hand", None, None], magic_items=["cloak of protection"], spells=["invisibility"], wild_shapes=["crocodile"], infusions=["boots of the winding path"] ) return char def tearDown(self): for f in [self.gm_epub, self.char_epub]: if f.exists(): f.unlink() def test_character_html_content(self): my_char = self.new_character() my_char.magic_items_text html = make_sheets.make_character_content(character=my_char, content_format="html") html = "".join(html) # Make sure the various sections get rendered self.assertIn("Subclasses", html) self.assertIn("Features", html) self.assertIn("Magic Items", html) self.assertIn("Spells", html) self.assertIn("Infusions", html) self.assertIn("Known Beasts", html) # Check the character sheet self.assertIn("Character Sheet", html) self.assertIn("Dr. Who", html) def test_gm_file_created(self): # Check that a file is created once the function is run make_sheets.make_gm_sheet(gm_file=GMFILE, output_format="epub") self.assertTrue(self.gm_epub.exists(), f"{self.gm_epub} not created.") def test_character_file_created(self): # Check that a file is created once the function is run make_sheets.make_character_sheet(char_file=CHARFILE, output_format="epub") self.assertTrue(self.char_epub.exists(), f"{self.char_epub} not created.") class PdfOutputTestCase(unittest.TestCase): basename = "clara" def tearDown(self): temp_files = [f"{self.basename}.pdf"] for f in temp_files: if os.path.exists(f): os.remove(f) def test_file_created(self): # Check that a file is created once the function is run pdf_name = f"{self.basename}.pdf" # self.assertFalse(os.path.exists(pdf_name), f'{pdf_name} already exists.') char = character.Character(name="Clara") char.saving_throw_proficiencies = ["strength"] make_sheets.create_character_pdf_template( character=char, basename=self.basename ) self.assertTrue(os.path.exists(pdf_name), f"{pdf_name} not created.") class VashtaNerada(monsters.Monster): """Scariest monster ever, but luckily only for testing.""" name = "Vashta Nerada" speed = 35 fly_speed = 45 swim_speed = 55 burrow_speed = 65 condition_immunities = "petrified" saving_throws = "Dex +8" damage_immunities = "Bludgeoning" damage_resistances = "Lightning" damage_vulnerabilities = "Wood-based" challenge_rating = 30 spells = ["wish"] class HtmlCreatorTestCase(unittest.TestCase): def new_character(self): char = character.Character( name="Dr. Who", classes=["Monk", "Druid", "Artificer"], levels=[1, 1, 1], subclasses=["way of the open hand", None, None], magic_items=["cloak of protection"], spells=["invisibility"], wild_shapes=["crocodile"], infusions=["boots of the winding path"] ) return char def test_create_monsters_html(self): monsters_ = [monsters.Priest()] html = make_sheets.create_monsters_content(monsters=monsters_, suffix="html") self.assertIn(r"Priest", html) # Check extended properties monsters_ = [VashtaNerada()] html = make_sheets.create_monsters_content(monsters=monsters_, suffix="html") self.assertIn(r"Vashta Nerada", html) self.assertIn(r"35", html) self.assertIn(r"45 fly", html) self.assertIn(r"55 swim", html) self.assertIn(r"65 burrow", html) self.assertIn(r"petrified", html) self.assertIn(r"Saving Throws", html) self.assertIn(r"Damage Immunities", html) self.assertIn(r"Damage Resistances", html) self.assertIn(r"Damage Vulnerabilities", html) self.assertIn(r"Senses", html) self.assertIn(r"Challenge", html) self.assertIn(r"(155,000 XP)", html) self.assertIn(r"Languages", html) self.assertIn(r"Skills", html) self.assertIn(r"petrified", html) self.assertIn(r"Dex +8", html) # Check spells and spell descriptions self.assertIn(r"