
    ^h               	       B   S SK r S SKJr  S SKJr  S SKJr  S SKrS SKJ	r	  SSK
JrJrJrJr  \R                  R                   S 5       r\R                  R                   S	 5       r\R                  R                   S
 5       rS rS rS\4S jrS rS r\R2                  S 5       r\R2                  S 5       r\R                  R                   \R                  R9                  S\SS/\SS0/S/\SS//5      S 5       5       r\R                  R                   S 5       r\R                  R                   S 5       r\R                  R                   S 5       r \R                  R                   S 5       r!\R2                  S 5       r"\R                  R                   S 5       r#g)    N)Path)SimpleNamespace)List)LanguageServerManager   )EditableFileShadowFilesystemErrorextract_or_nonesetup_shadow_filesystemc                    #    U S-  nUR                  S5        [        U5      nUR                  5       I S h  vN   UR                  SS/:X  d   eg  N7f)Nzexisting.pyza
testatest)
write_textr   readlinestmp_pathpatheditable_files      i/home/james-whalen/.local/lib/python3.13/site-packages/jupyter_lsp/tests/test_virtual_documents_shadow.py	test_readr      sT     m#DOOI &M



3-/// s   5AAAc                    #    U S-  n[        U5      nUR                  5       I S h  vN   UR                  S/:X  d   eg  N7f)Nz
missing.py )r   r   r   )r   r   missing_files      r   test_read_missingr      sF     l"D%L



"%%% s   $A?Ac                 t  #    U S-  n[        U5      nUR                  5       I S h  vN   UR                  " S0 UR                  D6  UR                  SS/:X  d   eUR                  SSSS.SSS.S	9  UR                  SS
/:X  d   eUR                  " S0 UR                  D6  UR                  S/:X  d   eg  N7f)Ntest.pynewtextves   r   )line	character   )startendvestr   )znew
text)r   )r   r   apply_change
full_ranger   r   s      r   test_apply_changer*   (   s      iD &M



Gm.F.FG5&/111 aa0qq6Q   5&/111>]%=%=>2$&&& s   $B8B6BB8c                      SSS00n [        U S/5      SS0:X  d   e[        U SS/5      S:X  d   e[        U SS/5      b   eg )Nnestedvaluer!   missing)r
   )objs    r   test_extract_or_noner0   <   s]    gq\
"C3
+|;;;37 349993G 45===    c                     SSXS.0S.$ )NztextDocument/didOpentextDocumenturir   methodparams r4   s     r   did_openr:   C       (!3#=> r1   changesc                     SSU 0US.S.$ )NtextDocument/didChanger5   )r3   contentChangesr6   r9   )r5   r<   s     r   
did_changer@   J   s    *$)3<7K r1   c                     SSXS.0S.$ )NtextDocument/didSaver3   r4   r6   r9   r4   s     r   did_save_with_textrC   Q   r;   r1   c                     SSSU 00S.$ )NrB   r3   r5   r6   r9   )r5   s    r   did_save_without_textrE   X   s    ,%QT8VWWr1   c                 6    [        U R                  S5      5      $ )Nz.virtual_documents)strmkdir)tmpdirs    r   shadow_pathrJ   \   s    v||0122r1   c                  8    [        5       n SS/ S/SS.0U l        U $ )Npython-lsp-serverTpythonr   )requires_documents_on_diskargv	languagesversion)r   language_servers)managers    r   rS   rS   a   s1    #%G*."	
 G Nr1   z'message_func, content, expected_contentcontent
of
opened
filer   zcontent after changezcontent at savec                 j  #    [        [        U 5      R                  5       5      n[        U 5      S-  nU" UR                  5       U5      nU" SUSU5      I S h  vN n[        U[        5      (       d   e[        U5       n	U	R                  5       U:X  d   e S S S 5        g  NG! , (       d  f       g = f7f)Nr   clientrL   )r   r   as_uri
isinstancerG   openr   )
rJ   message_funccontentexpected_contentrS   shadowok_file_pathmessageresultfs
             r   test_shadowrb   o   s      %T+%6%=%=%?@F$y0L<..0':G(G-@'JJFfc""""	l	qvvx++++ 
	 K 
	s*   AB3B &B3?B"
B3"
B0,B3c                 8  #    [        U 5      S-  n[        [        U5      R                  5       5      n[        U5      S-  n[        SSS00S9n[	        UR                  5       S5      nU" SUSU5      I S	h  vN nUb   eUR                  5       (       a   eg	 N!7f)
z@We call server well behaved when it does not require a disk copywellr   rL   rN   FrR   rT   rV   N)r   r   rW   r   r:   exists)rJ   shadow_path_for_wellr]   r^   rS   r_   r`   s          r   &test_no_shadow_for_well_behaved_serverrh      s     
  ,v5$T*>%?%F%F%HIF,-	9L-0Le/TUG |**,.IJG(G-@'JJF>>#**,,,,,	 Ks   A4B6B7"Bc                 T  #    [        U 5      S-  n[        UR                  5       5      n[        U5      S-  n[        SSS00S9n[	        UR                  5       S5      nU" SUSU5      I S h  vN nUc   eUR                  5       (       d   eUR                  5       (       d   eg  N87f)	Nillr   rL   rN   Tre   rT   rV   )r   r   rW   r   r:   rf   is_dir)rJ   shadow_path_for_illr]   r^   rS   r_   r`   s          r   *test_shadow_created_for_ill_behaved_serverrm      s      {+e3$%8%?%?%ABF+,y8L-0Ld/STG |**,.IJG(G-@'JJF%%''''%%''''	 Ks   A+B(-B&.9B(c                   ^^#    [        [        U 5      R                  5       5      m[        U 5      S-  R                  5       nUU4S jn[        R                  " [
        SS9   U" SS05      I S h  vN   S S S 5        [        R                  " [
        SS9   U" SS0 0S	.5      I S h  vN   S S S 5        U" SS
05      I S h  vN nUb   eU" [        SS5      5      I S h  vN nUb   eU" [        U5      5      I S h  vN nUb   e[        R                  " [
        SS9   U" SSSU00S	.5      I S h  vN   S S S 5        g  N! , (       d  f       N= f N! , (       d  f       N= f N N Nm N9! , (       d  f       g = f7f)Nr   c                    > T" SU ST5      $ NrV   rL   r9   r_   rS   r]   s    r   
run_shadow(test_shadow_failures.<locals>.run_shadow       h)<gFFr1   zCould not get textDocument frommatchr7   r>   zCould not get URI fromr3   r6   ztextDocument/completionzfile:///other/path.pyr[   z.* is missing contentChangesr5   )r   r   rW   pytestraisesr	   r:   rE   )rJ   rS   ok_file_urirr   r`   r]   s    `   @r   test_shadow_failuresrz      s~    $T+%6%=%=%?@F$y088:KG 
,4U	V($<=>>> 
W 
,4L	M/NB;OP
 	
 	
 
N x)BCDDF>> h'>	JKKF>> 3K@AAF>> 
,4R	S2)E;+?@
 	
 	
 
T	S+ 	? 
W	V
	
 
N	M E L B
	
 
T	Ss   AF#E1E2E6!FE(E)E-FE)F!E+"F?E- "F"E15E/6E1:	FE
EFE
E&"F+F-F/E11
E?;Fc                 >  ^^#    [        U 5      S-  S-  R                  5       n[        [        U 5      R                  5       5      mUU4S jn[        R                  " [
        SS9   U" [        US5      5      I S h  vN   S S S 5        g  N! , (       d  f       g = f7f)Nz..r   c                    > T" SU ST5      $ rp   r9   rq   s    r   rr   )test_shadow_traversal.<locals>.run_shadow   rt   r1   z)is not relative to shadow filesystem rootru   r[   )r   rW   r   rw   rx   r	   r:   )rJ   rS   file_beyond_shadow_root_urirr   r]   s    `  @r   test_shadow_traversalr      s     #'#4t#;i#G"O"O"Q$T+%6%=%=%?@FG 
%P
 "=yIJJJ
 
 	K
 
s0   A"B&B<B
=B	B
B
BBc              #      #    [        U 5      S-  nUR                  5         UR                  S5        Uv   UR                  S5        g 7f)Nno_permission_dirr   i  )r   rH   chmod)rI   r   s     r   forbidden_shadow_pathr      s<     <--DJJLJJu
J 	JJus   AAc                 &  ^^^#    U S-  R                  5       m[        U R                  5       5      mUUU4S jnUR                  [        R                  5         U" 5       I S h  vN b   eU" 5       I S h  vN b   e S S S 5        UR
                  S:X  d   eUR                  [        R                  5         U" 5       I S h  vN b   e S S S 5        SUR
                  ;   d   eSUR
                  ;   d   eUR                  5         UR                  [        R                  5         U" 5       I S h  vN b   e S S S 5        UR
                  S:X  d   eg  N N! , (       d  f       N= f N! , (       d  f       N= f NK! , (       d  f       NK= f7f)Nr   c                  2   > [        TS5      n T" SU ST5      $ )Nr[   rV   rL   )r:   )r_   file_urirS   r]   s    r   send_change$test_io_failure.<locals>.send_change   s!    8Y/h)<gFFr1   r   z6initialization of shadow filesystem failed three timesPermissionError)rW   r   at_levelloggingWARNINGr   clear)r   rS   caplogr   r   r]   s    `  @@r   test_io_failurer      s;    %	199;H$%:%A%A%CDFG 
	) ]"*** ]"*** 
* ;;" 
	) ]"*** 
*Cv{{RRR+++
LLN 
	) ]"*** 
*;;" #" 
*	) # 
*	) # 
*	)s   AFE$E%E6E7E?9F8E-E+E-AF'F 2E>3F ;FEE
E($F+E--
E;7F>F  
F
F)$r   pathlibr   typesr   typingr   rw   jupyter_lspr   virtual_documents_shadowr   r	   r
   r   markasyncior   r   r*   r0   r:   r@   rC   rE   fixturerJ   rS   parametrizerb   rh   rm   rz   r   r   r   r9   r1   r   <module>r      s     !   -  0 0 & & ' '&>T X 3 3 
 
 -	.0KL	v5679OP	.0AB	, 	, - -( ( (& $
 $
N K K    r1   