async def test_cancel_twice(ladder_service: LadderService): p1 = mock.create_autospec(Player('Dostya', id=1)) p1.ladder_rating = (1500, 500) p1.numGames = 0 p2 = mock.create_autospec(Player('Brackman', id=1)) p2.ladder_rating = (2000, 50) p2.numGames = 0 search = Search([p1]) search2 = Search([p2]) ladder_service.start_search(p1, search, 'ladder1v1') ladder_service.start_search(p2, search2, 'ladder1v1') searches = ladder_service._cancel_existing_searches(p1) assert search.is_cancelled assert searches == [search] assert not search2.is_cancelled searches = ladder_service._cancel_existing_searches(p1) assert searches == [] searches = ladder_service._cancel_existing_searches(p2) assert search2.is_cancelled assert searches == [search2]
async def test_start_game(ladder_service: LadderService, game_service: GameService): p1 = mock.create_autospec(Player('Dostya', id=1)) p2 = mock.create_autospec(Player('Rhiza', id=2)) game_service.ladder_maps = [(1, 'scmp_007', 'maps/scmp_007.zip')] with mock.patch('asyncio.sleep', CoroMock()): await ladder_service.start_game(p1, p2) assert p1.lobby_connection.launch_game.called assert p2.lobby_connection.launch_game.called
def game_5p(game): game.state = GameState.LOBBY players = [ Player(id=1, login='******', global_rating=(1500, 500)), Player(id=2, login='******', global_rating=(1500, 500)), Player(id=3, login='******', global_rating=(1500, 500)), Player(id=4, login='******', global_rating=(1500, 500)), Player(id=5, login='******', global_rating=(1500, 500)), ] add_connected_players(game, players) return game
async def test_clear_slot(game: Game, game_connection: GameConnection): game.state = GameState.LOBBY players = [ Player(id=1, login='******', global_rating=(1500, 500)), Player(id=2, login='******', global_rating=(1500, 500)) ] add_connected_players(game, players) game.clear_slot(0) assert game.get_player_option(1, 'StartSpot') == -1 assert game.get_player_option(1, 'Team') == -1 assert game.get_player_option(1, 'Army') == -1 assert game.get_player_option(2, 'StartSpot') == 1
def test_inform_player(ladder_service: LadderService): p1 = mock.create_autospec(Player('Dostya', id=1)) p1.ladder_rating = (1500, 500) ladder_service.inform_player(p1) assert p1.lobby_connection.sendJSON.called
def test_unlink_weakref(): p = Player(login='******') mock_game = mock.Mock() p.game = mock_game assert p.game == mock_game del p.game assert p.game is None
def test_serialize(): p = Player(player_id=42, login="******", ratings={ RatingType.GLOBAL: (1234, 68), RatingType.LADDER_1V1: (1500, 230), }, clan="TOAST", game_count={RatingType.GLOBAL: 542}) assert p.to_dict() == { "id": 42, "login": "******", "clan": "TOAST", "ratings": { "global": { "rating": (1234, 68), "number_of_games": 542 }, "ladder_1v1": { "rating": (1500, 230), "number_of_games": 0 } }, "global_rating": (1234, 68), "ladder_rating": (1500, 230), "number_of_games": 542, }
def playerMock(lobbythread, id): player_mock = mock.create_autospec(spec=Player('')) player_mock.login = "******" % id player_mock.id = id player_mock.game_port = 4242 player_mock.lobby_connection = lobbythread return player_mock
def test_queue_race(mocker, player_service, matchmaker_queue): p1, p2, p3 = Player('Dostya', id=1, ladder_rating=(2300, 150)), \ Player('Brackman', id=2, ladder_rating=(2200, 150)), \ Player('Zoidberg', id=3, ladder_rating=(2300, 125)) player_service.players = {p1.id: p1, p2.id: p2, p3.id: p3} matchmaker_queue.game_service.ladder_service.start_game = CoroMock() try: yield from asyncio.gather( asyncio.wait_for(matchmaker_queue.search(p1), 0.1), asyncio.wait_for(matchmaker_queue.search(p2), 0.1), asyncio.wait_for(matchmaker_queue.search(p3), 0.1)) except (TimeoutError, CancelledError): pass assert len(matchmaker_queue) == 0
async def test_queue_many(mocker, player_service, matchmaker_queue): p1, p2, p3 = Player('Dostya', id=1, ladder_rating=(2200, 150), numGames=(config.NEWBIE_MIN_GAMES+1)), \ Player('Brackman', id=2, ladder_rating=(1500, 150), numGames=(config.NEWBIE_MIN_GAMES+1)), \ Player('Zoidberg', id=3, ladder_rating=(1500, 125), numGames=(config.NEWBIE_MIN_GAMES+1)) player_service.players = {p1.id: p1, p2.id: p2, p3.id: p3} s1 = Search([p1]) s2 = Search([p2]) s3 = Search([p3]) matchmaker_queue.push(s1) matchmaker_queue.push(s2) matchmaker_queue.push(s3) matchmaker_queue.find_matches() assert not s1.is_matched assert s2.is_matched assert s3.is_matched
async def test_report_army_stats_sends_stats_for_defeated_player(game: Game): game.state = GameState.LOBBY players = [ Player(id=1, login='******', global_rating=(1500, 500)), Player(id=2, login='******', global_rating=(1500, 500)) ] add_connected_players(game, players) await game.launch() await game.add_result(0, 1, 'defeat', -1) with open("tests/data/game_stats_simple_win.json", "r") as stats_file: stats = stats_file.read() await game.report_army_stats(stats) game._game_stats_service.process_game_stats.assert_called_once_with( players[1], game, stats)
async def test_rate_game_late_abort_no_enforce(game_service, game_stats_service, custom_game): custom_game.state = GameState.LOBBY players = [ Player(id=1, login='******', global_rating=(1500, 500)), Player(id=2, login='******', global_rating=(1500, 500)), ] add_connected_players(custom_game, players) custom_game.set_player_option(1, 'Team', 2) custom_game.set_player_option(2, 'Team', 3) await custom_game.launch() await custom_game.add_result(0, 1, 'VICTORY', 5) custom_game.launched_at = time.time() - 600 # seconds await custom_game.on_game_end() assert custom_game.validity == ValidityState.VALID
async def test_start_game_called_on_match(ladder_service: LadderService): p1 = mock.create_autospec(Player('Dostya', id=1)) p1.ladder_rating = (2300, 64) p1.numGames = 0 p2 = mock.create_autospec(Player('QAI', id=4)) p2.ladder_rating = (2350, 125) p2.numGames = 0 ladder_service.start_game = CoroMock() ladder_service.inform_player = mock.Mock() ladder_service.start_search(p1, Search([p1]), 'ladder1v1') ladder_service.start_search(p2, Search([p2]), 'ladder1v1') await asyncio.sleep(1) ladder_service.inform_player.assert_called() ladder_service.start_game.assert_called_once()
def test_faction(): """ Yes, this test was motivated by a bug :return: """ p = Player('Schroedinger2') p.faction = 'aeon' assert p.faction == Faction.aeon p.faction = Faction.aeon assert p.faction == Faction.aeon
async def test_persist_results_called_with_two_players(game): await game.clear_data() game.state = GameState.LOBBY players = [ Player(id=1, login='******', global_rating=(1500, 500)), Player(id=2, login='******', global_rating=(1500, 500)) ] add_connected_players(game, players) await game.launch() assert len(game.players) == 2 await game.add_result(0, 1, 'VICTORY', 5) await game.on_game_end() assert game.get_army_result(1) == 5 assert len(game.players) == 2 await game.load_results() assert game.get_army_result(1) == 5
def test_ratings(): p = Player('Schroedinger') p.ratings[RatingType.GLOBAL] = (1500, 20) assert p.ratings[RatingType.GLOBAL] == (1500, 20) p.ratings[RatingType.GLOBAL] = Rating(1700, 20) assert p.ratings[RatingType.GLOBAL] == (1700, 20) p.ratings[RatingType.LADDER_1V1] = (1200, 20) assert p.ratings[RatingType.LADDER_1V1] == (1200, 20) p.ratings[RatingType.LADDER_1V1] = Rating(1200, 20) assert p.ratings[RatingType.LADDER_1V1] == (1200, 20)
async def test_start_game_timeout(ladder_service: LadderService, game_service: GameService): p1 = mock.create_autospec(Player('Dostya', id=1)) p2 = mock.create_autospec(Player('Rhiza', id=2)) p1.id = 1 p2.id = 2 game_service.ladder_maps = [(1, 'scmp_007', 'maps/scmp_007.zip')] with mock.patch('server.games.game.Game.sleep', CoroMock()): await ladder_service.start_game(p1, p2) p1.lobby_connection.send.assert_called_once_with( {"command": "game_launch_timeout"}) p2.lobby_connection.send.assert_called_once_with( {"command": "game_launch_timeout"}) assert p1.lobby_connection.launch_game.called # TODO: Once client supports `game_launch_timeout` change this to `assert not ...` assert p2.lobby_connection.launch_game.called
def test_ratings(): p = Player('Schroedinger') p.global_rating = (1500, 20) assert p.global_rating == (1500, 20) p.global_rating = Rating(1700, 20) assert p.global_rating == (1700, 20) p.ladder_rating = (1200, 20) assert p.ladder_rating == (1200, 20) p.ladder_rating = Rating(1200, 20) assert p.ladder_rating == (1200, 20)
def make(login='', id=0, port=6112, state=PlayerState.HOSTING, ip='127.0.0.1', global_rating=Rating(1500, 250), ladder_rating=Rating(1500, 250)): p = mock.create_autospec(spec=Player(login)) p.global_rating = global_rating p.ladder_rating = ladder_rating p.ip = ip p.game_port = port p.state = state p.id = id p.login = login p.address_and_port = "{}:{}".format(ip, port) return p
def test_weak_references(): p = Player(login='******') weak_properties = ['lobby_connection', 'game'] referent = mock.Mock() for prop in weak_properties: setattr(p, prop, referent) del referent gc.collect() for prop in weak_properties: assert getattr(p, prop) is None
def test_weak_references(): p = Player(login="******") weak_properties = ["lobby_connection", "game", "game_connection"] referent = mock.Mock() for prop in weak_properties: setattr(p, prop, referent) del referent gc.collect() for prop in weak_properties: assert getattr(p, prop) is None
def test_ratings(): p = Player("Schroedinger") p.ratings[RatingType.GLOBAL] = (1500, 20) assert p.ratings[RatingType.GLOBAL] == (1500, 20) p.ratings[RatingType.GLOBAL] = Rating(1700, 20) assert p.ratings[RatingType.GLOBAL] == (1700, 20) assert p.ratings["tmm_2v2"] == (1700, 170) p.ratings[RatingType.LADDER_1V1] = (1200, 20) assert p.ratings[RatingType.LADDER_1V1] == (1200, 20) p.ratings[RatingType.LADDER_1V1] = Rating(1200, 20) assert p.ratings[RatingType.LADDER_1V1] == (1200, 20) assert p.ratings["Something completely different"] == (1500, 500)
async def test_queue_race(mocker, player_service, matchmaker_queue): p1, p2, p3 = Player('Dostya', id=1, ladder_rating=(2300, 150), numGames=(config.NEWBIE_MIN_GAMES+1)), \ Player('Brackman', id=2, ladder_rating=(2200, 150), numGames=(config.NEWBIE_MIN_GAMES+1)), \ Player('Zoidberg', id=3, ladder_rating=(2300, 125), numGames=(config.NEWBIE_MIN_GAMES+1)) player_service.players = {p1.id: p1, p2.id: p2, p3.id: p3} async def find_matches(): await asyncio.sleep(0.01) matchmaker_queue.find_matches() try: await asyncio.gather( asyncio.wait_for(matchmaker_queue.search(Search([p1])), 0.1), asyncio.wait_for(matchmaker_queue.search(Search([p2])), 0.1), asyncio.wait_for(matchmaker_queue.search(Search([p3])), 0.1), asyncio.ensure_future(find_matches())) except (TimeoutError, CancelledError): pass assert len(matchmaker_queue) == 0
async def test_on_game_end_calls_rate_game_with_two_players(game): await game.clear_data() game.rate_game = CoroMock() game.state = GameState.LOBBY players = [ Player(id=1, login='******', global_rating=(1500, 500)), Player(id=2, login='******', global_rating=(1500, 500)) ] add_connected_players(game, players) await game.launch() assert len(game.players) == 2 await game.add_result(0, 1, 'victory', 10) await game.add_result(1, 2, 'defeat', -10) await game.on_game_end() assert game.state == GameState.ENDED game.rate_game.assert_any_call() assert game.validity is ValidityState.VALID
def matchmaker_players(): return Player('Dostya', id=1, ladder_rating=(2300, 64), numGames=(config.NEWBIE_MIN_GAMES+1)), \ Player('Brackman', id=2, ladder_rating=(1200, 72), numGames=(config.NEWBIE_MIN_GAMES+1)), \ Player('Zoidberg', id=3, ladder_rating=(1300, 175), numGames=(config.NEWBIE_MIN_GAMES+1)), \ Player('QAI', id=4, ladder_rating=(2350, 125), numGames=(config.NEWBIE_MIN_GAMES+1)), \ Player('Rhiza', id=5, ladder_rating=(1200, 175), numGames=(config.NEWBIE_MIN_GAMES+1)), \ Player('Newbie', id=6, ladder_rating=(1200, 175), numGames=(config.NEWBIE_MIN_GAMES-1))
async def test_players_exclude_observers(game: Game): game.state = GameState.LOBBY players = [ Player(id=1, login='******', global_rating=(1500, 500)), Player(id=2, login='******', global_rating=(1500, 500)), ] add_connected_players(game, players) obs = Player(id=3, login='******', global_rating=(1500, 500)) game.game_service.player_service[obs.id] = obs gc = mock_game_connection(state=GameConnectionState.CONNECTED_TO_HOST, player=obs) game.set_player_option(obs.id, 'Army', -1) game.set_player_option(obs.id, 'StartSpot', -1) game.set_player_option(obs.id, 'Team', 0) game.set_player_option(obs.id, 'Faction', 0) game.set_player_option(obs.id, 'Color', 0) game.add_game_connection(gc) await game.launch() assert game.players == frozenset(players)
async def test_persist_results_not_called_with_one_player(game): await game.clear_data() game.persist_results = CoroMock() game.state = GameState.LOBBY players = [Player(id=1, login='******', global_rating=(1500, 500))] add_connected_players(game, players) await game.launch() assert len(game.players) == 1 await game.add_result(0, 1, 'VICTORY', 5) await game.on_game_end() game.persist_results.assert_not_called()
async def test_game_ends_in_mutually_agreed_draw(game: Game): await game.clear_data() game.state = GameState.LOBBY players = [ Player(id=1, login='******', global_rating=(1500, 500)), Player(id=2, login='******', global_rating=(1500, 500)) ] add_connected_players(game, players) await game.launch() for player in players: game.set_player_option(player.id, 'Team', 1) game.set_player_option(player.id, 'Army', player.id - 1) game.state = GameState.LIVE game.launched_at = time.time() - 60 * 60 await game.add_result(players[0], 0, 'mutual_draw', 0) await game.add_result(players[1], 1, 'mutual_draw', 0) await game.on_game_end() assert game.validity is ValidityState.MUTUAL_DRAW
def add_players(gameobj: BaseGame, n: int, team: int=None): game = gameobj current = len(game.players) players = [] for i in range(current, current+n): players.append(Player(id=i+1, login='******'+str(i+1), global_rating=(1500, 500))) add_connected_players(game, players) if team is not None: for p in players: game.set_player_option(p.id, 'Team', team) return players
def test_serialize(): p = Player(id=42, login='******', global_rating=(1234, 68), ladder_rating=(1500, 230), clan='TOAST', numGames=542) assert p.to_dict() == { "id": 42, "login": '******', "global_rating": (1234, 68), "ladder_rating": (1500, 230), "number_of_games": 542, "clan": 'TOAST' }