valconomy/controller/test_sm.py

171 lines
6.7 KiB
Python

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'),
]