B
    18™\(Š  ã               @   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
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   |   tjddtj ¡ d S )Nz2.0zapilevel is %s, should be 2.0)ÚassertEqualÚsqliteÚapilevel)Úself© r	   úV/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/sqlite3/test/dbapi.pyÚCheckAPILevel    s    
zModuleTests.CheckAPILevelc             C   s   |   tjddtj ¡ d S )Né   zthreadsafety is %d, should be 1)r   r   Úthreadsafety)r   r	   r	   r
   ÚCheckThreadSafety$   s    
zModuleTests.CheckThreadSafetyc             C   s   |   tjddtj ¡ d S )NÚqmarkz%paramstyle is '%s', should be 'qmark')r   r   Ú
paramstyle)r   r	   r	   r
   ÚCheckParamStyle(   s    
zModuleTests.CheckParamStylec             C   s   |   ttjtƒd¡ d S )Nz&Warning is not a subclass of Exception)Ú
assertTrueÚ
issubclassr   ÚWarningÚ	Exception)r   r	   r	   r
   ÚCheckWarning-   s    zModuleTests.CheckWarningc             C   s   |   ttjtƒd¡ d S )Nz$Error is not a subclass of Exception)r   r   r   ÚErrorr   )r   r	   r	   r
   Ú
CheckError1   s    zModuleTests.CheckErrorc             C   s   |   ttjtjƒd¡ d S )Nz)InterfaceError is not a subclass of Error)r   r   r   ÚInterfaceErrorr   )r   r	   r	   r
   ÚCheckInterfaceError5   s    zModuleTests.CheckInterfaceErrorc             C   s   |   ttjtjƒd¡ d S )Nz(DatabaseError is not a subclass of Error)r   r   r   ÚDatabaseErrorr   )r   r	   r	   r
   ÚCheckDatabaseError9   s    zModuleTests.CheckDatabaseErrorc             C   s   |   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   |   ttjtjƒd¡ d S )Nz3OperationalError is not a subclass of DatabaseError)r   r   r   ÚOperationalErrorr   )r   r	   r	   r
   ÚCheckOperationalErrorA   s    z!ModuleTests.CheckOperationalErrorc             C   s   |   ttjtjƒd¡ d S )Nz1IntegrityError is not a subclass of DatabaseError)r   r   r   ÚIntegrityErrorr   )r   r	   r	   r
   ÚCheckIntegrityErrorE   s    zModuleTests.CheckIntegrityErrorc             C   s   |   ttjtjƒd¡ d S )Nz0InternalError is not a subclass of DatabaseError)r   r   r   ÚInternalErrorr   )r   r	   r	   r
   ÚCheckInternalErrorI   s    zModuleTests.CheckInternalErrorc             C   s   |   ttjtjƒd¡ d S )Nz3ProgrammingError is not a subclass of DatabaseError)r   r   r   ÚProgrammingErrorr   )r   r	   r	   r
   ÚCheckProgrammingErrorM   s    z!ModuleTests.CheckProgrammingErrorc             C   s   |   ttjtjƒd¡ d S )Nz4NotSupportedError is not a subclass of DatabaseError)r   r   r   ÚNotSupportedErrorr   )r   r	   r	   r
   ÚCheckNotSupportedErrorQ   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dd„ Ze ejdkd¡dd „ ƒZd!S )"ÚConnectionTestsc             C   s0   t  d¡| _| j ¡ }| d¡ | dd¡ d S )Nz:memory:z4create table test(id integer primary key, name text)z!insert into test(name) values (?))Úfoo)r   ÚconnectÚcxÚcursorÚexecute)r   Úcur	   r	   r
   ÚsetUpX   s    

zConnectionTests.setUpc             C   s   | j  ¡  d S )N)r/   Úclose)r   r	   r	   r
   ÚtearDown^   s    zConnectionTests.tearDownc             C   s   | j  ¡  d S )N)r/   Úcommit)r   r	   r	   r
   ÚCheckCommita   s    zConnectionTests.CheckCommitc             C   s   | j  ¡  | j  ¡  dS )zV
        A commit should also work when no changes were made to the database.
        N)r/   r6   )r   r	   r	   r
   ÚCheckCommitAfterNoChangesd   s    
z)ConnectionTests.CheckCommitAfterNoChangesc             C   s   | j  ¡  d S )N)r/   Úrollback)r   r	   r	   r
   ÚCheckRollbackk   s    zConnectionTests.CheckRollbackc             C   s   | j  ¡  | j  ¡  dS )zX
        A rollback should also work when no changes were made to the database.
        N)r/   r9   )r   r	   r	   r
   ÚCheckRollbackAfterNoChangesn   s    
z+ConnectionTests.CheckRollbackAfterNoChangesc             C   s   | j  ¡ }d S )N)r/   r0   )r   r2   r	   r	   r
   ÚCheckCursoru   s    zConnectionTests.CheckCursorc          	   C   s*   d}|   tj¡ t |¡}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
   ÚCheckFailedOpenx   s    zConnectionTests.CheckFailedOpenc             C   s   | j  ¡  d S )N)r/   r4   )r   r	   r	   r
   Ú
CheckClose}   s    zConnectionTests.CheckClosec             C   s¸   |   | jjtj¡ |   | jjtj¡ |   | jjtj¡ |   | jjtj¡ |   | jjtj¡ |   | jjtj¡ |   | jj	tj	¡ |   | jj
tj
¡ |   | jjt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  d¡}| ¡ }|  |jd¡ | d¡ |  |jd¡ | dd¡ |  |jd¡ | ddg¡ | ¡ }|  |jd¡ | ¡  |  |jd¡ | ddg¡ | ¡ }|  |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.   r0   r   Úin_transactionr1   Úfetchoner6   )r   r/   r2   Úrowr	   r	   r
   ÚCheckInTransaction   s    

z"ConnectionTests.CheckInTransactionc          	   C   s"   |   t¡ d| j_W d Q R X d S )NT)r=   ÚAttributeErrorr/   rB   )r   r	   r	   r
   ÚCheckInTransactionROŸ   s    z$ConnectionTests.CheckInTransactionROc          	   C   sD   |   tt¡ G dd„ dƒ}|ƒ }t |¡}| d¡ W dQ R X dS )z| Checks that we can successfully connect to a database using an object that
            is PathLike, i.e. has __fspath__(). c               @   s   e Zd Zdd„ ZdS )z9ConnectionTests.CheckOpenWithPathLikeObject.<locals>.Pathc             S   s   t S )N)r   )r   r	   r	   r
   Ú
__fspath__¨   s    zDConnectionTests.CheckOpenWithPathLikeObject.<locals>.Path.__fspath__N)r)   r*   r+   rH   r	   r	   r	   r
   ÚPath§   s   rI   zcreate table test(id integer)N)Ú
addCleanupr   r   r   r.   r1   )r   rI   Úpathr/   r	   r	   r
   ÚCheckOpenWithPathLikeObject£   s
    z+ConnectionTests.CheckOpenWithPathLikeObjectc          
   C   sÐ   t jdk r4|  t j¡ t jddd W d Q R X d S |  tt¡ t  t¡}| d¡ W d Q R X t jdt dd}| d¡ W d Q R X t jdt d dd(}|  t j	¡ | d	¡ W d Q R X W d Q R X d S )
N)é   é   rN   z:memory:T)Úurizcreate table test(id integer)zfile:zinsert into test(id) values(0)z?mode=rozinsert into test(id) values(1))
r   Úsqlite_version_infor=   r'   r.   rJ   r   r   r1   r   )r   r/   r	   r	   r
   ÚCheckOpenUri®   s    
zConnectionTests.CheckOpenUri)rM   rM   r   z&needs sqlite versions older than 3.3.1c          	   C   s<   |   tj¡}tjddd W d Q R X |  t|jƒd¡ d S )Nz:memory:F)Zcheck_same_threadz shared connections not available)r=   r   r'   r.   r   ÚstrÚ	exception)r   Úcmr	   r	   r
   Ú CheckSameThreadErrorOnOldVersion¼   s    z0ConnectionTests.CheckSameThreadErrorOnOldVersionN)r)   r*   r+   r3   r5   r7   r8   r:   r;   r<   r?   r@   rA   rE   rG   rL   rQ   ÚunittestÚskipIfr   rP   rU   r	   r	   r	   r
   r,   V   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  d¡| _| j ¡ | _| j d¡ | 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/   r0   r2   r1   )r   r	   r	   r
   r3   Ä   s
    zCursorTests.setUpc             C   s   | j  ¡  | j ¡  d S )N)r2   r4   r/   )r   r	   r	   r
   r5   Í   s    
zCursorTests.tearDownc             C   s   | j  d¡ d S )Nzdelete from test)r2   r1   )r   r	   r	   r
   ÚCheckExecuteNoArgsÑ   s    zCursorTests.CheckExecuteNoArgsc          	   C   s(   |   tj¡ | j d¡ W d Q R X d S )Nzselect asdf)r=   r   r   r2   r1   )r   r	   r	   r
   ÚCheckExecuteIllegalSqlÔ   s    z"CursorTests.CheckExecuteIllegalSqlc          	   C   s(   |   tj¡ | j d¡ W d Q R X d S )Nzselect 5+4; select 4+5)r=   r   r   r2   r1   )r   r	   r	   r
   ÚCheckExecuteTooMuchSqlØ   s    z"CursorTests.CheckExecuteTooMuchSqlc             C   s   | j  d¡ d S )Nzselect 5+4; -- foo bar)r2   r1   )r   r	   r	   r
   ÚCheckExecuteTooMuchSql2Ü   s    z#CursorTests.CheckExecuteTooMuchSql2c             C   s   | j  d¡ d S )NzT
            select 5+4;

            /*
            foo
            */
            )r2   r1   )r   r	   r	   r
   ÚCheckExecuteTooMuchSql3ß   s    z#CursorTests.CheckExecuteTooMuchSql3c          	   C   s&   |   t¡ | j d¡ W d Q R X d S )Né*   )r=   Ú
ValueErrorr2   r1   )r   r	   r	   r
   ÚCheckExecuteWrongSqlArgè   s    z#CursorTests.CheckExecuteWrongSqlArgc             C   s   | j  dd¡ d S )Nzinsert into test(id) values (?))r^   )r2   r1   )r   r	   r	   r
   ÚCheckExecuteArgIntì   s    zCursorTests.CheckExecuteArgIntc             C   s   | j  dd¡ d S )Nz#insert into test(income) values (?))gq=
×£ˆ£@)r2   r1   )r   r	   r	   r
   ÚCheckExecuteArgFloatï   s    z CursorTests.CheckExecuteArgFloatc             C   s   | j  dd¡ d S )Nz!insert into test(name) values (?))ZHugo)r2   r1   )r   r	   r	   r
   ÚCheckExecuteArgStringò   s    z!CursorTests.CheckExecuteArgStringc             C   s@   | j  dd¡ | j  d| j jf¡ | j  ¡ }|  |d d¡ d S )Nz!insert into test(name) values (?))zHu goz select name from test where id=?r   zHu go)r2   r1   Ú	lastrowidrC   r   )r   rD   r	   r	   r
   Ú!CheckExecuteArgStringWithZeroByteõ   s    
z-CursorTests.CheckExecuteArgStringWithZeroBytec          	   C   s:   |   t¡}| j dd¡ W d Q R X |  t|jƒd¡ d S )Nzinsert into test(id) values (?)r^   z"parameters are of unsupported type)r=   r_   r2   r1   r   rR   rS   )r   rT   r	   r	   r
   ÚCheckExecuteNonIterableü   s    z#CursorTests.CheckExecuteNonIterablec          	   C   s*   |   tj¡ | j dd¡ W d Q R X d S )Nzinsert into test(id) values (?))é   ZEgon)r=   r   r%   r2   r1   )r   r	   r	   r
   ÚCheckExecuteWrongNoOfArgs1  s    z&CursorTests.CheckExecuteWrongNoOfArgs1c          	   C   s(   |   tj¡ | j d¡ W d Q R X d S )Nzinsert into test(id) values (?))r=   r   r%   r2   r1   )r   r	   r	   r
   ÚCheckExecuteWrongNoOfArgs2  s    z&CursorTests.CheckExecuteWrongNoOfArgs2c          	   C   s(   |   tj¡ | j d¡ W d Q R X d S )Nzinsert into test(id) values (?))r=   r   r%   r2   r1   )r   r	   r	   r
   ÚCheckExecuteWrongNoOfArgs3  s    z&CursorTests.CheckExecuteWrongNoOfArgs3c             C   s:   | j  d¡ | j  ddg¡ | j  ¡ }|  |d d¡ d S )Nz%insert into test(name) values ('foo')z"select name from test where name=?r-   r   )r2   r1   rC   r   )r   rD   r	   r	   r
   ÚCheckExecuteParamList  s    
z!CursorTests.CheckExecuteParamListc             C   sJ   G dd„ dt ƒ}| j d¡ | j d|ƒ ¡ | 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+   rl   ro   r	   r	   r	   r
   ÚL  s   rp   z%insert into test(name) values ('foo')z"select name from test where name=?r   r-   )Úobjectr2   r1   rC   r   )r   rp   rD   r	   r	   r
   ÚCheckExecuteParamSequence  s
    
z%CursorTests.CheckExecuteParamSequencec             C   s<   | j  d¡ | j  dddi¡ | j  ¡ }|  |d d¡ d S )Nz%insert into test(name) values ('foo')z&select name from test where name=:nameÚnamer-   r   )r2   r1   rC   r   )r   rD   r	   r	   r
   ÚCheckExecuteDictMapping#  s    
z#CursorTests.CheckExecuteDictMappingc             C   sJ   G dd„ dt ƒ}| j d¡ | j d|ƒ ¡ | 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+   rv   r	   r	   r	   r
   ÚD*  s   rw   z%insert into test(name) values ('foo')z&select name from test where name=:namer   r-   )Údictr2   r1   rC   r   )r   rw   rD   r	   r	   r
   ÚCheckExecuteDictMapping_Mapping)  s
    
z+CursorTests.CheckExecuteDictMapping_Mappingc          	   C   s:   | j  d¡ |  t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=:idrs   r-   )r2   r1   r=   r   r%   )r   r	   r	   r
   Ú$CheckExecuteDictMappingTooLittleArgs3  s    z0CursorTests.CheckExecuteDictMappingTooLittleArgsc          	   C   s4   | j  d¡ |  t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)r2   r1   r=   r   r%   )r   r	   r	   r
   ÚCheckExecuteDictMappingNoArgs8  s    z)CursorTests.CheckExecuteDictMappingNoArgsc          	   C   s:   | j  d¡ |  t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=?rs   r-   )r2   r1   r=   r   r%   )r   r	   r	   r
   ÚCheckExecuteDictMappingUnnamed=  s    z*CursorTests.CheckExecuteDictMappingUnnamedc             C   s   | j  ¡  d S )N)r2   r4   )r   r	   r	   r
   r@   B  s    zCursorTests.CheckClosec             C   sD   | j  d¡ | j  d¡ | j  d¡ | j  d¡ |  | j jd¡ d S )Nzdelete from testz%insert into test(name) values ('foo')zupdate test set name='bar'é   )r2   r1   r   Úrowcount)r   r	   r	   r
   ÚCheckRowcountExecuteE  s
    z CursorTests.CheckRowcountExecutec             C   s    | j  d¡ |  | 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 6éÿÿÿÿN)r2   r1   r   r~   )r   r	   r	   r
   ÚCheckRowcountSelectL  s    zCursorTests.CheckRowcountSelectc             C   s4   | j  d¡ | j  ddddg¡ |  | j jd¡ d S )Nzdelete from testz!insert into test(name) values (?))r   )r}   )rM   rM   )r2   r1   Úexecutemanyr   r~   )r   r	   r	   r
   ÚCheckRowcountExecutemanyU  s    z$CursorTests.CheckRowcountExecutemanyc             C   s0   | j  d¡ | j  d¡ | jd| jjdd d S )Nz%insert into test(name) values ('foo')r}   z"total changes reported wrong value)Úmsg)r2   r1   Ú
assertLessr/   Útotal_changes)r   r	   r	   r
   ÚCheckTotalChangesZ  s    zCursorTests.CheckTotalChangesc             C   s"   | 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	   )Ú.0rn   r	   r	   r
   ú
<listcomp>d  s    z8CursorTests.CheckExecuteManySequence.<locals>.<listcomp>éd   én   )r2   r‚   Úrange)r   r	   r	   r
   ÚCheckExecuteManySequencec  s    z$CursorTests.CheckExecuteManySequencec             C   s"   G dd„ dƒ}| 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__h  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__k  s    
z=CursorTests.CheckExecuteManyIterator.<locals>.MyIter.__next__N)r)   r*   r+   r   r“   r	   r	   r	   r
   ÚMyIterg  s   r”   z#insert into test(income) values (?))r2   r‚   )r   r”   r	   r	   r
   ÚCheckExecuteManyIteratorf  s    z$CursorTests.CheckExecuteManyIteratorc             C   s   dd„ }| j  d|ƒ ¡ d S )Nc              s   s   xt dƒD ]} | fV  q
W d S )NrŽ   )rŒ   )Úir	   r	   r
   Úmygenu  s    z4CursorTests.CheckExecuteManyGenerator.<locals>.mygenz#insert into test(income) values (?))r2   r‚   )r   r—   r	   r	   r
   ÚCheckExecuteManyGeneratort  s    z%CursorTests.CheckExecuteManyGeneratorc          	   C   s*   |   t¡ | j ddg¡ W d Q R X d S )Nr^   )rM   )r=   r_   r2   r‚   )r   r	   r	   r
   ÚCheckExecuteManyWrongSqlArg{  s    z'CursorTests.CheckExecuteManyWrongSqlArgc          	   C   s,   |   tj¡ | j ddg¡ W d Q R X d S )Nzselect ?)rM   )r=   r   r%   r2   r‚   )r   r	   r	   r
   ÚCheckExecuteManySelect  s    z"CursorTests.CheckExecuteManySelectc          	   C   s(   |   t¡ | j dd¡ W d Q R X d S )Nz#insert into test(income) values (?)r^   )r=   Ú	TypeErrorr2   r‚   )r   r	   r	   r
   ÚCheckExecuteManyNotIterableƒ  s    z'CursorTests.CheckExecuteManyNotIterablec             C   sz   | j  d¡ | j  dd¡ | j  dd¡ | j  d¡ g }x| j D ]}| |d ¡ q@W |  |d d¡ |  |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   )r2   r1   Úappendr   )r   ÚlstrD   r	   r	   r
   ÚCheckFetchIter‡  s    zCursorTests.CheckFetchIterc             C   s@   | j  d¡ | j  ¡ }|  |d d¡ | j  ¡ }|  |d ¡ d S )Nzselect name from testr   r-   )r2   r1   rC   r   )r   rD   r	   r	   r
   ÚCheckFetchone“  s
    

zCursorTests.CheckFetchonec             C   s"   | j  ¡ }| ¡ }|  |d ¡ d S )N)r/   r0   rC   r   )r   ÚcurrD   r	   r	   r
   ÚCheckFetchoneNoStatementš  s    
z$CursorTests.CheckFetchoneNoStatementc             C   sr   |   | jjd¡ d| j_| j d¡ | j d¡ | j d¡ | j d¡ | j d¡ | j ¡ }|   t|ƒd¡ d S )Nr   r}   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   r2   Ú	arraysizer1   Ú	fetchmanyÚlen)r   Úresr	   r	   r
   ÚCheckArraySizeŸ  s    
zCursorTests.CheckArraySizec             C   sD   | j  d¡ | j  d¡}|  t|ƒd¡ | j  d¡}|  |g ¡ d S )Nzselect name from testrŠ   r   )r2   r1   r¥   r   r¦   )r   r§   r	   r	   r
   ÚCheckFetchmany°  s
    zCursorTests.CheckFetchmanyc             C   s.   | j  d¡ | j jdd}|  t|ƒd¡ dS )z0Checks if fetchmany works with keyword argumentszselect name from testrŠ   )Úsizer   N)r2   r1   r¥   r   r¦   )r   r§   r	   r	   r
   ÚCheckFetchmanyKwArg·  s    zCursorTests.CheckFetchmanyKwArgc             C   s@   | j  d¡ | j  ¡ }|  t|ƒd¡ | j  ¡ }|  |g ¡ d S )Nzselect name from testr   )r2   r1   Úfetchallr   r¦   )r   r§   r	   r	   r
   ÚCheckFetchall½  s
    

zCursorTests.CheckFetchallc             C   s   | j  dddg¡ d S )NrM   é   rŽ   )r2   Úsetinputsizes)r   r	   r	   r
   ÚCheckSetinputsizesÄ  s    zCursorTests.CheckSetinputsizesc             C   s   | j  dd¡ d S )NrŽ   r   )r2   Úsetoutputsize)r   r	   r	   r
   ÚCheckSetoutputsizeÇ  s    zCursorTests.CheckSetoutputsizec             C   s   | j  d¡ d S )Nr^   )r2   r±   )r   r	   r	   r
   ÚCheckSetoutputsizeNoColumnÊ  s    z&CursorTests.CheckSetoutputsizeNoColumnc             C   s   |   | jj| j¡ d S )N)r   r2   Ú
connectionr/   )r   r	   r	   r
   ÚCheckCursorConnectionÍ  s    z!CursorTests.CheckCursorConnectionc          	   C   s.   |   t¡ dd„ }| j |¡}W d Q R X d S )Nc               S   s   d S )Nr	   r	   r	   r	   r
   ÚfÓ  ó    z/CursorTests.CheckWrongCursorCallable.<locals>.f)r=   r›   r/   r0   )r   r¶   r¢   r	   r	   r
   ÚCheckWrongCursorCallableÑ  s    z$CursorTests.CheckWrongCursorCallablec          	   C   s8   G dd„ dƒ}|ƒ }|   t¡ t |¡}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¹   )r=   r›   r   ÚCursor)r   r¹   r-   r¢   r	   r	   r
   ÚCheckCursorWrongClassÖ  s    z!CursorTests.CheckCursorWrongClassc          
   C   sR   d}xHdD ]@}| j |d* | j | |¡d¡ |  | 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 (?, ?))zINSERT OR REPLACEZREPLACE)Ú	statement)r   r-   r   N)ÚsubTestr2   r1   Úformatr   rd   )r   Úsqlr¼   r	   r	   r
   ÚCheckLastRowIDOnReplaceÜ  s
    
z#CursorTests.CheckLastRowIDOnReplacec             C   s@   | j  dd¡ |  | j jd¡ | j  dd¡ |  | j jd¡ d S )Nz2insert or ignore into test(unique_test) values (?))Útestr}   )r2   r1   r   rd   )r   r	   r	   r
   ÚCheckLastRowIDOnIgnoreæ  s    z"CursorTests.CheckLastRowIDOnIgnorec             C   s¼   g }x–dD ]Ž}d}| j d |¡dn | j | |¡|f¡ | || jjf¡ |  tj¡ | j | |¡|f¡ W d Q R X | || jjf¡ W d Q R X q
W ddddddg}|  	||¡ d S )N)ÚFAILÚABORTÚROLLBACKz.INSERT OR {} INTO test(unique_test) VALUES (?)zINSERT OR {})r¼   )rÃ   r}   )rÄ   rM   )rÅ   r®   )
r½   r¾   r2   r1   rž   rd   r=   r   r!   r   )r   Úresultsr¼   r¿   Úexpectedr	   r	   r
   ÚCheckLastRowIDInsertORð  s    
  z"CursorTests.CheckLastRowIDInsertORN)5r)   r*   r+   r3   r5   rY   rZ   r[   r\   r]   r`   ra   rb   rc   re   rf   rh   ri   rj   rk   rr   rt   ry   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Â   rÈ   r	   r	   r	   r
   rX   Ã   sd   		
		

rX   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  d¡| _| 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>   r0   r¢   r1   )r   r	   r	   r
   r3     s    zThreadTests.setUpc             C   s   | j  ¡  | j ¡  d S )N)r¢   r4   r>   )r   r	   r	   r
   r5     s    
zThreadTests.tearDownc             C   sR   dd„ }g }t j|| j|dœd}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc             S   sF   y|   ¡ }| d¡ d S  tjk
r,   d S    | d¡ Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)r0   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}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc             S   sF   y|   ¡  | d¡ d S  tjk
r,   d S    | d¡ Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)r6   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}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc             S   sF   y|   ¡  | d¡ d S  tjk
r,   d S    | d¡ Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)r9   rž   r   r%   )r>   rÊ   r	   r	   r
   rË   1  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
   ÚCheckConRollback0  s    
zThreadTests.CheckConRollbackc             C   sR   dd„ }g }t j|| j|dœd}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc             S   sF   y|   ¡  | d¡ d S  tjk
r,   d S    | d¡ Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)r4   rž   r   r%   )r>   rÊ   r	   r	   r
   rË   C  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
   ÚCheckConCloseB  s    
zThreadTests.CheckConClosec             C   sR   dd„ }g }t j|| j|dœd}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc             S   sH   y|   d¡ | d¡ d S  tjk
r.   d S    | d¡ Y nX d S )Nz#insert into test(name) values ('a')zdid not raise ProgrammingErrorzraised wrong exception)r1   rž   r   r%   )r¢   rÊ   r	   r	   r
   rË   U  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
   ÚCheckCurImplicitBeginT  s    
z!ThreadTests.CheckCurImplicitBeginc             C   sR   dd„ }g }t j|| j|dœd}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc             S   sF   y|   ¡  | d¡ d S  tjk
r,   d S    | d¡ Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)r4   rž   r   r%   )r¢   rÊ   r	   r	   r
   rË   g  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
   ÚCheckCurClosef  s    
zThreadTests.CheckCurClosec             C   s^   dd„ }g }| j  d¡ tj|| j |dœd}| ¡  | ¡  t|ƒdkrZ|  d |¡¡ d S )Nc             S   sH   y|   d¡ | d¡ d S  tjk
r.   d S    | d¡ Y nX d S )Nzselect name from testzdid not raise ProgrammingErrorzraised wrong exception)r1   rž   r   r%   )r¢   rÊ   r	   r	   r
   rË   y  s    

z(ThreadTests.CheckCurExecute.<locals>.runz#insert into test(name) values ('a'))r¢   rÊ   )rÌ   rÍ   r   rÎ   )r¢   r1   rÏ   rÐ   rÑ   rÒ   r¦   rÓ   )r   rË   rÊ   rÔ   r	   r	   r
   ÚCheckCurExecutex  s    
zThreadTests.CheckCurExecutec             C   sj   dd„ }g }| j  d¡ | j  d¡ tj|| j |dœd}| ¡  | ¡  t|ƒdkrf|  d |¡¡ d S )	Nc             S   sF   y|   ¡ }| d¡ d S  tjk
r,   d S    | d¡ Y nX d S )Nzdid not raise ProgrammingErrorzraised wrong exception)rC   rž   r   r%   )r¢   rÊ   rD   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¢   r1   rÏ   rÐ   rÑ   rÒ   r¦   rÓ   )r   rË   rÊ   rÔ   r	   r	   r
   ÚCheckCurIterNext‹  s    
zThreadTests.CheckCurIterNextN)r)   r*   r+   r3   r5   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  ddd¡}d S )NiÔ  r‘   é   )r   ÚDate)r   Údr	   r	   r
   Ú	CheckDate   s    zConstructorTests.CheckDatec             C   s   t  ddd¡}d S )Né   é'   é#   )r   ÚTime)r   rÔ   r	   r	   r
   Ú	CheckTime£  s    zConstructorTests.CheckTimec             C   s   t  dddddd¡}d S )NiÔ  r‘   rÞ   râ   rã   rä   )r   Ú	Timestamp)r   Útsr	   r	   r
   ÚCheckTimestamp¦  s    zConstructorTests.CheckTimestampc             C   s   t  d¡}d S )Nr^   )r   ÚDateFromTicks)r   rà   r	   r	   r
   ÚCheckDateFromTicks©  s    z#ConstructorTests.CheckDateFromTicksc             C   s   t  d¡}d S )Nr^   )r   ÚTimeFromTicks)r   rÔ   r	   r	   r
   ÚCheckTimeFromTicks¬  s    z#ConstructorTests.CheckTimeFromTicksc             C   s   t  d¡}d S )Nr^   )r   ÚTimestampFromTicks)r   rè   r	   r	   r
   ÚCheckTimestampFromTicks¯  s    z(ConstructorTests.CheckTimestampFromTicksc             C   s   t  d¡}d S )Ns    ')r   Ú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  d¡}| ¡ }| d¡ | d¡ | ¡ d }|  |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.   r0   Úexecutescriptr1   rC   r   )r   r>   r¢   r§   r	   r	   r
   ÚCheckScriptStringSql¶  s    

z#ExtensionTests.CheckScriptStringSqlc          	   C   s8   t  d¡}| ¡ }|  t j¡ | d¡ W d Q R X d S )Nz:memory:z1create table test(x); asdf; create table test2(x))r   r.   r0   r=   r   rô   )r   r>   r¢   r	   r	   r
   ÚCheckScriptSyntaxErrorÃ  s    
z%ExtensionTests.CheckScriptSyntaxErrorc          	   C   s8   t  d¡}| ¡ }|  t j¡ | d¡ W d Q R X d S )Nz:memory:z5create table test(sadfsadfdsa); select foo from hurz;)r   r.   r0   r=   r   rô   )r   r>   r¢   r	   r	   r
   ÚCheckScriptErrorNormalÉ  s    
z%ExtensionTests.CheckScriptErrorNormalc          	   C   sH   t  d¡}| ¡ }|  t¡}| d¡ W d Q R X |  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.   r0   r=   r_   rô   r   rR   rS   )r   r>   r¢   rT   r	   r	   r
   ÚCheckCursorExecutescriptAsBytesÏ  s
    
z.ExtensionTests.CheckCursorExecutescriptAsBytesc             C   s.   t  d¡}| d¡ ¡ d }|  |dd¡ d S )Nz:memory:zselect 5r   rŽ   z Basic test of Connection.execute)r   r.   r1   rC   r   )r   r>   Úresultr	   r	   r
   ÚCheckConnectionExecuteÖ  s    
z%ExtensionTests.CheckConnectionExecutec             C   sb   t  d¡}| d¡ | dddg¡ | d¡ ¡ }|  |d d dd	¡ |  |d
 d dd	¡ d S )Nz:memory:zcreate table test(foo)z insert into test(foo) values (?))rM   )r®   z!select foo from test order by foor   rM   z$Basic test of Connection.executemanyr   r®   )r   r.   r1   r‚   r¬   r   )r   r>   rù   r	   r	   r
   ÚCheckConnectionExecutemanyÛ  s    

z)ExtensionTests.CheckConnectionExecutemanyc             C   s8   t  d¡}| d¡ | d¡ ¡ d }|  |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ô   r1   rC   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  d¡}| ¡  |  t j¡ | ¡ }W d Q R X d S )Nz:memory:)r   r.   r4   r=   r%   r0   )r   r>   r¢   r	   r	   r
   ÚCheckClosedConCursorê  s    
z#ClosedConTests.CheckClosedConCursorc          	   C   s6   t  d¡}| ¡  |  t j¡ | ¡  W d Q R X d S )Nz:memory:)r   r.   r4   r=   r%   r6   )r   r>   r	   r	   r
   ÚCheckClosedConCommitð  s    
z#ClosedConTests.CheckClosedConCommitc          	   C   s6   t  d¡}| ¡  |  t j¡ | ¡  W d Q R X d S )Nz:memory:)r   r.   r4   r=   r%   r9   )r   r>   r	   r	   r
   ÚCheckClosedConRollbackö  s    
z%ClosedConTests.CheckClosedConRollbackc          	   C   s@   t  d¡}| ¡ }| ¡  |  t j¡ | d¡ W d Q R X d S )Nz:memory:zselect 4)r   r.   r0   r4   r=   r%   r1   )r   r>   r¢   r	   r	   r
   ÚCheckClosedCurExecuteü  s
    
z$ClosedConTests.CheckClosedCurExecutec          	   C   sD   t  d¡}| ¡  dd„ }|  t j¡ | dd|¡ W d Q R X d S )Nz:memory:c             S   s   dS )Nrg   r	   )rn   r	   r	   r
   r¶     r·   z3ClosedConTests.CheckClosedCreateFunction.<locals>.fr-   r   )r   r.   r4   r=   r%   Úcreate_function)r   r>   r¶   r	   r	   r
   ÚCheckClosedCreateFunction  s
    
z(ClosedConTests.CheckClosedCreateFunctionc          	   C   sJ   t  d¡}| ¡  G dd„ dƒ}|  t 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   rn   r	   r	   r
   Ústep  s    z;ClosedConTests.CheckClosedCreateAggregate.<locals>.Agg.stepc             S   s   dS )Nrg   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.   r4   r=   r%   Úcreate_aggregate)r   r>   r  r	   r	   r
   ÚCheckClosedCreateAggregate
  s
    
z)ClosedConTests.CheckClosedCreateAggregatec          	   C   s@   t  d¡}| ¡  dd„ }|  t 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.   r4   r=   r%   Úset_authorizer)r   r>   r
  r	   r	   r
   ÚCheckClosedSetAuthorizer  s
    
z'ClosedConTests.CheckClosedSetAuthorizerc          	   C   sB   t  d¡}| ¡  dd„ }|  t j¡ | |d¡ W d Q R X d S )Nz:memory:c               S   s   d S )Nr	   r	   r	   r	   r
   Úprogress"  r·   z?ClosedConTests.CheckClosedSetProgressCallback.<locals>.progressrŠ   )r   r.   r4   r=   r%   Úset_progress_handler)r   r>   r  r	   r	   r
   ÚCheckClosedSetProgressCallback  s
    
z-ClosedConTests.CheckClosedSetProgressCallbackc          	   C   s4   t  d¡}| ¡  |  t j¡ |ƒ  W d Q R X d S )Nz:memory:)r   r.   r4   r=   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  d¡}| ¡ }| ¡  x^dD ]V}|dkr2d}n|dkrHdddgf}ng }|  t j¡ t||ƒ}||Ž  W d Q R X q W d S )	Nz:memory:)r1   r‚   rô   r¬   r¥   rC   )r1   rô   )zselect 4 union select 5r‚   zinsert into foo(bar) values (?))rM   )r®   )r   r.   r0   r4   r=   r%   Úgetattr)r   r>   r¢   Úmethod_nameÚ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  d¡| _| j ¡ | _| j d¡ d S )Nz:memory:zz
          CREATE TABLE test(
            id INTEGER PRIMARY KEY, name TEXT, unique_name TEXT UNIQUE
          );
        )r   r.   r/   r0   r2   r1   )r   r	   r	   r
   r3   F  s    zSqliteOnConflictTests.setUpc             C   s   | j  ¡  | j ¡  d S )N)r2   r4   r/   )r   r	   r	   r
   r5   O  s    
zSqliteOnConflictTests.tearDownc          	   C   sˆ   d | j _| j  ¡ | _| j d¡ | j d¡ | j d¡ |  tj¡ | j d¡ W d Q R X | j  ¡  | j d¡ |  	| 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_levelr0   r2   r1   r=   r   r!   r6   r   r¬   )r   r	   r	   r
   Ú.CheckOnConflictRollbackWithExplicitTransactionS  s    
zDSqliteOnConflictTests.CheckOnConflictRollbackWithExplicitTransactionc          	   C   sŒ   d | j _| j  ¡ | _| j d¡ | j d¡ | j d¡ |  tj¡ | j d¡ W d Q R X | j  ¡  | j d¡ |  	| 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_testN)Nr-   )r/   r  r0   r2   r1   r=   r   r!   r6   r   r¬   )r   r	   r	   r
   Ú2CheckOnConflictAbortRaisesWithExplicitTransactionsb  s    
zHSqliteOnConflictTests.CheckOnConflictAbortRaisesWithExplicitTransactionsc          	   C   s^   | j  d¡ | j  d¡ |  tj¡ | j  d¡ W d Q R X | j  d¡ |  | 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)r2   r1   r=   r   r!   r   r¬   )r   r	   r	   r
   Ú)CheckOnConflictRollbackWithoutTransactionr  s    z?SqliteOnConflictTests.CheckOnConflictRollbackWithoutTransactionc          	   C   sb   | j  d¡ | j  d¡ |  tj¡ | j  d¡ W d Q R X | j  d¡ |  | 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 test)r  N)Nr-   )r2   r1   r=   r   r!   r   r¬   )r   r	   r	   r
   Ú-CheckOnConflictAbortRaisesWithoutTransactions|  s    zCSqliteOnConflictTests.CheckOnConflictAbortRaisesWithoutTransactionsc          	   C   sF   | j  d¡ |  tj¡ | j  d¡ W d Q R X |  | j  ¡ g ¡ d S )Nz4INSERT OR FAIL INTO test(unique_name) VALUES ('foo'))r2   r1   r=   r   r!   r   r¬   )r   r	   r	   r
   ÚCheckOnConflictFail‡  s    z)SqliteOnConflictTests.CheckOnConflictFailc             C   s<   | j  d¡ | j  d¡ | j  d¡ |  | j  ¡ dg¡ d S )Nz6INSERT OR IGNORE INTO test(unique_name) VALUES ('foo')zSELECT unique_name FROM test)r-   )r2   r1   r   r¬   )r   r	   r	   r
   ÚCheckOnConflictIgnore  s    z+SqliteOnConflictTests.CheckOnConflictIgnorec             C   s<   | j  d¡ | j  d¡ | j  d¡ |  | 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)zVery different data!r-   )r2   r1   r   r¬   )r   r	   r	   r
   ÚCheckOnConflictReplace”  s    z,SqliteOnConflictTests.CheckOnConflictReplaceN)r)   r*   r+   Ú__doc__r3   r5   r  r  r  r  r  r   r!  r	   r	   r	   r
   r  ?  s   	
r  c        	      C   sˆ   t  td¡} t  td¡}t  td¡}t  td¡}t  td¡}t  td¡}t  td¡}t  t	d¡}t  t
d¡}t  | ||||||||f	¡S )NZCheck)rV   Ú	makeSuiter   r,   rX   rÉ   rÝ   ró   rý   r  r  Ú	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  ¡ } |  tƒ ¡ d S )N)rV   ÚTextTestRunnerrË   r%  )Úrunnerr	   r	   r
   rÁ   ¬  s    rÁ   Ú__main__)rÏ   rV   Úsqlite3r   Útest.supportr   r   ÚTestCaser   r,   rX   rÉ   rÝ   ró   rý   r  r  r%  rÁ   r)   r	   r	   r	   r
   Ú<module>   s&   7m  A 4C]