Files
bracket/backend/tests/unit_tests/swiss_test.py
2024-11-21 19:59:02 +01:00

110 lines
3.5 KiB
Python

from decimal import Decimal
from bracket.logic.scheduling.ladder_teams import get_possible_upcoming_matches_for_swiss
from bracket.models.db.match import Match, MatchFilter, MatchWithDetailsDefinitive, SuggestedMatch
from bracket.models.db.stage_item_inputs import (
StageItemInput,
StageItemInputFinal,
)
from bracket.models.db.team import Team
from bracket.models.db.util import RoundWithMatches
from bracket.utils.dummy_records import (
DUMMY_MATCH1,
DUMMY_TEAM1,
)
from bracket.utils.id_types import (
MatchId,
RoundId,
StageItemId,
StageItemInputId,
TeamId,
TournamentId,
)
from tests.integration_tests.mocks import MOCK_NOW
MATCH_FILTER = MatchFilter(elo_diff_threshold=50, iterations=100, limit=20, only_recommended=False)
def get_match(
match: Match, stage_item_input1: StageItemInputFinal, stage_item_input2: StageItemInputFinal
) -> MatchWithDetailsDefinitive:
return MatchWithDetailsDefinitive(
**match.model_copy(
update={
"stage_item_input1_id": stage_item_input1.id,
"stage_item_input2_id": stage_item_input2.id,
}
).model_dump(),
stage_item_input1=stage_item_input1,
stage_item_input2=stage_item_input2,
court=None,
)
def test_constraints() -> None:
stage_item_input_dummy = StageItemInputFinal(
id=StageItemInputId(-1),
tournament_id=TournamentId(-1),
team_id=TeamId(-1),
slot=0,
points=Decimal("2.0"),
wins=1,
draws=0,
losses=0,
team=Team(**DUMMY_TEAM1.model_dump(), id=TeamId(-1)),
)
input1 = stage_item_input_dummy.model_copy(update={"id": -1, "points": Decimal("1125.0")})
input2 = stage_item_input_dummy.model_copy(update={"id": -2, "points": Decimal("1175.0")})
input3 = stage_item_input_dummy.model_copy(update={"id": -3, "points": Decimal("1200.0")})
input4 = stage_item_input_dummy.model_copy(update={"id": -4, "points": Decimal("1250.0")})
rounds = [
RoundWithMatches(
id=RoundId(-1),
matches=[
get_match(
Match.model_validate(DUMMY_MATCH1.model_dump() | {"id": MatchId(-1)}),
input1,
input2,
)
],
is_draft=False,
stage_item_id=StageItemId(-1),
name="R1",
created=MOCK_NOW,
),
RoundWithMatches(
id=RoundId(-2),
matches=[],
is_draft=True,
stage_item_id=StageItemId(-1),
name="R2",
created=MOCK_NOW,
),
]
inputs: list[StageItemInput] = [input1, input2, input3, input4]
result = get_possible_upcoming_matches_for_swiss(MATCH_FILTER, rounds, inputs)
# Team 3 and 4 haven't played yet, so any suggested match with one or more of those teams
# is recommended.
assert result == [
SuggestedMatch(
stage_item_input1=input4,
stage_item_input2=input3,
elo_diff=Decimal("50.0"),
swiss_diff=Decimal("50.0"),
is_recommended=True,
times_played_sum=0,
player_behind_schedule_count=0,
),
SuggestedMatch(
stage_item_input1=input3,
stage_item_input2=input2,
elo_diff=Decimal("25.0"),
swiss_diff=Decimal("25.0"),
is_recommended=False,
times_played_sum=1,
player_behind_schedule_count=0,
),
]