forked from mirror/Archipelago
Some checks failed
Analyze modified files / flake8 (push) Failing after 2m28s
Build / build-win (push) Has been cancelled
Build / build-ubuntu2204 (push) Has been cancelled
ctest / Test C++ ubuntu-latest (push) Has been cancelled
ctest / Test C++ windows-latest (push) Has been cancelled
Analyze modified files / mypy (push) Has been cancelled
Build and Publish Docker Images / Push Docker image to Docker Hub (push) Successful in 5m4s
Native Code Static Analysis / scan-build (push) Failing after 5m2s
type check / pyright (push) Successful in 1m7s
unittests / Test Python 3.11.2 ubuntu-latest (push) Failing after 16m23s
unittests / Test Python 3.12 ubuntu-latest (push) Failing after 28m19s
unittests / Test Python 3.13 ubuntu-latest (push) Failing after 14m49s
unittests / Test hosting with 3.13 on ubuntu-latest (push) Successful in 5m0s
unittests / Test Python 3.13 macos-latest (push) Has been cancelled
unittests / Test Python 3.11 windows-latest (push) Has been cancelled
unittests / Test Python 3.13 windows-latest (push) Has been cancelled
89 lines
4.4 KiB
Python
89 lines
4.4 KiB
Python
import random
|
|
from contextlib import AbstractContextManager, nullcontext
|
|
|
|
from ..characters import get_available_and_starting_characters
|
|
from ..constants import BASE_GAME_CHARACTERS
|
|
from ..options import StartingCharacters
|
|
from . import BrotatoTestBase
|
|
from .data_sets.characters import (
|
|
CHARACTER_TEST_DATA_SETS,
|
|
NON_ERROR_CHARACTER_TEST_DATA_SETS,
|
|
)
|
|
|
|
|
|
class TestBrotatoCharacterOptions(BrotatoTestBase):
|
|
"""Tests to ensure that we correctly determine the included and starting characters from options.
|
|
|
|
This differs from `test_include_characters` and `test_starting_characters` in that it focuses on checking that the
|
|
output from `get_available_and_starting_characters` is correct, rather than checking that the generated items,
|
|
locations, etc. are correct.
|
|
"""
|
|
|
|
def test_get_available_and_starting_characters_data_sets_correct_results(self):
|
|
for data_set in CHARACTER_TEST_DATA_SETS:
|
|
with self.subTest(data_set=data_set):
|
|
error_checker: AbstractContextManager
|
|
if data_set.expected_exception is not None:
|
|
error_checker = self.assertRaises(data_set.expected_exception)
|
|
else:
|
|
error_checker = nullcontext()
|
|
|
|
with error_checker:
|
|
available_characters, starting_characters = get_available_and_starting_characters(
|
|
data_set.include_base_game_characters,
|
|
data_set.enable_abyssal_terrors_dlc,
|
|
data_set.include_abyssal_terrors_characters,
|
|
data_set.starting_characters_mode,
|
|
data_set.num_starting_characters,
|
|
data_set.num_include_characters,
|
|
random.Random(0x7A70),
|
|
)
|
|
|
|
# We don't know for certain which characters were selected, so we settle for checking that they're
|
|
# a subset of the expected collection
|
|
self.assertTrue(set(starting_characters) <= data_set.valid_starting_characters)
|
|
self.assertTrue(set(available_characters) <= data_set.valid_available_characters)
|
|
self.assertTrue(set(starting_characters) <= set(available_characters))
|
|
|
|
def test_starting_characters_greater_than_num_characters_is_clamped(self):
|
|
num_characters = 15
|
|
num_starting_characters = 20
|
|
available_characters, starting_characters = get_available_and_starting_characters(
|
|
set(BASE_GAME_CHARACTERS.characters),
|
|
False,
|
|
set(),
|
|
StartingCharacters(StartingCharacters.option_random_all),
|
|
num_starting_characters,
|
|
num_characters,
|
|
random.Random(0x4444),
|
|
)
|
|
# The number of starting characters shouldn't be higher than the total number of characters
|
|
self.assertEqual(len(available_characters), num_characters)
|
|
self.assertEqual(len(starting_characters), num_characters)
|
|
|
|
def test_get_available_and_starting_characters_data_sets_reproducible_results(self):
|
|
for data_set in NON_ERROR_CHARACTER_TEST_DATA_SETS:
|
|
with self.subTest(data_set=data_set):
|
|
available_characters, starting_characters = get_available_and_starting_characters(
|
|
data_set.include_base_game_characters,
|
|
data_set.enable_abyssal_terrors_dlc,
|
|
data_set.include_abyssal_terrors_characters,
|
|
data_set.starting_characters_mode,
|
|
data_set.num_starting_characters,
|
|
data_set.num_include_characters,
|
|
random.Random(0x7A70),
|
|
)
|
|
|
|
for _ in range(2):
|
|
repeat_available_characters, repeat_starting_characters = get_available_and_starting_characters(
|
|
data_set.include_base_game_characters,
|
|
data_set.enable_abyssal_terrors_dlc,
|
|
data_set.include_abyssal_terrors_characters,
|
|
data_set.starting_characters_mode,
|
|
data_set.num_starting_characters,
|
|
data_set.num_include_characters,
|
|
random.Random(0x7A70),
|
|
)
|
|
assert starting_characters == repeat_starting_characters
|
|
assert available_characters == repeat_available_characters
|