
    1ia                    v   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.m/Z/ ej`                  d	        Z1ej`                  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< G d d       Z=ej|                  j                   G d! d"             Z?ej|                  j                   G d# d$             Z@ej|                  j                   G d% d&             ZAy)'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EventLogMessage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        P/home/nelsen/Projects/kognitive/orchestrator/src/edge_proxy/tests/test_client.pyclient_configr(   5   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_waypointN   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fastr3   r4   r5   r7   r8   r;   r<   Nr=   r>   posexythetarA   )r   to_poserC   rD   rE   rF   rG   rH   rI   s           r'   test_to_posez TestNavigateCommand.test_to_poseY   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slowr3   r4   r5   r7   r8   r;   r<   Nr=   r>   relative	directiondistancerA   )r   to_relativerC   rD   rE   rF   rG   rH   rI   s           r'   test_to_relativez$TestNavigateCommand.test_to_relativef   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__rR   r^   rh   r%   r&   r'   r.   r.   K   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   r5   )zC%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s()
}.port
} == %(py7)sr   py0py2r:   py7assert %(py9)spy9N)
r   r"   rD   rE   @py_builtinslocals_should_repr_global_namerF   rG   rH   )rJ   @py_assert1rN   @py_assert6@py_assert5@py_format8@py_format10s          r'   test_default_portz*TestClientConfigDefaults.test_default_portt   s    ~*~""*d*"d****"d******|***|***~***"***d*******r&   N)ri   rj   rk   r~   r%   r&   r'   rn   rn   s   s    +r&   rn   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)r3   r=   reasonr3   cancel_navigationr5   r7   r8   r;   r<   Nr=   r   )	r   r   CANCEL_NAVIGATIONrC   rD   rE   rF   rG   rH   rI   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ri   rj   rk   rl   r   r%   r&   r'   r   r   y   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)r3   r=   r3   	get_stater5   r7   r8   r;   r<   Nr=   )	r   r   	GET_STATErC   rD   rE   rF   rG   rH   rI   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_statusr1   
navigatingr0   ?   )r3   r=   statusdestinationprogresseta_secr5   z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)smsgrq   rr   py5assert %(py7)srs   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   rD   rE   rv   rw   rx   rF   rG   rH   r   r   r   rJ   rL   r   ry   @py_assert4rN   @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   r1   failedobstacle_detectedNAV_BLOCKED)r3   r=   r   r   
error_coder5   r   r   r   r   rs   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   rD   rE   rv   rw   rx   rF   rG   rH   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)ri   rj   rk   rl   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;mArT   rU   rV   rZ   r[   r\   
near_lobbyU   Flevelchargingr   r   r0   )r3   	timestamprY   locationbattery	nav_statenav_progressnav_destinationr5   )z1%(py2)s
{%(py2)s = %(py0)s.timestamp
} == %(py5)sstater   r   rs   N)zC%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.pose
}.x
} == %(py7)srp   rt   ru   )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   rD   rE   rv   rw   rx   rF   rG   rH   rY   rZ   r[   r\   r   r   r   r   r   r   r   )rJ   rL   r   ry   r   rN   r   r|   rz   r{   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)ri   rj   rk   rl   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_listr0           r   r@   rZ   r[   r\   checkpoint_1g      @       @rV   r3   	waypoints   r5   zO%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.waypoints
})
} == %(py8)slenr   rq   r9   py3r   py8assert %(py10)spy10N)z,%(py3)s
{%(py3)s = %(py1)s.name
} == %(py6)sr9   r   r<   assert %(py8)sr      )r   r   r   r   rD   rE   rv   rw   rx   rF   rG   rH   r@   )rJ   rL   r   rO   r   @py_assert7rz   @py_format9@py_format11rM   r{   rQ   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ri   rj   rk   rl   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.errorr1   waypoint_not_foundz+Waypoint 'unknown_location' not in registryr3   r=   r   messager5   )z2%(py2)s
{%(py2)s = %(py0)s.request_id
} == %(py5)serrr   r   rs   Nz-%(py2)s
{%(py2)s = %(py0)s.error
} == %(py5)s)z/%(py2)s
{%(py2)s = %(py0)s.message
} == %(py5)s)r   r   r=   rD   rE   rv   rw   rx   rF   rG   rH   r   r   )rJ   rL   r   ry   r   rN   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r3   r   r5   z-%(py2)s
{%(py2)s = %(py0)s.state
} == %(py5)sr   r   r   rs   N)r   r   r   rD   rE   rv   rw   rx   rF   rG   rH   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
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   r1   arrivedr>   )r3   r=   r   r   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer   r   rq   r9   rr   r:   Nr5   r   r   r   rs   )r   r   r   rv   rw   rD   rx   rF   rG   rH   r   rE   	rJ   rL   r   rN   rP   ry   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      mAra   r   r   r   homeZ   Fr   r3   r   rY   r   r   r   r   r   r   r   Nr5   r   r   r   rs   )r   r   r   rv   rw   rD   rx   rF   rG   rH   r   rE   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   wp1ra   r   r   r   r   r   r   r   r   r   Nr   r5   r   r   r   r   r   )r   r   r   rv   rw   rD   rx   rF   rG   rH   r   r   rE   )rJ   rL   r   rN   rP   rO   r   r   rz   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   Nr5   r   r   r   rs   )r   r   r   rv   rw   rD   rx   rF   rG   rH   r   rE   r   s	            r'   test_parse_errorz%TestParseEdgeMessage.test_parse_error2  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   Nr5   r   r   r   rs   )r   r   r   rv   rw   rD   rx   rF   rG   rH   r   rE   r   s	            r'   test_parse_pongz$TestParseEdgeMessage.test_parse_pong?  s   0 &#{++++++++z+++z++++++#+++#++++++{+++{++++++++++yy"F"yF""""yF""""""s"""s"""y"""F"""""""r&   c           	        ddddddddd	i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}}|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 parsing event_log replay message.	event_logzedge-1r   r1   r   r   Tr   NAV_LOCALIZATION_LOSTr3   event_id
event_typer=   r   r   replaypayloadr   r   r   r   r   Nr5   )z0%(py2)s
{%(py2)s = %(py0)s.event_id
} == %(py5)sr   r   rs   r   )z.%(py2)s
{%(py2)s = %(py0)s.replay
} is %(py5)s)r   r   r   rv   rw   rD   rx   rF   rG   rH   r  rE   r
  r   s	            r'   test_parse_event_logz)TestParseEdgeMessage.test_parse_event_logG  s      &#%$&=>	
 !&#////////z///z//////#///#///////////////////||'x'|x''''|x''''''s'''s'''|'''x'''''''zz!T!zT!!!!zT!!!!!!s!!!s!!!z!!!T!!!!!!!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.r3   unknown_typeNr   )z%(py0)s is %(py3)sr   rq   r   assert %(py5)sr   )	r   rD   rE   rv   rw   rx   rF   rG   rH   )rJ   rL   r   rO   ry   @py_format4r   s          r'   test_parse_unknown_typez,TestParseEdgeMessage.test_parse_unknown_typeY  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   )rJ   rL   s     r'   test_parse_missing_typez,TestParseEdgeMessage.test_parse_missing_type`  s8    &!]]:-CD 	%t$	% 	% 	%s   5>N)ri   rj   rk   rl   r   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   r5   zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.config
}.host
} == %(py7)sr,   rp   rt   ru   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   rs   )r	   r+   r!   rD   rE   rv   rw   rx   rF   rG   rH   r"   r#   ping_intervalis_connected)
rJ   r,   ry   rN   rz   r{   r|   r}   r   r   s
             r'   test_init_default_configz0TestEdgeProxyClientInit.test_init_default_configp  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*   r5   r  r,   rp   rt   ru   Nr  )r   r	   r+   r!   rD   rE   rv   rw   rx   rF   rG   rH   r"   )	rJ   r+   r,   ry   rN   rz   r{   r|   r}   s	            r'   test_init_custom_configz/TestEdgeProxyClientInit.test_init_custom_configz  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)ri   rj   rk   rl   r"  r$  r%   r&   r'   r  r  m  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,   rq   rr   )r   connectr!  rv   rw   rD   rx   rF   rG   rH   
disconnect)rJ   r,   r0  ry   @py_format3s        r'   test_connect_successz2TestEdgeProxyClientConnection.test_connect_success  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   r3  r4  N)r   r  r  r   r8  )rJ   r,   r?  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'   r0  zCTestEdgeProxyClientConnection.test_disconnect.<locals>.mock_connect  r1  r2  r3  r4  Nr6  r,   r7  Fr   r  r   r   rs   )r   r8  r!  rv   rw   rD   rx   rF   rG   rH   r9  rE   )	rJ   r,   r0  ry   r:  r   rN   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)ri   rj   rk   rl   r;  r@  rC  r%   r&   r'   r&  r&    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'   r0  zMTestEdgeProxyClientCommands.test_send_navigate_waypoint.<locals>.mock_connect       N   r3  r4  N	waypoint1r1   rX   r   r3   r4   r5   r7   r8   r;   r<   r=   r>   r?   r@   rA   )r   r+  sendr   r8  send_navigate_waypointjsonloads	call_argsrD   rE   rF   rG   rH   
rJ   r,   r0  	sent_datarM   rN   rO   rP   rQ   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rH  r%   r,  s     r'   r0  zITestEdgeProxyClientCommands.test_send_navigate_pose.<locals>.mock_connect  rI  rJ  r3  r4  NrT   rU   rV   rW   r   r>   r3   rY   r5   r7   r8   r;   r<   rZ   r[   r\   )r   r+  rL  r   r8  send_navigate_poserN  rO  rP  rD   rE   rF   rG   rH   rQ  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rH  r%   r,  s     r'   r0  zMTestEdgeProxyClientCommands.test_send_navigate_relative.<locals>.mock_connect  rI  rJ  r3  r4  Nr`   ra   r   r>   r3   rd   r5   r7   r8   r;   r<   re   rf   rA   rc   )r   r+  rL  r   r8  send_navigate_relativerN  rO  rP  rD   rE   rF   rG   rH   rQ  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rH  r%   r,  s     r'   r0  zMTestEdgeProxyClientCommands.test_send_cancel_navigation.<locals>.mock_connect  rI  rJ  r3  r4  Nr   r   r   r3   r   r5   r7   r8   r;   r<   r=   r   )r   r+  rL  r   r8  send_cancel_navigationrN  rO  rP  rD   rE   rF   rG   rH   rQ  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rH  r%   r,  s     r'   r0  zETestEdgeProxyClientCommands.test_send_get_state.<locals>.mock_connect  rI  rJ  r3  r4  Nr   r   r3   r   r5   r7   r8   r;   r<   r=   )r   r+  rL  r   r8  send_get_staterN  rO  rP  rD   rE   rF   rG   rH   rQ  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rH  r%   r,  s     r'   r0  z@TestEdgeProxyClientCommands.test_send_ping.<locals>.mock_connect  rI  rJ  r3  r4  Nr   r3   pingr5   r7   r8   r;   r<   )r   r+  rL  r   r8  	send_pingrN  rO  rP  rD   rE   rF   rG   rH   rQ  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  rK  N)r  r  r   rM  )rJ   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)ri   rj   rk   rl   rS  rW  r[  r_  rc  rh  rj  r%   r&   r'   rE  rE    s(    A0(6&0&5$:"/ =r&   rE  c                  @    e Zd 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 rH  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'   r0  zITestEdgeProxyClientHandlers.test_nav_status_handler.<locals>.mock_connect3  r1  r2  r3  r4  Nr   r1   r   r>   ra   r3   r=   r   r   r   r   r5   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   rq  rq   r9   r   r<   r   r   r   )z.%(py3)s
{%(py3)s = %(py1)s.status
} == %(py6)sr   )on_nav_statusr   r8  rN  dumps_handle_messager9  r   rD   rE   rv   rw   rx   rF   rG   rH   r   )rJ   r,   rr  r0  r   rO   r{   r   rQ   r   rM   rq  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 rH  ro  )r   received_statess    r'   handle_robot_statezPTestEdgeProxyClientHandlers.test_robot_state_handler.<locals>.handle_robot_stateM  s    ""5)r&   c                 0   K   t               }d|_        |S wr)  r*  r,  s      r'   r0  zJTestEdgeProxyClientHandlers.test_robot_state_handler.<locals>.mock_connectQ  r1  r2  r3  r4  Nr   r   ra   r   r   r   	waypoint3K   Fr   r   r   r5   ru  r   r}  rv  r   r   r   )zJ%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.battery
}.level
} == %(py8)s)r9   r   r   r   r   r   )on_robot_stater   r8  rN  rx  ry  r9  r   rD   rE   rv   rw   rx   rF   rG   rH   r   r   )rJ   r,   r~  r0  r   rO   r{   r   rQ   r   rM   r   rz   r   r}  s                 @r'   test_robot_state_handlerz4TestEdgeProxyClientHandlers.test_robot_state_handlerI  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 rH  ro  )r   received_listss    r'   handle_waypoint_listzTTestEdgeProxyClientHandlers.test_waypoint_list_handler.<locals>.handle_waypoint_listk      !!#&r&   c                 0   K   t               }d|_        |S wr)  r*  r,  s      r'   r0  zLTestEdgeProxyClientHandlers.test_waypoint_list_handler.<locals>.mock_connecto  r1  r2  r3  r4  Nr   r   ra   r   r   r   wp2g      @g      @r   r   r5   ru  r   r  rv  r   r   r   r   )zO%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py2)s.waypoints
})
} == %(py9)s)rq   rr   r:   r<   ru   zassert %(py11)spy11)on_waypoint_listr   r8  rN  rx  ry  r9  r   rD   rE   rv   rw   rx   rF   rG   rH   r   )rJ   r,   r  r0  r   rO   r{   r   rQ   r   ry   rN   @py_assert8r   r}   @py_format12r  s                   @r'   test_waypoint_list_handlerz6TestEdgeProxyClientHandlers.test_waypoint_list_handlerg  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 rH  ro  )r   received_errorss    r'   handle_errorzDTestEdgeProxyClientHandlers.test_error_handler.<locals>.handle_error  s    ""3'r&   c                 0   K   t               }d|_        |S wr)  r*  r,  s      r'   r0  zDTestEdgeProxyClientHandlers.test_error_handler.<locals>.mock_connect  r1  r2  r3  r4  Nr   r   r   r   r   r   r5   ru  r   r  rv  r   r   r   )z-%(py3)s
{%(py3)s = %(py1)s.error
} == %(py6)sr   )on_errorr   r8  rN  rx  ry  r9  r   rD   rE   rv   rw   rx   rF   rG   rH   r   )rJ   r,   r  r0  r   rO   r{   r   rQ   r   rM   r  s              @r'   test_error_handlerz.TestEdgeProxyClientHandlers.test_error_handler  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 rH  ro  )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'   r0  zCTestEdgeProxyClientHandlers.test_pong_handler.<locals>.mock_connect  r1  r2  r3  r4  Nr   r   r   r   r5   ru  r   r  rv  r   r   r   )z-%(py3)s
{%(py3)s = %(py1)s.state
} == %(py6)sr   )on_pongr   r8  rN  rx  ry  r9  r   rD   rE   rv   rw   rx   rF   rG   rH   r   )rJ   r,   r  r0  r   rO   r{   r   rQ   r   rM   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 rH  ro  )	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'   r0  zPTestEdgeProxyClientHandlers.test_connection_change_handler.<locals>.mock_connect  r1  r2  r3  r4  NTFr5   )z%(py0)s == %(py3)sr  r  r  r   )on_connection_changer   r8  r9  rD   rE   rv   rw   rx   rF   rG   rH   )	rJ   r,   r  r0  rO   ry   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sleeprp  r   receiveds    r'   rr  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'   r0  zDTestEdgeProxyClientHandlers.test_async_handler.<locals>.mock_connect  r1  r2  r3  r4  Nr   r1   r   r>   g      ?rt  r   r5   ru  r   r  rv  r   r   )rw  r   r8  rN  rx  ry  r9  r   rD   rE   rv   rw   rx   rF   rG   rH   )rJ   r,   rr  r0  r   rO   r{   r   rQ   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>c                  K   g |j                   fd       }d }t        j                  ddddddd	d
did      }t        d|      5  |j	                          d{    |j                  |       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 7 # 1 sw Y   xY ww)z.Repeated event_id should only be handled once.c                (    j                  |        y rH  ro  r  s    r'   handle_event_logzaTestEdgeProxyClientHandlers.test_event_log_handler_deduplicates_replays.<locals>.handle_event_log  s    OOC r&   c                 0   K   t               }d|_        |S wr)  r*  r,  s      r'   r0  z]TestEdgeProxyClientHandlers.test_event_log_handler_deduplicates_replays.<locals>.mock_connect  r1  r2  r  zedge-123r   r1   r   r   Tr   localization_unavailabler  r3  r4  Nr   r5   ru  r   r  rv  r   r   r   )z0%(py3)s
{%(py3)s = %(py1)s.event_id
} == %(py6)sr   )on_event_logrN  rx  r   r8  ry  r9  r   rD   rE   rv   rw   rx   rF   rG   rH   r  )rJ   r,   r  r0  r  rO   r{   r   rQ   r   rM   r  s              @r'   +test_event_log_handler_deduplicates_replayszGTestEdgeProxyClientHandlers.test_event_log_handler_deduplicates_replays  s    				! 
	!	
 **#&*'")$&@A	
 '\B 	&.."""((111((111##%%%		& 8}!!}!!!!}!!!!!!s!!!s!!!!!!8!!!8!!!}!!!!!!!!!!{1{##1z1#z1111#z111{111#111z1111111 #11%		& 	&sg   AJ
I4I(I47I+8I4I.I4(I1)I4-F;J(I4+I4.I41I44I>9JN)ri   rj   rk   rl   rz  r  r  r  r  r  r  r  r%   r&   r'   rl  rl  '  s-    @8<6<5<8:16(&"<!2r&   rl  )Brl   
__future__r   builtinsrv   _pytest.assertion.rewrite	assertionrewriterD   r  rN  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   r   fixturer(   r,   r.   rn   r   r   r   r   r   r   r   r   r  markr&  rE  rl  r%   r&   r'   <module>r     s   #     
  * H~''*t9CHHHHOOAs4y!     4   1 1%' %'P+ +, ,"	1 	1!/ !/H0 0:7 7&L L$# #^% ^%L* *6 $0 $0 $0N s= s= s=l g2 g2 g2r&   