3
tY]                 @   s  d dl Z d dlZyd dlZW n ek
r4   dZY nX 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e jed	G d
d de jZG dd de jZG dd de j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 )    N)TESTFNunlinkc               @   st   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d Zdd Zdd Zdd Zdd ZdS )ModuleTestsc             C   s   | j tjddtj  d S )Nz2.0zapilevel is %s, should be 2.0)assertEqualsqliteZapilevel)self r   #lib/python3.6/sqlite3/test/dbapi.pyCheckAPILevel#   s    
zModuleTests.CheckAPILevelc             C   s   | j tjddtj  d S )N   zthreadsafety is %d, should be 1)r   r   Zthreadsafety)r   r   r   r	   CheckThreadSafety'   s    
zModuleTests.CheckThreadSafetyc             C   s   | j tjddtj  d S )NZqmarkz%paramstyle is '%s', should be 'qmark')r   r   Z
paramstyle)r   r   r   r	   CheckParamStyle+   s    
zModuleTests.CheckParamStylec             C   s   | j ttjtd d S )Nz&Warning is not a subclass of Exception)
assertTrue
issubclassr   Warning	Exception)r   r   r   r	   CheckWarning0   s    zModuleTests.CheckWarningc             C   s   | j ttjtd d S )Nz$Error is not a subclass of Exception)r   r   r   Errorr   )r   r   r   r	   
CheckError4   s    zModuleTests.CheckErrorc             C   s   | j ttjtjd d S )Nz)InterfaceError is not a subclass of Error)r   r   r   InterfaceErrorr   )r   r   r   r	   CheckInterfaceError8   s    zModuleTests.CheckInterfaceErrorc             C   s   | j ttjtjd d S )Nz(DatabaseError is not a subclass of Error)r   r   r   DatabaseErrorr   )r   r   r   r	   CheckDatabaseError<   s    zModuleTests.CheckDatabaseErrorc             C   s   | j ttjtjd d S )Nz,DataError is not a subclass of DatabaseError)r   r   r   	DataErrorr   )r   r   r   r	   CheckDataError@   s    zModuleTests.CheckDataErrorc             C   s   | j ttjtjd d S )Nz3OperationalError is not a subclass of DatabaseError)r   r   r   OperationalErrorr   )r   r   r   r	   CheckOperationalErrorD   s    z!ModuleTests.CheckOperationalErrorc             C   s   | j ttjtjd d S )Nz1IntegrityError is not a subclass of DatabaseError)r   r   r   IntegrityErrorr   )r   r   r   r	   CheckIntegrityErrorH   s    zModuleTests.CheckIntegrityErrorc             C   s   | j ttjtjd d S )Nz0InternalError is not a subclass of DatabaseError)r   r   r   InternalErrorr   )r   r   r   r	   CheckInternalErrorL   s    zModuleTests.CheckInternalErrorc             C   s   | j ttjtjd d S )Nz3ProgrammingError is not a subclass of DatabaseError)r   r   r   ProgrammingErrorr   )r   r   r   r	   CheckProgrammingErrorP   s    z!ModuleTests.CheckProgrammingErrorc             C   s   | j ttjtjd d S )Nz4NotSupportedError is not a subclass of DatabaseError)r   r   r   NotSupportedErrorr   )r   r   r   r	   CheckNotSupportedErrorT   s    
z"ModuleTests.CheckNotSupportedErrorN)__name__
__module____qualname__r
   r   r   r   r   r   r   r   r   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	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ejejd!kddd Zd S )"ConnectionTestsc             C   s0   t jd| _| jj }|jd |jdd d S )Nz:memory:z4create table test(id integer primary key, name text)z!insert into test(name) values (?)foo)r)   )r   connectcxcursorexecute)r   cur   r   r	   setUp[   s    

zConnectionTests.setUpc             C   s   | j j  d S )N)r+   close)r   r   r   r	   tearDowna   s    zConnectionTests.tearDownc             C   s   | j j  d S )N)r+   commit)r   r   r   r	   CheckCommitd   s    zConnectionTests.CheckCommitc             C   s   | j j  | j j  dS )zV
        A commit should also work when no changes were made to the database.
        N)r+   r2   )r   r   r   r	   CheckCommitAfterNoChangesg   s    
z)ConnectionTests.CheckCommitAfterNoChangesc             C   s   | j j  d S )N)r+   rollback)r   r   r   r	   CheckRollbackn   s    zConnectionTests.CheckRollbackc             C   s   | j j  | j j  dS )zX
        A rollback should also work when no changes were made to the database.
        N)r+   r5   )r   r   r   r	   CheckRollbackAfterNoChangesq   s    
z+ConnectionTests.CheckRollbackAfterNoChangesc             C   s   | j j }d S )N)r+   r,   )r   r.   r   r   r	   CheckCursorx   s    zConnectionTests.CheckCursorc          	   C   s*   d}| j tj tj|}W d Q R X d S )Nz/foo/bar/bla/23534/mydb.db)assertRaisesr   r   r*   )r   ZYOU_CANNOT_OPEN_THISconr   r   r	   CheckFailedOpen{   s    zConnectionTests.CheckFailedOpenc             C   s   | j j  d S )N)r+   r0   )r   r   r   r	   
CheckClose   s    zConnectionTests.CheckClosec             C   s   | j | jjtj | j | jjtj | j | jjtj | j | jjtj | j | jjtj | j | jjtj | j | jj	tj	 | j | jj
tj
 | j | jjtj | j | jjtj d S )N)r   r+   r   r   r   r   r   r   r   r   r   r!   r#   )r   r   r   r	   CheckExceptions   s    zConnectionTests.CheckExceptionsc             C   s   t jd}|j }| j|jd |jd | j|jd |jdd | j|jd |jddg |j }| j|jd |j  | j|jd |jddg |j }| j|jd d S )	Nz:memory:Fz?create table transactiontest(id integer primary key, name text)z,insert into transactiontest(name) values (?)r)   Tz-select name from transactiontest where name=?)r)   )r   r*   r,   r   in_transactionr-   fetchoner2   )r   r+   r.   rowr   r   r	   CheckInTransaction   s    

z"ConnectionTests.CheckInTransactionc          	   C   s"   | j t d| j_W d Q R X d S )NT)r9   AttributeErrorr+   r>   )r   r   r   r	   CheckInTransactionRO   s    z$ConnectionTests.CheckInTransactionROc          %   C   s   t jdk r4| jt j t jddd W d Q R X d S | jtt t jt}|jd W d Q R X t jdt dd}|jd W d Q R X t jdt d	 dd(}| jt j	 |jd
 W d Q R X W d Q R X d S )N      z:memory:T)Zurizcreate table test(id integer)zfile:zinsert into test(id) values(0)z?mode=rozinsert into test(id) values(1))rD   rE   rE   )
r   sqlite_version_infor9   r#   r*   Z
addCleanupr   r   r-   r   )r   r+   r   r   r	   CheckOpenUri   s    
zConnectionTests.CheckOpenUrirD   r   z&needs sqlite versions older than 3.3.1c             C   s<   | j tj}tjddd W d Q R X | jt|jd d S )Nz:memory:F)Zcheck_same_threadz shared connections not available)r9   r   r#   r*   r   str	exception)r   cmr   r   r	    CheckSameThreadErrorOnOldVersion   s    z0ConnectionTests.CheckSameThreadErrorOnOldVersionN)rD   rD   r   )r%   r&   r'   r/   r1   r3   r4   r6   r7   r8   r;   r<   r=   rA   rC   rG   unittestZskipIfr   rF   rK   r   r   r   r	   r(   Y   s   r(   c               @   s  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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#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2dadb Z3dcdd Z4deS )fCursorTestsc             C   s6   t jd| _| jj | _| jjd | jjdd d S )Nz:memory:z\create table test(id integer primary key, name text, income number, unique_test text unique)z!insert into test(name) values (?)r)   )r)   )r   r*   r+   r,   r.   r-   )r   r   r   r	   r/      s
    zCursorTests.setUpc             C   s   | j j  | jj  d S )N)r.   r0   r+   )r   r   r   r	   r1      s    
zCursorTests.tearDownc             C   s   | j jd d S )Nzdelete from test)r.   r-   )r   r   r   r	   CheckExecuteNoArgs   s    zCursorTests.CheckExecuteNoArgsc          	   C   s(   | j tj | jjd W d Q R X d S )Nzselect asdf)r9   r   r   r.   r-   )r   r   r   r	   CheckExecuteIllegalSql   s    z"CursorTests.CheckExecuteIllegalSqlc          	   C   s(   | j tj | jjd W d Q R X d S )Nzselect 5+4; select 4+5)r9   r   r   r.   r-   )r   r   r   r	   CheckExecuteTooMuchSql   s    z"CursorTests.CheckExecuteTooMuchSqlc             C   s   | j jd d S )Nzselect 5+4; -- foo bar)r.   r-   )r   r   r   r	   CheckExecuteTooMuchSql2   s    z#CursorTests.CheckExecuteTooMuchSql2c             C   s   | j jd d S )NzT
            select 5+4;

            /*
            foo
            */
            )r.   r-   )r   r   r   r	   CheckExecuteTooMuchSql3   s    z#CursorTests.CheckExecuteTooMuchSql3c          	   C   s&   | j t | jjd W d Q R X d S )N*   )r9   
ValueErrorr.   r-   )r   r   r   r	   CheckExecuteWrongSqlArg   s    z#CursorTests.CheckExecuteWrongSqlArgc             C   s   | j jdd d S )Nzinsert into test(id) values (?)rS   )rS   )r.   r-   )r   r   r   r	   CheckExecuteArgInt   s    zCursorTests.CheckExecuteArgIntc             C   s   | j jdd d S )Nz#insert into test(income) values (?)q=
ף@)rW   )r.   r-   )r   r   r   r	   CheckExecuteArgFloat   s    z CursorTests.CheckExecuteArgFloatc             C   s   | j jdd d S )Nz!insert into test(name) values (?)Hugo)rY   )r.   r-   )r   r   r   r	   CheckExecuteArgString   s    z!CursorTests.CheckExecuteArgStringc             C   s@   | j jdd | j jd| j jf | j j }| j|d d d S )Nz!insert into test(name) values (?)Hu goz select name from test where id=?r   )r[   )r.   r-   	lastrowidr?   r   )r   r@   r   r   r	   !CheckExecuteArgStringWithZeroByte   s    
z-CursorTests.CheckExecuteArgStringWithZeroBytec          
   C   s:   | j t}| jjdd W d Q R X | jt|jd d S )Nzinsert into test(id) values (?)rS   z"parameters are of unsupported type)r9   rT   r.   r-   r   rH   rI   )r   rJ   r   r   r	   CheckExecuteNonIterable   s    z#CursorTests.CheckExecuteNonIterablec             C   s*   | j tj | jjdd W d Q R X d S )Nzinsert into test(id) values (?)   Egon)r_   r`   )r9   r   r!   r.   r-   )r   r   r   r	   CheckExecuteWrongNoOfArgs1   s    z&CursorTests.CheckExecuteWrongNoOfArgs1c          	   C   s(   | j tj | jjd W d Q R X d S )Nzinsert into test(id) values (?))r9   r   r!   r.   r-   )r   r   r   r	   CheckExecuteWrongNoOfArgs2   s    z&CursorTests.CheckExecuteWrongNoOfArgs2c          	   C   s(   | j tj | jjd W d Q R X d S )Nzinsert into test(id) values (?))r9   r   r!   r.   r-   )r   r   r   r	   CheckExecuteWrongNoOfArgs3  s    z&CursorTests.CheckExecuteWrongNoOfArgs3c             C   s:   | j jd | j jddg | j j }| j|d d d S )Nz%insert into test(name) values ('foo')z"select name from test where name=?r)   r   )r.   r-   r?   r   )r   r@   r   r   r	   CheckExecuteParamList  s    
z!CursorTests.CheckExecuteParamListc             C   sJ   G dd dt }| jjd | jjd|  | jj }| j|d d d S )Nc               @   s   e Zd Zdd Zdd ZdS )z0CursorTests.CheckExecuteParamSequence.<locals>.Lc             S   s   dS )Nr   r   )r   r   r   r	   __len__  s    z8CursorTests.CheckExecuteParamSequence.<locals>.L.__len__c             S   s   |dkst dS )Nr   r)   )AssertionError)r   xr   r   r	   __getitem__  s    z<CursorTests.CheckExecuteParamSequence.<locals>.L.__getitem__N)r%   r&   r'   re   rh   r   r   r   r	   L  s   ri   z%insert into test(name) values ('foo')z"select name from test where name=?r   r)   )objectr.   r-   r?   r   )r   ri   r@   r   r   r	   CheckExecuteParamSequence  s
    
z%CursorTests.CheckExecuteParamSequencec             C   s<   | j jd | j jdddi | j j }| j|d d d S )Nz%insert into test(name) values ('foo')z&select name from test where name=:namenamer)   r   )r.   r-   r?   r   )r   r@   r   r   r	   CheckExecuteDictMapping  s    
z#CursorTests.CheckExecuteDictMappingc             C   sJ   G dd dt }| jjd | jjd|  | jj }| j|d d d S )Nc               @   s   e Zd Zdd ZdS )z6CursorTests.CheckExecuteDictMapping_Mapping.<locals>.Dc             S   s   dS )Nr)   r   )r   keyr   r   r	   __missing__#  s    zBCursorTests.CheckExecuteDictMapping_Mapping.<locals>.D.__missing__N)r%   r&   r'   ro   r   r   r   r	   D"  s   rp   z%insert into test(name) values ('foo')z&select name from test where name=:namer   r)   )dictr.   r-   r?   r   )r   rp   r@   r   r   r	   CheckExecuteDictMapping_Mapping!  s
    
z+CursorTests.CheckExecuteDictMapping_Mappingc             C   s:   | j jd | jtj | j jdddi W d Q R X d S )Nz%insert into test(name) values ('foo')z1select name from test where name=:name and id=:idrl   r)   )r.   r-   r9   r   r!   )r   r   r   r	   $CheckExecuteDictMappingTooLittleArgs+  s    z0CursorTests.CheckExecuteDictMappingTooLittleArgsc          	   C   s4   | j jd | jtj | j jd W d Q R X d S )Nz%insert into test(name) values ('foo')z&select name from test where name=:name)r.   r-   r9   r   r!   )r   r   r   r	   CheckExecuteDictMappingNoArgs0  s    z)CursorTests.CheckExecuteDictMappingNoArgsc             C   s:   | j jd | jtj | j jdddi W d Q R X d S )Nz%insert into test(name) values ('foo')z"select name from test where name=?rl   r)   )r.   r-   r9   r   r!   )r   r   r   r	   CheckExecuteDictMappingUnnamed5  s    z*CursorTests.CheckExecuteDictMappingUnnamedc             C   s   | j j  d S )N)r.   r0   )r   r   r   r	   r<   :  s    zCursorTests.CheckClosec             C   sD   | j jd | j jd | j jd | j jd | j| j jd d S )Nzdelete from testz%insert into test(name) values ('foo')zupdate test set name='bar'   )r.   r-   r   rowcount)r   r   r   r	   CheckRowcountExecute=  s
    z CursorTests.CheckRowcountExecutec             C   s    | j jd | j| j jd dS )z
        pysqlite does not know the rowcount of SELECT statements, because we
        don't fetch all rows after executing the select statement. The rowcount
        has thus to be -1.
        zselect 5 union select 6r   N)r.   r-   r   rw   )r   r   r   r	   CheckRowcountSelectD  s    zCursorTests.CheckRowcountSelectc             C   s4   | j jd | j jddddg | j| j jd d S )	Nzdelete from testz!insert into test(name) values (?)r   rv   rD   )r   )rv   )rD   )r.   r-   executemanyr   rw   )r   r   r   r	   CheckRowcountExecutemanyM  s    z$CursorTests.CheckRowcountExecutemanyc             C   s0   | j jd | j jd | jd| jjdd d S )Nz%insert into test(name) values ('foo')rv   z"total changes reported wrong value)msg)r.   r-   Z
assertLessr+   Ztotal_changes)r   r   r   r	   CheckTotalChangesR  s    zCursorTests.CheckTotalChangesc             C   s"   | j jddd tddD  d S )Nz#insert into test(income) values (?)c             S   s   g | ]
}|fqS r   r   ).0rg   r   r   r	   
<listcomp>\  s    z8CursorTests.CheckExecuteManySequence.<locals>.<listcomp>d   n   )r.   r{   range)r   r   r   r	   CheckExecuteManySequence[  s    z$CursorTests.CheckExecuteManySequencec             C   s"   G dd d}| j jd|  d S )Nc               @   s   e Zd Zdd Zdd ZdS )z4CursorTests.CheckExecuteManyIterator.<locals>.MyIterc             S   s
   d| _ d S )N   )value)r   r   r   r	   __init__`  s    z=CursorTests.CheckExecuteManyIterator.<locals>.MyIter.__init__c             S   s*   | j dkrtn|  j d7  _ | j fS d S )N
   r   )r   StopIteration)r   r   r   r	   __next__c  s    
z=CursorTests.CheckExecuteManyIterator.<locals>.MyIter.__next__N)r%   r&   r'   r   r   r   r   r   r	   MyIter_  s   r   z#insert into test(income) values (?))r.   r{   )r   r   r   r   r	   CheckExecuteManyIterator^  s    z$CursorTests.CheckExecuteManyIteratorc             C   s   dd }| j jd|  d S )Nc              s   s   xt dD ]} | fV  q
W d S )Nr   )r   )ir   r   r	   mygenm  s    z4CursorTests.CheckExecuteManyGenerator.<locals>.mygenz#insert into test(income) values (?))r.   r{   )r   r   r   r   r	   CheckExecuteManyGeneratorl  s    z%CursorTests.CheckExecuteManyGeneratorc          
   C   s*   | j t | jjddg W d Q R X d S )NrS   rD   )rD   )r9   rT   r.   r{   )r   r   r   r	   CheckExecuteManyWrongSqlArgs  s    z'CursorTests.CheckExecuteManyWrongSqlArgc          
   C   s,   | j tj | jjddg W d Q R X d S )Nzselect ?rD   )rD   )r9   r   r!   r.   r{   )r   r   r   r	   CheckExecuteManySelectw  s    z"CursorTests.CheckExecuteManySelectc          
   C   s(   | j t | jjdd W d Q R X d S )Nz#insert into test(income) values (?)rS   )r9   	TypeErrorr.   r{   )r   r   r   r	   CheckExecuteManyNotIterable{  s    z'CursorTests.CheckExecuteManyNotIterablec             C   sz   | j jd | j jdd | j jdd	 | j jd g }x| j D ]}|j|d  q@W | j|d d | j|d d d S )
Nzdelete from testzinsert into test(id) values (?)r      zselect id from test order by idr   r   )r   )r   )r.   r-   appendr   )r   Zlstr@   r   r   r	   CheckFetchIter  s    zCursorTests.CheckFetchIterc             C   s@   | j jd | j j }| j|d d | j j }| j|d  d S )Nzselect name from testr   r)   )r.   r-   r?   r   )r   r@   r   r   r	   CheckFetchone  s
    

zCursorTests.CheckFetchonec             C   s"   | j j }|j }| j|d  d S )N)r+   r,   r?   r   )r   curr@   r   r   r	   CheckFetchoneNoStatement  s    
z$CursorTests.CheckFetchoneNoStatementc             C   sr   | j | jjd d| j_| jjd | jjd | jjd | jjd | jjd | jj }| j t|d d S )Nr   rv   zdelete from testz#insert into test(name) values ('A')z#insert into test(name) values ('B')z#insert into test(name) values ('C')zselect name from test)r   r.   Z	arraysizer-   	fetchmanylen)r   resr   r   r	   CheckArraySize  s    
zCursorTests.CheckArraySizec             C   sD   | j jd | j jd}| jt|d | j jd}| j|g  d S )Nzselect name from testr   r   )r.   r-   r   r   r   )r   r   r   r   r	   CheckFetchmany  s
    zCursorTests.CheckFetchmanyc             C   s.   | j jd | j jdd}| jt|d dS )z0Checks if fetchmany works with keyword argumentszselect name from testr   )sizer   N)r.   r-   r   r   r   )r   r   r   r   r	   CheckFetchmanyKwArg  s    zCursorTests.CheckFetchmanyKwArgc             C   s@   | j jd | j j }| jt|d | j j }| j|g  d S )Nzselect name from testr   )r.   r-   fetchallr   r   )r   r   r   r   r	   CheckFetchall  s
    

zCursorTests.CheckFetchallc             C   s   | j jdddg d S )NrD      r   )r.   Zsetinputsizes)r   r   r   r	   CheckSetinputsizes  s    zCursorTests.CheckSetinputsizesc             C   s   | j jdd d S )Nr   r   )r.   setoutputsize)r   r   r   r	   CheckSetoutputsize  s    zCursorTests.CheckSetoutputsizec             C   s   | j jd d S )NrS   )r.   r   )r   r   r   r	   CheckSetoutputsizeNoColumn  s    z&CursorTests.CheckSetoutputsizeNoColumnc             C   s   | j | jj| j d S )N)r   r.   Z
connectionr+   )r   r   r   r	   CheckCursorConnection  s    z!CursorTests.CheckCursorConnectionc          	   C   s.   | j t dd }| jj|}W d Q R X d S )Nc               S   s   d S )Nr   r   r   r   r	   f  s    z/CursorTests.CheckWrongCursorCallable.<locals>.f)r9   r   r+   r,   )r   r   r   r   r   r	   CheckWrongCursorCallable  s    z$CursorTests.CheckWrongCursorCallablec          	   C   s8   G dd d}| }| j t tj|}W d Q R X d S )Nc               @   s   e Zd ZdS )z.CursorTests.CheckCursorWrongClass.<locals>.FooN)r%   r&   r'   r   r   r   r	   Foo  s    r   )r9   r   r   ZCursor)r   r   r)   r   r   r   r	   CheckCursorWrongClass  s    z!CursorTests.CheckCursorWrongClassc             C   sR   d}xHdD ]@}| j |d* | jj|j|d	 | j| jjd W dQ R X q
W dS )
zV
        INSERT OR REPLACE and REPLACE INTO should produce the same behavior.
        z+{} INTO test(id, unique_test) VALUES (?, ?)INSERT OR REPLACEREPLACE)	statementr   r)   N)r   r   )r   r)   )subTestr.   r-   formatr   r\   )r   sqlr   r   r   r	   CheckLastRowIDOnReplace  s
    
z#CursorTests.CheckLastRowIDOnReplacec             C   s@   | j jdd | j| j jd | j jdd | j| j jd d S )Nz2insert or ignore into test(unique_test) values (?)testrv   )r   )r   )r.   r-   r   r\   )r   r   r   r	   CheckLastRowIDOnIgnore  s    z"CursorTests.CheckLastRowIDOnIgnorec             C   s   g }xd
D ]}d}| j dj|dn | jj|j||f |j|| jjf | jtj | jj|j||f W d Q R X |j|| jjf W d Q R X q
W ddddddg}| j	|| d S )NFAILABORTROLLBACKz.INSERT OR {} INTO test(unique_test) VALUES (?)zINSERT OR {})r   rv   rD   r   )r   r   r   )r   rv   )r   rv   )r   rD   )r   rD   )r   r   )r   r   )
r   r   r.   r-   r   r\   r9   r   r   r   )r   Zresultsr   r   Zexpectedr   r   r	   CheckLastRowIDInsertOR  s    
  z"CursorTests.CheckLastRowIDInsertORN)5r%   r&   r'   r/   r1   rN   rO   rP   rQ   rR   rU   rV   rX   rZ   r]   r^   ra   rb   rc   rd   rk   rm   rr   rs   rt   ru   r<   rx   rz   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   rM      sd   		
		

rM   zThis test requires threading.c               @   s\   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d Zdd ZdS )ThreadTestsc             C   s(   t jd| _| jj | _| jjd d S )Nz:memory:z\create table test(id integer primary key, name text, bin binary, ratio number, ts timestamp))r   r*   r:   r,   r   r-   )r   r   r   r	   r/     s    zThreadTests.setUpc             C   s   | j j  | jj  d S )N)r   r0   r:   )r   r   r   r	   r1     s    
zThreadTests.tearDownc             C   sR   dd }g }t j|| j|dd}|j  |j  t|dkrN| jdj| d S )Nc             S   sF   y| j  }|jd d S  tjk
r,   d S    |jd Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)r,   r   r   r!   )r:   errorsr   r   r   r	   run  s    
z'ThreadTests.CheckConCursor.<locals>.run)r:   r   )targetkwargsr   
)	threadingThreadr:   startjoinr   fail)r   r   r   tr   r   r	   CheckConCursor  s    
zThreadTests.CheckConCursorc             C   sR   dd }g }t j|| j|dd}|j  |j  t|dkrN| jdj| d S )Nc             S   sF   y| j   |jd d S  tjk
r,   d S    |jd Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)r2   r   r   r!   )r:   r   r   r   r	   r     s    
z'ThreadTests.CheckConCommit.<locals>.run)r:   r   )r   r   r   r   )r   r   r:   r   r   r   r   )r   r   r   r   r   r   r	   CheckConCommit  s    
zThreadTests.CheckConCommitc             C   sR   dd }g }t j|| j|dd}|j  |j  t|dkrN| jdj| d S )Nc             S   sF   y| j   |jd d S  tjk
r,   d S    |jd Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)r5   r   r   r!   )r:   r   r   r   r	   r   *  s    
z)ThreadTests.CheckConRollback.<locals>.run)r:   r   )r   r   r   r   )r   r   r:   r   r   r   r   )r   r   r   r   r   r   r	   CheckConRollback)  s    
zThreadTests.CheckConRollbackc             C   sR   dd }g }t j|| j|dd}|j  |j  t|dkrN| jdj| d S )Nc             S   sF   y| j   |jd d S  tjk
r,   d S    |jd Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)r0   r   r   r!   )r:   r   r   r   r	   r   <  s    
z&ThreadTests.CheckConClose.<locals>.run)r:   r   )r   r   r   r   )r   r   r:   r   r   r   r   )r   r   r   r   r   r   r	   CheckConClose;  s    
zThreadTests.CheckConClosec             C   sR   dd }g }t j|| j|dd}|j  |j  t|dkrN| jdj| d S )Nc             S   sH   y| j d |jd d S  tjk
r.   d S    |jd Y nX d S )Nz#insert into test(name) values ('a')zdid not raise ProgrammingErrorzraised wrong exception)r-   r   r   r!   )r   r   r   r   r	   r   N  s    

z.ThreadTests.CheckCurImplicitBegin.<locals>.run)r   r   )r   r   r   r   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r	   CheckCurImplicitBeginM  s    
z!ThreadTests.CheckCurImplicitBeginc             C   sR   dd }g }t j|| j|dd}|j  |j  t|dkrN| jdj| d S )Nc             S   sF   y| j   |jd d S  tjk
r,   d S    |jd Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)r0   r   r   r!   )r   r   r   r   r	   r   `  s    
z&ThreadTests.CheckCurClose.<locals>.run)r   r   )r   r   r   r   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r	   CheckCurClose_  s    
zThreadTests.CheckCurClosec             C   s^   dd }g }| j jd tj|| j |dd}|j  |j  t|dkrZ| jdj| d S )Nc             S   sH   y| j d |jd d S  tjk
r.   d S    |jd Y nX d S )Nzselect name from testzdid not raise ProgrammingErrorzraised wrong exception)r-   r   r   r!   )r   r   r   r   r	   r   r  s    

z(ThreadTests.CheckCurExecute.<locals>.runz#insert into test(name) values ('a'))r   r   )r   r   r   r   )r   r-   r   r   r   r   r   r   )r   r   r   r   r   r   r	   CheckCurExecuteq  s    
zThreadTests.CheckCurExecutec             C   sj   dd }g }| j jd | j jd tj|| j |dd}|j  |j  t|dkrf| jdj| d S )	Nc             S   sF   y| j  }|jd d S  tjk
r,   d S    |jd Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)r?   r   r   r!   )r   r   r@   r   r   r	   r     s    
z)ThreadTests.CheckCurIterNext.<locals>.runz#insert into test(name) values ('a')zselect name from test)r   r   )r   r   r   r   )r   r-   r   r   r   r   r   r   )r   r   r   r   r   r   r	   CheckCurIterNext  s    
zThreadTests.CheckCurIterNextN)r%   r&   r'   r/   r1   r   r   r   r   r   r   r   r   r   r   r   r	   r     s   r   c               @   sD   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S )ConstructorTestsc             C   s   t jddd}d S )Ni  r      )r   ZDate)r   dr   r   r	   	CheckDate  s    zConstructorTests.CheckDatec             C   s   t jddd}d S )N   '   #   )r   ZTime)r   r   r   r   r	   	CheckTime  s    zConstructorTests.CheckTimec             C   s   t jdddddd}d S )Ni  r   r   r   r   r   )r   Z	Timestamp)r   tsr   r   r	   CheckTimestamp  s    zConstructorTests.CheckTimestampc             C   s   t jd}d S )NrS   )r   ZDateFromTicks)r   r   r   r   r	   CheckDateFromTicks  s    z#ConstructorTests.CheckDateFromTicksc             C   s   t jd}d S )NrS   )r   ZTimeFromTicks)r   r   r   r   r	   CheckTimeFromTicks  s    z#ConstructorTests.CheckTimeFromTicksc             C   s   t jd}d S )NrS   )r   ZTimestampFromTicks)r   r   r   r   r	   CheckTimestampFromTicks  s    z(ConstructorTests.CheckTimestampFromTicksc             C   s   t jd}d S )Ns    ')r   ZBinary)r   br   r   r	   CheckBinary  s    zConstructorTests.CheckBinaryN)
r%   r&   r'   r   r   r   r   r   r   r   r   r   r   r	   r     s   r   c               @   sD   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S )ExtensionTestsc             C   sB   t jd}|j }|jd |jd |j d }| j|d d S )Nz:memory:z
            -- bla bla
            /* a stupid comment */
            create table a(i);
            insert into a(i) values (5);
            zselect i from ar   r   )r   r*   r,   executescriptr-   r?   r   )r   r:   r   r   r   r   r	   CheckScriptStringSql  s    

z#ExtensionTests.CheckScriptStringSqlc          	   C   s8   t jd}|j }| jt j |jd W d Q R X d S )Nz:memory:z1create table test(x); asdf; create table test2(x))r   r*   r,   r9   r   r   )r   r:   r   r   r   r	   CheckScriptSyntaxError  s    
z%ExtensionTests.CheckScriptSyntaxErrorc          	   C   s8   t jd}|j }| jt j |jd W d Q R X d S )Nz:memory:z5create table test(sadfsadfdsa); select foo from hurz;)r   r*   r,   r9   r   r   )r   r:   r   r   r   r	   CheckScriptErrorNormal  s    
z%ExtensionTests.CheckScriptErrorNormalc          
   C   sH   t jd}|j }| jt}|jd W d Q R X | jt|jd d S )Nz:memory:s9   create table test(foo); insert into test(foo) values (5);z script argument must be unicode.)	r   r*   r,   r9   rT   r   r   rH   rI   )r   r:   r   rJ   r   r   r	   CheckCursorExecutescriptAsBytes  s
    
z.ExtensionTests.CheckCursorExecutescriptAsBytesc             C   s.   t jd}|jdj d }| j|dd d S )Nz:memory:zselect 5r   r   z Basic test of Connection.execute)r   r*   r-   r?   r   )r   r:   resultr   r   r	   CheckConnectionExecute  s    
z%ExtensionTests.CheckConnectionExecutec             C   sb   t jd}|jd |jdd
dg |jdj }| j|d d dd | j|d	 d dd d S )Nz:memory:zcreate table test(foo)z insert into test(foo) values (?)rD   r   z!select foo from test order by foor   z$Basic test of Connection.executemanyr   )rD   )r   )r   r*   r-   r{   r   r   )r   r:   r   r   r   r	   CheckConnectionExecutemany  s    

z)ExtensionTests.CheckConnectionExecutemanyc             C   s8   t jd}|jd |jdj d }| j|dd d S )Nz:memory:z9create table test(foo); insert into test(foo) values (5);zselect foo from testr   r   z&Basic test of Connection.executescript)r   r*   r   r-   r?   r   )r   r:   r   r   r   r	   CheckConnectionExecutescript  s    

z+ExtensionTests.CheckConnectionExecutescriptN)
r%   r&   r'   r   r   r   r   r   r   r   r   r   r   r	   r     s   r   c               @   sT   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d ZdS )ClosedConTestsc          	   C   s6   t jd}|j  | jt j |j }W d Q R X d S )Nz:memory:)r   r*   r0   r9   r!   r,   )r   r:   r   r   r   r	   CheckClosedConCursor  s    
z#ClosedConTests.CheckClosedConCursorc          	   C   s6   t jd}|j  | jt j |j  W d Q R X d S )Nz:memory:)r   r*   r0   r9   r!   r2   )r   r:   r   r   r	   CheckClosedConCommit  s    
z#ClosedConTests.CheckClosedConCommitc          	   C   s6   t jd}|j  | jt j |j  W d Q R X d S )Nz:memory:)r   r*   r0   r9   r!   r5   )r   r:   r   r   r	   CheckClosedConRollback  s    
z%ClosedConTests.CheckClosedConRollbackc          	   C   s@   t jd}|j }|j  | jt j |jd W d Q R X d S )Nz:memory:zselect 4)r   r*   r,   r0   r9   r!   r-   )r   r:   r   r   r   r	   CheckClosedCurExecute  s
    
z$ClosedConTests.CheckClosedCurExecutec             C   sD   t jd}|j  dd }| jt j |jdd| W d Q R X d S )Nz:memory:c             S   s   dS )Nr_   r   )rg   r   r   r	   r     s    z3ClosedConTests.CheckClosedCreateFunction.<locals>.fr)   r   )r   r*   r0   r9   r!   Zcreate_function)r   r:   r   r   r   r	   CheckClosedCreateFunction  s
    
z(ClosedConTests.CheckClosedCreateFunctionc             C   sJ   t jd}|j  G dd d}| jt j |jdd| W d Q R X d S )Nz:memory:c               @   s$   e Zd Zdd Zdd Zdd ZdS )z6ClosedConTests.CheckClosedCreateAggregate.<locals>.Aggc             S   s   d S )Nr   )r   r   r   r	   r     s    z?ClosedConTests.CheckClosedCreateAggregate.<locals>.Agg.__init__c             S   s   d S )Nr   )r   rg   r   r   r	   step	  s    z;ClosedConTests.CheckClosedCreateAggregate.<locals>.Agg.stepc             S   s   dS )Nr_   r   )r   r   r   r	   finalize  s    z?ClosedConTests.CheckClosedCreateAggregate.<locals>.Agg.finalizeN)r%   r&   r'   r   r   r   r   r   r   r	   Agg  s   r   r)   r   )r   r*   r0   r9   r!   Zcreate_aggregate)r   r:   r   r   r   r	   CheckClosedCreateAggregate  s
    
z)ClosedConTests.CheckClosedCreateAggregatec          	   C   s@   t jd}|j  dd }| jt j |j| W d Q R X d S )Nz:memory:c              W   s   t jS )N)r   ZDENY)argsr   r   r	   
authorizer  s    z;ClosedConTests.CheckClosedSetAuthorizer.<locals>.authorizer)r   r*   r0   r9   r!   Zset_authorizer)r   r:   r   r   r   r	   CheckClosedSetAuthorizer  s
    
z'ClosedConTests.CheckClosedSetAuthorizerc          
   C   sB   t jd}|j  dd }| jt j |j|d W d Q R X d S )Nz:memory:c               S   s   d S )Nr   r   r   r   r	   progress  s    z?ClosedConTests.CheckClosedSetProgressCallback.<locals>.progressr   )r   r*   r0   r9   r!   Zset_progress_handler)r   r:   r   r   r   r	   CheckClosedSetProgressCallback  s
    
z-ClosedConTests.CheckClosedSetProgressCallbackc          	   C   s4   t jd}|j  | jt j |  W d Q R X d S )Nz:memory:)r   r*   r0   r9   r!   )r   r:   r   r   r	   CheckClosedCall  s    
zClosedConTests.CheckClosedCallN)r%   r&   r'   r   r   r   r   r   r   r   r   r   r   r   r   r	   r     s   r   c               @   s   e Zd Zdd ZdS )ClosedCurTestsc             C   s~   t jd}|j }|j  x^dD ]V}|dkr2d}n|dkrHd	ddgf}ng }| jt j t||}||  W d Q R X q W d S )Nz:memory:r-   r{   r   r   r   r?   select 4 union select 5zinsert into foo(bar) values (?)rD   r   )r-   r{   r   r   r   r?   )r-   r   )r   )rD   )r   )r   r*   r,   r0   r9   r!   getattr)r   r:   r   Zmethod_nameZparamsmethodr   r   r	   CheckClosed&  s    


zClosedCurTests.CheckClosedN)r%   r&   r'   r   r   r   r   r	   r   %  s   r   c               @   sX   e Zd 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d ZdS )SqliteOnConflictTestszz
    Tests for SQLite's "insert on conflict" feature.

    See https://www.sqlite.org/lang_conflict.html for details.
    c             C   s(   t jd| _| jj | _| jjd d S )Nz:memory:zz
          CREATE TABLE test(
            id INTEGER PRIMARY KEY, name TEXT, unique_name TEXT UNIQUE
          );
        )r   r*   r+   r,   r.   r-   )r   r   r   r	   r/   ?  s    zSqliteOnConflictTests.setUpc             C   s   | j j  | jj  d S )N)r.   r0   r+   )r   r   r   r	   r1   H  s    
zSqliteOnConflictTests.tearDownc          
   C   s   d | j _| j j | _| jjd | jjd | jjd | jtj | jjd W d Q R X | j j  | jjd | j	| jj
 g  d S )NBEGINz,INSERT INTO test(name) VALUES ('abort_test')z8INSERT OR ROLLBACK INTO test(unique_name) VALUES ('foo')z"SELECT name, unique_name from test)r+   isolation_levelr,   r.   r-   r9   r   r   r2   r   r   )r   r   r   r	   .CheckOnConflictRollbackWithExplicitTransactionL  s    
zDSqliteOnConflictTests.CheckOnConflictRollbackWithExplicitTransactionc             C   s   d | j _| j j | _| jjd | jjd | jjd | jtj | jjd W d Q R X | j j  | jjd | j	| jj
 ddg d S )	Nr   z,INSERT INTO test(name) VALUES ('abort_test')z5INSERT OR ABORT INTO test(unique_name) VALUES ('foo')z"SELECT name, unique_name FROM test
abort_testr)   )r   N)Nr)   )r+   r   r,   r.   r-   r9   r   r   r2   r   r   )r   r   r   r	   2CheckOnConflictAbortRaisesWithExplicitTransactions[  s    
zHSqliteOnConflictTests.CheckOnConflictAbortRaisesWithExplicitTransactionsc          
   C   s^   | j jd | j jd | jtj | j jd W d Q R X | j jd | j| j j g  d S )Nz,INSERT INTO test(name) VALUES ('abort_test')z8INSERT OR ROLLBACK INTO test(unique_name) VALUES ('foo')z"SELECT name, unique_name FROM test)r.   r-   r9   r   r   r   r   )r   r   r   r	   )CheckOnConflictRollbackWithoutTransactionk  s    z?SqliteOnConflictTests.CheckOnConflictRollbackWithoutTransactionc             C   sb   | j jd | j jd | jtj | j jd W d Q R X | j jd | j| j j ddg d S )Nz,INSERT INTO test(name) VALUES ('abort_test')z5INSERT OR ABORT INTO test(unique_name) VALUES ('foo')z"SELECT name, unique_name FROM testr   r)   )r   N)Nr)   )r.   r-   r9   r   r   r   r   )r   r   r   r	   -CheckOnConflictAbortRaisesWithoutTransactionsu  s    zCSqliteOnConflictTests.CheckOnConflictAbortRaisesWithoutTransactionsc          
   C   sF   | j jd | jtj | j jd W d Q R X | j| j j g  d S )Nz4INSERT OR FAIL INTO test(unique_name) VALUES ('foo'))r.   r-   r9   r   r   r   r   )r   r   r   r	   CheckOnConflictFail  s    z)SqliteOnConflictTests.CheckOnConflictFailc             C   s<   | j jd | j jd | j jd | j| j j dg d S )Nz6INSERT OR IGNORE INTO test(unique_name) VALUES ('foo')zSELECT unique_name FROM testr)   )r)   )r.   r-   r   r   )r   r   r   r	   CheckOnConflictIgnore  s    z+SqliteOnConflictTests.CheckOnConflictIgnorec             C   s<   | j jd | j jd | j jd | j| j j dg d S )NzFINSERT OR REPLACE INTO test(name, unique_name) VALUES ('Data!', 'foo')zUINSERT OR REPLACE INTO test(name, unique_name) VALUES ('Very different data!', 'foo')z"SELECT name, unique_name FROM testVery different data!r)   )r  r)   )r.   r-   r   r   )r   r   r   r	   CheckOnConflictReplace  s    z,SqliteOnConflictTests.CheckOnConflictReplaceN)r%   r&   r'   __doc__r/   r1   r   r  r  r  r  r  r  r   r   r   r	   r   8  s   	
r   c        	   
   C   s   t jtd} t jtd}t jtd}t jtd}t jtd}t jtd}t jtd}t jt	d}t jt
d}t j| ||||||||f	S )NZCheck)rL   Z	makeSuiter   r(   rM   r   r   r   r   r   r   Z	TestSuite)	Zmodule_suiteZconnection_suiteZcursor_suiteZthread_suiteZconstructor_suiteZ	ext_suiteZclosed_con_suiteZclosed_cur_suiteZon_conflict_suiter   r   r	   suite  s    r	  c              C   s   t j } | jt  d S )N)rL   ZTextTestRunnerr   r	  )Zrunnerr   r   r	   r     s    r   __main__)rL   Zsqlite3r   r   ImportErrorZtest.supportr   r   ZTestCaser   r(   rM   Z
skipUnlessr   r   r   r   r   r   r	  r   r%   r   r   r   r	   <module>   s.   
7b  A
 4C]
