
    Nj                        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dej                  d<    e	j                  d      j                  d       dej                  d<   ddlZdd	lmZ ddlmZ  e	j                  d
      e_        dZdZ ej0                  dej2                        Z G d d      Zdej8                  fdZddZdefdZd Z e!dk(  r ejD                   e               yy)aR  Headless end-to-end test: drives main.VoiceApp with synthetic mic audio.

Scenario:
  1. feed silence, then a spoken question (macOS `say` recording)
  2. app should transcribe it, get a Claude reply, start speaking
  3. once playback starts, inject speech again -> expect barge-in
  4. the interrupting speech becomes the next user turn
    Nz/tmp/spk-e2e-profile.npzSPEAKER_PROFILET)
missing_ok0RESUME)VoiceAppz/tmp/spk-e2e-sessioni>  i   z/tmp/claude-voice-test.f32dtypec                       e Zd Zd Zd Zd Zy)FakeMicc                 6    t        j                         | _        y N)asyncioQueueframesselfs    6/Users/ahmed/devFolder/Ultron/claude-voice/test_e2e.py__init__zFakeMic.__init__#   s    18    c                      y r    r   s    r   startzFakeMic.start&       r   c                      y r   r   r   s    r   stopzFakeMic.stop)   r   r   N)__name__
__module____qualname__r   r   r   r   r   r   r   r   "   s    Ar   r   audioc                     t        |       t        z  }t        |      D cg c]  }| |t        z  |dz   t        z    c}S c c}w )N   )lenFrange)r   nis      r   	frames_ofr'   -   s>    E
aA.3Ah7hE!a%Q!$h777s   A c                    K   t        |      D ]^  }| j                  j                  |j                                d {    |s7t	        j
                  t        t        z         d {    ` y 7 27 	wr   )r'   r   putcopyr   sleepr#   SR)micr   realtimefrs       r   feedr0   2   sQ     jjnnRWWY'''--B''' ''s'   ;A4A0A4#A4(A2)A42A4appc                   K   | j                   }t        j                  t        t        j                        }t        j                  d       d {    t        d       t        ||d t        dz          d {    t        |t               d {    t        j                         }| j                  j                  sit        j                         |z
  dk  rOt        ||d t        dz          d {    | j                  j                  st        j                         |z
  dk  rO| j                  j                  st        d       y t        d       t        j                  d	       d {    t        |t        d dt        z          d {    t        d
       t        ||       d {    t        j                         }t        j                         |z
  dk  rjt        ||d t        dz          d {    | j                  j                  st        j                         |z
  dkD  rnt        j                         |z
  dk  rjt        d       y 7 7 7 7 n7 7 7 7 nw)Nr   g      ?z[driver] feeding question         z%[driver] FAIL: playback never startedzC[driver] playback started; waiting past refractory, then barging ing?z.[driver] barge-in audio done; trailing silence      z[driver] done)r-   npzerosr,   float32r   r+   printr0   	UTTERANCEtime	monotonicspeakerspeakingr#   )r1   r-   silencet0s       r   driverrC   9   s    77Chhr,G
--
	
%&
sGIbAg&
'''
sI
		Bkk""t~~'7"'<r'A3!a%())) kk""t~~'7"'<r'A;;56	
OP
--

sIhB'
(((	
:;
sG
		B
..
R
"
$3!a%())){{##(82(=(A ..
R
"
$ 
/- ' 	*
 ( 	*s   AI,I(I,9I:I,IA!I,3I!44I,)AI,.I$/!I,I&I,/I(0AI,;I*<AI,I,I,I,!I,$I,&I,(I,*I,c                    K   t               } t               | _        t        d      D ]N  }| j                  j                  j                  t        j                  t        t        j                               P t        j                  | j                               }	 t        j                  t        |       d       d {    |j#                          t        j$                  |d       d {    y 7 4# t        j                  $ r t!        d       Y Rw xY w7 +# |j#                          t        j$                  |d       d {  7   w xY ww)N   r      )timeoutz[driver] timed outT)return_exceptions)r   r   r-   r$   r   
put_nowaitr8   r9   r#   r:   r   create_taskrunwait_forrC   TimeoutErrorr;   cancelgather)r1   _run_tasks      r   run_testrR   V   s     
*CiCG2Y!!"((1BJJ"?@  ""3779-H?vc{C888 	nnX>>> 	9 $"#$ 	? 	nnX>>>sf   BE#C6 ?C4 C6 *E.D/E4C6 6DD DD E+EE
EE__main__)T)#__doc__builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arr   ospathlibr=   numpyr8   environPathunlinkmainappmodr   voice.controlcontrolSESSION_FILEr,   r#   fromfiler:   r<   r   ndarrayr'   r0   rC   rR   r   rK   r   r   r   <module>rh      s      	    !;

  ' ( / /4 / @

8     #w||$:; BKK4BJJG	 8RZZ 8
(h :?" zGKK
 r   