 f99ee77325
			
		
	
	f99ee77325
	
	
	
		
			
			* Add hidden early symbol item option, make some unit tests * Add early symbol item false to the arrows test * I guess it's not an issue * more tests * assertEqual * cleanup * add minimum symbols test for all 3 modes * Formatting * Add more minimal beatability tests * one more for the road * I HATE THIS AAAAAAAAAAAHHHHHHHHHHH WHY DID WE GO WITH OPTIONS * loiaqeäsdhgalikSDGHjasDÖKHGASKLDÖGHJASKLJGHJSAÖkfaöslifjasöfASGJÖASDLFGJ'sklgösLGIKsdhJLGÖsdfjälghklDASFJghjladshfgjasdfälkjghasdöLfghasd-kjgjASDLÖGHAESKDLJGJÖsdaLGJHsadöKGjFDSLAkgjölSÄDghbASDFKGjasdLJGhjLÖSDGHLJASKDkgjldafjghjÖLADSFghäasdökgjäsadjlgkjsadkLHGsaDÖLGSADGÖLwSdlgkJLwDSFÄLHBJsaöfdkHweaFGIoeWjvlkdösmVJÄlsafdJKhvjdsJHFGLsdaövhWDsköLV-ksdFJHGVöSEKD * fix imports (within apworld needs to be relative) * Update worlds/witness/options.py Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> * Sure * good suggestion * subtest * Add some EP shuffle unit tests, also an explicit event-checking unit test * add more tests yay * oops * mypy * Update worlds/witness/options.py Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> * Collapse into one test :( * More efficiency * line length * More collapsing * Cleanup and docstrings --------- Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>
		
			
				
	
	
		
			186 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from ..test import WitnessTestBase
 | |
| 
 | |
| 
 | |
| class TestSymbolsRequiredToWinElevatorNormal(WitnessTestBase):
 | |
|     options = {
 | |
|         "shuffle_lasers": True,
 | |
|         "puzzle_randomization": "sigma_normal",
 | |
|         "mountain_lasers": 1,
 | |
|         "victory_condition": "elevator",
 | |
|         "early_symbol_item": False,
 | |
|     }
 | |
| 
 | |
|     def test_symbols_to_win(self) -> None:
 | |
|         """
 | |
|         In symbol shuffle, the only way to reach the Elevator is through Mountain Entry by descending the Mountain.
 | |
|         This requires a very specific set of symbol items per puzzle randomization mode.
 | |
|         In this case, we check Sigma Normal Puzzles.
 | |
|         """
 | |
| 
 | |
|         exact_requirement = {
 | |
|             "Monastery Laser": 1,
 | |
|             "Progressive Dots": 2,
 | |
|             "Progressive Stars": 2,
 | |
|             "Progressive Symmetry": 2,
 | |
|             "Black/White Squares": 1,
 | |
|             "Colored Squares": 1,
 | |
|             "Shapers": 1,
 | |
|             "Rotated Shapers": 1,
 | |
|             "Eraser": 1,
 | |
|         }
 | |
| 
 | |
|         self.assert_can_beat_with_minimally(exact_requirement)
 | |
| 
 | |
| 
 | |
| class TestSymbolsRequiredToWinElevatorExpert(WitnessTestBase):
 | |
|     options = {
 | |
|         "shuffle_lasers": True,
 | |
|         "mountain_lasers": 1,
 | |
|         "victory_condition": "elevator",
 | |
|         "early_symbol_item": False,
 | |
|         "puzzle_randomization": "sigma_expert",
 | |
|     }
 | |
| 
 | |
|     def test_symbols_to_win(self) -> None:
 | |
|         """
 | |
|         In symbol shuffle, the only way to reach the Elevator is through Mountain Entry by descending the Mountain.
 | |
|         This requires a very specific set of symbol items per puzzle randomization mode.
 | |
|         In this case, we check Sigma Expert Puzzles.
 | |
|         """
 | |
| 
 | |
|         exact_requirement = {
 | |
|             "Monastery Laser": 1,
 | |
|             "Progressive Dots": 2,
 | |
|             "Progressive Stars": 2,
 | |
|             "Progressive Symmetry": 2,
 | |
|             "Black/White Squares": 1,
 | |
|             "Colored Squares": 1,
 | |
|             "Shapers": 1,
 | |
|             "Rotated Shapers": 1,
 | |
|             "Negative Shapers": 1,
 | |
|             "Eraser": 1,
 | |
|             "Triangles": 1,
 | |
|         }
 | |
| 
 | |
|         self.assert_can_beat_with_minimally(exact_requirement)
 | |
| 
 | |
| 
 | |
| class TestSymbolsRequiredToWinElevatorVanilla(WitnessTestBase):
 | |
|     options = {
 | |
|         "shuffle_lasers": True,
 | |
|         "mountain_lasers": 1,
 | |
|         "victory_condition": "elevator",
 | |
|         "early_symbol_item": False,
 | |
|         "puzzle_randomization": "none",
 | |
|     }
 | |
| 
 | |
|     def test_symbols_to_win(self) -> None:
 | |
|         """
 | |
|         In symbol shuffle, the only way to reach the Elevator is through Mountain Entry by descending the Mountain.
 | |
|         This requires a very specific set of symbol items per puzzle randomization mode.
 | |
|         In this case, we check Vanilla Puzzles.
 | |
|         """
 | |
| 
 | |
|         exact_requirement = {
 | |
|             "Monastery Laser": 1,
 | |
|             "Progressive Dots": 2,
 | |
|             "Progressive Stars": 2,
 | |
|             "Progressive Symmetry": 1,
 | |
|             "Black/White Squares": 1,
 | |
|             "Colored Squares": 1,
 | |
|             "Shapers": 1,
 | |
|             "Rotated Shapers": 1,
 | |
|             "Eraser": 1,
 | |
|         }
 | |
| 
 | |
|         self.assert_can_beat_with_minimally(exact_requirement)
 | |
| 
 | |
| 
 | |
| class TestPanelsRequiredToWinElevator(WitnessTestBase):
 | |
|     options = {
 | |
|         "shuffle_lasers": True,
 | |
|         "mountain_lasers": 1,
 | |
|         "victory_condition": "elevator",
 | |
|         "early_symbol_item": False,
 | |
|         "shuffle_symbols": False,
 | |
|         "shuffle_doors": "panels",
 | |
|         "door_groupings": "off",
 | |
|     }
 | |
| 
 | |
|     def test_panels_to_win(self) -> None:
 | |
|         """
 | |
|         In door panel shuffle , the only way to reach the Elevator is through Mountain Entry by descending the Mountain.
 | |
|         This requires some control panels for each of the Mountain Floors.
 | |
|         """
 | |
| 
 | |
|         exact_requirement = {
 | |
|             "Desert Laser": 1,
 | |
|             "Town Desert Laser Redirect Control (Panel)": 1,
 | |
|             "Mountain Floor 1 Light Bridge (Panel)": 1,
 | |
|             "Mountain Floor 2 Light Bridge Near (Panel)": 1,
 | |
|             "Mountain Floor 2 Light Bridge Far (Panel)": 1,
 | |
|             "Mountain Floor 2 Elevator Control (Panel)": 1,
 | |
|         }
 | |
| 
 | |
|         self.assert_can_beat_with_minimally(exact_requirement)
 | |
| 
 | |
| 
 | |
| class TestDoorsRequiredToWinElevator(WitnessTestBase):
 | |
|     options = {
 | |
|         "shuffle_lasers": True,
 | |
|         "mountain_lasers": 1,
 | |
|         "victory_condition": "elevator",
 | |
|         "early_symbol_item": False,
 | |
|         "shuffle_symbols": False,
 | |
|         "shuffle_doors": "doors",
 | |
|         "door_groupings": "off",
 | |
|     }
 | |
| 
 | |
|     def test_doors_to_elevator_paths(self) -> None:
 | |
|         """
 | |
|         In remote door shuffle, there are three ways to win.
 | |
| 
 | |
|         - Through the normal route (Mountain Entry -> Descend through Mountain -> Reach Bottom Floor)
 | |
|         - Through the Caves using the Caves Shortcuts (Caves -> Reach Bottom Floor)
 | |
|         - Through the Caves via Challenge (Tunnels -> Challenge -> Caves -> Reach Bottom Floor)
 | |
|         """
 | |
| 
 | |
|         with self.subTest("Test Elevator victory in shuffle_doors through Mountain Entry."):
 | |
|             exact_requirement = {
 | |
|                 "Monastery Laser": 1,
 | |
|                 "Mountain Floor 1 Exit (Door)": 1,
 | |
|                 "Mountain Floor 2 Staircase Near (Door)": 1,
 | |
|                 "Mountain Floor 2 Staircase Far (Door)": 1,
 | |
|                 "Mountain Floor 2 Exit (Door)": 1,
 | |
|                 "Mountain Bottom Floor Giant Puzzle Exit (Door)": 1,
 | |
|                 "Mountain Bottom Floor Pillars Room Entry (Door)": 1,
 | |
|             }
 | |
| 
 | |
|             self.assert_can_beat_with_minimally(exact_requirement)
 | |
| 
 | |
|         with self.subTest("Test Elevator victory in shuffle_doors through Caves Shortcuts."):
 | |
|             exact_requirement = {
 | |
|                 "Monastery Laser": 1,  # Elevator Panel itself has a laser lock
 | |
|                 "Caves Mountain Shortcut (Door)": 1,
 | |
|                 "Caves Entry (Door)": 1,
 | |
|                 "Mountain Bottom Floor Rock (Door)": 1,
 | |
|                 "Mountain Bottom Floor Pillars Room Entry (Door)": 1,
 | |
|             }
 | |
| 
 | |
|             self.assert_can_beat_with_minimally(exact_requirement)
 | |
| 
 | |
|         with self.subTest("Test Elevator victory in shuffle_doors through Tunnels->Challenge->Caves."):
 | |
|             exact_requirement = {
 | |
|                 "Monastery Laser": 1,  # Elevator Panel itself has a laser lock
 | |
|                 "Windmill Entry (Door)": 1,
 | |
|                 "Tunnels Theater Shortcut (Door)": 1,
 | |
|                 "Tunnels Entry (Door)": 1,
 | |
|                 "Challenge Entry (Door)": 1,
 | |
|                 "Caves Pillar Door": 1,
 | |
|                 "Caves Entry (Door)": 1,
 | |
|                 "Mountain Bottom Floor Rock (Door)": 1,
 | |
|                 "Mountain Bottom Floor Pillars Room Entry (Door)": 1,
 | |
|             }
 | |
| 
 | |
|             self.assert_can_beat_with_minimally(exact_requirement)
 |