
    u,Qj                         d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlZ G d d      Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zy)u   Device-tool WS bridge: action frame out, action_result in, timeout, and the
resolve/dispatch routing. No network, no real phone — a FakeWS captures frames
and we feed results back by hand.    Nc                       e Zd Zd Zd Zd Zy)FakeWSc                      g | _         g | _        y N)sentbinary)selfs    N/Users/ahmed/devFolder/Ultron/claude-voice/gateway/tests/test_device_bridge.py__init__zFakeWS.__init__   s    	    c                 B   K   | j                   j                  |       y wr   )r   append)r	   frames     r
   	send_jsonzFakeWS.send_json   s     		   c                 B   K   | j                   j                  |       y wr   )r   r   )r	   datas     r
   
send_byteszFakeWS.send_bytes   s     4 r   N)__name__
__module____qualname__r   r   r    r   r
   r   r      s     !r   r   c                  >    t        j                  t                     S )N)ws)mainSessionr   r   r   r
   _sessionr      s    <<68$$r   c                  v   t         j                  D ]O  } | 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   }g }|d   }|}|r|d	   }|}|sd
dt        j                  |      iz  }	|j                  |	       |r+ddt        j                        iz  }|j                  |       t        j                  |d      i z  }
dd|
iz  }t        t        j                  |            d x}x}x}}t        j                  |        R t         j                  }h 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                  |      dz  }dd|iz  }
t        t        j                  |
            d x}x}}y )Ntypefunction==z%(py1)s == %(py4)spy1py4assert %(py6)spy6namedescription%(py3)spy3z%(py6)sr   assert %(py9)spy9>	   navigateopen_appopen_url	set_timer
play_musicopen_cameracall_contactget_locationtake_screenshot)z9%(py2)s
{%(py2)s = %(py0)s.DEVICE_TOOL_NAMES
} == %(py5)sdevice_toolspy0py2py5assert %(py7)spy7)r8   DEVICE_TOOL_SPECS
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr   _format_boolopjsondumpsDEVICE_TOOL_NAMES@py_builtinslocals_should_repr_global_name)spec@py_assert0@py_assert3@py_assert2@py_format5@py_format7fn@py_assert1@py_assert5@py_format4@py_format8@py_format10@py_assert4@py_format6s                 r
   &test_device_tool_specs_valid_and_namedrZ      s   ..F|)z)|z))))|z)))|)))z)))))))*/r&z/z/zb//////z////z////////////////

4	 /
 )) L .L L) .L L L:K:KL) .L L LEKVL L3K3K  L LBK)  L LBK) * L LBK).L L L L L8K8KL L Lr   c                    K   t               } t        j                  | j                  di             }t        j                  d       d {    | j
                  j                  d   }g }|d   }d}||k(  }|}|r|d   }d}	||	k(  }
|
}|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }d	d
|iz  }|j                  |       |r_t        j                  d
fd	f      t        j                  |      t        j                  |	      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}x}
}	|d   }| j                  |dddid       | d {   }g }|d   }|}|r|d   d   }d}||k(  }|}|sddt        j                  |      iz  }|j                  |       |r_t        j                  dfd|f      t        j                  |      t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}| j                  }i }||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 17 ŭw)%Nr7   r   r   actionr!   )z%(py3)s == %(py6)s)r,   r(   z%(py8)spy8)z%(py11)s == %(py14)s)py11py14z%(py16)spy16zassert %(py19)spy19idTmessagesnaprc   okr   rg   r   r+   r,   )z%(py6)s == %(py9)s)r(   r.   z%(py11)sr_   zassert %(py14)sr`   z0%(py2)s
{%(py2)s = %(py0)s._pending
} == %(py5)ssessr9   r=   r>   )r   asynciocreate_task_device_callsleepr   r   r@   rA   rB   r   rE   rC   rD   _resolve_action_pendingrI   rJ   rK   )ri   taskr   rS   rO   rT   rX   rM   @py_assert10@py_assert13@py_assert12rQ   @py_format9@py_format15@py_format17@py_format18@py_format20aidres@py_assert8@py_assert7rU   rW   @py_format12@py_format13rN   rY   rV   s                               r
   ,test_device_call_resolves_on_matching_resultr   '   s7    :Dt001BBGHD
--
GGLLEM5=MHM=H$MxM<MM<M)MMMM=HMMM=MMMHMMMMMMM<MMMMMMM<MMMMMMMMMMMMMMM
+C4)V9LMN*C93t99999VY/969/69999999999999/6999/999699999999999999==B=B=B44=B 
 s&   AN
M;E.N9M>:GN>Nc                  @  K   t               } | j                  di d       d {   }ddd}||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}}| j                  }i }||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w)Nr6   g{Gz?)timeoutFr   rg   errorr!   z%(py0)s == %(py3)srz   r:   r,   assert %(py5)sr<   rh   ri   r9   r=   r>   )r   rl   r@   rA   rI   rJ   rK   rB   rC   rD   ro   )	ri   rz   rO   rS   rU   rY   rX   rN   rV   s	            r
   )test_device_call_times_out_without_clientr   4   s     :D!!."d!C
CC33333333333333333333333333333333==B=B=B44=B Ds   "FFE7Fc                 D  K   t               }d }| j                  t        j                  d|       t	        j
                  |j                  dddi            }t	        j                  d       d {    |j                  j                  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}}|j                  |d   di d       | 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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y 7 7 w)Nc                   K   t         j                  }| |k(  }|st        j                  d|fd| |f      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  }dd|iz  }t        t        j                  |            d x}}dd	d
ddS w)Nr!   )z2%(py0)s == %(py4)s
{%(py4)s = %(py2)s.KIND_PLACE
}kindphone_storer:   r;   r&   r'   r(   officeTower 1L:@皙I@)labeladdresslatlng)
r   
KIND_PLACEr@   rA   rI   rJ   rK   rB   rC   rD   )r   keyrN   rS   rP   rQ   s         r
   fake_getz4test_navigate_resolves_saved_place.<locals>.fake_get>   s     "---t-----t-------t---t------{---{-----------!iTRRs   DDget_itemr/   destinationr   r   r\   r]   r!   r#   r$   r'   r(   paramsr   r   r   r   rc   Trf   inzD%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.lower
}()
}outr%   r,   r<   r>   r-   r.   )r   setattrr   r   rj   rk   _dispatch_devicerm   r   r   r@   rA   rB   rC   rD   rn   lowerrI   rJ   rK   )monkeypatchri   r   rp   r   rM   rN   rO   rP   rQ   r   rX   @py_assert6rV   rW   s                  r
   "test_navigate_resolves_saved_placer   ;   s    :DS ((*h?t44Z6CX5N P QD
--
GGLLE?(j(?j((((?j(((?(((j(((((((?9%22%2222%222%2222222222?5!)T)!T))))!T)))!)))T)))))))d4DE*C"syy"y{"8{""""8{"""8""""""s"""s"""y"""{"""""""  s&   A.L 0L1G L 1L2C*L L c                 8  K   t               }dfd}| j                  t        j                  d|       t	        j
                  |j                  dddi            }t	        j                  d       d {    |j                  j                  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(  }|st        j                  d|fd|f      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}}|j%                  |d   di d       | 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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}|v}|st        j                  d|fd |f      dt        j                          v st        j"                        rt        j                        nddt        j                          v st        j"                  |      rt        j                  |      ndd!z  }d"d#|iz  }t        t        j                  |            d }y 7 7 w)$N
0501234567c                   K   t         j                  }| |k(  }|st        j                  d|fd| |f      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  }dd|iz  }t        t        j                  |            d x}}dd	S w)
Nr!   )z4%(py0)s == %(py4)s
{%(py4)s = %(py2)s.KIND_CONTACT
}r   r   r   r'   r(   father)r)   number)
r   KIND_CONTACTr@   rA   rI   rJ   rK   rB   rC   rD   )r   r   rN   rS   rP   rQ   r   s         r
   r   zEtest_call_contact_dials_number_but_never_returns_it.<locals>.fake_getS   s     "///t/////t///////t///t//////{///{/////////// F33s   DDr   r5   r)   r   r   r\   r]   callr!   r#   r$   r'   r(   r   r   )z%(py1)s == %(py3)sr%   r,   r   r<   rc   Trf   r   r   r   r   r-   r.   )not in)z%(py0)s not in %(py2)s)r:   r;   zassert %(py4)sr&   )r   r   r   r   rj   rk   r   rm   r   r   r@   rA   rB   rC   rD   rI   rJ   rK   rn   r   )r   ri   r   rp   r   rM   rN   rO   rP   rQ   rU   rY   r   rX   r   rV   rW   rS   @py_format3r   s                      @r
   3test_call_contact_dials_number_but_never_returns_itr   O   sD    :DF4 ((*h?t44^6<h5G I JD
--
GGLLE?$f$?f$$$$?f$$$?$$$f$$$$$$$?8$.$....$...$................d4DE*C"syy"y{"8{""""8{"""8""""""s"""s"""y"""{"""""""666 
 s&   A2N5N6E&NNF8NNc                   K   t               }d }| j                  t        j                  d|       |j	                  dddi       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                  |      t        j                  |      d
z  }dd|iz  }	t        t        j                  |	            d x}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)Nc                    K   y wr   r   )r   r   s     r
   r   zBtest_call_contact_unknown_returns_error_no_frame.<locals>.fake_getg   s	        r   r5   r)   ghostz	no numberr   r   r   r   r-   r.   zDassert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.ws
}.sent
}ri   r   )r   r   r   r   r   r   r@   rA   rB   rI   rJ   rK   rC   rD   r   r   )r   ri   r   r   rM   rX   r   rO   rV   rW   rS   rN   rT   rY   s                 r
   0test_call_contact_unknown_returns_error_no_framer   d   s+    :D((*h?%%nvw6GH
HC%#))%)+%;+%%%%;+%%%;%%%%%%#%%%#%%%)%%%+%%%%%%%www|||ttw| Is   AG%G"	FG%c                   K   t               }d }| j                  |d|       t        j                  |j	                  di             }t        j
                  d       d {    |j                  j                  d   }|j                  |d   ddd	d
d       | d {   }d}||v }|st        j                  d|fd||f      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 7 7 w)Nc                    K   yw)Nhomer   r   r   s     r
   
fake_matchz8test_get_location_labels_known_place.<locals>.fake_matchr   s	     r   _match_placer6   r   r\   rc   Tr   r   r   rf   r   r   )z%(py1)s in %(py3)sr   r   r   r<   )r   r   rj   rk   r   rm   r   r   rn   r@   rA   rB   rI   rJ   rK   rC   rD   )
r   ri   r   rp   r   r   rM   rO   rU   rY   s
             r
   $test_get_location_labels_known_placer   o   s     :Dnj9t44^RHID
--
GGLLEd4*.t"<> ?*C6S=6S6SS  s%   AE E	!=EEB+EEc                 T  K   t               }i fd}| j                  t        j                  d|       fd}| j                  |d|       |j	                  di        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	                  di        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(  }	|	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 -w)Nc                    K   | d<   yw)Nserver	server-okr   r)   argsseens     r
   	fake_execz=test_dispatch_tool_routes_device_vs_server.<locals>.fake_exec        X   
executec                    K   | d<   yw)Ndevice	device-okr   r   s     r
   fake_devicez?test_dispatch_tool_routes_device_vs_server.<locals>.fake_device   r   r   r   memory_searchr   r!   r#   r$   r'   r(   r/   r   )r   r   r   r   r   r   r<   )r   r   r   tools_dispatch_toolr@   rA   rB   rC   rD   rI   rJ   rK   )r   ri   r   r   rM   rN   rO   rP   rQ   rS   rU   rY   r   s               @r
   *test_dispatch_tool_routes_device_vs_serverr      sn    :DD 

Iy9 0+>$$_b99H[H9[HHHH9[HHH9HHH[HHHHHHH$$Z44CC4CCCC4CCC4CCCCCCCCCC-DD4DDDDD4DDDDDDD4DDD4DDDDDDDDDDD :4s&   A H(#H"$BH(8H%9D*H(%H(c            
        K   d} t         j                  }|j                  }ddd}d} |||      }| |v }|st        j                  d|fd| |f      t        j
                  |       dt        j                         v st        j                  t               rt        j
                  t               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}x}}d} t         j                  }|j                  }ddi}d} |||      }| |v }|st        j                  d|fd| |f      t        j
                  |       dt        j                         v st        j                  t               rt        j
                  t               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}x}}t         j                  }	|	j                  }
dddid}d} |
||      }d}||k(  }|st        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
                  |      t        j
                  |      t        j
                  |      dz  }d
d|iz  }t        t        j                  |            d x}	x}
x}x}x}x}}y w)Nzdidn't respondFr   r   xr   )z|%(py1)s in %(py13)s
{%(py13)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.Session
}._device_reply
}(%(py9)s, %(py11)s)
}r   )r%   r,   r<   r>   r.   r_   py13zassert %(py15)spy15Donerg   TzDone.rd   custom)rg   r   r!   )z|%(py10)s
{%(py10)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.Session
}._device_reply
}(%(py6)s, %(py8)s)
} == %(py13)s)r:   r;   r&   r(   r^   py10r   )r   r   _device_replyr@   rA   rB   rI   rJ   rK   rC   rD   )rM   rX   r   r{   rq   rs   rO   @py_format14@py_format16rS   rN   rT   r|   @py_assert9@py_assert11s                  r
   +test_device_reply_timeout_and_error_wordingr      s     0t|| 0|99 0y)0+.09)3 0 0  0 0 0 0//0  0 0 0&/i  0 0)/0 0//  $ 0 0&/i  $ 0 0&/i  , 0 0&/i  : 0 0&/i)0 0&/i30 0&/i 0 0 0 0 0//0 0 0FT\\F\//FtFgF/gFF6FFFFF6FFFF6FFFFFFTFFFTFFF\FFF/FFFFFFgFFFFFFFFFFFF<< F<%% Fi23F58F%3S: F=EF :=EF F F4E4EF :=EF F?EvF F-E-E  F F<EI  F F<EI  F F<EI & F F<EI3F F<EISF F<EI: F F<EIXF F F F2E2EF F F Fs   OOc                    K   t               } t        j                         }|j                         }|| j                  d<   | j                  d       |j                  } |       }d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                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}x}}| j                  }i }	||	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 w)Nabczconnection closedFr   r!   )zE%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.result
}()
} == %(py7)sfut)r:   r;   r&   r>   r-   r.   rh   ri   r9   r=   r>   )r   rj   get_running_loopcreate_futurero   _fail_pendingresultr@   rA   rI   rJ   rK   rB   rC   rD   )ri   loopr   rS   rN   r   rT   rV   rW   rX   rY   s              r
   #test_fail_pending_resolves_on_closer      s;    :D##%D



CDMM%*+::F:<F%2EFF<FFFFF<FFFFFFF3FFF3FFF:FFF<FFFFFFFFFFF==B=B=B44=Bs   H H)__doc__builtinsrI   _pytest.assertion.rewrite	assertionrewriter@   rj   rF   r8   r   r   r   r   rZ   r   r   r   r   r   r   r   r   r   r   r   r
   <module>r      sc   %      	! 	!%L
#(* E&Fr   