Files
Grinch-AP/worlds/shapez/test/__init__.py

204 lines
10 KiB
Python
Raw Normal View History

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.")
2025-06-06 00:05:53 +02:00
# The following unittests are intended to test all code paths of the generator
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"
}