a
    äze·Œ  ã                   @   sº   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ ejdkZdZdZefdd	„Zd
d„ Zdd„ ZG dd„ dejƒZG dd„ dejƒZedkr¶e ¡  dS )é    )ÚabcN)Úsupport)Úassert_python_okÚbig)ÚbÚBÚhÚHÚiÚIÚlÚLÚqÚQÚnÚN)Ú ú@ú=ú<ú>ú!c                 c   s4   t D ]*}| D ] }|dvr"|dv r"q||fV  qqd S )N©r   r   )r   r   )Úinteger_codes)Ú
byteordersÚcodeÚ	byteorder© r   ú&/usr/lib/python3.9/test/test_struct.pyÚiter_integer_formats   s
    r   c                 C   s   | d d d… S )Néÿÿÿÿr   )Úsr   r   r   Ústring_reverse   s    r"   c                 C   s   t r| S t| ƒS d S ©N)ÚISBIGENDIANr"   )Úvaluer   r   r   Úbigendian_to_native   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ejd'd(„ ƒZd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7S )8Ú
StructTestc                 C   s    |   t dd¡d dkt¡ d S )Nz=ié   r   )ÚassertEqualÚstructÚpackr$   ©Úselfr   r   r   Útest_isbigendian"   s    zStructTest.test_isbigendianc                 C   s  |   tjtjd¡ t d¡}|  |d t d¡¡ d}d}t |¡}t |¡}|  |d |¡ |   tjtjdd¡ |   tjtjdddd¡ |   ttjftjdd¡ |   ttjftjdd¡ |   tjtjd	d
¡ t ddd¡}|   tjtjd|¡ |   tjtjd|¡ d S )NÚZr
   é   Ziiizcbxxxxxxhhhhiillffd?z3c3b18x12h6i6l6f3d3?ZfooÚPÚds   flapÚiir(   é   )ÚassertRaisesr*   ÚerrorÚcalcsizer)   r+   Ú	TypeErrorÚunpack)r-   ZszÚfmtZfmt3Zsz3r!   r   r   r   Útest_consistence%   s     


zStructTest.test_consistencec                 C   sö   d}d}d}d}d}d}d}d}dD ]Ì}	d	D ]Â}
|	|
 }
t  |
||||||||¡	}t  |
|¡\}}}}}}}}|  ||¡ |  ||¡ |  ||¡ |  ||¡ |  ||¡ |  td
| ƒtd
| ƒ¡ |  td
| ƒtd
| ƒ¡ |  ||¡ q,q$d S )Nó   ar(   éÿ   iÿÿ  i   goƒÀÊ!	@T)r   r   r   r   r   r   )z	xcbhilfd?z	xcBHILfd?éd   )r*   r+   r9   r)   Úint)r-   Úcr   r   r
   r   Úfr2   ÚtÚprefixÚformatr!   ZcpZbpZhpZipZlpÚfpZdpÚtpr   r   r   Útest_transitiveness:   s*    zStructTest.test_transitivenessc              &   C   sú   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"g d#d#d$fd%g#}|D ]œ\}}}}}d&| |fd'| |fd(| |fd)| t r’|p”|ffD ]X\}}t ||¡}	|  |	|¡ |  t |¡t|	ƒ¡ t ||	¡d* }
|
|krš|  |¡ qšqXd S )+N)r@   r<   r<   r<   r   )Zxcr<   ó    arH   r   )Zcxr<   ó   a rI   r   )r!   r<   r<   r<   r   )Ú0só
   helloworldó    rL   r(   )Z1srK   ó   hrM   r(   )Z9srK   ó	   helloworlrN   r(   )Z10srK   rK   rK   r   )Z11srK   ó   helloworld rO   r(   )Z20srK   ó   helloworld          rP   r(   )r   é   ó   rR   r   )r   iùÿÿÿó   ùrS   r   )r   rQ   rR   rR   r   )r   éù   rS   rS   r   )r   é¼  ó   ¼ó   ¼r   )r   iDýÿÿó   ýDó   Dýr   )r	   rU   rV   rW   r   )r	   iDý  rX   rY   r   )r
   é€,ó   ,€ó   €,r   )r
   é€âÓûó   ûÓâ€ó   €âÓûr   )r   rZ   r[   r\   r   )r   ì   €b§w r^   r_   r   )r   rZ   r[   r\   r   )r   r]   r^   r_   r   )r   rZ   r[   r\   r   )r   r`   r^   r_   r   )rA   ç       @s   @   s      @r   )r2   ra   s   @       s          @r   )rA   ç       Às   À   s      Àr   )r2   rb   s   À       s          Àr   )ú?r   ó    rd   r   )rc   r0   ó   re   r(   )rc   Tre   re   r   rc   rd   r(   )rc   )r(   re   re   r(   r   r   r   r   r   )r$   r*   r+   r)   r7   Úlenr9   Ú
assertTrue)r-   Ztestsr:   Úargr   ZlilZasyZxfmtÚexpÚresZrevr   r   r   Útest_new_featuresR   s\    Û(ÿzStructTest.test_new_featuresc           
      C   sZ  dddddddddddœ
}t dƒD ]*\}}|| }t |¡}|  ||| ¡ q"d}|D ]>}dD ]4}t ||d	  ¡}t ||d  ¡}	|  ||	¡ q^qV|  t d
¡d¡ |  dt d¡¡ |  dt d¡¡ |  t d¡t d¡¡ |  t d¡t d¡¡ |  dt d¡¡ |  t d¡t d¡¡ |  t d¡t d¡¡ |  t d¡t d¡¡ d S )Nr(   r4   é   é   )
r   r   r   r	   r
   r   r   r   r   r   ©r   r   r   r   )ZbBZhHZiIZlLÚnNZqQr   r   r   r   r   r
   r   r   r1   )r   r*   r7   r)   ZassertLessEqualÚassertGreaterEqual)
r-   Zexpected_sizer   r   rD   ÚsizeZnative_pairsZformat_pairZsigned_sizeZunsigned_sizer   r   r   Útest_calcsize‡   s2    û	
zStructTest.test_calcsizec                    sN   dd l ‰G ‡ ‡‡fdd„dtjƒ‰ tƒ D ] \}}|| ‰ˆ ˆƒ}| ¡  q(d S )Nr   c                       s@   e Zd Z‡‡ fdd„Zejej”jfdd„Z‡fdd„Z	‡  Z
S )z+StructTest.test_integers.<locals>.IntTesterc                    sÚ   t ˆ | ƒjdd || _|d | _|d d… | _| jtvrHtd| j ƒ‚t |¡| _	| j	d | _
| jtdƒv rœd| _d| j
d	   | _d| j
d	  d	 | _n:| jtd
ƒv rÈd| _d| _d| j
 d	 | _ntd| j ƒ‚d S )NÚtest_one)Z
methodNamer    z"unrecognized packing byteorder: %srm   ZbhilqnTr4   r(   ZBHILQNFr   zunrecognized format code: %s)ÚsuperÚ__init__rD   r   r   r   Ú
ValueErrorr*   r7   ÚbytesizeÚbitsizeÚtupleÚsignedÚ	min_valueÚ	max_value)r-   rD   )Ú	IntTesterÚ	__class__r   r   ru   ®   s*    

ÿÿz4StructTest.test_integers.<locals>.IntTester.__init__c           	      S   s.  | j }| j|  kr | jkrn nî|}| jrD|dk rD|d| j> 7 }|  |d¡ d| }t|ƒd@ rld| }| d¡}||ƒ}d| jt|ƒ  | }| j	dks¬| j	dv r´t
s´t|ƒ}|  t|ƒ| j¡ |||ƒ}|  ||¡ |||ƒd }|  ||¡ |  tjtf||d	| ¡ n|  tttjf|||¡ d S )
Nr   r(   z%xÚ0Úasciird   r   )r   r   r   re   )rD   r{   r|   rz   rx   rp   rf   Úencoderw   r   r$   r"   r)   r5   r*   r6   r8   ÚOverflowErrorrv   )	r-   Úxr+   r9   Ú	unhexlifyrD   ÚexpectedÚgotZ	retrievedr   r   r   rs   Ä   s>    
ÿ
ÿÿ
ÿÿz4StructTest.test_integers.<locals>.IntTester.test_onec                    s  ddl m} g }t| jd ƒD ]}| d|> ¡ qt| jƒD ]2}d}t| jƒD ]}|d> |dƒB }qN| |¡ q<| ddtjd	 g¡ |D ]0}| |fD ] }d
D ]}|| }	|  	|	¡ q q˜qŠG dd„ dƒ}
G dd„ dt
ƒ}G dd„ dt
ƒ}|  ttjftj| jd¡ |  ttjftj| j|¡ |  ttjftj| jd¡ |  ttjftj| j|
ƒ ¡ |  ttjftj| j|ƒ ¡ |dƒ|dƒ|dƒ|dƒ|dƒ|dƒfD ].}zt ˆ |¡ W n   |  d¡ Y n0 q˜|dƒ|dƒ|d ƒ|ddiƒ|g d¢ƒfD ] }|  ttjftj| j|¡ qòd S )Nr   )Ú	randranger0   r(   rm   é   i,  i`®
 rl   )r    r   r(   c                   @   s   e Zd Zdd„ ZdS )zAStructTest.test_integers.<locals>.IntTester.run.<locals>.NotAnIntc                 S   s   dS ©Né*   r   r,   r   r   r   Ú__int__  s    zIStructTest.test_integers.<locals>.IntTester.run.<locals>.NotAnInt.__int__N)Ú__name__Ú
__module__Ú__qualname__r‹   r   r   r   r   ÚNotAnInt  s   r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )zBStructTest.test_integers.<locals>.IntTester.run.<locals>.Indexablec                 S   s
   || _ d S r#   ©Ú_value)r-   r%   r   r   r   ru     s    zKStructTest.test_integers.<locals>.IntTester.run.<locals>.Indexable.__init__c                 S   s   | j S r#   r   r,   r   r   r   Ú	__index__  s    zLStructTest.test_integers.<locals>.IntTester.run.<locals>.Indexable.__index__N)rŒ   r   rŽ   ru   r’   r   r   r   r   Ú	Indexable  s   r“   c                   @   s   e Zd Zdd„ Zdd„ ZdS )zAStructTest.test_integers.<locals>.IntTester.run.<locals>.BadIndexc                 S   s   t ‚d S r#   )r8   r,   r   r   r   r’     s    zKStructTest.test_integers.<locals>.IntTester.run.<locals>.BadIndex.__index__c                 S   s   dS r‰   r   r,   r   r   r   r‹     s    zIStructTest.test_integers.<locals>.IntTester.run.<locals>.BadIndex.__int__N)rŒ   r   rŽ   r’   r‹   r   r   r   r   ÚBadIndex  s   r”   za stringy      @      E@é
   é   rŠ   r>   é   z:integer code pack failed on object with '__index__' methodr<   r   Úa)r(   r4   r0   )Úrandomr‡   Úrangerx   Úappendrw   ÚextendÚsysÚmaxsizers   Úobjectr5   r8   r*   r6   r+   rD   Úfail)r-   r‡   Úvaluesri   r
   ÚvalÚjÚbaseZincrrƒ   r   r“   r”   Úobj)rD   r   r   Úrunê   sh    	þþþþþÿÿþz/StructTest.test_integers.<locals>.IntTester.run)rŒ   r   rŽ   ru   r*   r+   r9   r„   rs   r¦   Ú__classcell__r   ©r}   ÚbinasciirD   )r~   r   r}   ­   s   þ
&r}   )r©   ÚunittestÚTestCaser   r¦   )r-   r   r   rB   r   r¨   r   Útest_integers©   s     zStructTest.test_integersc                    sT   ‡ fdd„}dD ]>}dD ]4}|| }|t j|ƒ |t j|dƒ |t j|dƒ qqd S )Nc                    sP   ˆ   tj¡}| |i |¤Ž W d   ƒ n1 s00    Y  ˆ  dt|jƒ¡ d S )Nzbad char in struct format)r5   r*   r6   ÚassertInÚstrÚ	exception)ÚfuncÚargsÚkwargsÚcmr,   r   r   ÚassertStructErrorE  s    ,z2StructTest.test_nN_code.<locals>.assertStructErrorro   rn   r   rL   )r*   r7   r+   r9   )r-   r´   r   r   rD   r   r,   r   Útest_nN_codeC  s    zStructTest.test_nN_codec                 C   sH   dD ]>\}}}}t  ||¡}|  ||¡ t  ||¡\}|  ||¡ qd S )N))Úpó   abcrd   rL   )Z1pr·   rd   rL   )Z2pr·   s   ar<   )Z3pr·   s   abs   ab)Z4pr·   s   abcr·   )Z5pr·   s   abc r·   )Z6pr·   s   abc  r·   )Z1000psè  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsè  ÿxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsÿ   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)r*   r+   r)   r9   )r-   r   Úinputr…   Zexpectedbackr†   r   r   r   Útest_p_codeP  s
    	zStructTest.test_p_codec                 C   sô   t ddƒD ]Š}d}||d  |kr,|d }q|| }t d|¡}t d|¡d }|  ||¡ t d|¡}|  |t|ƒ¡ t d|¡d }|  ||¡ q
d}t |d	¡}t d|¡}t d|¡d }|  ||¡ d
}t |d¡}|  t	tjd|¡ d S )Nr(   é!   g      à?ra   z<fr   z>fiÿÿÿ éh   iÿÿÿég   )
rš   r*   r+   r9   r)   r"   ÚmathÚldexpr5   r‚   )r-   r¤   ZdeltaZsmallerÚpackedZunpackedZ	bigpackedr   r   r   r   Útest_705836`  s(    
zStructTest.test_705836c                 C   sl   t ƒ D ]8\}}|| }|  tjtj|d¡ |  tjtj|d¡ q|  tjtjdd¡ |  tjtjdd¡ d S )Nç      ð?g      ø?r1   )r   r5   r*   r6   r+   )r-   r   r   rD   r   r   r   Útest_1530559  s    zStructTest.test_1530559c              	   C   s’  d}d}t  |¡}ttfD ]¢}||ƒ}|  | |¡d¡ |  | |d¡d¡ |  | |d¡d¡ tdƒD ]&}|  | ||¡|||d … f¡ qhtdt|ƒd	 ƒD ]}|  t j	|j||¡ q¢qttfD ]°}||ƒ}|  t  ||¡d¡ |  t  ||d¡d¡ |  t  ||d¡d¡ tdƒD ]*}|  t  |||¡|||d … f¡ qtdt|ƒd	 ƒD ]}|  t j	t j|||¡ qXqÆ|  |j|dd
d¡ d S )Ns	   abcd01234Z4s)s   abcdr4   )s   cd01rl   )s   0123é   r(   )ÚbufferÚoffset)
r*   ÚStructÚbytesÚ	bytearrayr)   Úunpack_fromrš   rf   r5   r6   )r-   Útest_stringr:   r!   ÚclsÚdatar
   r   r   r   Útest_unpack_from‰  s0    
$(ÿzStructTest.test_unpack_fromc                 C   sì   d}t   dd¡}d}t |¡}| |d|¡ | ¡ d t|ƒ… }|  ||¡ | |d|¡ | ¡ d t|ƒd … }|  ||d d… | ¡ t   dd¡}|  ttj	f|j|d|¡ |  ttj	f|j|d|¡ |}|  t
tj	ftjd	|d ¡ d S )
Nó   Reykjavik rocks, eow!r   ód                                                                                                       Ú21sr   r•   ó
             r4   rL   )Úarrayr*   rÆ   Ú	pack_intoÚtobytesrf   r)   r5   rv   r6   r8   )r-   rÊ   Úwritable_bufr:   r!   Úfrom_bufÚ	small_bufZsbr   r   r   Útest_pack_into¤  s*    
ÿÿÿzStructTest.test_pack_intoc                    sÈ   d}t   dd¡}d‰ ‡ fdd„}||d|ƒ | ¡ d t|ƒ… }|  ||¡ ||d|ƒ | ¡ d t|ƒd … }|  ||d d… | ¡ t   dd	¡}|  ttjf||d|¡ |  ttjf||d
|¡ d S )NrÎ   r   rÏ   rÐ   c                     s   t jˆ g| ¢R Ž S r#   )r*   rÓ   )r±   ©r:   r   r   Ú<lambda>Ä  rL   z.StructTest.test_pack_into_fn.<locals>.<lambda>r   r•   rÑ   r4   )rÒ   rÔ   rf   r)   r5   rv   r*   r6   )r-   rÊ   rÕ   rÓ   rÖ   r×   r   rÙ   r   Útest_pack_into_fnÀ  s"    ÿÿzStructTest.test_pack_into_fnc                 C   s@   t   dd¡}tdƒ}||fD ]}t d|¡\}|  |d¡ qd S )Nr   s   4Vxz>IixV4)rÒ   Ú
memoryviewr*   r9   r)   )r-   Zdata1Zdata2rÌ   r%   r   r   r   Útest_unpack_with_buffer×  s
    z"StructTest.test_unpack_with_bufferc              	   C   sž  G dd„ dt ƒ}tdƒd D ]X}dg g ddf}dgd	d
dddf}|dt|ƒ  }tj|g|¢R Ž }t ||¡}|dt|ƒ  }tj|g|¢R Ž }	t ||	¡}
|  t|ƒt|
ƒ¡ |  t|ƒt|ƒ¡ |D ]}|  |¡ qÊ|
D ]}|  |¡ qÞt |d d¡}|  t|ƒt 	|d ¡¡ t|ƒdkr8| j|d| d zt |d |ƒ ¡ W n t
yb   Y q0 |  d|d  ¡ qdD ]}|  t d|¡d ¡ q|d S )Nc                   @   s   e Zd Zdd„ ZdS )z+StructTest.test_bool.<locals>.ExplodingBoolc                 S   s   t ‚d S r#   )ÚOSErrorr,   r   r   r   Ú__bool__á  s    z4StructTest.test_bool.<locals>.ExplodingBool.__bool__N)rŒ   r   rŽ   rß   r   r   r   r   ÚExplodingBoolà  s   rà   z<>!=)r   r   r   r   r(   Útesté   r    l        g  àÿÿÿßArc   z encoded bool is not one byte: %r)Úmsgz2Expected OSError: struct.pack(%r, ExplodingBool()))re   ó   ó   ÿó   ó   ðz>?)rŸ   ry   rf   r*   r+   r9   r)   ZassertFalserg   r7   rÞ   r    )r-   rà   rC   ZfalseÚtrueZfalseFormatZpackedFalseZunpackedFalseZ
trueFormatZ
packedTrueZunpackedTruerB   r¿   r@   r   r   r   Ú	test_boolß  s>    ÿÿzStructTest.test_boolc                 C   sP   d  tjd ¡}|  tjtj|¡ d  tjd tjd ¡}|  tjtj|¡ d S )Nz{}br(   z{}b{}Hr4   )rD   r   rž   r5   r*   r6   r7   )r-   Z	hugecountZ
hugecount2r   r   r   Útest_count_overflow
  s    zStructTest.test_count_overflowc                 C   s  t   dd¡}|  tjtjd¡ |  tjtjdd¡ |  tjtjd|d¡ |  tjtjd|d¡ |  tjtjdd¡ |  tjtjdd¡ |  tjtjd|dd¡ |  tjtjd|d¡ |  tjtjd	d
¡ |  tjtjd	d¡ |  tjtjd	|dd
¡ |  tjtjd	|d¡ d S )Nr   rÏ   Z12345rL   r   Zc12345rƒ   ó   xZ14s42zspam and eggss   spam and eggs)rÒ   r5   r*   r6   r+   r9   rÓ   rÉ   )r-   Ústorer   r   r   Útest_trailing_counter  s*    ÿÿÿÿz StructTest.test_trailing_counterc                 C   s   t  d¡}| d¡ d S )Nr
   r3   )r*   rÆ   ru   ©r-   r!   r   r   r   Útest_Struct_reinitialization*  s    
z'StructTest.test_Struct_reinitializationc                 C   s8   t  d¡}|t d¡|d  7 }t  | t |¡|¡ d S )NZ2n3PZP3n0Pr(   )r   Zcalcobjsizer*   r7   Úcheck_sizeofrÆ   )r-   Z
format_strZnumber_of_codesZ	totalsizer   r   r   rð   1  s    
zStructTest.check_sizeofc                 C   s†   t D ]}|  |d¡ q|  dd¡ |  dd¡ |  dd¡ |  dd	¡ |  d
d¡ |  dd¡ |  dd¡ |  dd¡ |  dd	¡ d S )Nr(   Z	BHILfdspPé	   AÒ  BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBiÒ  Úfdr4   Zxxxxxxxxxxxxxxr   Z100HZ187sZ20prJ   Z0c)r   rð   )r-   r   r   r   r   Útest__sizeof__8  s    zStructTest.test__sizeof__c                 C   sŽ   d}|   tj|¡$ t dtdƒdd¡ W d   ƒ n1 s<0    Y  d}|   tj|¡" t dtdƒd¡ W d   ƒ n1 s€0    Y  d S )Nzkpack_into requires a buffer of at least 6 bytes for packing 1 bytes at offset 5 \(actual buffer size is 1\)r   r(   râ   zounpack_from requires a buffer of at least 6 bytes for unpacking 1 bytes at offset 5 \(actual buffer size is 1\))ÚassertRaisesRegexr*   r6   rÓ   rÈ   rÉ   ©r-   Zregex1Zregex2r   r   r   Útest_boundary_error_messageF  s    ÿ2ÿz&StructTest.test_boundary_error_messagec                 C   s   t dƒ}|  tjd¡  t d|dd¡ W d   ƒ n1 s<0    Y  |  tjd¡  t d|dd¡ W d   ƒ n1 sz0    Y  |  tjd	¡ t d|d¡ W d   ƒ n1 s¶0    Y  |  tjd¡ t d|d¡ W d   ƒ n1 sò0    Y  d S )
Nr•   z%no space to pack 4 bytes at offset -2ú<Iéþÿÿÿé{   z*offset -11 out of range for 10-byte bufferz<Biõÿÿÿz.not enough data to unpack 4 bytes at offset -2)rÈ   rô   r*   r6   rÓ   rÉ   )r-   Z	byte_listr   r   r   Ú0test_boundary_error_message_with_negative_offsetW  s*    þ.þ.þ,þz;StructTest.test_boundary_error_message_with_negative_offsetc                 C   sÒ   dt tjd ƒ d t tjƒ d }|  tj|¡& t dtdƒtjd¡ W d   ƒ n1 s^0    Y  dt tjd ƒ d	 t tjƒ d }|  tj|¡$ t dtdƒtj¡ W d   ƒ n1 sÄ0    Y  d S )
Nz(pack_into requires a buffer of at least rl   z% bytes for packing 4 bytes at offset z \(actual buffer size is 10\)r÷   r•   r(   z*unpack_from requires a buffer of at least z' bytes for unpacking 4 bytes at offset )	r®   r   rž   rô   r*   r6   rÓ   rÈ   rÉ   rõ   r   r   r   Ú-test_boundary_error_message_with_large_offsetm  s(    ÿÿþÿ4ÿÿþÿz8StructTest.test_boundary_error_message_with_large_offsetc                 C   sN   |   t¡ t dd¡ W d   ƒ n1 s,0    Y  |  t dd¡d¡ d S )Nr   r   r<   )éa   )r5   r8   r*   r9   r)   r,   r   r   r   Útest_issue29802  s    *zStructTest.test_issue29802c                 C   s<   t  d¡}|  |jd¡ t  |j ¡ ¡}|  |j|j¡ d S )Nz=i2H)r*   rÆ   r)   rD   r   )r-   r!   Ús2r   r   r   Útest_format_attrˆ  s    
zStructTest.test_format_attrc                 C   sL   d}t d|ƒ\}}}|  |d¡ |  | ¡ d¡ |  d|¡ |  d|¡ d S )Nzùif 1:
            import struct

            class C:
                def __init__(self):
                    self.pack = struct.pack
                def __del__(self):
                    self.pack('I', -42)

            struct.x = C()
            z-cr   rL   s   Exception ignored in:s	   C.__del__)r   r)   Úrstripr­   )r-   r   ÚrcÚstdoutÚstderrr   r   r   Ú)test_struct_cleans_up_at_runtime_shutdown  s    z4StructTest.test_struct_cleans_up_at_runtime_shutdownc              	   C   sF   dD ]<}|   tjd¡ t |¡ W d   ƒ q1 s60    Y  qd S )N)ú z2 ird   zembedded null character)rô   r*   r6   r7   rî   r   r   r   Útest_issue35714¢  s
    ÿzStructTest.test_issue35714N) rŒ   r   rŽ   r.   r;   rG   rk   rr   r¬   rµ   r¹   rÀ   rÂ   rÍ   rØ   rÛ   rÝ   ré   rê   rí   rï   rð   r   Zcpython_onlyró   rö   rú   rû   rý   rÿ   r  r  r   r   r   r   r'   !   s:   5" !+
	r'   c                   @   sH   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S )ÚUnpackIteratorTestzD
    Tests for iterative unpacking (struct.Struct.iter_unpack).
    c                    s"  ‡ fdd„}t  d¡}| d¡}||ƒ | d¡}||ƒ ˆ  t j¡ | d¡ W d   ƒ n1 sf0    Y  ˆ  t j¡ | d¡ W d   ƒ n1 sœ0    Y  t  d¡}ˆ  t j¡ | d¡ W d   ƒ n1 sÜ0    Y  ˆ  t j¡ | d	¡ W d   ƒ n1 s0    Y  d S )
Nc                    s    ˆ   | tj¡ ˆ   | tj¡ d S r#   )ZassertIsInstancer   ÚIteratorÚIterable)Úitr,   r   r   Ú_check_iterator°  s    z:UnpackIteratorTest.test_construct.<locals>._check_iteratorú>ibcprL   s   1234567s   123456s   12345678r   s   12)r*   rÆ   Úiter_unpackr5   r6   )r-   r  r!   r
  r   r,   r   Útest_construct¯  s    


((
(z!UnpackIteratorTest.test_constructc                 C   s$   t t d¡ d¡ƒ}|  t|¡ d S )Nr  rL   )Útyper*   rÆ   r  r5   r8   )r-   Ziter_unpack_typer   r   r   Útest_uninstantiableÄ  s    z&UnpackIteratorTest.test_uninstantiablec                 C   sr   t  d¡}ttddƒƒ}| |¡}|  t|ƒd¡ |  t|ƒd¡ |  t|ƒd¡ |  tt|¡ |  tt|¡ d S )Nú>IBr(   é   ©irâ   ©i	r•   )ié   )	r*   rÆ   rÇ   rš   r  r)   Únextr5   ÚStopIteration©r-   r!   r   r
  r   r   r   Útest_iterateÈ  s    

zUnpackIteratorTest.test_iteratec                 C   sf   t  d¡}ttddƒƒ}| t|ƒ¡}|  t|ƒd¡ |  t|ƒd¡ |  t	t|¡ |  t	t|¡ d S ©Nr  r(   é   r  r  )
r*   rÆ   rÇ   rš   r  rÜ   r)   r  r5   r  r  r   r   r   Útest_arbitrary_bufferÒ  s    
z(UnpackIteratorTest.test_arbitrary_bufferc                 C   s¢   t j}t d¡}ttddƒƒ}| |¡}|  ||ƒd¡ t|ƒ |  ||ƒd¡ t|ƒ |  ||ƒd¡ t|ƒ |  ||ƒd¡ |  	t
t|¡ |  ||ƒd¡ d S )Nr  r(   r  r0   r4   r   )ÚoperatorÚlength_hintr*   rÆ   rÇ   rš   r  r)   r  r5   r  )r-   Zlhr!   r   r
  r   r   r   Útest_length_hintÛ  s    

z#UnpackIteratorTest.test_length_hintc                 C   sV   t  dttddƒƒ¡}|  t|ƒd¡ |  t|ƒd¡ |  tt|¡ |  tt|¡ d S r  )r*   r  rÇ   rš   r)   r  r5   r  )r-   r
  r   r   r   Útest_module_funcê  s
    z#UnpackIteratorTest.test_module_funcc                 C   s(  ddddddddt d	ƒfd
t dƒfdg
}|D ]Ò\}}|d d d… }|  |t d|¡d ¡ |  |t d|¡¡ |  |t d|¡d ¡ |  |t d|¡¡ tjdkrÒ|  |t d|¡d ¡ |  |t d|¡¡ q,|  |t d|¡d ¡ |  |t d|¡¡ q,g d¢}|D ]L\}}|  t 	t d|¡d ¡¡ |  t 	t d|d d d… ¡d ¡¡ qt dtj
¡}|  |d d@ d¡ t dtj
 ¡}|  |d d@ d¡ g d¢}	|	D ] \}}}|  |t ||¡¡ q¬g d¢}
|
D ]\}}|  ttj||¡ qÚdg}|D ] \}}}|  |t ||¡¡ qd S )N)s    <rÁ   )s    Àrb   )s   ÿ{g     üï@)s    ç      ?)s    g      p>)ó     g        )s    €g       €s    |z+infs    üz-inf)s   U5g     TÕ?r    ú<er   ú>eÚlittleÚe))r#  s   ü)r#  s    þ)r#  s   ÿÿ)r#  s   |)r#  s    ~)r#  s   ÿr(   é~   ))r$  s    g     `>)r$  r"  g      `>)r$  r"  g      P>)r$  ó   ÿg     ø?)r$  r(  güÿÿÿÿû?)r$  ó    g     ü?)r$  r)  r!  )r$  s   <g    ð?)r$  ó   < g     ð?)r$  r*  g     ð?)r$  ó   {ÿiàÿ  )r$  r+  iïÿ  )r$  s   €g     `¾)r$  ó   € g      `¾)r$  r,  g      P¾)r$  s   ¼g    ð¿)r$  ó   ¼ g     ð¿)r$  r-  g     ð¿)r$  s   ûÿi ÿÿ))r$  ç     þï@)r$  ç      ð@)r$  çœu ˆ<ä7~)r$  ç     þïÀ)r$  ç      ðÀ)r$  çœu ˆ<ä7þ)r#  r.  )r#  r/  )r#  r0  )r#  r1  )r#  r2  )r#  r3  )r$  s   gÿg  ÿÿÿýŸ@)Úfloatr)   r*   r9   r+   r   r   rg   r½   ÚisnanÚnanr5   r‚   )r-   Z&format_bits_float__cleanRoundtrip_listZle_bitsrA   Zbe_bitsZformat_bits__nan_listZ
formatcodeÚbitsr¿   Z format_bits_float__rounding_listZ%format_bits_float__roundingError_listZ+format_bits_float__doubleRoundingError_listr   r   r   Útest_half_floatò  sP    

ö
	*ÿz"UnpackIteratorTest.test_half_floatN)rŒ   r   rŽ   Ú__doc__r  r  r  r  r  r   r8  r   r   r   r   r  ª  s   
	r  Ú__main__)Úcollectionsr   rÒ   r½   r  rª   r*   r   rá   r   Ztest.support.script_helperr   r   r$   r   r   r   r"   r&   r«   r'   r  rŒ   Úmainr   r   r   r   Ú<module>   s0   
      2