
    Kiq                     T   S SK rS SKJs  Jr  S SKrS SKJr  S SK	J
r
JrJr  S SKJrJr  S SKJr  S SKJr  S SKJr  S3S\4S	 jjrS
\S\S\S\
4S jrS rS rS rS rS\R<                  4S jrS r S r!S r"S r#S r$S\R<                  4S jr%S r&S\R<                  4S jr'S\R<                  4S jr(S\R<                  4S jr)S\R<                  4S jr*S\R<                  4S  jr+S! r,S" r-S# r.S$ r/S\R<                  4S% jr0S\R<                  4S& jr1S' r2S( r3S\R<                  4S) jr4S\R<                  4S* jr5S\R<                  4S+ jr6S\R<                  4S, jr7S\R<                  4S- jr8S\R<                  4S. jr9S/ r:S0 r;S\R<                  4S1 jr<S\R<                  4S2 jr=g)4    N)
Visibility)CardDeckDeckFactory)CrazyEightsGameCrazyEightsOptions)Localization)Bot)MockUser	host_namec                 b    [        5       n[        U 5      nUR                  X5      nXl        XU4$ N)r   r   
add_playerhost)r   game	host_userhost_players       <C:\Users\dbart\PlayPalace11\server\tests\test_crazyeights.pycreate_game_with_hostr      s2    D#I//)7KIi''    card_idranksuitreturnc                     [        XUS9$ )N)idr   r   )r   )r   r   r   s      r   	make_cardr      s    7D11r   c                     [        5       n U R                  o" 5       nSo2U:H  oD(       d  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pCU R                  o" 5       nSo2U:H  oD(       d  [        R                  " SU4S	X#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pCU R                  o" 5       nS
o2U:H  oD(       d  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pCU R                  o" 5       nSo2U:H  oD(       d  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pCU R                  o" 5       nSo2U:H  oD(       d  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pCU R                  o" 5       nSo2U:H  oD(       d  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pCg )NzCrazy Eights==)zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_name
}()
} == %(py7)sr   py0py2py4py7assert %(py9)spy9zgame-name-crazyeights)zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_name_key
}()
} == %(py7)scrazyeights)zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_type
}()
} == %(py7)szcategory-card-games)zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_category
}()
} == %(py7)s   )zN%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_min_players
}()
} == %(py7)s   )zN%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_max_players
}()
} == %(py7)s)r   get_name
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationget_name_keyget_typeget_categoryget_min_playersget_max_playersr   @py_assert1@py_assert3@py_assert6@py_assert5@py_format8@py_format10s          r   test_crazyeights_game_creationr@      s2   D==,=?,n,n,,,,,?,,,,,,4,,,,4,,,=,,,?,,,n,,,,,,,99"99"999999999999499994999999999"99999999==+=?+m+m+++++?++++++4++++4+++=+++?+++m+++++++77"77"777777777777477774777777777"77777777&!&Q&Q&&&&&!&&&&&&4&&&&4&&&&&&!&&&Q&&&&&&&&!&Q&Q&&&&&!&&&&&&4&&&&4&&&&&&!&&&Q&&&&&&&r   c                     [        5       n U R                  oR                  nSo2U:H  oD(       d  [        R                  " SU4SX#45      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pCU R                  oR                  nSo2U:H  oD(       d  [        R                  " SU4S	X#45      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pCg )
N  r   )zR%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.options
}.winning_score
} == %(py7)sr   r!   r&   r'   0)zO%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.options
}.turn_timer
} == %(py7)s)r   optionswinning_scorer,   r-   r.   r/   r0   r1   r2   r3   
turn_timerr9   s          r   !test_crazyeights_options_defaultsrG   !   s   D<<,%%,,,,,,,%,,,,,,4,,,,4,,,<,,,%,,,,,,,,,,<<)"")c)c)))))"))))))4))))4)))<)))")))c)))))))r   c                     [        SS9n [        U S9n[        S5       H&  n[        SU 35      nUR	                  SU 3U5        M(     UR                  5         [        S5       H%  nUR                  S:X  a    OUR                  5         M'     UR                  nSoeU:H  ow(       d  [        R                  " SU4S	XV45      S
[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS
[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =n=pvg )N2   )rE   )rD   r)   r
   i@  finishedr   z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sr   r"   r#   py5assert %(py7)sr%   )r   r   ranger
   r   on_startstatuson_tickr,   r-   r.   r/   r0   r1   r2   r3   )
rD   r   ibot_r:   @py_assert4r;   @py_format6r>   s
             r   #test_crazyeights_bot_game_completesrX   '   s     r2G7+D1XCs)n#aS	3'  	MMO5\;;*$ 
 ;;$*$*$$$$$;$$$$$$4$$$$4$$$;$$$*$$$$$$$r   c                  P   [        5       u  pnUR                  5         U R                  USS5        U R                   Vs/ s H  o3R                  (       d  M  UPM     nn/ oTod(       a  US   owR
                  nSoU	:H  onU(       Gd  SSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS0-  oR                  U5        U(       av  [        R                  " SW
4S	WW	45      [        R                  " W5      [        R                  " U5      [        R                  " U	5      S
.-  nSSU0-  oR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=pUS   ofR                   nU R"                  nUU;   ow(       d  [        R                  " SU4SUU45      [        R                  " U5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pxSobR$                  ow" 5       oU;   nU(       d  [        R                  " SU4SXh45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pxg s  snf )N add_botr   Alice%(py2)sr#   botsr   )z-%(py7)s
{%(py7)s = %(py5)s.name
} == %(py10)s)rM   r%   py10z%(py12)spy12zassert %(py15)spy15in)zR%(py3)s
{%(py3)s = %(py1)s.id
} in %(py7)s
{%(py7)s = %(py5)s.player_action_sets
}r   py1py3rM   r%   r&   r'   zgame_crazyeights/botsit.oggzP%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.get_sounds_played
}()
}r   )r   clear_messages_action_add_botplayersis_botnamer.   r/   r,   r0   r1   appendr-   _format_boolopr2   r3   r   player_action_setsget_sounds_played)r   r   r   playerr^   r:   @py_assert0rV   r<   @py_assert9@py_assert8@py_format3@py_format11@py_format13@py_format14@py_format16@py_assert2r>   r?   s                      r   ,test_crazyeights_add_bot_uses_available_namer{   7   s   #8#: Dyb)4!%?vFD?+4DG+LL+G+G++++++++4++++4++++4+++LG+++G+++L+++G++++++++++++++70::0000:000000:00007000:000000000000000000000(I,G,GI,G,II,IIIIII(III(IIIIIIIIIIIIIII,GIII,IIIIIIII @s   N#N#monkeypatchc                    U R                  SS/5        [        5       u  pnUR                  S[        S5      5      nUR	                  5         UR
                   Vs1 s H  oUR                  iM     nnUR                  USS5        UR
                   Vs1 s H  oUR                  iM     nnXv:H  o(       d  [        R                  " SU4SXv45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  n	S	S
U	0-  n
[        [        R                  " U
5      5      eS =px[         R"                  " UR$                  S5      nUR&                  o" 5       oU:H  o(       Gd  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pUR                  oR(                  oU;   o(       Gd  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pg s  snf s  snf )Nz/server.game_utils.lobby_actions_mixin.BOT_NAMESRoborZ   r[   r   z%(py1)s == %(py3)sexisting_idsre   rf   assert %(py5)srM   zno-bot-names-available)zN%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_last_spoken
}()
} == %(py6)sr   expected_warningr"   r#   r$   py6assert %(py8)spy8rb   )zR%(py2)s
{%(py2)s = %(py0)s.id
} in %(py6)s
{%(py6)s = %(py4)s.player_action_sets
}existing_botr   )setattrr   r   r
   rh   rj   r   ri   r,   r-   r1   r.   r/   r0   r2   r3   r	   getlocaleget_last_spokenro   )r|   r   r   r   r   rq   r   rr   rz   @py_format4rW   r   r:   r;   r=   @py_format7@py_format9s                    r   @test_crazyeights_add_bot_without_available_names_notifies_playerr   C   s8    IF8T#8#: Dy??63v;7L,0LL9L&IILL9b)4$(LL1L&IILA1AAAAA1AAA1AAAAAA\AAAA\AAAAAAA#''	(8(8:RS$$:$&:*::::::&::::::9::::9:::$:::&::::::*:::::*::::::::??5555555555?555555<5555<555?555555d5555d55555555555 : 2s   OOc                  v	   [        5       u  pnU R                  S[        S5      5        U R                  S[        S5      5      nUR                  5         U R	                  US5        U R
                  oCU;  oU(       d  [        R                  " SU4SX445      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =pTUR                  oPR                  oU;  oD(       Gd  [        R                  " SU4SXX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =n=pHUR                  oPR                   oU;  oD(       Gd  [        R                  " SU4SXX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =n=pHSoR"                  o" 5       oU;   o(       d  [        R                  " SU4SX45      [        R                  " U
5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n
=n=pg )NBot1Bot2
remove_botnot inz3%(py0)s not in %(py4)s
{%(py4)s = %(py2)s.players
}bot2r   r"   r#   r$   assert %(py6)sr   )zV%(py2)s
{%(py2)s = %(py0)s.id
} not in %(py6)s
{%(py6)s = %(py4)s.player_action_sets
}r   r   r   )zJ%(py2)s
{%(py2)s = %(py0)s.id
} not in %(py6)s
{%(py6)s = %(py4)s._users
}zgame_crazyeights/botleave.oggrb   rg   r   rd   r&   r'   )r   r   r
   rh   _action_remove_botrj   r,   r-   r.   r/   r0   r1   r2   r3   r   ro   _usersrp   )r   r   r   r   r;   r:   @py_format5r   r=   r   rr   rV   r<   rz   r>   r?   s                   r   5test_crazyeights_remove_bot_plays_sound_and_cleans_upr   U   s   #8#: DyOOFCK(??63v;/DK6||#|#####4######4####4######t####t###|#######77111111111171111114111141117111111$1111$1111111111177%++%+%%%%%7%%%%%%4%%%%4%%%7%%%%%%$%%%%$%%%+%%%%%%%*K.I.IK.I.KK.KKKKKK*KKK*KKKKKKiKKKKiKKK.IKKK.KKKKKKKKr   c                  H   [        5       u  pn[        S5      nU R                  SU5      nSU l        UR	                  5         UR	                  5         U R                  U5        U R                  oQU;   of(       d  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =peUR                  of(       d  S
S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  n	[        [        R                  " U	5      5      eS nU R!                  U5      n
[#        U
[$        5      oU(       Gd+  SS[        R                  " 5       ;   d  [        R                  " ["        5      (       a  [        R                  " ["        5      OSS[        R                  " 5       ;   d  [        R                  " U
5      (       a  [        R                  " U
5      OSS[        R                  " 5       ;   d  [        R                  " [$        5      (       a  [        R                  " [$        5      OS[        R                  " U5      S.-  n[        [        R                  " U5      5      eS nU
R&                  oaR(                  oU:H  oU(       Gd  [        R                  " SU4SXk45      S[        R                  " 5       ;   d  [        R                  " U
5      (       a  [        R                  " U
5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p[SoR*                  o" 5       oU;   nU(       d  [        R                  " SU4SX45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=pU R,                  of(       + oU(       d  SS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  n[        [        R                  " U5      5      eS =peU R                  oTU;   of(       d  [        R                  " SU4SXE45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =peg )NGuestplayingrb   )z/%(py0)s in %(py4)s
{%(py4)s = %(py2)s.players
}r   r   r   r   r   z*assert %(py2)s
{%(py2)s = %(py0)s.is_bot
}r"   r#   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancereplacement_userr
   )r"   re   r#   r$   r   )zD%(py2)s
{%(py2)s = %(py0)s.uuid
} == %(py6)s
{%(py6)s = %(py4)s.id
}r   r   r    game_crazyeights/personleave.oggrg   
guest_userrd   r&   r'   2assert not %(py2)s
{%(py2)s = %(py0)s._destroyed
}guest_player)r   r   r   rQ   rh   _perform_leave_gamerj   r,   r-   r.   r/   r0   r1   r2   r3   rk   get_userr   r
   uuidr   rp   
_destroyed)r   r   r   r   r   r;   r:   r   r   ru   r   r=   r   rr   rV   r<   rz   r>   r?   r   s                       r   Htest_crazyeights_perform_leave_game_replaces_human_with_bot_when_playingr   c   s   #8#: Dy'"J??7J7LDK[),,&,&&&&&;&&&&&&;&&&&;&&&&&&$&&&&$&&&,&&&&&&&;;}}[1&,,,,,,,,,:,,,,:,,,,,,&,,,,&,,,,,,,,,,,,,,,,,,,,  2NN2N22222 2222222222222 222222K2222K222N2222222-O1M1MO1M1OO1OOOOOO-OOO-OOOOOOOOOOOOO1MOOO1OOOOOOOOtt<<'<'''''<''''''<''''<''''''4''''4'''<'''''''r   c                     [        5       u  pn[        S5      nU R                  SU5      nSU l        UR                  U l        UR                  5         UR                  5         U R                  U5        U R                  oQU;  of(       d  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  nSS	U0-  n[        [        R                   " U5      5      eS =peU R
                  odR                  oU	:H  oU(       Gd  [        R                  " S
U4SXi45      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      S.-  nSSU0-  n
[        [        R                   " U
5      5      eS =n=pY["        R$                  " UR&                  SUR                  S9nUR(                  oU" 5       oU	;   of(       Gd  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U	5      S.-  nSSU0-  n
[        [        R                   " U
5      5      eS =n=pYSoR*                  o" 5       oU;   o(       d  [        R                  " SU4SX45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=n=pU R,                  of(       + oU(       d  SS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  n[        [        R                   " U5      5      eS =peg )Nr   waitingr   r   r   r   r   r   r   r   )zF%(py2)s
{%(py2)s = %(py0)s.host
} == %(py6)s
{%(py6)s = %(py4)s.name
}r   r   r   r   znew-hostrq   rb   zR%(py0)s in %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.get_spoken_messages
}()
}expected_host_messager   r   rg   rd   r&   r'   r   r   )r   r   r   rQ   rl   r   rh   r   rj   r,   r-   r.   r/   r0   r1   r2   r3   r	   r   r   get_spoken_messagesrp   r   )r   r   r   r   r   r;   r:   r   r   r=   r   r   rr   rV   r<   rz   r>   r?   r   s                      r   ?test_crazyeights_perform_leave_game_reassigns_host_when_waitingr   w   s   #8#: Dy'"J??7J7LDK  DI[)"ll*l*****;******;****;******d****d***l*******99))))))))))9))))))4))))4)))9)))))))))))))))))))))(,,:l.?.? %/$B$BD$B$DD$DDDDDD DDDDDD DDDD DDDDDDJDDDDJDDD$BDDD$DDDDDDDD-O1M1MO1M1OO1OOOOOO-OOO-OOOOOOOOOOOOO1MOOO1OOOOOOOOttr   c                  `   [        5       u  pn[        S5      nU R                  SU5      nSU l        U R	                  X/5        SU l        UR                  U l        UR                  5         UR                  5         U R                  R                  S5        U R                  US5        U R                  nSoeU:H  ow(       d  [        R                  " SU4SXV45      S	[        R                   " 5       ;   d  [        R"                  " U 5      (       a  [        R$                  " U 5      OS	[        R$                  " U5      [        R$                  " U5      S
.-  nSSU0-  n	['        [        R(                  " U	5      5      eS =n=pvU R
                  oU(       + ow(       d  SS	[        R                   " 5       ;   d  [        R"                  " U 5      (       a  [        R$                  " U 5      OS	[        R$                  " U5      S.-  n
['        [        R(                  " U
5      5      eS =pWU R*                  nSoeU:H  ow(       d  [        R                  " SU4SXV45      S	[        R                   " 5       ;   d  [        R"                  " U 5      (       a  [        R$                  " U 5      OS	[        R$                  " U5      [        R$                  " U5      S
.-  nSSU0-  n	['        [        R(                  " U	5      5      eS =n=pvU R,                  oQR                  oU:H  ow(       Gd  [        R                  " SU4SX[45      S	[        R                   " 5       ;   d  [        R"                  " U 5      (       a  [        R$                  " U 5      OS	[        R$                  " U5      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS[        R$                  " U5      S.-  nSSU0-  n['        [        R(                  " U5      5      eS =n=p{U R.                  oU(       d  SS	[        R                   " 5       ;   d  [        R"                  " U 5      (       a  [        R$                  " U 5      OS	[        R$                  " U5      S.-  n['        [        R(                  " U5      5      eS nU R                  oUR0                  ow" 5       nSoU:H  nU(       d  [        R                  " SU4SX45      S	[        R                   " 5       ;   d  [        R"                  " U 5      (       a  [        R$                  " U 5      OS	[        R$                  " U5      [        R$                  " U5      [        R$                  " U5      [        R$                  " U5      S.-  nSSU0-  n['        [        R(                  " U5      5      eS =n=n=n=nnSnUR2                  of" 5       nUU;   nU(       d  [        R                  " SU4SUU45      [        R$                  " U5      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS[        R$                  " U5      [        R$                  " U5      S .-  n	S!S"U	0-  n['        [        R(                  " U5      5      eS =n=n=nn[4        R6                  " UR8                  S#U R;                  SUR8                  5      S$9nUR<                  ow" 5       nUU;   oU(       Gd  [        R                  " SU4S%UU45      S&[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS&S'[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS'[        R$                  " U5      [        R$                  " U5      S.-  nSSU0-  n['        [        R(                  " U5      5      eS =n=p{g )(Nr   r   T   suit_hearts   r   z4%(py2)s
{%(py2)s = %(py0)s.current_suit
} == %(py5)sr   rL   rN   r%   z:assert not %(py2)s
{%(py2)s = %(py0)s.awaiting_wild_suit
}r      z7%(py2)s
{%(py2)s = %(py0)s.wild_wait_ticks
} == %(py5)s)zS%(py2)s
{%(py2)s = %(py0)s.wild_wait_player_id
} == %(py6)s
{%(py6)s = %(py4)s.id
}r   r   r   r   z:assert %(py2)s
{%(py2)s = %(py0)s.wild_end_round_pending
}r   )zk%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.timer
}.seconds_remaining
}()
} == %(py9)s)r"   r#   r$   r   r'   assert %(py11)spy11zgame_crazyeights/morf.oggrb   rg   r   rd   r&   r'   zcrazyeights-suit-chosen)r   r   expected_suit_messager   )r   r   r   rQ   set_turn_playersawaiting_wild_suitr   pending_round_winner_idrh   timerstart_action_choose_suitcurrent_suitr,   r-   r.   r/   r0   r1   r2   r3   wild_wait_tickswild_wait_player_idwild_end_round_pendingseconds_remainingrp   r	   r   r   
_suit_namer   )r   r   r   r   r   r:   rV   r;   rW   r>   r   r=   r   r   ru   rt   @py_assert7r?   @py_format12rr   r<   rz   r   s                          r   3test_crazyeights_choose_suit_transitions_wild_stater      s   #8#: Dy'"J??7J7LDK;56"D#.>>D JJR[-8!!!!!!!!!!!!!4!!!!4!!!!!!!!!!!!!&&&&&&&&&&&&t&&&&t&&&&&&&&&&%2%2%%%%%%%%%%%4%%%%4%%%%%%2%%%%%%%##5~~5~55555#555555455554555#555555{5555{555~5555555&&&&&&&&&&4&&&&4&&&&&&&&&&::.''.').Q.Q.....)......4....4...:...'...)...Q........&G)*E*EG*E*GG&*GGGGGG&*GGGG&GGGGGG)GGGG)GGG*EGGG*GGGGGGGG(,,!__Q
 1 12
 %/$B$BD$B$DD $DDDDDD $DDDDDDD DDDD DDDDDDJDDDDJDDD$BDDD$DDDDDDDDr   c                  h   [        5       u  pn[        S5      nU R                  SU5      nSU l        U R	                  X/SS9  SU l        [        SSS5      [        SSS5      [        S	S
S5      [        SSS5      /Ul        U R                  U5      nU Vs0 s H#  ofR                  R                  UR                  _M%     nn[        R                  " UR                  S5       S3n[        R                  " UR                  S5       S3n	[        R                  " UR                  S5       S3n
[        R                  " UR                  S5       S3nUS   oU:H  o(       d  [        R                   " SU4SX45      [        R"                  " U5      S[$        R&                  " 5       ;   d  [        R(                  " U5      (       a  [        R"                  " U5      OSS.-  nSSU0-  n[+        [        R,                  " U5      5      eS =pUS   oU	:H  o(       d  [        R                   " SU4SX45      [        R"                  " U5      S[$        R&                  " 5       ;   d  [        R(                  " U	5      (       a  [        R"                  " U	5      OSS.-  nSSU0-  n[+        [        R,                  " U5      5      eS =pUS   oU
:H  o(       d  [        R                   " SU4SX45      [        R"                  " U5      S[$        R&                  " 5       ;   d  [        R(                  " U
5      (       a  [        R"                  " U
5      OSS.-  nSSU0-  n[+        [        R,                  " U5      5      eS =pUS   oU:H  o(       d  [        R                   " SU4SX45      [        R"                  " U5      S[$        R&                  " 5       ;   d  [        R(                  " U5      (       a  [        R"                  " U5      OSS.-  nSSU0-  n[+        [        R,                  " U5      5      eS =pg s  snf ) Nr   r   Treset_index   r)         r   	   r*   zsuit-spadesz 2zsuit-diamondsz 1zsuit-heartsz 0z
suit-clubssuit_spadesr   r   expected_spadesr   r   rM   suit_diamondsexpected_diamondsr   expected_hearts
suit_clubsexpected_clubs)r   r   r   rQ   r   r   r   handget_all_visible_actionsactionr   labelr	   r   r   r,   r-   r1   r.   r/   r0   r2   r3   )r   r   r   r   r   visiblealabelsr   r   r   r   rr   rz   r   rW   s                   r   7test_crazyeights_suit_choice_labels_include_hand_countsr      s   #8#: Dy'"J??7J7LDK;54H"D!Q!Q!Q!Q	K **;7G,34Gqhhkk177"GF4%)))*:*:MJK2NO'++I,<,<oNOrR%)))*:*:MJK2NO$(()9)9<HILN- 3O33333 333 333333O3333O3333333/"7&777777"777"777777&77777&77777777- 3O33333 333 333333O3333O3333333,1>11111111111111>1111>1111111 5s   *P/c           
        ^"^# [        5       u  pn[        S5      nUR                  SU5      nSUl        UR	                  X%/SS9   " S S[
        5      n[        / SQ5       VVV	s/ s H  u  nu  p[        XxU	5      PM     n
nnn	U" [        U
5      S9m#U
 Vs0 s H  oR                  U_M     snm"U R                  [        S	S-U"U#4S jj5        UR                  5         UR                  n[        U5      nSoU:H  o(       Gd"  [        R                   " SU4SX45      S["        R$                  " 5       ;   d  [        R&                  " [        5      (       a  [        R(                  " [        5      OSS["        R$                  " 5       ;   d  [        R&                  " U5      (       a  [        R(                  " U5      OS[        R(                  " U5      [        R(                  " U5      [        R(                  " U5      S.-  nSSU0-  n[+        [        R,                  " U5      5      eS =n=n=pUR                  n[        U5      nSoU:H  o(       Gd"  [        R                   " SU4SX45      S["        R$                  " 5       ;   d  [        R&                  " [        5      (       a  [        R(                  " [        5      OSS["        R$                  " 5       ;   d  [        R&                  " U5      (       a  [        R(                  " U5      OS[        R(                  " U5      [        R(                  " U5      [        R(                  " U5      S.-  nSSU0-  n[+        [        R,                  " U5      5      eS =n=n=pUR.                  nS
nUU:H  nU(       d  [        R                   " SU4SUU45      S["        R$                  " 5       ;   d  [        R&                  " U5      (       a  [        R(                  " U5      OS[        R(                  " U5      [        R(                  " U5      S.-  nSSU0-  n[+        [        R,                  " U5      5      eS =n=nnUR0                  nSnUU:H  nU(       d  [        R                   " SU4SUU45      S["        R$                  " 5       ;   d  [        R&                  " U5      (       a  [        R(                  " U5      OS[        R(                  " U5      [        R(                  " U5      S.-  nSSU0-  n[+        [        R,                  " U5      5      eS =n=nnUR2                  nS
nUU:H  nU(       d  [        R                   " SU4SUU45      S["        R$                  " 5       ;   d  [        R&                  " U5      (       a  [        R(                  " U5      OS[        R(                  " U5      [        R(                  " U5      S.-  nSSU0-  n[+        [        R,                  " U5      5      eS =n=nnUR4                  nU(       d  SS["        R$                  " 5       ;   d  [        R&                  " U5      (       a  [        R(                  " U5      OS[        R(                  " U5      S.-  n[+        [        R,                  " U5      5      eS nUR4                  S   n/ nUR6                  nSnUU:H  nUnU(       a  UR8                  nS nUU:H  nUnU(       Gd  [        R                   " SU4S!UU45      S"["        R$                  " 5       ;   d  [        R&                  " U5      (       a  [        R(                  " U5      OS"[        R(                  " U5      [        R(                  " U5      S#.-  nS$S%U0-  nUR;                  U5        U(       a  [        R                   " SW4S&WW45      S"["        R$                  " 5       ;   d  [        R&                  " U5      (       a  [        R(                  " U5      OS"[        R(                  " U5      [        R(                  " U5      S'.-  nS(S)U0-  nUR;                  U5        [        R<                  " US5      0 -  n S*S+U 0-  n![+        [        R,                  " U!5      5      eS =n=n=n=n=n=n=nnUR>                  nS nUU:H  nU(       d  [        R                   " SU4S,UU45      S["        R$                  " 5       ;   d  [        R&                  " U5      (       a  [        R(                  " U5      OS[        R(                  " U5      [        R(                  " U5      S.-  nSSU0-  n[+        [        R,                  " U5      5      eS =n=nng s  sn	nnf s  snf ).Nr   r   Tr   c                       \ rS rSrSS jrSrg)Itest_crazyeights_start_new_hand_uses_number_start_card.<locals>.FixedDeck   Nc                     g r    )selfs    r   shuffleQtest_crazyeights_start_new_hand_uses_number_start_card.<locals>.FixedDeck.shuffle   s    r   r   )r   N)__name__
__module____qualname____firstlineno__r   __static_attributes__r   r   r   	FixedDeckr      s    	r   r   ))r)   r   )r   r)   )r   r   )   r   )   r   )r   r)   )r   r   )
   r   )r)   r)   )r   r   )r*   r   )r   r)   )r   r   cardsstandard_deckr   c                    > TT4$ r   r   )	num_deckscard_lookup	test_decks    r   <lambda>Htest_crazyeights_start_new_hand_uses_number_start_card.<locals>.<lambda>   s    9VaJbr   r   r   )zJ%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.hand
})
} == %(py8)slenr   )r"   re   rf   rM   r   assert %(py10)sr_   r   )z-%(py2)s
{%(py2)s = %(py0)s.round
} == %(py5)sr   rL   rN   r%   r   )z4%(py2)s
{%(py2)s = %(py0)s.dealer_index
} == %(py5)s)z2%(py2)s
{%(py2)s = %(py0)s.turn_index
} == %(py5)sz0assert %(py2)s
{%(py2)s = %(py0)s.discard_pile
}r   r)   )z,%(py4)s
{%(py4)s = %(py2)s.rank
} == %(py7)s
start_card)r#   r$   r%   z%(py9)sr'   )z0%(py13)s
{%(py13)s = %(py11)s.suit
} == %(py16)s)r   py13py16z%(py18)spy18zassert %(py21)spy21r   r   ) r   r   r   rQ   r   r   	enumerater   listr   r   r   _start_new_handr   r   r,   r-   r.   r/   r0   r1   r2   r3   rounddealer_index
turn_indexdiscard_piler   r   rm   rn   r   )$r|   r   r   r   r   r   r   rS   r   r   r   cardrz   rV   r   r<   r   rv   r:   r;   rW   r>   ru   r  r=   rr   @py_assert12@py_assert15@py_assert14r?   @py_format17@py_format19@py_format20@py_format22r   r   s$                                     @@r   6test_crazyeights_start_new_hand_uses_number_start_cardr     sl   #8#: Dy'"J??7J7LDK;54HD   ) 
 
OA| 	!4  
 
 ( U,I-23UT77D=U3K_6bc%3 %A%A%%%%% %%%%%%3%%%%3%%%%%%{%%%%{%%%%%% %%%A%%%%%%%  &3 !&Q&Q&&&&&!&&&&&&3&&&&3&&&&&&|&&&&|&&& &&&!&&&Q&&&&&&&:::?:44:!!!!!!!!!!!!!4!!!!4!!!!!!!!!!!!!??a?a?a44?a44""2&J8:??8a8?a88JOO8q8Oq$88888?a888888:8888:888?888a88888888Oq888888J8888J888O888q888888888888888!!!!!!!!!!!!!4!!!!4!!!!!!!!!!!!!E* 4s   %e:fc            
         [        5       u  pnSU l        SU R                  l        SU R                  l        UR                  5         U R                  5         UR                  5       nSoDU;   oU(       d  [        R                  " SU4SXC45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nS	S
U0-  n[        [        R                   " U5      5      eS =pEUR#                  S5      nU R                  5         UR                  o" 5       oR"                  nSo" U5      oU:H  o(       GdD  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      [        R                  " U
5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                   " U5      5      eS =n	=n
=n=n=pU R$                  o(       d  SS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U	5      S.-  n[        [        R                   " U5      5      eS n	g )Nr   20d   zgame_crazyeights/fivesec.oggrb   z%(py1)s in %(py3)ssoundsr   r   rM   r   )z%(py10)s
{%(py10)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_sounds_played
}()
}.count
}(%(py8)s)
} == %(py12)sr   count)r"   r#   r$   r   r   r_   r`   assert %(py14)spy14z8assert %(py2)s
{%(py2)s = %(py0)s.timer_warning_played
}r   r   )r   rQ   rD   rF   r   ticks_remainingrh   _maybe_play_timer_warningrp   r,   r-   r1   r.   r/   r0   r2   r3   r  timer_warning_played)r   r   r   r  rr   rz   r   rW   r  r:   r;   r=   r   rs   @py_assert11rw   @py_format15ru   s                     r   )test_crazyeights_timer_warning_plays_oncer%     s   #8#: DyDK"DLL!$DJJ""$((*F)3V33333)333)333333V3333V3333333LL78E""$&&W&(W..W/MW./MNWRWWWWWWNWWWWWW9WWWW9WWW&WWW(WWW.WWW/MWWWNWWWWWWRWWWWWRWWWWWWWWW$$$$$$$$$$4$$$$4$$$$$$$$$$r   c                 D  ^ [        5       u  pnSUl        UR                  U/SS9  U R                  SS 5        / mU4S jnU R                  USU5        UR	                  5         UR                  5         US4/nTU:H  of(       d  [        R                  " S	U4S
TU45      S[        R                  " 5       ;   d  [        R                  " T5      (       a  [        R                  " T5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =peSoR                  o" 5       oU;   oU(       d  [        R                  " SU4SX45      [        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n	=n=pg )Nr   Tr   z'server.games.crazyeights.game.bot_thinkc                     g)Ndrawr   )gps     r   r   Jtest_crazyeights_handle_turn_timeout_executes_bot_action.<locals>.<lambda>  s    PVr   c                 *   > TR                  X45        g r   rm   )rq   	action_idexecuteds     r   fake_execute_actionUtest_crazyeights_handle_turn_timeout_executes_bot_action.<locals>.fake_execute_action  s    +,r   execute_actionr(  r   z%(py0)s == %(py3)sr/  r"   rf   r   rM   zgame_crazyeights/expired.oggrb   rg   r   rd   r&   r'   )r   rQ   r   r   rh   _handle_turn_timeoutr,   r-   r.   r/   r0   r1   r2   r3   rp   )r|   r   r   r   r0  rz   r:   r   rW   rr   rV   r<   r>   r?   r/  s                 @r   8test_crazyeights_handle_turn_timeout_executes_bot_actionr6    sh   #8#: DyDK;-T:ACVW)+H- .0CD$f-..8......8.......8....8...........)J-H-HJ-H-JJ-JJJJJJ)JJJ)JJJJJJYJJJJYJJJ-HJJJ-JJJJJJJJr   c                 *  ^ [        5       u  pn[        S5      nUR                  SU5      nSUl        UR	                  X%/SS9  / Ul        / Ul        [        / S9Ul        SS0mU4S jnU R                  US	U5        UR                  US
5        TS   nSoU:H  o(       do  [        R                  " SU	4SXx45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n=pg )Nr   r   Tr   r   r  r   c                      > T S==   S-  ss'   g Nr  r   r   )new_hand_calleds   r   fake_start_new_hand[test_crazyeights_action_draw_triggers_new_hand_when_deck_empty.<locals>.fake_start_new_hand'  s     A% r   r
  r(  r   r   z%(py1)s == %(py4)sre   r$   r   r   )r   r   r   rQ   r   r   r  r   deckr   _action_drawr,   r-   r1   r2   r3   )r|   r   r   r   r   r   r;  rr   r;   rz   r   r   r:  s               @r   >test_crazyeights_action_draw_triggers_new_hand_when_deck_emptyrA    s    #8#: Dy'"J??7J7LDK;54HKD2DIlO& /1DEk6*7#(q(q(((((#(((#(((q(((((((r   c                   ^ [        5       u  pn[        S5      nUR                  SU5      nSUl        UR	                  X%/SS9  SUl        [        SSS5      Ul        SS	0mU4S
 jnU R                  USU5        UR                  5         UR                  US5        TS   nSoU:H  o(       do  [        R                  " SU	4SXx45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n=pUR
                  o(       + o(       d  SS[         R"                  " 5       ;   d  [        R$                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  n[        [        R                  " U5      5      eS =pUR                  nS oUL o(       d  [        R                  " SU4SX45      S[         R"                  " 5       ;   d  [        R$                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pSosR&                  o" 5       nUU;   o(       d  [        R                  " SU	4SUU45      [        R                  " U5      S[         R"                  " 5       ;   d  [        R$                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSS U0-  n[        [        R                  " U5      5      eS =n=n	=nng )!Nr   r   Tr      r   r   r  r   c                      > T S==   S-  ss'   g r9  r   )advance_calleds   r   fake_advance_turnEtest_crazyeights_action_pass_requires_draw.<locals>.fake_advance_turn<  s    w1$r   _advance_turnpassr   r=  r>  r   r   z6assert not %(py2)s
{%(py2)s = %(py0)s.turn_has_drawn
}r   r   isz7%(py2)s
{%(py2)s = %(py0)s.turn_drawn_card
} is %(py5)srL   rN   r%   zgame_crazyeights/pass.oggrb   rg   r   rd   r&   r'   )r   r   r   rQ   r   turn_has_drawnr   turn_drawn_cardr   rh   _action_passr,   r-   r1   r2   r3   r.   r/   r0   rp   )r|   r   r   r   r   r   rF  rr   r;   rz   r   r   r:   r   rV   rW   r>   r<   r?   rE  s                      @r   *test_crazyeights_action_pass_requires_drawrP  1  sE   #8#: Dy'"J??7J7LDK;54HD$S!Q/Dq\N% o/@Ak6*'"'a'a'''''"'''"'''a'''''''""""""""""""t""""t""""""""""'4'4'''''''''''4''''4''''''4'''''''&G*E*EG*E*GG&*GGGGGG&*GGGG&GGGGGG)GGGG)GGG*EGGG*GGGGGGGGr   c                   ^^ [        5       u  pn[        S5      nUR                  SU5      nUR                  X%/SS9  SUl        [        SSS5      nUR                  U5        UR                  nSoU:H  o(       d  [        R                  " SU	4S	Xx45      S
[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS
[        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n=pSUl        [        SSS5      nUR                  U5        UR                  nSoU:H  o(       d  [        R                  " SU	4S	Xx45      S
[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS
[        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n=p/ m/ mSU4S jjnU4S jnU R!                  USU5        U R!                  USU5        [        SSS5      nUR                  U5        S/nTU:H  ow(       d  [        R                  " SU4STU45      S[        R                  " 5       ;   d  [        R                  " T5      (       a  [        R                  " T5      OS[        R                  " U5      S.-  nSSU0-  n
[        [        R                  " U
5      5      eS =nnUS4/nTU:H  ow(       d  [        R                  " SU4STU45      S[        R                  " 5       ;   d  [        R                  " T5      (       a  [        R                  " T5      OS[        R                  " U5      S.-  nSSU0-  n
[        [        R                  " U
5      5      eS =nng )Nr   Tr   r   i,     r   r   )z7%(py2)s
{%(py2)s = %(py0)s.turn_skip_count
} == %(py5)sr   rL   rN   r%   i-     c                 (   > TR                  U 5        g r   r-  )r  
skip_callss    r   	fake_skip6test_crazyeights_apply_card_effects.<locals>.fake_skip]  s    % r   c                 *   > TR                  X45        g r   r-  )rq   r  
draw_callss     r   fake_draw_for_playerAtest_crazyeights_apply_card_effects.<locals>.fake_draw_for_player`  s    6/*r   skip_next_players_draw_for_playeri.     r   r3  rU  r4  r   rM   r)   rY  r  )r   r   r   r   r  r   _apply_card_effectsturn_skip_countr,   r-   r.   r/   r0   r1   r2   r3   r   )r|   r   r   r   r   r   	skip_cardr:   rV   r;   rW   r>   reverse_cardrV  rZ  draw_two_cardrz   r   rY  rU  s                     @@r   #test_crazyeights_apply_card_effectsrd  J  s   #8#: Dy'"J??7J7L;54HDO#r1%IY'$1$1$$$$$$$$$$$4$$$$4$$$$$$1$$$$$$$DS"a(L\*$1$1$$$$$$$$$$$4$$$$4$$$$$$1$$$$$$$J+-J!+ 19=02FGc2q)M]+::::'+,,:,,,,,,:,,,,,,,:,,,,:,,,,,,,,,,,r   c                 *   [        5       u  pn[        S5      nUR                  SU5      n[        S5      nUR                  SU5      nSUl        [        SSS5      [        SSS	5      /Ul        [        S
SS5      [        SS	S5      /Ul        / Ul        UR                  US S9  UR                  nSoU	:H  o(       d  [        R                  " SU
4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U	5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=pUR                  n/ oU	:H  o(       d  [        R                  " SU
4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U	5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=pUR                  n/ oU	:H  o(       d  [        R                  " SU
4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U	5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=pUR"                  nSoU	:H  o(       d  [        R                  " SU
4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U	5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=pUR$                  n/ oU	:H  o(       d  [        R                  " SU
4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U	5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=pUR&                  n/ oU	:H  o(       d  [        R                  " SU
4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U	5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=pSoR(                  o" 5       oU;   o(       d  [        R                  " S U4S!X45      [        R                  " U5      S"[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS"[        R                  " U	5      [        R                  " U5      S#.-  nS$S%U0-  n[        [        R                   " U5      5      eS =n=n=pS&oR(                  o" 5       oU;   o(       d  [        R                  " S U4S!X45      [        R                  " U5      S'[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS'[        R                  " U	5      [        R                  " U5      S#.-  nS$S%U0-  n[        [        R                   " U5      5      eS =n=n=pg )(Nr   r
   r   i  r*   r   i  r   r)   i  rS  r   i  r   	last_cardM   r   )z-%(py2)s
{%(py2)s = %(py0)s.score
} == %(py5)sr   rL   rN   r%   )z,%(py2)s
{%(py2)s = %(py0)s.hand
} == %(py5)sr   
bot_playerr  )z7%(py2)s
{%(py2)s = %(py0)s.hand_wait_ticks
} == %(py5)sr   )z4%(py2)s
{%(py2)s = %(py0)s.discard_pile
} == %(py5)s)z7%(py2)s
{%(py2)s = %(py0)s.turn_player_ids
} == %(py5)szgame_crazyeights/youwin.oggrb   rg   r   rd   r&   r'   zgame_crazyeights/loser.oggr   )r   r   r   r
   rQ   r   r   
_end_roundscorer,   r-   r.   r/   r0   r1   r2   r3   hand_wait_ticksr  turn_player_idsrp   )r|   r   r   r   r   r   rT   ri  r:   rV   r;   rW   r>   rr   r<   rz   r?   s                    r   ,test_crazyeights_end_round_scores_and_resetsrn  l  s\   #8#: Dy'"J??7J7L
e*C,JDK"31-ya/CDL b!,iQ.BCJOKOOK4O0""""""""""""";"""";""""""""""""""""""""""""""<""""<"""""""""""""?? b b     ?      :    :   ?   b       &3&3&&&&&&&&&&&4&&&&4&&&&&&3&&&&&&&"""""""""""""4""""4"""""""""""""%2%2%%%%%%%%%%%4%%%%4%%%%%%2%%%%%%%(I,G,GI,G,II,IIIIII(III(IIIIIIIIIIIIIII,GIII,IIIIIIII'I+G+GI+G+II+IIIIII'III'IIIIII:IIII:III+GIII+IIIIIIIIr   c                     [        5       u  pn[        S5      nU R                  SU5      nSU l        SU R                  l        [        SSS5      /Ul        / Ul        SUl        U R                  US S9  U R                  nS	oeU:H  ow(       d  [        R                  " S
U4SXV45      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n	[!        [        R"                  " U	5      5      eS =n=pvU R$                  oU(       + ow(       d  SS[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  n
[!        [        R"                  " U
5      5      eS =pW[&        R(                  " UR*                  SUR                  S9nUR-                  5       S   oU:H  o(       d  [        R                  " S
U4SX45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  n
SSU
0-  n[!        [        R"                  " U5      5      eS =pg )Nr   r   r  rB   rR  r   Z   rf  rJ   r   rK   r   rL   rN   r%   z3assert not %(py2)s
{%(py2)s = %(py0)s.game_active
}r   zcrazyeights-you-win-game)rk  r  r   expectedr   r   rM   )r   r   r   rQ   rD   rE   r   r   rk  rj  r,   r-   r.   r/   r0   r1   r2   r3   game_activer	   r   r   r   )r   r   r   r   r   r:   rV   r;   rW   r>   r   rq  rr   rz   s                 r   ,test_crazyeights_end_round_triggers_game_endrs    s   #8#: Dy'"J??7J7LDK!$DLL"3A./LKKOOK4O0;;$*$*$$$$$;$$$$$$4$$$$4$$$;$$$*$$$$$$$tt4K<M<MH ((*2.:(:::::.:::.::::::(::::(:::::::r   c            
      .
  ^ [        5       u  n mn[        S5      nU R                  SU5      nSTl        SUl        SU l        U R                  5       nUR                  S   nTR                  oeU:H  ow(       d  [        R                  " SU4SXV45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " T5      (       a  [        R                  " T5      OS[        R                  " U5      S	.-  nS
SU0-  n	[        [        R                  " U	5      5      eS =n=pvUR                  S   TR                     nSoU
:H  ow(       do  [        R                  " SU4SXZ45      [        R                  " U5      [        R                  " U
5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pzUR                   nSomU:H  o(       d  [        R                  " SU
4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nS
SU0-  n	[        [        R                  " U	5      5      eS =n=pU R#                  XAR$                  5      nUS   n[&        R(                  oaR$                  nSnU" UU5      nUU:H  ow(       GdM  [        R                  " SU4SUU45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [&        5      (       a  [        R                  " [&        5      OS[        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=nnU4S jU 5       n[+        U5      o(       d  SS[        R                  " 5       ;   d  [        R                  " [*        5      (       a  [        R                  " [*        5      OS[        R                  " U5      [        R                  " U
5      S.-  n[        [        R                  " U5      5      eS =pg ) Nr   x   P      winner_namer   )z,%(py1)s == %(py5)s
{%(py5)s = %(py3)s.name
}r   re   rf   rM   rN   r%   final_scoresr=  r>  r   r   )z6%(py2)s
{%(py2)s = %(py0)s.duration_ticks
} == %(py5)sresultrL   r   zgame-final-scores)zq%(py1)s == %(py12)s
{%(py12)s = %(py5)s
{%(py5)s = %(py3)s.get
}(%(py8)s
{%(py8)s = %(py6)s.locale
}, %(py10)s)
}r	   r   )re   rf   rM   r   r   r_   r`   r  r  c              3   H   >#    U  H  nTR                    S 3U;   v   M     g7f)z: 120N)rl   ).0liner   s     r   	<genexpr>?test_crazyeights_build_result_and_end_screen.<locals>.<genexpr>  s$     Ded+""#5)T1es   ",assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr   )r   r   r   rk  sound_scheduler_tickbuild_game_resultcustom_datarl   r,   r-   r1   r.   r/   r0   r2   r3   duration_ticksformat_end_screenr   r	   r   r  )r   r   r   r   r{  rr   rV   rz   rW   r>   r;   r   r   r:   linesr   rs   r#  rw   r$  r   s                       @r   ,test_crazyeights_build_result_and_end_screenr    s   #8#: D+y'"J??7J7LKL "D##%Fm,@0@0@@0@@@@@@,@@@,@@@@@@@@@@@@@0@@@@@@@@n-k.>.>?F3F3FFFFF?FFF?FFF3FFFFFFF  &B&B&&&&& &&&&&&6&&&&6&&& &&&B&&&&&&&""6+;+;<E8N|''N(8(8N:MN'(8:MNN8NNNNNN8NNNN8NNNNNN|NNNN|NNN'NNNNNN	NNNN	NNN(8NNN:MNNNNNNNNNNNNDeDD3DDDDDDDDDD3DDDD3DDDDDDDDDDDDDDr   c                     [        5       u  pnUR                  5         U R                  U5        SSSSS.4nUR                   Vs/ s H  oDR                  UR
                  4PM     snoSU;   of(       dp  [        R                  " SU4SUU45      [        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n=peU R                  5         S
0 4o2R                   Vs/ s H  oDR                  UR
                  4PM     nnX5;   of(       do  [        R                  " SU4SX545      [        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n=peU R                  n	S oU
L oU(       d  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U	5      [        R                  " U
5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n	=pZg s  snf s  snf )Nplay_ambiencezgame_crazyeights/yourturn.oggrZ   )loopintrooutrorb   )z%(py1)s in %(py4)sr>  r   r   stop_ambiencerJ  )z=%(py2)s
{%(py2)s = %(py0)s._turn_sound_player_id
} is %(py5)sr   rL   rN   r%   )r   rh   _start_turn_loopmessagestypedatar,   r-   r1   r2   r3   _stop_turn_loop_turn_sound_player_idr.   r/   r0   )r   r   r   rr   mr;   rz   r   r   r:   rV   rW   r>   s                r   ,test_crazyeights_turn_loop_controls_ambiencer    s   #8#: Dy+&02K 8 %.$6$6	7$6q66166
$6	78 
88 8 8 '8&78  
88 8 /8i8  8 8 /8i8 
88 8 8 8 %8$78 8
 	R R?Q?Q$R?Q!ffaff%5?QR$R RRRRR RRR RRR$RRRRRRRR%%-------%------4----4---%----------	 
8 %Ss   !J	!Jc                     [        5       u  pnUR                  5         U R                  U5        [        R                  " UR
                  SUR                  S9nUR                  oD" 5       oSU;   of(       Gd  [        R                  " SU4SX545      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n=pEg )
Nzcrazyeights-you-are-skippedr   rb   r   rq  r   r   r   r   )r   rh   on_player_skippedr	   r   r   rl   r   r,   r-   r.   r/   r0   r1   r2   r3   )	r   r   r   rq  r;   r=   r:   r   r   s	            r   6test_crazyeights_on_player_skipped_announces_to_playerr    s    #8#: Dy;'7@P@PH !4464666666668666666866668666666y6666y666466666666666r   c                 X  ^
 [        5       u  pnUR                  S[        S5      5        SUl        SS0m
U R	                  USU
4S j5        UR                  U5        T
S   nSoTU:H  of(       do  [        R                  " SU4S	XE45      [        R                  " U5      [        R                  " U5      S
.-  nSSU0-  n[        [        R                  " U5      5      eS =n=peS UR                   5       n	[        U	5      oU(       d  SS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U	5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =pg )Nr
   r   calledr   destroyc                  4   > T R                  ST S   S-   5      $ Nr  r   __setitem__	destroyeds   r   r   Qtest_crazyeights_perform_leave_game_last_human_destroys_playing.<locals>.<lambda>      !6!6x8ATWXAX!Yr   r   r   r=  r>  r   r   c              3   8   #    U  H  oR                   v   M     g 7fr   )rk   )r}  rq   s     r   r  Rtest_crazyeights_perform_leave_game_last_human_destroys_playing.<locals>.<genexpr>  s     8<}}<s   r  allr   )r   r   r
   rQ   r   r   r,   r-   r1   r2   r3   rj   r  r.   r/   r0   r|   r   r   r   rr   r;   rz   r   r   r:   r  s             @r   ?test_crazyeights_perform_leave_game_last_human_destroys_playingr    s    $9#: DyOOE3u:&DK1IiY 	[)X#!#!###########!#######84<<883888888888838888388888888888888r   c                   ^
 [        5       u  pnSUl        SS0m
U R                  USU
4S j5        UR                  U5        T
S   nSoTU:H  of(       do  [        R
                  " SU4SXE45      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=peUR                  oRU;  o(       d  [        R
                  " SU	4SX%45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nS
SU0-  n[        [        R                  " U5      5      eS =pg )Nr   r  r   r  c                  4   > T R                  ST S   S-   5      $ r  r  r  s   r   r   Qtest_crazyeights_perform_leave_game_last_human_destroys_waiting.<locals>.<lambda>  r  r   r   r   r=  r>  r   r   r   r   r   r   r   )r   rQ   r   r   r,   r-   r1   r2   r3   rj   r.   r/   r0   r  s             @r   ?test_crazyeights_perform_leave_game_last_human_destroys_waitingr    s    $9#: DyDK1IiY 	[)X#!#!###########!#######"ll*l*****;******;****;******d****d***l*******r   c                  
   [        5       n U R                  5         SoR                  o!U;   o3(       d  [        R                  " SU4SX45      [        R
                  " U5      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R
                  " U 5      OS[        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p2S U R                  S    5       n[        U5      ow(       d  S	S
[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R
                  " [        5      OS
[        R
                  " U5      [        R
                  " U5      S.-  n[        [        R                  " U5      5      eS =pgSoR                  o!U;   o3(       d  [        R                  " SU4SX45      [        R
                  " U5      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R
                  " U 5      OS[        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p2U R                  S   n	S U	 5       n[        U5      ow(       d  S	S
[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R
                  " [        5      OS
[        R
                  " U5      [        R
                  " U5      S.-  n[        [        R                  " U5      5      eS =pgS U	 5       n[        U5      ow(       d  S	S
[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R
                  " [        5      OS
[        R
                  " U5      [        R
                  " U5      S.-  n[        [        R                  " U5      5      eS =pgU R                  S    V
s/ s H  n
SU
R                  ;   d  M  U
PM     nn
/ oko(       a  US   o"R                  onU(       d  SSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R
                  " U5      OS0-  oR                  U5        U(       a@  S[        R
                  " U5      [        R
                  " W5      S.-  oVR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=p,g s  sn
f )Nspacerb   )z1%(py1)s in %(py5)s
{%(py5)s = %(py3)s._keybinds
}r   ry  rN   r%   c              3   @   #    U  H  nS UR                   ;   v   M     g7f)r(  N)actionsr}  binds     r   r  Jtest_crazyeights_setup_keybinds_registers_expected_keys.<locals>.<genexpr>  s     J2I$v%2Is   r  r  r   cc              3   f   #    U  H'  oR                   S /:H  =(       a    UR                  v   M)     g7f)read_topNr  include_spectatorsr  s     r   r  r    s)     ^T]D||
|+G0G0GGT]s   /1c              3   p   #    U  H,  oR                   S /:H  =(       a    UR                  (       + v   M.     g7f)r   Nr  r  s     r   r  r    s-     dZcRV||~-Md6M6M2MMZcs   46eread_countsr   r]   r#   read_counts_bindz/%(py7)s
{%(py7)s = %(py5)s.include_spectators
})rM   r%   r   r_   )r   setup_keybinds	_keybindsr,   r-   r1   r.   r/   r0   r2   r3   r  r  r  rm   rn   )r   rr   rV   rz   rW   r>   r:   r;   r   	c_actionsr  r  r<   ru   r   rv   s                   r   7test_crazyeights_setup_keybinds_registers_expected_keysr    s   D$nn$n$$$$$7$$$7$$$$$$d$$$$d$$$n$$$$$$$J$..2IJJ3JJJJJJJJJJ3JJJJ3JJJJJJJJJJJJJJ .. .     3   3      $    $   .       s#I^T]^^3^^^^^^^^^^3^^^^3^^^^^^^^^^^^^^dZcdd3dddddddddd3dddd3dddddddddddddd)-)<^)<QUQ]Q]@])<^F 0 3F F FFFFFFFFFFFFFFFFFFF 3FFF FFFFFFFFFFFFFF _s   1U"	U"c                  	   [        5       u  pn[        S5      nU R                  SU5      nU R                  S[        S5      5      nSU l        U R                  X/SS9  [        SSS5      n[        S	S
S5      n[        SSS5      nXvU/Ul        U R                  US5      n	S oU
Lo(       d  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U	5      (       a  [        R                  " U	5      OS[        R                  " U
5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =pU R#                  U5        U	R$                   Vs/ s H  oR'                  S5      (       d  M  UPM     nnUS   nSUR(                   3nUU:H  o(       dp  [        R                  " SU
4SUU45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=n
nUS   nSUR(                   3nUU:H  o(       dp  [        R                  " SU
4SUU45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=n
nSnU	R$                  nUU;   o(       d  [        R                  " SU
4S UU45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U	5      (       a  [        R                  " U	5      OS[        R                  " U5      S!.-  nS"S#U0-  n[        [        R                   " U5      5      eS =n=n
nS$nU	R$                  nUU;   o(       d  [        R                  " SU
4S UU45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U	5      (       a  [        R                  " U	5      OS[        R                  " U5      S!.-  nS"S#U0-  n[        [        R                   " U5      5      eS =n=n
nU R#                  U5        g s  snf )%Nr   	Spectatorr   Tr   r   r   r)   rS  r   r   rR  r*   r   turnis notz%(py0)s is not %(py3)sturn_setr4  r   rM   
play_card_r   r   r=  r>  r   r   r  r(  rb   )z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s._order
}ry  rN   r%   rI  )r   r   r   add_spectatorrQ   r   r   r   get_action_setr,   r-   r.   r/   r0   r1   r2   r3   _sync_turn_actions_order
startswithr   )r   r   r   r   r   	spectatorcard_acard_b	wild_cardr  rz   r:   r   rW   aidplay_actionsrr   r;   r   r   rV   r>   s                         r   =test_crazyeights_sync_turn_actions_orders_cards_and_draw_passr    s   #8#: Dy'"J??7J7L"";0EFIDK;54Hr1a Fr1a F"a#I	2K"";7H48884K(#+??S?Cnn\6RC?LS?6
699+66?666666?6666?66666666666:ILL>:::::::::::::::::::::::$X__$6_$$$$$6_$$$6$$$$$$X$$$$X$$$_$$$$$$$$X__$6_$$$$$6_$$$6$$$$$$X$$$$X$$$_$$$$$$$ 	I& Ts   2RRc                 L  ^ [        5       u  pn[        S5      nUR                  SU5      nSUl        SUl        UR                  X%/SS9  SUl        UR                  Ul        UR                  Ul	        SUl
        SS0mSU4S jjnU R                  US	U5        UR                  5         TS   nSoU:H  o(       do  [        R                  " S
U	4SXx45      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[!        [        R"                  " U5      5      eS =n=pUR                  nS oUL o(       d  [        R                  " SU4SX45      S[$        R&                  " 5       ;   d  [        R(                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[!        [        R"                  " U5      5      eS =n=pUR                  o(       + o(       d  SS[$        R&                  " 5       ;   d  [        R(                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  n[!        [        R"                  " U5      5      eS =pg )Nr   r   Tr   r   	end_roundr   c                     > TS==   S-  ss'   g )Nr  r   r   )rq   rg  r  s     r   fake_end_roundEtest_crazyeights_on_tick_wild_wait_ends_round.<locals>.fake_end_round&  s    {q r   rj  r   r=  r>  r   r   rJ  )z;%(py2)s
{%(py2)s = %(py0)s.wild_wait_player_id
} is %(py5)sr   rL   rN   r%   z>assert not %(py2)s
{%(py2)s = %(py0)s.wild_end_round_pending
}r   r   )r   r   r   rQ   rr  r   r   r   r   r   r   r   rR   r,   r-   r1   r2   r3   r.   r/   r0   )r|   r   r   r   r   r   r  rr   r;   rz   r   r   r:   rV   rW   r>   r   r  s                    @r   -test_crazyeights_on_tick_wild_wait_ends_roundr    s   #8#: Dy'"J??7J7LDKD;54HD*~~D#.>>D "&D1F! lN;LLN+#!#!###########!#########+t+t+++++#++++++4++++4+++#+++t+++++++************t****t**********r   c                 v  ^
 [        5       u  pn[        S5      nUR                  SU5      nSUl        SUl        UR                  X%/SS9  SUR                  l        / m
U R                  USU
4S j5        UR                  5         SofT
;   ow(       d  [        R                  " S	U4S
UT
45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " T
5      (       a  [        R                  " T
5      OSS.-  nSSU0-  n	[!        [        R"                  " U	5      5      eS =pgg )Nr   r   Tr   r   r5  c                  &   > T R                  S5      $ )Ntimeouthandledr-  )r/  s   r   r   8test_crazyeights_on_tick_timer_timeout.<locals>.<lambda>>  s    hoo>T.Ur   r  rb   r  r/  r   r   rM   )r   r   r   rQ   rr  r   r   r   r   rR   r,   r-   r1   r.   r/   r0   r2   r3   )r|   r   r   r   r   r   rr   rz   r   rW   r/  s             @r   &test_crazyeights_on_tick_timer_timeoutr  2  s    #8#: Dy'"J??7J7LDKD;54H!"DJJ)+H$&U 	LLN!-X-----!X---!------X----X-------r   c                    [        5       u  pn[        S5      nUR                  SU5        SUl        UR	                  UR
                  S S SS9  [        SSS5      n[        S	S
S5      nXV/Ul        U R                  SS 5        UR                  USUR                   35        UR                  ow(       d  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                   " U5      OS[        R                   " U5      S.-  n[#        [        R$                  " U5      5      eS nUR&                  nSoU	L o(       d  [        R(                  " SU
4SXy45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                   " U5      OS[        R                   " U5      [        R                   " U	5      S.-  nSSU0-  n[#        [        R$                  " U5      5      eS =n=pUR*                  nS oU	L o(       d  [        R(                  " SU
4SXy45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                   " U5      OS[        R                   " U5      [        R                   " U	5      S.-  nSSU0-  n[#        [        R$                  " U5      5      eS =n=pUR,                  nSoU	:H  o(       d  [        R(                  " SU
4SXy45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                   " U5      OS[        R                   " U5      [        R                   " U	5      S.-  nSSU0-  n[#        [        R$                  " U5      5      eS =n=pg )Nr   r   r)   Tr   rC  r*   r      r   random.randintc                     U $ r   r   r   bs     r   r   Ctest_crazyeights_action_play_card_wild_sets_state.<locals>.<lambda>Q      qr   r  z6assert %(py2)s
{%(py2)s = %(py0)s.awaiting_wild_suit
}r   r   FrJ  )z6%(py2)s
{%(py2)s = %(py0)s.turn_has_drawn
} is %(py5)srL   rN   r%   rL  r   r   r   )r   r   r   rQ   r   rj   r   r   r   _action_play_cardr   r   r.   r/   r,   r0   r1   r2   r3   rM  r-   rN  r   )r|   r   r   r   r   r  
other_cardr:   ru   rV   r;   rW   r>   s                r   1test_crazyeights_action_play_card_wild_sets_stater  F  sG   #8#: Dy'"JOOGZ(DK$,,r*=#q!$I31%J!.K(.9;*Y\\N(CD""""""""""4""""4""""""""""'%'%'''''''''''4''''4''''''%''''''''4'4'''''''''''4''''4''''''4'''''''$1$1$$$$$$$$$$$4$$$$4$$$$$$1$$$$$$$r   c                   ^^ [        5       u  pn[        S5      nUR                  SU5      nSUl        UR	                  X%/SS9  [        SSS5      nU/Ul        / mSS	0mU R                  US
U4S j5        U R                  USSU4S jj5        UR                  USUR                   35        S/nTU:H  o(       d  [        R                  " SU4STU45      S[        R                  " 5       ;   d  [        R                  " T5      (       a  [        R                  " T5      OS[        R                  " U5      S.-  n	SSU	0-  n
[!        [        R"                  " U
5      5      eS =pTS   nSoU:H  ow(       do  [        R                  " SU4SX45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[!        [        R"                  " U5      5      eS =n=p|g )Nr   r   Tr      r^  r   r  r   r]  c                 &   > TR                  U5      $ r   r-  )rq   r  drawn_for_nexts     r   r   Etest_crazyeights_action_play_card_draw_two_finishes.<locals>.<lambda>i  s    8M8Me8Tr   rj  c                 4   > TR                  STS   S-   5      $ r9  r  )rq   rg  end_round_callss     r   r   r  n  s    'B'B_W-1(
r   r  r)   r   r3  r  r4  r   rM   r   r=  r>  r   r   r   )r   r   r   rQ   r   r   r   r   r  r   r,   r-   r.   r/   r0   r1   r2   r3   )r|   r   r   r   r   r   draw_tworz   r:   r   rW   rr   r;   r   r   r  r  s                  @@r   3test_crazyeights_action_play_card_draw_two_finishesr  [  sm   #8#: Dy'"J??7J7LDK;54Hb!$H zK "NlO "T 	
 	;*X[[M(BCS >S     >S      >    >   S       7#(q(q(((((#(((#(((q(((((((r   c                 t  ^ [        5       u  pn[        S5      nUR                  SU5      nSUl        UR	                  X%/SS9  [        SSS5      n[        SS	S
5      nXg/Ul        SS0mU R                  USU4S j5        U R                  USS 5        UR                  USUR                   35        TS   nS
oU	:H  o(       do  [        R                  " SU
4SX45      [        R                  " U5      [        R                  " U	5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pg )Nr   r   Tr      r   r      r   r   r  r   rH  c                  4   > T R                  ST S   S-   5      $ r9  r  )advance_callss   r   r   Dtest_crazyeights_action_play_card_regular_advances.<locals>.<lambda>  s    ))'=3IA3MNr   r_  c                     g r   r   )r  s    r   r   r    s    $r   r  r   r=  r>  r   r   )r   r   r   rQ   r   r   r   r   r  r   r,   r-   r1   r2   r3   )r|   r   r   r   r   r   r  remaining_cardrr   r;   rz   r   r   r  s                @r   2test_crazyeights_action_play_card_regular_advancesr   y  s   #8#: Dy'"J??7J7LDK;54HS!QDsAq)N-KaLMN
 35FG;*TWWI(>?!&Q&Q&&&&&!&&&!&&&Q&&&&&&&r   c                    [        5       u  pn[        S5      nUR                  SU5      nSUl        UR	                  X%/SS9  [        SSS5      n[        U/S9Ul        [        S	SS
5      /Ul        / Ul	        U R                  SS 5        UR                  US5        UR                  ow(       d  SS[        R                  " 5       ;   d  [        R                   " U5      (       a  [        R"                  " U5      OS[        R"                  " U5      S.-  n[%        [        R&                  " U5      5      eS nUR                  S   oU:H  o(       d  [        R(                  " SU
4SX45      [        R"                  " U	5      S[        R                  " 5       ;   d  [        R                   " U5      (       a  [        R"                  " U5      OSS.-  nSSU0-  n[%        [        R&                  " U5      5      eS =pSoR*                  o" 5       oU;   o(       d  [        R(                  " SU
4SX45      [        R"                  " U	5      S[        R                  " 5       ;   d  [        R                   " U5      (       a  [        R"                  " U5      OS[        R"                  " U5      [        R"                  " U5      S.-  nSSU0-  n[%        [        R&                  " U5      5      eS =n	=n
=pSoR*                  o" 5       oU;   o(       d  [        R(                  " SU
4SX45      [        R"                  " U	5      S [        R                  " 5       ;   d  [        R                   " U5      (       a  [        R"                  " U5      OS [        R"                  " U5      [        R"                  " U5      S.-  nSSU0-  n[%        [        R&                  " U5      5      eS =n	=n
=pg )!Nr   r   Tr      r   r)   r   i  r   r  c                     U $ r   r   r  s     r   r   Ctest_crazyeights_action_draw_playable_card_sounds.<locals>.<lambda>  r  r   r(  z2assert %(py2)s
{%(py2)s = %(py0)s.turn_has_drawn
}r   r   r  r   r   playable_cardr   r   rM   z!game_crazyeights/drawPlayable.oggrb   rg   r   rd   r&   r'   zgame_crazyeights/draw.oggr   )r   r   r   rQ   r   r   r   r?  r  r   r   r@  rM  r.   r/   r,   r0   r1   r2   r3   r-   rp   )r|   r   r   r   r   r   r  r:   ru   rr   rz   r   rW   rV   r<   r>   r?   s                    r   1test_crazyeights_action_draw_playable_card_soundsr    sf   #8#: Dy'"J??7J7LDK;54Hc1a(MM?+DI"4A./DK(.9k6*44B0=00000000000000=0000=0000000.O2M2MO2M2OO2OOOOOO.OOO.OOOOOO)OOOO)OOO2MOOO2OOOOOOOO&H*F*FH*F*HH*HHHHHH&HHH&HHHHHH*HHHH*HHH*FHHH*HHHHHHHHr   c                     [        5       u  pn[        S5      nU R                  SU5      nSU l        U R	                  X/SS9  UR                  5         [        SSS5      /Ul        [        SS	S
5      [        SSS5      /Ul        [        [        SSS	5      /S9U l	        U R                  US5        UR                  5       n/ oaR                  owU;   oo(       a  UR                  oU;   on	U	(       Gd
  [        R                  " SU4SXu45      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS[        R$                  " U5      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OSS.-  nSSU0-  oR'                  U5        U(       a  [        R                  " SW4SW
U45      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS[        R$                  " U
5      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OSS.-  nSSU0-  oR'                  U5        [        R(                  " US5      0 -  nSSU0-  n[+        [        R,                  " U5      5      eS =n	=n=n=n=pU R.                  R1                  S 5        U R3                  US!5        UR                  of" 5       n[4        R6                  nUR8                  nS"nS nU" UUUS#9nUU:H  o(       Gd  [        R                  " S$U4S%UU45      S&[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS&[        R$                  " U5      [        R$                  " U5      S'[        R                   " 5       ;   d  [        R"                  " [4        5      (       a  [        R$                  " [4        5      OS'[        R$                  " U5      S&[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS&[        R$                  " U5      [        R$                  " U5      [        R$                  " U5      [        R$                  " U5      S(.
-  nSSU0-  n[+        [        R,                  " U5      5      eS =n=n=n=n=n=n=nnU R.                  R;                  5         U R3                  US!5        UR                  of" 5       n[4        R6                  nUR8                  nS)nU" UU5      nUU:H  o(       Gd  [        R                  " S$U4S*UU45      S&[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS&[        R$                  " U5      [        R$                  " U5      S'[        R                   " 5       ;   d  [        R"                  " [4        5      (       a  [        R$                  " [4        5      OS'[        R$                  " U5      S&[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS&[        R$                  " U5      [        R$                  " U5      [        R$                  " U5      S+.	-  nS,S-U0-  n[+        [        R,                  " U5      5      eS =n=n=n=n=n=nng ).Nr   r   Tr      r   r      r   r)      r*      r   r   r  rb   )z,%(py4)s
{%(py4)s = %(py2)s.name
} in %(py6)sr   counts_message)r#   r$   r   z%(py8)sr   )z0%(py12)s
{%(py12)s = %(py10)s.name
} in %(py14)sr   )r_   r`   r  z%(py16)sr  r   zassert %(py19)spy19r   check_turn_timerzpoker-timer-remaining)secondsr   )z%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_last_spoken
}()
} == %(py17)s
{%(py17)s = %(py8)s
{%(py8)s = %(py6)s.get
}(%(py11)s
{%(py11)s = %(py9)s.locale
}, %(py13)s, seconds=%(py15)s)
}r   r	   )
r"   r#   r$   r   r   r'   r   r  ra   py17zpoker-timer-disabled)z%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.get_last_spoken
}()
} == %(py15)s
{%(py15)s = %(py8)s
{%(py8)s = %(py6)s.get
}(%(py11)s
{%(py11)s = %(py9)s.locale
}, %(py13)s)
})	r"   r#   r$   r   r   r'   r   r  ra   zassert %(py17)sr  )r   r   r   rQ   r   rh   r   r   r   r?  _action_read_countsr   rl   r,   r-   r.   r/   r0   r1   rm   rn   r2   r3   r   r   _action_check_turn_timerr	   r   r   clear)r   r   r   r   r   r  r:   r;   r=   rr   r#  @py_assert13r   r   r$  r  @py_format18r  r   @py_assert10r  r  @py_assert16ry   s                           r   6test_crazyeights_action_read_counts_and_timer_messagesr    s/   #8#: Dy'"J??7J7LDK;54H!#q!,-K"31-ya/CDLIc1a012DI[-8..0NUU~-U,2C2CU~2UUUUUUUUUUU;UUUU;UUUUUUUUU~UUUU~UUUUUUUU2C~UUUUUU,UUUU,UUU2CUUUUUU~UUUU~UUUUUUUUUUUUUUJJR!!+/AB$$ $& ,*:*: 1;=*:12+ & +    & +     9   9   $   &     ,   ,   *:           1  ;=   +         	JJ!!+/AB$$d$&d,*:*:d9;K;KdMcd*:;KMc*dd&*dddddd&*ddddddd9dddd9ddd$ddd&dddddd,dddd,ddd*:dddddd9dddd9ddd;KdddMcddd*dddddddddr   c            	      V0   [        5       u  pn[        S5      nU R                  SU5      nU R                  S[        S5      5      nU R                  of" U5      nSoU:H  o(       Gd  [
        R                  " SU	4SXx45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
S	S
U
0-  n[        [
        R                  " U5      5      eS =n=n=pSU l        U R                  X/SS9  U R                  of" U5      nSoU:H  o(       Gd  [
        R                  " SU	4SXx45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
S	S
U
0-  n[        [
        R                  " U5      5      eS =n=n=pU R                  of" U5      nSoU:H  o(       Gd  [
        R                  " SU	4SXx45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
S	S
U
0-  n[        [
        R                  " U5      5      eS =n=n=pU R                  of" U5      nS oUL o(       Gd  [
        R                  " SU	4SXx45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
S	S
U
0-  n[        [
        R                  " U5      5      eS =n=n=pU R                  of" U5      owU:H  o(       GdP  [
        R                  " SU	4SXq45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=pySU l        U R"                  of" U5      nSoU:H  o(       Gd  [
        R                  " SU	4SXx45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
S	S
U
0-  n[        [
        R                  " U5      5      eS =n=n=pU R$                  of" U5      nSoU:H  o(       Gd  [
        R                  " SU	4SXx45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
S	S
U
0-  n[        [
        R                  " U5      5      eS =n=n=pU R&                  of" U5      n[(        R*                  oU:H  o(       Gdm  [
        R                  " SU	4SX~45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [(        5      (       a  [
        R                  " [(        5      OS[
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=pS U l        [-        S!S"S#5      /Ul        S$U l        [-        S%S&S$5      /U l        U R4                  of" U5      nS oUL o(       Gd  [
        R                  " SU	4S'Xx45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
S	S
U
0-  n[        [
        R                  " U5      5      eS =n=n=pU R"                  of" U5      nS oUL o(       Gd  [
        R                  " SU	4S(Xx45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
S	S
U
0-  n[        [
        R                  " U5      5      eS =n=n=pU R6                  of" U5      n[(        R*                  oU:H  o(       Gdm  [
        R                  " SU	4S)X~45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [(        5      (       a  [
        R                  " [(        5      OS[
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=pSU l        U R$                  of" U5      nS oUL o(       Gd  [
        R                  " SU	4S*Xx45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
S	S
U
0-  n[        [
        R                  " U5      5      eS =n=n=pU R:                  of" U5      n[(        R*                  oU:H  o(       Gdm  [
        R                  " SU	4S+X~45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [(        5      (       a  [
        R                  " [(        5      OS[
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=pS U l        S,U l        [-        S-S.S,5      /Ul        U R$                  of" U5      nS oUL o(       Gd  [
        R                  " SU	4S*Xx45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
S	S
U
0-  n[        [
        R                  " U5      5      eS =n=n=pU R:                  of" U5      n[(        R*                  oU:H  o(       Gdm  [
        R                  " SU	4S+X~45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [(        5      (       a  [
        R                  " [(        5      OS[
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=pSU l        U R>                  of" U5      nS oUL o(       Gd  [
        R                  " SU	4S/Xx45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S.-  n
S	S
U
0-  n[        [
        R                  " U5      5      eS =n=n=pU R@                  of" U5      n[(        RB                  oU:H  o(       Gdm  [
        R                  " SU	4S0X~45      S[        R                  " 5       ;   d  [
        R                  " U 5      (       a  [
        R                  " U 5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [(        5      (       a  [
        R                  " [(        5      OS[
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=pg )1Nr   r  zaction-not-playingr   )z]%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_turn_action_enabled
}(%(py3)s)
} == %(py8)sr   r   )r"   r#   rf   rM   r   r   r_   r   Tr   zaction-not-your-turnr   zaction-spectatorr  rJ  )z\%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._require_active_player
}(%(py3)s)
} is %(py8)s)z\%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._require_active_player
}(%(py3)s)
} == %(py7)s)r"   r#   rf   rM   r%   r&   r'   zaction-not-available)zV%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_draw_enabled
}(%(py3)s)
} == %(py8)s)zV%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_pass_enabled
}(%(py3)s)
} == %(py8)s)zy%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_suit_choice_hidden
}(%(py3)s)
} == %(py9)s
{%(py9)s = %(py7)s.VISIBLE
}r   )r"   r#   rf   rM   r%   r'   r   r   F   r   r)   r   i'  r   )zY%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._has_playable_cards
}(%(py3)s)
} is %(py8)s)zV%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_draw_enabled
}(%(py3)s)
} is %(py8)s)zr%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_draw_hidden
}(%(py3)s)
} == %(py9)s
{%(py9)s = %(py7)s.VISIBLE
})zV%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_pass_enabled
}(%(py3)s)
} is %(py8)s)zr%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_pass_hidden
}(%(py3)s)
} == %(py9)s
{%(py9)s = %(py7)s.VISIBLE
}r      r   )zO%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._can_draw
}(%(py3)s)
} is %(py8)s)zs%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_always_hidden
}(%(py3)s)
} == %(py9)s
{%(py9)s = %(py7)s.HIDDEN
})"r   r   r   r  _is_turn_action_enabledr,   r-   r.   r/   r0   r1   r2   r3   rQ   r   _require_active_playerr   _is_draw_enabled_is_pass_enabled_is_suit_choice_hiddenr   VISIBLEr   r   r   r  _has_playable_cards_is_draw_hiddenrM  _is_pass_hiddenmax_hand_size	_can_draw_is_always_hiddenHIDDEN)r   r   r   r   r   r  r:   rV   r   r<   r   rv   r>   r?   rt   r   s                   r   2test_crazyeights_visibility_helpers_cover_branchesr)    s,   #8#: Dy'"J??7J7L"";0EFI''L'4L8LL8LLLLLL4LLLLLL4LLLL4LLL'LLLLLLLLLLLLL4LLL8LLLLLLLLDK;54H''O'5O9OO9OOOOOO5OOOOOO4OOOO4OOO'OOOOOOOOOOOOO5OOO9OOOOOOOO''H'	2H6HH6HHHHHH2HHHHHH4HHHH4HHH'HHHHHH	HHHH	HHH2HHH6HHHHHHHH&&<&|4<<<<<<<4<<<<<<4<<<<4<<<&<<<<<<|<<<<|<<<4<<<<<<<<<<&&B&{3B{BBBBB3BBBBBB4BBBB4BBB&BBBBBB{BBBB{BBB3BBBBBB{BBBB{BBBBBBB"D  G -G1GG1GGGGGG-GGGGGG4GGGG4GGG GGGGGGGGGGGGG-GGG1GGGGGGGG  G -G1GG1GGGGGG-GGGGGG4GGGG4GGG GGGGGGGGGGGGG-GGG1GGGGGGGG&&I&{3Iz7I7II7IIIIII3IIIIII4IIII4III&IIIIII{IIII{III3IIIIIIzIIIIzIII7IIIIIIII#D!#q!,-KD"4A./D##9#K09E9E999990999999499994999#999999K9999K9990999E9999999  5 -5555555-555555455554555 5555555555555-5555555555B,B
0B0BB0BBBBBB,BBBBBB4BBBB4BBBBBBBBBBBBBBBB,BBBBBB
BBBB
BBB0BBBBBBBBD  5 -5555555-555555455554555 5555555555555-5555555555B,B
0B0BB0BBBBBB,BBBBBB4BBBB4BBBBBBBBBBBBBBBB,BBBBBB
BBBB
BBB0BBBBBBBBDD!#q!,-K  5 -5555555-555555455554555 5555555555555-5555555555B,B
0B0BB0BBBBBB,BBBBBB4BBBB4BBBBBBBBBBBBBBBB,BBBBBB
BBBB
BBB0BBBBBBBBD>>/>+&/%/%/////&//////4////4///>//////+////+///&///%///////!!C!+.C*2C2CC2CCCCCC.CCCCCC4CCCC4CCC!CCCCCC+CCCC+CCC.CCCCCC*CCCC*CCC2CCCCCCCCr   c                 t  ^^ [        5       u  pn[        S5      nUR                  SU5      nSUl        UR	                  X%/SS9  [        SSS5      n[        SS	S
5      n[        SSS5      nUR                  o" U5      o(       d  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U
5      S.-  n[        [        R                  " U5      5      eS =pUR                  o" U5      o(       + o(       d  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U
5      S.-  n[        [        R                  " U5      5      eS =n	=p[        SSS5      /Ul        UR                  o" U5      o(       d  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U
5      S.-  n[        [        R                  " U5      5      eS =pS
Ul        UR                  n	Sn
SnS
n[        XU5      o" U5      nU(       GdA  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " [
        5      (       a  [        R                  " [
        5      OS[        R                  " U
5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n	=n
=n=n=nnS Ul        UR                  n	Sn
SnSn[        XU5      o" U5      nU(       GdA  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " [
        5      (       a  [        R                  " [
        5      OS[        R                  " U
5      [        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n	=n
=n=n=nn[        SS	S5      /Ul        SUl        UR                  o" U5      o(       + o(       d  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U
5      S.-  n[        [        R                  " U5      5      eS =n	=pSUl        UR                  o" U5      o(       d  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U
5      S.-  n[        [        R                  " U5      5      eS =pXh/Ul        [        SS	S5      /Ul        SUl        UR'                  U5      nS /nUU:H  o(       d  [        R(                  " S!U	4S"UU45      S#[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS#[        R                  " U5      S$.-  nS%S&U0-  n[        [        R                  " U5      5      eS =n	n[        S'S(S5      [        S)SS
5      /Ul        [+        / S*9Ul        U R/                  UR,                  S+S, 5        U R/                  UR,                  S-S. 5        / mU R/                  US/SDU4S0 jj5        UR1                  5         S1nUT;   nU(       d  [        R(                  " S2U4S3UT45      [        R                  " U5      S4[        R                  " 5       ;   d  [        R                  " T5      (       a  [        R                  " T5      OS4S5.-  nS%S&U0-  n[        [        R                  " U5      5      eS =nn/ mU R/                  US/SDU4S6 jj5        UR3                  U5        UR3                  [        S7S8S5      5        UR3                  [        S9S:S5      5        UR3                  [        S;SS5      5        UR3                  [        S<S(S5      5        [5        T5      n1 S=knUU:H  o(       Gd  [        R(                  " S!U
4S>UU45      S?[        R                  " 5       ;   d  [        R                  " [4        5      (       a  [        R                  " [4        5      OS?S@[        R                  " 5       ;   d  [        R                  " T5      (       a  [        R                  " T5      OS@[        R                  " U5      [        R                  " U5      SA.-  nSBSCU0-  n[        [        R                  " U5      5      eS =n=n
ng )ENr   r   Tr   i  r   r   i  r*   r)   i  rS  r   zQassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_number_card
}(%(py3)s)
}r   card_number)r"   r#   rf   rM   zUassert not %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_number_card
}(%(py3)s)
}	card_wildi  r   zSassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_card_playable
}(%(py3)s)
}i  zassert %(py13)s
{%(py13)s = %(py2)s
{%(py2)s = %(py0)s._is_card_playable
}(%(py11)s
{%(py11)s = %(py3)s(%(py5)s, %(py7)s, %(py9)s)
})
}r   )r"   r#   rf   rM   r%   r'   r   r  i  i  zWassert not %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_card_playable
}(%(py3)s)
}Fi  r   r   r3  playable_indicesr4  r   rM   i  r   i  r   is_emptyc                      g)NTr   r   r   r   r   6test_crazyeights_card_helper_methods.<locals>.<lambda>      tr   draw_onec                      g r   r   r   r   r   r   r0    r1  r   
play_soundc                 &   > TR                  U 5      $ r   r-  )soundvolumepanpitchplay_soundss       r   r   r0    s    HZHZ[`Har   zgame_crazyeights/pileempty.oggrb   r  r:  r   c                 &   > TR                  U 5      $ r   r-  )r6  r7  r8  r9  r  s       r   r   r0    s    V[H\r   i  r^  i  rR  i	  i
  >   game_crazyeights/discrev.ogggame_crazyeights/discdraw.ogggame_crazyeights/discskip.ogggame_crazyeights/discwild.ogggame_crazyeights/discarded.ogg)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)ssetr  )r"   re   rf   r   r   r   )r  r   r  )r   r   r   rQ   r   r   _is_number_cardr.   r/   r,   r0   r1   r2   r3   r  _is_card_playabler   r   r   get_playable_indicesr-   r   r?  r   _reshuffle_discard_into_deck_play_card_soundrA  )r|   r   r   r   r   r   r+  r,  card_reverser:   rV   rW   r<   r   rt   r  r  rx   r-  rz   r   rr   r=   r   r:  r  s                           @@r   $test_crazyeights_card_helper_methodsrH    s   #8#: Dy'"J??7J7LDK;54HCA&K#q!$IS"a(L,,,,,,,,,,4,,,,4,,,,,,,,,,,,,,,,,,,,,,,##.#I...........t....t...#......I....I.........."4A./D!!.!+.........4....4...!......+....+..........D!!7C77A7)CA"67!"6777777777477774777!777777)7777)777C777777A777"677777777777D!!7C77A7)CA"67!"6777777777477774777!777777)7777)777C777777A777"677777777777"4A./D"D%%2%k22222222222t2222t222%222222k2222k2222222222#D!!,!),,,,,,,,,4,,,,4,,,!,,,,,,),,,,),,,,,,,,,,#2K"4A./DD00= !s"s"""""s"""""""""""""s""""""""4A.	$10EFD2DI		:|<		:|<Kla 	%%'+:+{:::::+{:::+::::::{::::{:::::::Fl\ 	)$)CQ/0)CQ/0)CQ/0)CA./v;   ;     ;      3   3     v   v   ;           r   c                   ^ [        5       u  pn[        SSS5      n[        SSS5      [        SSS5      /nXT/-   Ul        [        / S	9Ul        S
S0mU4S jnU R                  UR                  SU5        UR                  5       nTS
   o(       d:  SS[        R                  " U5      0-  n	[        [        R                  " U	5      5      eS nS oU
Lo(       d  [        R                  " SU4SXz45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U
5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =pUR                  S   oU:H  o(       d  [        R                  " SU
4SX45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =pg )Ni  r   r   i  r   r)   i  r   r   r  Fc                     > ST S'   g )NTr  r   )shuffleds   r   fake_shuffle:test_crazyeights_draw_card_reshuffle.<locals>.fake_shuffle5  s    !r   r   zassert %(py1)sre   r  r  drawnr4  r   rM   r  r   r   card_topr   )r   r   r  r   r?  r   
_draw_cardr,   r1   r2   r3   r-   r.   r/   r0   )r|   r   r   r   rO  recyclerL  rN  rr   @py_format2rz   r:   r   rW   rK  s                 @r   $test_crazyeights_draw_card_reshufflerS  ,  st   #8#: Dya#Ha#YsAq%9:G*,D2DI% H" 		9l;OOEH555R ,H,,,,, ,,, ,,,,,,H,,,,H,,,,,,,r   )Host)>builtinsr.   _pytest.assertion.rewrite	assertionrewriter,   pytestserver.game_utils.actionsr   server.game_utils.cardsr   r   r   server.games.crazyeights.gamer   r   server.messages.localizationr	   server.core.users.botr
   server.core.users.test_userr   strr   intr   r@   rG   rX   r{   MonkeyPatchr   r   r   r   r   r   r  r%  r6  rA  rP  rd  rn  rs  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r)  rH  rS  r   r   r   <module>rc     s      0 ; ; M 5 % 0(S (2s 2# 2S 2T 2'*% 	J6##6$L((*E:26-"HZHZ -"`%&K&J\J\ K()PVPbPb ),HF<N<N H2-V5G5G -DJf>P>P J2;*E&.	79##9&+##+$G'8+v?Q?Q +6.8J8J .(%6CUCU %*)VEWEW )<'FDVDV '0I6CUCU I,e8)DX:f6H6H :z-f6H6H -r   