diff --git a/test/worlds/test_base.py b/test/worlds/test_base.py index 1aa6ff23..0d7272be 100644 --- a/test/worlds/test_base.py +++ b/test/worlds/test_base.py @@ -19,13 +19,13 @@ class WorldTestBase(unittest.TestCase): if self.auto_construct: self.world_setup() - def world_setup(self) -> None: + def world_setup(self, seed: typing.Optional[int] = None) -> None: if not hasattr(self, "game"): raise NotImplementedError("didn't define game name") self.world = MultiWorld(1) self.world.game[1] = self.game self.world.player_name = {1: "Tester"} - self.world.set_seed() + self.world.set_seed(seed) args = Namespace() for name, option in AutoWorld.AutoWorldRegister.world_types[self.game].option_definitions.items(): setattr(args, name, { diff --git a/test/worlds/zillion/TestGoal.py b/test/worlds/zillion/TestGoal.py index 96701e83..1c793056 100644 --- a/test/worlds/zillion/TestGoal.py +++ b/test/worlds/zillion/TestGoal.py @@ -10,7 +10,7 @@ class TestGoalVanilla(ZillionTestBase): "floppy_req": 6, } - def test_floppies(self): + def test_floppies(self) -> None: self.collect_by_name(["Apple", "Champ", "Red ID Card"]) self.assertBeatable(False) # 0 floppies floppies = self.get_items_by_name("Floppy Disk") @@ -26,19 +26,20 @@ class TestGoalVanilla(ZillionTestBase): self.assertEqual(self.count("Floppy Disk"), 7) self.assertBeatable(True) - def test_with_everything(self): + def test_with_everything(self) -> None: self.collect_by_name(["Apple", "Champ", "Red ID Card", "Floppy Disk"]) self.assertBeatable(True) - def test_no_jump(self): + def test_no_jump(self) -> None: self.collect_by_name(["Champ", "Red ID Card", "Floppy Disk"]) self.assertBeatable(False) - def test_no_gun(self): + def test_no_gun(self) -> None: + self.ensure_gun_3_requirement() self.collect_by_name(["Apple", "Red ID Card", "Floppy Disk"]) self.assertBeatable(False) - def test_no_red(self): + def test_no_red(self) -> None: self.collect_by_name(["Apple", "Champ", "Floppy Disk"]) self.assertBeatable(False) @@ -50,7 +51,7 @@ class TestGoalBalanced(ZillionTestBase): "gun_levels": "balanced", } - def test_jump(self): + def test_jump(self) -> None: self.collect_by_name(["Red ID Card", "Floppy Disk", "Zillion"]) self.assertBeatable(False) # not enough jump opas = self.get_items_by_name("Opa-Opa") @@ -60,7 +61,8 @@ class TestGoalBalanced(ZillionTestBase): self.collect(opas[1:]) self.assertBeatable(True) - def test_guns(self): + def test_guns(self) -> None: + self.ensure_gun_3_requirement() self.collect_by_name(["Red ID Card", "Floppy Disk", "Opa-Opa"]) self.assertBeatable(False) # not enough gun guns = self.get_items_by_name("Zillion") @@ -78,7 +80,7 @@ class TestGoalRestrictive(ZillionTestBase): "gun_levels": "restrictive", } - def test_jump(self): + def test_jump(self) -> None: self.collect_by_name(["Champ", "Red ID Card", "Floppy Disk", "Zillion"]) self.assertBeatable(False) # not enough jump self.collect_by_name("Opa-Opa") @@ -86,7 +88,8 @@ class TestGoalRestrictive(ZillionTestBase): self.collect_by_name("Apple") self.assertBeatable(True) - def test_guns(self): + def test_guns(self) -> None: + self.ensure_gun_3_requirement() self.collect_by_name(["Apple", "Red ID Card", "Floppy Disk", "Opa-Opa"]) self.assertBeatable(False) # not enough gun self.collect_by_name("Zillion") @@ -104,15 +107,17 @@ class TestGoalAppleStart(ZillionTestBase): "zillion_count": 5 } - def test_guns_jj_first(self): + def test_guns_jj_first(self) -> None: """ with low gun levels, 5 Zillion is enough to get JJ to gun 3 """ + self.ensure_gun_3_requirement() 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) - def test_guns_zillions_first(self): + def test_guns_zillions_first(self) -> None: """ with low gun levels, 5 Zillion is enough to get JJ to gun 3 """ + self.ensure_gun_3_requirement() self.collect_by_name(["Zillion", "Red ID Card", "Floppy Disk", "Opa-Opa"]) self.assertBeatable(False) # not enough gun self.collect_by_name("JJ") @@ -129,14 +134,14 @@ class TestGoalChampStart(ZillionTestBase): "opas_per_level": 1 } - def test_jump_jj_first(self): + def test_jump_jj_first(self) -> None: """ 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) - def test_jump_opa_first(self): + def test_jump_opa_first(self) -> None: """ 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 diff --git a/test/worlds/zillion/__init__.py b/test/worlds/zillion/__init__.py index 43100d3a..fb81bda5 100644 --- a/test/worlds/zillion/__init__.py +++ b/test/worlds/zillion/__init__.py @@ -1,13 +1,20 @@ +from typing import cast from test.worlds.test_base import WorldTestBase -from worlds.zillion.region import ZillionLocation +from worlds.zillion import ZillionWorld class ZillionTestBase(WorldTestBase): game = "Zillion" - def world_setup(self) -> None: - super().world_setup() - # make sure game requires gun 3 for tests - for location in self.world.get_locations(): - if isinstance(location, ZillionLocation) and location.name.startswith("O-7"): - location.zz_loc.req.gun = 3 + def ensure_gun_3_requirement(self) -> None: + """ + There's a low probability that gun 3 is not required. + + This makes sure that gun 3 is required by making all the canisters + in O-7 (including key word canisters) require gun 3. + """ + zz_world = cast(ZillionWorld, self.world.worlds[1]) + assert zz_world.zz_system.randomizer + for zz_loc_name, zz_loc in zz_world.zz_system.randomizer.locations.items(): + if zz_loc_name.startswith("r15c6"): + zz_loc.req.gun = 3