Files
dockipelago/test/general/test_helpers.py
Ian Robinson 8b91f9ff72 Rule Builder: Make region.connect and add_event support rule builder (#5933)
* make region.connect and add_event support rule builder

* fix test

* oops fix

* update tests and typing

* rm unused
2026-02-18 20:57:05 +01:00

95 lines
4.0 KiB
Python

import unittest
from typing import Any, Dict, Optional
from typing_extensions import override
from BaseClasses import CollectionRule, MultiWorld, Region
from rule_builder.rules import Has, Rule
from test.general import TestWorld
class TestHelpers(unittest.TestCase):
multiworld: MultiWorld
player: int = 1
@override
def setUp(self) -> None:
self.multiworld = MultiWorld(self.player)
self.multiworld.game[self.player] = "helper_test_game"
self.multiworld.player_name = {1: "Tester"}
self.multiworld.set_seed()
self.multiworld.worlds[self.player] = TestWorld(self.multiworld, self.player)
def test_region_helpers(self) -> None:
"""Tests `Region.add_locations()` and `Region.add_exits()` have correct behavior"""
regions: Dict[str, str] = {
"TestRegion1": "I'm an apple",
"TestRegion2": "I'm a banana",
"TestRegion3": "Empty Region",
}
locations: Dict[str, Dict[str, Optional[int]]] = {
"TestRegion1": {
"loc_1": 123,
"loc_2": 456,
"event_loc": None,
},
"TestRegion2": {
"loc_3": 321,
"loc_4": 654,
}
}
reg_exits: Dict[str, Dict[str, Optional[str]]] = {
"TestRegion1": {"TestRegion2": "connection"},
"TestRegion2": {"TestRegion1": None},
}
reg_exit_set: Dict[str, set[str]] = {
"TestRegion1": {"TestRegion3"}
}
exit_rules: Dict[str, CollectionRule | Rule[Any]] = {
"TestRegion1": lambda state: state.has("test_item", self.player),
"TestRegion2": Has("test_item2"),
}
self.multiworld.regions += [Region(region, self.player, self.multiworld, regions[region]) for region in regions]
with self.subTest("Test Location Creation Helper"):
for region, loc_pair in locations.items():
self.multiworld.get_region(region, self.player).add_locations(loc_pair)
created_location_names = [loc.name for loc in self.multiworld.get_locations()]
for loc_pair in locations.values():
for loc_name in loc_pair:
self.assertTrue(loc_name in created_location_names)
with self.subTest("Test Exit Creation Helper"):
for region, exit_dict in reg_exits.items():
self.multiworld.get_region(region, self.player).add_exits(exit_dict, exit_rules)
created_exit_names = [exit.name for region in self.multiworld.get_regions() for exit in region.exits]
for parent, exit_pair in reg_exits.items():
for exit_reg, exit_name in exit_pair.items():
if exit_name:
self.assertTrue(exit_name in created_exit_names)
else:
self.assertTrue(f"{parent} -> {exit_reg}" in created_exit_names)
if exit_reg in exit_rules:
entrance_name = exit_name if exit_name else f"{parent} -> {exit_reg}"
rule = exit_rules[exit_reg]
if isinstance(rule, Rule):
self.assertEqual(rule.resolve(self.multiworld.worlds[self.player]),
self.multiworld.get_entrance(entrance_name, self.player).access_rule)
else:
self.assertEqual(rule, self.multiworld.get_entrance(entrance_name, self.player).access_rule)
for region, exit_set in reg_exit_set.items():
current_region = self.multiworld.get_region(region, self.player)
current_region.add_exits(exit_set)
exit_names = {_exit.name for _exit in current_region.exits}
for reg_exit in exit_set:
self.assertTrue(f"{region} -> {reg_exit}" in exit_names,
f"{region} -> {reg_exit} not in {exit_names}")