| 
									
										
										
										
											2022-05-10 19:40:43 +02:00
										 |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-27 05:33:59 -05:00
										 |  |  | from Fill import distribute_items_restrictive | 
					
						
							|  |  |  | from NetUtils import encode | 
					
						
							|  |  |  | from worlds.AutoWorld import AutoWorldRegister, call_all | 
					
						
							| 
									
										
										
										
											2023-02-15 15:46:10 -06:00
										 |  |  | from . import setup_solo_multiworld | 
					
						
							| 
									
										
										
										
											2022-05-10 19:40:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-10 19:43:44 +02:00
										 |  |  | class TestImplemented(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2023-10-22 06:00:27 -05:00
										 |  |  |     def test_completion_condition(self): | 
					
						
							| 
									
										
										
										
											2022-05-10 19:40:43 +02:00
										 |  |  |         """Ensure a completion condition is set that has requirements.""" | 
					
						
							| 
									
										
										
										
											2023-02-12 19:05:52 -06:00
										 |  |  |         for game_name, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							| 
									
										
										
										
											2023-02-23 20:16:10 -06:00
										 |  |  |             if not world_type.hidden and game_name not in {"Sudoku"}: | 
					
						
							| 
									
										
										
										
											2023-02-12 19:05:52 -06:00
										 |  |  |                 with self.subTest(game_name): | 
					
						
							| 
									
										
										
										
											2023-02-15 15:46:10 -06:00
										 |  |  |                     multiworld = setup_solo_multiworld(world_type) | 
					
						
							| 
									
										
										
										
											2023-02-12 19:05:52 -06:00
										 |  |  |                     self.assertFalse(multiworld.completion_condition[1](multiworld.state)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-22 06:00:27 -05:00
										 |  |  |     def test_entrance_parents(self): | 
					
						
							| 
									
										
										
										
											2023-02-12 19:05:52 -06:00
										 |  |  |         """Tests that the parents of created Entrances match the exiting Region.""" | 
					
						
							|  |  |  |         for game_name, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							| 
									
										
										
										
											2023-02-15 15:46:10 -06:00
										 |  |  |             if not world_type.hidden: | 
					
						
							| 
									
										
										
										
											2023-02-12 19:05:52 -06:00
										 |  |  |                 with self.subTest(game_name): | 
					
						
							| 
									
										
										
										
											2023-02-15 15:46:10 -06:00
										 |  |  |                     multiworld = setup_solo_multiworld(world_type) | 
					
						
							| 
									
										
										
										
											2023-02-12 19:05:52 -06:00
										 |  |  |                     for region in multiworld.regions: | 
					
						
							|  |  |  |                         for exit in region.exits: | 
					
						
							|  |  |  |                             self.assertEqual(exit.parent_region, region) | 
					
						
							| 
									
										
										
										
											2023-02-16 00:28:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-22 06:00:27 -05:00
										 |  |  |     def test_stage_methods(self): | 
					
						
							| 
									
										
										
										
											2023-02-16 00:28:02 +01:00
										 |  |  |         """Tests that worlds don't try to implement certain steps that are only ever called as stage.""" | 
					
						
							|  |  |  |         for game_name, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							|  |  |  |             if not world_type.hidden: | 
					
						
							|  |  |  |                 with self.subTest(game_name): | 
					
						
							|  |  |  |                     for method in ("assert_generate",): | 
					
						
							|  |  |  |                         self.assertFalse(hasattr(world_type, method), | 
					
						
							|  |  |  |                                          f"{method} must be implemented as a @classmethod named stage_{method}.") | 
					
						
							| 
									
										
										
										
											2023-10-27 05:33:59 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_slot_data(self): | 
					
						
							|  |  |  |         """Tests that if a world creates slot data, it's json serializable.""" | 
					
						
							|  |  |  |         for game_name, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							|  |  |  |             # has an await for generate_output which isn't being called | 
					
						
							|  |  |  |             if game_name in {"Ocarina of Time", "Zillion"}: | 
					
						
							|  |  |  |                 continue | 
					
						
							| 
									
										
										
										
											2023-11-08 02:15:06 -06:00
										 |  |  |             multiworld = setup_solo_multiworld(world_type) | 
					
						
							|  |  |  |             with self.subTest(game=game_name, seed=multiworld.seed): | 
					
						
							| 
									
										
										
										
											2023-10-27 05:33:59 -05:00
										 |  |  |                 distribute_items_restrictive(multiworld) | 
					
						
							|  |  |  |                 call_all(multiworld, "post_fill") | 
					
						
							|  |  |  |                 for key, data in multiworld.worlds[1].fill_slot_data().items(): | 
					
						
							|  |  |  |                     self.assertIsInstance(key, str, "keys in slot data must be a string") | 
					
						
							|  |  |  |                     self.assertIsInstance(encode(data), str, f"object {type(data).__name__} not serializable.") |