From ecd2675ea8420528643a0625f295fce4fc1bf594 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sun, 19 Feb 2023 23:09:54 +0100 Subject: [PATCH] Tests: check that Regions are reachable (#1034) * Tests: check that Regions are reachable try to prevent errors from unconnected/never reachable Regions * Test region access (#1039) * Tests: note oot's default unreachable regions * [SM] Fixed failing testAllStateCanReachEverything (#1087) * [SM] Fixed failing testAllStateCanReachEverything - by adding exclusion for Regions used only when corresponding Starting Location is used - by removing unnecessary VARIA Regions used only for EscapeRando (not supported in AP anyway) * Update worlds/sm/Regions.py Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> * Update worlds/sm/Rules.py Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> * Update worlds/sm/Regions.py Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> * Update test/general/TestReachability.py --------- Co-authored-by: espeon65536 <81029175+espeon65536@users.noreply.github.com> Co-authored-by: lordlou <87331798+lordlou@users.noreply.github.com> Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- test/general/TestReachability.py | 28 ++++++++++++++++++++++++++++ worlds/sm/Regions.py | 13 +++++++------ worlds/sm/Rules.py | 5 +++-- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/test/general/TestReachability.py b/test/general/TestReachability.py index 10525a37..4737f2be 100644 --- a/test/general/TestReachability.py +++ b/test/general/TestReachability.py @@ -9,10 +9,33 @@ from . import setup_solo_multiworld class TestBase(unittest.TestCase): gen_steps = ["generate_early", "create_regions", "create_items", "set_rules", "generate_basic", "pre_fill"] + default_settings_unreachable_regions = { + "A Link to the Past": { + "Chris Houlihan Room", # glitch room by definition + "Desert Northern Cliffs", # on top of mountain, only reachable via OWG + "Dark Death Mountain Bunny Descent Area" # OWG Mountain descent + }, + "Ocarina of Time": { + "Prelude of Light Warp", # Prelude is not progression by default + "Serenade of Water Warp", # Serenade is not progression by default + "Lost Woods Mushroom Timeout", # trade quest starts after this item + "ZD Eyeball Frog Timeout", # trade quest starts after this item + "ZR Top of Waterfall", # dummy region used for entrance shuffle + }, + # The following SM regions are only used when the corresponding StartLocation option is selected (so not with default settings). + # Also, those dont have any entrances as they serve as starting Region (that's why they have to be excluded for testAllStateCanReachEverything). + "Super Metroid": { + "Ceres", + "Gauntlet Top", + "Mama Turtle" + } + } + def testAllStateCanReachEverything(self): for game_name, world_type in AutoWorldRegister.world_types.items(): # Final Fantasy logic is controlled by finalfantasyrandomizer.com if game_name not in {"Ori and the Blind Forest"}: # TODO: fix Ori Logic + unreachable_regions = self.default_settings_unreachable_regions.get(game_name, set()) with self.subTest("Game", game=game_name): world = setup_solo_multiworld(world_type) excluded = world.exclude_locations[1].value @@ -22,6 +45,11 @@ class TestBase(unittest.TestCase): with self.subTest("Location should be reached", location=location): self.assertTrue(location.can_reach(state), f"{location.name} unreachable") + for region in world.get_regions(): + if region.name not in unreachable_regions: + with self.subTest("Region should be reached", region=region): + self.assertTrue(region.can_reach(state)) + with self.subTest("Completion Condition"): self.assertTrue(world.can_beat_game(state)) diff --git a/worlds/sm/Regions.py b/worlds/sm/Regions.py index a3f37692..966366e6 100644 --- a/worlds/sm/Regions.py +++ b/worlds/sm/Regions.py @@ -6,12 +6,13 @@ def create_regions(self, world, player: int): regions = [] for accessPoint in Logic.accessPoints: - regions.append(create_region( self, - world, - player, - accessPoint.Name, - None, - [accessPoint.Name + "->" + key for key in accessPoint.intraTransitions.keys()])) + if not accessPoint.Escape: + regions.append(create_region(self, + world, + player, + accessPoint.Name, + None, + [accessPoint.Name + "->" + key for key in accessPoint.intraTransitions.keys()])) world.regions += regions diff --git a/worlds/sm/Rules.py b/worlds/sm/Rules.py index 84849f52..54468a40 100644 --- a/worlds/sm/Rules.py +++ b/worlds/sm/Rules.py @@ -36,5 +36,6 @@ def set_rules(world, player): add_postAvailable_rule(location, player, value.PostAvailable) for accessPoint in Logic.accessPoints: - for key, value1 in accessPoint.intraTransitions.items(): - set_entrance_rule(world.get_entrance(accessPoint.Name + "->" + key, player), player, value1) + if not accessPoint.Escape: + for key, value1 in accessPoint.intraTransitions.items(): + set_entrance_rule(world.get_entrance(accessPoint.Name + "->" + key, player), player, value1)