SoE: add tests ... (#1097)
* SoE: add tests ... ... for goals, bronze axe and bronze spear+ * SoE: fix tests
This commit is contained in:
		
							parent
							
								
									7f3f886e41
								
							
						
					
					
						commit
						097ac189e4
					
				| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					import typing
 | 
				
			||||||
 | 
					from . import SoETestBase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AccessTest(SoETestBase):
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def _resolveGourds(gourds: typing.Dict[str, typing.Iterable[int]]):
 | 
				
			||||||
 | 
					        return [f"{name} #{number}" for name, numbers in gourds.items() for number in numbers]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def testBronzeAxe(self):
 | 
				
			||||||
 | 
					        gourds = {
 | 
				
			||||||
 | 
					            "Pyramid bottom": (118, 121, 122, 123, 124, 125),
 | 
				
			||||||
 | 
					            "Pyramid top": (140,)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        locations = ["Rimsala"] + self._resolveGourds(gourds)
 | 
				
			||||||
 | 
					        items = [["Bronze Axe"]]
 | 
				
			||||||
 | 
					        self.assertAccessDependency(locations, items)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def testBronzeSpearPlus(self):
 | 
				
			||||||
 | 
					        locations = ["Megataur"]
 | 
				
			||||||
 | 
					        items = [["Bronze Spear"], ["Lance (Weapon)"], ["Laser Lance"]]
 | 
				
			||||||
 | 
					        self.assertAccessDependency(locations, items)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,53 @@
 | 
				
			||||||
 | 
					from . import SoETestBase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestFragmentGoal(SoETestBase):
 | 
				
			||||||
 | 
					    options = {
 | 
				
			||||||
 | 
					        "energy_core": "fragments",
 | 
				
			||||||
 | 
					        "available_fragments": 21,
 | 
				
			||||||
 | 
					        "required_fragments": 20,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def testFragments(self):
 | 
				
			||||||
 | 
					        self.collect_by_name(["Gladiator Sword", "Diamond Eye", "Wheel", "Gauge"])
 | 
				
			||||||
 | 
					        self.assertBeatable(False)  # 0 fragments
 | 
				
			||||||
 | 
					        fragments = self.get_items_by_name("Energy Core Fragment")
 | 
				
			||||||
 | 
					        victory = self.get_item_by_name("Victory")
 | 
				
			||||||
 | 
					        self.collect(fragments[:-2])  # 1 too few
 | 
				
			||||||
 | 
					        self.assertEqual(self.count("Energy Core Fragment"), 19)
 | 
				
			||||||
 | 
					        self.assertBeatable(False)
 | 
				
			||||||
 | 
					        self.collect(fragments[-2:-1])  # exact
 | 
				
			||||||
 | 
					        self.assertEqual(self.count("Energy Core Fragment"), 20)
 | 
				
			||||||
 | 
					        self.assertBeatable(True)
 | 
				
			||||||
 | 
					        self.remove([victory])  # reset
 | 
				
			||||||
 | 
					        self.collect(fragments[-1:])  # 1 extra
 | 
				
			||||||
 | 
					        self.assertEqual(self.count("Energy Core Fragment"), 21)
 | 
				
			||||||
 | 
					        self.assertBeatable(True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def testNoWeapon(self):
 | 
				
			||||||
 | 
					        self.collect_by_name(["Diamond Eye", "Wheel", "Gauge", "Energy Core Fragment"])
 | 
				
			||||||
 | 
					        self.assertBeatable(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def testNoRocket(self):
 | 
				
			||||||
 | 
					        self.collect_by_name(["Gladiator Sword", "Diamond Eye", "Wheel", "Energy Core Fragment"])
 | 
				
			||||||
 | 
					        self.assertBeatable(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestShuffleGoal(SoETestBase):
 | 
				
			||||||
 | 
					    options = {
 | 
				
			||||||
 | 
					        "energy_core": "shuffle",
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def testCore(self):
 | 
				
			||||||
 | 
					        self.collect_by_name(["Gladiator Sword", "Diamond Eye", "Wheel", "Gauge"])
 | 
				
			||||||
 | 
					        self.assertBeatable(False)
 | 
				
			||||||
 | 
					        self.collect_by_name(["Energy Core"])
 | 
				
			||||||
 | 
					        self.assertBeatable(True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def testNoWeapon(self):
 | 
				
			||||||
 | 
					        self.collect_by_name(["Diamond Eye", "Wheel", "Gauge", "Energy Core"])
 | 
				
			||||||
 | 
					        self.assertBeatable(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def testNoRocket(self):
 | 
				
			||||||
 | 
					        self.collect_by_name(["Gladiator Sword", "Diamond Eye", "Wheel", "Energy Core"])
 | 
				
			||||||
 | 
					        self.assertBeatable(False)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,84 @@
 | 
				
			||||||
 | 
					import typing
 | 
				
			||||||
 | 
					import unittest
 | 
				
			||||||
 | 
					from argparse import Namespace
 | 
				
			||||||
 | 
					from test.general import gen_steps
 | 
				
			||||||
 | 
					from BaseClasses import MultiWorld, Item
 | 
				
			||||||
 | 
					from worlds import AutoWorld
 | 
				
			||||||
 | 
					from worlds.AutoWorld import call_all
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SoETestBase(unittest.TestCase):
 | 
				
			||||||
 | 
					    options: typing.Dict[str, typing.Any] = {}
 | 
				
			||||||
 | 
					    world: MultiWorld
 | 
				
			||||||
 | 
					    game = "Secret of Evermore"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setUp(self):
 | 
				
			||||||
 | 
					        self.world = MultiWorld(1)
 | 
				
			||||||
 | 
					        self.world.game[1] = self.game
 | 
				
			||||||
 | 
					        self.world.player_name = {1: "Tester"}
 | 
				
			||||||
 | 
					        self.world.set_seed()
 | 
				
			||||||
 | 
					        args = Namespace()
 | 
				
			||||||
 | 
					        for name, option in AutoWorld.AutoWorldRegister.world_types[self.game].option_definitions.items():
 | 
				
			||||||
 | 
					            setattr(args, name, {1: option.from_any(self.options.get(name, option.default))})
 | 
				
			||||||
 | 
					        self.world.set_options(args)
 | 
				
			||||||
 | 
					        self.world.set_default_common_options()
 | 
				
			||||||
 | 
					        for step in gen_steps:
 | 
				
			||||||
 | 
					            call_all(self.world, step)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def collect_all_but(self, item_names: typing.Union[str, typing.Iterable[str]]):
 | 
				
			||||||
 | 
					        if isinstance(item_names, str):
 | 
				
			||||||
 | 
					            item_names = (item_names,)
 | 
				
			||||||
 | 
					        for item in self.world.get_items():
 | 
				
			||||||
 | 
					            if item.name not in item_names:
 | 
				
			||||||
 | 
					                self.world.state.collect(item)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_item_by_name(self, item_name: str):
 | 
				
			||||||
 | 
					        for item in self.world.get_items():
 | 
				
			||||||
 | 
					            if item.name == item_name:
 | 
				
			||||||
 | 
					                return item
 | 
				
			||||||
 | 
					        raise ValueError("No such item")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_items_by_name(self, item_names: typing.Union[str, typing.Iterable[str]]):
 | 
				
			||||||
 | 
					        if isinstance(item_names, str):
 | 
				
			||||||
 | 
					            item_names = (item_names,)
 | 
				
			||||||
 | 
					        return [item for item in self.world.itempool if item.name in item_names]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def collect_by_name(self, item_names: typing.Union[str, typing.Iterable[str]]):
 | 
				
			||||||
 | 
					        items = self.get_items_by_name(item_names)
 | 
				
			||||||
 | 
					        self.collect(items)
 | 
				
			||||||
 | 
					        return items
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def collect(self, items: typing.Union[Item, typing.Iterable[Item]]):
 | 
				
			||||||
 | 
					        if isinstance(items, Item):
 | 
				
			||||||
 | 
					            items = (items,)
 | 
				
			||||||
 | 
					        for item in items:
 | 
				
			||||||
 | 
					            self.world.state.collect(item)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def remove(self, items: typing.Union[Item, typing.Iterable[Item]]):
 | 
				
			||||||
 | 
					        if isinstance(items, Item):
 | 
				
			||||||
 | 
					            items = (items,)
 | 
				
			||||||
 | 
					        for item in items:
 | 
				
			||||||
 | 
					            if item.location and item.location.event and item.location in self.world.state.events:
 | 
				
			||||||
 | 
					                self.world.state.events.remove(item.location)
 | 
				
			||||||
 | 
					            self.world.state.remove(item)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def can_reach_location(self, location):
 | 
				
			||||||
 | 
					        return self.world.state.can_reach(location, "Location", 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def count(self, item_name):
 | 
				
			||||||
 | 
					        return self.world.state.count(item_name, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def assertAccessDependency(self, locations, possible_items):
 | 
				
			||||||
 | 
					        all_items = [item_name for item_names in possible_items for item_name in item_names]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.collect_all_but(all_items)
 | 
				
			||||||
 | 
					        for location in self.world.get_locations():
 | 
				
			||||||
 | 
					            self.assertEqual(self.world.state.can_reach(location), location.name not in locations)
 | 
				
			||||||
 | 
					        for item_names in possible_items:
 | 
				
			||||||
 | 
					            items = self.collect_by_name(item_names)
 | 
				
			||||||
 | 
					            for location in locations:
 | 
				
			||||||
 | 
					                self.assertTrue(self.can_reach_location(location))
 | 
				
			||||||
 | 
					            self.remove(items)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def assertBeatable(self, beatable: bool):
 | 
				
			||||||
 | 
					        self.assertEqual(self.world.can_beat_game(self.world.state), beatable)
 | 
				
			||||||
		Loading…
	
		Reference in New Issue