a
    åze0  ã                   @   sÖ   d dl Z d dlZd dlmZ G dd„ dejƒZdd„ 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)ÚSequencec                   @   s   e Zd Zdd„ ZdS )ÚMyConnectionc                 O   s   t jj| g|¢R i |¤Ž d S ©N)ÚsqliteÚ
ConnectionÚ__init__©ÚselfÚargsÚkwargs© r   ú*/usr/lib/python3.9/sqlite3/test/factory.pyr      s    zMyConnection.__init__N©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s   r   c                 C   s,   i }t | jƒD ]\}}|| ||d < q|S )Nr   )Ú	enumerateÚdescription)ÚcursorÚrowÚdÚidxÚcolr   r   r   Údict_factory    s    r   c                   @   s   e Zd Zdd„ ZdS )ÚMyCursorc                 O   s$   t jj| g|¢R i |¤Ž t| _d S r   )r   ÚCursorr   r   Úrow_factoryr   r   r   r   r   '   s    zMyCursor.__init__Nr   r   r   r   r   r   &   s   r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚConnectionFactoryTestsc                 C   s   t jdtd| _d S )Nú:memory:©Úfactory)r   Úconnectr   Úcon©r	   r   r   r   ÚsetUp,   s    zConnectionFactoryTests.setUpc                 C   s   | j  ¡  d S r   ©r"   Úcloser#   r   r   r   ÚtearDown/   s    zConnectionFactoryTests.tearDownc                 C   s   |   | jt¡ d S r   )ÚassertIsInstancer"   r   r#   r   r   r   ÚCheckIsInstance2   s    z&ConnectionFactoryTests.CheckIsInstanceN)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	S )
ÚCursorFactoryTestsc                 C   s   t  d¡| _d S ©Nr   ©r   r!   r"   r#   r   r   r   r$   6   s    zCursorFactoryTests.setUpc                 C   s   | j  ¡  d S r   r%   r#   r   r   r   r'   9   s    zCursorFactoryTests.tearDownc                 C   sR   | j  ¡ }|  |tj¡ | j  t¡}|  |t¡ | j jdd„ d}|  |t¡ d S )Nc                 S   s   t | ƒS r   )r   ©r"   r   r   r   Ú<lambda>A   ó    z4CursorFactoryTests.CheckIsInstance.<locals>.<lambda>r   )r"   r   r(   r   r   r   )r	   Úcurr   r   r   r)   <   s    
z"CursorFactoryTests.CheckIsInstancec                 C   sB   |   t| jjd ¡ |   t| jjdd„ ¡ |   t| jjdd„ ¡ d S )Nc                   S   s   d S r   r   r   r   r   r   r.   H   r/   z8CursorFactoryTests.CheckInvalidFactory.<locals>.<lambda>c                 S   s   d S r   r   r-   r   r   r   r.   J   r/   )ÚassertRaisesÚ	TypeErrorr"   r   r#   r   r   r   ÚCheckInvalidFactoryD   s    z&CursorFactoryTests.CheckInvalidFactoryN)r   r   r   r$   r'   r)   r3   r   r   r   r   r*   5   s   r*   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚRowFactoryTestsBackwardsCompatc                 C   s   t  d¡| _d S r+   r,   r#   r   r   r   r$   M   s    z$RowFactoryTestsBackwardsCompat.setUpc                 C   s8   | j jtd}| d¡ | ¡ }|  |t¡ | ¡  d S )Nr   zselect 4+5 as foo)r"   r   r   ÚexecuteÚfetchoner(   Údictr&   )r	   r0   r   r   r   r   ÚCheckIsProducedByFactoryP   s
    
z7RowFactoryTestsBackwardsCompat.CheckIsProducedByFactoryc                 C   s   | j  ¡  d S r   r%   r#   r   r   r   r'   W   s    z'RowFactoryTestsBackwardsCompat.tearDownN)r   r   r   r$   r8   r'   r   r   r   r   r4   L   s   r4   c                   @   sl   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚRowFactoryTestsc                 C   s   t  d¡| _d S r+   r,   r#   r   r   r   r$   [   s    zRowFactoryTests.setUpc                 C   s,   dd„ | j _| j  d¡ ¡ }|  |t¡ d S )Nc                 S   s   t |ƒS r   )Úlist)r0   r   r   r   r   r.   _   r/   z4RowFactoryTests.CheckCustomFactory.<locals>.<lambda>zselect 1, 2)r"   r   r5   r6   r(   r:   ©r	   r   r   r   r   ÚCheckCustomFactory^   s    z"RowFactoryTests.CheckCustomFactoryc                 C   sö  t j| j_| j d¡ ¡ }|  |t j¡ |  |d dd¡ |  |d dd¡ |  |d dd	¡ |  |d
 dd¡ |  |d dd¡ |  |d dd¡ |  |d dd¡ |  |d dd¡ |  t	¡ |d  W d   ƒ n1 sà0    Y  |  t	¡ |d  W d   ƒ n1 s0    Y  |  t	¡ |d  W d   ƒ n1 sH0    Y  |  t	¡ |d  W d   ƒ n1 s|0    Y  |  t	¡ |d  W d   ƒ n1 s°0    Y  |  t	¡ |dd   W d   ƒ n1 sè0    Y  d S )Nzselect 1 as a_1, 2 as bZa_1é   z&by name: wrong result for column 'a_1'Úbé   z$by name: wrong result for column 'b'ZA_1z&by name: wrong result for column 'A_1'ÚBz$by name: wrong result for column 'B'r   z#by index: wrong result for column 0z#by index: wrong result for column 1éÿÿÿÿz$by index: wrong result for column -1éþÿÿÿz$by index: wrong result for column -2Úcza_za1éýÿÿÿiè  )
r   ÚRowr"   r   r5   r6   r(   ÚassertEqualr1   Ú
IndexErrorr;   r   r   r   ÚCheckSqliteRowIndexc   s.    
&((((z#RowFactoryTests.CheckSqliteRowIndexc                 C   s’   t j| j_| j d¡ ¡ }|  |d d¡ |  t¡ |d  W d   ƒ n1 sR0    Y  |  t¡ |d  W d   ƒ n1 s„0    Y  d S )Nu   select 1 as Ã¿õ   Ã¿r=   u   Å¸õ   ÃŸ)	r   rE   r"   r   r5   r6   rF   r1   rG   r;   r   r   r   ÚCheckSqliteRowIndexUnicode€   s    
&z*RowFactoryTests.CheckSqliteRowIndexUnicodec                 C   sê   t j| j_| j d¡ ¡ }|  |dd… d¡ |  |dd… d¡ |  |dd… d¡ |  |dd… d¡ |  |dd … d¡ |  |d d… d	¡ |  |d
d… d¡ |  |d
d … d¡ |  |ddd… d¡ |  |ddd
… d¡ d S )Nzselect 1, 2, 3, 4r   r   r=   )r=   é   )r?   rL   )r?   rL   é   )r=   r?   rL   rB   rA   )rL   )rL   rM   rM   r?   )r=   rL   )rM   r?   )r   rE   r"   r   r5   r6   rF   r;   r   r   r   ÚCheckSqliteRowSlice‰   s    
z#RowFactoryTests.CheckSqliteRowSlicec                 C   s(   t j| j_| j d¡ ¡ }|D ]}qdS )z$Checks if the row object is iterableúselect 1 as a, 2 as bN)r   rE   r"   r   r5   r6   )r	   r   r   r   r   r   ÚCheckSqliteRowIter›   s    
z"RowFactoryTests.CheckSqliteRowIterc                 C   s>   t j| j_| j d¡ ¡ }t|ƒ}|  ||d |d f¡ dS )z4Checks if the row object can be converted to a tuplerO   Úar>   N)r   rE   r"   r   r5   r6   ÚtuplerF   )r	   r   Útr   r   r   ÚCheckSqliteRowAsTuple¢   s    
z%RowFactoryTests.CheckSqliteRowAsTuplec                 C   sN   t j| j_| j d¡ ¡ }t|ƒ}|  |d |d ¡ |  |d |d ¡ dS )zCChecks if the row object can be correctly converted to a dictionaryrO   rQ   r>   N)r   rE   r"   r   r5   r6   r7   rF   )r	   r   r   r   r   r   ÚCheckSqliteRowAsDict©   s
    
z$RowFactoryTests.CheckSqliteRowAsDictc                 C   sî  t j| j_| j d¡ ¡ }| j d¡ ¡ }| j d¡ ¡ }| j d¡ ¡ }| j d¡ ¡ }|  ||k¡ |  ||k¡ |  ||k¡ |  ||k¡ |  ||k¡ |  |tƒ k¡ |  ||k¡ |  ||k¡ |  ||k¡ |  ||k¡ |  ||k¡ |  |tƒ k¡ |  	t
¡ ||k W d  ƒ n1 s00    Y  |  	t
¡ ||k  W d  ƒ n1 sd0    Y  |  	t
¡ ||k W d  ƒ n1 s˜0    Y  |  	t
¡ ||k W d  ƒ n1 sÌ0    Y  |  t|ƒt|ƒ¡ dS )z6Checks if the row object compares and hashes correctlyrO   zselect 1 as a, 3 as bzselect 1 as b, 2 as azselect 2 as b, 1 as aN)r   rE   r"   r   r5   r6   Ú
assertTrueZassertFalseÚobjectr1   r2   rF   Úhash)r	   Zrow_1Zrow_2Zrow_3Zrow_4Zrow_5r   r   r   ÚCheckSqliteRowHashCmp±   s6    
((((z%RowFactoryTests.CheckSqliteRowHashCmpc                 C   sN   t j| j_| j d¡ ¡ }t|ƒ}|  tt	|ƒƒtt	|ƒƒ¡ |  
|t¡ dS )z2 Checks if the row object can act like a sequence rO   N)r   rE   r"   r   r5   r6   rR   rF   r:   Úreversedr(   r   )r	   r   Zas_tupler   r   r   ÚCheckSqliteRowAsSequenceÓ   s
    
z(RowFactoryTests.CheckSqliteRowAsSequencec                 C   sD   G dd„ dt ƒ}tj| j_|  t| jj|¡ |  ttj|ƒ d¡ d S )Nc                   @   s   e Zd ZejZdS )z8RowFactoryTests.CheckFakeCursorClass.<locals>.FakeCursorN)r   r   r   r   r   Ú	__class__r   r   r   r   Ú
FakeCursorà   s   r]   r   )Ústrr   rE   r"   r   r1   r2   r   )r	   r]   r   r   r   ÚCheckFakeCursorClassÜ   s    
z$RowFactoryTests.CheckFakeCursorClassc                 C   s   | j  ¡  d S r   r%   r#   r   r   r   r'   æ   s    zRowFactoryTests.tearDownN)r   r   r   r$   r<   rH   rK   rN   rP   rT   rU   rY   r[   r_   r'   r   r   r   r   r9   Z   s   	"	
r9   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S )ÚTextFactoryTestsc                 C   s   t  d¡| _d S r+   r,   r#   r   r   r   r$   ê   s    zTextFactoryTests.setUpc                 C   s2   d}| j  d|f¡ ¡ }|  t|d ƒtd¡ d S )Nõ   Ã–sterreichúselect ?r   útype of row[0] must be unicode)r"   r5   r6   rF   Útyper^   ©r	   Úaustriar   r   r   r   ÚCheckUnicodeí   s    zTextFactoryTests.CheckUnicodec                 C   sR   t | j_d}| j d|f¡ ¡ }|  t|d ƒt d¡ |  |d | d¡d¡ d S )Nra   rb   r   ztype of row[0] must be bytesúutf-8z(column must equal original data in UTF-8)Úbytesr"   Útext_factoryr5   r6   rF   rd   Úencodere   r   r   r   ÚCheckStringò   s
    zTextFactoryTests.CheckStringc                 C   sT   dd„ | j _d}| j  d|f¡ ¡ }|  t|d ƒtd¡ |  |d  d¡d¡ d S )	Nc                 S   s   t | ddƒS )Nrh   Úignore)r^   ©Úxr   r   r   r.   ú   r/   z.TextFactoryTests.CheckCustom.<locals>.<lambda>ra   rb   r   rc   Zreichz!column must contain original data)	r"   rj   r5   r6   rF   rd   r^   rV   Úendswithre   r   r   r   ÚCheckCustomù   s
    zTextFactoryTests.CheckCustomc                 C   sj   t j| j_d}d}| j d|f¡ ¡ }| j d|f¡ ¡ }|  t|d ƒtd¡ |  t|d ƒtd¡ d S )Nra   Z
Deutchlandrb   r   z!type of non-ASCII row must be strz"type of ASCII-only row must be str)	r   ZOptimizedUnicoder"   rj   r5   r6   rF   rd   r^   )r	   rf   ZgermanyZa_rowZd_rowr   r   r   ÚCheckOptimizedUnicode   s    
z&TextFactoryTests.CheckOptimizedUnicodec                 C   s   | j  ¡  d S r   r%   r#   r   r   r   r'     s    zTextFactoryTests.tearDownN)	r   r   r   r$   rg   rl   rq   rr   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S )Ú%TextFactoryTestsWithEmbeddedZeroBytesc                 C   s*   t  d¡| _| j d¡ | j dd¡ d S )Nr   zcreate table test (value text)z#insert into test (value) values (?))úa b)r   r!   r"   r5   r#   r   r   r   r$     s    z+TextFactoryTestsWithEmbeddedZeroBytes.setUpc                 C   s8   | j  d¡ ¡ }|  t|d ƒt¡ |  |d d¡ d S )Núselect value from testr   rt   )r"   r5   r6   ÚassertIsrd   r^   rF   r;   r   r   r   rl     s    z1TextFactoryTestsWithEmbeddedZeroBytes.CheckStringc                 C   s@   t | j_| j d¡ ¡ }|  t|d ƒt ¡ |  |d d¡ d S ©Nru   r   ó   a b)ri   r"   rj   r5   r6   rv   rd   rF   r;   r   r   r   Ú
CheckBytes  s    z0TextFactoryTestsWithEmbeddedZeroBytes.CheckBytesc                 C   s@   t | j_| j d¡ ¡ }|  t|d ƒt ¡ |  |d d¡ d S rw   )Ú	bytearrayr"   rj   r5   r6   rv   rd   rF   r;   r   r   r   ÚCheckBytearray   s    z4TextFactoryTestsWithEmbeddedZeroBytes.CheckBytearrayc                 C   sD   dd„ | j _| j  d¡ ¡ }|  t|d ƒt¡ |  |d d¡ d S )Nc                 S   s   | S r   r   rn   r   r   r   r.   (  r/   zCTextFactoryTestsWithEmbeddedZeroBytes.CheckCustom.<locals>.<lambda>ru   r   rx   )r"   rj   r5   r6   rv   rd   ri   rF   r;   r   r   r   rq   &  s    z1TextFactoryTestsWithEmbeddedZeroBytes.CheckCustomc                 C   s   | j  ¡  d S r   r%   r#   r   r   r   r'   -  s    z.TextFactoryTestsWithEmbeddedZeroBytes.tearDownN)	r   r   r   r$   rl   ry   r{   rq   r'   r   r   r   r   rs     s   rs   c                  C   s^   t  td¡} t  td¡}t  td¡}t  td¡}t  td¡}t  td¡}t  | |||||f¡S )NZCheck)	ÚunittestZ	makeSuiter   r*   r4   r9   r`   rs   Z	TestSuite)Zconnection_suiteZcursor_suiteZrow_suite_compatZ	row_suiteZ
text_suiteZtext_zero_bytes_suiter   r   r   Úsuite0  s    r}   c                  C   s   t  ¡ } |  tƒ ¡ d S r   )r|   ZTextTestRunnerÚrunr}   )Zrunnerr   r   r   Útest9  s    r   Ú__main__)r|   Zsqlite3r   Úcollections.abcr   r   r   r   r   r   ZTestCaser   r*   r4   r9   r`   rs   r}   r   r   r   r   r   r   Ú<module>   s    
 %"	