| 
									
										
										
										
											2023-04-10 04:33:47 +02:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2024-04-18 11:58:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-31 05:04:21 -05:00
										 |  |  | from BaseClasses import MultiWorld, PlandoOptions | 
					
						
							| 
									
										
										
										
											2024-04-18 11:58:18 -05:00
										 |  |  | from Options import ItemLinks | 
					
						
							| 
									
										
										
										
											2023-04-10 04:33:47 +02:00
										 |  |  | from worlds.AutoWorld import AutoWorldRegister | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestOptions(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2023-10-22 06:00:27 -05:00
										 |  |  |     def test_options_have_doc_string(self): | 
					
						
							|  |  |  |         """Test that submitted options have their own specified docstring""" | 
					
						
							| 
									
										
										
										
											2023-04-10 04:33:47 +02:00
										 |  |  |         for gamename, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							|  |  |  |             if not world_type.hidden: | 
					
						
							| 
									
										
										
										
											2023-10-10 15:30:20 -05:00
										 |  |  |                 for option_key, option in world_type.options_dataclass.type_hints.items(): | 
					
						
							| 
									
										
										
										
											2023-04-10 04:33:47 +02:00
										 |  |  |                     with self.subTest(game=gamename, option=option_key): | 
					
						
							|  |  |  |                         self.assertTrue(option.__doc__) | 
					
						
							| 
									
										
										
										
											2024-01-15 20:50:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_options_are_not_set_by_world(self): | 
					
						
							|  |  |  |         """Test that options attribute is not already set""" | 
					
						
							|  |  |  |         for gamename, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							|  |  |  |             with self.subTest(game=gamename): | 
					
						
							|  |  |  |                 self.assertFalse(hasattr(world_type, "options"), | 
					
						
							|  |  |  |                                  f"Unexpected assignment to {world_type.__name__}.options!") | 
					
						
							| 
									
										
										
										
											2024-04-18 11:58:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-30 17:32:38 -05:00
										 |  |  |     def test_duplicate_options(self) -> None: | 
					
						
							|  |  |  |         """Tests that a world doesn't reuse the same option class.""" | 
					
						
							|  |  |  |         for game_name, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							|  |  |  |             with self.subTest(game=game_name): | 
					
						
							|  |  |  |                 seen_options = set() | 
					
						
							|  |  |  |                 for option in world_type.options_dataclass.type_hints.values(): | 
					
						
							|  |  |  |                     if not option.visibility: | 
					
						
							|  |  |  |                         continue | 
					
						
							|  |  |  |                     self.assertFalse(option in seen_options, f"{option} found in assigned options multiple times.") | 
					
						
							|  |  |  |                     seen_options.add(option) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-18 11:58:18 -05:00
										 |  |  |     def test_item_links_name_groups(self): | 
					
						
							|  |  |  |         """Tests that item links successfully unfold item_name_groups""" | 
					
						
							|  |  |  |         item_link_groups = [ | 
					
						
							|  |  |  |             [{ | 
					
						
							|  |  |  |                 "name": "ItemLinkGroup", | 
					
						
							|  |  |  |                 "item_pool": ["Everything"], | 
					
						
							|  |  |  |                 "link_replacement": False, | 
					
						
							|  |  |  |                 "replacement_item": None, | 
					
						
							|  |  |  |             }], | 
					
						
							|  |  |  |             [{ | 
					
						
							|  |  |  |                 "name": "ItemLinkGroup", | 
					
						
							|  |  |  |                 "item_pool": ["Hammer", "Bow"], | 
					
						
							|  |  |  |                 "link_replacement": False, | 
					
						
							|  |  |  |                 "replacement_item": None, | 
					
						
							|  |  |  |             }] | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |         # we really need some sort of test world but generic doesn't have enough items for this | 
					
						
							|  |  |  |         world = AutoWorldRegister.world_types["A Link to the Past"] | 
					
						
							|  |  |  |         plando_options = PlandoOptions.from_option_string("bosses") | 
					
						
							|  |  |  |         item_links = [ItemLinks.from_any(item_link_groups[0]), ItemLinks.from_any(item_link_groups[1])] | 
					
						
							|  |  |  |         for link in item_links: | 
					
						
							|  |  |  |             link.verify(world, "tester", plando_options) | 
					
						
							|  |  |  |             self.assertIn("Hammer", link.value[0]["item_pool"]) | 
					
						
							|  |  |  |             self.assertIn("Bow", link.value[0]["item_pool"]) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         # TODO test that the group created using these options has the items | 
					
						
							| 
									
										
										
										
											2024-07-31 05:04:21 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_item_links_resolve(self): | 
					
						
							|  |  |  |         """Test item link option resolves correctly.""" | 
					
						
							|  |  |  |         item_link_group = [{ | 
					
						
							|  |  |  |             "name": "ItemLinkTest", | 
					
						
							|  |  |  |             "item_pool": ["Everything"], | 
					
						
							|  |  |  |             "link_replacement": False, | 
					
						
							|  |  |  |             "replacement_item": None, | 
					
						
							|  |  |  |         }] | 
					
						
							|  |  |  |         item_links = {1: ItemLinks.from_any(item_link_group), 2: ItemLinks.from_any(item_link_group)} | 
					
						
							|  |  |  |         for link in item_links.values(): | 
					
						
							|  |  |  |             self.assertEqual(link.value[0], item_link_group[0]) | 
					
						
							| 
									
										
										
										
											2024-10-16 23:31:36 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_pickle_dumps(self): | 
					
						
							|  |  |  |         """Test options can be pickled into database for WebHost generation""" | 
					
						
							|  |  |  |         import pickle | 
					
						
							|  |  |  |         for gamename, world_type in AutoWorldRegister.world_types.items(): | 
					
						
							|  |  |  |             if not world_type.hidden: | 
					
						
							|  |  |  |                 for option_key, option in world_type.options_dataclass.type_hints.items(): | 
					
						
							|  |  |  |                     with self.subTest(game=gamename, option=option_key): | 
					
						
							| 
									
										
										
										
											2024-11-17 01:52:49 +01:00
										 |  |  |                         pickle.dumps(option.from_any(option.default)) |