o
    Ďi9?                     @   sv  d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dl m!Z! d dl"m#Z#m$Z$ dd Z%dd Z&zddl'm(Z( W n e)y}   dZ(Y nw e*de j+j,dd Z-dd Z.e j+/dddgdd Z0e j+/ddd gd!d" Z1e j+/d#g d$d%d& Z2e j+/dg d'd(d) Z3e j+/dg d*d+d, Z4e j+/dg d-d.d/ Z5e j+/d0d1d2gd3d4 Z6d5d6 Z7d7d8 Z8d9d: Z9e j+j,d;d< Z:e j+j,d=d> Z;d?d@ Z<dAdB Z=e j>dCdD Z?dEdF Z@dGdH ZAdIdJ ZBdKdL ZCdMdN ZDdOdP ZEdQdR ZFdSdT ZGdUdV ZHdS )W    N)PtkHistoryAdapter)acceptaccept_or_jump_to_endaccept_tokenaccept_characteraccept_wordaccept_and_keep_cursordiscardllm_autosuggestionNavigableAutoSuggestFromHistoryswap_autosuggestion_upswap_autosuggestion_down)	skip_over)create_ipython_shortcutsreset_search_buffer)
decorators)InMemoryHistory)Buffer)Document)AutoSuggestFromHistory)DEFAULT_BUFFER)patchMockc                  C   sR   dd l m  m  m}  tjtdd | j W d    d S 1 s"w   Y  d S )Nr   z8\.12.+accept_or_jump_to_endmatch)'IPython.terminal.shortcuts.auto_suggestterminal	shortcutsauto_suggestpytestwarnsDeprecationWarningaccept_in_vi_insert_mode)iptsa r$   a/home/jeff/fluffinator/venv/lib/python3.10/site-packages/IPython/terminal/tests/test_shortcuts.pytest_deprected   s   "r&   c                 C   sF   t  }t  |_t  |j_| |j_||j_||jj_t| |d|j_|S )N)textcursor_position)r   current_buffer
suggestionr'   r(   r   document)r'   cursorr*   eventr$   r$   r%   
make_event%   s   

r.      )	FIBONACCI 
jupyter_aic                     s   t  } t }| |_d|_tg d|j_d}t }tt|d|_	|j	j
|dd t|I d H  |j	jjtt|d  ks?J d S )Nz;IPython.terminal.tests.fake_llm.FibonacciCompletionProvider)return_valuezdef fibhistoryT)move_cursor)r   get_ipythonr   llm_provider_classr   history_manager	get_ranger   r   r)   insert_textr
   r*   r'   r0   len)provideripr'   r-   r$   r$   r%   test_llm_autosuggestion6   s   "r?   c                  C   s@   t  } t }|| _t }d| _t }|| }|dk sJ d S )Nz-tests.fake_llm.SlowStartingCompletionProviderg?)r7   r   r   timeperf_counterr8   )r>   r=   startendelapsedr$   r$   r%   ,test_slow_llm_provider_should_not_block_initH   s   rE   ztext, suggestion, expected)r1   def out(tag: str, n=50):rF   )def out(tag: str, n=50):rH   c                 C   sL   t | t| |}|j}t |_t| |jjsJ |jjd |fks$J d S Nr   )r.   r<   r)   r   r;   r   called	call_args)r'   r*   expectedr-   bufferr$   r$   r%   test_acceptS   s   rN   ztext, suggestion)r1   rF   )rG   rH   c                 C   sD   t | t| |}|j}t |_t| |jjrJ |jd u s J d S N)r.   r<   r)   r   r;   r	   rJ   r*   )r'   r*   r-   rM   r$   r$   r%   test_discardc   s   rP   z text, cursor, suggestion, called))123456   	123456789T)rQ      rS   F)z123456   
789rR   rS   Tc                 C   sB   t | ||}t |j_t| |r|jj  dS |jj  dS )z?
    test that autosuggest is only applied at end of line.
    N)r.   r   r)   r;   r   assert_calledassert_not_called)r'   r,   r*   rJ   r-   r$   r$   r%   test_autosuggest_at_EOLs   s   
rW   )r1   rF   rG   def out(tag: str, n=50):zef )de f out(tag: str, n=50):f defz out(tag: str, n=50): )rG   rH   zout()zdef ozut(tag: str, n=50):zut()zdef ouzt(tag: str, n=50):zt()zdef outz(tag: str, n=50):()zdef out(ztag: str, n=50):ztag: )z	def out(tzag: str, n=50):zag: )z
def out(tazg: str, n=50):zg: )zdef out(tagz: str, n=50):z: )zdef out(tag:z str, n=50):ra   )zdef out(tag: zstr, n=50):zstr, )zdef out(tag: sz
tr, n=50):ztr, )zdef out(tag: stz	r, n=50):zr, )zdef out(tag: strz, n=50):z, n)zdef out(tag: str,z n=50):z n)zdef out(tag: str, zn=50):zn=)zdef out(tag: str, nz=50):=)zdef out(tag: str, n=z50):z50))zdef out(tag: str, n=5z0):z0))zdef out(tag: str, n=50):rd   )zdef out(tag: str, n=50):re   c                 C   L   t | t| |}t |j_t| |jjjsJ |jjjd |fks$J d S rI   )r.   r<   r   r)   r;   r   rJ   rK   r'   r*   rL   r-   r$   r$   r%   test_autosuggest_token   s
   
rh   ))r1   rF   rZ   )rZ   r[   e)r\   r]   fr_   c                 C   rf   rI   )r.   r<   r   r)   r;   r   rJ   rK   rg   r$   r$   r%   test_accept_character   s
   

rk   )rX   rY   )der]   r^   r_   )rG   rH   z	out(tag: c                 C   rf   rI   )r.   r<   r   r)   r;   r   rJ   rK   rg   r$   r$   r%   test_accept_word   s
   
rm   z"text, suggestion, expected, cursor)r1   rF   rF   r   )rG   rH   rH      c                 C   sV   t | ||}|j}t |_t| |jjsJ |jjd |fks"J |j|ks)J d S rI   )r.   r)   r   r;   r   rJ   rK   r(   )r'   r*   rL   r,   r-   rM   r$   r$   r%   test_accept_and_keep_cursor   s   ro   c                  C   sl   d} t | t| d}t |j_td}t| |jjjrJ |js$J W d    d S 1 s/w   Y  d S )NrF   r1   z?prompt_toolkit.key_binding.bindings.named_commands.forward_word)r.   r<   r   r)   r;   r   r   rJ   )fullr-   forward_wordr$   r$   r%   test_autosuggest_token_empty   s   
"rr   c                  C   sf   t  } d| jj_t  | j_t  }d|jj_t  |jj_t|  | jj	  t| |jjj
t d S )Nz	some textr1   )r   r)   r+   r'   resetapplayoutfocusr   assert_called_onceassert_called_once_withr   )event_with_textevent_emptyr$   r$   r%   test_reset_search_buffer   s   


r{   c                  C   sD   t  } t }| |_t }t |_t|du sJ t|du s J dS )zHEnsure that swapping autosuggestions does not break with other providersN)r   r7   r   r   r   r)   r   r   )r=   r>   r-   r$   r$   r%   test_other_providers  s   r|   c                     s.  t  tg dd} t| d t }|_|  2 z3 d H W }q6 d _d _t}t	}t
 } |_ fdd}| jdksAJ || | jd	ksMJ || | jd
ksYJ || | jdkseJ || | jd
ksqJ || | jd	ks}J || | jdksJ || | jd
ksJ d S )N)very_averyvery_bvery_chistory_stringsr4      r~   c                           j} |  _| S rO   get_suggestionr+   r*   r*   rM   r=   r$   r%   r         z/test_navigable_provider.<locals>.get_suggestion_c_b_ar   r   r   r7   r   loadr(   r'   r   r   r   r)   r5   r>   _updownr-   r   r$   r   r%   test_navigable_provider  s>   
r   c                     s   t  tddgd} t| d t }|_|  2 z3 d H W }q6 d _d _t}t	}t
 } |_ fdd}| jd	ksAJ || | jd
ksMJ || | jdksYJ || | jd
kseJ || | jd	ksqJ d S )Nzvery_a
very_br   r   r4   r   r~   c                     r   rO   r   r   r   r$   r%   r   T  r   zAtest_navigable_provider_multiline_entries.<locals>.get_suggestionr   r   r   r   r   r$   r   r%   )test_navigable_provider_multiline_entriesA  s2   
r   c                  C   s   t  } t | _| S rO   )r   r   default_buffer)sessionr$   r$   r%   create_session_mockh  s   r   c                  C   s   t  } d| _t }| | | jdksJ |jj  | jdks"J t }| | d| _| jdks4J |jj  | jdksAJ d| _|   |jj  |jj  | jdks[J d S )Nr/   r      rT   )r   
skip_linesr   connectr   on_text_insertfire
disconnect)r=   	session_1	session_2r$   r$   r%   "test_navigable_provider_connectionn  s$   

r   c                  c   s8    t  } t | _t| | j_z	| V  W d | _d S d | _w rO   )r7   r   pt_appr   key_bindings)r>   r$   r$   r%   ipython_with_prompt  s   r   c                    s   t  } fdd|jjjD S )Nc                    s   g | ]	}|j  kr|qS r$   )handler).0bindingcommandr$   r%   
<listcomp>  s
    
z,find_bindings_by_command.<locals>.<listcomp>)r7   r   r   bindings)r   r>   r$   r   r%   find_bindings_by_command  s   
r   c                 C   s  t t}t|dksJ dg ddg| _t t}t|dks!J t|d jg dks.J t|d jt|d jks>J |d j|d jksJJ dddg| _t t}t|dks]J t|d jg dksjJ t|d jt|d jkszJ |d j|d jksJ d S )Nr/   !IPython:auto_suggest.accept_token)abcr   new_keysr   always)r   
new_filter)r   r   r<   r   listkeysfilter)r   originalmatchedr$   r$   r%   test_modify_unique_shortcut  s      r   c                 C   s`   t t}t|dksJ dg dg| _t t}t|dksJ g | _t t}t|dks.J d S )Nr/   r   r   r   )r   r   r<   r   r   r   r$   r$   r%   test_disable_shortcut  s   r   c                 C   s   t t}dd |D }|h dksJ tjtdd ddgdg| _W d    n1 s-w   Y  ddgd	d
g| _t t}dd |D }|h dksNJ d S )Nc                 S      h | ]}|j d  qS r   r   r   mr$   r$   r%   	<setcomp>      z4test_modify_shortcut_with_filters.<locals>.<setcomp>>   }"')]zMultiple shortcuts matchingr   IPython:auto_match.skip_overxr   z6focused_insert & auto_match & followed_by_single_quote)r   r   match_filterc                 S   r   r   r   r   r$   r$   r%   r     r   >   r   r   r   r   r   )r   r   r   raises
ValueErrorr   )r   r   matched_keysr$   r$   r%   !test_modify_shortcut_with_filters  s   
r   c                   C   s   d S rO   r$   r$   r$   r$   r%   example_command  s   r   c                 C   sr   t t}t|dksJ tjtdd ddgdg| _W d    n1 s&w   Y  t t}t|dks7J d S )Nr   zexample_command is not a knownr   r   r   r   )r   r   r<   r   r   r   r   r   r$   r$   r%   !test_add_shortcut_for_new_command  s   
r   c                 C   sH   t jtdd ddgdgdg| _W d    d S 1 sw   Y  d S )NzNo shortcuts matchingr   r   r   y)r   
match_keysr   )r   r   r   r   )r   r$   r$   r%   test_modify_shortcut_failure  s   "r   c                 C   s   t t}t|dksJ tjtdd dg ddg| _W d    n1 s&w   Y  ddgddg| _t t}t|dks@J g | _t t}t|dksOJ d S )	Nr   z"Cannot add a shortcut without keysr   r   Tr   r   creater   rR   )r   r   r<   r   r   r   r   r   r$   r$   r%   &test_add_shortcut_for_existing_command  s   
r   c                  C   s<   t  } | jd u s
J ddgddg}|| _| j|ksJ d S )Nr   r   Tr   )r7   r   r   )ipythonr   r$   r$   r%   )test_setting_shortcuts_before_pt_app_init  s   r   )Ir   r@   !IPython.terminal.interactiveshellr   r   r   r   r   r   r   r   r	   r
   r   r   r   %IPython.terminal.shortcuts.auto_matchr   IPython.terminal.shortcutsr   r   IPython.testingr   decprompt_toolkit.historyr   prompt_toolkit.bufferr   prompt_toolkit.documentr   prompt_toolkit.auto_suggestr   prompt_toolkit.enumsr   unittest.mockr   r   r&   r.   fake_llmr0   ImportErrorskip_withoutmarkasyncior?   rE   parametrizerN   rP   rW   rh   rk   rm   ro   rr   r{   r|   r   r   r   r   fixturer   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   <module>   s    4
	
	


	



4
&

	