171 lines
6.7 KiB
Python
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'),
|
|
]
|