
    7iP                       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
mZ ddlmZmZmZ ddlZddlmZmZmZmZ ddlmZmZm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             Z ej:                  j                   G d d             Z!y)zTests for ActionExecutor Edge Proxy integration.

Tests for the integration between ActionExecutor and Edge Proxy WebSocket client.
    )annotationsN)Path)	AsyncMock	MagicMockpatch)ActionExecutorExecutionReportNavStateNavigationContext)NavStatusMessage
RobotStateErrorMessagec                      e Zd ZdZd Zy)TestNavStatezTest NavState enum.c                	   t         j                  }|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}}t         j                  }|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}}t         j                  }|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}}t         j                  }|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}}t         j                  }|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)z+Test NavState enum has all required values.accepted==)zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.ACCEPTED
}.value
} == %(py7)sr
   py0py2py4py7assert %(py9)spy9N
navigating)zM%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.NAVIGATING
}.value
} == %(py7)sarrived)zJ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.ARRIVED
}.value
} == %(py7)sfailed)zI%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.FAILED
}.value
} == %(py7)s	cancelled)zL%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.CANCELLED
}.value
} == %(py7)s)r
   ACCEPTEDvalue
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation
NAVIGATINGARRIVEDFAILED	CANCELLED)self@py_assert1@py_assert3@py_assert6@py_assert5@py_format8@py_format10s          ^/home/nelsen/Projects/kognitive/orchestrator/src/executor/tests/test_edge_proxy_integration.pytest_nav_state_valuesz"TestNavState.test_nav_state_values#   s     4 &&4*4&*4444&*444444x444x444 444&444*4444444""8"((8L8(L8888(L888888x888x888"888(888L88888882%%22%2222%222222x222x222222%22222222220$$00$0000$000000x000x000000$0000000000!!6!''6;6';6666';666666x666x666!666'666;6666666    N)__name__
__module____qualname____doc__r6    r7   r5   r   r       s
    7r7   r   c                      e Zd ZdZd Zd Zy)TestNavigationContextz!Test NavigationContext dataclass.c                L
   t        ddd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}||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                  }t        j                  }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              nd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}||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 creating NavigationContext.nav_001lobbynormal      ?
request_iddestinationspeedstatusprogressr   )z2%(py2)s
{%(py2)s = %(py0)s.request_id
} == %(py5)sctxr   r   py5assert %(py7)sr   N)z3%(py2)s
{%(py2)s = %(py0)s.destination
} == %(py5)s)z-%(py2)s
{%(py2)s = %(py0)s.speed
} == %(py5)s)zN%(py2)s
{%(py2)s = %(py0)s.status
} == %(py6)s
{%(py6)s = %(py4)s.NAVIGATING
}r
   )r   r   r   py6assert %(py8)spy8)z0%(py2)s
{%(py2)s = %(py0)s.progress
} == %(py5)sis)z-%(py2)s
{%(py2)s = %(py0)s.error
} is %(py5)s)r   r
   r*   rE   r"   r#   r$   r%   r&   r'   r(   r)   rF   rG   rH   rI   error)
r.   rJ   r/   @py_assert4r0   @py_format6r3   r2   @py_format7@py_format9s
             r5    test_navigation_context_creationz6TestNavigationContext.test_navigation_context_creation0   s    &&
 ~~**~****~******s***s***~**********)')'))))'))))))s)))s))))))')))))))yy$H$yH$$$$yH$$$$$$s$$$s$$$y$$$H$$$$$$$zz0X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0X000X00000000000||"s"|s""""|s""""""s"""s"""|"""s"""""""yy D yD    yD      s   s   y   D       r7   c                   t        dddt        j                  d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 NavigationContext with error.nav_002goalfastg333333?obstacle_detected)rE   rF   rG   rH   rI   rS   r   )z-%(py2)s
{%(py2)s = %(py0)s.error
} == %(py5)srJ   rK   rM   r   N)r   r
   r,   rS   r"   r#   r$   r%   r&   r'   r(   r)   )r.   rJ   r/   rT   r0   rU   r3   s          r5   "test_navigation_context_with_errorz8TestNavigationContext.test_navigation_context_with_error@   s     ??%
 yy///y/////y///////s///s///y///////////r7   N)r8   r9   r:   r;   rX   r^   r<   r7   r5   r>   r>   -   s    +! 
0r7   r>   c                  "    e Zd ZdZd Zd Zd Zy)TestRegisterEdgeProxyClientz'Test register_edge_proxy_client method.c                .   t               }t               }|j                  |       |j                  }||u }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}}y)	z&Test registering an Edge Proxy client.rQ   )z4%(py2)s
{%(py2)s = %(py0)s._edge_client
} is %(py4)sexecutormock_clientr   r   r   assert %(py6)srN   Nr   r   register_edge_proxy_client_edge_clientr"   r#   r$   r%   r&   r'   r(   r)   )r.   rb   rc   r/   r0   @py_format5rV   s          r5   test_register_edge_proxy_clientz;TestRegisterEdgeProxyClient.test_register_edge_proxy_clientU   s    !#k++K8$$3$3333$333333x333x333$3333333333333333r7   c                6   t               }t               }t        d       |_        t        d       |_        t        d       |_        t        d       |_        |j                  |       |j                  }|j                  }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d	x}}|j                  }|j                  }|sd
dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d	x}}|j                  }|j                  }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d	x}}|j
                  }|j                  }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d	x}}y	)z4Test that registering client sets up event handlers.c                    | S Nr<   hs    r5   <lambda>z`TestRegisterEdgeProxyClient.test_register_edge_proxy_client_registers_handlers.<locals>.<lambda>c       A r7   side_effectc                    | S rm   r<   rn   s    r5   rp   z`TestRegisterEdgeProxyClient.test_register_edge_proxy_client_registers_handlers.<locals>.<lambda>d       Q r7   c                    | S rm   r<   rn   s    r5   rp   z`TestRegisterEdgeProxyClient.test_register_edge_proxy_client_registers_handlers.<locals>.<lambda>e       q r7   c                    | S rm   r<   rn   s    r5   rp   z`TestRegisterEdgeProxyClient.test_register_edge_proxy_client_registers_handlers.<locals>.<lambda>f       q r7   zMassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.on_nav_status
}.called
}rc   rd   NzNassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.on_robot_state
}.called
}zHassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.on_error
}.called
}zPassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.on_waypoint_list
}.called
})r   r   on_nav_statuson_robot_stateon_erroron_waypoint_listrg   calledr$   r%   r"   r&   r'   r(   r)   )r.   rb   rc   r/   r0   ri   s         r5   2test_register_edge_proxy_client_registers_handlerszNTestRegisterEdgeProxyClient.test_register_edge_proxy_client_registers_handlers^   s   !#k$-+$F!%.;%G"([A'0['I$++K8 ((/(/////////{///{///(//////////))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##*#*********{***{***#**********++2+222222222{222{222+2222222222r7   c                   t               }t               }|j                  |       |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}}y)z4Test registering None client clears existing client.NrQ   )z4%(py2)s
{%(py2)s = %(py0)s._edge_client
} is %(py5)srb   rK   rM   r   rf   )r.   rb   rc   r/   rT   r0   rU   r3   s           r5   test_register_none_clientz5TestRegisterEdgeProxyClient.test_register_none_clientp   s    !#k++K8++D1$$,,$,,,,$,,,,,,x,,,x,,,$,,,,,,,,,,r7   N)r8   r9   r:   r;   rj   r   r   r<   r7   r5   r`   r`   R   s    143$-r7   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
)TestEventHandlerszTest Edge Proxy event handlers.c                  K   t               }t        dddt        j                  d      |_        t        dddd      }|j                  |       d	{    |j                  }|j                  }t        j                  }||k(  }|s
t        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nd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	7 2w)z(Test nav status handler updates context.r@   rA   rB           rD   r   rC   rE   rH   rF   rI   Nr   zp%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s._nav_context
}.status
} == %(py8)s
{%(py8)s = %(py6)s.NAVIGATING
}rb   r
   r   r   r   rN   rP   assert %(py10)spy10zR%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s._nav_context
}.progress
} == %(py7)sr   r   r   )r   r   r
   r    _nav_contextr   _handle_nav_statusrH   r*   r"   r#   r$   r%   r&   r'   r(   r)   rI   r.   rb   msgr/   r0   @py_assert7r2   rW   @py_format11r1   r3   r4   s               r5   test_on_nav_status_handlerz,TestEventHandlers.test_on_nav_status_handler   s    !# 1 $$!
  	
 ))#...$$B$++Bx/B/BB+/BBBBB+/BBBBBBBxBBBxBBB$BBB+BBBBBBxBBBxBBB/BBBBBBBB$$4$--44-4444-444444x444x444$444-4444444444 	/   AJJH2Jc                  K   t               }t        dddt        j                  d      |_        t        dddd      }|j                  |       d	{    |j                  }|j                  }t        j                  }||k(  }|s
t        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nd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	7 2w)z+Test nav status handler for arrived status.r@   rA   rB   g?rD   r         ?r   Nr   zm%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s._nav_context
}.status
} == %(py8)s
{%(py8)s = %(py6)s.ARRIVED
}rb   r
   r   r   r   r   r   r   r   )r   r   r
   r*   r   r   r   rH   r+   r"   r#   r$   r%   r&   r'   r(   r)   rI   r   s               r5   "test_on_nav_status_handler_arrivedz4TestEventHandlers.test_on_nav_status_handler_arrived   s    !# 1 &&!
  	
 ))#...$$?$++?x/?/??+/?????+/???????x???x???$???+??????x???x???/????????$$4$--44-4444-444444x444x444$444-4444444444 	/r   c                  K   t               }t        dddt        j                  d      |_        t        dddddd	      }|j                  |       d
{    |j                  }|j                  }t        j                  }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nd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
7 2w)z*Test nav status handler for failed status.r@   rA   rB   rC   rD   r   r]   NAV_BLOCKED)rE   rH   rF   rI   reason
error_codeNr   zl%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s._nav_context
}.status
} == %(py8)s
{%(py8)s = %(py6)s.FAILED
}rb   r
   r   r   r   zO%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s._nav_context
}.error
} == %(py7)sr   r   r   )r   r   r
   r*   r   r   r   rH   r,   r"   r#   r$   r%   r&   r'   r(   r)   rS   r   s               r5   !test_on_nav_status_handler_failedz3TestEventHandlers.test_on_nav_status_handler_failed   s    !# 1 &&!
  &$
 ))#...$$>$++>x>+>>>>+>>>>>>x>>>x>>>$>>>+>>>>>>x>>>x>>>>>>>>>>$$A$**A.AA*.AAAAA*.AAAAAAAxAAAxAAA$AAA*AAA.AAAAAAAA 	/s   AJ
JH2J
c                  K   t               }t        dddt        j                  d      |_        t        dddd	
      }|j                  |       d{    |j                  }|j                  }t        j                  }||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nd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7 2w)z<Mismatched request IDs should not mutate active nav context.
nav_activerA   rB   rC   rD   nav_oldr   old_goalr   r   Nr   r   rb   r
   r   r   r   r   r   r   r   )r   r   r
   r*   r   r   r   rH   r"   r#   r$   r%   r&   r'   r(   r)   rI   r   s               r5   (test_on_nav_status_ignores_other_requestz:TestEventHandlers.test_on_nav_status_ignores_other_request   s    !# 1#&&!
  "	
 ))#...$$B$++Bx/B/BB+/BBBBB+/BBBBBBBxBBBxBBB$BBB+BBBBBBxBBBxBBB/BBBBBBBB$$4$--44-4444-444444x444x444$444-4444444444 	/r   c                  K   t               }t        dddt        j                  d      |_        t        ddddd      }|j                  |       d	{    |j                  }|j                  }t        j                  }||k(  }|s
t        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nd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}}	y	7 w)z-Test nav status handler for cancelled status.r@   rA   rB   rC   rD   r   user_cancelled)rE   rH   rF   rI   r   Nr   )zo%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s._nav_context
}.status
} == %(py8)s
{%(py8)s = %(py6)s.CANCELLED
}rb   r
   r   r   r   r   r   r   r   r   )r   r   r
   r*   r   r   r   rH   r-   r"   r#   r$   r%   r&   r'   r(   r)   rI   rS   r   s               r5   $test_on_nav_status_handler_cancelledz6TestEventHandlers.test_on_nav_status_handler_cancelled   s0    !# 1 &&!
  #
 ))#...$$A$++Ax/A/AA+/AAAAA+/AAAAAAAxAAAxAAA$AAA+AAAAAAxAAAxAAA/AAAAAAAA$$4$--44-4444-444444x444x444$444-4444444444$$>$**>.>>*.>>>>>*.>>>>>>>x>>>x>>>$>>>*>>>.>>>>>>>>	 	/s   AM3M0LM3c                  K   t               }t        ddd      }|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7 ͭw)z*Test robot state handler updates location.g   mA	waypoint3idle)	timestamplocation	nav_stateNr   )z7%(py2)s
{%(py2)s = %(py0)s._robot_location
} == %(py5)srb   rK   rM   r   )r   r   _update_robot_state_robot_locationr"   r#   r$   r%   r&   r'   r(   r)   )r.   rb   stater/   rT   r0   rU   r3   s           r5   test_on_robot_state_handlerz-TestEventHandlers.test_on_robot_state_handler   s     !#" 
 **5111 ''6;6';6666';666666x666x666'666;6666666 	2s   -C?C=CC?c                >  K   t               }t        dddt        j                  d      |_        t        ddd      }|j                  |       d	{    |j                  }|j                  }t        j                  }||k(  }|s
t        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                   |            d	x}x}x}}y	7 Hw)z&Test error handler logs appropriately.r@   rA   rB   rC   rD   waypoint_not_foundzWaypoint 'unknown' not found)rE   rS   messageNr   r   rb   r
   r   r   r   )r   r   r
   r*   r   r   _handle_edge_errorrH   r,   r"   r#   r$   r%   r&   r'   r(   r)   )	r.   rb   errr/   r0   r   r2   rW   r   s	            r5   test_on_error_handlerz'TestEventHandlers.test_on_error_handler
  s    !# 1 &&!
  &2
 ))#... $$>$++>x>+>>>>+>>>>>>x>>>x>>>$>>>+>>>>>>x>>>x>>>>>>>>>> 	/s   AFFEFc           	     r  K   t               }ddlm}m}  | |dddd       |dddd	      g
      }|j	                  |       d{    d}|j
                  }||v }|st        j                  d|fd||f      t        j                  |      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}x}}d}|j
                  }||v }|st        j                  d|fd||f      t        j                  |      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}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7 w)z,Test waypoint list handler stores waypoints.r   )WaypointWaypointListMessagerA   r   )namexythetacheckpoint1g      @g      @gQ?)	waypointsN)in)z2%(py1)s in %(py5)s
{%(py5)s = %(py3)s._waypoints
}rb   )py1py3rL   rM   r   r   )z)%(py3)s
{%(py3)s = %(py1)s.x
} == %(py6)sr   r   rN   rO   rP   )r   edge_proxy.messagesr   r   _update_waypoint_list
_waypointsr"   r#   r'   r$   r%   r&   r(   r)   r   )r.   rb   r   r   r   @py_assert0rT   @py_assert2rU   r3   r2   rV   rW   s                r5   test_on_waypoint_list_handlerz/TestEventHandlers.test_on_waypoint_list_handler   s    !#E!g3?mscF
 ,,S111-(---w-----w----w------(---(-----------3 3 33} 33333} 3333}333333333333 33333333""7+4+--44-4444-444+444-4444444444""=1:133:s:3s::::3s:::1:::3:::s::::::: 	2s   AL7L4	K,L7N)r8   r9   r:   r;   r   r   r   r   r   r   r   r   r<   r7   r5   r   r      s.    )5.5.B25.?27?,;r7   r   c                  .    e Zd ZdZd Zd Zd Zd Zd Zy)TestHandleNavigateWithEdgeProxyz-Test _handle_navigate with Edge Proxy client.c           	       K   t               }t               }t        d       |_        t        d       |_        t        d       |_        t        d       |_        t               |_        |j                  |       dddd	d
d}t        j                  |dd      5  |j                  |di        d{   }ddd       |j                  }|j                  }|sddt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      dz  }t%        t        j&                  |            dx}}|j                  j(                  }|j*                  }|j,                  }d}	 ||	      }
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"                  |	      t        j"                  |
      t        j"                  |      dz  }dd|iz  }t%        t        j&                  |            dx}x}x}	x}
x}}|j*                  }|j,                  }d}	 ||	      }
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"                  |	      t        j"                  |
      t        j"                  |      dz  }dd|iz  }t%        t        j&                  |            dx}x}x}	x}
x}}y7 # 1 sw Y   xY ww)z7Test navigation uses Edge Proxy client when registered.c                    | S rm   r<   rn   s    r5   rp   zVTestHandleNavigateWithEdgeProxy.test_navigate_with_registered_client.<locals>.<lambda>C  rq   r7   rr   c                    | S rm   r<   rn   s    r5   rp   zVTestHandleNavigateWithEdgeProxy.test_navigate_with_registered_client.<locals>.<lambda>D  ru   r7   c                    | S rm   r<   rn   s    r5   rp   zVTestHandleNavigateWithEdgeProxy.test_navigate_with_registered_client.<locals>.<lambda>E  rw   r7   c                    | S rm   r<   rn   s    r5   rp   zVTestHandleNavigateWithEdgeProxy.test_navigate_with_registered_client.<locals>.<lambda>F  ry   r7   step1NAVIGATErA   rB   rF   rG   step_idactionparams_wait_for_navigationNreturn_valueVassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.send_navigate_waypoint
}.called
}rc   rd   r   r   )zf%(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.kwargs
}.get
}(%(py6)s)
} == %(py11)s	call_args)r   r   r   rN   rP   py11zassert %(py13)spy13rG   )r   r   rz   r{   r|   r}   r   send_navigate_waypointrg   r   object_handle_navigater~   r$   r%   r"   r&   r'   r(   r)   r   kwargsgetr#   )r.   rb   rc   stepresultr/   r0   ri   r   r2   r   @py_assert10@py_assert9@py_format12@py_format14s                  r5   $test_navigate_with_registered_clientzDTestHandleNavigateWithEdgeProxy.test_navigate_with_registered_client>  s    !#k$-+$F!%.;%G"([A'0['I$-6[*++K8  &-A
 \\($:N 	E#44T4DDF	E 1181888888888{888{8881888888888866@@	6##6F6#F+6w6+w6666+w666666y666y666666#666F666+666w666666668##8G8#G,88,8888,888888y888y888888#888G888,88888888888 E	E 	Es1   BO O	7O8O	<L
OO		OOc                  K   t               }t               }t        d       |_        t        d       |_        t        d       |_        t        d       |_        t               |_        |j                  |       dt               i|_	        ddd	d
dd}|j                  |di        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}}|j                  }
|
j                   }| }|sddt#        j$                         v st        j&                  |      rt        j                  |      ndt        j                  |
      t        j                  |      dz  }t        t        j                  |            dx}
x}}y7 w)zFIf waypoint list is known, reject unknown destinations before sending.c                    | S rm   r<   rn   s    r5   rp   zYTestHandleNavigateWithEdgeProxy.test_navigate_validates_known_waypoints.<locals>.<lambda>_  rq   r7   rr   c                    | S rm   r<   rn   s    r5   rp   zYTestHandleNavigateWithEdgeProxy.test_navigate_validates_known_waypoints.<locals>.<lambda>`  ru   r7   c                    | S rm   r<   rn   s    r5   rp   zYTestHandleNavigateWithEdgeProxy.test_navigate_validates_known_waypoints.<locals>.<lambda>a  rw   r7   c                    | S rm   r<   rn   s    r5   rp   zYTestHandleNavigateWithEdgeProxy.test_navigate_validates_known_waypoints.<locals>.<lambda>b  ry   r7   rA   r   r   
unknown_wprB   r   r   NrH   r   r   z%(py1)s == %(py4)sr   r   re   rN   rS   unknown_waypointzZassert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.send_navigate_waypoint
}.called
}rc   rd   )r   r   rz   r{   r|   r}   r   r   rg   r   r   r"   r#   r'   r(   r)   r~   r$   r%   r&   )r.   rb   rc   r   r   r   r0   r   ri   rV   r/   r2   rU   s                r5   'test_navigate_validates_known_waypointszGTestHandleNavigateWithEdgeProxy.test_navigate_validates_known_waypoints[  s    !#k$-+$F!%.;%G"([A'0['I$-6[*++K8  '	4  &2XF
  00tR@@h+8+8++++8++++++8+++++++g4"44"44444"4444444"4444444455<5<<<<<<<<<<<<;<<<;<<<5<<<<<<<<<<	 As   B-I(/I%0F6I(c                n  K   t               }dddddd}|j                  |di        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7 w)z=Test navigation falls back to mock when no client registered.r   r   rA   rB   r   r   NrH   r   r   r   r   re   rN   rF   )r   r   r"   r#   r'   r(   r)   )	r.   rb   r   r   r   r0   r   ri   rV   s	            r5   0test_navigate_without_registered_client_fallbackzPTestHandleNavigateWithEdgeProxy.test_navigate_without_registered_client_fallbackv  s     !#  &-A
  00tR@@h,9,9,,,,9,,,,,,9,,,,,,,m$//$////$///$////////// As   *D5D2DD5c                h	  K   t               }t               }t        d       |_        t        d       |_        t        d       |_        t        d       |_        t               |_        |j                  |       dddd	d
d}t        j                  |dd      5  |j                  |di        d{    dd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}}|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.                  }t0        j2                  }||k(  }
|
s
t        j                  d|
fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      t        j$                  |      dt        j                          v st        j"                  t0              rt        j$                  t0              ndt        j$                  |      dz  }dd|iz  }t'        t        j(                  |            dx}x}x}
}y7 # 1 sw Y   xY ww) z4Test navigation creates context with correct values.c                    | S rm   r<   rn   s    r5   rp   zSTestHandleNavigateWithEdgeProxy.test_navigate_creates_nav_context.<locals>.<lambda>  rq   r7   rr   c                    | S rm   r<   rn   s    r5   rp   zSTestHandleNavigateWithEdgeProxy.test_navigate_creates_nav_context.<locals>.<lambda>  ru   r7   c                    | S rm   r<   rn   s    r5   rp   zSTestHandleNavigateWithEdgeProxy.test_navigate_creates_nav_context.<locals>.<lambda>  rw   r7   c                    | S rm   r<   rn   s    r5   rp   zSTestHandleNavigateWithEdgeProxy.test_navigate_creates_nav_context.<locals>.<lambda>  ry   r7   r   r   	waypoint1r\   r   r   r   Nr   )is not)z8%(py2)s
{%(py2)s = %(py0)s._nav_context
} is not %(py5)srb   rK   rM   r   r   )zU%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s._nav_context
}.destination
} == %(py7)sr   r   r   )zO%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s._nav_context
}.speed
} == %(py7)s)zn%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s._nav_context
}.status
} == %(py8)s
{%(py8)s = %(py6)s.ACCEPTED
}r
   r   r   r   )r   r   rz   r{   r|   r}   r   r   rg   r   r   r   r   r"   r#   r$   r%   r&   r'   r(   r)   rF   rG   rH   r
   r    )r.   rb   rc   r   r/   rT   r0   rU   r3   r1   r2   r4   r   rW   r   s                  r5   !test_navigate_creates_nav_contextzATestHandleNavigateWithEdgeProxy.test_navigate_creates_nav_context  s    !#k$-+$F!%.;%G"([A'0['I$-6[*++K8  &1FC
 \\($:N 	<++D$;;;	< $$0D0$D0000$D000000x000x000$000D0000000$$?$00?K?0K????0K??????x???x???$???0???K???????$$4$**4f4*f4444*f444444x444x444$444*444f4444444$$@$++@x/@/@@+/@@@@@+/@@@@@@@x@@@x@@@$@@@+@@@@@@x@@@x@@@/@@@@@@@@ <	< 	<s1   BR2 R%7R"8R%<O&R2"R%%R/*R2c                  K   t               }t               }t        d       |_        t        d       |_        t        d       |_        t        d       |_        t               |_        |j                  |       dddd	d
d}t        j                         }|j                  d       t        j                  |d|      5  |j                  |di        d{   }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}}y7 # 1 sw Y   xY ww)z%Test navigation waits for completion.c                    | S rm   r<   rn   s    r5   rp   zSTestHandleNavigateWithEdgeProxy.test_navigate_wait_for_completion.<locals>.<lambda>  rq   r7   rr   c                    | S rm   r<   rn   s    r5   rp   zSTestHandleNavigateWithEdgeProxy.test_navigate_wait_for_completion.<locals>.<lambda>  ru   r7   c                    | S rm   r<   rn   s    r5   rp   zSTestHandleNavigateWithEdgeProxy.test_navigate_wait_for_completion.<locals>.<lambda>  rw   r7   c                    | S rm   r<   rn   s    r5   rp   zSTestHandleNavigateWithEdgeProxy.test_navigate_wait_for_completion.<locals>.<lambda>  ry   r7   r   r   rA   rB   r   r   Nr   r   rH   r   r   r   r   re   rN   )r   r   rz   r{   r|   r}   r   r   rg   asyncioFuture
set_resultr   r   r   r"   r#   r'   r(   r)   )r.   rb   rc   r   nav_complete_futurer   r   r0   r   ri   rV   s              r5   !test_navigate_wait_for_completionzATestHandleNavigateWithEdgeProxy.test_navigate_wait_for_completion  s6    !#k$-+$F!%.;%G"([A'0['I$-6[*++K8  &-A
 &nn.&&t,\\,;N
 	E $44T4DDF	E
 h,9,9,,,,9,,,,,,9,,,,,,, E	E 	Es1   CE8E,E*E,!B	E8*E,,E51E8N)	r8   r9   r:   r;   r   r   r   r   r  r<   r7   r5   r   r   :  s    79:=60A4-r7   r   c                  (    e Zd ZdZd Zd Zd Zd Zy)TestWaitForNavigationz!Test _wait_for_navigation method.c                f  K   t               t        dddt        j                  d      _        fd}t        j                   |              j                  dd       d	{    j                  }|j                  }t        j                  }||k(  }|s
t        j                  d
|fd||f      dt        j                         v st        j                        rt        j                        ndt        j                  |      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t!        t        j"                  |            d	x}x}x}}y	7 Hw)z*Test waiting for arrived status completes.r@   rA   rB   rC   rD   c                    K   t        j                  d       d {    t        j                   j                  _        y 7 $w)N皙?)r  sleepr
   r+   r   rH   rb   s   r5   set_arrived_soonzLTestWaitForNavigation.test_wait_for_arrived_status.<locals>.set_arrived_soon  s2     --%%%+3+;+;H!!( &s   AA%Ar   timeoutNr   r   rb   r
   r   r   r   )r   r   r
   r*   r   r  create_taskr   rH   r+   r"   r#   r$   r%   r&   r'   r(   r)   )	r.   r  r/   r0   r   r2   rW   r   rb   s	           @r5   test_wait_for_arrived_statusz2TestWaitForNavigation.test_wait_for_arrived_status  s    !# 1 &&!
	< 	,./++Is+CCC$$?$++?x/?/??+/?????+/???????x???x???$???+??????x???x???/???????? 	Ds   A#F1&F.'EF1c                @  K   t               t        dddt        j                  d      _        fd}t        j                   |              t        j                  t        d      5  j                  dd	
       d{    ddd       y7 # 1 sw Y   yxY ww)z0Test waiting for failed status raises exception.r@   rA   rB   rC   rD   c                    K   t        j                  d       d {    t        j                   j                  _        d j                  _        y 7 5w)Nr  r]   )r  r  r
   r,   r   rH   rS   r  s   r5   set_failed_soonzQTestWaitForNavigation.test_wait_for_failed_status_raises.<locals>.set_failed_soon  s>     --%%%+3??H!!(*=H!!' &s   AA6AzNavigation failedmatchr   r  N)r   r   r
   r*   r   r  r  pytestraises	Exceptionr   )r.   r  rb   s     @r5   "test_wait_for_failed_status_raisesz8TestWaitForNavigation.test_wait_for_failed_status_raises  s     !# 1 &&!
	>
 	O-.]]9,?@ 	H//	3/GGG	H 	HG	H 	Hs0   A(B+BBB	BBBBc                   K   t               }t        dddt        j                  d      |_        t        j                  t        d      5  |j                  dd	       d
{    d
d
d
       y
7 # 1 sw Y   y
xY ww)z3Test waiting for cancelled status raises exception.r@   rA   rB   rC   rD   r   r  r   r  N)	r   r   r
   r-   r   r  r  r  r   r.   rb   s     r5   %test_wait_for_cancelled_status_raisesz;TestWaitForNavigation.test_wait_for_cancelled_status_raises  s{     !# 1 %%!
 ]]9K8 	H//	3/GGG	H 	HG	H 	Hs0   A	A>A2"A0#A2'	A>0A22A;7A>c                  K   t               }t        dddt        j                  d      |_        t        j                  t        j                        5  |j                  dd       d{    ddd       y7 # 1 sw Y   yxY ww)	z5Test waiting for navigation timeout raises exception.r@   rA   rB   rC   rD   g?r  N)
r   r   r
   r*   r   r  r  r  TimeoutErrorr   r  s     r5   test_wait_for_timeout_raisesz2TestWaitForNavigation.test_wait_for_timeout_raises  s     !# 1 &&!
 ]]7//0 	H//	3/GGG	H 	HG	H 	Hs0   ABA:*A8+A:/	B8A::B?BN)r8   r9   r:   r;   r  r  r   r#  r<   r7   r5   r
  r
    s    +@*H*HHr7   r
  c                      e Zd ZdZd Zd Zy)TestIntegrationz5Integration tests for ActionExecutor with Edge Proxy.c                  K   t               }t               }t        d       |_        t        d       |_        t        d       |_        t        d       |_        t               |_        d|_        d|_	        |j                  |       dd	d
ddddddidddddddddgdgd}t        j                  |dd      5  |j                  |       d{   }dd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}	||	k(  }
|
st#        j0                  d|
fd ||	f      t#        j&                  |      t#        j&                  |      t#        j&                  |	      d!z  }d"d#|iz  }t)        t#        j*                  |            dx}x}x}
}	|j                  }|j2                  }|sd$d%t        j                          v st#        j$                  |      rt#        j&                  |      nd%t#        j&                  |      t#        j&                  |      d&z  }t)        t#        j*                  |            dx}}y7 # 1 sw Y   xY ww)'z+Test executing a plan with NAVIGATE action.c                    | S rm   r<   rn   s    r5   rp   zCTestIntegration.test_execute_plan_with_navigation.<locals>.<lambda>  rq   r7   rr   c                    | S rm   r<   rn   s    r5   rp   zCTestIntegration.test_execute_plan_with_navigation.<locals>.<lambda>  ru   r7   c                    | S rm   r<   rn   s    r5   rp   zCTestIntegration.test_execute_plan_with_navigation.<locals>.<lambda>  rw   r7   c                    | S rm   r<   rn   s    r5   rp   zCTestIntegration.test_execute_plan_with_navigation.<locals>.<lambda>  ry   r7   FNNavigate to lobbyDAG	test_planr   	EXECUTIONrobotCHECK_BATTERY	min_level   r   type
agent_roler   r   step2r   rA   rB   r   )r   r4  r5  r   r   dependenciesintentworkflow_topologyplan_idstepsr   r   +assert %(py2)s
{%(py2)s = %(py0)s.success
}reportr   r   successr   z.%(py3)s
{%(py3)s = %(py1)s.status
} == %(py6)sr   rO   rP   r   rc   rd   )r   r   rz   r{   r|   r}   r   r   is_connectedlast_robot_staterg   r   r   execute_planr@  r$   r%   r"   r&   r'   r(   r)   resultsrH   r#   r~   )r.   rb   rc   planr>  r/   @py_format3r   r   r2   rT   rV   rW   r0   ri   s                  r5   !test_execute_plan_with_navigationz1TestIntegration.test_execute_plan_with_navigation  s    !#k$-+$F!%.;%G"([A'0['I$-6[*#( '+$++K8 *!&"  ''")-*B/  ''")(.5I%,I	
. \\($:N 	7#0066F	7 ~~~vv~~~g&:&--::-::::-:::&:::-::::::::::1181888888888{888{88818888888888	 7	7 	7s1   B?KKKKG)KKKKc           	       K   t               }ddddddddd	id
gd}|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}||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 ;w)z5Test executing plan without Edge Proxy uses fallback.r+  r,  r-  r   r.  r/  r   rF   rA   r3  r8  Nr=  r>  r?  r@  r   rA  r   rO   rP   )r   rD  r@  r$   r%   r"   r&   r'   r(   r)   rE  rH   r#   )r.   rb   rF  r>  r/   rG  r   r   r2   rT   rV   rW   s               r5   $test_execute_plan_without_edge_proxyz4TestIntegration.test_execute_plan_without_edge_proxyA  s    !# *!&"  ''")(,g6	
  ,,T22~~~vv~~~g&:&--::-::::-:::&:::-:::::::::: 3s   /E/E,D;E/N)r8   r9   r:   r;   rH  rJ  r<   r7   r5   r%  r%    s    ?*9X;r7   r%  )"r;   
__future__r   builtinsr$   _pytest.assertion.rewrite	assertionrewriter"   r  pathlibr   unittest.mockr   r   r   r  executor.action_executorr   r	   r
   r   r   r   r   r   r   r>   r`   markr   r   r
  r%  r<   r7   r5   <module>rT     s   
 #     5 5   	7 	70 0J&- &-\ q; q; q;r ~- ~- ~-L GH GH GH^ E; E; E;r7   