214 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from unittest import TestCase
 | |
| 
 | |
| from test.bases import WorldTestBase
 | |
| from .. import options_presets, ShapezWorld
 | |
| from ..data.strings import GOALS, OTHER, ITEMS, LOCATIONS, CATEGORY, OPTIONS, SHAPESANITY
 | |
| from ..options import max_levels_and_upgrades, max_shapesanity
 | |
| 
 | |
| 
 | |
| class ShapezTestBase(WorldTestBase):
 | |
|     game = OTHER.game_name
 | |
|     world: ShapezWorld
 | |
| 
 | |
|     def test_location_count(self):
 | |
|         self.assertTrue(self.world.location_count > 0,
 | |
|                         f"location_count is {self.world.location_count} for some reason.")
 | |
| 
 | |
|     def test_logic_lists(self):
 | |
|         logic_buildings = [ITEMS.cutter, ITEMS.rotator, ITEMS.painter, ITEMS.color_mixer, ITEMS.stacker]
 | |
|         for building in logic_buildings:
 | |
|             count = self.world.level_logic.count(building)
 | |
|             self.assertTrue(count == 1, f"{building} was found {count} times in level_logic.")
 | |
|             count = self.world.upgrade_logic.count(building)
 | |
|             self.assertTrue(count == 1, f"{building} was found {count} times in upgrade_logic.")
 | |
|         self.assertTrue(len(self.world.level_logic) == 5,
 | |
|                         f"level_logic contains {len(self.world.level_logic)} entries instead of the expected 5.")
 | |
|         self.assertTrue(len(self.world.upgrade_logic) == 5,
 | |
|                         f"upgrade_logic contains {len(self.world.upgrade_logic)} entries instead of the expected 5.")
 | |
| 
 | |
|     def test_random_logic_phase_length(self):
 | |
|         self.assertTrue(len(self.world.random_logic_phase_length) == 5,
 | |
|                         f"random_logic_phase_length contains {len(self.world.random_logic_phase_length)} entries " +
 | |
|                         f"instead of the expected 5.")
 | |
|         self.assertTrue(sum(self.world.random_logic_phase_length) < self.world.maxlevel,
 | |
|                         f"The sum of all random phase lengths is greater than allowed: " +
 | |
|                         str(sum(self.world.random_logic_phase_length)))
 | |
|         for length in self.world.random_logic_phase_length:
 | |
|             self.assertTrue(length in range(self.world.maxlevel),
 | |
|                             f"Found an illegal value in random_logic_phase_length: {length}")
 | |
| 
 | |
|     def test_category_random_logic_amounts(self):
 | |
|         self.assertTrue(len(self.world.category_random_logic_amounts) == 4,
 | |
|                         f"Found {len(self.world.category_random_logic_amounts)} instead of 4 keys in "
 | |
|                         f"category_random_logic_amounts.")
 | |
|         self.assertTrue(min(self.world.category_random_logic_amounts.values()) == 0,
 | |
|                         "Found a value less than or no 0 in category_random_logic_amounts.")
 | |
|         self.assertTrue(max(self.world.category_random_logic_amounts.values()) <= 5,
 | |
|                         "Found a value greater than 5 in category_random_logic_amounts.")
 | |
| 
 | |
|     def test_maxlevel_and_finaltier(self):
 | |
|         self.assertTrue(self.world.maxlevel in range(25, max_levels_and_upgrades),
 | |
|                         f"Found an illegal value for maxlevel: {self.world.maxlevel}")
 | |
|         self.assertTrue(self.world.finaltier in range(8, max_levels_and_upgrades+1),
 | |
|                         f"Found an illegal value for finaltier: {self.world.finaltier}")
 | |
| 
 | |
|     def test_included_locations(self):
 | |
|         self.assertTrue(len(self.world.included_locations) > 0, "Found no locations cached in included_locations.")
 | |
|         self.assertTrue(LOCATIONS.level(1) in self.world.included_locations.keys(),
 | |
|                         "Could not find Level 1 (guraranteed location) cached in included_locations.")
 | |
|         self.assertTrue(LOCATIONS.upgrade(CATEGORY.belt, "II") in self.world.included_locations.keys(),
 | |
|                         "Could not find Belt Upgrade Tier II (guraranteed location) cached in included_locations.")
 | |
|         self.assertTrue(LOCATIONS.shapesanity(1) in self.world.included_locations.keys(),
 | |
|                         "Could not find Shapesanity 1 (guraranteed location) cached in included_locations.")
 | |
| 
 | |
|     def test_shapesanity_names(self):
 | |
|         names_length = len(self.world.shapesanity_names)
 | |
|         locations_length = len([0 for loc in self.multiworld.get_locations(self.player) if "Shapesanity" in loc.name])
 | |
|         self.assertEqual(names_length, locations_length,
 | |
|                          f"The amount of shapesanity names ({names_length}) does not match the amount of included " +
 | |
|                          f"shapesanity locations ({locations_length}).")
 | |
|         self.assertTrue(SHAPESANITY.full(SHAPESANITY.uncolored, SHAPESANITY.circle) in self.world.shapesanity_names,
 | |
|                         "Uncolored Circle is guaranteed but was not found in shapesanity_names.")
 | |
| 
 | |
|     def test_efficiency_iii_no_softlock(self):
 | |
|         if self.world.options.goal == GOALS.efficiency_iii:
 | |
|             for item in self.multiworld.itempool:
 | |
|                 self.assertFalse(item.name.endswith("Upgrade Trap"),
 | |
|                                  "Item pool contains an upgrade trap, which could make the efficiency_iii goal "
 | |
|                                  "unreachable if collected.")
 | |
| 
 | |
| 
 | |
| class TestGlobalOptionsImport(TestCase):
 | |
| 
 | |
|     def test_global_options_import(self):
 | |
|         self.assertTrue(isinstance(max_levels_and_upgrades, int), f"The global option max_levels_and_upgrades is not " +
 | |
|                                                                   f"an integer, but instead a " +
 | |
|                                                                   f"{type(max_levels_and_upgrades)}.")
 | |
|         self.assertTrue(max_levels_and_upgrades >= 27, f"max_levels_and_upgrades must be at least 27, but is " +
 | |
|                                                        f"{max_levels_and_upgrades} instead.")
 | |
|         self.assertTrue(isinstance(max_shapesanity, int), f"The global option max_shapesanity is not an integer, but " +
 | |
|                                                           f"instead a {type(max_levels_and_upgrades)}.")
 | |
|         self.assertTrue(max_shapesanity >= 4, f"max_shapesanity must be at least 4, but is " +
 | |
|                                               f"{max_levels_and_upgrades} instead.")
 | |
| 
 | |
| 
 | |
| class TestMinimum(ShapezTestBase):
 | |
|     options = options_presets["Minimum checks"]
 | |
| 
 | |
| 
 | |
| class TestMaximum(ShapezTestBase):
 | |
|     options = options_presets["Maximum checks"]
 | |
| 
 | |
| 
 | |
| class TestRestrictive(ShapezTestBase):
 | |
|     options = options_presets["Restrictive start"]
 | |
| 
 | |
| 
 | |
| class TestAllRelevantOptions1(ShapezTestBase):
 | |
|     options = {
 | |
|         "goal": GOALS.vanilla,
 | |
|         "randomize_level_requirements": False,
 | |
|         "randomize_upgrade_requirements": False,
 | |
|         "complexity_growth_gradient": "0.1234",
 | |
|         "early_balancer_tunnel_and_trash": "none",
 | |
|         "lock_belt_and_extractor": True,
 | |
|         "include_achievements": True,
 | |
|         "exclude_softlock_achievements": False,
 | |
|         "exclude_long_playtime_achievements": False,
 | |
|         "exclude_progression_unreasonable": True,
 | |
|         "shapesanity_amount": max_shapesanity,
 | |
|         "traps_percentage": "random"
 | |
|     }
 | |
| 
 | |
| 
 | |
| class TestAllRelevantOptions2(ShapezTestBase):
 | |
|     options = {
 | |
|         "goal": GOALS.mam,
 | |
|         "goal_amount": max_levels_and_upgrades,
 | |
|         "randomize_level_requirements": True,
 | |
|         "randomize_upgrade_requirements": True,
 | |
|         "randomize_level_logic": OPTIONS.logic_random_steps,
 | |
|         "randomize_upgrade_logic": OPTIONS.logic_vanilla_like,
 | |
|         "complexity_growth_gradient": "2",
 | |
|         "early_balancer_tunnel_and_trash": OPTIONS.buildings_5,
 | |
|         "lock_belt_and_extractor": False,
 | |
|         "include_achievements": True,
 | |
|         "exclude_softlock_achievements": False,
 | |
|         "exclude_long_playtime_achievements": False,
 | |
|         "exclude_progression_unreasonable": False,
 | |
|         "shapesanity_amount": 4,
 | |
|         "traps_percentage": 0
 | |
|     }
 | |
| 
 | |
| 
 | |
| class TestAllRelevantOptions3(ShapezTestBase):
 | |
|     options = {
 | |
|         "goal": GOALS.even_fasterer,
 | |
|         "goal_amount": max_levels_and_upgrades,
 | |
|         "randomize_level_requirements": True,
 | |
|         "randomize_upgrade_requirements": True,
 | |
|         "randomize_level_logic": f"{OPTIONS.logic_vanilla}_shuffled",
 | |
|         "randomize_upgrade_logic": OPTIONS.logic_linear,
 | |
|         "complexity_growth_gradient": "1e-003",
 | |
|         "early_balancer_tunnel_and_trash": OPTIONS.buildings_3,
 | |
|         "lock_belt_and_extractor": False,
 | |
|         "include_achievements": True,
 | |
|         "exclude_softlock_achievements": True,
 | |
|         "exclude_long_playtime_achievements": True,
 | |
|         "shapesanity_amount": "random",
 | |
|         "traps_percentage": 100,
 | |
|         "include_whacky_upgrades": True,
 | |
|         "split_inventory_draining_trap": True
 | |
|     }
 | |
| 
 | |
| 
 | |
| class TestAllRelevantOptions4(ShapezTestBase):
 | |
|     options = {
 | |
|         "goal": GOALS.efficiency_iii,
 | |
|         "randomize_level_requirements": True,
 | |
|         "randomize_upgrade_requirements": True,
 | |
|         "randomize_level_logic": f"{OPTIONS.logic_stretched}_shuffled",
 | |
|         "randomize_upgrade_logic": OPTIONS.logic_category,
 | |
|         "early_balancer_tunnel_and_trash": OPTIONS.sphere_1,
 | |
|         "lock_belt_and_extractor": False,
 | |
|         "include_achievements": True,
 | |
|         "exclude_softlock_achievements": True,
 | |
|         "exclude_long_playtime_achievements": True,
 | |
|         "shapesanity_amount": "random",
 | |
|         "traps_percentage": "random",
 | |
|         "include_whacky_upgrades": True,
 | |
|     }
 | |
| 
 | |
| 
 | |
| class TestAllRelevantOptions5(ShapezTestBase):
 | |
|     options = {
 | |
|         "goal": GOALS.mam,
 | |
|         "goal_amount": "random-range-27-500",
 | |
|         "randomize_level_requirements": True,
 | |
|         "randomize_upgrade_requirements": True,
 | |
|         "randomize_level_logic": f"{OPTIONS.logic_quick}_shuffled",
 | |
|         "randomize_upgrade_logic": OPTIONS.logic_category_random,
 | |
|         "lock_belt_and_extractor": False,
 | |
|         "include_achievements": True,
 | |
|         "exclude_softlock_achievements": True,
 | |
|         "exclude_long_playtime_achievements": True,
 | |
|         "shapesanity_amount": "random",
 | |
|         "traps_percentage": 100,
 | |
|         "split_inventory_draining_trap": False
 | |
|     }
 | |
| 
 | |
| 
 | |
| class TestAllRelevantOptions6(ShapezTestBase):
 | |
|     options = {
 | |
|         "goal": GOALS.mam,
 | |
|         "goal_amount": "random-range-27-500",
 | |
|         "randomize_level_requirements": True,
 | |
|         "randomize_upgrade_requirements": True,
 | |
|         "randomize_level_logic": OPTIONS.logic_hardcore,
 | |
|         "randomize_upgrade_logic": OPTIONS.logic_hardcore,
 | |
|         "lock_belt_and_extractor": False,
 | |
|         "include_achievements": False,
 | |
|         "shapesanity_amount": "random",
 | |
|         "traps_percentage": "random"
 | |
|     }
 | 
