import unittest from unittest.mock import patch import json import pathlib from base_mob import BaseMob from character_builder import CharacterBuilder ARTHUR_JSON = """{ "name": "Arthur", "max_pv": 100, "current_pv": 100, "strength": 20, "protection": 10, "speed": 5, "mob_type": 0 }""" ARTHUR_FILE = pathlib.Path('Arthur.json') class TestCharacterBuilder(unittest.TestCase): @classmethod def tearDownClass(cls): ARTHUR_FILE.unlink(missing_ok=True) @patch("builtins.input") def test_build_character(self, mock_input): # Arrange mock_input.side_effect = [ "Arthur", # name "100", # max_pv "20", # strength "10", # protection "5" # speed ] # Act character = CharacterBuilder.build_character() # Assert self.assertIsInstance(character, BaseMob) self.assertEqual(character.name, "Arthur") self.assertEqual(character.max_pv, 100) self.assertEqual(character.strength, 20) self.assertEqual(character.protection, 10) self.assertEqual(character.speed, 5) self.assertEqual(character.mob_type, 0) def test_save_character(self): # Arrange character = BaseMob( name="Arthur", max_pv=100, strength=20, protection=10, speed=5, mob_type=0, ) # Act CharacterBuilder.save_character(character) # Assert self.assertTrue(ARTHUR_FILE.exists()) self.assertEqual(ARTHUR_JSON, ARTHUR_FILE.read_text(encoding='utf-8')) def test_load_character_file_not_found(self): # Act result = CharacterBuilder.load_character("Lancelot") # Assert self.assertIsNone(result) def test_load_character_success(self): # Arrange ARTHUR_FILE.write_text(ARTHUR_JSON, encoding='utf-8') # Act character = CharacterBuilder.load_character("Arthur") # Assert self.assertIsNotNone(character) self.assertEqual(character.name, "Arthur") self.assertEqual(character.max_pv, 100) self.assertEqual(character.strength, 20) self.assertEqual(character.protection, 10) self.assertEqual(character.speed, 5) self.assertEqual(character.mob_type, 0) def test_load_character_missing_keys(self): arthur_dict: dict = json.loads(ARTHUR_JSON) for key in arthur_dict: with self.subTest(f'test without key "{key}"'): # Arrange invalid_dict = arthur_dict.copy() invalid_dict.pop(key) ARTHUR_FILE.write_text(json.dumps( invalid_dict), encoding='utf-8') # Act result = CharacterBuilder.load_character("Arthur") # Assert self.assertIsNone(result) def test_load_character_invalid_json(self): # Arrange ARTHUR_FILE.write_text(ARTHUR_JSON[1:], encoding='utf-8') # Act result = CharacterBuilder.load_character("Arthur") # Assert self.assertIsNone(result) if __name__ == "__main__": unittest.main()