B
    2*™\Ù  ã               @   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ÚsqliteZapilevel)Úself© r   ú=C:\ALexclude\prg\programme\Python37\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   Zthreadsafety)r   r   r   r	   ÚCheckThreadSafety$   s    
zModuleTests.CheckThreadSafetyc             C   s   |   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   |   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+   r2   )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+   r5   )r   r   r   r	   ÚCheckRollbackAfterNoChangesn   s    
z+ConnectionTests.CheckRollbackAfterNoChangesc             C   s   | j  ¡ }d S )N)r+   r,   )r   r.   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+   r0   )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*   r,   r   Úin_transactionr-   Úfetchoner2   )r   r+   r.   Úrowr   r   r	   ÚCheckInTransaction   s    

z"ConnectionTests.CheckInTransactionc          	   C   s"   |   t¡ d| j_W d Q R X d S )NT)r9   ÚAttributeErrorr+   r>   )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'   rD   r   r   r   r	   ÚPath§   s   rE   zcreate table test(id integer)N)Ú
addCleanupr   r   r   r*   r-   )r   rE   Ú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)é   é   rJ   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))
r   Úsqlite_version_infor9   r#   r*   rF   r   r   r-   r   )r   r+   r   r   r	   ÚCheckOpenUri®   s    
zConnectionTests.CheckOpenUri)rI   rI   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)r9   r   r#   r*   r   ÚstrÚ	exception)r   Úcmr   r   r	   Ú CheckSameThreadErrorOnOldVersion¼   s    z0ConnectionTests.CheckSameThreadErrorOnOldVersionN)r%   r&   r'   r/   r1   r3   r4   r6   r7   r8   r;   r<   r=   rA   rC   rH   rL   ÚunittestZskipIfr   rK   rP   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+   r,   r.   r-   )r   r   r   r	   r/   Ä   s
    zCursorTests.setUpc             C   s   | j  ¡  | j ¡  d S )N)r.   r0   r+   )r   r   r   r	   r1   Í   s    
zCursorTests.tearDownc             C   s   | j  d¡ d S )Nzdelete from test)r.   r-   )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)r9   r   r   r.   r-   )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)r9   r   r   r.   r-   )r   r   r   r	   ÚCheckExecuteTooMuchSqlØ   s    z"CursorTests.CheckExecuteTooMuchSqlc             C   s   | j  d¡ d S )Nzselect 5+4; -- foo bar)r.   r-   )r   r   r   r	   ÚCheckExecuteTooMuchSql2Ü   s    z#CursorTests.CheckExecuteTooMuchSql2c             C   s   | j  d¡ d S )NzT
            select 5+4;

            /*
            foo
            */
            )r.   r-   )r   r   r   r	   ÚCheckExecuteTooMuchSql3ß   s    z#CursorTests.CheckExecuteTooMuchSql3c          	   C   s&   |   t¡ | 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  dd¡ d S )Nzinsert into test(id) values (?))rX   )r.   r-   )r   r   r   r	   ÚCheckExecuteArgIntì   s    zCursorTests.CheckExecuteArgIntc             C   s   | j  dd¡ d S )Nz#insert into test(income) values (?))gq=
×£ˆ£@)r.   r-   )r   r   r   r	   ÚCheckExecuteArgFloatï   s    z CursorTests.CheckExecuteArgFloatc             C   s   | j  dd¡ d S )Nz!insert into test(name) values (?))ZHugo)r.   r-   )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)r.   r-   Ú	lastrowidr?   r   )r   r@   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 (?)rX   z"parameters are of unsupported type)r9   rY   r.   r-   r   rM   rN   )r   rO   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)r9   r   r!   r.   r-   )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 (?))r9   r   r!   r.   r-   )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 (?))r9   r   r!   r.   r-   )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   )r.   r-   r?   r   )r   r@   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S )Nr)   r   )r   Úxr   r   r	   Ú__getitem__  s    z<CursorTests.CheckExecuteParamSequence.<locals>.L.__getitem__N)r%   r&   r'   rf   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  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   )r.   r-   r?   r   )r   r@   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'   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  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=:idrl   r)   )r.   r-   r9   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)r.   r-   r9   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=?rl   r)   )r.   r-   r9   r   r!   )r   r   r   r	   ÚCheckExecuteDictMappingUnnamed=  s    z*CursorTests.CheckExecuteDictMappingUnnamedc             C   s   | j  ¡  d S )N)r.   r0   )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'é   )r.   r-   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)r.   r-   r   rw   )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   )rv   )rI   rI   )r.   r-   Úexecutemanyr   rw   )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')rv   z"total changes reported wrong value)Úmsg)r.   r-   Z
assertLessr+   Z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   )Ú.0rg   r   r   r	   ú
<listcomp>d  s    z8CursorTests.CheckExecuteManySequence.<locals>.<listcomp>éd   én   )r.   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 (?))r.   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 (?))r.   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 )NrX   )rI   )r9   rY   r.   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 ?)rI   )r9   r   r!   r.   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 (?)rX   )r9   Ú	TypeErrorr.   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”   )r.   r-   Úappendr   )r   Zlstr@   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)   )r.   r-   r?   r   )r   r@   r   r   r	   ÚCheckFetchone“  s
    

zCursorTests.CheckFetchonec             C   s"   | j  ¡ }| ¡ }|  |d ¡ d S )N)r+   r,   r?   r   )r   Úcurr@   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   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  d¡ | j  d¡}|  t|ƒd¡ | j  d¡}|  |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  d¡ | j jdd}|  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  d¡ | j  ¡ }|  t|ƒd¡ | 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  dddg¡ d S )NrI   é   r…   )r.   Zsetinputsizes)r   r   r   r	   ÚCheckSetinputsizesÄ  s    zCursorTests.CheckSetinputsizesc             C   s   | j  dd¡ d S )Nr…   r   )r.   Úsetoutputsize)r   r   r   r	   ÚCheckSetoutputsizeÇ  s    zCursorTests.CheckSetoutputsizec             C   s   | j  d¡ d S )NrX   )r.   r¥   )r   r   r   r	   ÚCheckSetoutputsizeNoColumnÊ  s    z&CursorTests.CheckSetoutputsizeNoColumnc             C   s   |   | jj| j¡ d S )N)r   r.   Z
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)r9   r’   r+   r,   )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¬   )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 | |¡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)ÚsubTestr.   r-   Úformatr   r^   )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 (?))Útestrv   )r.   r-   r   r^   )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µ   rv   )r¶   rI   )r·   r£   )
r¯   r°   r.   r-   r•   r^   r9   r   r   r   )r   Úresultsr®   r±   Zexpectedr   r   r	   ÚCheckLastRowIDInsertORð  s    
  z"CursorTests.CheckLastRowIDInsertORN)5r%   r&   r'   r/   r1   rS   rT   rU   rV   rW   rZ   r[   r\   r]   r_   r`   rb   rc   rd   re   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	   rR   Ã   sd   		
		

rR   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:   r,   r˜   r-   )r   r   r   r	   r/     s    zThreadTests.setUpc             C   s   | 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}| ¡  | ¡  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)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}| ¡  | ¡  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)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}| ¡  | ¡  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)r5   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)r0   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)r-   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)r0   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)r-   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˜   r-   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)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  ddd¡}d S )NiÔ  rˆ   é   )r   ZDate)r   Údr   r   r	   Ú	CheckDate   s    zConstructorTests.CheckDatec             C   s   t  ddd¡}d S )Né   é'   é#   )r   Z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   Z	Timestamp)r   Útsr   r   r	   ÚCheckTimestamp¦  s    zConstructorTests.CheckTimestampc             C   s   t  d¡}d S )NrX   )r   ZDateFromTicks)r   rÐ   r   r   r	   ÚCheckDateFromTicks©  s    z#ConstructorTests.CheckDateFromTicksc             C   s   t  d¡}d S )NrX   )r   ZTimeFromTicks)r   rÅ   r   r   r	   ÚCheckTimeFromTicks¬  s    z#ConstructorTests.CheckTimeFromTicksc             C   s   t  d¡}d S )NrX   )r   ZTimestampFromTicks)r   rÖ   r   r   r	   ÚCheckTimestampFromTicks¯  s    z(ConstructorTests.CheckTimestampFromTicksc             C   s   t  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  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*   r,   Úexecutescriptr-   r?   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*   r,   r9   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*   r,   r9   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*   r,   r9   rY   rÞ   r   rM   rN   )r   r:   r˜   rO   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*   r-   r?   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 (?))rI   )r£   z!select foo from test order by foor   rI   z$Basic test of Connection.executemanyr   r£   )r   r*   r-   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Þ   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  d¡}| ¡  |  t 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  d¡}| ¡  |  t 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  d¡}| ¡  |  t 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  d¡}| ¡ }| ¡  |  t 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  d¡}| ¡  dd„ }|  t j¡ | dd|¡ W d Q R X d S )Nz:memory:c             S   s   dS )Nra   r   )rg   r   r   r	   r©     rª   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  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   rg   r   r   r	   Ústep  s    z;ClosedConTests.CheckClosedCreateAggregate.<locals>.Agg.stepc             S   s   dS )Nra   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  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*   r0   r9   r!   Z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*   r0   r9   r!   Z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*   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  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:)r-   r{   rÞ   r¡   rš   r?   )r-   rÞ   )zselect 4 union select 5r{   zinsert into foo(bar) values (?))rI   )r£   )r   r*   r,   r0   r9   r!   Úgetattr)r   r:   r˜   Z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+   r,   r.   r-   )r   r   r   r	   r/   F  s    zSqliteOnConflictTests.setUpc             C   s   | j  ¡  | j ¡  d S )N)r.   r0   r+   )r   r   r   r	   r1   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_levelr,   r.   r-   r9   r   r   r2   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þ   r,   r.   r-   r9   r   r   r2   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)r.   r-   r9   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)   )r.   r-   r9   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'))r.   r-   r9   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)   )r.   r-   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)   )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ü   ?  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)rQ   Z	makeSuiter   r(   rR   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  ¡ } |  tƒ ¡ d S )N)rQ   ZTextTestRunnerr¼   r  )Zrunnerr   r   r	   r³   ¬  s    r³   Ú__main__)rÀ   rQ   Zsqlite3r   Ztest.supportr   r   ZTestCaser   r(   rR   rº   rÎ   rÝ   rç   r÷   rü   r  r³   r%   r   r   r   r	   Ú<module>   s&   7m  A 4C]