| 
									
										
										
										
											2023-01-15 13:18:32 -06:00
										 |  |  | import unittest | 
					
						
							|  |  |  | from collections import Counter | 
					
						
							| 
									
										
										
										
											2023-02-26 19:13:24 -06:00
										 |  |  | from worlds.AutoWorld import AutoWorldRegister, call_all | 
					
						
							| 
									
										
										
										
											2023-02-15 15:46:10 -06:00
										 |  |  | from . import setup_solo_multiworld | 
					
						
							| 
									
										
										
										
											2023-01-15 13:18:32 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestBase(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2023-10-22 06:00:27 -05:00
										 |  |  |     def test_create_duplicate_locations(self): | 
					
						
							| 
									
										
										
										
											2023-03-27 01:04:13 +02:00
										 |  |  |         """Tests that no two Locations share a name or ID.""" | 
					
						
							| 
									
										
										
										
											2023-01-15 13:18:32 -06:00
										 |  |  |         for game_name, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							| 
									
										
										
										
											2023-02-15 15:46:10 -06:00
										 |  |  |             multiworld = setup_solo_multiworld(world_type) | 
					
						
							| 
									
										
										
										
											2023-03-27 01:04:13 +02:00
										 |  |  |             locations = Counter(location.name for location in multiworld.get_locations()) | 
					
						
							| 
									
										
										
										
											2023-01-15 13:18:32 -06:00
										 |  |  |             if locations: | 
					
						
							| 
									
										
										
										
											2024-01-30 08:00:47 +00:00
										 |  |  |                 self.assertEqual(locations.most_common(1)[0][1], 1, | 
					
						
							|  |  |  |                                  f"{world_type.game} has duplicate of location name {locations.most_common(1)}") | 
					
						
							| 
									
										
										
										
											2023-03-27 01:04:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             locations = Counter(location.address for location in multiworld.get_locations() | 
					
						
							|  |  |  |                                 if type(location.address) is int) | 
					
						
							|  |  |  |             if locations: | 
					
						
							| 
									
										
										
										
											2024-01-30 08:00:47 +00:00
										 |  |  |                 self.assertEqual(locations.most_common(1)[0][1], 1, | 
					
						
							|  |  |  |                                  f"{world_type.game} has duplicate of location ID {locations.most_common(1)}") | 
					
						
							| 
									
										
										
										
											2023-02-15 15:46:10 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-22 06:00:27 -05:00
										 |  |  |     def test_locations_in_datapackage(self): | 
					
						
							| 
									
										
										
										
											2023-02-15 15:46:10 -06:00
										 |  |  |         """Tests that created locations not filled before fill starts exist in the datapackage.""" | 
					
						
							|  |  |  |         for game_name, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							|  |  |  |             with self.subTest("Game", game_name=game_name): | 
					
						
							|  |  |  |                 multiworld = setup_solo_multiworld(world_type) | 
					
						
							|  |  |  |                 locations = multiworld.get_unfilled_locations()  # do unfilled locations to avoid Events | 
					
						
							|  |  |  |                 for location in locations: | 
					
						
							|  |  |  |                     self.assertIn(location.name, world_type.location_name_to_id) | 
					
						
							|  |  |  |                     self.assertEqual(location.address, world_type.location_name_to_id[location.name]) | 
					
						
							| 
									
										
										
										
											2023-02-26 19:13:24 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-22 06:00:27 -05:00
										 |  |  |     def test_location_creation_steps(self): | 
					
						
							| 
									
										
										
										
											2023-02-26 19:13:24 -06:00
										 |  |  |         """Tests that Regions and Locations aren't created after `create_items`.""" | 
					
						
							|  |  |  |         gen_steps = ("generate_early", "create_regions", "create_items") | 
					
						
							|  |  |  |         for game_name, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							|  |  |  |             with self.subTest("Game", game_name=game_name): | 
					
						
							|  |  |  |                 multiworld = setup_solo_multiworld(world_type, gen_steps) | 
					
						
							|  |  |  |                 region_count = len(multiworld.get_regions()) | 
					
						
							|  |  |  |                 location_count = len(multiworld.get_locations()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 call_all(multiworld, "set_rules") | 
					
						
							|  |  |  |                 self.assertEqual(region_count, len(multiworld.get_regions()), | 
					
						
							|  |  |  |                                  f"{game_name} modified region count during rule creation") | 
					
						
							|  |  |  |                 self.assertEqual(location_count, len(multiworld.get_locations()), | 
					
						
							|  |  |  |                                  f"{game_name} modified locations count during rule creation") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 call_all(multiworld, "generate_basic") | 
					
						
							|  |  |  |                 self.assertEqual(region_count, len(multiworld.get_regions()), | 
					
						
							|  |  |  |                                  f"{game_name} modified region count during generate_basic") | 
					
						
							|  |  |  |                 self.assertGreaterEqual(location_count, len(multiworld.get_locations()), | 
					
						
							|  |  |  |                                         f"{game_name} modified locations count during generate_basic") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 call_all(multiworld, "pre_fill") | 
					
						
							|  |  |  |                 self.assertEqual(region_count, len(multiworld.get_regions()), | 
					
						
							|  |  |  |                                  f"{game_name} modified region count during pre_fill") | 
					
						
							|  |  |  |                 self.assertGreaterEqual(location_count, len(multiworld.get_locations()), | 
					
						
							|  |  |  |                                         f"{game_name} modified locations count during pre_fill") | 
					
						
							| 
									
										
										
										
											2023-04-14 13:11:01 -05:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2023-10-22 06:00:27 -05:00
										 |  |  |     def test_location_group(self): | 
					
						
							| 
									
										
										
										
											2023-04-14 13:11:01 -05:00
										 |  |  |         """Test that all location name groups contain valid locations and don't share names.""" | 
					
						
							|  |  |  |         for game_name, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							|  |  |  |             with self.subTest(game_name, game_name=game_name): | 
					
						
							|  |  |  |                 for group_name, locations in world_type.location_name_groups.items(): | 
					
						
							|  |  |  |                     with self.subTest(group_name, group_name=group_name): | 
					
						
							|  |  |  |                         for location in locations: | 
					
						
							|  |  |  |                             self.assertIn(location, world_type.location_name_to_id) | 
					
						
							|  |  |  |                         self.assertNotIn(group_name, world_type.location_name_to_id) | 
					
						
							| 
									
										
										
										
											2023-11-15 07:26:10 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_location_descriptions_have_valid_names(self): | 
					
						
							|  |  |  |         """Ensure all location descriptions match a location name or location group name""" | 
					
						
							|  |  |  |         for game_name, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							|  |  |  |             valid_names = world_type.location_names.union(world_type.location_name_groups) | 
					
						
							|  |  |  |             for name in world_type.location_descriptions: | 
					
						
							|  |  |  |                 with self.subTest("Name should be valid", game=game_name, location=name): | 
					
						
							|  |  |  |                     self.assertIn(name, valid_names, | 
					
						
							|  |  |  |                                   "All location descriptions must match defined location names") |