131 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import typing
							 | 
						||
| 
								 | 
							
								from unittest import TestCase, skipUnless
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from . import SoETestBase
							 | 
						||
| 
								 | 
							
								from .. import pyevermizer
							 | 
						||
| 
								 | 
							
								from ..options import Sniffamizer
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestCount(TestCase):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Test that counts line up for sniff spots
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_compare_counts(self) -> None:
							 | 
						||
| 
								 | 
							
								        self.assertEqual(len(pyevermizer.get_sniff_locations()), len(pyevermizer.get_sniff_items()),
							 | 
						||
| 
								 | 
							
								                         "Sniff locations and sniff items don't line up")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Bases:
							 | 
						||
| 
								 | 
							
								    # class in class to avoid running tests for helper class
							 | 
						||
| 
								 | 
							
								    class TestSniffamizerLocal(SoETestBase):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Test that provided options do not add sniff items or locations
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        def test_no_sniff_items(self) -> None:
							 | 
						||
| 
								 | 
							
								            self.assertLess(len(self.multiworld.itempool), 500,
							 | 
						||
| 
								 | 
							
								                            "Unexpected number of items")
							 | 
						||
| 
								 | 
							
								            for item in self.multiworld.itempool:
							 | 
						||
| 
								 | 
							
								                if item.code is not None:
							 | 
						||
| 
								 | 
							
								                    self.assertLess(item.code, 65000,
							 | 
						||
| 
								 | 
							
								                                    "Unexpected item type")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def test_no_sniff_locations(self) -> None:
							 | 
						||
| 
								 | 
							
								            location_count = sum(1 for location in self.multiworld.get_locations(self.player) if location.item is None)
							 | 
						||
| 
								 | 
							
								            self.assertLess(location_count, 500,
							 | 
						||
| 
								 | 
							
								                            "Unexpected number of locations")
							 | 
						||
| 
								 | 
							
								            for location in self.multiworld.get_locations(self.player):
							 | 
						||
| 
								 | 
							
								                if location.address is not None:
							 | 
						||
| 
								 | 
							
								                    self.assertLess(location.address, 65000,
							 | 
						||
| 
								 | 
							
								                                    "Unexpected location type")
							 | 
						||
| 
								 | 
							
								            self.assertEqual(location_count, len(self.multiworld.itempool),
							 | 
						||
| 
								 | 
							
								                             "Locations and item counts do not line up")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    class TestSniffamizerPool(SoETestBase):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        Test that provided options add sniff items and locations
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        def test_sniff_items(self) -> None:
							 | 
						||
| 
								 | 
							
								            self.assertGreater(len(self.multiworld.itempool), 500,
							 | 
						||
| 
								 | 
							
								                               "Unexpected number of items")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        def test_sniff_locations(self) -> None:
							 | 
						||
| 
								 | 
							
								            location_count = sum(1 for location in self.multiworld.get_locations(self.player) if location.item is None)
							 | 
						||
| 
								 | 
							
								            self.assertGreater(location_count, 500,
							 | 
						||
| 
								 | 
							
								                               "Unexpected number of locations")
							 | 
						||
| 
								 | 
							
								            self.assertTrue(any(location.address is not None and location.address >= 65000
							 | 
						||
| 
								 | 
							
								                                for location in self.multiworld.get_locations(self.player)),
							 | 
						||
| 
								 | 
							
								                            "No sniff locations")
							 | 
						||
| 
								 | 
							
								            self.assertEqual(location_count, len(self.multiworld.itempool),
							 | 
						||
| 
								 | 
							
								                             "Locations and item counts do not line up")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class TestSniffamizerShuffle(Bases.TestSniffamizerLocal):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Test that shuffle does not add extra items or locations
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    options: typing.Dict[str, typing.Any] = {
							 | 
						||
| 
								 | 
							
								        "sniffamizer": "shuffle"
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_flags(self) -> None:
							 | 
						||
| 
								 | 
							
								        # default -> no flags
							 | 
						||
| 
								 | 
							
								        flags = self.world.options.flags
							 | 
						||
| 
								 | 
							
								        self.assertNotIn("s", flags)
							 | 
						||
| 
								 | 
							
								        self.assertNotIn("S", flags)
							 | 
						||
| 
								 | 
							
								        self.assertNotIn("v", flags)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@skipUnless(hasattr(Sniffamizer, "option_everywhere"), "Feature disabled")
							 | 
						||
| 
								 | 
							
								class TestSniffamizerEverywhereVanilla(Bases.TestSniffamizerPool):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Test that everywhere + vanilla ingredients does add extra items and locations
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    options: typing.Dict[str, typing.Any] = {
							 | 
						||
| 
								 | 
							
								        "sniffamizer": "everywhere",
							 | 
						||
| 
								 | 
							
								        "sniff_ingredients": "vanilla_ingredients",
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_flags(self) -> None:
							 | 
						||
| 
								 | 
							
								        flags = self.world.options.flags
							 | 
						||
| 
								 | 
							
								        self.assertIn("S", flags)
							 | 
						||
| 
								 | 
							
								        self.assertNotIn("v", flags)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@skipUnless(hasattr(Sniffamizer, "option_everywhere"), "Feature disabled")
							 | 
						||
| 
								 | 
							
								class TestSniffamizerEverywhereRandom(Bases.TestSniffamizerPool):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Test that everywhere + random ingredients also adds extra items and locations
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    options: typing.Dict[str, typing.Any] = {
							 | 
						||
| 
								 | 
							
								        "sniffamizer": "everywhere",
							 | 
						||
| 
								 | 
							
								        "sniff_ingredients": "random_ingredients",
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_flags(self) -> None:
							 | 
						||
| 
								 | 
							
								        flags = self.world.options.flags
							 | 
						||
| 
								 | 
							
								        self.assertIn("S", flags)
							 | 
						||
| 
								 | 
							
								        self.assertIn("v", flags)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@skipUnless(hasattr(Sniffamizer, "option_everywhere"), "Feature disabled")
							 | 
						||
| 
								 | 
							
								class EverywhereAccessTest(SoETestBase):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Test that everywhere has certain rules
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    options: typing.Dict[str, typing.Any] = {
							 | 
						||
| 
								 | 
							
								        "sniffamizer": "everywhere",
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @staticmethod
							 | 
						||
| 
								 | 
							
								    def _resolve_numbers(spots: typing.Mapping[str, typing.Iterable[int]]) -> typing.List[str]:
							 | 
						||
| 
								 | 
							
								        return [f"{name} #{number}" for name, numbers in spots.items() for number in numbers]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_knight_basher(self) -> None:
							 | 
						||
| 
								 | 
							
								        locations = ["Mungola", "Lightning Storm"] + self._resolve_numbers({
							 | 
						||
| 
								 | 
							
								            "Gomi's Tower Sniff": range(473, 491),
							 | 
						||
| 
								 | 
							
								            "Gomi's Tower": range(195, 199),
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								        items = [["Knight Basher"]]
							 | 
						||
| 
								 | 
							
								        self.assertAccessDependency(locations, items)
							 |