import valconomy from valconomy import ValorantPlayerInfo, RiotPlayerInfo, EconomyDecision class DummyValHandler: def __init__(self): self.seq = [] def none(self): self.seq.append('none') def menu(self, info: RiotPlayerInfo, was_idle: bool=False): self.seq.append(('menu', was_idle)) def idle(self, info: RiotPlayerInfo): self.seq.append('idle') def queue_start(self, info: RiotPlayerInfo): self.seq.append(('queue_start', info.valorant.is_party_owner and info.valorant.queue_type == 'unrated')) def match_found(self, info: RiotPlayerInfo): self.seq.append(('match_found', info.valorant.queue_type == 'premier-seasonmatch')) def pregame(self, info: RiotPlayerInfo): self.seq.append(('pregame', info.valorant.map == '/Game/Maps/Bonsai/Bonsai')) def game_generic(self, info: RiotPlayerInfo): t = info.valorant.queue_type if info.valorant.max_party_size == 12: t = 'custom' elif not t: t = 'unknown' self.seq.append(('game_generic', t)) def game_start(self, info: RiotPlayerInfo): self.seq.append('game_start') def round_start(self, info: RiotPlayerInfo, won: bool, economy: EconomyDecision): self.seq.append(('round_start', won, info.valorant.score, info.valorant.enemy_score, economy)) def game_over(self, info: RiotPlayerInfo, won: bool): self.seq.append(('game_over', won)) class TestSm: def setup_method(self, method): self.mock = DummyValHandler() self.sm = valconomy.ValconomyStateMachine('dummy', self.mock) def do(self, **kwargs): gone = kwargs.pop('gone', False) info = RiotPlayerInfo(kwargs.pop('uuid', 'dummy'), 'Team Player', 'gamer', 'unknown') info.valorant = ValorantPlayerInfo(**kwargs) self.sm.handle_presence(info, gone) def test_comp_normal(self): self.do(game_state='MENUS') self.do(game_state='MENUS', queue_type='competitive') for _ in range(2): self.do(game_state='MENUS', party_state='MATCHMAKING', queue_type='competitive') for _ in range(3): self.do(game_state='MENUS', party_state='MATCHMADE_GAME_STARTING', queue_type='competitive') self.do(queue_type='competitive', game_state='PREGAME', map='/Game/Maps/Bonsai/Bonsai') self.do(queue_type='competitive', game_state='INGAME', map='/Game/Maps/Bonsai/Bonsai') for _ in range(2): self.do(queue_type='competitive', game_state='INGAME', map='/Game/Maps/Bonsai/Bonsai', score=1, enemy_score=0) self.do(queue_type='competitive', game_state='INGAME', map='/Game/Maps/Bonsai/Bonsai', score=2, enemy_score=0) for i in range(14): self.do(queue_type='competitive', game_state='INGAME', map='/Game/Maps/Bonsai/Bonsai', score=2, enemy_score=i) self.do(queue_type='competitive', game_state='INGAME', map='/Game/Maps/Bonsai/Bonsai', score=0, enemy_score=0) assert self.mock.seq == [ ('menu', False), ('queue_start', False), ('match_found', False), ('pregame', True), 'game_start', ('round_start', None, 0, 0, EconomyDecision.BUY), ('round_start', True, 1, 0, EconomyDecision.BUY), ('round_start', True, 2, 0, EconomyDecision.BONUS), ('round_start', False, 2, 1, EconomyDecision.MATCH_TEAM), ] + [ ('round_start', False, 2, 2 + i, EconomyDecision.MATCH_TEAM) for i in range(8)] + [ ('round_start', False, 2, 10, EconomyDecision.BUY), ('round_start', False, 2, 11, EconomyDecision.SAVE), ('round_start', False, 2, 12, EconomyDecision.BUY), ('game_over', False) ] def test_comp_overtime(self): for _ in range(2): self.do(queue_type='competitive', game_state='INGAME') self.do(queue_type='competitive', game_state='INGAME', score=1) for i in range(13): self.do(queue_type='competitive', game_state='INGAME', score=1, enemy_score=i) for i in range(12): self.do(queue_type='competitive', game_state='INGAME', score=1 + i, enemy_score=12) self.do(queue_type='competitive', game_state='INGAME', score=13, enemy_score=12) self.do(queue_type='competitive', game_state='INGAME', score=13, enemy_score=13) self.do(queue_type='competitive', game_state='INGAME', score=13, enemy_score=14) self.do(queue_type='competitive', game_state='INGAME', score=14, enemy_score=14) self.do(queue_type='competitive', game_state='INGAME', score=15, enemy_score=14) self.do(queue_type='competitive', game_state='INGAME', score=16, enemy_score=14) self.do(queue_type='competitive', game_state='INGAME') assert self.mock.seq == [ 'game_start', ('round_start', None, 0, 0, EconomyDecision.BUY), ('round_start', True, 1, 0, EconomyDecision.BUY), ('round_start', False, 1, 1, EconomyDecision.SAVE), ] + [ ('round_start', False, 1, 2 + i, EconomyDecision.MATCH_TEAM) for i in range(9)] + [ ('round_start', False, 1, 11, EconomyDecision.BUY), ('round_start', False, 1, 12, EconomyDecision.BUY), ] + [ ('round_start', True, 2 + i, 12, EconomyDecision.BUY) for i in range(12)] + [ ('round_start', False, 13, 13, EconomyDecision.BUY), ('round_start', False, 13, 14, EconomyDecision.BUY), ('round_start', True, 14, 14, EconomyDecision.BUY), ('round_start', True, 15, 14, EconomyDecision.BUY), ('game_over', True), ] def test_swiftplay(self): self.do(game_state='MENUS') self.do(game_state='MENUS', queue_type='swiftplay') self.do(game_state='MENUS', party_state='MATCHMAKING', queue_type='swiftplay') self.do(game_state='MENUS', party_state='MATCHMADE_GAME_STARTING', queue_type='swiftplay') self.do(queue_type='swiftplay', game_state='PREGAME') self.do(queue_type='swiftplay', game_state='INGAME') for i in range(5): self.do(queue_type='swiftplay', game_state='INGAME', enemy_score=1 + i) self.do(queue_type='swiftplay', game_state='INGAME') assert self.mock.seq == [ ('menu', False), ('queue_start', False), ('match_found', False), ('pregame', False), 'game_start', ('round_start', None, 0, 0, EconomyDecision.BUY), ] + [ ('round_start', False, 0, 1 + i, EconomyDecision.BUY) for i in range(4)] + [ ('game_over', False), ] def test_tdm(self): self.do(game_state='MENUS') self.do(game_state='MENUS', queue_type='hurm') self.do(game_state='MENUS', party_state='MATCHMAKING', queue_type='hurm') self.do(game_state='MENUS', party_state='MATCHMADE_GAME_STARTING', queue_type='hurm') self.do(queue_type='hurm', game_state='PREGAME') self.do(queue_type='hurm', game_state='INGAME') for i in range(100): self.do(queue_type='hurm', game_state='INGAME', enemy_score=1 + i) self.do(queue_type='hurm', game_state='INGAME') assert self.mock.seq == [ ('menu', False), ('queue_start', False), ('match_found', False), ('game_generic', 'hurm'), ]