§
    vÁÀj³1  ã            
       óÈ  — d Z ddlZddlmc 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mZmZmZmZmZmZmZmZmZmZmZm Z m!Z! ddl"m#Z#m$Z$m%Z%m&Z&  G d„ dej'        ¦  «        Z(e)dk    r ej*        ¦   «          dS dS )	zÉ
Unit Tests for FreeExile WebSocket Protobuf Gateway Bridge.
Verifies 2-byte opcode binary framing, zero-residual momentum verification,
and full duplex WebSocket communication with Protobuf payloads.
é    Nz../../server)ÚOPCODE_AUTH_REQUESTÚOPCODE_CAST_MARTIAL_SKILLÚOPCODE_CHAT_MESSAGEÚOPCODE_COMBAT_DAMAGE_EVENTÚOPCODE_ENTER_ZONE_REQUESTÚOPCODE_ENTITY_STATEÚOPCODE_PACKET_ENVELOPEÚOPCODE_PHANTOM_EVASIONÚOPCODE_PLAYER_MOVE_INPUTÚOPCODE_ZONE_DATAÚOPCODE_ZONE_PORTAL_DATAÚWsGatewayBridgeÚdecode_binary_frameÚencode_binary_frame)Úchat_pb2Ú
combat_pb2Úmap_zone_pb2Únetwork_pb2c                   óp   — e Zd Zed„ ¦   «         Zed„ ¦   «         Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zd„ ZdS )ÚTestWsProtobufGatewayc                 ó”   — 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_protobuf_gateway.pyÚ
setUpClassz TestWsProtobufGateway.setUpClass$   sB   € àˆŒØˆŒÝ$¨#¬(¸¼ÐBÑBÔBˆŒ
ØŒ
×#Ò#Ñ%Ô%Ð%Ð%Ð%ó    c                 ó8   — | j                              ¦   «          d S ©N)r   Ústop_backgroundr   s    r   ÚtearDownClassz#TestWsProtobufGateway.tearDownClass+   s   € àŒ
×"Ò"Ñ$Ô$Ð$Ð$Ð$r    c                 ól   — | j         j        | _        | j         j        | _        | j         j        | _        d S r"   )Ú	__class__r   r   r   )Úselfs    r   ÚsetUpzTestWsProtobufGateway.setUp/   s*   € Ø”NÔ'ˆŒ	Ø”NÔ'ˆŒ	Ø”nÔ+ˆŒˆˆr    c                 ó  — d}t          t          |¦  «        }|                      t          |¦  «        dt          |¦  «        z   ¦  «         |                      |d         d¦  «         |                      |d         d¦  «         t	          |¦  «        \  }}|                      |t          ¦  «         |                      ||¦  «         |                      t          ¦  «        5  t	          d¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z@Codec correctly serializes and unpacks 2-byte big-endian opcode.s   TEST_BINARY_PROTOBUF_DATAé   r   é   é   ó    N)r   r   ÚassertEqualÚlenr   ÚassertRaisesÚ
ValueError)r'   Úraw_payloadÚframeÚopcodeÚdecoded_payloads        r   Útest_binary_frame_encode_decodez5TestWsProtobufGateway.test_binary_frame_encode_decode4   s;  € à2ˆÝ#Õ$<¸kÑJÔJˆØ×Ò�˜U™œ Q­¨[Ñ)9Ô)9Ñ%9Ñ:Ô:Ð:Ø×Ò˜˜qœ 4Ñ(Ô(Ð(Ø×Ò˜˜qœ 4Ñ(Ô(Ð(å"5°eÑ"<Ô"<Ñˆ�Ø×Ò˜Õ!9Ñ:Ô:Ð:Ø×Ò˜¨+Ñ6Ô6Ð6ð ×Ò�zÑ*Ô*ð 	)ð 	)Ý Ñ(Ô(Ð(ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð 	)ð 	)s   Ã C=Ã=DÄDc                 ó4  — d}| j                              |dd¦  «        \  }}}|                      |¦  «         |                      |dd¬¦  «         |                      |dd¬¦  «         | j                              |dd¦  «        \  }}}|                      |¦  «         |                      |d¦  «         |                      |d¦  «         | j                              |dd¦  «        \  }}	}
|                      |¦  «         |                      |	d¦  «         |                      |
d¦  «         | j                              |¦  «        }|                      |d	         d¦  «         |                      |d
         d¦  «         |                      |d         d¦  «         dS )zJZero-residual momentum ensures velocity snaps to 0.0 with 0 trailing lerp.i‰  ç      ð?ç        ç      @r*   ©Úplacesg¸…ëQ¸ž?g{®Gáz¤?ÚvxÚvyÚ
anim_stater   N)r   Úverify_zero_residual_momentumÚassertFalseÚassertAlmostEqualÚ
assertTruer.   Ú_get_player_state)r'   Ú	entity_idÚhaltedr=   r>   Úhalted_stopÚvx_stopÚvy_stopÚ	halted_dzÚvx_dzÚvy_dzÚstates               r   Ú(test_zero_residual_momentum_instant_haltz>TestWsProtobufGateway.test_zero_residual_momentum_instant_haltD   s¢  € àˆ	àœ×BÒBÀ9ÈcÐSVÑWÔW‰ˆ��BØ×Ò˜Ñ Ô Ð Ø×Ò˜r 3¨qÐÑ1Ô1Ð1Ø×Ò˜r 3¨qÐÑ1Ô1Ð1ð )-¬×(QÒ(QÐR[Ð]`ÐbeÑ(fÔ(fÑ%ˆ�W˜gØ�Š˜Ñ$Ô$Ð$Ø×Ò˜ #Ñ&Ô&Ð&Ø×Ò˜ #Ñ&Ô&Ð&ð #'¤+×"KÒ"KÈIÐW[Ð]aÑ"bÔ"bÑˆ	�5˜%Ø�Š˜	Ñ"Ô"Ð"Ø×Ò˜ Ñ$Ô$Ð$Ø×Ò˜ Ñ$Ô$Ð$ð ”×-Ò-¨iÑ8Ô8ˆØ×Ò˜˜tœ cÑ*Ô*Ð*Ø×Ò˜˜tœ cÑ*Ô*Ð*Ø×Ò˜˜|Ô,¨aÑ0Ô0Ð0Ð0Ð0r    c              ƒ   ó<  K  — d| j         › d| j        › �}t          j        |¦  «        4 ƒd{V —†}|                     ¦   «         ƒ d{V —†}t          j        |¦  «        }|                      |                     d¦  «        d¦  «         t          j
        dddd	¬
¦  «        }|                     t          t          |                     ¦   «         ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}|                      |t           ¦  «         t#          |¦  «        \  }}|                      |t$          ¦  «         t          j                             |¦  «        }	|                      |	j        d¦  «         |                      |	j        dd	¬¦  «         |                      |	j        d	¦  «         |                      |	j        d	¦  «         t          j
        dddd¬
¦  «        }
|                     t          t          |
                     ¦   «         ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}t#          |¦  «        \  }}|                      |t$          ¦  «         t          j                             |¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )zQWebSocket roundtrip verifies PlayerMoveInput yields authoritative EntitySnapshot.úws://ú:NÚtypeÚwelcomeéé  r9   r8   r+   ©rE   Údir_xÚdir_yÚinput_sequencer:   r;   r*   r   )r   r   Ú
websocketsÚconnectÚrecvÚjsonÚloadsr.   Úgetr   ÚPlayerMoveInputÚsendr   r   ÚSerializeToStringÚassertIsInstanceÚbytesr   r   ÚEntitySnapshotÚ
FromStringrE   rB   Ú
velocity_yÚanimation_stateÚlast_processed_input_seqÚ
velocity_x)r'   ÚuriÚwsrS   Úwelcome_dataÚmove_msgÚ
resp_framer4   ÚpayloadÚsnapÚstop_msgÚ	stop_respÚop_stopÚpayload_stopÚ	snap_stops                  r   Ú*test_websocket_player_move_input_roundtripz@TestWsProtobufGateway.test_websocket_player_move_input_roundtrip_   s­  è è € à-�d”iÐ-Ð- $¤)Ð-Ð-ˆÝÔ% cÑ*Ô*ð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	D¨bàŸGšG™IœI�o�o�o�o�o�oˆGÝœ: gÑ.Ô.ˆLØ×Ò˜\×-Ò-¨fÑ5Ô5°yÑAÔAÐAõ #Ô2Ø c°ÀQðñ ô ˆHð —'’'Õ-Õ.FÈ×HbÒHbÑHdÔHdÑeÔeÑfÔfÐfÐfÐfÐfÐfÐfÐfà!Ÿwšw™yœy˜˜˜˜˜˜ˆJØ×!Ò! *­eÑ4Ô4Ð4Ý1°*Ñ=Ô=‰OˆF�GØ×Ò˜VÕ%8Ñ9Ô9Ð9åÔ-×8Ò8¸ÑAÔAˆDØ×Ò˜Tœ^¨TÑ2Ô2Ð2Ø×"Ò" 4¤?°CÀÐ"ÑBÔBÐBØ×Ò˜TÔ1°1Ñ5Ô5Ð5Ø×Ò˜TÔ:¸AÑ>Ô>Ð>õ #Ô2Ø c°ÀQðñ ô ˆHð —'’'Õ-Õ.FÈ×HbÒHbÑHdÔHdÑeÔeÑfÔfÐfÐfÐfÐfÐfÐfÐfà Ÿgšg™iœi˜˜˜˜˜˜ˆIÝ$7¸	Ñ$BÔ$BÑ!ˆG�\Ø×Ò˜WÕ&9Ñ:Ô:Ð:å#Ô2×=Ò=¸lÑKÔKˆIØ×Ò˜YÔ1°3Ñ7Ô7Ð7Ø×Ò˜YÔ1°3Ñ7Ô7Ð7Ø×Ò˜YÔ6¸Ñ:Ô:Ð:Ø×Ò˜YÔ?ÀÑCÔCÐCðK%	Dð %	Dð %	Dñ %	Dô %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Dð %	Døøøð %	Dð %	Dð %	Dð %	Dð %	Dð %	Ds   ¯K	LÌ
LÌLc              ƒ   óx  K  — d| j         › d| j        › �}t          j        |¦  «        4 ƒd{V —†}|                     ¦   «         ƒ d{V —† t          j        dddd¬¦  «        }|                     t          t          | 
                    ¦   «         ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}t          |¦  «        \  }}|                      |t          ¦  «         t
          j                             |¦  «        }|                      |j        d¦  «         |                      |j        d	¦  «         t          j        dd
d¬¦  «        }|                     t          t(          | 
                    ¦   «         ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}	t          |	¦  «        \  }
}|                      |
t*          ¦  «         t,          j                             |¦  «        }|                      |j        d¦  «         ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )zKVerifies CastMartialSkillRequest and PhantomEvasionRequest binary handling.rP   rQ   NrT   ée   g      $@g      @)Úcaster_entity_idÚskill_idÚtarget_xÚtarget_yr   r8   r9   )rE   Úevasion_dir_xÚevasion_dir_yé   )r   r   rY   rZ   r[   r   ÚCastMartialSkillRequestr`   r   r   ra   r   r.   r   ÚCombatDamageEventre   Úsource_entity_idÚassertGreaterÚ
raw_damageÚPhantomEvasionRequestr
   r   r   rd   rg   )r'   rj   rk   Ú	skill_reqÚrespÚopro   ÚdmgÚeva_reqÚresp_evaÚop_evaÚpayload_evaÚsnap_evas                r   Ú1test_websocket_combat_skill_and_evasion_roundtripzGTestWsProtobufGateway.test_websocket_combat_skill_and_evasion_roundtrip‰   s»  è è € à-�d”iÐ-Ð- $¤)Ð-Ð-ˆÝÔ% cÑ*Ô*ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:¨bØ—'’'‘)”)ˆOˆOˆOˆOˆOˆOˆOõ #Ô:Ø!%°¸dÈSðñ ô ˆIð —'’'Õ-Õ.GÈ×IdÒIdÑIfÔIfÑgÔgÑhÔhÐhÐhÐhÐhÐhÐhÐhàŸš™œ�?�?�?�?�?�?ˆDÝ-¨dÑ3Ô3‰KˆB�Ø×Ò˜RÕ!;Ñ<Ô<Ð<ÝÔ.×9Ò9¸'ÑBÔBˆCØ×Ò˜SÔ1°4Ñ8Ô8Ð8Ø×Ò˜sœ~¨qÑ1Ô1Ð1õ !Ô6Ø¨cÀðñ ô ˆGð —'’'Õ-Õ.DÀg×F_ÒF_ÑFaÔFaÑbÔbÑcÔcÐcÐcÐcÐcÐcÐcÐcàŸWšW™YœY������ˆHÝ"5°hÑ"?Ô"?ÑˆF�KØ×Ò˜VÕ%8Ñ9Ô9Ð9Ý"Ô1×<Ò<¸[ÑIÔIˆHØ×Ò˜XÔ5°qÑ9Ô9Ð9ð5	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:ð 	:ð 	:s   ¯G'H)È)
H3È6H3c              ƒ   óv  K  — d| j         › d| j        › �}t          j        |¦  «        4 ƒd{V —†}|                     ¦   «         ƒ d{V —† t          j        ddd¬¦  «        }|                     t          t          | 
                    ¦   «         ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}t          |¦  «        \  }}|                      |t          ¦  «         t
          j                             |¦  «        }|                      |j        d¦  «         |                      |j        d	¦  «         t%          j        d
dd¬¦  «        }|                     t          t(          | 
                    ¦   «         ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}	t          |	¦  «        \  }
}|                      |
t(          ¦  «         t$          j                             |¦  «        }|                      |j        d¦  «         ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )z:Verifies EnterZoneRequest and ChatMessage binary dispatch.rP   rQ   NÚ1001Úportal_sanctuaryr+   )Ú	player_idÚ	portal_idÚplayer_levelÚzone_boundless_sanctuaryg      ™@rT   ÚExilezSavage exile martial path)Ú	sender_idÚsender_nameÚraw_content)r   r   rY   rZ   r[   r   ÚEnterZoneRequestr`   r   r   ra   r   r.   r   ÚZoneInfoPayloadre   Úzone_idÚbounds_widthr   ÚChatMessager   rš   )r'   rj   rk   Úzone_reqr‡   rˆ   ro   Ú	zone_infoÚchat_reqÚ	resp_chatÚop_chatÚpayload_chatÚchat_ress                r   Ú&test_websocket_zone_and_chat_roundtripz<TestWsProtobufGateway.test_websocket_zone_and_chat_roundtrip¨   sã  è è € à-�d”iÐ-Ð- $¤)Ð-Ð-ˆÝÔ% cÑ*Ô*ð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	P¨bØ—'’'‘)”)ˆOˆOˆOˆOˆOˆOˆOõ $Ô4Ø Ð,>ÈQðñ ô ˆHð —'’'Õ-Õ.GÈ×IcÒIcÑIeÔIeÑfÔfÑgÔgÐgÐgÐgÐgÐgÐgÐgàŸš™œ�?�?�?�?�?�?ˆDÝ-¨dÑ3Ô3‰KˆB�Ø×Ò˜RÕ!1Ñ2Ô2Ð2Ý$Ô4×?Ò?ÀÑHÔHˆIØ×Ò˜YÔ.Ð0JÑKÔKÐKØ×Ò˜YÔ3°VÑ<Ô<Ð<õ  Ô+Ø¨GÐA\ðñ ô ˆHð —'’'Õ-Õ.AÀ8×C]ÒC]ÑC_ÔC_Ñ`Ô`ÑaÔaÐaÐaÐaÐaÐaÐaÐaà Ÿgšg™iœi˜˜˜˜˜˜ˆIÝ$7¸	Ñ$BÔ$BÑ!ˆG�\Ø×Ò˜WÕ&9Ñ:Ô:Ð:ÝÔ+×6Ò6°|ÑDÔDˆHØ×Ò˜XÔ1Ð3NÑOÔOÐOð5	Pð 	Pð 	Pñ 	Pô 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pøøøð 	Pð 	Pð 	Pð 	Pð 	Pð 	Ps   ¯G&H(È(
H2È5H2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¦  «         |                     t          j        d
ddœ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}t          j        |¦  «        }|  	                    | 
                    d¦  «        d¦  «         |                      | 
                    d¦  «        ¦  «         ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )zEVerifies legacy text JSON frames continue to work without regression.rP   rQ   NÚpingg    €‡Ã@)rR   Ú	client_tsrR   Úpongrª   Úauth_simulatorÚDEV_SIMULATOR_TOKEN_VALID)rR   ÚtokenÚauth_resultÚ
authorized)r   r   rY   rZ   r[   r`   r\   Údumpsr]   r.   r^   rC   )r'   rj   rk   Úpong_rawr«   Úauth_rawÚauths          r   Ú&test_websocket_legacy_json_diagnosticsz<TestWsProtobufGateway.test_websocket_legacy_json_diagnosticsÇ   sJ  è è € à-�d”iÐ-Ð- $¤)Ð-Ð-ˆÝÔ% cÑ*Ô*ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4¨bØ—'’'‘)”)ˆOˆOˆOˆOˆOˆOˆOð —'’'�$œ*¨fÀ6Ð%JÐ%JÑKÔKÑLÔLÐLÐLÐLÐLÐLÐLÐLØŸWšW™YœY������ˆHÝ”:˜hÑ'Ô'ˆDØ×Ò˜TŸXšX fÑ-Ô-¨vÑ6Ô6Ð6Ø×Ò˜TŸXšX kÑ2Ô2°FÑ;Ô;Ð;ð —'’'�$œ*Ð.>ÐIdÐ%eÐ%eÑfÔfÑgÔgÐgÐgÐgÐgÐgÐgÐgØŸWšW™YœY������ˆHÝ”:˜hÑ'Ô'ˆDØ×Ò˜TŸXšX fÑ-Ô-¨}Ñ=Ô=Ð=Ø�OŠO˜DŸHšH \Ñ2Ô2Ñ3Ô3Ð3ð	4ð 	4ð 	4ñ 	4ô 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4øøøð 	4ð 	4ð 	4ð 	4ð 	4ð 	4s   ¯E:F<Æ<
GÇ	Gc              ƒ   óÒ  K  — d| j         › d| j        › �}t          j        |¦  «        4 ƒd{V —†}|                     ¦   «         ƒ d{V —† t          j        ddd¬¦  «        }|                     t          t          | 
                    ¦   «         ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}t          |¦  «        \  }}|                      |t          ¦  «         t
          j                             |¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         t!          j        dd	¬
¦  «        }|                     t          t$          | 
                    ¦   «         ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}	t          |	¦  «        \  }
}|                      |
t$          ¦  «         t           j                             |¦  «        }|                      |j        d¦  «         |                     t          t(          d¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}t          |¦  «        \  }}|                      |t          ¦  «         t
          j                             |¦  «        }|                      |j        d¦  «         ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )zIVerifies PacketEnvelope, ZonePortalData, and AuthRequest binary handling.rP   rQ   Né*   iè  s   nonce_123456)Úsequence_numberÚtimestamp_msÚnonceÚportal_boss_1Úzone_boss_chamber)r”   Útarget_zone_idr    s   AUTH_SIMULATOR_TOKEN_VALID)r   r   rY   rZ   r[   r   ÚPacketEnveloper`   r   r	   ra   r   r.   re   r¸   rº   r   ÚZonePortalDatar   r”   r   Úencrypted_payload)r'   rj   rk   Úenv_reqÚresp_envÚop_envÚpayload_envÚenv_ackÚportalÚresp_pÚop_pÚ	payload_pÚ
portal_ackÚ	resp_authÚop_authÚpayload_authÚauth_acks                    r   Ú-test_websocket_envelope_portal_auth_roundtripzCTestWsProtobufGateway.test_websocket_envelope_portal_auth_roundtripÛ   sq  è è € à-�d”iÐ-Ð- $¤)Ð-Ð-ˆÝÔ% cÑ*Ô*ð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	X¨bØ—'’'‘)”)ˆOˆOˆOˆOˆOˆOˆOõ "Ô0ÀÐRVÐ^mÐnÑnÔnˆGØ—'’'Õ-Õ.DÀg×F_ÒF_ÑFaÔFaÑbÔbÑcÔcÐcÐcÐcÐcÐcÐcÐcØŸWšW™YœY������ˆHÝ"5°hÑ"?Ô"?ÑˆF�KØ×Ò˜VÕ%;Ñ<Ô<Ð<Ý!Ô0×;Ò;¸KÑHÔHˆGØ×Ò˜WÔ4°bÑ9Ô9Ð9Ø×Ò˜Wœ]¨OÑ<Ô<Ð<õ "Ô0¸?Ð[nÐoÑoÔoˆFØ—'’'Õ-Õ.EÀv×G_ÒG_ÑGaÔGaÑbÔbÑcÔcÐcÐcÐcÐcÐcÐcÐcØŸ7š7™9œ9�_�_�_�_�_�_ˆFÝ1°&Ñ9Ô9‰OˆD�)Ø×Ò˜TÕ#:Ñ;Ô;Ð;Ý%Ô4×?Ò?À	ÑJÔJˆJØ×Ò˜ZÔ1°?ÑCÔCÐCð —'’'Õ-Õ.AÀ3ÑGÔGÑHÔHÐHÐHÐHÐHÐHÐHÐHØ Ÿgšg™iœi˜˜˜˜˜˜ˆIÝ$7¸	Ñ$BÔ$BÑ!ˆG�\Ø×Ò˜WÕ&<Ñ=Ô=Ð=Ý"Ô1×<Ò<¸\ÑJÔJˆHØ×Ò˜XÔ7Ð9VÑWÔWÐWð9	Xð 	Xð 	Xñ 	Xô 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xøøøð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xs   ¯JKË
K Ë#K c              ƒ   ó¸  K  — d| j         › d| j        › �}t          j        |¦  «        4 ƒd{V —†}|                     ¦   «         ƒ d{V —† t          j        dddd¬¦  «        }|                     t          t          | 
                    ¦   «         ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}t          |¦  «        \  }}t
          j                             |¦  «        }|                      |j        dd¬	¦  «         |                      |j        dd¬	¦  «         |                      |j        d¦  «         t          j        dd
d
d¬¦  «        }|                     t          t          | 
                    ¦   «         ¦  «        ¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —†}	t          |	¦  «        \  }}
t
          j                             |
¦  «        }|                      |j        d
¦  «         |                      |j        d
¦  «         |                      |j        d¦  «         ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )zJVerifies diagonal move normalized velocity and instant zero-residual stop.rP   rQ   Ni¹  gà-� æ?r+   rU   gö(\�Âõ@r;   r9   r*   r   )r   r   rY   rZ   r[   r   r_   r`   r   r   ra   r   rd   re   rB   ri   rf   r.   rg   )r'   rj   rk   Údiag_msgÚ	resp_diagÚ_Úpayload_diagÚ	snap_diagrq   Ú	resp_stoprt   ru   s               r   Ú.test_websocket_zero_residual_momentum_diagonalzDTestWsProtobufGateway.test_websocket_zero_residual_momentum_diagonalü   sÔ  è è € à-�d”iÐ-Ð- $¤)Ð-Ð-ˆÝÔ% cÑ*Ô*ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;¨bØ—'’'‘)”)ˆOˆOˆOˆOˆOˆOˆOå"Ô2¸TÈÐW]ÐnoÐpÑpÔpˆHØ—'’'Õ-Õ.FÈ×HbÒHbÑHdÔHdÑeÔeÑfÔfÐfÐfÐfÐfÐfÐfÐfØ Ÿgšg™iœi˜˜˜˜˜˜ˆIÝ1°)Ñ<Ô<‰OˆAˆ|Ý#Ô2×=Ò=¸lÑKÔKˆIØ×"Ò" 9Ô#7¸ÀaÐ"ÑHÔHÐHØ×"Ò" 9Ô#7¸ÀaÐ"ÑHÔHÐHØ×Ò˜YÔ6¸Ñ:Ô:Ð:õ #Ô2¸TÈÐTWÐhiÐjÑjÔjˆHØ—'’'Õ-Õ.FÈ×HbÒHbÑHdÔHdÑeÔeÑfÔfÐfÐfÐfÐfÐfÐfÐfØ Ÿgšg™iœi˜˜˜˜˜˜ˆIÝ1°)Ñ<Ô<‰OˆAˆ|Ý#Ô2×=Ò=¸lÑKÔKˆIØ×Ò˜YÔ1°3Ñ7Ô7Ð7Ø×Ò˜YÔ1°3Ñ7Ô7Ð7Ø×Ò˜YÔ6¸Ñ:Ô:Ð:ð)	;ð 	;ð 	;ñ 	;ô 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;øøøð 	;ð 	;ð 	;ð 	;ð 	;ð 	;s   ¯HI	É	
IÉIN)Ú__name__Ú
__module__Ú__qualname__Úclassmethodr   r$   r(   r6   rN   rv   r�   r§   rµ   rÏ   r×   © r    r   r   r   #   sÚ   € € € € € Øð&ð &ñ „[ð&ð ð%ð %ñ „[ð%ð,ð ,ð ,ð
)ð )ð )ð 1ð 1ð 1ð6(Dð (Dð (DðT:ð :ð :ð>Pð Pð Pð>4ð 4ð 4ð(Xð Xð XðB;ð ;ð ;ð ;ð ;r    r   Ú__main__)+Ú__doc__ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arÚasyncior\   ÚosÚsysÚunittestÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__rY   Úgateway.ws_gateway_bridger   r   r   r   r   r   r	   r
   r   r   r   r   r   r   Úprotor   r   r   r   ÚIsolatedAsyncioTestCaser   rØ   ÚmainrÜ   r    r   ú<module>ró      sÉ  ððð ð € € € € € € € € € € € € €€€€Ø €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \à Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð  BÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ AÐ Aðp;ð p;ð p;ð p;ð p;˜HÔ<ñ p;ô p;ð p;ðf ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr    