133 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import unittest
 | |
| from typing import ClassVar
 | |
| 
 | |
| from .bases import SVTestBase
 | |
| 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"]
 | 
