| 
									
										
										
										
											2025-05-22 10:24:04 -04:00
										 |  |  | import unittest | 
					
						
							|  |  |  | from typing import ClassVar | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-22 11:07:57 -04:00
										 |  |  | from .bases import SVTestBase | 
					
						
							| 
									
										
										
										
											2025-05-22 10:24:04 -04:00
										 |  |  | from .. import options | 
					
						
							|  |  |  | from ..locations import LocationTags, location_table | 
					
						
							|  |  |  | from ..mods.mod_data import ModNames | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SVMonstersanityTestBase(SVTestBase): | 
					
						
							|  |  |  |     expected_progressive_generic_weapon: ClassVar[int] = 0 | 
					
						
							|  |  |  |     expected_progressive_specific_weapon: ClassVar[int] = 0 | 
					
						
							|  |  |  |     expected_progressive_slingshot: ClassVar[int] = 0 | 
					
						
							|  |  |  |     expected_progressive_footwear: ClassVar[int] = 0 | 
					
						
							|  |  |  |     expected_rings: ClassVar[list[str]] = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def setUpClass(cls) -> None: | 
					
						
							|  |  |  |         if cls is SVMonstersanityTestBase: | 
					
						
							|  |  |  |             raise unittest.SkipTest("Base tests disabled") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         super().setUpClass() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_when_generate_world_then_expected_generic_weapons_in_the_pool(self): | 
					
						
							|  |  |  |         item_pool = [item.name for item in self.multiworld.itempool] | 
					
						
							|  |  |  |         self.assertEqual(item_pool.count("Progressive Weapon"), self.expected_progressive_generic_weapon) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_when_generate_world_then_expected_specific_weapons_in_the_pool(self): | 
					
						
							|  |  |  |         item_pool = [item.name for item in self.multiworld.itempool] | 
					
						
							|  |  |  |         self.assertEqual(item_pool.count("Progressive Sword"), self.expected_progressive_specific_weapon) | 
					
						
							|  |  |  |         self.assertEqual(item_pool.count("Progressive Club"), self.expected_progressive_specific_weapon) | 
					
						
							|  |  |  |         self.assertEqual(item_pool.count("Progressive Dagger"), self.expected_progressive_specific_weapon) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_when_generate_world_then_expected_slingshots_in_the_pool(self): | 
					
						
							|  |  |  |         item_pool = [item.name for item in self.multiworld.itempool] | 
					
						
							|  |  |  |         self.assertEqual(item_pool.count("Progressive Slingshot"), self.expected_progressive_slingshot) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_when_generate_world_then_expected_shoes_in_the_pool(self): | 
					
						
							|  |  |  |         item_pool = [item.name for item in self.multiworld.itempool] | 
					
						
							|  |  |  |         self.assertEqual(item_pool.count("Progressive Footwear"), self.expected_progressive_footwear) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_when_generate_world_then_many_rings_in_the_pool(self): | 
					
						
							|  |  |  |         item_pool = [item.name for item in self.multiworld.itempool] | 
					
						
							|  |  |  |         for expected_ring in self.expected_rings: | 
					
						
							|  |  |  |             self.assertIn(expected_ring, item_pool) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_when_generate_world_then_all_monster_checks_are_inaccessible_with_empty_inventory(self): | 
					
						
							|  |  |  |         for location in self.get_real_locations(): | 
					
						
							|  |  |  |             if LocationTags.MONSTERSANITY not in location_table[location.name].tags: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             with self.subTest(location.name): | 
					
						
							|  |  |  |                 self.assert_cannot_reach_location(location.name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestMonstersanityNone(SVMonstersanityTestBase): | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         options.Monstersanity: options.Monstersanity.option_none, | 
					
						
							|  |  |  |         # Not really necessary, but it adds more locations, so we don't have to remove useful items. | 
					
						
							|  |  |  |         options.Fishsanity: options.Fishsanity.option_all, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     expected_progressive_generic_weapon = 5 | 
					
						
							|  |  |  |     expected_progressive_slingshot = 2 | 
					
						
							|  |  |  |     expected_progressive_footwear = 3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def run_default_tests(self) -> bool: | 
					
						
							|  |  |  |         # None is default | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestMonstersanityNoneWithSVE(SVMonstersanityTestBase): | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         options.Monstersanity: options.Monstersanity.option_none, | 
					
						
							|  |  |  |         options.Mods: ModNames.sve, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     expected_progressive_generic_weapon = 6 | 
					
						
							|  |  |  |     expected_progressive_slingshot = 2 | 
					
						
							|  |  |  |     expected_progressive_footwear = 3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def run_default_tests(self) -> bool: | 
					
						
							|  |  |  |         # None is default | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestMonstersanityGoals(SVMonstersanityTestBase): | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         options.Monstersanity: options.Monstersanity.option_goals, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     expected_progressive_specific_weapon = 5 | 
					
						
							|  |  |  |     expected_progressive_slingshot = 2 | 
					
						
							|  |  |  |     expected_progressive_footwear = 4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestMonstersanityOnePerCategory(SVMonstersanityTestBase): | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         options.Monstersanity: options.Monstersanity.option_one_per_category, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     expected_progressive_specific_weapon = 5 | 
					
						
							|  |  |  |     expected_progressive_slingshot = 2 | 
					
						
							|  |  |  |     expected_progressive_footwear = 4 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestMonstersanityProgressive(SVMonstersanityTestBase): | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         options.Monstersanity: options.Monstersanity.option_progressive_goals, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     expected_progressive_specific_weapon = 5 | 
					
						
							|  |  |  |     expected_progressive_slingshot = 2 | 
					
						
							|  |  |  |     expected_progressive_footwear = 4 | 
					
						
							|  |  |  |     expected_rings = ["Hot Java Ring", "Wedding Ring", "Slime Charmer Ring"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestMonstersanitySplit(SVMonstersanityTestBase): | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         options.Monstersanity: options.Monstersanity.option_split_goals, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     expected_progressive_specific_weapon = 5 | 
					
						
							|  |  |  |     expected_progressive_slingshot = 2 | 
					
						
							|  |  |  |     expected_progressive_footwear = 4 | 
					
						
							|  |  |  |     expected_rings = ["Hot Java Ring", "Wedding Ring", "Slime Charmer Ring"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestMonstersanitySplitWithSVE(SVMonstersanityTestBase): | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         options.Monstersanity: options.Monstersanity.option_split_goals, | 
					
						
							|  |  |  |         options.Mods: ModNames.sve, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     expected_progressive_specific_weapon = 6 | 
					
						
							|  |  |  |     expected_progressive_slingshot = 2 | 
					
						
							|  |  |  |     expected_progressive_footwear = 4 | 
					
						
							|  |  |  |     expected_rings = ["Hot Java Ring", "Wedding Ring", "Slime Charmer Ring"] |