| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  | from . import ZillionTestBase | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestGoalVanilla(ZillionTestBase): | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         "start_char": "JJ", | 
					
						
							|  |  |  |         "jump_levels": "vanilla", | 
					
						
							|  |  |  |         "gun_levels": "vanilla", | 
					
						
							|  |  |  |         "floppy_disk_count": 7, | 
					
						
							|  |  |  |         "floppy_req": 6, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_floppies(self) -> None: | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         self.collect_by_name(["Apple", "Champ", "Red ID Card"]) | 
					
						
							|  |  |  |         self.assertBeatable(False)  # 0 floppies | 
					
						
							|  |  |  |         floppies = self.get_items_by_name("Floppy Disk") | 
					
						
							|  |  |  |         win = self.get_item_by_name("Win") | 
					
						
							|  |  |  |         self.collect(floppies[:-2])  # 1 too few | 
					
						
							|  |  |  |         self.assertEqual(self.count("Floppy Disk"), 5) | 
					
						
							|  |  |  |         self.assertBeatable(False) | 
					
						
							|  |  |  |         self.collect(floppies[-2:-1])  # exact | 
					
						
							|  |  |  |         self.assertEqual(self.count("Floppy Disk"), 6) | 
					
						
							|  |  |  |         self.assertBeatable(True) | 
					
						
							|  |  |  |         self.remove([win])  # reset | 
					
						
							|  |  |  |         self.collect(floppies[-1:])  # 1 extra | 
					
						
							|  |  |  |         self.assertEqual(self.count("Floppy Disk"), 7) | 
					
						
							|  |  |  |         self.assertBeatable(True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_with_everything(self) -> None: | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         self.collect_by_name(["Apple", "Champ", "Red ID Card", "Floppy Disk"]) | 
					
						
							|  |  |  |         self.assertBeatable(True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_no_jump(self) -> None: | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         self.collect_by_name(["Champ", "Red ID Card", "Floppy Disk"]) | 
					
						
							|  |  |  |         self.assertBeatable(False) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_no_gun(self) -> None: | 
					
						
							|  |  |  |         self.ensure_gun_3_requirement() | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         self.collect_by_name(["Apple", "Red ID Card", "Floppy Disk"]) | 
					
						
							|  |  |  |         self.assertBeatable(False) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_no_red(self) -> None: | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         self.collect_by_name(["Apple", "Champ", "Floppy Disk"]) | 
					
						
							|  |  |  |         self.assertBeatable(False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestGoalBalanced(ZillionTestBase): | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         "start_char": "JJ", | 
					
						
							|  |  |  |         "jump_levels": "balanced", | 
					
						
							|  |  |  |         "gun_levels": "balanced", | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_jump(self) -> None: | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         self.collect_by_name(["Red ID Card", "Floppy Disk", "Zillion"]) | 
					
						
							|  |  |  |         self.assertBeatable(False)  # not enough jump | 
					
						
							|  |  |  |         opas = self.get_items_by_name("Opa-Opa") | 
					
						
							|  |  |  |         self.collect(opas[:1])  # too few | 
					
						
							|  |  |  |         self.assertEqual(self.count("Opa-Opa"), 1) | 
					
						
							|  |  |  |         self.assertBeatable(False) | 
					
						
							|  |  |  |         self.collect(opas[1:]) | 
					
						
							|  |  |  |         self.assertBeatable(True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_guns(self) -> None: | 
					
						
							|  |  |  |         self.ensure_gun_3_requirement() | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         self.collect_by_name(["Red ID Card", "Floppy Disk", "Opa-Opa"]) | 
					
						
							|  |  |  |         self.assertBeatable(False)  # not enough gun | 
					
						
							|  |  |  |         guns = self.get_items_by_name("Zillion") | 
					
						
							|  |  |  |         self.collect(guns[:1])  # too few | 
					
						
							|  |  |  |         self.assertEqual(self.count("Zillion"), 1) | 
					
						
							|  |  |  |         self.assertBeatable(False) | 
					
						
							|  |  |  |         self.collect(guns[1:]) | 
					
						
							|  |  |  |         self.assertBeatable(True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestGoalRestrictive(ZillionTestBase): | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         "start_char": "JJ", | 
					
						
							|  |  |  |         "jump_levels": "restrictive", | 
					
						
							|  |  |  |         "gun_levels": "restrictive", | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_jump(self) -> None: | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         self.collect_by_name(["Champ", "Red ID Card", "Floppy Disk", "Zillion"]) | 
					
						
							|  |  |  |         self.assertBeatable(False)  # not enough jump | 
					
						
							|  |  |  |         self.collect_by_name("Opa-Opa") | 
					
						
							|  |  |  |         self.assertBeatable(False)  # with all opas, jj champ can't jump | 
					
						
							|  |  |  |         self.collect_by_name("Apple") | 
					
						
							|  |  |  |         self.assertBeatable(True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_guns(self) -> None: | 
					
						
							|  |  |  |         self.ensure_gun_3_requirement() | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         self.collect_by_name(["Apple", "Red ID Card", "Floppy Disk", "Opa-Opa"]) | 
					
						
							|  |  |  |         self.assertBeatable(False)  # not enough gun | 
					
						
							|  |  |  |         self.collect_by_name("Zillion") | 
					
						
							|  |  |  |         self.assertBeatable(False)  # with all guns, jj apple can't gun | 
					
						
							|  |  |  |         self.collect_by_name("Champ") | 
					
						
							|  |  |  |         self.assertBeatable(True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestGoalAppleStart(ZillionTestBase): | 
					
						
							|  |  |  |     """ creation of character rescue items has some special interactions with logic """ | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         "start_char": "Apple", | 
					
						
							|  |  |  |         "jump_levels": "balanced", | 
					
						
							|  |  |  |         "gun_levels": "low", | 
					
						
							|  |  |  |         "zillion_count": 5 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_guns_jj_first(self) -> None: | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         """ with low gun levels, 5 Zillion is enough to get JJ to gun 3 """ | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |         self.ensure_gun_3_requirement() | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         self.collect_by_name(["JJ", "Red ID Card", "Floppy Disk", "Opa-Opa"]) | 
					
						
							|  |  |  |         self.assertBeatable(False)  # not enough gun | 
					
						
							|  |  |  |         self.collect_by_name("Zillion") | 
					
						
							|  |  |  |         self.assertBeatable(True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_guns_zillions_first(self) -> None: | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         """ with low gun levels, 5 Zillion is enough to get JJ to gun 3 """ | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |         self.ensure_gun_3_requirement() | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         self.collect_by_name(["Zillion", "Red ID Card", "Floppy Disk", "Opa-Opa"]) | 
					
						
							|  |  |  |         self.assertBeatable(False)  # not enough gun | 
					
						
							|  |  |  |         self.collect_by_name("JJ") | 
					
						
							|  |  |  |         self.assertBeatable(True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestGoalChampStart(ZillionTestBase): | 
					
						
							|  |  |  |     """ creation of character rescue items has some special interactions with logic """ | 
					
						
							|  |  |  |     options = { | 
					
						
							|  |  |  |         "start_char": "Champ", | 
					
						
							|  |  |  |         "jump_levels": "low", | 
					
						
							|  |  |  |         "gun_levels": "balanced", | 
					
						
							|  |  |  |         "opa_opa_count": 5, | 
					
						
							|  |  |  |         "opas_per_level": 1 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_jump_jj_first(self) -> None: | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         """ with low jump levels, 5 level-ups is enough to get JJ to jump 3 """ | 
					
						
							|  |  |  |         self.collect_by_name(["JJ", "Red ID Card", "Floppy Disk", "Zillion"]) | 
					
						
							|  |  |  |         self.assertBeatable(False)  # not enough jump | 
					
						
							|  |  |  |         self.collect_by_name("Opa-Opa") | 
					
						
							|  |  |  |         self.assertBeatable(True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 13:23:30 -07:00
										 |  |  |     def test_jump_opa_first(self) -> None: | 
					
						
							| 
									
										
										
										
											2022-10-20 10:41:11 -07:00
										 |  |  |         """ with low jump levels, 5 level-ups is enough to get JJ to jump 3 """ | 
					
						
							|  |  |  |         self.collect_by_name(["Opa-Opa", "Red ID Card", "Floppy Disk", "Zillion"]) | 
					
						
							|  |  |  |         self.assertBeatable(False)  # not enough jump | 
					
						
							|  |  |  |         self.collect_by_name("JJ") | 
					
						
							|  |  |  |         self.assertBeatable(True) |