o
    ª›hE‚  ã                   @   s>   d Z ddd… ZdZddlZddlZdZG dd	„ d	ejƒZdS )
a¬  Python DB API 2.0 driver compliance unit test suite.

   This software is Public Domain and may be used without restrictions.

"Now we have booze and barflies entering the discussion, plus rumours of
 DBAs on drugs... and I won't tell you what flashes through my mind each
 time I read the subject line with 'Anal Compliance' in it.  All around
 this is turning out to be a thoroughly unwholesome unit test."

   -- Ian Bicking
z$Revision: 1.15.0 $é   éþÿÿÿz'Stuart Bishop <stuart@stuartbishop.net>é    NFc                   @   s°  e Zd ZdZdZdZi ZdZde Zde Z	de Z
d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	Zd,d-„ Zd.d/„ Z d0d1„ Z!d2d3„ Z"d4d5„ Z#d6d7„ Z$g d8¢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„ Z0dOdP„ Z1dQdR„ Z2dSdT„ Z3dUdV„ Z4dWdX„ Z5dYdZ„ Z6d[d\„ Z7d]d^„ Z8d_d`„ Z9dadb„ Z:dS )cÚDatabaseAPI20Testa	  Test a database self.driver for DB API 2.0 compatibility.
    This implementation tests Gadfly, but the TestCase
    is structured so that other self.drivers can subclass this
    test case to ensure compiliance with the DB-API. It is
    expected that this TestCase may be expanded in the future
    if ambiguities or edge conditions are discovered.

    The 'Optional Extensions' are not yet being tested.

    self.drivers should subclass this test, overriding setUp, tearDown,
    self.driver, connect_args and connect_kw_args. Class specification
    should be as follows:

    import dbapi20
    class mytest(dbapi20.DatabaseAPI20Test):
       [...]

    Don't 'import DatabaseAPI20Test from dbapi20', or you will
    confuse the unit tester - just 'import dbapi20'.
    N© Zdbapi20test_z'create table %sbooze (name varchar(20))z<create table %sbarflys (name varchar(20), drink varchar(30))zdrop table %sboozezdrop table %sbarflysÚlowerc                 C   ó   |  | j¡ d S ©N)ÚexecuteÚddl1©ÚselfÚcursorr   r   úKc:\Users\shubh\Videos\agent\nova\Lib\site-packages\adodbapi/test/dbapi20.pyÚexecuteDDL1|   ó   zDatabaseAPI20Test.executeDDL1c                 C   r   r   )r	   Úddl2r   r   r   r   ÚexecuteDDL2   r   zDatabaseAPI20Test.executeDDL2c                 C   s   dS )z‡self.drivers should override this method to perform required setup
        if any is necessary, such as creating the database.
        Nr   ©r   r   r   r   ÚsetUp‚   s   zDatabaseAPI20Test.setUpc              	   C   s€   z5|   ¡ }z+| ¡ }| j| jfD ]}z| |¡ | ¡  W q | jjy(   Y qw W | ¡  W dS | ¡  w  t	y?   Y dS w )zÈself.drivers should override this method to perform required cleanup
        if any is necessary, such as deleting the test database.
        The default drops the tables that may be created.
        N)
Ú_connectr   Úxddl1Úxddl2r	   ÚcommitÚdriverÚErrorÚcloseÚ	Exception)r   ÚconÚcurZddlr   r   r   ÚtearDownˆ   s    
ýü	ÿzDatabaseAPI20Test.tearDownc                 C   s<   z| j j| ji | j¤Ž}W |S  ty   |  d¡ Y |S w )Nz-No connect method found in self.driver module)r   ÚconnectÚconnect_argsÚconnect_kw_argsÚAttributeErrorÚfail)r   Úrr   r   r   r   ž   s   þþzDatabaseAPI20Test._connectc                 C   s   |   ¡ }| ¡  d S r   )r   r   ©r   r   r   r   r   Útest_connect¥   s   zDatabaseAPI20Test.test_connectc                 C   s:   z| j j}|  |d¡ W d S  ty   |  d¡ Y d S w )Nz2.0zDriver doesn't define apilevel)r   ÚapilevelÚassertEqualr#   r$   )r   r(   r   r   r   Útest_apilevel©   s   ÿzDatabaseAPI20Test.test_apilevelc                 C   ó<   z| j j}|  |dv ¡ W d S  ty   |  d¡ Y d S w )N)r   é   é   é   z"Driver doesn't define threadsafety)r   ÚthreadsafetyÚ
assertTruer#   r$   )r   r/   r   r   r   Útest_threadsafety²   s   ÿz#DatabaseAPI20Test.test_threadsafetyc                 C   r+   )N)ÚqmarkÚnumericÚnamedÚformatÚpyformatz Driver doesn't define paramstyle)r   Ú
paramstyler0   r#   r$   )r   r7   r   r   r   Útest_paramstyle»   s   
ÿÿz!DatabaseAPI20Test.test_paramstylec                 C   sÔ   |   t| jjtƒ¡ |   t| jjtƒ¡ |   t| jj| jjƒ¡ |   t| jj| jjƒ¡ |   t| jj| jjƒ¡ |   t| jj	| jjƒ¡ |   t| jj
| jjƒ¡ |   t| jj| jjƒ¡ |   t| jj| jjƒ¡ d S r   )r0   Ú
issubclassr   ÚWarningr   r   ÚInterfaceErrorÚDatabaseErrorÚOperationalErrorÚIntegrityErrorÚInternalErrorÚProgrammingErrorÚNotSupportedErrorr   r   r   r   Útest_ExceptionsÆ   s   z!DatabaseAPI20Test.test_Exceptionsc                 C   s´   |   ¡ }| j}|  |j|ju ¡ |  |j|ju ¡ |  |j|ju ¡ |  |j|ju ¡ |  |j|ju ¡ |  |j|ju ¡ |  |j	|j	u ¡ |  |j
|j
u ¡ |  |j|ju ¡ d S r   )r   r   r0   r:   r   r;   r<   r=   r>   r?   r@   rA   )r   r   Údrvr   r   r   Ú%test_ExceptionsAsConnectionAttributesÓ   s   z7DatabaseAPI20Test.test_ExceptionsAsConnectionAttributesc                 C   s*   |   ¡ }z| ¡  W | ¡  d S | ¡  w r   )r   r   r   r&   r   r   r   Útest_commitæ   s   
zDatabaseAPI20Test.test_commitc                 C   s>   |   ¡ }t|dƒrz| ¡  W d S  | jjy   Y d S w d S )NÚrollback)r   ÚhasattrrF   r   rA   r&   r   r   r   Útest_rollbackî   s   
ÿýzDatabaseAPI20Test.test_rollbackc                 C   s*   |   ¡ }z| ¡ }W | ¡  d S | ¡  w r   )r   r   r   ©r   r   r   r   r   r   Útest_cursorø   s   
zDatabaseAPI20Test.test_cursorc                 C   sœ   |   ¡ }zD| ¡ }| ¡ }|  |¡ | d| j ¡ | d| j ¡ | ¡ }|  t|ƒd¡ |  t|d ƒd¡ |  |d d d¡ W | ¡  d S | ¡  w )Nú.insert into %sbooze values ('Victoria Bitter')úselect name from %sboozer,   r   úVictoria Bitter©	r   r   r   r	   Útable_prefixÚfetchallr)   Úlenr   )r   r   Zcur1Zcur2Zboozer   r   r   Útest_cursor_isolationÿ   s   
ÿz'DatabaseAPI20Test.test_cursor_isolationc                 C   sà   |   ¡ }zf| ¡ }|  |¡ |  |jd d¡ | d| j ¡ |  t|jƒdd¡ |  t|jd ƒdd¡ |  |jd d  ¡ dd	¡ |  |jd d | j	j
d
|jd d  ¡ |  |¡ |  |jd d¡ W | ¡  d S | ¡  w )Nzccursor.description should be none after executing a statement that can return no rows (such as DDL)rL   r,   z-cursor.description describes too many columnsr   é   z1cursor.description[x] tuples must have 7 elementsÚnamez0cursor.description[x][0] must return column namez8cursor.description[x][1] must return column type. Got %rzVcursor.description not being set to None when executing no-result statements (eg. DDL))r   r   r   r)   Údescriptionr	   rO   rQ   r   r   ÚSTRINGr   r   rI   r   r   r   Útest_description  sJ   
ýÿýýÿý
ýz"DatabaseAPI20Test.test_descriptionc                 C   s¤   |   ¡ }zH| ¡ }|  |¡ |  |jdv d¡ | d| j ¡ |  |jdv d¡ | d| j ¡ |  |jdv d¡ |  |¡ |  |jdd	¡ W | 	¡  d S | 	¡  w )
N©éÿÿÿÿr   zFcursor.rowcount should be -1 or 0 after executing no-result statementsrK   ©rY   r,   zccursor.rowcount should == number or rows inserted, or set to -1 after executing an insert statementrL   zbcursor.rowcount should == number of rows returned, or set to -1 after executing a select statementrY   zJcursor.rowcount not being reset to -1 after executing no-result statements)
r   r   r   r0   Úrowcountr	   rO   r   r)   r   rI   r   r   r   Útest_rowcount=  s6   
þÿþþ
ýzDatabaseAPI20Test.test_rowcountc                 C   sÊ   |   ¡ }z[| ¡ }| jrRt|dƒrY| | jd¡}|  t|ƒd¡ |  |d d¡ | ¡ }|  t|ƒdd¡ |  t|d ƒdd¡ |  |d d dd	¡ W | ¡  d S W | ¡  d S W | ¡  d S | ¡  w )
NÚcallproc)ÚFOOr,   r   r^   zcallproc produced no result setz$callproc produced invalid result setZfooz!callproc produced invalid results)	r   r   Ú
lower_funcrG   r]   r)   rQ   rP   r   ©r   r   r   r%   r   r   r   Útest_callproca  s    ÷	÷	zDatabaseAPI20Test.test_callprocc                 C   sv   |   ¡ }z
| ¡ }W | ¡  n| ¡  w |  | jj| j|¡ |  | jj|j¡ tr4|  | jj|j¡ d S |  	d¡ d S )Nz>Non-idempotent close is considered a bad thing by some people.)
r   r   r   ÚassertRaisesr   r   r   r   ÚTEST_FOR_NON_IDEMPOTENT_CLOSEZskipTestrI   r   r   r   Ú
test_closep  s   
ÿzDatabaseAPI20Test.test_closec                 C   s4   |   ¡ }z| ¡ }|  |¡ W | ¡  d S | ¡  w r   )r   r   Ú_paraminsertr   rI   r   r   r   Útest_executeˆ  s
   zDatabaseAPI20Test.test_executec                 C   s¶  |   |¡ | d| j ¡ |  |jdv ¡ | jjdkr%| d| j d¡ nI| jjdkr5| d| j d¡ n9| jjdkrG| d	| j d
di¡ n'| jjdkrW| d| j d¡ n| jjdkri| d| j d
di¡ n|  d¡ |  |jdv ¡ | d| j ¡ | ¡ }|  	t
|ƒdd¡ |d d |d d g}| ¡  |  	|d dd¡ |  	|d dd¡ d}|  	|d d |d|d d ›d|›�¡ |  	|d d |d|d d ›d|›�¡ d S )NzSinsert into %sbarflys values ('Victoria Bitter', 'thi%%s :may ca%%(u)se? troub:1e')rZ   r2   zCinsert into %sbarflys values (?, 'thi%%s :may ca%%(u)se? troub:1e')©úCooper'sr3   zDinsert into %sbarflys values (:1, 'thi%%s :may ca%%(u)se? troub:1e')r4   zGinsert into %sbarflys values (:beer, 'thi%%s :may ca%%(u)se? troub:1e')Úbeerrh   r5   zEinsert into %sbarflys values (%%s, 'thi%%s :may ca%%(u)se? troub:1e')r6   zKinsert into %sbarflys values (%%(beer)s, 'thi%%s :may ca%%(u)se? troub:1e')zInvalid paramstylez!select name, drink from %sbarflysr-   z%cursor.fetchall returned too few rowsr   r,   zFcursor.fetchall retrieved incorrect data, or data inserted incorrectlyrM   zthi%s :may ca%(u)se? troub:1ezLcursor.fetchall retrieved incorrect data, or data inserted incorrectly. Got=z, Expected=)r   r	   rO   r0   r[   r   r7   r$   rP   r)   rQ   Úsort)r   r   ÚresÚbeersZtroubler   r   r   re   �  sœ   
ÿÿÿýÿýÿýÿýÿý
ýý

ÿÿý

ÿÿýzDatabaseAPI20Test._paraminsertc                 C   s„  |   ¡ }z¸| ¡ }|  |¡ ddg}ddiddig}| jjdkr*| d| j |¡ nE| jjdkr:| d	| j |¡ n5| jjd
krJ| d| j |¡ n%| jjdkrZ| d| j |¡ n| jjdkrj| d| j |¡ n|  d¡ |  |j	dv d|j	 ¡ | 
d| j ¡ | ¡ }|  t|ƒdd¡ |d d |d d g}| ¡  |  |d dd|d  ¡ |  |d dd¡ W | ¡  d S | ¡  w )Nrg   )úBoag'sri   rh   rm   r2   zinsert into %sbooze values (?)r3   zinsert into %sbooze values (:1)r4   z"insert into %sbooze values (:beer)r5   z insert into %sbooze values (%%s)r6   z&insert into %sbooze values (%%(beer)s)zUnknown paramstyle)rY   r-   zIinsert using cursor.executemany set cursor.rowcount to incorrect value %rrL   r-   z2cursor.fetchall retrieved incorrect number of rowsr   r,   zincorrect data "%s" retrievedzincorrect data retrieved)r   r   r   r   r7   ZexecutemanyrO   r$   r0   r[   r	   rP   r)   rQ   rj   r   )r   r   r   ÚlargsZmargsrk   rl   r   r   r   Útest_executemany×  s\   

ÿ
ÿ
ÿ
ÿþ
ÿþ
ÿÿz"DatabaseAPI20Test.test_executemanyc                 C   s
  |   ¡ }z{| ¡ }|  | jj|j¡ |  |¡ |  | jj|j¡ | d| j ¡ |  	| ¡ d d¡ |  
|jdv ¡ | d| j ¡ |  | jj|j¡ | d| j ¡ | ¡ }|  	t|ƒdd¡ |  	|d dd	¡ |  	| ¡ d d
¡ |  
|jdv ¡ W | ¡  d S | ¡  w )NrL   z?cursor.fetchone should return None if a query retrieves no rowsrX   rK   r,   z2cursor.fetchone should have retrieved a single rowr   rM   z(cursor.fetchone retrieved incorrect dataz<cursor.fetchone should return None if no more rows availablerZ   )r   r   rb   r   r   Úfetchoner   r	   rO   r)   r0   r[   rQ   r   r`   r   r   r   Útest_fetchone  s@   
ýÿ
ÿ
ÿýzDatabaseAPI20Test.test_fetchone)zCarlton ColdzCarlton DraftzMountain GoatZRedbackrM   ZXXXXc                    s   ‡ fdd„ˆ j D ƒ}|S )zSReturn a list of sql commands to setup the DB for the fetch
        tests.
        c                    s   g | ]	}d ˆ j |f ‘qS )z!insert into %sbooze values ('%s'))rO   )Ú.0Úsr   r   r   Ú
<listcomp>C  s    ÿÿz/DatabaseAPI20Test._populate.<locals>.<listcomp>)Úsamples)r   Zpopulater   r   r   Ú	_populate?  s   
þzDatabaseAPI20Test._populatec                 C   s`  |   ¡ }�z%| ¡ }|  | jj|jd¡ |  |¡ |  ¡ D ]}| |¡ q| d| j	 ¡ | ¡ }|  
t|ƒdd¡ d|_| d¡}|  
t|ƒdd¡ | d¡}|  
t|ƒdd¡ | d¡}|  
t|ƒd	d
¡ |  |jdv ¡ d|_| d| j	 ¡ | ¡ }|  
t|ƒdd¡ | ¡ }|  
t|ƒd¡ | ¡ }|  
t|ƒd	¡ |  |jdv ¡ d|_| d| j	 ¡ | ¡ }|  |jdv ¡ |  
t|ƒd¡ |  
t|ƒd¡ dd„ |D ƒ}| ¡  td	dƒD ]}|  
|| | j| d¡ qÞ| ¡ }|  
t|ƒd	d¡ |  |jdv ¡ |  |¡ | d| j	 ¡ | ¡ }|  
t|ƒd	d¡ |  |jdv ¡ W | ¡  d S | ¡  w )Né   rL   r,   zQcursor.fetchmany retrieved incorrect number of rows, default of arraysize is one.é
   r.   z3cursor.fetchmany retrieved incorrect number of rowsr-   r   zLcursor.fetchmany should return an empty sequence after results are exhausted©rY   é   z0cursor.arraysize not being honoured by fetchmanyrz   c                 S   ó   g | ]}|d  ‘qS ©r   r   ©rr   r%   r   r   r   rt   ƒ  ó    z4DatabaseAPI20Test.test_fetchmany.<locals>.<listcomp>z,incorrect data retrieved by cursor.fetchmanyzfcursor.fetchmany should return an empty sequence if called after the whole result set has been fetchedúselect name from %sbarflyszKcursor.fetchmany should return an empty sequence if query retrieved no rowsrX   )r   r   rb   r   r   Ú	fetchmanyr   rv   r	   rO   r)   rQ   Ú	arraysizer0   r[   rj   Úrangeru   r   r   )r   r   r   Úsqlr%   ÚrowsÚir   r   r   Útest_fetchmanyI  s�   
ý

ÿ

ÿ
ý
ÿýý
ýz DatabaseAPI20Test.test_fetchmanyc                 C   sv  |   ¡ }z±| ¡ }|  | jj|j¡ |  |¡ |  ¡ D ]}| |¡ q|  | jj|j¡ | d| j	 ¡ | ¡ }|  
|jdt| jƒfv ¡ |  t|ƒt| jƒd¡ dd„ |D ƒ}| ¡  tdt| jƒƒD ]}|  || | j| d¡ qd| ¡ }|  t|ƒdd¡ |  
|jdt| jƒfv ¡ |  |¡ | d	| j	 ¡ | ¡ }|  
|jd
v ¡ |  t|ƒdd¡ W | ¡  d S | ¡  w )NrL   rY   z)cursor.fetchall did not retrieve all rowsc                 S   r{   r|   r   r}   r   r   r   rt   ¾  r~   z3DatabaseAPI20Test.test_fetchall.<locals>.<listcomp>r   z(cursor.fetchall retrieved incorrect rowszacursor.fetchall should return an empty list if called after the whole result set has been fetchedr   rX   zMcursor.fetchall should return an empty list if a select query returns no rows)r   r   rb   r   r   rP   r   rv   r	   rO   r0   r[   rQ   ru   r)   rj   r‚   r   r   )r   r   r   rƒ   r„   r…   r   r   r   Útest_fetchall¥  sN   
ýÿý
ýzDatabaseAPI20Test.test_fetchallc           
      C   s<  |   ¡ }z”| ¡ }|  |¡ |  ¡ D ]}| |¡ q| d| j ¡ | ¡ }| d¡}| ¡ }| ¡ }|  	|j
dv ¡ |  t|ƒdd¡ |  t|ƒdd¡ |d g}| |d d |d d g¡ | |d ¡ | |d d |d d g¡ | ¡  tdt| jƒƒD ]}	|  ||	 | j|	 d¡ qƒW | ¡  d S | ¡  w )	NrL   r-   ry   z+fetchmany returned incorrect number of rowsz*fetchall returned incorrect number of rowsr   r,   z$incorrect data retrieved or inserted)r   r   r   rv   r	   rO   rp   r€   rP   r0   r[   r)   rQ   ÚextendÚappendrj   r‚   ru   r   )
r   r   r   rƒ   Zrows1Zrows23Zrows4Zrows56r„   r…   r   r   r   Útest_mixedfetchÛ  s:   


ÿ
ÿ
ÿÿz!DatabaseAPI20Test.test_mixedfetchc                 C   ó   t dƒ‚)z™Should create a procedure called deleteme
        that returns two result sets, first the
        number of rows in booze then "name from booze"
        úHelper not implemented©ÚNotImplementedError©r   r   r   r   r   Úhelp_nextset_setUpü  s   z$DatabaseAPI20Test.help_nextset_setUpc                 C   r‹   )z*If cleaning up is needed after nextSetTestrŒ   r�   r�   r   r   r   Úhelp_nextset_tearDown  ó   z'DatabaseAPI20Test.help_nextset_tearDownc                 C   r‹   )Nz"Drivers need to override this testr�   r   r   r   r   Útest_nextset  s   zDatabaseAPI20Test.test_nextsetc                 C   s<   |   ¡ }z| ¡ }|  t|dƒd¡ W | ¡  d S | ¡  w )Nr�   z cursor.arraysize must be defined)r   r   r0   rG   r   rI   r   r   r   Útest_arraysize  s   
ÿz DatabaseAPI20Test.test_arraysizec                 C   s>   |   ¡ }z| ¡ }| d¡ |  |¡ W | ¡  d S | ¡  w )N)é   )r   r   Zsetinputsizesre   r   rI   r   r   r   Útest_setinputsizes  s   
z$DatabaseAPI20Test.test_setinputsizesc                 C   sJ   |   ¡ }z| ¡ }| d¡ | dd¡ |  |¡ W | ¡  d S | ¡  w )Niè  iÐ  r   )r   r   Zsetoutputsizere   r   rI   r   r   r   Útest_setoutputsize_basic'  s   
z*DatabaseAPI20Test.test_setoutputsize_basicc                 C   r‹   )Nz#Driver needed to override this testr�   r   r   r   r   Útest_setoutputsize2  r’   z$DatabaseAPI20Test.test_setoutputsizec                 C   s–   |   ¡ }zA| ¡ }|  |¡ | d| j ¡ | d| j ¡ | ¡ }|  t|ƒd¡ |  t|d ƒd¡ |  |d d d d¡ W | ¡  d S | ¡  w )Nz!insert into %sbooze values (NULL)rL   r,   r   zNULL value not returned as NonerN   r`   r   r   r   Ú	test_None6  s   
zDatabaseAPI20Test.test_Nonec                 C   ó&   | j  ddd¡}| j  t d¡¡}d S )NéÒ  é   r•   )	r›   rœ   r•   r   r   r   r   r   r   )r   ÚDateZDateFromTicksÚtimeÚmktime)r   Zd1Zd2r   r   r   Ú	test_DateD  ó   zDatabaseAPI20Test.test_Datec                 C   rš   )Né   é-   é   )	iÑ  r,   r,   r¢   r£   r¤   r   r   r   )r   ZTimeZTimeFromTicksrž   rŸ   ©r   Út1Út2r   r   r   Ú	test_TimeJ  r¡   zDatabaseAPI20Test.test_Timec                 C   s,   | j  dddddd¡}| j  t d¡¡}d S )Nr›   rœ   r•   r¢   r£   r¤   )	r›   rœ   r•   r¢   r£   r¤   r   r   r   )r   Ú	TimestampZTimestampFromTicksrž   rŸ   r¥   r   r   r   Útest_TimestampP  s   ÿz DatabaseAPI20Test.test_Timestampc                 C   s   | j  d¡}| j  d¡}d S )Ns	   Somethingó    )r   ÚBinary)r   Úbr   r   r   Útest_BinaryX  s   zDatabaseAPI20Test.test_Binaryc                 C   ó   |   t| jdƒd¡ d S )NrV   zmodule.STRING must be defined©r0   rG   r   r   r   r   r   Útest_STRING\  ó   zDatabaseAPI20Test.test_STRINGc                 C   r¯   )NÚBINARYzmodule.BINARY must be defined.r°   r   r   r   r   Útest_BINARY_  ó   ÿzDatabaseAPI20Test.test_BINARYc                 C   r¯   )NÚNUMBERzmodule.NUMBER must be defined.r°   r   r   r   r   Útest_NUMBERd  rµ   zDatabaseAPI20Test.test_NUMBERc                 C   r¯   )NZDATETIMEz module.DATETIME must be defined.r°   r   r   r   r   Útest_DATETIMEi  rµ   zDatabaseAPI20Test.test_DATETIMEc                 C   r¯   )NZROWIDzmodule.ROWID must be defined.r°   r   r   r   r   Ú
test_ROWIDn  r²   zDatabaseAPI20Test.test_ROWID);Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r"   rO   r
   r   r   r   Z	lowerfuncr   r   r   r   r   r'   r*   r1   r8   rB   rD   rE   rH   rJ   rR   rW   r\   r_   ra   rd   rf   re   ro   rq   ru   rv   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   V   sr    		
+"G1.	
\6!	r   )r½   Ú__version__Ú
__author__rž   Zunittestrc   ZTestCaser   r   r   r   r   Ú<module>   s   A