2019-12-08 22:43:49 +01:00
import random
import time
from typing import Dict , List , Optional
from bemani . client . base import BaseClient
from bemani . protocol import Node
class ReflecBeatVolzza ( BaseClient ) :
2022-10-15 20:56:30 +02:00
NAME = " T E S T "
2019-12-08 22:43:49 +01:00
def verify_pcb_rb5_pcb_boot ( self , loc : str ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
pcb = Node . void ( " pcb " )
pcb . set_attribute ( " method " , " rb5_pcb_boot " )
pcb . add_child ( Node . string ( " lid " , loc ) )
pcb . add_child ( Node . string ( " rno " , " MBR-JA-C01 " ) )
2019-12-08 22:43:49 +01:00
call . add_child ( pcb )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/pcb/sinfo/nm " )
self . assert_path ( resp , " response/pcb/sinfo/cl_enbl " )
self . assert_path ( resp , " response/pcb/sinfo/cl_h " )
self . assert_path ( resp , " response/pcb/sinfo/cl_m " )
self . assert_path ( resp , " response/pcb/sinfo/shop_flag " )
def verify_pcb_rb5_pcb_error ( self , loc : str ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
pcb = Node . void ( " pcb " )
2019-12-08 22:43:49 +01:00
call . add_child ( pcb )
2022-10-15 20:56:30 +02:00
pcb . set_attribute ( " method " , " rb5_pcb_error " )
pcb . add_child ( Node . string ( " lid " , loc ) )
pcb . add_child ( Node . string ( " code " , " exception " ) )
pcb . add_child ( Node . string ( " msg " , " exceptionstring " ) )
2019-12-08 22:43:49 +01:00
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/pcb/@status " )
def verify_info_rb5_info_read ( self , loc : str ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
info = Node . void ( " info " )
2019-12-08 22:43:49 +01:00
call . add_child ( info )
2022-10-15 20:56:30 +02:00
info . set_attribute ( " method " , " rb5_info_read " )
info . add_child ( Node . string ( " lid " , loc ) )
2019-12-08 22:43:49 +01:00
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/info/event_ctrl " )
self . assert_path ( resp , " response/info/item_lock_ctrl " )
def verify_info_rb5_info_read_shop_ranking ( self , loc : str ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
info = Node . void ( " info " )
2019-12-08 22:43:49 +01:00
call . add_child ( info )
2022-10-15 20:56:30 +02:00
info . set_attribute ( " method " , " rb5_info_read_shop_ranking " )
2019-12-08 22:43:49 +01:00
# Arbitrarily chosen based on the song IDs we send in the
# score section below.
2022-10-15 20:56:30 +02:00
info . add_child ( Node . s16 ( " min " , 1 ) )
info . add_child ( Node . s16 ( " max " , 10 ) )
info . add_child ( Node . string ( " lid " , loc ) )
2019-12-08 22:43:49 +01:00
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/info/shop_score/time " )
self . assert_path ( resp , " response/info/shop_score/data/rank " )
self . assert_path ( resp , " response/info/shop_score/data/music_id " )
self . assert_path ( resp , " response/info/shop_score/data/note_grade " )
self . assert_path ( resp , " response/info/shop_score/data/clear_type " )
self . assert_path ( resp , " response/info/shop_score/data/user_id " )
self . assert_path ( resp , " response/info/shop_score/data/icon_id " )
self . assert_path ( resp , " response/info/shop_score/data/score " )
self . assert_path ( resp , " response/info/shop_score/data/time " )
self . assert_path ( resp , " response/info/shop_score/data/name " )
def verify_info_rb5_info_read_hit_chart ( self ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
info = Node . void ( " info " )
info . set_attribute ( " method " , " rb5_info_read_hit_chart " )
info . add_child ( Node . s32 ( " ver " , 0 ) )
2019-12-08 22:43:49 +01:00
call . add_child ( info )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/info/ver " )
self . assert_path ( resp , " response/info/ranking/weekly/bt " )
self . assert_path ( resp , " response/info/ranking/weekly/et " )
self . assert_path ( resp , " response/info/ranking/weekly/new/d/mid " )
self . assert_path ( resp , " response/info/ranking/weekly/new/d/cnt " )
self . assert_path ( resp , " response/info/ranking/monthly/bt " )
self . assert_path ( resp , " response/info/ranking/monthly/et " )
self . assert_path ( resp , " response/info/ranking/monthly/new/d/mid " )
self . assert_path ( resp , " response/info/ranking/monthly/new/d/cnt " )
self . assert_path ( resp , " response/info/ranking/total/bt " )
self . assert_path ( resp , " response/info/ranking/total/et " )
self . assert_path ( resp , " response/info/ranking/total/new/d/mid " )
self . assert_path ( resp , " response/info/ranking/total/new/d/cnt " )
def verify_player_rb5_player_start ( self , refid : str ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
player = Node . void ( " player " )
player . set_attribute ( " method " , " rb5_player_start " )
player . add_child ( Node . string ( " rid " , refid ) )
player . add_child ( Node . u8_array ( " ga " , [ 127 , 0 , 0 , 1 ] ) )
player . add_child ( Node . u16 ( " gp " , 10573 ) )
player . add_child ( Node . u8_array ( " la " , [ 16 , 0 , 0 , 0 ] ) )
2024-01-02 03:46:24 +01:00
player . add_child ( Node . u8_array ( " pnid " , [ 39 , 16 , 0 , 0 , 0 , 23 , 62 , 60 , 39 , 127 , 0 , 0 , 1 , 23 , 62 , 60 ] ) )
2019-12-08 22:43:49 +01:00
call . add_child ( player )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/player/plyid " )
self . assert_path ( resp , " response/player/start_time " )
self . assert_path ( resp , " response/player/event_ctrl " )
self . assert_path ( resp , " response/player/item_lock_ctrl " )
def verify_player_rb5_player_end ( self , refid : str ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
player = Node . void ( " player " )
player . set_attribute ( " method " , " rb5_player_end " )
player . add_child ( Node . string ( " rid " , refid ) )
2019-12-08 22:43:49 +01:00
call . add_child ( player )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/player " )
def verify_player_rb5_player_read_rank ( self ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
player = Node . void ( " player " )
player . set_attribute ( " method " , " rb5_player_read_rank " )
player . add_child ( Node . s32 ( " uid " , 0 ) )
player . add_child ( Node . s32_array ( " sc " , [ 897 , 897 , 0 , 0 , 0 ] ) )
player . add_child ( Node . s8 ( " mg_id " , 0 ) )
player . add_child ( Node . s32 ( " mg_sc " , 220 ) )
2019-12-08 22:43:49 +01:00
call . add_child ( player )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/player/tbs/new_rank " )
self . assert_path ( resp , " response/player/tbs/old_rank " )
self . assert_path ( resp , " response/player/mng/new_rank " )
self . assert_path ( resp , " response/player/mng/old_rank " )
def verify_player_rb5_player_read_rival_score ( self , extid : int ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
player = Node . void ( " player " )
player . set_attribute ( " method " , " rb5_player_read_rival_score " )
player . add_child ( Node . s32 ( " uid " , extid ) )
player . add_child ( Node . s32 ( " music_id " , 6 ) )
player . add_child ( Node . s32 ( " note_grade " , 0 ) )
2019-12-08 22:43:49 +01:00
call . add_child ( player )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/player/@status " )
# Verify that we got a score if the extid is nonzero
if extid != 0 :
self . assert_path ( resp , " response/player/player_select_score/user_id " )
self . assert_path ( resp , " response/player/player_select_score/name " )
self . assert_path ( resp , " response/player/player_select_score/m_score " )
self . assert_path ( resp , " response/player/player_select_score/m_scoreTime " )
self . assert_path ( resp , " response/player/player_select_score/m_iconID " )
2022-10-15 20:56:30 +02:00
if resp . child_value ( " player/player_select_score/name " ) != self . NAME :
2019-12-08 22:43:49 +01:00
raise Exception (
2020-01-07 22:29:07 +01:00
f ' Invalid name { resp . child_value ( " player/player_select_score/name " ) } returned on score read! '
2019-12-08 22:43:49 +01:00
)
2022-10-15 20:56:30 +02:00
if resp . child_value ( " player/player_select_score/user_id " ) != extid :
2019-12-08 22:43:49 +01:00
raise Exception (
2020-01-07 22:29:07 +01:00
f ' Invalid name { resp . child_value ( " player/player_select_score/user_id " ) } returned on score read! '
2019-12-08 22:43:49 +01:00
)
def verify_player_rb5_player_read_rival_ranking_data ( self , extid : int ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
player = Node . void ( " player " )
player . set_attribute ( " method " , " rb5_player_read_rival_ranking_data " )
player . add_child ( Node . s32 ( " uid " , extid ) )
player . add_child ( Node . s8 ( " mgid " , - 1 ) )
2019-12-08 22:43:49 +01:00
call . add_child ( player )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/player/rival_data/rl/uid " )
self . assert_path ( resp , " response/player/rival_data/rl/nm " )
self . assert_path ( resp , " response/player/rival_data/rl/ic " )
self . assert_path ( resp , " response/player/rival_data/rl/sl/mid " )
self . assert_path ( resp , " response/player/rival_data/rl/sl/m " )
self . assert_path ( resp , " response/player/rival_data/rl/sl/t " )
2022-10-15 20:56:30 +02:00
if resp . child_value ( " player/rival_data/rl/nm " ) != self . NAME :
2019-12-08 22:43:49 +01:00
raise Exception (
2020-01-07 22:29:07 +01:00
f ' Invalid name { resp . child_value ( " player/rival_data/rl/nm " ) } returned on rival ranking read! '
2019-12-08 22:43:49 +01:00
)
def verify_player_rb5_player_succeed ( self , refid : str ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
player = Node . void ( " player " )
player . set_attribute ( " method " , " rb5_player_succeed " )
player . add_child ( Node . string ( " rid " , refid ) )
2019-12-08 22:43:49 +01:00
call . add_child ( player )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/player/name " )
self . assert_path ( resp , " response/player/grd " )
self . assert_path ( resp , " response/player/ap " )
self . assert_path ( resp , " response/player/uattr " )
2024-01-02 03:46:24 +01:00
def verify_player_rb5_player_read ( self , refid : str , cardid : str , location : str ) - > None :
2019-12-08 22:43:49 +01:00
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
player = Node . void ( " player " )
player . set_attribute ( " method " , " rb5_player_read " )
player . add_child ( Node . string ( " rid " , refid ) )
player . add_child ( Node . string ( " lid " , location ) )
player . add_child ( Node . s16 ( " ver " , 0 ) )
player . add_child ( Node . string ( " card_id " , cardid ) )
player . add_child ( Node . s16 ( " card_type " , 1 ) )
2019-12-08 22:43:49 +01:00
call . add_child ( player )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/player/pdata/account/usrid " )
self . assert_path ( resp , " response/player/pdata/account/tpc " )
self . assert_path ( resp , " response/player/pdata/account/dpc " )
self . assert_path ( resp , " response/player/pdata/account/crd " )
self . assert_path ( resp , " response/player/pdata/account/brd " )
self . assert_path ( resp , " response/player/pdata/account/tdc " )
self . assert_path ( resp , " response/player/pdata/account/intrvld " )
self . assert_path ( resp , " response/player/pdata/account/ver " )
self . assert_path ( resp , " response/player/pdata/account/pst " )
self . assert_path ( resp , " response/player/pdata/account/st " )
self . assert_path ( resp , " response/player/pdata/account/succeed " )
self . assert_path ( resp , " response/player/pdata/account/opc " )
self . assert_path ( resp , " response/player/pdata/account/lpc " )
self . assert_path ( resp , " response/player/pdata/account/cpc " )
self . assert_path ( resp , " response/player/pdata/base/name " )
self . assert_path ( resp , " response/player/pdata/base/mg " )
self . assert_path ( resp , " response/player/pdata/base/ap " )
self . assert_path ( resp , " response/player/pdata/base/cmnt " )
self . assert_path ( resp , " response/player/pdata/base/uattr " )
self . assert_path ( resp , " response/player/pdata/base/money " )
self . assert_path ( resp , " response/player/pdata/base/tbs " )
self . assert_path ( resp , " response/player/pdata/base/tbgs " )
self . assert_path ( resp , " response/player/pdata/base/mlog " )
self . assert_path ( resp , " response/player/pdata/base/class " )
self . assert_path ( resp , " response/player/pdata/base/class_ar " )
self . assert_path ( resp , " response/player/pdata/rival " )
self . assert_path ( resp , " response/player/pdata/config " )
self . assert_path ( resp , " response/player/pdata/custom " )
self . assert_path ( resp , " response/player/pdata/released " )
self . assert_path ( resp , " response/player/pdata/announce " )
self . assert_path ( resp , " response/player/pdata/dojo " )
self . assert_path ( resp , " response/player/pdata/player_param " )
self . assert_path ( resp , " response/player/pdata/shop_score " )
self . assert_path ( resp , " response/player/pdata/minigame " )
self . assert_path ( resp , " response/player/pdata/derby/is_open " )
self . assert_path ( resp , " response/player/pdata/mylist/list/idx " )
self . assert_path ( resp , " response/player/pdata/mylist/list/mlst " )
2022-10-15 20:56:30 +02:00
if resp . child_value ( " player/pdata/base/name " ) != self . NAME :
2024-01-02 03:46:24 +01:00
raise Exception ( f ' Invalid name { resp . child_value ( " player/pdata/base/name " ) } returned on profile read! ' )
2019-12-08 22:43:49 +01:00
2024-01-02 03:46:24 +01:00
def verify_player_rb5_player_read_score ( self , refid : str , location : str ) - > List [ Dict [ str , int ] ] :
2019-12-08 22:43:49 +01:00
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
player = Node . void ( " player " )
2019-12-08 22:43:49 +01:00
call . add_child ( player )
2022-10-15 20:56:30 +02:00
player . set_attribute ( " method " , " rb5_player_read_score " )
player . add_child ( Node . string ( " rid " , refid ) )
player . add_child ( Node . s16 ( " ver " , 1 ) )
2019-12-08 22:43:49 +01:00
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
scores = [ ]
2022-10-15 20:56:30 +02:00
for child in resp . child ( " player/pdata/record " ) . children :
if child . name != " rec " :
2019-12-08 22:43:49 +01:00
continue
2022-10-15 20:56:30 +02:00
self . assert_path ( child , " rec/mid " )
self . assert_path ( child , " rec/ntgrd " )
self . assert_path ( child , " rec/pc " )
self . assert_path ( child , " rec/ct " )
self . assert_path ( child , " rec/ar " )
self . assert_path ( child , " rec/scr " )
self . assert_path ( child , " rec/ms " )
self . assert_path ( child , " rec/param " )
self . assert_path ( child , " rec/bscrt " )
self . assert_path ( child , " rec/bart " )
self . assert_path ( child , " rec/bctt " )
self . assert_path ( child , " rec/bmst " )
self . assert_path ( child , " rec/time " )
self . assert_path ( child , " rec/k_flag " )
2019-12-08 22:43:49 +01:00
score = {
2022-10-15 20:56:30 +02:00
" id " : child . child_value ( " mid " ) ,
" chart " : child . child_value ( " ntgrd " ) ,
" clear_type " : child . child_value ( " ct " ) ,
" combo_type " : child . child_value ( " param " ) ,
" achievement_rate " : child . child_value ( " ar " ) ,
" score " : child . child_value ( " scr " ) ,
" miss_count " : child . child_value ( " ms " ) ,
2019-12-08 22:43:49 +01:00
}
scores . append ( score )
return scores
def verify_player_rb5_player_write (
self ,
refid : str ,
loc : str ,
2022-10-15 20:56:30 +02:00
scores : List [ Dict [ str , int ] ] = [ ] ,
rivals : List [ int ] = [ ] ,
2019-12-08 22:43:49 +01:00
) - > int :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
player = Node . void ( " player " )
2019-12-08 22:43:49 +01:00
call . add_child ( player )
2022-10-15 20:56:30 +02:00
player . set_attribute ( " method " , " rb5_player_write " )
pdata = Node . void ( " pdata " )
2019-12-08 22:43:49 +01:00
player . add_child ( pdata )
2022-10-15 20:56:30 +02:00
account = Node . void ( " account " )
2019-12-08 22:43:49 +01:00
pdata . add_child ( account )
2022-10-15 20:56:30 +02:00
account . add_child ( Node . s32 ( " usrid " , 0 ) )
account . add_child ( Node . s32 ( " plyid " , 0 ) )
account . add_child ( Node . s32 ( " tpc " , 1 ) )
account . add_child ( Node . s32 ( " dpc " , 1 ) )
account . add_child ( Node . s32 ( " crd " , 1 ) )
account . add_child ( Node . s32 ( " brd " , 1 ) )
account . add_child ( Node . s32 ( " tdc " , 1 ) )
account . add_child ( Node . string ( " rid " , refid ) )
account . add_child ( Node . string ( " lid " , loc ) )
account . add_child ( Node . u8 ( " wmode " , 0 ) )
account . add_child ( Node . u8 ( " gmode " , 0 ) )
account . add_child ( Node . s16 ( " ver " , 0 ) )
account . add_child ( Node . bool ( " pp " , False ) )
account . add_child ( Node . bool ( " ps " , False ) )
account . add_child ( Node . bool ( " continue " , False ) )
account . add_child ( Node . bool ( " firstfree " , False ) )
account . add_child ( Node . s16 ( " pay " , 0 ) )
account . add_child ( Node . s16 ( " pay_pc " , 0 ) )
account . add_child ( Node . u64 ( " st " , int ( time . time ( ) * 1000 ) ) )
base = Node . void ( " base " )
2019-12-08 22:43:49 +01:00
pdata . add_child ( base )
2022-10-15 20:56:30 +02:00
base . add_child ( Node . string ( " name " , self . NAME ) )
base . add_child ( Node . s32 ( " mg " , 0 ) )
base . add_child ( Node . s32 ( " ap " , 0 ) )
base . add_child ( Node . s32 ( " uattr " , 0 ) )
base . add_child ( Node . s32 ( " money " , 0 ) )
base . add_child ( Node . bool ( " is_tut " , False ) )
base . add_child ( Node . s32 ( " class " , - 1 ) )
base . add_child ( Node . s32 ( " class_ar " , 0 ) )
stglog = Node . void ( " stglog " )
2019-12-08 22:43:49 +01:00
pdata . add_child ( stglog )
index = 0
for score in scores :
2022-10-15 20:56:30 +02:00
log = Node . void ( " log " )
2019-12-08 22:43:49 +01:00
stglog . add_child ( log )
2022-10-15 20:56:30 +02:00
log . add_child ( Node . s8 ( " stg " , index ) )
log . add_child ( Node . s16 ( " mid " , score [ " id " ] ) )
log . add_child ( Node . s8 ( " ng " , score [ " chart " ] ) )
log . add_child ( Node . s8 ( " col " , 1 ) )
log . add_child ( Node . s8 ( " mt " , 0 ) )
log . add_child ( Node . s8 ( " rt " , 0 ) )
log . add_child ( Node . s8 ( " ct " , score [ " clear_type " ] ) )
log . add_child ( Node . s16 ( " param " , score [ " combo_type " ] ) )
log . add_child ( Node . s16 ( " grd " , 0 ) )
log . add_child ( Node . s16 ( " ar " , score [ " achievement_rate " ] ) )
log . add_child ( Node . s16 ( " sc " , score [ " score " ] ) )
log . add_child ( Node . s16 ( " jt_jst " , 0 ) )
log . add_child ( Node . s16 ( " jt_grt " , 0 ) )
log . add_child ( Node . s16 ( " jt_gd " , 0 ) )
log . add_child ( Node . s16 ( " jt_ms " , score [ " miss_count " ] ) )
log . add_child ( Node . s16 ( " jt_jr " , 0 ) )
log . add_child ( Node . s32 ( " r_uid " , 0 ) )
log . add_child ( Node . s32 ( " r_plyid " , 0 ) )
log . add_child ( Node . s8 ( " r_stg " , 0 ) )
log . add_child ( Node . s8 ( " r_ct " , - 1 ) )
log . add_child ( Node . s16 ( " r_sc " , 0 ) )
log . add_child ( Node . s16 ( " r_grd " , 0 ) )
log . add_child ( Node . s16 ( " r_ar " , 0 ) )
log . add_child ( Node . s8 ( " r_cpuid " , - 1 ) )
log . add_child ( Node . s32 ( " time " , int ( time . time ( ) ) ) )
log . add_child ( Node . s8 ( " decide " , 0 ) )
log . add_child ( Node . s16 ( " g_gauge " , 5000 ) )
log . add_child ( Node . s32 ( " k_flag " , 0 ) )
2019-12-08 22:43:49 +01:00
index = index + 1
2022-10-15 20:56:30 +02:00
rivalnode = Node . void ( " rival " )
2019-12-08 22:43:49 +01:00
pdata . add_child ( rivalnode )
for rival in rivals :
2022-10-15 20:56:30 +02:00
r = Node . void ( " r " )
2019-12-08 22:43:49 +01:00
rivalnode . add_child ( r )
2022-10-15 20:56:30 +02:00
r . add_child ( Node . s32 ( " id " , rival ) )
r . add_child ( Node . s8 ( " regist_type " , 3 ) )
2019-12-08 22:43:49 +01:00
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/player/uid " )
2022-10-15 20:56:30 +02:00
return resp . child_value ( " player/uid " )
2019-12-08 22:43:49 +01:00
def verify_lobby_rb5_lobby_read ( self , location : str , extid : int ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
lobby = Node . void ( " lobby " )
lobby . set_attribute ( " method " , " rb5_lobby_read " )
lobby . add_child ( Node . s32 ( " uid " , extid ) )
lobby . add_child ( Node . s32 ( " plyid " , 0 ) )
lobby . add_child ( Node . u8 ( " m_grade " , 255 ) )
lobby . add_child ( Node . string ( " lid " , location ) )
lobby . add_child ( Node . s32 ( " max " , 128 ) )
lobby . add_child ( Node . s32_array ( " friend " , [ ] ) )
lobby . add_child ( Node . u8 ( " var " , 3 ) )
2019-12-08 22:43:49 +01:00
call . add_child ( lobby )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/lobby/interval " )
self . assert_path ( resp , " response/lobby/interval_p " )
def verify_lobby_rb5_lobby_entry ( self , location : str , extid : int ) - > int :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
lobby = Node . void ( " lobby " )
lobby . set_attribute ( " method " , " rb5_lobby_entry " )
e = Node . void ( " e " )
2019-12-08 22:43:49 +01:00
lobby . add_child ( e )
2022-10-15 20:56:30 +02:00
e . add_child ( Node . s32 ( " eid " , 0 ) )
e . add_child ( Node . u16 ( " mid " , 79 ) )
e . add_child ( Node . u8 ( " ng " , 0 ) )
e . add_child ( Node . s32 ( " uid " , extid ) )
e . add_child ( Node . s32 ( " uattr " , 0 ) )
e . add_child ( Node . string ( " pn " , self . NAME ) )
e . add_child ( Node . s32 ( " plyid " , 0 ) )
e . add_child ( Node . s16 ( " mg " , 255 ) )
e . add_child ( Node . s32 ( " mopt " , 0 ) )
e . add_child ( Node . string ( " lid " , location ) )
e . add_child ( Node . string ( " sn " , " " ) )
e . add_child ( Node . u8 ( " pref " , 51 ) )
e . add_child ( Node . s8 ( " stg " , 4 ) )
e . add_child ( Node . s8 ( " pside " , 0 ) )
e . add_child ( Node . s16 ( " eatime " , 30 ) )
e . add_child ( Node . u8_array ( " ga " , [ 127 , 0 , 0 , 1 ] ) )
e . add_child ( Node . u16 ( " gp " , 10007 ) )
e . add_child ( Node . u8_array ( " la " , [ 16 , 0 , 0 , 0 ] ) )
e . add_child ( Node . u8 ( " ver " , 2 ) )
lobby . add_child ( Node . s32_array ( " friend " , [ ] ) )
2019-12-08 22:43:49 +01:00
call . add_child ( lobby )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/lobby/interval " )
self . assert_path ( resp , " response/lobby/interval_p " )
self . assert_path ( resp , " response/lobby/eid " )
self . assert_path ( resp , " response/lobby/e/eid " )
self . assert_path ( resp , " response/lobby/e/mid " )
self . assert_path ( resp , " response/lobby/e/ng " )
self . assert_path ( resp , " response/lobby/e/uid " )
self . assert_path ( resp , " response/lobby/e/uattr " )
self . assert_path ( resp , " response/lobby/e/pn " )
self . assert_path ( resp , " response/lobby/e/plyid " )
self . assert_path ( resp , " response/lobby/e/mg " )
self . assert_path ( resp , " response/lobby/e/mopt " )
self . assert_path ( resp , " response/lobby/e/lid " )
self . assert_path ( resp , " response/lobby/e/sn " )
self . assert_path ( resp , " response/lobby/e/pref " )
self . assert_path ( resp , " response/lobby/e/stg " )
self . assert_path ( resp , " response/lobby/e/pside " )
self . assert_path ( resp , " response/lobby/e/eatime " )
self . assert_path ( resp , " response/lobby/e/ga " )
self . assert_path ( resp , " response/lobby/e/gp " )
self . assert_path ( resp , " response/lobby/e/la " )
self . assert_path ( resp , " response/lobby/e/ver " )
2022-10-15 20:56:30 +02:00
return resp . child_value ( " lobby/eid " )
2019-12-08 22:43:49 +01:00
def verify_lobby_rb5_lobby_delete_entry ( self , eid : int ) - > None :
call = self . call_node ( )
2022-10-15 20:56:30 +02:00
lobby = Node . void ( " lobby " )
lobby . set_attribute ( " method " , " rb5_lobby_delete_entry " )
lobby . add_child ( Node . s32 ( " eid " , eid ) )
2019-12-08 22:43:49 +01:00
call . add_child ( lobby )
# Swap with server
2022-10-15 20:56:30 +02:00
resp = self . exchange ( " " , call )
2019-12-08 22:43:49 +01:00
# Verify that response is correct
self . assert_path ( resp , " response/lobby/@status " )
def verify ( self , cardid : Optional [ str ] ) - > None :
# Verify boot sequence is okay
self . verify_services_get (
expected_services = [
2022-10-15 20:56:30 +02:00
" pcbtracker " ,
" pcbevent " ,
" local " ,
" message " ,
" facility " ,
" cardmng " ,
" package " ,
" posevent " ,
" pkglist " ,
" dlstatus " ,
" eacoin " ,
" lobby " ,
" lobby2 " ,
" ntp " ,
" keepalive " ,
2019-12-08 22:43:49 +01:00
]
)
paseli_enabled = self . verify_pcbtracker_alive ( )
self . verify_message_get ( )
self . verify_package_list ( )
self . verify_dlstatus_progress ( )
location = self . verify_facility_get ( )
self . verify_pcbevent_put ( )
self . verify_info_rb5_info_read ( location )
self . verify_pcb_rb5_pcb_boot ( location )
self . verify_pcb_rb5_pcb_error ( location )
# Verify card registration and profile lookup
if cardid is not None :
card = cardid
else :
card = self . random_card ( )
2020-01-07 22:29:07 +01:00
print ( f " Generated random card ID { card } for use. " )
2019-12-08 22:43:49 +01:00
if cardid is None :
2024-01-02 03:46:24 +01:00
self . verify_cardmng_inquire ( card , msg_type = " unregistered " , paseli_enabled = paseli_enabled )
2019-12-08 22:43:49 +01:00
ref_id = self . verify_cardmng_getrefid ( card )
if len ( ref_id ) != 16 :
2024-01-02 03:46:24 +01:00
raise Exception ( f " Invalid refid ' { ref_id } ' returned when registering card " )
if ref_id != self . verify_cardmng_inquire ( card , msg_type = " new " , paseli_enabled = paseli_enabled ) :
2022-10-15 20:56:30 +02:00
raise Exception ( f " Invalid refid ' { ref_id } ' returned when querying card " )
2019-12-08 22:43:49 +01:00
# Always get a player start, regardless of new profile or not
self . verify_player_rb5_player_start ( ref_id )
self . verify_player_rb5_player_succeed ( ref_id )
extid = self . verify_player_rb5_player_write (
ref_id ,
location ,
)
else :
print ( " Skipping new card checks for existing card " )
2024-01-02 03:46:24 +01:00
ref_id = self . verify_cardmng_inquire ( card , msg_type = " query " , paseli_enabled = paseli_enabled )
2019-12-08 22:43:49 +01:00
# Verify pin handling and return card handling
self . verify_cardmng_authpass ( ref_id , correct = True )
self . verify_cardmng_authpass ( ref_id , correct = False )
2024-01-02 03:46:24 +01:00
if ref_id != self . verify_cardmng_inquire ( card , msg_type = " query " , paseli_enabled = paseli_enabled ) :
2022-10-15 20:56:30 +02:00
raise Exception ( f " Invalid refid ' { ref_id } ' returned when querying card " )
2019-12-08 22:43:49 +01:00
# Verify lobby functionality
self . verify_lobby_rb5_lobby_read ( location , extid )
eid = self . verify_lobby_rb5_lobby_entry ( location , extid )
self . verify_lobby_rb5_lobby_delete_entry ( eid )
# Verify we start with empty scores
scores = self . verify_player_rb5_player_read_score ( ref_id , location )
if len ( scores ) > 0 :
2022-10-15 20:56:30 +02:00
raise Exception ( " Existing scores returned on new card? " )
2019-12-08 22:43:49 +01:00
if cardid is None :
# Verify score saving and updating
for phase in [ 1 , 2 ] :
if phase == 1 :
dummyscores = [
# An okay score on a chart
{
2022-10-15 20:56:30 +02:00
" id " : 9 ,
" chart " : 1 ,
" clear_type " : 9 ,
" combo_type " : 0 ,
" achievement_rate " : 7543 ,
" score " : 432 ,
" miss_count " : 5 ,
2019-12-08 22:43:49 +01:00
} ,
# A good score on an easier chart of the same song
{
2022-10-15 20:56:30 +02:00
" id " : 9 ,
" chart " : 0 ,
" clear_type " : 9 ,
" combo_type " : 1 ,
" achievement_rate " : 9876 ,
" score " : 543 ,
" miss_count " : 0 ,
2019-12-08 22:43:49 +01:00
} ,
# A bad score on a hard chart
{
2022-10-15 20:56:30 +02:00
" id " : 6 ,
" chart " : 2 ,
" clear_type " : 9 ,
" combo_type " : 0 ,
" achievement_rate " : 1234 ,
" score " : 123 ,
" miss_count " : 54 ,
2019-12-08 22:43:49 +01:00
} ,
# A terrible score on an easy chart
{
2022-10-15 20:56:30 +02:00
" id " : 6 ,
" chart " : 0 ,
" clear_type " : 9 ,
" combo_type " : 0 ,
" achievement_rate " : 1024 ,
" score " : 50 ,
" miss_count " : 90 ,
2019-12-08 22:43:49 +01:00
} ,
]
if phase == 2 :
dummyscores = [
# A better score on the same chart
{
2022-10-15 20:56:30 +02:00
" id " : 9 ,
" chart " : 1 ,
" clear_type " : 9 ,
" combo_type " : 0 ,
" achievement_rate " : 8765 ,
" score " : 469 ,
" miss_count " : 1 ,
2019-12-08 22:43:49 +01:00
} ,
# A worse score on another same chart
{
2022-10-15 20:56:30 +02:00
" id " : 9 ,
" chart " : 0 ,
" clear_type " : 9 ,
" combo_type " : 0 ,
" achievement_rate " : 8765 ,
" score " : 432 ,
" miss_count " : 15 ,
" expected_score " : 543 ,
" expected_clear_type " : 9 ,
" expected_combo_type " : 1 ,
" expected_achievement_rate " : 9876 ,
" expected_miss_count " : 0 ,
2019-12-08 22:43:49 +01:00
} ,
]
2024-01-02 03:46:24 +01:00
self . verify_player_rb5_player_write ( ref_id , location , scores = dummyscores )
2019-12-08 22:43:49 +01:00
self . verify_player_rb5_player_read ( ref_id , card , location )
scores = self . verify_player_rb5_player_read_score ( ref_id , location )
for expected in dummyscores :
actual = None
for received in scores :
2024-01-02 03:46:24 +01:00
if received [ " id " ] == expected [ " id " ] and received [ " chart " ] == expected [ " chart " ] :
2019-12-08 22:43:49 +01:00
actual = received
break
if actual is None :
2024-01-02 03:46:24 +01:00
raise Exception ( f " Didn ' t find song { expected [ ' id ' ] } chart { expected [ ' chart ' ] } in response! " )
2019-12-08 22:43:49 +01:00
2022-10-15 20:56:30 +02:00
if " expected_score " in expected :
expected_score = expected [ " expected_score " ]
2019-12-08 22:43:49 +01:00
else :
2022-10-15 20:56:30 +02:00
expected_score = expected [ " score " ]
if " expected_achievement_rate " in expected :
2024-01-02 03:46:24 +01:00
expected_achievement_rate = expected [ " expected_achievement_rate " ]
2019-12-08 22:43:49 +01:00
else :
2022-10-15 20:56:30 +02:00
expected_achievement_rate = expected [ " achievement_rate " ]
if " expected_clear_type " in expected :
expected_clear_type = expected [ " expected_clear_type " ]
2019-12-08 22:43:49 +01:00
else :
2022-10-15 20:56:30 +02:00
expected_clear_type = expected [ " clear_type " ]
if " expected_combo_type " in expected :
expected_combo_type = expected [ " expected_combo_type " ]
2019-12-08 22:43:49 +01:00
else :
2022-10-15 20:56:30 +02:00
expected_combo_type = expected [ " combo_type " ]
if " expected_miss_count " in expected :
expected_miss_count = expected [ " expected_miss_count " ]
2019-12-08 22:43:49 +01:00
else :
2022-10-15 20:56:30 +02:00
expected_miss_count = expected [ " miss_count " ]
if actual [ " score " ] != expected_score :
raise Exception (
f ' Expected a score of \' { expected_score } \' for song \' { expected [ " id " ] } \' chart \' { expected [ " chart " ] } \' but got score \' { actual [ " score " ] } \' '
)
if actual [ " achievement_rate " ] != expected_achievement_rate :
raise Exception (
f ' Expected an achievement rate of \' { expected_achievement_rate } \' for song \' { expected [ " id " ] } \' chart \' { expected [ " chart " ] } \' but got achievement rate \' { actual [ " achievement_rate " ] } \' '
)
if actual [ " clear_type " ] != expected_clear_type :
raise Exception (
f ' Expected a clear_type of \' { expected_clear_type } \' for song \' { expected [ " id " ] } \' chart \' { expected [ " chart " ] } \' but got clear_type \' { actual [ " clear_type " ] } \' '
)
if actual [ " combo_type " ] != expected_combo_type :
raise Exception (
f ' Expected a combo_type of \' { expected_combo_type } \' for song \' { expected [ " id " ] } \' chart \' { expected [ " chart " ] } \' but got combo_type \' { actual [ " combo_type " ] } \' '
)
if actual [ " miss_count " ] != expected_miss_count :
raise Exception (
f ' Expected a miss count of \' { expected_miss_count } \' for song \' { expected [ " id " ] } \' chart \' { expected [ " chart " ] } \' but got miss count \' { actual [ " miss_count " ] } \' '
)
2019-12-08 22:43:49 +01:00
# Sleep so we don't end up putting in score history on the same second
time . sleep ( 1 )
else :
print ( " Skipping score checks for existing card " )
# Verify ending game
self . verify_player_rb5_player_end ( ref_id )
# Verify empty and non-empty select score
self . verify_player_rb5_player_read_rival_score ( 0 )
self . verify_player_rb5_player_read_rival_score ( extid )
# Verify rival score loading after rivaling ourselves
self . verify_player_rb5_player_write ( ref_id , location , rivals = [ extid ] )
self . verify_player_rb5_player_read_rival_ranking_data ( extid )
# Verify high score tables and shop rank
self . verify_info_rb5_info_read_hit_chart ( )
self . verify_info_rb5_info_read_shop_ranking ( location )
self . verify_player_rb5_player_read_rank ( )
# Verify paseli handling
if paseli_enabled :
print ( " PASELI enabled for this PCBID, executing PASELI checks " )
else :
print ( " PASELI disabled for this PCBID, skipping PASELI checks " )
return
sessid , balance = self . verify_eacoin_checkin ( card )
if balance == 0 :
print ( " Skipping PASELI consume check because card has 0 balance " )
else :
self . verify_eacoin_consume ( sessid , balance , random . randint ( 0 , balance ) )
self . verify_eacoin_checkout ( sessid )