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) |