2022-05-10 17:40:43 +00:00
|
|
|
import unittest
|
|
|
|
|
2023-10-27 10:33:59 +00:00
|
|
|
from Fill import distribute_items_restrictive
|
|
|
|
from NetUtils import encode
|
|
|
|
from worlds.AutoWorld import AutoWorldRegister, call_all
|
2024-05-18 22:42:58 +00:00
|
|
|
from worlds import failed_world_loads
|
2023-02-15 21:46:10 +00:00
|
|
|
from . import setup_solo_multiworld
|
2022-05-10 17:40:43 +00:00
|
|
|
|
|
|
|
|
2022-05-10 17:43:44 +00:00
|
|
|
class TestImplemented(unittest.TestCase):
|
2023-10-22 11:00:27 +00:00
|
|
|
def test_completion_condition(self):
|
2022-05-10 17:40:43 +00:00
|
|
|
"""Ensure a completion condition is set that has requirements."""
|
2023-02-13 01:05:52 +00:00
|
|
|
for game_name, world_type in AutoWorldRegister.world_types.items():
|
2023-02-24 02:16:10 +00:00
|
|
|
if not world_type.hidden and game_name not in {"Sudoku"}:
|
2023-02-13 01:05:52 +00:00
|
|
|
with self.subTest(game_name):
|
2023-02-15 21:46:10 +00:00
|
|
|
multiworld = setup_solo_multiworld(world_type)
|
2023-02-13 01:05:52 +00:00
|
|
|
self.assertFalse(multiworld.completion_condition[1](multiworld.state))
|
|
|
|
|
2023-10-22 11:00:27 +00:00
|
|
|
def test_entrance_parents(self):
|
2023-02-13 01:05:52 +00:00
|
|
|
"""Tests that the parents of created Entrances match the exiting Region."""
|
|
|
|
for game_name, world_type in AutoWorldRegister.world_types.items():
|
2023-02-15 21:46:10 +00:00
|
|
|
if not world_type.hidden:
|
2023-02-13 01:05:52 +00:00
|
|
|
with self.subTest(game_name):
|
2023-02-15 21:46:10 +00:00
|
|
|
multiworld = setup_solo_multiworld(world_type)
|
2023-02-13 01:05:52 +00:00
|
|
|
for region in multiworld.regions:
|
|
|
|
for exit in region.exits:
|
|
|
|
self.assertEqual(exit.parent_region, region)
|
2023-02-15 23:28:02 +00:00
|
|
|
|
2023-10-22 11:00:27 +00:00
|
|
|
def test_stage_methods(self):
|
2023-02-15 23:28:02 +00:00
|
|
|
"""Tests that worlds don't try to implement certain steps that are only ever called as stage."""
|
|
|
|
for game_name, world_type in AutoWorldRegister.world_types.items():
|
|
|
|
if not world_type.hidden:
|
|
|
|
with self.subTest(game_name):
|
|
|
|
for method in ("assert_generate",):
|
|
|
|
self.assertFalse(hasattr(world_type, method),
|
|
|
|
f"{method} must be implemented as a @classmethod named stage_{method}.")
|
2023-10-27 10:33:59 +00:00
|
|
|
|
|
|
|
def test_slot_data(self):
|
|
|
|
"""Tests that if a world creates slot data, it's json serializable."""
|
|
|
|
for game_name, world_type in AutoWorldRegister.world_types.items():
|
|
|
|
# has an await for generate_output which isn't being called
|
|
|
|
if game_name in {"Ocarina of Time", "Zillion"}:
|
|
|
|
continue
|
2023-11-08 08:15:06 +00:00
|
|
|
multiworld = setup_solo_multiworld(world_type)
|
|
|
|
with self.subTest(game=game_name, seed=multiworld.seed):
|
2023-10-27 10:33:59 +00:00
|
|
|
distribute_items_restrictive(multiworld)
|
|
|
|
call_all(multiworld, "post_fill")
|
|
|
|
for key, data in multiworld.worlds[1].fill_slot_data().items():
|
|
|
|
self.assertIsInstance(key, str, "keys in slot data must be a string")
|
|
|
|
self.assertIsInstance(encode(data), str, f"object {type(data).__name__} not serializable.")
|
2024-05-18 22:42:58 +00:00
|
|
|
|
|
|
|
def test_no_failed_world_loads(self):
|
|
|
|
if failed_world_loads:
|
|
|
|
self.fail(f"The following worlds failed to load: {failed_world_loads}")
|