
    iZ                    r   d Z ddlm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mZ ddlmZmZ ddlZ ee      j'                         j(                  d   Z ee      ej.                  vr"ej.                  j1                  d ee             ddlmZmZmZm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,m-Z-m.Z. ej^                  d	        Z0ej^                  d
        Z1 G d d      Z2 G d d      Z3 G d d      Z4 G d d      Z5 G d d      Z6 G d d      Z7 G d d      Z8 G d d      Z9 G d d      Z: G d d      Z; G d d       Z<ejz                  j                   G d! d"             Z>ejz                  j                   G d# d$             Z?ejz                  j                   G d% d&             Z@y)'zTests for Edge Proxy WebSocket client.

Tests follow the Edge Proxy Design spec at:
/home/nelsen/Projects/HRI/docs/plans/2026-02-04-edge-proxy-design.md
    )annotationsN)Path)	AsyncMockpatch   )ClientConfigEdgeProxyClientEdgeProxyClientErrorEdgeProxyConnectionError)BatteryCancelNavigationCommandErrorMessageGetStateCommandMessageTypeNavigateCommand	NavStatusNavErrorCodeNavStatusMessagePongMessagePose
RobotStateSpeedWaypointWaypointListMessageparse_edge_messagec                      t        dddd      S )z#Create a test client configuration.	localhost  /edgeF)hostportws_path	reconnect)r        J/home/nelsen/Projects/HRI/orchestrator/src/edge_proxy/tests/test_client.pyclient_configr'   4   s     	 r%   c                    t        |       S )zCreate a test client instance.config)r	   )r'   s    r&   clientr+   ?   s     -00r%   c                  "    e Zd ZdZd Zd Zd Zy)TestNavigateCommandz>Test NavigateCommand message creation (Spec: Section 4.1-4.3).c                ^   t        j                  ddd      }|j                         }|d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}y)z*Test creating waypoint navigation command.lobbynav_001normaltypenavigate==z%(py1)s == %(py4)spy1py4assert %(py6)spy6N
request_idgoalwaypointnamespeed)r   to_waypointto_dict
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationselfcmddata@py_assert0@py_assert3@py_assert2@py_format5@py_format7s           r&   test_to_waypointz$TestNavigateCommand.test_to_waypointM   s   ))'9hG{{}F|)z)|z))))|z)))|)))z)))))))L!.Y.!Y....!Y...!...Y.......F|F#1z1#z1111#z111#111z1111111F|F#.w.#w....#w...#...w.......G}((}((((}(((}((((((((((r%   c                n   t        j                  ddddd      }|j                         }|d   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd	||f      t        j
                  |      t        j
                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y)z&Test creating pose navigation command.@@Q?nav_002fastr2   r3   r4   r6   r7   r:   r;   Nr<   r=   posexythetar@   )r   to_poserB   rC   rD   rE   rF   rG   rH   s           r&   test_to_posez TestNavigateCommand.test_to_poseX   sk   %%c3iH{{}F|)z)|z))))|z)))|)))z)))))))L!.Y.!Y....!Y...!...Y.......F|F#-v-#v----#v---#---v-------F|C 'C' C'''' C''' '''C'''''''F|C 'C' C'''' C''' '''C'''''''F|G$,,$,,,,$,,,$,,,,,,,,,,G}&&}&&&&}&&&}&&&&&&&&&&r%   c                f   t        j                  dddd      }|j                         }|d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}y)z*Test creating relative navigation command.forward      ?nav_003slowr2   r3   r4   r6   r7   r:   r;   Nr<   r=   relative	directiondistancer@   )r   to_relativerB   rC   rD   rE   rF   rG   rH   s           r&   test_to_relativez$TestNavigateCommand.test_to_relativee   s   )))S)VL{{}F|)z)|z))))|z)))|)))z)))))))L!.Y.!Y....!Y...!...Y.......F|F#1z1#z1111#z111#111z1111111F|K(5I5(I5555(I555(555I5555555F|J'.3.'3....'3...'...3.......G}&&}&&&&}&&&}&&&&&&&&&&r%   N)__name__
__module____qualname____doc__rQ   r]   rg   r$   r%   r&   r-   r-   J   s    H	)'
'r%   r-   c                      e Zd Zd Zy)TestClientConfigDefaultsc                   t               }|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}y)	zCDefault port should match the robot-side Edge Proxy server default.r   r4   )zC%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s()
}.port
} == %(py7)sr   py0py2r9   py7assert %(py9)spy9N)
r   r!   rC   rD   @py_builtinslocals_should_repr_global_namerE   rF   rG   )rI   @py_assert1rM   @py_assert6@py_assert5@py_format8@py_format10s          r&   test_default_portz*TestClientConfigDefaults.test_default_ports   s    ~*~""*d*"d****"d******|***|***~***"***d*******r%   N)rh   ri   rj   r}   r$   r%   r&   rm   rm   r   s    +r%   rm   c                      e Zd ZdZd Zy)TestCancelNavigationCommandz1Test CancelNavigationCommand (Spec: Section 4.4).c                \   t        t        j                  dd      }|j                         }|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}}|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}}|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}}y)z6Test converting CancelNavigationCommand to dictionary.
cancel_001barge_in)r2   r<   reasonr2   cancel_navigationr4   r6   r7   r:   r;   Nr<   r   )	r   r   CANCEL_NAVIGATIONrB   rC   rD   rE   rF   rG   rH   s           r&   test_to_dictz(TestCancelNavigationCommand.test_to_dict{   s   %..#

 {{}F|222|22222|2222|22222222222L!1\1!\1111!\111!111\1111111H~++~++++~+++~++++++++++r%   Nrh   ri   rj   rk   r   r$   r%   r&   r   r   x   s
    ;,r%   r   c                      e Zd ZdZd Zy)TestGetStateCommandz)Test GetStateCommand (Spec: Section 4.5).c                Z   t        t        j                  d      }|j                         }|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd	|iz  }t        t	        j                  |            d
x}x}}y
)z.Test converting GetStateCommand to dictionary.	state_001)r2   r<   r2   	get_stater4   r6   r7   r:   r;   Nr<   )	r   r   	GET_STATErB   rC   rD   rE   rF   rG   rH   s           r&   r   z TestGetStateCommand.test_to_dict   s    ;#8#8[Q{{}F|*{*|{****|{***|***{*******L!0[0![0000![000!000[0000000r%   Nr   r$   r%   r&   r   r      s
    31r%   r   c                      e Zd ZdZd Zd Zy)TestNavStatusMessagez2Test NavStatusMessage parsing (Spec: Section 5.1).c                   ddddddd}t        j                  |      }|j                  }d}||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)z'Test parsing navigating status message.
nav_statusr0   
navigatingr/   ?   )r2   r<   statusdestinationprogresseta_secr4   z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)smsgrp   rq   py5assert %(py7)srr   N)z3%(py2)s
{%(py2)s = %(py0)s.destination
} == %(py5)s)z0%(py2)s
{%(py2)s = %(py0)s.progress
} == %(py5)s)z/%(py2)s
{%(py2)s = %(py0)s.eta_sec
} == %(py5)s)r   	from_dictr   rC   rD   ru   rv   rw   rE   rF   rG   r   r   r   rI   rK   r   rx   @py_assert4rM   @py_format6r{   s           r&   test_from_dict_navigatingz.TestNavStatusMessage.test_from_dict_navigating   s    !#""
 ((.zz)\)z\))))z\))))))s)))s)))z)))\))))))))')'))))'))))))s)))s))))))')))))))||#t#|t####|t######s###s###|###t#######{{ b {b    {b      s   s   {   b       r%   c                   dddddd}t        j                  |      }|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }t        t        j                  |            dx}x}}y)z3Test parsing failed status message with error code.r   r0   failedobstacle_detectedNAV_BLOCKED)r2   r<   r   r   
error_coder4   r   r   r   r   rr   N)z.%(py2)s
{%(py2)s = %(py0)s.reason
} == %(py5)s)z2%(py2)s
{%(py2)s = %(py0)s.error_code
} == %(py5)s)r   r   r   rC   rD   ru   rv   rw   rE   rF   rG   r   r   r   s           r&   test_from_dict_failedz*TestNavStatusMessage.test_from_dict_failed   sw    !#)'
 ((.zz%X%zX%%%%zX%%%%%%s%%%s%%%z%%%X%%%%%%%zz000z00000z0000000s000s000z00000000000~~..~....~......s...s...~..........r%   N)rh   ri   rj   rk   r   r   r$   r%   r&   r   r      s    <!"/r%   r   c                      e Zd ZdZd Zy)TestRobotStatez,Test RobotState parsing (Spec: Section 5.2).c           	     D   ddddddddd	d
dddd}t        j                  |      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }|j                  }d}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }
t        t        j                  |
            dx}x}x}	}|j                  }|j                  }d}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }
t        t        j                  |
            dx}x}x}	}|j                  }|j                  }d}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }
t        t        j                  |
            dx}x}x}	}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                   }|j"                  }d}||k(  }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }
t        t        j                  |
            dx}x}x}	}|j                   }|j$                  }d	}||u }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }
t        t        j                  |
            dx}x}x}	}|j&                  }d}||k(  }|st        j                  d|fd ||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j(                  }d}||k(  }|st        j                  d|fd!||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j*                  }d}||k(  }|st        j                  d|fd"||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)#z&Test parsing full robot state message.robot_stateg;mArS   rT   rU   rY   rZ   r[   
near_lobbyU   Flevelchargingr   r   r/   )r2   	timestamprX   locationbattery	nav_statenav_progressnav_destinationr4   )z1%(py2)s
{%(py2)s = %(py0)s.timestamp
} == %(py5)sstater   r   rr   N)zC%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.pose
}.x
} == %(py7)sro   rs   rt   )zC%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.pose
}.y
} == %(py7)s)zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.pose
}.theta
} == %(py7)sz0%(py2)s
{%(py2)s = %(py0)s.location
} == %(py5)s)zJ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.battery
}.level
} == %(py7)sis)zM%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.battery
}.charging
} is %(py7)s)z1%(py2)s
{%(py2)s = %(py0)s.nav_state
} == %(py5)s)z4%(py2)s
{%(py2)s = %(py0)s.nav_progress
} == %(py5)s)z7%(py2)s
{%(py2)s = %(py0)s.nav_destination
} == %(py5)s)r   r   r   rC   rD   ru   rv   rw   rE   rF   rG   rX   rY   rZ   r[   r   r   r   r   r   r   r   )rI   rK   r   rx   r   rM   r   r{   ry   rz   r|   s              r&   test_from_dict_fullz"TestRobotState.test_from_dict_full   s     "'C$7$!#7% &	
 $$T*0.0.0000.000000u000u000000.0000000zz"z||"s"|s""""|s""""""u"""u"""z"""|"""s"""""""zz"z||"s"|s""""|s""""""u"""u"""z"""|"""s"""""""zz'z'4'4''''4''''''u'''u'''z''''''4'''''''~~--~----~------u---u---~----------}}(}""(b("b(((("b((((((u(((u(((}((("(((b(((((((}}.}%%..%....%......u...u...}...%...........,.,....,......u...u......,.......!!)T)!T))))!T))))))u)))u)))!)))T)))))))$$//$////$//////u///u///$//////////r%   N)rh   ri   rj   rk   r   r$   r%   r&   r   r      s
    60r%   r   c                      e Zd ZdZd Zy)TestWaypointListMessagez5Test WaypointListMessage parsing (Spec: Section 5.3).c                f   dddddddddd	dgd
}t        j                  |      }|j                  }t        |      }d}||k(  }|s
t	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}x}}|j                  d   }	|	j                  }d}
||
k(  }|st	        j
                  d|fd||
f      t	        j                  |	      t	        j                  |      t	        j                  |
      dz  }dd|iz  }t        t	        j                  |            dx}	x}x}}
|j                  d   }	|	j                  }d}
||
k(  }|st	        j
                  d|fd||
f      t	        j                  |	      t	        j                  |      t	        j                  |
      dz  }dd|iz  }t        t	        j                  |            dx}	x}x}}
y)z#Test parsing waypoint list message.waypoint_listr/           r   r?   rY   rZ   r[   checkpoint_1g      @       @rU   r2   	waypoints   r4   zO%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.waypoints
})
} == %(py8)slenr   rp   r8   py3r   py8assert %(py10)spy10N)z,%(py3)s
{%(py3)s = %(py1)s.name
} == %(py6)sr8   r   r;   assert %(py8)sr      )r   r   r   r   rC   rD   ru   rv   rw   rE   rF   rG   r?   )rI   rK   r   rN   r   @py_assert7ry   @py_format9@py_format11rL   rz   rP   s               r&   test_from_dictz&TestWaypointListMessage.test_from_dict   s    $ sqA'cdK
 "++D1==&s=!&Q&!Q&&&&!Q&&&&&&s&&&s&&&&&&3&&&3&&&=&&&!&&&Q&&&&&&&}}Q/$$//$////$//////$//////////}}Q6$$66$6666$666666$6666666666r%   Nrh   ri   rj   rk   r   r$   r%   r&   r   r      s
    ?7r%   r   c                      e Zd ZdZd Zy)TestErrorMessagez.Test ErrorMessage parsing (Spec: Section 5.4).c                   ddddd}t        j                  |      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}y)Test parsing error message.errorr0   waypoint_not_foundz+Waypoint 'unknown_location' not in registryr2   r<   r   messager4   )z2%(py2)s
{%(py2)s = %(py0)s.request_id
} == %(py5)serrr   r   rr   Nz-%(py2)s
{%(py2)s = %(py0)s.error
} == %(py5)s)z/%(py2)s
{%(py2)s = %(py0)s.message
} == %(py5)s)r   r   r<   rC   rD   ru   rv   rw   rE   rF   rG   r   r   )rI   rK   r   rx   r   rM   r   r{   s           r&   r   zTestErrorMessage.test_from_dict   sx    #)D	
 $$T*~~**~****~******s***s***~**********yy000y00000y0000000s000s000y00000000000{{KKK{KKKKK{KKKKKKKsKKKsKKK{KKKKKKKKKKKr%   Nr   r$   r%   r&   r   r      s    8Lr%   r   c                      e Zd ZdZd Zy)TestPongMessagez-Test PongMessage parsing (Spec: Section 5.5).c                   ddd}t        j                  |      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}y
)Test parsing pong message.pongidler2   r   r4   z-%(py2)s
{%(py2)s = %(py0)s.state
} == %(py5)sr   r   r   rr   N)r   r   r   rC   rD   ru   rv   rw   rE   rF   rG   r   s           r&   r   zTestPongMessage.test_from_dict   s    0##D)yy"F"yF""""yF""""""s"""s"""y"""F"""""""r%   Nr   r$   r%   r&   r   r      s
    7#r%   r   c                  :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestParseEdgeMessagez!Test parse_edge_message function.c                   ddddd}t        |      }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndd	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }t        t        j                  |            d}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)z Test parsing nav_status message.r   r0   arrivedr=   )r2   r<   r   r   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer   r   rp   r8   rq   r9   Nr4   r   r   r   rr   )r   r   r   ru   rv   rC   rw   rE   rF   rG   r   rD   	rI   rK   r   rM   rO   rx   r   r   r{   s	            r&   test_parse_nav_statusz*TestParseEdgeMessage.test_parse_nav_status	  s    !#!	
 !&#/00000000z000z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00zz&Y&zY&&&&zY&&&&&&s&&&s&&&z&&&Y&&&&&&&r%   c                   ddddddddd	d
d}t        |      }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)z!Test parsing robot_state message.r      mAr`   r   r   r   homeZ   Fr   r2   r   rX   r   r   r   r   r   r   r   Nr4   r   r   r   rr   )r   r   r   ru   rv   rC   rw   rE   rF   rG   r   rD   r   s	            r&   test_parse_robot_statez+TestParseEdgeMessage.test_parse_robot_state  s'    "%C#6!#7
 !&#z********z***z******#***#******z***z**********||%v%|v%%%%|v%%%%%%s%%%s%%%|%%%v%%%%%%%r%   c                   ddddddgd}t        |      }t        |t              }|sdd	t        j                         v st        j                  t              rt        j                  t              nd	d
t        j                         v st        j                  |      rt        j                  |      nd
dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}|j                  }t        |      }d}||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndd
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}x}}y)z#Test parsing waypoint_list message.r   wp1r`   r   r   r   r   r   r   r   r   r   Nr   r4   r   r   r   r   r   )r   r   r   ru   rv   rC   rw   rE   rF   rG   r   r   rD   )rI   rK   r   rM   rO   rN   r   r   ry   r   r   s              r&   test_parse_waypoint_listz-TestParseEdgeMessage.test_parse_waypoint_list$  sZ    $SsSA
 !&#233333333z333z333333#333#333333233323333333333==&s=!&Q&!Q&&&&!Q&&&&&&s&&&s&&&&&&3&&&3&&&=&&&!&&&Q&&&&&&&r%   c                   ddddd}t        |      }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndd	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }t        t        j                  |            d}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)r   r   req_001
test_errorTest error messager   r   r   r   r   r   Nr4   r   r   r   rr   )r   r   r   ru   rv   rC   rw   rE   rF   rG   r   rD   r   s	            r&   test_parse_errorz%TestParseEdgeMessage.test_parse_error1  s    #!+	
 !&#|,,,,,,,,z,,,z,,,,,,#,,,#,,,,,,|,,,|,,,,,,,,,,yy(L(yL((((yL((((((s(((s(((y(((L(((((((r%   c                   ddd}t        |      }t        |t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d	}|j                  }d}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)r   r   r   r   r   r   r   r   r   Nr4   r   r   r   rr   )r   r   r   ru   rv   rC   rw   rE   rF   rG   r   rD   r   s	            r&   test_parse_pongz$TestParseEdgeMessage.test_parse_pong>  s   0 &#{++++++++z+++z++++++#+++#++++++{+++{++++++++++yy"F"yF""""yF""""""s"""s"""y"""F"""""""r%   c                l   ddi}t        |      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            dx}}y)
z/Test parsing unknown message type returns None.r2   unknown_typeNr   )z%(py0)s is %(py3)sr   rp   r   assert %(py5)sr   )	r   rC   rD   ru   rv   rw   rE   rF   rG   )rI   rK   r   rN   rx   @py_format4r   s          r&   test_parse_unknown_typez,TestParseEdgeMessage.test_parse_unknown_typeF  sn    ' &sd{sdssdr%   c                    ddi}t        j                  t        d      5  t        |       ddd       y# 1 sw Y   yxY w)z4Test parsing message without type raises ValueError.r   r   zMissing 'type' fieldmatchN)pytestraises
ValueErrorr   )rI   rK   s     r&   test_parse_missing_typez,TestParseEdgeMessage.test_parse_missing_typeM  s8    &!]]:-CD 	%t$	% 	% 	%s   5>N)rh   ri   rj   rk   r   r   r   r   r  r  r  r$   r%   r&   r   r     s(    +'&')#%r%   r   c                      e Zd ZdZd Zd Zy)TestEdgeProxyClientInitz$Test EdgeProxyClient initialization.c                   t               }|j                  }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }|j                  }d	}||k(  }|st        j                  d|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }t        t        j                  |            dx}x}}y)z/Test client initialization with default config.r   r4   zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.config
}.host
} == %(py7)sr+   ro   rs   rt   Nr   zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.config
}.port
} == %(py7)sr   )zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.config
}.ws_path
} == %(py7)sg      $@)zQ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.config
}.ping_interval
} == %(py7)sFr   z4%(py2)s
{%(py2)s = %(py0)s.is_connected
} is %(py5)sr   r   rr   )r	   r*   r    rC   rD   ru   rv   rw   rE   rF   rG   r!   r"   ping_intervalis_connected)
rI   r+   rx   rM   ry   rz   r{   r|   r   r   s
             r&   test_init_default_configz0TestEdgeProxyClientInit.test_init_default_config]  s    "}}0}!!0[0![0000![000000v000v000}000!000[0000000}})}!!)T)!T))))!T))))))v)))v)))})))!)))T)))))))}}/}$$//$////$//////v///v///}///$//////////}}2}**2d2*d2222*d222222v222v222}222*222d2222222""+e+"e++++"e++++++v+++v+++"+++e+++++++r%   c                   t        dd      }t        |      }|j                  }|j                  }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}x}}|j                  }|j                  }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }d	d
|iz  }t        t	        j                  |            dx}x}x}}y)z.Test client initialization with custom config.zrobot.locali(#  )r    r!   r)   r4   r  r+   ro   rs   rt   Nr  )r   r	   r*   r    rC   rD   ru   rv   rw   rE   rF   rG   r!   )	rI   r*   r+   rx   rM   ry   rz   r{   r|   s	            r&   test_init_custom_configz/TestEdgeProxyClientInit.test_init_custom_configg  s$   =t< /}}2}!!2]2!]2222!]222222v222v222}222!222]2222222}})}!!)T)!T))))!T))))))v)))v)))})))!)))T)))))))r%   N)rh   ri   rj   rk   r  r  r$   r%   r&   r  r  Z  s    .,*r%   r  c                  "    e Zd ZdZd Zd Zd Zy)TestEdgeProxyClientConnectionz)Test EdgeProxyClient connection handling.c                  K   d }t        d|      5  |j                          d{    |j                  }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d}|j                          d{    ddd       y7 7 # 1 sw Y   yxY ww)zTest successful connection.c                 0   K   t               }d|_        |S wNFr   closedargskwargsmock_wss      r&   mock_connectzHTestEdgeProxyClientConnection.test_connect_success.<locals>.mock_connect{       kG"GNN   websockets.connectside_effectN0assert %(py2)s
{%(py2)s = %(py0)s.is_connected
}r+   rp   rq   )r   connectr  ru   rv   rC   rw   rE   rF   rG   
disconnect)rI   r+   r&  rx   @py_format3s        r&   test_connect_successz2TestEdgeProxyClientConnection.test_connect_successy  s     	
 '\B 	&.."""&&&&&&&&&6&&&6&&&&&&&&&&##%%%	& 	&"%	& 	&s?   C&CCB CC	C	C&CCC#C&c                   K   d }t        d|      5  t        j                  t              5  |j	                          d{    ddd       ddd       y7 # 1 sw Y   xY w# 1 sw Y   yxY ww)z*Test connection failure without reconnect.c                     K   t        d      w)NzConnection refused)OSError)r#  r$  s     r&   mock_connect_failzZTestEdgeProxyClientConnection.test_connect_failure_no_reconnect.<locals>.mock_connect_fail  s     .//s   r)  r*  N)r   r  r  r   r.  )rI   r+   r5  s      r&   !test_connect_failure_no_reconnectz?TestEdgeProxyClientConnection.test_connect_failure_no_reconnect  sh     	0 '5FG 	'78 'nn&&&'	' 	'&' '	' 	'sE   A1A%AAAA%	A1AA"	A%%A.*A1c                `  K   d }t        d|      5  |j                          d{    |j                  }|syddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d}|j                          d{    |j                  }d}||u }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}ddd       y7 v7 # 1 sw Y   yxY ww)zTest disconnection.c                 0   K   t               }d|_        |S wr  r   r"  s      r&   r&  zCTestEdgeProxyClientConnection.test_disconnect.<locals>.mock_connect  r'  r(  r)  r*  Nr,  r+   r-  Fr   r  r   r   rr   )r   r.  r  ru   rv   rC   rw   rE   rF   rG   r/  rD   )	rI   r+   r&  rx   r0  r   rM   r   r{   s	            r&   test_disconnectz-TestEdgeProxyClientConnection.test_disconnect  s    	
 '\B 	0.."""&&&&&&&&&6&&&6&&&&&&&&&&##%%%&&/%/&%////&%//////6///6///&///%///////	0 	0" &		0 	0s@   F.F"FB F"F 	CF"	F.F" F""F+'F.N)rh   ri   rj   rk   r1  r6  r9  r$   r%   r&   r  r  u  s    3
&'0r%   r  c                  :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestEdgeProxyClientCommandsz7Test EdgeProxyClient command sending (Spec: Section 4).c                x  	K   t               	d	_        t               	_        	fd}t        d|      5  |j	                          d{    |j                  ddd       d{    t        j                  	j                  j                  d	   d	         }|d
   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d
   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}ddd       y7 7 # 1 sw Y   yxY ww)z)Test sending waypoint navigation command.Fc                    K   S wNr$   r"  s     r&   r&  zMTestEdgeProxyClientCommands.test_send_navigate_waypoint.<locals>.mock_connect       N   r)  r*  N	waypoint1r0   rW   r   r2   r3   r4   r6   r7   r:   r;   r<   r=   r>   r?   r@   )r   r!  sendr   r.  send_navigate_waypointjsonloads	call_argsrC   rD   rE   rF   rG   
rI   r+   r&  	sent_datarL   rM   rN   rO   rP   r%  s
            @r&   test_send_navigate_waypointz7TestEdgeProxyClientCommands.test_send_navigate_waypoint  s?    + {	 '\B 		0.."""//YOOO

7<<#9#9!#<Q#?@IV$2
2$
2222$
222$222
2222222\*7i7*i7777*i777*777i7777777V$V,:
:,
::::,
:::,:::
:::::::V$V,;;,;;;;,;;;,;;;;;;;;;;W%//%////%///%//////////		0 		0"O		0 		0sA   3L:L.
L(L.%L+&J9L.	L:(L.+L..L73L:c                  	K   t               	d	_        t               	_        	fd}t        d|      5  |j	                          d{    |j                  dddd	       d{    t        j                  	j                  j                  d
   d
         }|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}ddd       y7 e7 L# 1 sw Y   yxY ww)z%Test sending pose navigation command.Fc                    K   S wr>  r$   r"  s     r&   r&  zITestEdgeProxyClientCommands.test_send_navigate_pose.<locals>.mock_connect  r?  r@  r)  r*  NrS   rT   rU   rV   r   r=   r2   rX   r4   r6   r7   r:   r;   rY   rZ   r[   )r   r!  rB  r   r.  send_navigate_poserD  rE  rF  rC   rD   rE   rF   rG   rG  s
            @r&   test_send_navigate_posez3TestEdgeProxyClientCommands.test_send_navigate_pose  s    + {	 '\B 	6.."""++CdIFFF

7<<#9#9!#<Q#?@IV$V,66,6666,666,6666666666V$S)0S0)S0000)S000)000S0000000V$S)0S0)S0000)S000)000S0000000V$W-55-5555-555-5555555555	6 	6"F	6 	6sA   3KJ5
J/J5&J2'H?J5&	K/J52J55J>:Kc                |  	K   t               	d	_        t               	_        	fd}t        d|      5  |j	                          d{    |j                  dd       d{    t        j                  	j                  j                  d   d         }|d	   d
   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d	   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d	   d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}ddd       y7 `7 I# 1 sw Y   yxY ww)z)Test sending relative navigation command.Fc                    K   S wr>  r$   r"  s     r&   r&  zMTestEdgeProxyClientCommands.test_send_navigate_relative.<locals>.mock_connect  r?  r@  r)  r*  Nr_   r`   r   r=   r2   rc   r4   r6   r7   r:   r;   rd   re   r@   rb   )r   r!  rB  r   r.  send_navigate_relativerD  rE  rF  rC   rD   rE   rF   rG   rG  s
            @r&   test_send_navigate_relativez7TestEdgeProxyClientCommands.test_send_navigate_relative  s    + {	 '\B 	0.."""//	3???

7<<#9#9!#<Q#?@IV$V,:
:,
::::,
:::,:::
:::::::V$[1>Y>1Y>>>>1Y>>>1>>>Y>>>>>>>V$Z07C70C77770C7770777C7777777W%//%////%///%//////////	0 	0"?	0 	0sA   3J<J0
J*J0$J-%H<J0!	J<*J0-J00J95J<c                j  	K   t               	d	_        t               	_        	fd}t        d|      5  |j	                          d{    |j                  dd       d{    t        j                  	j                  j                  d   d         }|d	   }d
}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}ddd       y7 7 # 1 sw Y   yxY ww)z'Test sending cancel navigation command.Fc                    K   S wr>  r$   r"  s     r&   r&  zMTestEdgeProxyClientCommands.test_send_cancel_navigation.<locals>.mock_connect  r?  r@  r)  r*  Nr   r   r   r2   r   r4   r6   r7   r:   r;   r<   r   )r   r!  rB  r   r.  send_cancel_navigationrD  rE  rF  rC   rD   rE   rF   rG   rG  s
            @r&   test_send_cancel_navigationz7TestEdgeProxyClientCommands.test_send_cancel_navigation  s    + {	 '\B 	5.."""//jIII

7<<#9#9!#<Q#?@IV$;(;;$(;;;;;$(;;;;$;;;(;;;;;;;;\*:l:*l::::*l:::*:::l:::::::X&4*4&*4444&*444&444*4444444	5 	5"I	5 	5sA   3H3H'
H!H'$H$%F3H'	H3!H'$H''H0,H3c                h  	K   t               	d	_        t               	_        	fd}t        d|      5  |j	                          d{    |j                  d       d{    t        j                  	j                  j                  d   d         }|d   }d	}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}ddd       y7 V7 @# 1 sw Y   yxY ww)zTest sending get_state command.Fc                    K   S wr>  r$   r"  s     r&   r&  zETestEdgeProxyClientCommands.test_send_get_state.<locals>.mock_connect  r?  r@  r)  r*  Nr   r   r2   r   r4   r6   r7   r:   r;   r<   )r   r!  rB  r   r.  send_get_staterD  rE  rF  rC   rD   rE   rF   rG   rG  s
            @r&   test_send_get_statez/TestEdgeProxyClientCommands.test_send_get_state  s;    + {	 '\B 	:.."""''444

7<<#9#9!#<Q#?@IV$33$3333$333$3333333333\*9k9*k9999*k999*999k9999999	: 	:"4	: 	:sA   3F2F&
F F&#F#$D3F&	F2 F&#F&&F/+F2c                b  	K   t               	d	_        t               	_        	fd}t        d|      5  |j	                          d{    |j                          d{    t        j                  	j                  j                  d   d         }|d   }d}||k(  }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}ddd       y7 7 # 1 sw Y   yxY ww)zTest sending ping command.Fc                    K   S wr>  r$   r"  s     r&   r&  z@TestEdgeProxyClientCommands.test_send_ping.<locals>.mock_connect  r?  r@  r)  r*  Nr   r2   pingr4   r6   r7   r:   r;   )r   r!  rB  r   r.  	send_pingrD  rE  rF  rC   rD   rE   rF   rG   rG  s
            @r&   test_send_pingz*TestEdgeProxyClientCommands.test_send_ping  s     + {	 '\B 	/.."""""$$$

7<<#9#9!#<Q#?@IV$..$....$...$..........	/ 	/"$	/ 	/sA   3D/D#
DD#"D!#B3D#	D/D#!D##D,(D/c                   K   t        j                  t        d      5  |j                  d       d{    ddd       y7 # 1 sw Y   yxY ww)zDTest that sending when disconnected raises EdgeProxyConnectionError.zNot connectedr
  rA  N)r  r  r   rC  )rI   r+   s     r&   "test_send_when_disconnected_raisesz>TestEdgeProxyClientCommands.test_send_when_disconnected_raises  sF     ]]3?K 	=//<<<	= 	=<	= 	=s+   AAAA	AAAAN)rh   ri   rj   rk   rI  rM  rQ  rU  rY  r^  r`  r$   r%   r&   r;  r;    s(    A0(6&0&5$:"/ =r%   r;  c                  :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestEdgeProxyClientHandlersz6Test EdgeProxyClient event handlers (Spec: Section 5).c           	       K   g |j                   fd       }d }t        d|      5  |j                          d{    t        j                  dddd	d
d      }|j                  |       d{    |j                          d{    ddd       t              }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}d   }
|
j                   }d}||k(  }|st        j                  d|fd||f      t        j                  |
      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}
x}x}}y7 7 7 # 1 sw Y   xY ww)zTest nav_status event handler.c                (    j                  |        y r>  append)r   received_messagess    r&   handle_nav_statuszNTestEdgeProxyClientHandlers.test_nav_status_handler.<locals>.handle_nav_status  s    $$S)r%   c                 0   K   t               }d|_        |S wr  r   r"  s      r&   r&  zITestEdgeProxyClientHandlers.test_nav_status_handler.<locals>.mock_connect   r'  r(  r)  r*  Nr   r0   r   r=   r`   r2   r<   r   r   r   r   r4   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   rg  rp   r8   r   r;   r   r   r   )z.%(py3)s
{%(py3)s = %(py1)s.status
} == %(py6)sr   )on_nav_statusr   r.  rD  dumps_handle_messager/  r   rC   rD   ru   rv   rw   rE   rF   rG   r   )rI   r+   rh  r&  r   rN   rz   r   rP   r   rL   rg  s              @r&   test_nav_status_handlerz3TestEdgeProxyClientHandlers.test_nav_status_handler  s    				* 
	*	
 '\B 	&.."""jj$'#%" G ((111##%%%	& $%**%****%******s***s******$***$***%********** #7#**7i7*i7777*i777#777*777i7777777 # 2%	& 	&sQ   'I II
3I2I3I
IIF;I 
IIIII c           
       K   g |j                   fd       }d }t        d|      5  |j                          d{    t        j                  dddd	d
dddddd      }|j                  |       d{    |j                          d{    ddd       t              }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}d   }
|
j                   }|j"                  }d}||k(  }|st        j                  d|fd||f      t        j                  |
      t        j                  |      t        j                  |      t        j                  |      dz  }	dd|	iz  }t        t        j                  |            dx}
x}x}x}}y7 57 7 # 1 sw Y   xY ww)zTest robot_state event handler.c                (    j                  |        y r>  re  )r   received_statess    r&   handle_robot_statezPTestEdgeProxyClientHandlers.test_robot_state_handler.<locals>.handle_robot_state:  s    ""5)r%   c                 0   K   t               }d|_        |S wr  r   r"  s      r&   r&  zJTestEdgeProxyClientHandlers.test_robot_state_handler.<locals>.mock_connect>  r'  r(  r)  r*  Nr   r   r`   r   r   r   	waypoint3K   Fr   r   r   r4   rk  r   rs  rl  r   r   r   )zJ%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.battery
}.level
} == %(py8)s)r8   r   r   r   r   r   )on_robot_stater   r.  rD  rn  ro  r/  r   rC   rD   ru   rv   rw   rE   rF   rG   r   r   )rI   r+   rt  r&  r   rN   rz   r   rP   r   rL   r   ry   r   rs  s                 @r&   test_robot_state_handlerz4TestEdgeProxyClientHandlers.test_robot_state_handler6  s    				* 
	*	
 '\B 	&.."""jj%)!c:'%'U;" G ((111##%%%	& ?#(q(#q((((#q((((((s(((s((((((?(((?(((#(((q(((((((q!5!))5)//525/25555/2555!555)555/555255555555 # 2%	& 	&sQ   'J	I<I3:I<9I6:I<I9I<GJ	3I<6I<9I<<JJ	c           
       K   g |j                   fd       }d }t        d|      5  |j                          d{    t        j                  dddd	d
ddddd
dgd      }|j                  |       d{    |j                          d{    ddd       t              }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}d   }
|
j                   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |
      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}x}x}}y7 7 E7 0# 1 sw Y   0xY ww)z!Test waypoint_list event handler.c                (    j                  |        y r>  re  )r   received_listss    r&   handle_waypoint_listzTTestEdgeProxyClientHandlers.test_waypoint_list_handler.<locals>.handle_waypoint_listX      !!#&r%   c                 0   K   t               }d|_        |S wr  r   r"  s      r&   r&  zLTestEdgeProxyClientHandlers.test_waypoint_list_handler.<locals>.mock_connect\  r'  r(  r)  r*  Nr   r   r`   r   r   r   wp2g      @g      @r   r   r4   rk  r   r|  rl  r   r   r   r   )zO%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py2)s.waypoints
})
} == %(py9)s)rp   rq   r9   r;   rt   zassert %(py11)spy11)on_waypoint_listr   r.  rD  rn  ro  r/  r   rC   rD   ru   rv   rw   rE   rF   rG   r   )rI   r+   r}  r&  r   rN   rz   r   rP   r   rx   rM   @py_assert8r   r|   @py_format12r|  s                   @r&   test_waypoint_list_handlerz6TestEdgeProxyClientHandlers.test_waypoint_list_handlerT  s    		 	 	' 
!	'	
 '\B 	&.."""jj'"3E"3E" G ((111##%%%	& >"'a'"a''''"a''''''s'''s''''''>'''>'''"'''a'''''''!!$4$..4s./414/14444/1444444s444s444$444.444/444144444444 # 2%	& 	&sQ   'KKJ=<K;K <KKKH%K=K KKKKc                  K   g |j                   fd       }d }t        d|      5  |j                          d{    t        j                  dddd	d
      }|j                  |       d{    |j                          d{    ddd       t              }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}d   }
|
j                   }d}||k(  }|st        j                  d|fd||f      t        j                  |
      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}
x}x}}y7 7 7 # 1 sw Y   xY ww)zTest error event handler.c                (    j                  |        y r>  re  )r   received_errorss    r&   handle_errorzDTestEdgeProxyClientHandlers.test_error_handler.<locals>.handle_errorv  s    ""3'r%   c                 0   K   t               }d|_        |S wr  r   r"  s      r&   r&  zDTestEdgeProxyClientHandlers.test_error_handler.<locals>.mock_connectz  r'  r(  r)  r*  Nr   r   r   r   r   r   r4   rk  r   r  rl  r   r   r   )z-%(py3)s
{%(py3)s = %(py1)s.error
} == %(py6)sr   )on_errorr   r.  rD  rn  ro  r/  r   rC   rD   ru   rv   rw   rE   rF   rG   r   )rI   r+   r  r&  r   rN   rz   r   rP   r   rL   r  s              @r&   test_error_handlerz.TestEdgeProxyClientHandlers.test_error_handlerr  s    		( 
	(	
 '\B 	&.."""jj'%/	" G ((111##%%%	& ?#(q(#q((((#q((((((s(((s((((((?(((?(((#(((q(((((((q!7!''7<7'<7777'<777!777'777<7777777 # 2%	& 	&sQ   'III	2I1I2I	I
IF;I	IIIIIc                  K   g |j                   fd       }d }t        d|      5  |j                          d{    t        j                  ddd      }|j                  |       d{    |j                          d{    ddd       t              }d	}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}d   }
|
j                   }d}||k(  }|st        j                  d
|fd||f      t        j                  |
      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}
x}x}}y7 	7 7 # 1 sw Y   xY ww)zTest pong event handler.c                (    j                  |        y r>  re  )r   received_pongss    r&   handle_pongzBTestEdgeProxyClientHandlers.test_pong_handler.<locals>.handle_pong  r~  r%   c                 0   K   t               }d|_        |S wr  r   r"  s      r&   r&  zCTestEdgeProxyClientHandlers.test_pong_handler.<locals>.mock_connect  r'  r(  r)  r*  Nr   r   r   r   r4   rk  r   r  rl  r   r   r   )z-%(py3)s
{%(py3)s = %(py1)s.state
} == %(py6)sr   )on_pongr   r.  rD  rn  ro  r/  r   rC   rD   ru   rv   rw   rE   rF   rG   r   )rI   r+   r  r&  r   rN   rz   r   rP   r   rL   r  s              @r&   test_pong_handlerz-TestEdgeProxyClientHandlers.test_pong_handler  s    		' 
	'	
 '\B 		&.."""jj" G
 ((111##%%%		& >"'a'"a''''"a''''''s'''s''''''>'''>'''"'''a'''''''a 0 &&0&0&&0000&&000 000&000&0000000 # 2%		& 		&sQ   'III0I/I
0IIIF;II
IIIIc                <  K   g |j                   fd       }d }t        d|      5  |j                          d{    |j                          d{    ddd       ddg}|k(  }|st	        j
                  d|fd	|f      d
t        j                         v st	        j                        rt	        j                        nd
t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}}y7 7 # 1 sw Y   xY ww)z%Test connection state change handler.c                (    j                  |        y r>  re  )	connectedchangess    r&   handle_connection_changez\TestEdgeProxyClientHandlers.test_connection_change_handler.<locals>.handle_connection_change  s    NN9%r%   c                 0   K   t               }d|_        |S wr  r   r"  s      r&   r&  zPTestEdgeProxyClientHandlers.test_connection_change_handler.<locals>.mock_connect  r'  r(  r)  r*  NTFr4   )z%(py0)s == %(py3)sr  r  r  r   )on_connection_changer   r.  r/  rC   rD   ru   rv   rw   rE   rF   rG   )	rI   r+   r  r&  rN   rx   r  r   r  s	           @r&   test_connection_change_handlerz:TestEdgeProxyClientHandlers.test_connection_change_handler  s     		$	$	& 
%	&	
 '\B 	&.."""##%%%	&  -'w-''''w-''''''w'''w'''-''''''' #%	& 	&s?   'DDDDDDB1DDDDDc           	       
K   g 
|j                   
fd       }d }t        d|      5  |j                          d{    t        j                  dddd	d
d      }|j                  |       d{    |j                          d{    ddd       t        
      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  
      rt        j                  
      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y7 j7 97 $# 1 sw Y   $xY ww)zTest async event handler.c                n   K   t        j                  d       d {    j                  |        y 7 w)Nr   )asynciosleeprf  )r   receiveds    r&   rh  zITestEdgeProxyClientHandlers.test_async_handler.<locals>.handle_nav_status  s*     --"""OOC  #s   535c                 0   K   t               }d|_        |S wr  r   r"  s      r&   r&  zDTestEdgeProxyClientHandlers.test_async_handler.<locals>.mock_connect  r'  r(  r)  r*  Nr   r0   r   r=   g      ?rj  r   r4   rk  r   r  rl  r   r   )rm  r   r.  rD  rn  ro  r/  r   rC   rD   ru   rv   rw   rE   rF   rG   )rI   r+   rh  r&  r   rN   rz   r   rP   r   r  s             @r&   test_async_handlerz.TestEdgeProxyClientHandlers.test_async_handler  sB    				! 
	!	
 '\B 	&.."""jj$'&%" G ((111##%%%	& 8}!!}!!!!}!!!!!!s!!!s!!!!!!8!!!8!!!}!!!!!!!!!! # 2%	& 	&sQ   'F>F1F(3F12F+3F1
F.F1DF>(F1+F1.F11F;6F>N)rh   ri   rj   rk   rp  ry  r  r  r  r  r  r$   r%   r&   rb  rb    s(    @8<6<5<8:16(&"r%   rb  )Ark   
__future__r   builtinsru   _pytest.assertion.rewrite	assertionrewriterC   r  rD  syspathlibr   unittest.mockr   r   r  __file__resolveparentsROOTstrpathinsertsrc.edge_proxy.clientr   r	   r
   r   src.edge_proxy.messagesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   fixturer'   r+   r-   rm   r   r   r   r   r   r   r   r   r  markr  r;  rb  r$   r%   r&   <module>r     s   #     
  * H~''*t9CHHHHOOAs4y!     2   1 1%' %'P+ +, ,"	1 	1!/ !/H0 0:7 7&L L$# #L% L%h* *6 $0 $0 $0N s= s= s=l D" D" D"r%   