116 lines
6.2 KiB
Python
116 lines
6.2 KiB
Python
import itertools
|
|
import unittest
|
|
|
|
import Options as ap_options
|
|
from .utils import fill_dataclass_with_default
|
|
from ... import options
|
|
from ...options.forced_options import force_change_options_if_incompatible
|
|
|
|
|
|
class TestGoalsRequiringAllLocationsOverrideAccessibility(unittest.TestCase):
|
|
|
|
def test_given_goal_requiring_all_locations_when_generate_then_accessibility_is_forced_to_full(self):
|
|
"""There is a bug with the current victory condition of the perfection goal that can create unwinnable seeds if the accessibility is set to minimal and
|
|
the world gets flooded with progression items through plando. This will increase the amount of collected progression items pass the total amount
|
|
calculated for the world when creating the item pool. This will cause the victory condition to be met before all locations are collected, so some could
|
|
be left inaccessible, which in practice will make the seed unwinnable.
|
|
"""
|
|
|
|
for goal in [options.Goal.option_perfection, options.Goal.option_allsanity]:
|
|
for accessibility in ap_options.Accessibility.options.keys():
|
|
with self.subTest(f"Goal: {options.Goal.get_option_name(goal)} Accessibility: {accessibility}"):
|
|
world_options = fill_dataclass_with_default({
|
|
options.Goal: goal,
|
|
"accessibility": accessibility
|
|
})
|
|
|
|
force_change_options_if_incompatible(world_options, 1, "Tester")
|
|
|
|
self.assertEqual(world_options.accessibility.value, ap_options.Accessibility.option_full)
|
|
|
|
|
|
class TestGingerIslandRelatedGoalsOverrideGingerIslandExclusion(unittest.TestCase):
|
|
|
|
def test_given_island_related_goal_when_generate_then_override_exclude_ginger_island(self):
|
|
for goal in [options.Goal.option_greatest_walnut_hunter, options.Goal.option_perfection]:
|
|
for exclude_island in options.ExcludeGingerIsland.options:
|
|
with self.subTest(f"Goal: {options.Goal.get_option_name(goal)} Exclude Ginger Island: {exclude_island}"):
|
|
world_options = fill_dataclass_with_default({
|
|
options.Goal: goal,
|
|
options.ExcludeGingerIsland: exclude_island
|
|
})
|
|
|
|
force_change_options_if_incompatible(world_options, 1, "Tester")
|
|
|
|
self.assertEqual(world_options.exclude_ginger_island.value, options.ExcludeGingerIsland.option_false)
|
|
|
|
|
|
class TestGingerIslandExclusionOverridesWalnutsanity(unittest.TestCase):
|
|
|
|
def test_given_ginger_island_excluded_when_generate_then_walnutsanity_is_forced_disabled(self):
|
|
walnutsanity_options = options.Walnutsanity.valid_keys
|
|
for walnutsanity in (
|
|
walnutsanity
|
|
for r in range(len(walnutsanity_options) + 1)
|
|
for walnutsanity in itertools.combinations(walnutsanity_options, r)
|
|
):
|
|
with self.subTest(f"Walnutsanity: {walnutsanity}"):
|
|
world_options = fill_dataclass_with_default({
|
|
options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_true,
|
|
options.Walnutsanity: walnutsanity
|
|
})
|
|
|
|
force_change_options_if_incompatible(world_options, 1, "Tester")
|
|
|
|
self.assertEqual(world_options.walnutsanity.value, options.Walnutsanity.preset_none)
|
|
|
|
def test_given_ginger_island_related_goal_and_ginger_island_excluded_when_generate_then_walnutsanity_is_not_changed(self):
|
|
for goal in [options.Goal.option_greatest_walnut_hunter, options.Goal.option_perfection]:
|
|
walnutsanity_options = options.Walnutsanity.valid_keys
|
|
for original_walnutsanity_choice in (
|
|
set(walnutsanity)
|
|
for r in range(len(walnutsanity_options) + 1)
|
|
for walnutsanity in itertools.combinations(walnutsanity_options, r)
|
|
):
|
|
with self.subTest(f"Goal: {options.Goal.get_option_name(goal)} Walnutsanity: {original_walnutsanity_choice}"):
|
|
world_options = fill_dataclass_with_default({
|
|
options.Goal: goal,
|
|
options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_true,
|
|
options.Walnutsanity: original_walnutsanity_choice
|
|
})
|
|
|
|
force_change_options_if_incompatible(world_options, 1, "Tester")
|
|
|
|
self.assertEqual(world_options.walnutsanity.value, original_walnutsanity_choice)
|
|
|
|
|
|
class TestGingerIslandExclusionOverridesQisSpecialOrders(unittest.TestCase):
|
|
|
|
def test_given_ginger_island_excluded_when_generate_then_qis_special_orders_are_forced_disabled(self):
|
|
special_order_options = options.SpecialOrderLocations.options
|
|
for special_order in special_order_options.keys():
|
|
with self.subTest(f"Special order: {special_order}"):
|
|
world_options = fill_dataclass_with_default({
|
|
options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_true,
|
|
options.SpecialOrderLocations: special_order
|
|
})
|
|
|
|
force_change_options_if_incompatible(world_options, 1, "Tester")
|
|
|
|
self.assertEqual(world_options.special_order_locations.value & options.SpecialOrderLocations.value_qi, 0)
|
|
|
|
def test_given_ginger_island_related_goal_and_ginger_island_excluded_when_generate_then_special_orders_is_not_changed(self):
|
|
for goal in [options.Goal.option_greatest_walnut_hunter, options.Goal.option_perfection]:
|
|
special_order_options = options.SpecialOrderLocations.options
|
|
for special_order, original_special_order_value in special_order_options.items():
|
|
with self.subTest(f"Special order: {special_order}"):
|
|
world_options = fill_dataclass_with_default({
|
|
options.Goal: goal,
|
|
options.ExcludeGingerIsland: options.ExcludeGingerIsland.option_true,
|
|
options.SpecialOrderLocations: special_order
|
|
})
|
|
|
|
force_change_options_if_incompatible(world_options, 1, "Tester")
|
|
|
|
self.assertEqual(world_options.special_order_locations.value, original_special_order_value)
|