§
    ÛÀjö  ã            
      ón  — d Z ddlmZ ddlZddlZddlZddlZddlZej         	                    dej         
                    ej                             ej                             e¦  «        d¦  «        ¦  «        ¦  «         ddlZddlmZ  G d„ dej        ¦  «        Zedk    r ej        ¦   «          dS dS )	aD  
Unit Tests for Server-Authoritative Zone Monster and Quest Synchronization.
Verifies that monster stats, level 1 balance, bat swarms, and quest progress
are strictly determined and streamed from the Server Gateway to the Client.
Zero-Trust Server Authority: No client-side authority for monster stats or quest progression.
é    )ÚannotationsNz../../server)ÚWsGatewayBridgec                  óF   — e Zd Zed„ ¦   «         Zed„ ¦   «         Zd„ Zd„ ZdS )ÚTestWsAuthoritativeSyncc                ó”   — d| _         d| _        t          | j        | j         ¬¦  «        | _        | j                             ¦   «          d S )Ni¡F  z	127.0.0.1)ÚhostÚport)r	   r   r   ÚbridgeÚstart_background©Úclss    ú>C:\Projects\FreeExile\tests\unit\test_ws_authoritative_sync.pyÚ
setUpClassz"TestWsAuthoritativeSync.setUpClass   sB   € àˆŒØˆŒÝ$¨#¬(¸¼ÐBÑBÔBˆŒ
ØŒ
×#Ò#Ñ%Ô%Ð%Ð%Ð%ó    c                ó8   — | j                              ¦   «          d S )N)r
   Ústop_backgroundr   s    r   ÚtearDownClassz%TestWsAuthoritativeSync.tearDownClass   s   € àŒ
×"Ò"Ñ$Ô$Ð$Ð$Ð$r   c           
   ƒ  óJ  K  — d| j         › d| j        › �}t          j        |¦  «        4 ƒd{V —†}|                     ¦   «         ƒ d{V —†}t          j        |¦  «        }|                      |                     d¦  «        d¦  «         | 	                    t          j
        dddœ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}t          j        |¦  «        }|                      |                     d¦  «        d	¦  «         |                      |                     d
¦  «        ¦  «         |                     dg ¦  «        }|                      t          |¦  «        d¦  «         t          d„ |D ¦   «         d¦  «        }|                      |¦  «         |                      |d         d¦  «         |                      |d         d         d         d¦  «         |                      |d         d         d         d¦  «         | 	                    t          j
        ddddœ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}	t          j        |	¦  «        }
|                      |
                     d¦  «        d¦  «         |                      d|
                     dg ¦  «        ¦  «         t          d„ |
d         D ¦   «         ¦  «        }|                      |d         d         d         d¦  «         t#          dd¦  «        D ]¨}| 	                    t          j
        ddddœ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}t          j        |¦  «        }t          d„ |d         D ¦   «         ¦  «        }|                      |d         d         d         |¦  «         Œ©|                      |d         d ¦  «         |                      |d         d         d!         ¦  «         ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )"zPVerifies server streams canonical quest state and authoritatively handles kills.úws://ú:NÚtypeÚwelcomeÚrequest_quest_syncÚplayer_sync_test)r   Ú	player_idÚ
quest_syncÚauthoritativeÚquestsé   c              3  ó2   K  — | ]}|d          dk    ¯|V — ŒdS ©Úquest_idÚ!quest_norm_01_thuc_tinh_tang_kiemN© ©Ú.0Úqs     r   ú	<genexpr>z\TestWsAuthoritativeSync.test_server_authoritative_quest_sync_and_progress.<locals>.<genexpr>6   s1   è è € ÐaÐa˜Q¨A¨j¬MÐ=`Ò,`Ð,`�qÐ,`Ð,`Ð,`Ð,`ÐaÐar   ÚstatusÚIN_PROGRESSÚ
objectivesr   ÚcurrentÚrequiredé   Úmonster_kill_reportÚmob_starter_bat)r   r   Ú
monster_idÚquest_progress_updater#   Úupdated_quest_idsc              3  ó2   K  — | ]}|d          dk    ¯|V — ŒdS r!   r$   r%   s     r   r(   z\TestWsAuthoritativeSync.test_server_authoritative_quest_sync_and_progress.<locals>.<genexpr>F   s1   è è € ÐqÐq˜a¸A¸j¼MÐMpÒ<pÐ<p˜Ð<pÐ<pÐ<pÐ<pÐqÐqr   é   é   Úmob_starter_houndc              3  ó2   K  — | ]}|d          dk    ¯|V — ŒdS r!   r$   r%   s     r   r(   z\TestWsAuthoritativeSync.test_server_authoritative_quest_sync_and_progress.<locals>.<genexpr>R   s1   è è € ÐsÐs !¸aÀ
¼mÐOrÒ>rÐ>r˜AÐ>rÐ>rÐ>rÐ>rÐsÐsr   Ú	COMPLETEDÚis_completed)r   r	   Ú
websocketsÚconnectÚrecvÚjsonÚloadsÚassertEqualÚgetÚsendÚdumpsÚ
assertTrueÚassertGreaterEqualÚlenÚnextÚassertIsNotNoneÚassertInÚrange)ÚselfÚuriÚwsÚwelcome_rawr   Ú	quest_rawÚ
quest_datar   Úq1Ú
update_rawÚupdate_dataÚu_q1ÚiÚprog_rawÚ	prog_dataÚp_q1s                   r   Ú1test_server_authoritative_quest_sync_and_progresszITestWsAuthoritativeSync.test_server_authoritative_quest_sync_and_progress"   s  è è € à-�d”iÐ-Ð- $¤)Ð-Ð-ˆÝÔ% cÑ*Ô*ð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	C¨bØ "§¢¡	¤	˜/˜/˜/˜/˜/˜/ˆKÝ”j Ñ-Ô-ˆGØ×Ò˜WŸ[š[¨Ñ0Ô0°)Ñ<Ô<Ð<ð —'’'�$œ*Ø,Ø/ð&ð &ñ ô ñ ô ð ð ð ð ð ð ð ð !Ÿgšg™iœi˜˜˜˜˜˜ˆIÝœ IÑ.Ô.ˆJØ×Ò˜ZŸ^š^¨FÑ3Ô3°\ÑBÔBÐBØ�OŠO˜JŸNšN¨?Ñ;Ô;Ñ<Ô<Ð<Ø—^’^ H¨bÑ1Ô1ˆFØ×#Ò#¥C¨¡K¤K°Ñ3Ô3Ð3åÐaÐa &ÐaÑaÔaÐcgÑhÔhˆBØ× Ò  Ñ$Ô$Ð$Ø×Ò˜R œ\¨=Ñ9Ô9Ð9Ø×Ò˜R Ô-¨aÔ0°Ô;¸QÑ?Ô?Ð?Ø×Ò˜R Ô-¨aÔ0°Ô<¸aÑ@Ô@Ð@ð —'’'�$œ*Ø-Ø/Ø/ð&ð &ñ ô ñ ô ð ð ð ð ð ð ð ð
  "Ÿwšw™yœy˜˜˜˜˜˜ˆJÝœ* ZÑ0Ô0ˆKØ×Ò˜[Ÿ_š_¨VÑ4Ô4Ð6MÑNÔNÐNØ�MŠMÐ=¸{¿ºÐObÐdfÑ?gÔ?gÑhÔhÐhÝÐqÐq ;¨xÔ#8ÐqÑqÔqÑqÔqˆDØ×Ò˜T ,Ô/°Ô2°9Ô=¸qÑAÔAÐAõ ˜1˜a‘[”[ð 	Fð 	F�Ø—g’g�dœjØ1Ø!3Ø"5ð*ð *ñ ô ñ ô ð ð ð ð ð ð ð ð
 "$§¢¡¤˜?˜?˜?˜?˜?˜?�Ý œJ xÑ0Ô0�	ÝÐsÐs y°Ô':ÐsÑsÔsÑsÔs�Ø× Ò   lÔ!3°AÔ!6°yÔ!AÀ1ÑEÔEÐEÐEð ×Ò˜T (œ^¨[Ñ9Ô9Ð9Ø�OŠO˜D Ô.¨qÔ1°.ÔAÑBÔBÐBðe2	Cð 2	Cð 2	Cñ 2	Cô 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cøøøð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cð 2	Cs   ¯OPÐ
PÐPc              ƒ  óê  K  — d| j         › d| j        › �}t          j        |¦  «        4 ƒd{V —†}|                     ¦   «         ƒ d{V —† |                     t          j        dddœ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}t          j        |¦  «        }|  	                    | 
                    d¦  «        d¦  «         |  	                    | 
                    d	¦  «        d¦  «         |                      | 
                    d
¦  «        ¦  «         | 
                    dg ¦  «        }|                      t          |¦  «        d¦  «         d„ |D ¦   «         }|                      t          |¦  «        d¦  «         |D ]“}|  	                    |d         d¦  «         |  	                    |d         d¦  «         |                      |d         d¦  «         |                      |d         d¦  «         d|d         z  }|                      |d¦  «         Œ”t          d„ |D ¦   «         ¦  «        }	|                      |	d¦  «         ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )uP   Verifies server generates balanced level 1 monster packs with Quá»· DÆ¡i (bats).r   r   NÚrequest_zone_dataÚzone_tang_kiem_nhai)r   Úzone_idr   Úzone_monsters_syncr]   r   Úmonstersé
   c                óH   — g | ]}|d                                d¦  «        ¯|‘Œ S )ÚidÚ srv_pack_zone_tang_kiem_nhai_1_m)Ú
startswith©r&   Úms     r   ú
<listcomp>zcTestWsAuthoritativeSync.test_server_authoritative_zone_monsters_level_1_balance.<locals>.<listcomp>n   s0   € ÐhÐhÐh °°4´×1CÒ1CÐDfÑ1gÔ1gÐh˜!ÐhÐhÐhr   é   Úlevelr   ÚrankÚCOMMONÚ
attack_dmgg      @g      !@g     Àb@g      1@c              3  ó.   K  — | ]}|d          dk    V — ŒdS )ÚgenusÚCORRUPTED_RAPTORNr$   re   s     r   r(   zbTestWsAuthoritativeSync.test_server_authoritative_zone_monsters_level_1_balance.<locals>.<genexpr>|   s,   è è € ÐNÐNÀ˜1˜Wœ:Ð);Ò;ÐNÐNÐNÐNÐNÐNr   z0Zone must include native CORRUPTED_RAPTOR (bats))r   r	   r;   r<   r=   rB   r>   rC   r?   r@   rA   rD   rE   rF   ÚassertLessEqualÚany)
rK   rL   rM   Úzone_rawÚ	zone_datar_   Ú
p1_minionsrf   Úhits_to_killÚhas_batss
             r   Ú7test_server_authoritative_zone_monsters_level_1_balancezOTestWsAuthoritativeSync.test_server_authoritative_zone_monsters_level_1_balanceY   s>  è è € à-�d”iÐ-Ð- $¤)Ð-Ð-ˆÝÔ% cÑ*Ô*ð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Z¨bØ—'’'‘)”)ˆOˆOˆOˆOˆOˆOˆOð —'’'�$œ*Ø+Ø0ð&ð &ñ ô ñ ô ð ð ð ð ð ð ð ð  ŸWšW™YœY������ˆHÝœ
 8Ñ,Ô,ˆIØ×Ò˜YŸ]š]¨6Ñ2Ô2Ð4HÑIÔIÐIØ×Ò˜YŸ]š]¨9Ñ5Ô5Ð7LÑMÔMÐMØ�OŠO˜IŸMšM¨/Ñ:Ô:Ñ;Ô;Ð;à —}’} Z°Ñ4Ô4ˆHØ×#Ò#¥C¨¡M¤M°2Ñ6Ô6Ð6ð iÐh XÐhÑhÔhˆJØ×#Ò#¥C¨
¡O¤O°QÑ7Ô7Ð7àð <ð <�Ø× Ò   7¤¨QÑ/Ô/Ð/Ø× Ò   6¤¨HÑ5Ô5Ð5à×'Ò'¨¨,¬¸Ñ=Ô=Ð=Ø×$Ò$ Q |¤_°cÑ:Ô:Ð:à$ q¨¤Ñ6�Ø×'Ò'¨°dÑ;Ô;Ð;Ð;õ ÐNÐNÀXÐNÑNÔNÑNÔNˆHØ�OŠO˜HÐ&XÑYÔYÐYðC!	Zð !	Zð !	Zñ !	Zô !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zøøøð !	Zð !	Zð !	Zð !	Zð !	Zð !	Zs   ¯H I"É"
I,É/I,N)Ú__name__Ú
__module__Ú__qualname__Úclassmethodr   r   rY   rw   r$   r   r   r   r      so   € € € € € Øð&ð &ñ „[ð&ð ð%ð %ñ „[ð%ð5Cð 5Cð 5Cðn$Zð $Zð $Zð $Zð $Zr   r   Ú__main__)Ú__doc__Ú
__future__r   Úasyncior>   ÚosÚsysÚunittestÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__r;   Úgateway.ws_gateway_bridger   ÚIsolatedAsyncioTestCaser   rx   Úmainr$   r   r   ú<module>rŒ      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \à Ð Ð Ð Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ðgZð gZð gZð gZð gZ˜hÔ>ñ gZô gZð gZðT ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   