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