| 
									
										
										
										
											2022-10-12 13:28:32 -05:00
										 |  |  | import unittest | 
					
						
							|  |  |  | import Generate | 
					
						
							|  |  |  | from Options import PlandoBosses | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SingleBosses(PlandoBosses): | 
					
						
							|  |  |  |     bosses = {"B1", "B2"} | 
					
						
							|  |  |  |     locations = {"L1", "L2"} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     option_vanilla = 0 | 
					
						
							|  |  |  |     option_shuffle = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def can_place_boss(boss: str, location: str) -> bool: | 
					
						
							|  |  |  |         if boss == "b1" and location == "l1": | 
					
						
							|  |  |  |             return False | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MultiBosses(SingleBosses): | 
					
						
							|  |  |  |     bosses = SingleBosses.bosses  # explicit copy required | 
					
						
							|  |  |  |     locations = SingleBosses.locations | 
					
						
							|  |  |  |     duplicate_bosses = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     option_singularity = 2  # required when duplicate_bosses = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestPlandoBosses(unittest.TestCase): | 
					
						
							|  |  |  |     def testCI(self): | 
					
						
							|  |  |  |         """Bosses, locations and modes are supposed to be case-insensitive""" | 
					
						
							|  |  |  |         self.assertEqual(MultiBosses.from_any("L1-B2").value, "l1-b2;vanilla") | 
					
						
							|  |  |  |         self.assertEqual(MultiBosses.from_any("ShUfFlE").value, SingleBosses.option_shuffle) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testRandom(self): | 
					
						
							|  |  |  |         """Validate random is random""" | 
					
						
							|  |  |  |         import random | 
					
						
							|  |  |  |         random.seed(0) | 
					
						
							|  |  |  |         value1 = MultiBosses.from_any("random") | 
					
						
							|  |  |  |         random.seed(0) | 
					
						
							|  |  |  |         value2 = MultiBosses.from_text("random") | 
					
						
							|  |  |  |         self.assertEqual(value1, value2) | 
					
						
							|  |  |  |         for n in range(0, 100): | 
					
						
							|  |  |  |             if MultiBosses.from_text("random") != value1: | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             raise Exception("random is not random") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testShuffleMode(self): | 
					
						
							|  |  |  |         """Test that simple modes (no Plando) work""" | 
					
						
							|  |  |  |         self.assertEqual(MultiBosses.from_any("shuffle"), MultiBosses.option_shuffle) | 
					
						
							|  |  |  |         self.assertNotEqual(MultiBosses.from_any("vanilla"), MultiBosses.option_shuffle) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testPlacement(self): | 
					
						
							|  |  |  |         """Test that valid placements work and invalid placements fail""" | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("l1-b1") | 
					
						
							|  |  |  |         MultiBosses.from_any("l1-b2;l2-b1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testMixed(self): | 
					
						
							|  |  |  |         """Test that shuffle is applied for remaining locations""" | 
					
						
							|  |  |  |         self.assertIn("shuffle", MultiBosses.from_any("l1-b2;l2-b1;shuffle").value) | 
					
						
							|  |  |  |         self.assertIn("vanilla", MultiBosses.from_any("l1-b2;l2-b1").value) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testUnknown(self): | 
					
						
							|  |  |  |         """Test that unknown values throw exceptions""" | 
					
						
							|  |  |  |         # unknown boss | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("l1-b0") | 
					
						
							|  |  |  |         # unknown location | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("l0-b1") | 
					
						
							|  |  |  |         # swapped boss-location | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("b2-b2") | 
					
						
							|  |  |  |         # boss name in place of mode (no singularity) | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             SingleBosses.from_any("b1") | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             SingleBosses.from_any("l2-b2;b1") | 
					
						
							|  |  |  |         # location name in place of mode | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("l1") | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("l2-b2;l1") | 
					
						
							|  |  |  |         # mode name in place of location | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("shuffle-b2;vanilla") | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("shuffle-b2;l2-b2") | 
					
						
							|  |  |  |         # mode name in place of boss | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("l2-shuffle;vanilla") | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("l1-shuffle;l2-b2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testOrder(self): | 
					
						
							|  |  |  |         """Can't use mode in random places""" | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("shuffle;l2-b2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testDuplicateBoss(self): | 
					
						
							|  |  |  |         """Can place the same boss twice""" | 
					
						
							|  |  |  |         MultiBosses.from_any("l1-b2;l2-b2") | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             SingleBosses.from_any("l1-b2;l2-b2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testDuplicateLocation(self): | 
					
						
							|  |  |  |         """Can't use the same location twice""" | 
					
						
							|  |  |  |         with self.assertRaises(ValueError): | 
					
						
							|  |  |  |             MultiBosses.from_any("l1-b2;l1-b2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testSingularity(self): | 
					
						
							|  |  |  |         """Test automatic singularity mode""" | 
					
						
							|  |  |  |         self.assertIn(";singularity", MultiBosses.from_any("b2").value) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-17 17:25:59 +01:00
										 |  |  |     def testPlandoOptions(self): | 
					
						
							|  |  |  |         """Test that plando options verification works""" | 
					
						
							| 
									
										
										
										
											2022-10-12 13:28:32 -05:00
										 |  |  |         plandoed_string = "l1-b2;l2-b1" | 
					
						
							|  |  |  |         mixed_string = "l1-b2;shuffle" | 
					
						
							|  |  |  |         regular_string = "shuffle" | 
					
						
							|  |  |  |         plandoed = MultiBosses.from_any(plandoed_string) | 
					
						
							|  |  |  |         mixed = MultiBosses.from_any(mixed_string) | 
					
						
							|  |  |  |         regular = MultiBosses.from_any(regular_string) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # plando should work with boss plando | 
					
						
							| 
									
										
										
										
											2023-01-17 17:25:59 +01:00
										 |  |  |         plandoed.verify(None, "Player", Generate.PlandoOptions.bosses) | 
					
						
							| 
									
										
										
										
											2022-10-12 13:28:32 -05:00
										 |  |  |         self.assertTrue(plandoed.value.startswith(plandoed_string)) | 
					
						
							|  |  |  |         # plando should fall back to default without boss plando | 
					
						
							| 
									
										
										
										
											2023-01-17 17:25:59 +01:00
										 |  |  |         plandoed.verify(None, "Player", Generate.PlandoOptions.items) | 
					
						
							| 
									
										
										
										
											2022-10-12 13:28:32 -05:00
										 |  |  |         self.assertEqual(plandoed, MultiBosses.option_vanilla) | 
					
						
							|  |  |  |         # mixed should fall back to mode | 
					
						
							| 
									
										
										
										
											2023-01-17 17:25:59 +01:00
										 |  |  |         mixed.verify(None, "Player", Generate.PlandoOptions.items)  # should produce a warning and still work | 
					
						
							| 
									
										
										
										
											2022-10-12 13:28:32 -05:00
										 |  |  |         self.assertEqual(mixed, MultiBosses.option_shuffle) | 
					
						
							|  |  |  |         # mode stuff should just work | 
					
						
							| 
									
										
										
										
											2023-01-17 17:25:59 +01:00
										 |  |  |         regular.verify(None, "Player", Generate.PlandoOptions.items) | 
					
						
							| 
									
										
										
										
											2022-10-12 13:28:32 -05:00
										 |  |  |         self.assertEqual(regular, MultiBosses.option_shuffle) |