Skip to content

Commit

Permalink
Merge pull request #1 from OpenMatchmaking/feature-is-filled-field
Browse files Browse the repository at this point in the history
Added `is_filled` field in response
  • Loading branch information
Relrin authored Apr 25, 2018
2 parents 2da8085 + fc185d0 commit 30c3dec
Show file tree
Hide file tree
Showing 8 changed files with 124 additions and 11 deletions.
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
aioamqp==0.10.0
marshmallow==3.0.0b8
sage-utils==0.3.1
sage-utils==0.4.0

pytest==3.4.0
pytest-cov==2.5.1
Expand Down
2 changes: 1 addition & 1 deletion strategist/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ run:
python run.py

flake:
flake8 aiorest_ws tests
flake8 app tests

develop:
pip install -e .
Expand Down
2 changes: 1 addition & 1 deletion strategist/app/algorithms/simple_average.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def seed_player(self, player, teams, max_difference=25, **kwargs):
teams_info = self.get_teams_info(teams)
suitable_team = self.find_suitable_team(teams_info)

if suitable_team and self.is_fair_seeding(player, suitable_team, teams_info, max_difference):
if suitable_team and self.is_fair_seeding(player, suitable_team, teams_info, max_difference): # NOQA
added = True
updated_teams[suitable_team.name].append(player)

Expand Down
14 changes: 13 additions & 1 deletion strategist/app/game_mode.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,19 @@ def create_empty_teams(self, amount):
for team_number in range(1, amount + 1)
}

def is_teams_filled(self, teams):
return all([len(players) == self.team_size for _team_name, players in teams.items()])

def seed_player(self, player, grouped_players, **kwargs):
if not grouped_players:
grouped_players = self.create_empty_teams(self.teams)
return self.algorithm.seed_player(player, grouped_players, **kwargs)

if self.is_teams_filled(grouped_players):
added = False
is_filled = True
updated_teams = grouped_players
else:
added, updated_teams = self.algorithm.seed_player(player, grouped_players, **kwargs)
is_filled = self.is_teams_filled(updated_teams)

return added, is_filled, updated_teams
3 changes: 2 additions & 1 deletion strategist/app/workers/match_check/worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,10 @@ def validate_data(self, raw_data):
return result

def seed_player(self, game_mode, player, teams):
added, teams = game_mode.seed_player(player, teams)
added, is_filled, teams = game_mode.seed_player(player, teams)
return {
"added": added,
"is_filled": is_filled,
"grouped-players": teams
}

Expand Down
2 changes: 1 addition & 1 deletion strategist/app/workers/schemas.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from marshmallow import Schema, fields, validates, ValidationError
from marshmallow import Schema, fields


class RequestDataSchema(Schema):
Expand Down
29 changes: 24 additions & 5 deletions strategist/tests/test_game_mode.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ def test_game_mode_seeds_a_player_and_created_new_teams(self):
game_mode = GameMode('duel', 2, 1, 'SimpleAverage')
new_player = generate_player_data('find-opponent', 2500)

added, updated_teams = game_mode.seed_player(new_player, {})
added, is_filled, updated_teams = game_mode.seed_player(new_player, {})

self.assertTrue(added)
self.assertFalse(is_filled)
self.assertEqual({"team 1", "team 2"}, set(updated_teams.keys()))
self.assertEqual(len(updated_teams["team 1"]), 1)
self.assertEqual(len(updated_teams["team 2"]), 0)
Expand All @@ -30,9 +31,27 @@ def test_game_mode_seeds_a_player_into_existing_teams(self):
"team 2": []
}

added, updated_groups = game_mode.seed_player(new_player, teams)
added, is_filled, updated_teams = game_mode.seed_player(new_player, teams)

self.assertTrue(added)
self.assertEqual(len(updated_groups["team 1"]), 1)
self.assertEqual(len(updated_groups["team 2"]), 1)
self.assertIn(new_player, updated_groups["team 2"])
self.assertTrue(is_filled)
self.assertEqual(len(updated_teams["team 1"]), 1)
self.assertEqual(len(updated_teams["team 2"]), 1)
self.assertIn(new_player, updated_teams["team 2"])

def test_game_mode_cant_seed_a_player_into_filled_teams(self):
game_mode = GameMode('duel', 2, 1, 'SimpleAverage')
new_player = generate_player_data("1v1", 2479)
teams = {
"team 1": [generate_player_data("1v1", 2500)],
"team 2": [generate_player_data("1v1", 2508)]
}

added, is_filled, updated_teams = game_mode.seed_player(new_player, teams)

self.assertFalse(added)
self.assertTrue(is_filled)
self.assertEqual(len(updated_teams["team 1"]), 1)
self.assertEqual(len(updated_teams["team 2"]), 1)
self.assertNotIn(new_player, updated_teams["team 1"])
self.assertNotIn(new_player, updated_teams["team 2"])
81 changes: 81 additions & 0 deletions strategist/tests/workers/test_match_check_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@ async def test_worker_returns_an_updated_grouped_players(test_app):
assert 'added' in response['content'].keys()
assert response['content']['added'] is True

assert 'is_filled' in response['content'].keys()
assert response['content']['is_filled'] is True

assert 'grouped-players' in response['content'].keys()
assert len(response['content']['grouped-players']['team 1']) == 1
assert payload['new-player'] not in response['content']['grouped-players']['team 1']
Expand Down Expand Up @@ -202,5 +205,83 @@ async def test_worker_returns_the_grouped_players_without_any_changes(test_app):
assert 'added' in response['content'].keys()
assert response['content']['added'] is False

assert 'is_filled' in response['content'].keys()
assert response['content']['is_filled'] is False

assert 'grouped-players' in response['content'].keys()
assert response['content']['grouped-players'] == payload['grouped-players']


@pytest.mark.asyncio
async def test_worker_returns_the_grouped_players_without_any_changes_when_try_seeding(test_app):
client = RpcAmqpClient(
test_app,
routing_key=REQUEST_QUEUE,
request_exchange=REQUEST_EXCHANGE,
response_queue='',
response_exchange=RESPONSE_EXCHANGE
)
payload = {
"game-mode": "duel",
"new-player": {
"id": "0146563d-0f45-4062-90a7-b13a583defad",
"response-queue": "player-3-queue",
"event-name": "find-game",
"detail": {
"rating": 2680,
"content": {
"id": "0146563d-0f45-4062-90a7-b13a583defad",
"games": 531,
"wins": 279
}
}
},
"grouped-players": {
"team 1": [
{
"id": "56acbeb4-687d-4c8b-a881-0b9abdda64e4",
"response-queue": "player-1-queue",
"event-name": "find-game",
"detail": {
"rating": 2702,
"content": {
"id": "56acbeb4-687d-4c8b-a881-0b9abdda64e4",
"games": 161,
"wins": 91
}
}
}
],
"team 2": [
{
"id": "56acbeb4-687d-4c8b-a881-0b9abdda64e4",
"response-queue": "player-2-queue",
"event-name": "find-game",
"detail": {
"rating": 2695,
"content": {
"id": "343e8c2d-6fda-40df-b859-90c5bafecb61",
"games": 215,
"wins": 126
}
}
}
]
}
}
response = await client.send(payload=payload)

assert 'content' in response.keys()
assert 'event-name' in response.keys()

assert 'added' in response['content'].keys()
assert response['content']['added'] is False

assert 'is_filled' in response['content'].keys()
assert response['content']['is_filled'] is True

assert 'grouped-players' in response['content'].keys()
assert len(response['content']['grouped-players']['team 1']) == 1
assert payload['new-player'] not in response['content']['grouped-players']['team 1']
assert len(response['content']['grouped-players']['team 2']) == 1
assert payload['new-player'] not in response['content']['grouped-players']['team 2']

0 comments on commit 30c3dec

Please sign in to comment.