mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00

🤞 * map option objects to a `World.options` dict * convert RoR2 to options dict system for testing * add temp behavior for lttp with notes * copy/paste bad * convert `set_default_common_options` to a namespace property * reorganize test call order * have fill_restrictive use the new options system * update world api * update soe tests * fix world api * core: auto initialize a dataclass on the World class with the option results * core: auto initialize a dataclass on the World class with the option results: small tying improvement * add `as_dict` method to the options dataclass * fix namespace issues with tests * have current option updates use `.value` instead of changing the option * update ror2 to use the new options system again * revert the junk pool dict since it's cased differently * fix begin_with_loop typo * write new and old options to spoiler * change factorio option behavior back * fix comparisons * move common and per_game_common options to new system * core: automatically create missing options_dataclass from legacy option_definitions * remove spoiler special casing and add back the Factorio option changing but in new system * give ArchipIDLE the default options_dataclass so its options get generated and spoilered properly * reimplement `inspect.get_annotations` * move option info generation for webhost to new system * need to include Common and PerGame common since __annotations__ doesn't include super * use get_type_hints for the options dictionary * typing.get_type_hints returns the bases too. * forgot to sweep through generate * sweep through all the tests * swap to a metaclass property * move remaining usages from get_type_hints to metaclass property * move remaining usages from __annotations__ to metaclass property * move remaining usages from legacy dictionaries to metaclass property * remove legacy dictionaries * cache the metaclass property * clarify inheritance in world api * move the messenger to new options system * add an assert for my dumb * update the doc * rename o to options * missed a spot * update new messenger options * comment spacing Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com> * fix tests * fix missing import * make the documentation definition more accurate * use options system for loc creation * type cast MessengerWorld * fix typo and use quotes for cast * LTTP: set random seed in tests * ArchipIdle: remove change here as it's default on AutoWorld * Stardew: Need to set state because `set_default_common_options` used to * The Messenger: update shop rando and helpers to new system; optimize imports * Add a kwarg to `as_dict` to do the casing for you * RoR2: use new kwarg for less code * RoR2: revert some accidental reverts * The Messenger: remove an unnecessary variable * remove TypeVar that isn't used * CommonOptions not abstract * Docs: fix mistake in options api.md Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com> * create options for item link worlds * revert accidental doc removals * Item Links: set default options on group * change Zillion to new options dataclass * remove unused parameter to function * use TypeGuard for Literal narrowing * move dlc quest to new api * move overcooked 2 to new api * fixed some missed code in oc2 * - Tried to be compliant with 993 (WIP?) * - I think it all works now * - Removed last trace of me touching core * typo * It now passes all tests! * Improve options, fix all issues I hope * - Fixed init options * dlcquest: fix bad imports * missed a file * - Reduce code duplication * add as_dict documentation * - Use .items(), get option name more directly, fix slot data content * - Remove generic options from the slot data * improve slot data documentation * remove `CommonOptions.get_value` (#21) * better slot data description Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --------- Co-authored-by: el-u <109771707+el-u@users.noreply.github.com> Co-authored-by: Doug Hoskisson <beauxq@users.noreply.github.com> Co-authored-by: Doug Hoskisson <beauxq@yahoo.com> Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> Co-authored-by: Alex Gilbert <alexgilbert@yahoo.com>
83 lines
3.4 KiB
Python
83 lines
3.4 KiB
Python
from argparse import Namespace
|
|
from typing import Dict, Optional, Callable
|
|
|
|
from BaseClasses import MultiWorld, CollectionState, Region
|
|
import unittest
|
|
|
|
|
|
class TestHelpers(unittest.TestCase):
|
|
multiworld: MultiWorld
|
|
player: int = 1
|
|
|
|
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()
|
|
|
|
def testRegionHelpers(self) -> None:
|
|
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_1": 321,
|
|
"loc_2": 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, Callable[[CollectionState], bool]] = {
|
|
"TestRegion1": lambda state: state.has("test_item", self.player)
|
|
}
|
|
|
|
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}"
|
|
self.assertEqual(exit_rules[exit_reg],
|
|
self.multiworld.get_entrance(entrance_name, self.player).access_rule)
|
|
|
|
for region in reg_exit_set:
|
|
current_region = self.multiworld.get_region(region, self.player)
|
|
current_region.add_exits(reg_exit_set[region])
|
|
exit_names = {_exit.name for _exit in current_region.exits}
|
|
for reg_exit in reg_exit_set[region]:
|
|
self.assertTrue(f"{region} -> {reg_exit}" in exit_names, f"{region} -> {reg_exit} not in {exit_names}")
|