mirror of
https://github.com/evroon/bracket.git
synced 2026-01-30 00:51:23 -05:00
110 lines
3.5 KiB
Python
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,
|
|
),
|
|
]
|