o
    GXh*                     @   s   d dl Z d dlZd dlZd dlmZmZ G dd dejZG dd dejZ	G dd dejZ
d	d
 Zdd Zedkr@e  dS dS )    N)TESTFNunlinkc                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )CollationTestsc                 C   sJ   t d}| t |d dd  W d    d S 1 sw   Y  d S )N:memory:c                 S      | |k| |k  S N xyr   r   </opt/python-3.10.19/usr/lib/python3.10/sqlite3/test/hooks.py<lambda>"       zACollationTests.test_create_collation_not_string.<locals>.<lambda>)sqliteconnectassertRaises	TypeErrorcreate_collationselfconr   r   r    test_create_collation_not_string   s   
"z/CollationTests.test_create_collation_not_stringc                 C   sV   t d}| t}|dd W d    n1 sw   Y  | t|jd d S )Nr   X*   zparameter must be callable)r   r   r   r   r   assertEqualstr	exceptionr   r   cmr   r   r   "test_create_collation_not_callable$   s
   
z1CollationTests.test_create_collation_not_callablec                 C   sL   t d}| t j |ddd  W d    d S 1 sw   Y  d S )Nr   u   colläc                 S   r   r   r   r	   r   r   r   r   -   r   z@CollationTests.test_create_collation_not_ascii.<locals>.<lambda>)r   r   r   ZProgrammingErrorr   r   r   r   r   test_create_collation_not_ascii*   s   
"z.CollationTests.test_create_collation_not_asciic                 C   sl   G dd dt }td}dd }||d| |d }| |d d d	 | |d
 d d d S )Nc                   @   s   e Zd Zdd ZdS )zCCollationTests.test_create_collation_bad_upper.<locals>.BadUpperStrc                 S   s   d S r   r   )r   r   r   r   upper1      zICollationTests.test_create_collation_bad_upper.<locals>.BadUpperStr.upperN)__name__
__module____qualname__r!   r   r   r   r   BadUpperStr0   s    r&   r   c                 S      | |k| |k   S r   r   r	   r   r   r   r   4       z@CollationTests.test_create_collation_bad_upper.<locals>.<lambda>mycollz
            select x from (
            select 'a' as x
            union
            select 'b' as x
            ) order by x collate mycoll
            r   b   a)r   r   r   r   executefetchallr   )r   r&   r   r)   resultr   r   r   test_create_collation_bad_upper/   s   
z.CollationTests.test_create_collation_bad_upperc                 C   s   dd }t d}|d| d}|| }| j|g ddd |dd  | t j}|| }W d    n1 s@w   Y  | t|j	d	 d S )
Nc                 S   r'   r   r   r	   r   r   r   r)   A   s   z5CollationTests.test_collation_is_used.<locals>.mycollr   r)   
            select x from (
            select 'a' as x
            union
            select 'b' as x
            union
            select 'c' as x
            ) order by x collate mycoll
            )c)r*   )r,   #the expected order was not returnedmsg"no such collation sequence: mycoll)
r   r   r   r-   r.   r   r   OperationalErrorr   r   )r   r)   r   sqlr/   r   r   r   r   test_collation_is_used@   s   
	z%CollationTests.test_collation_is_usedc                 C   sH   dd }t d}|d| d}|| }| j|g ddd d S )	Nc                 S   s   | |k| |k   d S )Nl        r   r	   r   r   r   r)   Z   s   zCCollationTests.test_collation_returns_large_integer.<locals>.mycollr   r)   r1   r2   r4   r5   r   r   r   r-   r.   r   )r   r)   r   r9   r/   r   r   r   $test_collation_returns_large_integerY   s   
	
z3CollationTests.test_collation_returns_large_integerc                 C   sd   t d}|ddd  |ddd  |d }| |d d d | |d	 d d
 dS )z
        Register two different collation functions under the same name.
        Verify that the last one is actually used.
        r   r)   c                 S   r   r   r   r	   r   r   r   r   r   r   z>CollationTests.test_collation_register_twice.<locals>.<lambda>c                 S   r'   r   r   r	   r   r   r   r   s   r(   zi
            select x from (select 'a' as x union select 'b' as x) order by x collate mycoll
            r   r*   r+   r,   Nr;   )r   r   r/   r   r   r   test_collation_register_twicel   s   
z,CollationTests.test_collation_register_twicec                 C   sr   t d}|ddd  |dd | t j}|d W d   n1 s)w   Y  | t|jd dS )zu
        Register a collation, then deregister it. Make sure an error is raised if we try
        to use it.
        r   r)   c                 S   r   r   r   r	   r   r   r   r      r   z:CollationTests.test_deregister_collation.<locals>.<lambda>Nz?select 'a' as x union select 'b' as x order by x collate mycollr7   )	r   r   r   r   r8   r-   r   r   r   r   r   r   r   test_deregister_collationz   s   
z(CollationTests.test_deregister_collationN)r#   r$   r%   r   r   r    r0   r:   r<   r=   r>   r   r   r   r   r      s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ProgressTestsc                    s>   t d}g   fdd}||d |d |   dS )zK
        Test that the progress handler is invoked once it is set.
        r   c                           d  dS Nr   appendr   Zprogress_callsr   r   progress      
z:ProgressTests.test_progress_handler_used.<locals>.progressr+   z0
            create table foo(a, b)
            N)r   r   set_progress_handlerr-   
assertTruer   r   rE   r   rD   r   test_progress_handler_used   s   

z(ProgressTests.test_progress_handler_usedc                    sr   t d}g   fdd}||d | }|d t }g  ||d |d t }| || dS )	z=
        Test that the opcode argument is respected.
        r   c                      r@   rA   rB   r   rD   r   r   rE      rF   z1ProgressTests.test_opcode_count.<locals>.progressr+   z1
            create table foo (a, b)
               z1
            create table bar (a, b)
            N)r   r   rG   cursorr-   lenZassertGreaterEqual)r   r   rE   cursZfirst_countZsecond_countr   rD   r   test_opcode_count   s   


zProgressTests.test_opcode_countc                 C   s<   t d}dd }||d | }| t j|jd dS )zW
        Test that returning a non-zero value stops the operation in progress.
        r   c                   S   s   dS )Nr+   r   r   r   r   r   rE      r"   z5ProgressTests.test_cancel_operation.<locals>.progressr+   zcreate table bar (a, b)N)r   r   rG   rL   r   r8   r-   )r   r   rE   rN   r   r   r   test_cancel_operation   s   
z#ProgressTests.test_cancel_operationc                    sR   t d}d  fdd}||d |dd |d  |  dd dS )	zc
        Test that setting the progress handler to None clears the previously set handler.
        r   r   c                      s   d dS )Nr+   r   r   r   actionr   r   rE      s   z2ProgressTests.test_clear_handler.<locals>.progressr+   Nz&select 1 union select 2 union select 3z progress handler was not cleared)r   r   rG   r-   r.   r   rI   r   rQ   r   test_clear_handler   s   
z ProgressTests.test_clear_handlerN)r#   r$   r%   rJ   rO   rP   rS   r   r   r   r   r?      s
    r?   c                   @   sB   e Zd Zejdd Zdd Zdd Zdd Zd	d
 Z	dd Z
dS )TraceCallbackTestsc              
   #   sT    zg  |  fdd d V  W |  | | d  d S |  | | d  w )Nc                    s
     | S r   rB   )stmtZtracedr   r   r      s   
 z5TraceCallbackTests.check_stmt_trace.<locals>.<lambda>)set_trace_callbackr   )r   cxexpectedr   rV   r   check_stmt_trace   s   z#TraceCallbackTests.check_stmt_tracec                    sT   t d}g   fdd}|| |d |   | tdd  D  dS )zI
        Test that the trace callback is invoked once it is set.
        r   c                         |  d S r   rB   Z	statementtraced_statementsr   r   trace      z:TraceCallbackTests.test_trace_callback_used.<locals>.tracecreate table foo(a, b)c                 s   s    | ]}d |v V  qdS )zcreate table fooNr   .0rU   r   r   r   	<genexpr>       z>TraceCallbackTests.test_trace_callback_used.<locals>.<genexpr>N)r   r   rW   r-   rH   anyr   r   r_   r   r]   r   test_trace_callback_used   s   



z+TraceCallbackTests.test_trace_callback_usedc                    sH   t d}g   fdd}|| |d |d |  d dS )zb
        Test that setting the trace callback to None clears the previously set callback.
        r   c                    r[   r   rB   r\   r]   r   r   r_      r`   z;TraceCallbackTests.test_clear_trace_callback.<locals>.traceNra   ztrace callback was not cleared)r   r   rW   r-   ZassertFalserg   r   r]   r   test_clear_trace_callback   s   



z,TraceCallbackTests.test_clear_trace_callbackc              
      s   dt d}g   fdd}|| |d |d  |  | tfdd D d	td
t	t f  dS )zG
        Test that the statement can contain unicode literals.
        u   öäüÖÄÜß€r   c                    r[   r   rB   r\   r]   r   r   r_      r`   z6TraceCallbackTests.test_unicode_content.<locals>.tracecreate table foo(x)z insert into foo(x) values ('%s')c                 3   s    | ]} |v V  qd S r   r   rb   )unicode_valuer   r   rd      re   z:TraceCallbackTests.test_unicode_content.<locals>.<genexpr>z-Unicode data %s garbled in trace callback: %sz, N)
r   r   rW   r-   ZcommitrH   rf   asciijoinmaprg   r   )r^   rk   r   test_unicode_content   s   


z'TraceCallbackTests.test_unicode_contentc                    s   g   fdd}ddg}|  tt tjtd d}tt}|| | }||d  |d ||d  |  | d S )	Nc                    r[   r   rB   r\   r]   r   r   r_     r`   z=TraceCallbackTests.test_trace_callback_content.<locals>.tracerj   zinsert into foo(x) values(1))Zisolation_levelr   zcreate table bar(x)r+   )	Z
addCleanupr   r   r   r   rW   rL   r-   r   )r   r_   ZqueriesZcon1Zcon2Zcurr   r]   r   test_trace_callback_content  s   


z.TraceCallbackTests.test_trace_callback_contentc              	   C   s   g d}t d}| ||5 | |d |ddd tdD  W d    n1 s/w   Y  W d    d S W d    d S 1 sGw   Y  d S )N)create table t(t)zBEGIN zinsert into t values(0)zinsert into t values(1)zinsert into t values(2)ZCOMMITr   rq   zinsert into t values(?)c                 s   s    | ]}|fV  qd S r   r   )rc   vr   r   r   rd      s    z=TraceCallbackTests.test_trace_expanded_sql.<locals>.<genexpr>   )r   r   rZ   r-   Zexecutemanyrange)r   rY   rX   r   r   r   test_trace_expanded_sql  s   

"z*TraceCallbackTests.test_trace_expanded_sqlN)r#   r$   r%   
contextlibcontextmanagerrZ   rh   ri   ro   rp   ru   r   r   r   r   rT      s    
	rT   c                  C   s   t ttg} tdd | D S )Nc                 S   s   g | ]	}t  |qS r   )unittestZ
TestLoaderZloadTestsFromTestCase)rc   tr   r   r   
<listcomp>*  s    zsuite.<locals>.<listcomp>)r   r?   rT   rx   Z	TestSuite)Ztestsr   r   r   suite#  s   r{   c                  C   s   t  } | t  d S r   )rx   ZTextTestRunnerrunr{   )Zrunnerr   r   r   test-  s   r}   __main__)rv   rx   Zsqlite3r   Ztest.support.os_helperr   r   ZTestCaser   r?   rT   r{   r}   r#   r   r   r   r   <module>   s   hEX

