
    #iZ                       d 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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 ddlmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZmZmZm Z m!Z! dd	l"m#Z#m$Z$m%Z%m&Z&m'Z' dd
l(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZL ddl(mMZMmNZN  G d dej                        ZP G d dej                        ZQ G d dej                        ZRej                  dd dk\  ZT e$eT       G d dej                               ZU e$eT        G d dej                               ZV G d dej                        ZW G d dej                        ZX G d dej                  e#      ZY G d dej                  e#      ZZ G d  d!ej                  e#      Z[ G d" d#ej                  e#      Z\ G d$ d%ej                  e#      Z] G d& d'ej                        Z^ e$e%       G d( d)ej                               Z_ G d* d+ej                        Z` G d, d-ej                        Za G d. d/ea      Zb G d0 d1ea      Zc G d2 d3ej                  e#      Zdd4 Ze G d5 d6ej                  e#      Zf G d7 d8ej                  e#      Zg G d9 d:ej                  e#      Zh G d; d<ej                  e#      Zi G d= d>ej                  e#      Zj G d? d@ej                  e#      Zk G dA dBej                  e#      Zl G dC dDej                  e#      Zm G dE dFej                        Zn G dG dHej                        Zo G dI dJej                  e#      ZpeqdKk(  r ej                          yy)Lz 
Tests for bitarray.util module
    N)StringIO)reduce)choicechoicesgetrandbits	randrangerandintrandomsampleseed)	hexdigits
whitespace)Counter)bitarrayfrozenbitarray
decodetree
bits2bytesget_default_endian)UtilskipIfis_pypy	urandom_2PTRSIZE)$zerosonesurandomrandom_krandom_ppprintstripcount_nparity
gen_primessum_indicesxor_indices	count_andcount_or	count_xorany_andsubsetcorrespond_allbyteswap	intervals	serializedeserializeba2hexhex2baba2basebase2baba2intint2ba	sc_encode	sc_decode	vl_encode	vl_decode_huffman_treehuffman_codecanonical_huffmancanonical_decode)_Random_ssqic                       e Zd Zd Zd Zy)ZerosOnesTestsc                 `   t        d      D ]  }t        t        d      t        dd       t        dd       t        d      t        dd       t        dd       g      }| j	                  |t                      | j	                  |j                  t                      | j	                  t        |      t
               t        g d      }t        d      }t        t        ||      t        ||      g      }| j	                  |j                         |dz         | j	                  |j                  |xs
 t                      t        t        ||      t        ||      g      }| j	                  |j                         |dz         | j	                  |j                  |xs
 t                       y )N2   r   endianlittlebigNd   01)ranger   r   r   assertEqualr   rE   r   typer   to01)self_arE   nbs         C/var/www/br/venv/lib/python3.12/site-packages/bitarray/test_util.py
test_basiczZerosOnesTests.test_basic/   sP   r 	GAa%4.%$2GQaQt0DF GAQ
+QXX'9';<T!Wh/34F#Aa(%&*ABCAQVVXq3w/QXXv'E1C1EFQa)?@AAQVVXq3w/QXXv'E1C1EF!	G    c                    t         t        fD ]  }| j                  t        |       | j                  t        |d       | j                  t        |t	                      | j                  t        |g        | j                  t        |d       | j                  t
        |d       ddi g ddfD ]  }| j                  t        |d|        | j                  t
        |dd        y )	N       ?r      FTfoo)r   r   assertRaises	TypeErrorr   
ValueError)rP   fxs      rU   test_errorszZerosOnesTests.test_errorsB   s     	7Ai+iB/iHJ7iB/iC0j!R0 2r5$. 6!!)Q156 j!Q6	7rW   N)__name__
__module____qualname__rV   rc    rW   rU   rA   rA   -   s    G&7rW   rA   c                       e Zd Zd Zd Zd Zy)URandomTestsc                    t        d      D ]  }t        t        d      t        dd       g      }| j                  |t	                      | j                  |j
                  t                      t        g d      }t        d      }t        t        ||      t        ||      g      }| j                  t        |      |       | j                  |j
                  |xs
 t                      | j                  t        |      t                y )N   r   rD   rF   rI   )
rL   r   r   rM   r   rE   r   r   lenrN   )rP   rQ   rR   rE   rS   s        rU   rV   zURandomTests.test_basicU   s    r 	0A
GAd$;<=AQ
+QXX'9';<34F#A6*GAf,EFGASVQ'QXXv'E1C1EFT!Wh/	0rW   c                    t         }| j                  t        |       | j                  t        |d       | j                  t        |t                      | j                  t        |g        | j                  t        |d       | j                  t        |d       | j                  t        |dd       | j                  t        |dd       y )NrY   rZ   r[   r   r\   r]   )r   r^   r_   r   r`   )rP   Us     rU   rc   zURandomTests.test_errorsc   s    )Q')Q+)Q
3)Q+)Q,*a,)Q1-*aE2rW   c                 v    t        d      }| j                  t        |j                         dz
        dk         y Ni i@KL i=  )r   
assertTrueabscountrP   rR   s     rU   
test_countzURandomTests.test_countn   s-    JAGGI	12f<=rW   N)rd   re   rf   rV   rc   ru   rg   rW   rU   ri   ri   S   s    0	3>rW   ri   c                   x    e Zd Zd Zd Zd Zd Z eej                  dd dk        d        Z
d	 Zd
 Zd Zd Zy)Random_K_Testsc                    t        d      D ]  }t        g d      }t        d      }t        d|      }t	        |||      }| j                  t        |      t               | j                  t        |      |       | j                  |j                         |       | j                  |j                  |xs
 t                       y )N   rF   x   r   )rL   r   r   r	   r   rq   rN   r   rM   rl   rs   rE   r   )rP   rQ   rE   rS   krR   s         rU   rV   zRandom_K_Tests.test_basicw   s    s 	GA34F#A1AAv&AOODGX.SVQ'QWWY*QXXv'E1C1EF	GrW   c                 |   t         }| j                  t        |       | j                  t        |d       | j                  t        |dd       | j                  t        |dd       | j                  t        |dd       | j                  t        |dd       d	D ]  }| j                  t        |d
|        | j                  t        |d
dd       | j                  t        |d
dd       t	        d      D ]H  }| j                   ||d      t        |             | j                   |||      t        |             J y )N   r\   0.5p   g      @r[   r   )r[   r   
      r]   rD   rk   r{   )r   r^   r_   r`   rL   rM   r   r   )rP   Rr{   rS   s       rU   test_inputs_and_edge_casesz)Random_K_Tests.test_inputs_and_edge_cases   s   )Q')Q*)Q51)QQ/)QC0*aQ/ 	4Aj!R3	4*aQ6*aQu=r 	1AQqAYa1QqAYQ0	1rW   c                    t        d      D ]\  }t        |dz         D ]I  }t        ||      }| j                  t        |      |       | j                  |j	                         |       K ^ t        d      D ]`  }t        d      }t        d|      }t        ||      }| j                  t        |      |       | j                  |j	                         |       b y )Nr   r\   rI   '  r   )rL   r   rM   rl   rs   r   r	   )rP   rS   r{   rR   rQ   s        rU   ru   zRandom_K_Tests.test_count   s    r 	/A1q5\ /QN  Q+  A./	/ s 	+A&!A1AAASVQ'QWWY*	+rW   c                     d}t        |      }t        d      D ]Q  }t        dd      }t        ||      }| j	                  |j                         |       ||z  }|j                         sQ y  | j                          y )N        (   )r   rL   r	   r   rM   rs   allfail)rP   rS   cumrQ   r{   rR   s         rU   test_active_bitszRandom_K_Tests.test_active_bits   so    Aht 	ABAAAQWWY*1HCwwy	 IIKrW   N   )      c           
      N   d}d}t        |dz         D ]{  }t        j                  ||      }t               }t        d      D ];  }|j	                  t        t        ||                   t        |      |k(  s6||z  } k | j                          } | j                  |d|z         y )Nr   r   r\   r   r   )
rL   mathcombsetaddr   r   rl   r   rM   )rP   rS   totalr{   expectedcombsrQ   s          rU   test_combinationsz Random_K_Tests.test_combinations   s     q1u 		AyyAHEE6] 		.!Q89u:)X%E	 				 	Q'rW   c                     g }|j                  t        dd             dD ]  }|j                  t        d|              |S )N,  r   )rI     i	  i    )appendr   )rP   resr{   s      rU   collect_code_branchesz$Random_K_Tests.collect_code_branches   sA    

8C$%' 	+AJJxq)*	+
rW   c                 6   g }dD ],  }t        |       |j                  | j                                . | j                  |d   |d          | j                  |d   |d          t	        |d   |d         D ]  \  }}| j                  ||        t                y )N)	 	 r   r   r   r   r\   r   r   r   r   rM   zipassertNotEqualrP   rR   valitem0item1s        rU   	test_seedzRandom_K_Tests.test_seed        1 	3CIHHT//12	3 	1qt$1qt$!adO 	.LE5u-	. 	rW   c                    t               }|j                  }|j                  }|j                  }| j	                  t
        |d       | j                   |d      t        |dz
               | j                   ||dz        t                      | j                   ||dz
        t        |dz
               | j	                  t
        ||       dD ]9  \  }} |t        ||z              }| j                  |j                         |       ; t        d|      D ]c  } ||      }| j                  dt              cxk  xr |k  nc        d}	|D ]  }
|
r|	dd|	z
  z  z  }	|	dz  }	 | j                  |	||z         e y )Nr   r\   r   ))g      ?0100)      ?rJ   )      ?10)      ?rY   )g      ?01)g      ?101)g      ?rK   r   rZ   )r>   op_seqKMr^   r`   rM   r   r   r   intrO   rL   rq   rl   )rP   rGr   r   r   sseqiqr{   s              rU   test_op_seqzRandom_K_Tests.test_op_seq   s^   IHHCCCC 	*a+1uQU|,16HJ/1q54A;/*a+
 
	,DAq CAJ-CSXXZ+
	, q! 
	'AA$COOAQO!O,A a(AHA QA&
	'rW   c                     t        d      }g dfdgdfdgdfddgdffD ]D  \  }}|j                  |      }| j                  t        |j	                         |z
        dk         F y )	Ni@B i  r    r\   iq iظ r   )r>   combine_halfrq   rr   rs   )rP   r   r   meanrR   s        rU   test_combine_halfz Random_K_Tests.test_combine_half  sz    I!!!Q!	
 	;IC s#AOOC	D 01E9:	;rW   )rd   re   rf   rV   r   ru   r   r   sysversion_infor   r   r   r   r   rg   rW   rU   rw   rw   u   sW    	G1 + CRa 6)*( +(""$'L	;rW   rw   r   )r      c                       e Zd Zd Zy)Random_P_Not_Implementedc                 <    | j                  t        t        dd       y )NrI   r   )r^   NotImplementedErrorr   rP   s    rU   test_not_implementedz-Random_P_Not_Implemented.test_not_implemented  s    -xdCrW   N)rd   re   rf   r   rg   rW   rU   r   r     s    DrW   r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	Random_P_Testsc                 L   t        d      D ]  }t        g d      }t        d      }t        g d      }t        |||      }| j	                  t        |      t               | j                  t        |      |       | j                  |j                  |xs
 t                       y )Nry   rF   rz   )        -C6?皙?r   ?rZ   )rL   r   r   r   rq   rN   r   rM   rl   rE   r   )rP   rQ   rE   rS   r   rR   s         rU   rV   zRandom_P_Tests.test_basic  s    s 	GA34F#A89AAv&AOODGX.SVQ'QXXv'E1C1EF	GrW   c           	         t         }| j                  t        |       | j                  t        |d       | j                  t        |dd       | j                  t        |d       | j                  t        |dd       | j                  t        |dd       | j                  t        |ddd	       | j                  t        |d
dd	       | j	                   |d      t                      t        d      D ]i  }| j	                   ||d      t        |             | j	                  t         ||d            |       | j	                   ||d      t        |             k y )Nr   r\   r~   r[   g      g      ?r   g333333?r]   r   r   rD   r   rk   )
r   r^   r_   r`   rM   r   rL   r   rl   r   )rP   r   rS   s      rU   r   z)Random_P_Tests.test_inputs_and_edge_cases%  s    )Q')Q-)Q51*a,*aD1*ac2*aD%8*aS?1xz*r 	1AQq!WeAh/S1c^Q/QqAYQ0	1rW   c                 v    t        d      }| j                  t        |j                         dz
        dk         y rp   )r   rq   rr   rs   rt   s     rU   test_defaultzRandom_P_Tests.test_default5  s-    Z AGGI	12f<=rW   c           	         t        d      D ]  }t        t        dd      t        dd      g      }t        g d      }t        j                  ||z  d|z
  z        }t        ||      }| j                  t        |      |       | j                  t        |j                         ||z  z
        t        dd|z        k          y )	Nr   r}   rz   rI   r   )r   gMbP?g{Gz?皙?r   r   r   rZ   r   )rL   r   r   r   sqrtr   rM   rl   rq   rr   rs   max)rP   rQ   rS   r   sigmarR   s         rU   ru   zRandom_P_Tests.test_count:  s    s 	IA	!S)9S$+?@AAABAIIa!esQw/0EAASVQ'OOC	AE 12SBJ5GGH	IrW   c                     g }|j                  t        d             |j                  t        dd             |j                  t        dd             dD ]  }|j                  t        d|              |S )N    r   gMb`?   g?)r   r   r   g<Nё\?gffffff?   )r   r   )rP   r   r   s      rU   r   z$Random_P_Tests.collect_code_branchesC  sd    

8B< 

8E5)*

8B$%- 	)AJJxQ'(	)
rW   c                 6   g }dD ],  }t        |       |j                  | j                                . | j                  |d   |d          | j                  |d   |d          t	        |d   |d         D ]  \  }}| j                  ||        t                y )N)@ A r   r   r   r   r\   r   r   r   s        rU   r   zRandom_P_Tests.test_seedQ  r   rW   c                 x    t               }d|j                  dz   z  }| j                  |j                  |kD         y )NrZ   r\   )r>   r   rq   SMALL_P)rP   r   limits      rU   test_small_p_limitz!Random_P_Tests.test_small_p_limit`  s1     IqssQw		E)*rW   N)
rd   re   rf   rV   r   r   ru   r   r   r   rg   rW   rU   r   r     s'    G1 >
I+rW   r   c                   ,    e Zd Zg dZd Zd Zd Zd Zy)
PrimeTests)Yr   r      r   r                     %   )   +   /   5   ;   =   C   G   I   O   S   Y   a   e   g   k   m   q                                                                           i  i  i  i  i  i  i  i%  i3  i7  i9  i=  iK  iQ  i[  i]  ia  ig  io  iu  i{  i  i  i  i  i  i  i  i  i  i  i  i  i  i  c                 `   t         }| j                  t        |dd       | j                  t        |d       | j                  t        |d       | j                  t        |dd       | j                  t        |dd       | j                  t        |dd	       | j                  t        |dd	
       y )Nr   r\   z1.0r[   r   r}   rH   )r]   r]   rD   )r#   r^   r_   r`   )rP   Ps     rU   rc   zPrimeTests.test_errorst  s    )Q1-*a/*a,)Q1-)Qu5*aE2*a59rW   c           	         t        d      D ]  }t        g d      }t        d      }t        |||      }| j	                  t        |      |       | j	                  |j                  |xs
 t                      |r*dg|j                  d      D cg c]
  }d|z  dz    c}z   }n|j                  d      D cg c]  }| }}| j	                  || j                  d t        |               y c c}w c c}w )N   rF   r\   r   )
rL   r   r   r#   rM   rl   rE   r   searchprimes)rP   rS   rE   oddrR   r   lsts          rU   test_explitcitzPrimeTests.test_explitcit~  s    s 
	:A34Fa.C1fc*ASVQ'QXXv'E1C1EFc<1QUQY<<"#((1+.Qq..S$++is3x"89
	: =.s   C,6	C1c           	         d}t        |      }d|d d t        t        t        j                  |      dz               D ]  }||   s	d|||z  d |<    | j                  t        |j                  ddd            | j                         t        d      D ]  }t        |      }t        dd	g      }t        ||
      }| j                  ||d |        | j                  |j                  |       t        |dz  |d      }| j                  ||dd d          | j                  ||d|d           t        d      D ]f  }t        dd      }t        dd      }	||z  |	z   }| j                  t        |      |d |        | j                  t        |dz  d      |d|d          h | j                  t        |      |       | j                  t        |dz  d      |dd d          y )Nr   r   r   rZ   r\   i  rk   rG   rH   rD   Tr&  r   rI   r[   )r   rL   r   r   r   rM   listr$  r%  r   r   r#   rE   r	   )
rP   Ncr   rQ   rS   rE   rR   rT   rb   s
             rU   test_cmpzPrimeTests.test_cmp  s   G"1s499Q<#-./ 	"At !!a%*1*	" 	ahhq!S12DKK@r 		*A!AXu-.F1V,AQ"1&QXXv.166t4AQ!$Q$(Q!Aa%)		* r 	BA"c"AAAA	AZ]AbqE2ZQA6!Aa%A	B 	A*AF2AaddG<rW   c                    dD ]  \  }}}}t        |      }| j                  t        |      |       | j                  |j                         |       | j                  t	        |      |       | j                  t	        |d      |       t        |dz  d      }| j                  t        |      |dz         | j                  |j                         dz   |       | j                  ||dd d           y )N))r   r}   r   W   )rI      $   )r      i_) ic)r     i̇W l   i{" r   r\   r*  )r#   rM   rl   rs   r$   )rP   rS   rs   sum_p	sum_sqr_prR   rT   s          rU   ru   zPrimeTests.test_count  s    +
 	)&AueY 1ASVQ'QWWY.[^U3[A.	:16q)ASVQ!V,QWWY]E2Q!$Q$(	)rW   N)rd   re   rf   r%  rc   r(  r.  ru   rg   rW   rU   r   r   i  s    F::=<)rW   r   c                   L    e Zd Zed        Zd Zd Zd Zd Zd Z	d Z
d Zd	 Zy
)PPrintTestsc                 P    t               }t        | |       |j                         S )N)stream)r   r   getvalue)rR   ra   s     rU   get_code_stringzPPrintTests.get_code_string  s    Jqzz|rW   c                     t        | j                  |            }| j                  ||       | j                  t        |      t        |             y N)evalr=  rM   rN   rP   rR   rT   s      rU   
round_tripzPPrintTests.round_trip  s?    %%a()Aa$q'*rW   c                 ~    t        d      }| j                  | j                  |      d       | j                  |       y )N110zbitarray('110')
)r   rM   r=  rB  rt   s     rU   test_bitarrayzPPrintTests.test_bitarray  s3    UO--a02EFrW   c                 ~    t        d      }| j                  | j                  |      d       | j                  |       y )Nr   zfrozenbitarray('01')
)r   rM   r=  rB  rt   s     rU   test_frozenbitarrayzPPrintTests.test_frozenbitarray  s4    4 --a02JKrW   c                    t        d      }t        ddd      D ]  }t        dd      D ]  }t               }t        ||||       |j	                         }| j                  t        |      |       |j                  d      }|j                         d d D ]  }| j                  t        |      |        |j                  d	      D ]  }| j                  t        |      |k         !   y )
N   r      r   r\   )r;  groupwidthz
bitary(')
r[   
)r   rL   r   r   r<  rM   r@  r    splitrl   rq   )	rP   rR   rL  rS   ra   r   r   rK  lines	            rU   test_formattingzPPrintTests.test_formatting  s    SM2sB' 
	7E1b\ 	7Jq!59JJL  a!,GGM*WWYs^ 4E$$SZ34GGDM 7DOOCI$567	7
	7rW   c                 d    d dddgt               t        d      fD ]  }| j                  |        y )Nasdr\   r   rK   )r   r   rB  rt   s     rU   test_fallbackzPPrintTests.test_fallback  s3    uq!fhj.2EE 	AOOA	rW   c                      G d dt               } |       }| j                  |      }| j                  |d       t        |      }| j                  ||       | j                  t	        |      t	        |             y )Nc                       e Zd Zy)&PPrintTests.test_subclass.<locals>.FooN)rd   re   rf   rg   rW   rU   FoorV    s    rW   rW  zFoo()
)r   r=  rM   r@  rN   )rP   rW  rR   coderT   s        rU   test_subclasszPPrintTests.test_subclass  sh    	( 	 E##A&y)JAa$q'*rW   c                 X    t        d      D ]  }| j                  t        |              y )Nr   )rL   rB  r   rP   rS   s     rU   test_randomzPPrintTests.test_random  s%    s 	(AOOGAJ'	(rW   c                    t        j                         }t        j                  j	                  |d      }t        d      }	 t        |d      5 }t        ||       d d d        t        |d      5 }t        |j                               }d d d        | j                  |       t        j                  |       y # 1 sw Y   _xY w# 1 sw Y   =xY w# t        j                  |       w xY w)Ntestfiler   wr   )tempfilemkdtempospathjoinr   openr   r@  readrM   shutilrmtree)rP   tmpdirtmpfilerR   fofirT   s          rU   	test_filezPPrintTests.test_file  s    !!#'',,vz2dO	"gs# rq"gs# $rO$Q"MM&! $ $ MM&!s<   C B8C .CC 8C=C C	C C'N)rd   re   rf   staticmethodr=  rB  rE  rG  rP  rS  rY  r\  rm  rg   rW   rU   r9  r9    s<     
+


7	+("rW   r9  c                   $    e Zd Zd Zd Zd Zd Zy)
StripTestsc                 ^   | j                  t        t        d       | j                  t        t        t               d       | j                  t        t        t               d       t        d      }| j                  t        |      t        d             | j                  t        |d      t        d             | j                  t        |d      t        d	             t        d      }t        |d      }| j                  |t        d	             | j                  t        |      t               y )
N0110{   up000101100000001011left10110000both1011)	r^   r_   r    r   r`   assertEQUALr   rM   rN   rP   rR   rT   r-  s       rU   test_simplezStripTests.test_simple  s    )UF3)UHJ<*eXZ>]#q8I#67q&)8J+?@q&)8F+;<=)!VHV,-a.1rW   c                 B   t        d      D ]  }t        d      }t        g d      }t        |      }t	        ||      }| j                  t        |      t               | j                  t        |      d       | j                  |t        |             t        |      }t	        ||      }| j                  t        |      t               | j                  t        |      d       |j                  d       t	        ||      }| j                  |t        |              y )NrC   r   )rw  rightry  r   r\   )rL   r   r   r   r    rM   rN   r   rl   r   setallr   )rP   rQ   rS   moderR   r-  rT   s          rU   test_zeros_oneszStripTests.test_zeros_ones  s    r 	)A"A34DaAaAT!Wh/SVQ'Qa)q!AaAT!Wn5SVQ'HHQKaAQQ(!	)rW   c           	         | j                         D ]H  }|j                         }t        |      }|j                         }dt	        |j                  d      |j                        fdt	        |j                  d      |j                        fdt	        |j                  d      |j                        ffD ]  \  }}t        ||      }| j                  ||       | j                  t        |      t               | j                  ||       t        ||      }| j                  ||       | j                  t        |      t               | j                  ||        K y )Nrw  rJ   r  ry  )randombitarrayscopyr   rO   r   lstriprE   rstripr    r{  rM   rN   )rP   rR   rT   ra   r   r  r   r-  s           rU   r\  zStripTests.test_random&  s    %%' 	'AAq!AAhqxx}ahh?@hqxx}ahh?@hqwws|ahh?@ '	c
 !TN  C(  a(3  A&!TN  C(  a.9  A&'		'rW   c                    t        d      D ]x  }t        dd      }t        |      }|j                  d       d|t	        |      <   | j                  t        |d      t        d             | j                  t        |      |       z y )Nr   r\   r   r   ry  rK   )rL   r	   r   r  r   rM   r    rl   )rP   rQ   rS   rR   s       rU   test_one_setzStripTests.test_one_set:  sq    r 	(A5!AAHHQKAilOU1f-x}=SVQ'	(rW   N)rd   re   rf   r}  r  r\  r  rg   rW   rU   rp  rp    s    2)&'((rW   rp  c                   T    e Zd Zed        ZddZd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zy)CountN_Testsc                 `    || j                  dd|      }}||k  r|| |   z  }|dz  }||k  r|S )z2return lowest index i for which a[:i].count() == nr\   r   )rs   )rR   rS   r   js       rU   r!   zCountN_Tests.count_nG  sG     !''!Q"1!e1IAFA !e rW   c                     | j                  |j                  |d|      |       |dk(  r| j                  |d       y | j                  ||dz
     |       y Nr   r\   )rM   rs   )rP   rR   rS   r   vs        rU   check_resultzCountN_Tests.check_resultP  sN    Aq)1-6Q"Qq1uXq)rW   c                    t               }| j                  t        |d      d       | j                  t        |dd      d       | j                  t        |dd      d       | j                  t        t        |d       | j                  t
        t        dd       | j                  t
        t        |d       | j                  t        t        |dd       | j                  t        dt        |d       y )Nr   r\   rY   g      @r   z#n = 1 larger than bitarray length 0)r   rM   r!   r^   r`   r_   assertRaisesMessagert   s     rU   
test_emptyzCountN_Tests.test_emptyW  s    JA*Aq)1-Aq)1-*gq!4)Wb!4)Wa5*gq!Q7   .,-4a	<rW   c           	         t        d      }|j                         }| j                  t        |      d       | j                  |j	                         d       | j                  |j	                  d      d       | j                  t        |d      d       | j                  t        |dd      d       | j                  t        |dd      d       | j                  t        |dd      d	       | j                  t        |d
      d       | j                  t        |d
d      d       | j                  t        |d      d       | j                  t        dt
        |d       | j                  t        dt
        |d       | j                  t        dt
        |dd       | j                  t        dt
        |dd       dD ]  }t        |j	                  |      dz         D ]n  }t        |||      }| j                  ||||       | j                  |d | j	                  |      |       | j                  || j                  |r|n| |             p  | j                  ||       y )N01111101111101111101111100111101111101111101110000   r   r   r   r   r   r   r   rk   r   r\   -   znon-negative integer expectedr[   z%n = 49 larger than bitarray length 481   z,n = 12 exceeds total count (a.count(0) = 11)z,n = 38 exceeds total count (a.count(1) = 37)&   r   r\   )r   r  rM   rl   rs   r!   r  r`   rL   r  r{  )rP   rR   rT   r  rS   r   s         rU   r}  zCountN_Tests.test_simplec  s"   GHFFHQ$B'R(A*Aq)1-Aq)2.B*B/B,B*B/B,  -L!(!R	1 	   .-.5q"	> 	   .56=q"a	I 	   .56=q"a	I  	EA1771:>* EAq!$!!!Q1-  2AQ3  DLLaaR$CD	E	E 	ArW   c           	      :   t        d      }| j                  t        |      d       | j                  |j                         d       | j                  t	        |d      d       | j                  t	        |d      d       | j                  t	        |d      d       | j                  t        t        |d       | j                  t        t        |d	       | j                  t        t        |d
       t        d	      D ]  }| j                  ||t	        ||             ! y )N!001111101111101111101111100111100!      r   r   r   r   r[   r1  "   )	r   rM   rl   rs   r!   r^   r`   rL   r  rP   rR   rS   s      rU   rG  z CountN_Tests.test_frozenbitarray  s    >?Q$B'A*B,B,*gq"5*gq"5*gq"5r 	3AaGAqM2	3rW   c                 R   t        dd      }t        |      }| j                  t        ||      |       | j	                  t
        t        |dd       | j	                  t
        t        ||dz          t        d      D ]*  }t        d|      }| j                  t        ||      |       , y )Nr\   順 r   rk   )r	   r   rM   r!   r^   r`   rL   rP   rS   rR   rQ   r   s        rU   	test_oneszCountN_Tests.test_ones  s    AwGA**gq!Q7*gq!a%8r 	/A1AWQ]A.	/rW   c                 z   t        dd      }t        |      }| j                  t        |d      d       | j	                  t
        t        |d       t        d      D ]^  }|j                  d       t        |      }d||<   | j                  t        |d      |dz          | j	                  t
        t        |d       ` y )Nr\   r  r   rk   r   )	r	   r   rM   r!   r^   r`   rL   r  r   r  s        rU   r  zCountN_Tests.test_one_set  s    Aw!HA**gq!4r 	9AHHQK!AAaDWQ]AE2j'1a8	9rW   c                     t        dd      D ]U  }t        |      }d|d<   | j                  t        |d      |       |dk(  rd}nd}| j	                  t
        |t        |d       W y )Nr\   r   r[   z#n = 2 larger than bitarray length 1z*n = 2 exceeds total count (a.count(1) = 1)r   )rL   r   rM   r!   r  r`   )rP   r,  rR   msgs       rU   	test_lastzCountN_Tests.test_last  sh    q$ 	EAaAAbEWQ]A.Av;B$$Zgq!D	ErW   c                     t        d      }| j                  |j                         d       dD ]$  \  }}| j                  t        ||      dz
  |       & y )Nr   r5  ))r   r   )rI   i  )r   i  r\   )r#   rM   rs   r!   )rP   rR   rS   r   s       rU   test_primeszCountN_Tests.test_primes  sT    vD)# 	3DAq WQ]Q.2	3rW   c           	      
   t        d      D ]  }t        dd      }t        |      }t        d      }|j	                  |        t        t        d            D ]  }||t        |      <    |j                  |      }t        |||      }| j                  ||||       |dz   }| j                  t        d|||fz  t        |||       t        d      D ]/  }t        d|      }t        |||      }| j                  ||||       1  y )NrI   r  r   r\   z-n = %d exceeds total count (a.count(%d) = %d)rk   r   )rL   r	   r   r   r  r   rs   r!   r  r  r`   )rP   rQ   r,  rR   r  tcr   rS   s           rU   
test_largezCountN_Tests.test_large  s   s 	.A)AAAAHHUO9S>* $"#)A,$B2q!AaQ*QA$$Z 2:=>2J2G%,aA7 2Y .ArNAq!$!!!Q1-.	.rW   N)r\   )rd   re   rf   rn  r!   r  r  r}  rG  r  r  r  r  r  rg   rW   rU   r  r  E  sC     *
<!F3/
9	E3.rW   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)BitwiseCountTestsc           	         t        d      D ]]  }t        t        |g            }|j                         }| j	                  t        |t        d            d       | j	                  t        |t        d            |       | j	                  t        ||      |       | j	                  t        |t        d            |       | j	                  t        |t        d            d       | j	                  t        ||      |       | j	                  t        |t        d            |       | j	                  t        |t        d            d|z
         | j	                  t        ||      d       ` y )N   r   r   )
rL   r   	bytearrayrs   rM   r&   r   r   r'   r(   )rP   r   rR   cnts       rU   test_count_bytez!BitwiseCountTests.test_count_byte  s   s 	1AA3(A'')CYq%(3Q7Yq$q'2C8Yq!_c2Xaq2C8Xaa115Xa^S1Yq%(3S9Yq$q'2AG<Yq!_a0	1rW   c           
      ~   t        d      }|j                         }t        d      }|j                         }| j                  t        ||      d       | j                  t	        ||      d       | j                  t        ||      d       t        t        t
        fD ]  }| j                  t        |       | j                  t        ||       | j                  t        |||d       | j                  t        ||d       | j                  t        |d|       | j                  t        ||d        | j                  ||       | j                  ||       |j                  d	       t        t        t
        fD ]F  }| j                  t        |||       | j                  t        |t        d
d      t        dd             H y )N001111010011r   r   r   rY   rK   r}   r\   rD  rH   r   rG   )r   r  rM   r&   r'   r(   r^   r_   r{  r   r`   )rP   rR   aarT   bbra   s         rU   test_1zBitwiseCountTests.test_1  su   XVVXXVVX1a!,!Q+1a!,Hi/ 	2Ai+iA.iAq!4iAr2iC3iAq1	2 	BB	Hi/ 	9Aj!Q2j!&ue4&uh79	9rW   c                     t        d      }t        d      }| j                  t        ||      d       | j                  t        ||      d       | j                  t	        ||      d       y )Nr  r  r   r   r   )r   rM   r&   r'   r(   rA  s      rU   test_frozenzBitwiseCountTests.test_frozen  sX    8$8$1a!,!Q+1a!,rW   c                    t        d      D ]  }t        d      }t        |      }t        ||j                        }| j                  t        ||      ||z  j                                | j                  t        ||      ||z  j                                | j                  t        ||      ||z  j                                 y )NrI   r   )
rL   r   r   r   rE   rM   r&   rs   r'   r(   )rP   rQ   rS   rR   rT   s        rU   r\  zBitwiseCountTests.test_random  s    s 	?A$A!A188$AYq!_q1ummo>Xa^q1ummo>Yq!_q1ummo>	?rW   c                    | j                         D ]  }t        |      }t        ||j                        }| j	                  t        ||z        t        ||      dkD         | j	                  t        ||      t        ||z               | j	                  t        ||z        t        ||      dkD         | j	                  t        ||z        t        |      xs t        |             | j	                  t        ||z        t        ||      dkD         | j	                  t        ||z        ||k7         | j	                  t        ||z        t        ||      |k(         | j	                  t        ||z        t        |      xr t        |             | j	                  t        ||z        t        ||      |k(         | j	                  t        ||z        t        ||      |k(         | j	                  t        ||z        || k(          y Nr   )r  rl   r   rE   rM   anyr&   r)   r'   r(   r   rP   rR   rS   rT   s       rU   	test_misczBitwiseCountTests.test_misc  s   %%' 	2AAA188$ASQZ1a1)<=WQ]CAJ7SQZ!Q!);<SQZQ)93q6:SQZ1a1)<=SQZa0 SQZ1aA)=>SQZQ):CF;SQZ!Q1)<=SQZ1aA)=>SQZqb1)	2rW   N)rd   re   rf   r  r  r  r\  r  rg   rW   rU   r  r    s    196-?2rW   r  c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	BitwiseAnyTestsc           	         t        d      }t        d      }| j                  t        ||             | j	                  t
        t               | j	                  t
        t        |d       |j                  d       | j	                  t        t        ||       | j	                  t        t        t        dd      t        dd             y )	N01010111r}   r\   r   rG   11rH   )r   r   rq   r)   r^   r_   r   r`   rA  s      rU   rV   zBitwiseAnyTests.test_basic)  s    6"V1&)W-)Wa3	*gq!4*g"42"4/	1rW   c                    d}t        d      D ]  }t        d|      }t        ||      }t        ||      }t        d|      }t        ||      }t        ||      }t        |      xr t        |      xr
 ||v xs ||v }	t        t        |      t        |      z        }
| j	                  |	|
       t        |      t        |      }}dx||| ||| | j	                  t        ||      |	        y )NrI   r   r   r\   )rL   r	   boolr   rM   r   r)   )rP   rS   rQ   i1j1r1i2j2r2res1res2a1a2s                rU   test_overlapzBitwiseAnyTests.test_overlap5  s    s 	4AABQBr2BABQBr2B 8CRCbBh.B"(DB#b')*DT4(a[(1+B$%%Br"I2b	WR_d3!	4rW   c           
      X   d}t        d      D ]  }| j                  |      }| j                  |      }t        |      |   }t        |      |   }t        |      t        |      }}dx||<   ||<   | j                  t	        ||      t        t        |      t        |      z                y )NrI   r   r\   )rL   random_slicer   rM   r)   r  r   )	rP   rS   rQ   s1s2r  r  r  r  s	            rU   test_commonzBitwiseAnyTests.test_commonI  s    s 	GA""1%B""1%Bq"Bq"Ba[(1+BBrFRVWR_d3r7SW3D.EF	GrW   c                 R   t        ||      }| j                  t        |      t               | j                  |t        ||             | j                  |t	        ||z               | j                  |||z  j	                                | j                  |t        ||      dkD         y r  )r)   rM   rN   r  r  r&   )rP   rR   rT   r   s       rU   checkzBitwiseAnyTests.checkU  s    AqMa$'GAqM*CAJ'QUKKM*IaOa/0rW   c                     dD ]K  \  }}}t        |      }t        |      }| j                  t        ||      |u        | j                  ||       M y )N))rY   rY   F)rJ   rK   F)rJ   rJ   F)rK   rK   T)0001111100F)z
00001011 1z
01000100 1T)r   rq   r)   r  rP   rR   rT   r   s       rU   r(  zBitwiseAnyTests.test_explitcit]  sR    4 
	JAq3 AAOOGAqMS01JJq!
	rW   c                     | j                         D ]5  }t        |      }t        ||j                        }| j	                  ||       7 y r?  )r  rl   r   rE   r  r  s       rU   r\  zBitwiseAnyTests.test_randomj  sA    %%' 	AAA188$AJJq!	rW   c                     t        dd      D ]G  }t        |      }t        |      }t        |      }d||<   | j	                  ||   t        ||             I y )Nr\   r   )rL   r   r   r   rM   r)   )rP   rS   rR   rT   r   s        rU   test_onezBitwiseAnyTests.test_onep  sU    q# 	2AaA
A!AAaDQqT71a=1	2rW   N)
rd   re   rf   rV   r  r  r  r(  r\  r  rg   rW   rU   r  r  '  s&    
14(
G12rW   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)SubsetTestsc           	      2   t        d      }t        d      }| j                  t        ||             | j	                  t        ||             | j                  t        t               | j                  t        t        |d       | j                  t        t        d|       | j                  t        t        |d       |j                  d       | j                  t        t        ||       | j                  t        t        t        dd      t        d	d
             y )Nr  r  rY   rK   r}   r\   r   rG   r  rH   )	r   r   rq   r*   assertFalser^   r_   r   r`   rA  s      rU   rV   zSubsetTests.test_basic|  s    6"Vq!%1&)V,)VQ3)VS!4)VQ2	*fa3*f"42"4/	1rW   c                     t        ||      }| j                  t        |      t               | j                  ||       | j                  ||z  |k(  |       | j                  ||z  |k(  |       y r?  )r*   rM   rN   r  )rP   rR   rT   r   r   s        rU   r  zSubsetTests.check  sa    1aLa$'C Q!S)Q!S)rW   c                 b    dD ]*  \  }}| j                  t        |      t        |      d       , y )N))rY   rY   )rJ   rK   )rJ   rJ   )rK   rK   )000111)r  r  )	000010111	010011111Tr  r   rA  s      rU   	test_TruezSubsetTests.test_True  s1    1 	7DAq JJx{HQK6	7rW   c                 b    dD ]*  \  }}| j                  t        |      t        |      d       , y )N))rK   rJ   )1101r  )
0000101111
0100111011Fr  rA  s      rU   
test_FalsezSubsetTests.test_False  s/    3 	8DAqJJx{HQK7	8rW   c                    | j                  d      D ]v  }|j                         }d|t        t        |            <   | j	                  ||d       | j	                  ||||k(         |j                  d       | j	                  ||d       x y )Nr\   startT)r  r  r   rl   r  r  rA  s      rU   r\  zSubsetTests.test_random  s|    %%A%. 		#AA#$AiA JJq!T"JJq!Q!V$HHQKJJq!T"		#rW   N)rd   re   rf   rV   r  r  r  r\  rg   rW   rU   r  r  z  s    1*78

#rW   r  c                       e Zd Zd Zd Zd Zy)CorrespondAllTestsc           	      V   t        d      }t        d      }| j                  t        ||      d       | j	                  t
        t               |j                  d       | j	                  t        t        ||       | j	                  t        t        t        dd      t        dd             y )	Nr  r  )r\   r\   r\   r\   r\   r   rG   r  rH   )r   r   rq   r+   r^   r_   r   r`   rA  s      rU   rV   zCorrespondAllTests.test_basic  s    6"Vq!,l;)^4	*na;*n"42"4/	1rW   c           	      v    dD ]4  \  }}}| j                  t        t        |      t        |            |       6 y )N))rY   rY   )r   r   r   r   )
0000011111
0000100111)r}   r\   r   r   )rM   r+   r   r  s       rU   r(  z!CorrespondAllTests.test_explitcit  s<     	LIAq#
 ^HQK!EsK	LrW   c           	      \   t        d      D ]  }t        d      }t        |      }t        ||j                        }t        ||      }| j                  |d   t        | |              | j                  |d   t        | |             | j                  |d   t        ||              | j                  |d   t        ||             | j                  |d   |t        ||      z
         | j                  |d   |d   z   t        ||             | j                  t        |      |         y )NrI   i  r   r\   r   r   )rL   r   r   r   rE   r+   rM   r&   r'   r(   sum)rP   rQ   rS   rR   rT   r   s         rU   r\  zCorrespondAllTests.test_random  s   s 	*A$A!A188$A A&CSVYrA2%67SVYr1%56SVYq1"%56SVYq!_5SVQ!Q%78SVc!f_i1o>SXq)	*rW   N)rd   re   rf   rV   r(  r\  rg   rW   rU   r  r    s    	1L*rW   r  c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)ByteSwapTestsc                 f   t        d      }t        |d       | j                  |t        d             t        |       | j                  |t        d             t        d      }t        |d       | j                  |t        d             t        |d       | j                  |t        d             y )	N   ABCDr   s   BADCs   CDABs   ABCDEFr   s   CBAFEDr\   )r  r,   rM   rt   s     rU   test_basic_bytearrayz"ByteSwapTests.test_basic_bytearray  s    gAIg./Ig./i AIi01AIi01rW   c                 B   t        d      }t        |       | j                  |t        d             t        d      }|j                         }|j	                          t        |       | j                  |t        d             t        |       | j                  ||       y )Nz11110000 01010101z01010101 11110000z01111000 1001z10010000 0111)r   r,   rM   r  tobytesrA  s      rU   test_basic_bitarrayz!ByteSwapTests.test_basic_bitarray  s{    ()H%89:_%FFH			H_56ArW   c                 l   t        j                  d      }t        j                  D ]  }|dk(  r	t        j                  ||      }| j	                  t        |      |j                  z  d       |j                          t        ||j                         | j	                  |j                         |        y )N@   u)	rb  r   array	typecodesrM   rl   itemsizer,   r  )rP   r   typecoderR   s       rU   test_basic_arrayzByteSwapTests.test_basic_array  s    JJrN 	-H3Ha(ASVajj0"5JJLQ

#QYY[!,	-rW   c                     t               }t        |       | j                  |t                      t        d      D ](  }t        ||       | j                  |t                      * y )Nr   r  r,   rM   rL   r  s      rU   r  zByteSwapTests.test_empty  sP    KIK(r 	-AQNQ	,	-rW   c                     t        d      }t        |       | j                  |t        d             t        d      D ])  }t        ||       | j                  |t        d             + y )N   r   r  r  s      rU   test_one_bytezByteSwapTests.test_one_byte  sY    gIg./q 	4AQNQ	' 23	4rW   c                    dt        d      fD ]  }| j                  t        t        |        t	        d      }t        d      }dD ]:  }| j                  t        t        ||       | j                  t        t        ||       < y )Ns   AB   r  r   )r[   r   r      )r   r^   BufferErrorr,   r  r   r`   )rP   rR   rT   rS   s       rU   rc   zByteSwapTests.test_errors
  sy    r** 	8Ak8Q7	8 gRL 	:Aj(Aq9j(Aq9	:rW   c           	      F   t        d      D ]  }t        d      D ]  }t        j                  ||z        }t        |      }t	        ||       g }t        |      D ]'  }|||z  ||z  |z    }|j                  |d d d          ) | j                  |t        |               y )Nrk   r[   )rL   rb  r   r  r,   extendrM   )rP   rS   mr   rR   r'  r   rb   s           rU   
test_rangezByteSwapTests.test_range  s    r 		4A2Y 4JJq1u%aLAq (A!a%A	*AJJq2w'(   IcN34		4rW   c           
          t        d      D ]N  }t        j                  |      }t        |      }t	        |       | j                  |t        |d d d                P y )NrI   r[   )rL   rb  r   r  r,   rM   )rP   rS   r   rR   s       rU   test_reverse_bytearrayz$ByteSwapTests.test_reverse_bytearray"  sO    s 	4A

1A!AQKQ	!DbD' 23		4rW   c                     t        d      D ]S  }t        d|z        }|j                         }t        |       |j	                          | j                  ||d d d          U y )NrI   r   r[   )rL   r   r  r,   bytereverserM   )rP   rS   rR   rT   s       rU   test_reverse_bitarrayz#ByteSwapTests.test_reverse_bitarray)  sU    s 	)AAAAQKMMOQ$B$(	)rW   N)rd   re   rf   r  r  r  r  r  rc   r  r  r"  rg   rW   rU   r  r    s/    2
--4
:
44)rW   r  c                   $    e Zd Zd Zd Zd Zd Zy)ParityTestsc                     dD ]O  \  }}| j                  t        t        |            |u        | j                  t        t        |            |u        Q y )N)rY   r   )rK   r\   )0010011r\   )10100110r   )rq   r"   r   r   )rP   r   r   s      rU   r(  zParityTests.test_explitcit5  sJ    J 	>FAsOOF8A;/367OOF>!#45<=	>rW   c                     t        d      D ]M  }| j                  t        t        |            d       | j                  t        t	        |            |dz         O y )N  r   r   )rL   rM   r"   r   r   r[  s     rU   r  zParityTests.test_zeros_ones:  sJ    t 	5AVE!H-q1VDG_a!e4	5rW   c                    t        ddg      }t        |      }d}t        d      D ]  }| j                  t	        |      |       | j                  ||j                         dz         | j                  |j                  |       | j                  t        |      |       t        d      }|j                  |       ||z  } y )NrG   rH   rD   r   r*  r   r\   )
r   r   rL   rM   r"   rs   rE   rl   r   r   )rP   rE   rR   parr   r  s         rU   r\  zParityTests.test_random?  s    5)*F#t 	AVAY,S!'')a-0QXXv.SVQ'AAHHQK1HC	rW   c                     | j                  t        t        d       | j                  t        t        d       | j                  t        t               | j                  t        t        t        d      d       y NrY   r\   rD  )r^   r_   r"   r   r   s    rU   test_wrong_argszParityTests.test_wrong_argsL  sN    )VR0)VQ/)V,)VXe_a@rW   N)rd   re   rf   r(  r  r\  r/  rg   rW   rU   r$  r$  3  s    >
5
ArW   r$  c                   &    e Zd Zd Zd Zd ZddZy)SumIndicesUtilc           	         dD ]  \  }}}t        |t        ddg            t        |t        ddg            fD ]O  }| j                   ||d      |       | j                   ||d      |       | j                  |t        |             Q  y )N)	)rY   r   r   )rJ   r   r   )rK   r   r   )r  r\   r\   )011r   r   )001r   r}   )0001100r   r1  )00001111   ~   )01100111 1101r  i}  rG   rH   r\   r   )r   r   r   rM   )rP   Sr   r  r  rR   s         rU   check_explicitzSumIndicesUtil.check_explicitV  s    
 		1IAr2
 q&(E):";<$Q%/@(ABD 1  1a"-  1a"-  HQK0	1		1rW   c                     | j                  t        |d       | j                  t        |d       | j                  t        |       dD ]#  }| j                  t        |t        d      |       % y )NrY   rZ   )r[   r   r   r}   rD  )r^   r_   r`   r   )rP   r:  r  s      rU   check_wrong_argszSumIndicesUtil.check_wrong_argsb  s_    )Q+)Q,)Q' 	DDj!Xe_dC	DrW   c           	          t        |      }| j                   ||d      t        d t        |      D                     | j                   ||d      t        d t        |      D                     y )Nr\   c              3   ,   K   | ]  \  }}|s	|  y wr?  rg   .0r   r  s      rU   	<genexpr>z/SumIndicesUtil.check_urandom.<locals>.<genexpr>k  s     %FDAqAa%F   
r   c              3   2   K   | ]  \  }}|s	||z    y wr?  rg   r@  s      rU   rB  z/SumIndicesUtil.check_urandom.<locals>.<genexpr>l  s     %J1a!e%Js   

)r   rM   r   	enumerate)rP   r:  rS   rR   s       rU   check_urandomzSumIndicesUtil.check_urandomi  sU    aL1a#%FIaL%F"FG1a#%J	!%J"JKrW   c                 d   t        |t        ddg            }| j                   |||      d       | j                  |j	                                t        t        |      |      }d||<   |dk(  rt        |      nt        d |D              }	|r4|j                          |dk(  rdnd|z  dz
  }
|
||dz
  z  z  }
|
dz  }
|
|	z
  }	|rt        |      }|j                         }| j                  |j                         |r||z
  n|       | j                   |||      |	       | j                  ||       y )	NrG   rH   r   r\   c              3   &   K   | ]	  }||z    y wr?  rg   )rA  r   s     rU   rB  z.SumIndicesUtil.check_sparse.<locals>.<genexpr>u  s     0H1Q0Hs   r   r   r  )r   r   rM   r  r  r   rL   r   invertr   r  rs   )rP   r:  rS   r{   r  freezeinvrR   indicesr   sum_onesr-  s               rU   check_sparsezSumIndicesUtil.check_sparsen  s   !VXu-./1dQ'!q1%'
"aic'lS0H0H-HHHJ AIq1q519HQU#HNHS.Cq!AFFHSAEa81dS)ArW   N)r\   FF)rd   re   rf   r;  r=  rF  rN  rg   rW   rU   r1  r1  T  s    
1DL
rW   r1  c                   *    e Zd Zd Zd Zd Zd Zd Zy)
SSQI_Testsc                 .    | j                  t               y r?  )r;  r?   r   s    rU   test_explicitzSSQI_Tests.test_explicit  s    E"rW   c                 .    | j                  t               y r?  )r=  r?   r   s    rU   r/  zSSQI_Tests.test_wrong_args  s    e$rW   c                    t               }dx}}t        d      D ]e  }t        d      }|j                  |       |r||z  }|||z  z  }| j	                  t        |d      |       | j	                  t        |d      |       g y )Nr   rI   r\   r   )r   rL   r   r   rM   r?   )rP   rR   sm1sm2r   r  s         rU   
test_smallzSSQI_Tests.test_small  s~    Jcs 	/AAAHHQKqq1uU1a[#.U1a[#.	/rW   c                 0    | j                  t        d       y )N5'  )rF  r?   r   s    rU   test_urandomzSSQI_Tests.test_urandom  s    5&)rW   c           	          t        d      D ]?  }t        dd      }t        d      }t        d      }| j                  t        dd|||       A y )Nr   r\   r   iCB i  rS   r{   r  rJ  rK  )rL   r	   r   rN  r?   )rP   rQ   r  rJ  rK  s        rU   test_sparsezSSQI_Tests.test_sparse  sU    q 	AA1a=D ^Fa.CeyC#'C  A		ArW   N)rd   re   rf   rR  r/  rW  rZ  r]  rg   rW   rU   rP  rP    s    #%
/*ArW   rP  c                   $    e Zd Zd Zd Zd Zd Zy)SumIndicesTestsc                     | j                  t               t        d      }| j                  t        |d      d       | j                  t        |d      d       y )NrI   r\   )r  r2  r   r3  )r;  r$   r#   rM   rt   s     rU   rR  zSumIndicesTests.test_explicit  sG    K(sOQQ/%8QQ/8rW   c                 .    | j                  t               y r?  )r=  r$   r   s    rU   r/  zSumIndicesTests.test_wrong_args  s    k*rW   c           	      H    dD ]  }| j                  t        dd|dd        y )N)r\   r   i%j r   Tr\  )rN  r$   )rP   r  s     rU   r  zSumIndicesTests.test_ones  s4     	@DkY!#'$  @	@rW   c           	          t        d      D ]V  }t        ddg      }t        d      }t        dd      }t	        d      }t	        d      }| j                  t        |||||       X y )Nrk   i= i'	 r   r\   r   )rL   r   r   r	   r   rN  r$   )rP   rQ   rS   r{   r  rJ  rK  s          rU   r]  zSumIndicesTests.test_sparse  se    r 	DA)*A% A1a=D ^Fa.Ck1avsC	DrW   N)rd   re   rf   rR  r/  r  r]  rg   rW   rU   r_  r_    s    9+@
DrW   r_  c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
XoredIndicesTestsc                     dD ]Y  \  }}t        || j                               t        || j                               fD ]  }| j                  t	        |      |        [ y )N)r&  rJ   r   )rK   r   )r  r\   )r3  r   )r4  r   )r5  r   )r9  r   )r   random_endianr   rM   r%   )rP   r   r   rR   s       rU   rR  zXoredIndicesTests.test_explicit  sd    , 	4DAq q$"4"4"67$Q(:(:(<=? 4  Q34	4rW   c                     t         }| j                  t        |d       | j                  t        |d       | j                  t        |       | j                  t        |t        d      d       y r.  )r%   r^   r_   r   )rP   Xs     rU   r/  z!XoredIndicesTests.test_wrong_args  sS    )Q+)Q*)Q')Q;rW   c           
      ^   g d}| j                  t        dd      D cg c]  }t        t        |             c}|       t	               }d}t        d      D ]N  }|j                  d       ||z  }| j                  t        |      |       |dk  s:| j                  ||   |       P y c c}w )N)r   r\   r   r   r}   r\   r   r   r   r\   r   r   r   r\   r   r   r  r\   r   r\   rk   r   r   r   )rM   rL   r%   r   r   r   )rP   r'  r   rR   rb   s        rU   r  zXoredIndicesTests.test_ones  s    LaE1+d1g.EsKJt 	,AHHQKFA[^Q/2v  Q+	, Fs   B*c                     g d}t        d      }d}t        |j                  d            D ]B  \  }}| j                  t	        |d |       |       |dk  r| j                  ||   |       ||z  }D y )N)r   r   r\   r}   r   r   r   rk   r   r  r      7   r   r      r   r   r   r\   r   )r#   rE  r$  rM   r%   )rP   r'  r%  rb   r   r   s         rU   r  zXoredIndicesTests.test_primes  sv    JD!fmmA./ 	DAq[4a82v  Q+FA		rW   c                    d}t        |      t        t        |            fD ]i  }t        t        j                  d t        |      D              }|j                         }| j                  t        |      |       | j                  ||       k y )NrY  c              3   ,   K   | ]  \  }}|s	|  y wr?  rg   r@  s      rU   rB  z6XoredIndicesTests.test_large_random.<locals>.<genexpr>  s     'Hdaa'HrC  )	r   r   r   operatorxorrE  r  rM   r%   )rP   rS   rR   r   rT   s        rU   test_large_randomz#XoredIndicesTests.test_large_random  sq    A,y| <= 	#A'Hil'HICA[^S1Q"		#rW   c                     | j                         D ]:  }d}t        |      D ]  \  }}|||z  z  } | j                  t        |      |       < y r  )r  rE  rM   r%   )rP   rR   r-  r   r  s        rU   r\  zXoredIndicesTests.test_random  sW    %%' 	0AA!! 1QU
[^Q/		0rW   c                     t        d      }d}t        d      D ]G  }| j                  t        |      |       t	        t        |            }|j                  |       ||z  }I y )N   r   r   )r   rL   rM   r%   r   rl   rI  )rP   rR   r-  rQ   r   s        rU   
test_flipszXoredIndicesTests.test_flips  sY    SMt 	A[^Q/#a&!AHHQKFA		rW   c                 6   g d}t        d      }d||<   t        |      }t        |dd      ||<   t        dd      D ]Z  }| j	                  t        |      d       |j                  |       | j	                  t        |      |       |j                  |       \ y )N)r\   r   r}   r   r  r   r
  rw  r  r   r   rG   lengthrE   )r   r%   r5   rL   rM   rI  )rP   parity_bitsrR   r-  r   s        rU   test_error_correctz$XoredIndicesTests.test_error_correct  s    3CL+N!H=+q# 	A[^Q/HHQK[^Q/HHQK		rW   N)rd   re   rf   rR  r/  r  r  rt  r\  rx  r}  rg   rW   rU   re  re    s*    4<,	#0rW   re  c                 P    t        |       }|dk  r|S dt        | dd | dd       z   S )z5return number of uninterrupted intervals of 1s and 0sr   r\   Nr[   )rl   r(   )rR   rS   s     rU   runsr    s5    AA1uy3B12'''rW   c                   $    e Zd Zd Zd Zd Zd Zy)IntervalsTestsc                     dg fddgfddgfdg dffD ]X  \  }}t        |      }| j                  t        t        |            |       | j                  t	        |      t        |             Z y )NrY   rJ   )r   r   r\   rK   )r\   r   r\   z00111100 0000011))r   r   r   )r\   r   r  )r   r  r   )r\   r   r   )r   rM   r+  r-   r  rl   )rP   r   r'  rR   s       rU   rR  zIntervalsTests.test_explicit  sz    Ryk"yk"#@B	 		0FAs AT)A,/5T!Wc#h/		0rW   c           	          t        dd      D ]j  }dD ]c  }|t        |g| j                               z  }| j                  t	        t        |            |d|fg       | j                  t        |      d       e l y )Nr\   rI   r  r   )rL   r   rh  rM   r+  r-   r  )rP   rS   r  rR   s       rU   test_uniformzIntervalsTests.test_uniform+  sw    q# 	-A -!d&8&8&:;;  il!3q!Qi[A  a!,-	-rW   c                 <   | j                         D ]  }t        |      }t        |      }t        |      D ]Q  \  }}}| j	                  t        |t                     | j                  d|cxk  xr |cxk  xr |k  nc        |||| S | j                  ||        y r  )	r  rl   r   r-   r  
isinstancer  rq   rM   )rP   rR   rS   rT   valuer  stops          rU   r\  zIntervalsTests.test_random2  s    %%' 	#AAA
A&/l &"ud  E4!89U 6T 6Q 67 %%& Q"	#rW   c           	         | j                         D ]  }t        |      D cg c]  \  }}}||z
   }}}}| j                  t        |      t	        |             t               }|r|d   nd }|D ]7  }| j                  |dkD         |j                  |t        |g      z         | }9 | j                  ||        y c c}}}w r  )r  r-   rM   rl   r  r   rq   r  )	rP   rR   rQ   r  r  alt_runsrT   r  r{  s	            rU   test_list_runszIntervalsTests.test_list_runs<  s    %%' 	#A;DQ<HHE4uHHHS]DG4
A!tA" 
+(A3-/0E Q"	#Hs   B?
N)rd   re   rf   rR  r  r\  r  rg   rW   rU   r  r    s    
0-##rW   r  c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)HexlifyTestsc                 .   g d}|D ]  \  }}}t        |d      }t        |d      }| j                  t        |d      |       | j                  t        |d      |       | j                  t	        |      |       | j                  t	        |      |        y )N))rY   rY   rY   )1000rK   8)z	0101 0110a656)z0100 1001 110129b49d)z0000 1100 1110 1111037f0cefrH   rG   )r   r{  r1   rM   r0   )rP   databshex_lehex_bea_bea_les          rU   rR  zHexlifyTests.test_explicitN  s    
 #' 	3BB&DB)DVFE2D9VFH5t<VD\62VD\62	3rW   c                    t        dd      }| j                  t        |      d       | j                  t        |d      d       | j                  t        |dd      d       | j                  t        |d      d       | j                  t        |d	      d
       | j                  t        |dd      d       | j                  t        |dd      d       | j                  t        |dd      d       y )N1000 0000 0101 1111rG   10afr   r\   rY   z1 0 a fr   rK  z10 af-z10-afr   rQ   rK  sep10a_f, r  z10a, f)r   rM   r0   rt   s     rU   test_ba2hex_groupzHexlifyTests.test_ba2hex_group^  s    *H5F+1v.1b)621y1+W51c*G44g>1$/:rW   c                    | j                  t        t               | j                  t        t        d        | j                  t        t        d       | j                  t        t        t	        d             t	        dd      }| j                  t        t        |d       | j                  t        t        |d       | j                  t        t        |dd       | j                  t        t        |d	d
       y )Nr   r   r  rG   r[   r  r\       r   z  )r^   r_   r0   r`   r   rt   s     rU   test_ba2hex_errorszHexlifyTests.test_ba2hex_errorsi  s    )V,)VT2)VU3 	*fhtn=*H5*fa4*far:)VQ48*faE:rW   c                    | j                  t        dt        z        t        t	               dk(  rdnd             | j                  t        dd      t        dd             | j                  t        dd      t        d	d             y )
NzF1 FA %s f3 c0rH   z#11110001 11111010 11110011 11000000z#11111000 11110101 11111100 00110000s    a F z	1010 1111a                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              0  1D                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              rG   z0000 1000 1011)rM   r1   r   r   r   r{  r   s    rU   test_hex2ba_whitespacez#HexlifyTests.test_hex2ba_whitespacey  s     0: =>!%7%9U%B #H"GI	J 	%0!+u5	7 ?J!"2H=	?rW   c                 :   | j                  t        t        d       | j                  t        t        dd       | j                  t        t        dd       dD ]  }| j                  t        t        |        dD ]!  }d}| j	                  t        |t        |d       # y )	Nr   Fr\   r]   )01a7g89u   0€z0      )gagaagaaagar  z.invalid digit found for base16, got 'g' (0x67)rH   )r^   r_   r1   r`   r  )rP   r   r  s      rU   test_hex2ba_errorszHexlifyTests.test_hex2ba_errors  s    )VQ/)VS!4*fc596 	5Aj&!4	5 0 	HABC$$ZfaG	HrW   c                    ddddt        d      t        d      fD ]i  }t        |d      }| j                  |j                         d       | j                  |j                  d       | j                  t        |      t               k y )NeE   e   ErH   1110)r  r1   rM   rO   rE   rN   r   rP   r-  rR   s      rU   test_hex2ba_typeszHexlifyTests.test_hex2ba_types  sp    c4y	$G 	0Aq% AQVVXv.QXXu-T!Wh/		0rW   c                 d   t        d      D ]  }t        g d      }t        dt        d      z  |      }t	        |t        d      t        t
                    }t        ||      }| j                  |j                  |xs
 t                      | j                  ||       | j                  |        y )NrI   rF   r}   r   r  )rL   r   r   r   r0   r   r1   rM   rE   r   	check_obj)rP   rQ   rE   rR   r   rT   s         rU   r\  zHexlifyTests.test_random  s    s 	A34F!in,f5Aq	"6*3EFAq&!AQXXv'E1C1EFQ"NN1	rW   c                    t        t              }| j                  t        |      dt        t              z         | j                  t	        |      t
               | j                  |       t        |      }| j                  |t        j                                | j                  t	        |      t               | j                  |t        |             y )Nr}   )r1   r   rM   rl   rN   r   r  r0   lowerstrr{  )rP   rR   ts      rU   test_hexdigitszHexlifyTests.test_hexdigits  s    9QS^!34a(+q1IIOO-.a#&F1I&rW   c                 ,   t        dd      }t        j                  |j                               j	                         }| j                  t        |      |       t        t        j                  |      d      }| j                  t        |d      |       y )NP   rH   rD   )r   binasciihexlifyr  decoderM   r0   r   	unhexlifyr{  r1   )rP   rR   r   rT   s       rU   test_binasciizHexlifyTests.test_binascii  so    BQYY[)002A&X''*595)1-rW   N)rd   re   rf   rR  r  r  r  r  r  r\  r  r  rg   rW   rU   r  r  L  s0    3 	;; ?
H0	'.rW   r  c                   h    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zg dZd Zd Zd Zy)	BaseTestsc                 8   g d}|D ]  \  }}}}t        |d      }t        |d      }| j                  t        ||d      |       | j                  t        ||d      |       | j                  t	        ||      |       | j                  t	        ||      |        y )N))rY   r   rY   rY   )z1 0 1r   r   r   )z11 01 00r}   320310)z111 001r   7471)z	1111 0001r  f8f1)z11111 00001r   7Q7B)z111111 000001r
  z/gz/BrG   rH   )r   r{  r3   rM   r2   )rP   r  r  rS   s_les_ber  r  s           rU   rR  zBaseTests.test_explicit  s    
 "& 	5B4B)DB&DWQh7>WQe4>WQ-t4WQ-t4	5rW   c                     ddt        d      fD ]M  }t        d|      }| j                  |j                         d       | j                  t	        |      t
               O y )N7   7r   11111)r  r3   rM   rO   rN   r   r  s      rU   test_base2ba_typeszBaseTests.test_base2ba_types  sQ    dIdO+ 	0AAAQVVXw/T!Wh/	0rW   c           
         | j                  t        dt        d      d      t        d             | j                  t        dd      t        d             | j                  t        dd	      t        d
             dD ]  }t        |t              }| j                  |t                      t        d      }t        t        ||            }t        t        d            D ]4  }|j                  t        dt        |            t        t                     6 dj                  |      }| j                  t        ||      |        y )Nr   s   17 0rG   z100 111 000r   z7 Az11111 00000r
  s   A /z000000 111111r   r}   r   r  r   r
  <   r  r   rY   )rM   r3   r  r   r   r   r+  r2   rL   r   insertr	   rl   r   rd  )rP   rS   rR   r-  rQ   r   s         rU   test_base2ba_whitespacez!BaseTests.test_base2ba_whitespace  s   Ig$6A!-0	2U+Xm-DEV,h.GH$ 	/A:&AQ
+AWQ]#A9R=) ACF+VJ-?@A
AWQ]A.	/rW   c                    t        dd      }| j                  t        d|d      d       | j                  t        d|d      d       | j                  t        d|d	d
      d       | j                  t        d|dd      d       dD ]S  \  }}}}}t        |d      }t        ||||      }| j                  t        |      t               | j                  ||       U y )Nz001 011 100 111rG   r   r   z461 7r   r  z46 17rQ   )r  rK  46_17.r  z46.17))r   10100r   r  z10-10-0)r}   z10 11 00 01r\   rQ   2_3_0_1)r   101 100 011 101 001 010r   z  z543  512)r   r  r   rY   543512)r  z1011 0001 1101 1010 1111r}   +zb1da+f)r   z10110 00111 01101 01111r   r  zWH, NP)r
  z"101100 011101 101011 111110 101110r   r  zsd.r+.urH   )r   rM   r2   rN   r  )rP   rR   rS   r   rK  r  r   s          rU   test_ba2base_groupzBaseTests.test_ba2base_group  s    &1Aq)73AQ/9A3a8'BAqc2G<& 	%!Aq%c E"A1eS)AT!Wc*Q$	%rW   c                     dD ]D  }t        |d      }| j                  |t                      | j                  t        ||      d       F y )Nr  rY   )r3   rM   r   r2   )rP   rS   rR   s      rU   r  zBaseTests.test_empty  sD    $ 	0A2AQ
+WQ]B/	0rW   c                    dD ]3  \  }}d||t        |      fz  }| j                  t        |t        ||       5 dD ]G  }dD ]  }| j	                  t        t        ||         d|z  }| j                  t        |t        |d       I y )N)	)r   2)r}   4)r   r  )r  r  )r   r  )r   rK   )r   rR   )r
  r  )r
  rQ   z1invalid digit found for base%d, got '%s' (0x%02x)r  )rQ   @[u   € r        z.invalid digit found for base%d, got '{' (0x7b){)ordr  r`   r3   r^   )rP   rS   r   r  s       rU   test_invalid_charactersz!BaseTests.test_invalid_characters  s    A 	EDAq'*+QA8C$$Zgq!D		E % 	GAL =!!*gq!<=BQFC$$Zgq#F		GrW   c           	         t               }| j                  t        t        d |       | j                  t        t        d d       | j                  t        t        d|       | j                  t        t        dd       | j                  t        t        dd        | j                  t        t        dd        g ddfg ddffD ]F  \  }}|D ]<  }| j                  t        |t        ||       | j                  t        |t        |d       > H t        d      }t        d	d
      D ]'  }d|z  }| j                  t        |t        d|z  |       ) y )NrY   g      0@r   )ir[   r   r   r   r   r  ?      i  i  zbase must be a power of 2)r\   rw  r  i      i   i   i    z"base must be 2, 4, 8, 16, 32 or 64r   r   r   z%bitarray length 29 not multiple of %dr\   )r   r^   r_   r2   r3   r  r`   rL   )rP   rR   valuesr  r   r  s         rU   test_invalid_argszBaseTests.test_invalid_args  s6   J)WdA6)WdB7)WdA6)WdB7)Wb$7)Wb$7 G,.;578 	JKFC
  J((S'1aH((S'1bIJ	J RLq! 	JA9A=C$$ZgqAvqI	JrW   c                    t        ddd      }| j                  |t        d             | j                  t        d|      d       t	        d      D ]  }dj                  t        t        |            }| j                         }t        d||      }| j                  |t        ||             | j                  t        d|      t        |              y )	Nr  F61rH   z1111 0110 0001f61rC   rY   r   )r3   rM   r   r2   rL   rd  r   r   rh  r{  r1   r0   )rP   rR   rS   r   rE   s        rU   test_hexadecimalzBaseTests.test_hexadecimal  s    Bu%H%567Q/r 	8A	Q/0A'')FAv&AQq& 12WR^VAY7	8rW   c                 j   t        j                  t        dd      dz        }t        j                  |      j                         }t        d|d      }| j                  |j                         |       | j                  t        d|      |       | j                  t        j                  |      |       y )Nr   rI   r   r   rH   )rb  r   r	   base64	b32encoder  r3   rM   r  r2   	b32decoderP   r  r   rR   s       rU   test_base32zBaseTests.test_base32'  s    jjS)A-.S!((*B5!c*Q+))!,c2rW   c                 j   t        j                  t        dd      dz        }t        j                  |      j                         }t        d|d      }| j                  |j                         |       | j                  t        d|      |       | j                  t        j                  |      |       y )Nr   rI   r   r
  rH   )rb  r   r	   r  standard_b64encoder  r3   rM   r  r2   standard_b64decoder  s       rU   test_base64zBaseTests.test_base64/  s    jjS)A-.%%c*113B5!c*Q+2215s;rW   c                    t        dd      }|j                         }dd|fdd|fddd	d
ddddddfD ]  \  }}}t        ||      }t        ||      }| j	                  t        |      t               | j	                  ||       t        |||      }| j	                  ||       | j	                  t        |      t               | j	                  |j                  |        y )Nr  Tr*  r   rG   rH   )r}   rG   232132030132012122122010132110)r}   rH   131231030231021211211020231220)r   rG   65554155441515405550)r   rH   35551455114545105550)r  rG   e6bc4b46a921d61)r  rH   76d32d265948b68)r   rG   O3SJLSJTSI3C)r   rH   O3JS2JSZJC3I)r
  rG   
utMtkppEtF)r
  rH   
dtMtJllIto)	r#   rO   r   r2   rM   rN   r  r3   rE   )	rP   r%  base_2rS   rE   reprR   r   rT   s	            rU   r  zBaseTests.test_primes7  s    BD)Xv&Uv&@@6611..,,
 	/NAvs (A1AT!Wc*Q$3'AQ"T!Wh/QXXv.+	/rW   ))r\   r   r   )r   r}   0123)r   r   01234567)r}   r  0123456789abcdef)r}   r  0123456789ABCDEF)r   r    ABCDEFGHIJKLMNOPQRSTUVWXYZ234567)r  r
  z@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/c                    | j                   D ]  \  }}}| j                  d|z  |       | j                  t        |      |       t        |      D ]  \  }}| j	                         }| j                  t        t        |||            |       |dk(  r|dv rt        t        |      dz         }| j                  t        |t        |||            |         y )Nr\   r}   ABCDEFr   )	alphabetsrM   rl   rE  rh  r4   r3   chrr  r2   r5   )rP   r  rS   alphabetr   r-  rE   s          rU   test_alphabetszBaseTests.test_alphabets]  s    "nn 	FNAq(Q!VQ'S]A.!(+ F1++-  1f(=!>B6a8mCFRK(A  F1a,@!A1EF	FrW   c                     | j                   D ]`  \  }}}t        d      D ]L  }t        |      }||v s|j                         r#|dk(  r	|t        v r1| j                  t        t        ||       N b y )Nr  r  )r   rL   r!  isspacer   r^   r`   r3   )rP   r  rS   r"  r   r-  s         rU   test_not_alphabetszBaseTests.test_not_alphabetsh  sm    "nn 	=NAq(3Z =F=AIIK7qI~!!*gq!<=	=rW   c           	         t        d      D ]  }t        dd      }t        |t        d      z        }d|z  }t	        ||t        d      t        d      dz        }|dk(  rt        d      r|j                         }t        d      r|j                         }t        |||j                        }| j                  ||       | j                  |        y )	NrI   r\   r  r   r    r  r}   )rL   r	   r   r   r2   r   upperencoder3   rE   r{  r  )rP   rQ   r  rR   rS   r   rT   s          rU   r\  zBaseTests.test_randomr  s    s 	A1A!in,-AQA1IbMy|c7IJAAv+a.GGI1~HHJ1ahh'AQ"NN1	rW   N)rd   re   rf   rR  r  r  r  r  r  r  r  r  r  r  r   r#  r&  r\  rg   rW   rU   r  r    sR    5$0/%(0GJ.
83</4
I	F=rW   r  c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)SC_Testsc                     dD ]H  \  }}}t        ||      }| j                  t        |      |       | j                  t	        |      |       J y )N))     rY   rG   )s    rD  rG   )s   @ 0000001rG   )s    r/  rH   )s    z00001111 11110000rG   )s    z00000000 00001000rH   )s   	 
00000000 1rH   )s   gabde g0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110110rG   )r   rM   r6   r{  r7   )rP   rT   bitsrE   rR   s        rU   rR  zSC_Tests.test_explicit  sO    	 
 	.OAtV v&AYq\1-Yq\1-	.rW   c                    t        dd      t        dd      fD ]>  }t        |      }| j                  t	        |      t
               | j                  |d       @ d g dddddfD ]  }| j                  t        t        |        y )	NrK   rH   s    r   rs  rW   r  Q	@)r   r   r6   rM   rN   bytesr^   r_   rA  s      rU   test_encode_typeszSC_Tests.test_encode_types  s    #u%~c5'AA 	7A!AT!We,Q 56	7
 r1c35 	7AiA6	7rW   c                 d   d}|t        |      t        |      t        j                  d|      fD ]h  }t        |      }| j	                  t        |      t               | j	                  |j                  d       | j	                  |j                         d       j g d}| j	                  t        |      t        d             dD ]"  }||d<   | j                  t        t        |       $ | j                  t        t        dd g       d d	d
t        dfD ]  }| j                  t        t        |        y )N     BrH   r4  )r   r   r\   r   r   )r  r[   r[   r   r   g	@r]   )r  r+  r  r7   rM   rN   r   rE   rO   r^   r`   r_   Ellipsis)rP   blobrT   rR   rb   s        rU   test_decode_typeszSC_Tests.test_decode_types  s   $yT
EKKT4JJ 	.A!AT!Wh/QXXu-QVVXu-		. 1x7 	8AAbEj)Q7	8 	)Yt=q#x. 	7AiA6	7rW   c                     dD ]J  \  }}t        |      }| j                  t        |      |       | j                  |j	                                L y )N))r.  r   )s     r   )s    r\   )s      r   )s     r  )s       r   )s         )r7   rM   rl   r  r  )rP   rT   rS   rR   s       rU   test_decode_header_nbitsz!SC_Tests.test_decode_header_nbits  sJ    
 	&DAq !ASVQ'QUUW%	&rW   c                 z   t        d      }| j                  t        |      t        d             | j                  t	        |      t        d             t        g d      }| j                  t        |      t        d             | j                  t	        |      d u        | j                  t	        |      d       y )Ns    XYZrD  rj  )r   r   r\      r   Nr]   r  r]   )iterrM   r7   r   nextr  rq   rP   r;  s     rU   test_decode_untouchzSC_Tests.test_decode_untouch  s    ./6*HUO<fs3x0>?6*HW,=>V,-fu-rW   c           	          dD ]"  }| j                  t        d|z  t        |g       $ dD ]$  }| j                  t        d|z  t        dd|g       & y )N)r   r  r
  rw     r   rA  zinvalid header: 0x%02x)rG  r  r  rA  zinvalid block head: 0x%02xr\   r  )r  r`   r7   )rP   r-  s     rU   test_decode_header_errorsz"SC_Tests.test_decode_header_errors  sg    9 	5A$$Z%=%A%.5	5
 ( 	AA$$Z%AA%E%.tQA	ArW   c                 4   | j                  t        dt        z  t        d       | j                  t        dt        z  t        t        gt        dgz  z          t        dk(  r9| j                  t        dt        d       | j                  t        dt        d	       y y )
Nz,sizeof(Py_ssize_t) = %d: cannot read 9 bytess
   	         z$read %d bytes got negative value: -1rA  r}   z+sizeof(Py_ssize_t) = 4: cannot read 5 bytess        ,read 4 bytes got negative value: -2147483648s      )r  OverflowErrorr   r7   r`   r   s    rU   test_decode_header_overflowz$SC_Tests.test_decode_header_overflow  s      :WD,	.
 	  2W<y7dV#33	5
 a<$$=02
 $$>24 rW   c                    | j                  t        dt        d       | j                  t        dt        d       | j                  t        dt        d       | j                  t        dt        d       | j                  t        d	t        d
       ddd}| j                  t        |t           t        d       ddd}| j                  t        |t           t        d       y )Nzdecode error (raw): 0 + 2 > 1s    zdecode error (raw): 32 + 3 > 34s	    zdecode error (n=1): 128 >= 128s    zdecode error (n=2): 512 >= 512s      z"decode error (n=3): 32768 >= 32768s	       rJ  z$decode error (n=4): 2147483648 >= 16)r}   r   s	       z#read 4 bytes got negative value: -1z$decode error (n=4): 4294967295 >= 16s	    )r  r`   r7   r   )rP   r  s     rU   test_decode_errorszSC_Tests.test_decode_errors  s      70	2 	  9<	>
 	  8,	. 	  88	: 	  <<	> A8:  G<	> 88:  G<	>rW   c                 H    dD ]  }| j                  t        t        |        y )N)rW   r     s   ws   s   s   )r^   StopIterationr7   rD  s     rU   test_decode_end_of_streamz"SC_Tests.test_decode_end_of_stream  s(    J 	@FmY?	@rW   c                 h    dD ]-  }t        |      }| j                  |j                         d       / y )N)r8  s   ? s    s     s      s	       r4  )r7   rM   rO   )rP   rT   rR   s      rU   test_decode_ambiguityzSC_Tests.test_decode_ambiguity  s4    	
 	.A !AQVVXu-	.rW   c                    t        dd      D ]  }|dk  r|nd|dz
  z  }d|z  }t        |d      }t        |dk  rd|gn
d|dz  |dz  g      }|j                  |       |j	                  |j                                |j                  d	       | j                  t        |      |       | j                  t        |      |        y )
Nr\      r   r   r   rG   r  r   r   )	rL   r   r  r   r  r  rM   r7   r6   )rP   r{   nbytesnbitsrR   rT   s         rU   test_block_type0zSC_Tests.test_block_type0  s    tT" 	.Ar'QrQV}FJEUH%A53;4-esl;=AHHQKHHQYY[!HHQKYq\1-Yq\1-	.rW   c           	      z   t        dd      }t        dd      D ]  }d|t        d      <   t        dddd|j	                         z   g      }|j                  t        |j                  d                   |j                  d       | j                  t        |      |       | j                  t        |      |        y )	Nr  rG   r\   r   r   r   r   rV  )r   rL   r   r  rs   r  r+  r$  r   rM   r7   r6   r  s       rU   test_block_type1zSC_Tests.test_block_type1)  s    S(#q" 	.A !Ak!n4tTAGGI-=>?AHHT!((1+&'HHQKYq\1-Yq\1-	.rW   c           
         t        dd      }t        dd      D ]  }d|t        d      <   t        ddddd|j	                         g      }|j                  d      D ]'  }|j                  t        j                  d	|             ) |j                  d       | j                  t        |      |       |d
k  r| j                  t        |      |       | j                  t        t        |            t        |      k          y )Nr>  rG   r\   r  r  r   r      z<Hry   )r   rL   r   r  rs   r$  r  structpackr   rM   r7   r6   rq   rl   )rP   rR   rS   rT   r   s        rU   test_block_type2zSC_Tests.test_block_type25  s    UH%q# 	=A!"Ak"o4tT4CDAXXa[ /T1-./HHQKYq\1-3w   1q1IaL 1SV ;<	=rW   c           
         t        dd      }d|t        t        d      d      <   t        dddddd|j	                         g      }|j                  d      D ]*  }|j                  t        j                  d	|      d d
        , |j                  d       | j                  t        |      |       | j                  t        |      |       y )Ni   rG   r\   rA  r   r}   r      <Ir   )r   r   rL   r  rs   r$  r  r^  r_  r   rM   r7   r6   )rP   rR   rT   r   s       rU   test_block_type3zSC_Tests.test_block_type3G  s    Z*,-'%.C
()tT4tT1779EF! 	/AHHV[[q)"1-.	/	1q)1q)rW   c                    t        dd      }t        t        t        t	        t        |            d                  }d||<   t        d      }|j                  t        |             |D ]'  }|j                  t        j                  d|             ) |j                  d       | j                  t        |      |       | j                  t        |      |       y )	Ni   rG   r   r   r\   s      rc  r   )r   sortedr   r   rL   rl   r  r   r  r^  r_  rM   r7   r6   )rP   rR   rL  rT   r   s        rU   test_block_type4zSC_Tests.test_block_type4Q  s    Wh' WU3q6]a89:'
12	W 	+AHHV[[q)*	+	1q)1q)rW   c                    t        d      D ]h  }t        d      }dt        j                  |      z   }	 t	        |      }| j                  t        |      d       | j                  |j                  d       j y # t
        t        f$ r Y }w xY w)NrI   rk   s    r  rG   )
rL   r   rb  r   r7   rQ  r`   rM   rl   rE   )rP   rQ   rS   rT   rR   s        rU   test_decode_random_bytesz!SC_Tests.test_decode_random_bytes`  s    s 	1A"A"**Q-/AaL SVT*QXXx0	1
 ":. s   A88B
	B
c                     t        |      }| j                  t        |      |       | j                  t        |      |       y r?  )r6   rM   rl   r7   )rP   rR   r  r;  s       rU   check_blob_lengthzSC_Tests.check_blob_lengthl  s3    |TA&4!,rW   c                 H   t        d      D ]  }d|z  }t        |      }d}|t        |j                               z  }| j	                  ||       d|d<   |dz  }|dt        |dkD        z  z  }|t        |dkD        z  }|t        |dkD        z  }| j	                  ||        y )Nro  r\   r   r   	   r  r  )rL   r   r   
bit_lengthrk  r  )rP   r   rS   rR   r  s        rU   test_encode_zeroszSC_Tests.test_encode_zerosq  s    r 	)AQAaAAALLN++A""1a(AaDFAT!a%[ Aa"fAa"fA""1a(	)rW   c                    t        d      D ]w  }t        d      }t        |      }d}|t        |j	                               z  }t        |      }||z  }|t        |dz        z  }||dz  dz   dz  z  }| j                  ||       y y )Nr   r  r   r   r  rw  )rL   r   r   r   rn  r  rk  )rP   rQ   rX  rR   r  rW  s         rU   test_encode_oneszSC_Tests.test_encode_ones  s    r 
	)Ag&EUAAE,,.//A&FKAfrk""A&B,$,,A""1a(
	)rW   c                 P   |j                         }t        t        |            }t        |      }| j	                  ||cxk(  xr |k(  nc        | j	                  |j
                  |j
                  cxk(  xr |j
                  k(  nc        | j                  t        |      g        y r?  )r  rB  r6   r7   rq   rE   rM   r+  )rP   rR   r-  r   rT   s        rU   rB  zSC_Tests.round_trip  sn    FFH1aLQ!$AHH889a"%rW   c                     t        d      D ]k  }t        d      }| j                         }t        ||      }|j	                         s;|t        ||      z  }| j                  |       |j	                         r1m y Nr   r  )rL   r   rh  r   rs   r   rB  )rP   rQ   rS   rE   rR   s        rU   r\  zSC_Tests.test_random  si    r 	#A'"A'')FQA'')WQ''" '')		#rW   N)rd   re   rf   rR  r6  r<  r?  rE  rH  rL  rN  rR  rT  rY  r[  r`  rd  rg  ri  rk  ro  rq  rB  r\  rg   rW   rU   r,  r,    sn    .77$&.
A4,>@@
..
.=$**
1-
))&#rW   r,  c                   Z    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)VLFTestsc                    dD ]  \  }}t        |      }| j                  t        |      |       t        |      }| j                  ||       | j                  |j                  t                      dD ]  }t        ||      }t        |      }| j                  t        |      t               | j                  ||       t        ||      }| j                  ||       | j                  |j                  |xs
 t                        y )N)
)   @rY   )   0rJ   )   8rK   )r  0000)rP  0001)    001101)s   @0000 1)s   z0000 000001)s   z0101 0100111 0011)s   z0101 0110111 001110)rH   rG   N)r   rM   r8   r9   rE   r   rN   r5  )rP   r;  r   rR   r-  rE   s         rU   rR  zVLFTests.test_explicit  s    
 	KGD! AYq\40$AQ"QXX'9';</ KQ'aL  a%0  D)dF+  A&  6+I5G5IJK%	KrW   c                    d}t        |      t        |      fD ]>  }t        |      }| j                  t	        |      t
               | j                  |d       @ d g dddddfD ]  }| j                  t        t        |        y )N0011 01r}  r   rs  rW   r  r4  )r   r   r8   rM   rN   r5  r^   r_   )rP   r   rR   rT   s       rU   r6  zVLFTests.test_encode_types  s    !nQ// 	-A!AT!We,Q,	-
 r1c35 	7AiA6	7rW   c           	         d}|t        |      t        |      t        ddg      t        |      fD ]W  }t        || j	                               }| j                  t        |      t               | j                  |t        d             Y dD ]  }| j                  t        t        |        d dt        dfD ](  }| j                  t        t        t        d	|g             * y )
Nr}  r  r   rD   r  )Nr   r\   r   gQ@r]   r  )rB  
memoryviewr  r9   rh  rM   rN   r   r^   r_   r:  )rP   r;  r   rR   argitems         rU   r<  zVLFTests.test_decode_types  s    T
Jt$4dD$<6HD/# 	5A!D$6$6$89AT!Wh/Q 34		5 # 	9CiC8	9 $%/ 	HDiD$4FG	HrW   c                     | j                  t        t        t        dg             | j                  t        t        ddd       | j                  t        t        dd       y )Nrx  rH   r   r]   )r^   r_   r9   rB  r`   r   s    rU   test_decode_argszVLFTests.test_decode_args  sD    )YgY@)YB*i%@rW   c                     dD ]O  \  }}t        |      }| j                  t        |      t        |             | j                  t	        |      d       Q y )N))s   @ABCrY   )s   @A00001A   )rB  rM   r9   r   rC  )rP   r   r2  r;  s       rU   test_decode_trailingzVLFTests.test_decode_trailing  sM    1 	/GAt!WFYv.?T&\2.		/rW   c                     dD ]%  }| j                  t        |      t                      ' dD ]&  }| j                  t        |      t        d             ( y )N)rx     Or  )      r  )rM   r9   r   )rP   r   s     rU   rT  zVLFTests.test_decode_ambiguity  sN    * 	7AYq\8:6	7! 	<AYq\8E?;	<rW   c                 T   t        d      }dD ]&  }| j                  t        |      t        |             ( t	        d      D cg c]  }t        t        d             }}t        dj                  d |D                    }|D ]  }| j                  t        |      |        y c c}w )Ns	   @08@,@ )rY   rJ   rK   rY   r  r  r  r   r   rW   c              3   2   K   | ]  }t        |        y wr?  )r8   rA  rR   s     rU   rB  z.VLFTests.test_decode_stream.<locals>.<genexpr>  s     <y|<   )rB  rM   r9   r   rL   r   r   rd  )rP   r;  r2  rQ   arraysrR   s         rU   test_decode_streamzVLFTests.test_decode_stream  s    =>? 	@DYv.?	@ 38+>Q')B-(>>chh<V<<= 	3AYv.2	3 ?s   B%c                 N   | j                  t        t        d       dD ]$  }| j                  t        d|d   z  t        |       & dD ]  }| j                  t        t        |        dD ]  }| j                  t        t        |g         | j                  t
        t        d g       y )NrW   )   p      P   `r  zinvalid head byte: 0x%02xr   )r  s   )r[   r  )r^   rQ  r9   r  r`   r_   )rP   r   r   s      rU   rN  zVLFTests.test_decode_errors  s    -C8
 	3A $$Z%@1Q4%G%.3		3 & 	;AmY:	;  	:Aj)aS9	: 	)Y7rW   c                     d}t        |ddgz  dgz   z  dgz         }t        |      D ]#  }d }	 t        |      }| j	                  |d u        % | j                  t        |      d       y # t        $ r Y <w xY w)NrI   r   rw  XXzend.)rB  rL   r9   r_   rq   rM   rC  )rP   r,  r   rQ   rR   s        rU   test_decode_invalid_streamz#VLFTests.test_decode_invalid_stream
  s    a4&jD6)*fX56q 	'AAaL OOAI&	' 	a&)  s   A**	A65A6c                     t        d      D ]Q  }t        d|dz  z         }|dz  dz   }| j                  t        |      |       | j                  t	        |      |       S y )NrI   r}   r   r  r  )rL   r   rM   r8   r9   )rP   rS   rR   r   s       rU   test_explicit_zeroszVLFTests.test_explicit_zeros  s]    s 	.Aa!a%i AGg%AYq\1-Yq\1-		.rW   c                    |j                         }t        |      }t        |      }| j                  |       | j	                  ||cxk(  xr |k(  nc        d}| j                  t        |      t        |      |z   dz   dz         |d   }|dz  dz	  }| j                  t        |      |z   dt        |      z  |z
         y )Nr   r  r   r   p   r}   )r  r8   r9   r  rq   rM   rl   )rP   rR   r-  r   rT   LEN_PAD_BITSheadpaddings           rU   rB  zVLFTests.round_trip  s    FFHaLaLqQ!$Q#a&<"7!";!ABt$;1$Q')1s1v:+DErW   c                 n    t        d      D ]'  }t        t        d            }| j                  |       ) y rt  )rL   r   r   rB  )rP   rQ   rR   s      rU   r  zVLFTests.test_large*  s0    r 	A	'*+AOOA	rW   c                 P    | j                         D ]  }| j                  |        y r?  )r  rB  rt   s     rU   r\  zVLFTests.test_random/  s&    %%' 	AOOA	rW   N)rd   re   rf   rR  r6  r<  r  r  rT  r  rN  r  r  rB  r  r\  rg   rW   rU   rv  rv    sG    K:7HA/<38(
*.F
rW   rv  c                   p    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zed        Zd Zy)IntegerizationTestsc                    | j                  t        t        d            d       | j                  t        t        d            d       | j                  t        t        dd            d       | j                  t        t        dd            d	       | j                  t        t        d
            d       | j	                  t
        t        t                      | j	                  t
        t        t                      | j	                  t        t        d       t        d      }|j                         }| j                  t        |      d       | j                  ||       y )NrJ   r   rK   r\   00101rH   r   rG   rk   r  r   r   r  r   )	rM   r4   r   r   r^   r`   r_   r  r{  rA  s      rU   test_ba2intzIntegerizationTests.test_ba2int7  s    .2.2% 891=( ;<bAt 45q9*fhj9*fn.>?)VU3UOFFHA&ArW   c                     | j                  d      D ]C  }t        |      }| j                  t        |      t        |             | j	                  ||       E y )Nr\   r  )r  r   rM   r4   r{  rA  s      rU   test_ba2int_frozenz&IntegerizationTests.test_ba2int_frozenF  sQ    %%A%. 	#Aq!AVAYq	2Q"	#rW   c                     | j                  d      D ]S  }t        |d      }| j                  ||       | j                  t        |      t	        |j                         d             U y )Nr\   r  rH   r   )r  r   rM   r4   r   rO   rA  s      rU   test_ba2int_randomz&IntegerizationTests.test_ba2int_randomL  s\    %%A%. 	:AE"AQ"VAYAFFHa(89	:rW   c                    t        dd      D ]q  }t        d|z        }t        |j                               }d}|j                  dk(  r|n
t        |      D ]  }|dz  }||z  } | j                  t        |      |       s y )Nr\   rC   r   r   rH   )rL   r   r  r  rE   reversedrM   r4   )rP   rS   rR   r-  r   rb   s         rU   test_ba2int_bytesz%IntegerizationTests.test_ba2int_bytesR  s    q" 	+A!a% A!))+&AA88u,a(1+ aQ VAY*	+rW   c                    | j                  t        d      t        d             | j                  t        d      t        d             | j                  t        d      t        d             | j                  t        dd	      t        d
d             | j                  t        dd	      t        dd             | j	                  t
        t        d       | j	                  t
        t        dd       | j	                  t        t        dd       | j	                  t
        t        ddd       | j	                  t        t        ddd       | j	                  t
        t        dd       y )Nr   rJ   r\   rK   r   r   r  rH   rD   rD  rG   r3  rZ   g      @r   rs  rR  rI   Tsigned)rM   r5   r   r{  r^   r_   r`   r   s    rU   test_int2bazIntegerizationTests.test_int2ba\  s   HSM2HSM2HUO4%0(5%2HI(3!%2	4)VS1)VQ4*fa3)VQC8*faU;)VS>rW   c                    dD ]  \  }}| j                  t        t        |d      d      |       | j                  t        t        |d d d   d      d      |       t        t        |            }| j	                  t        ||dd      t        |d             | j	                  t        ||dd      t        |d d d   d              y )N)rg  )rK   r[   )00r   )r   r\   )r   )r  r[   )r  r   )100r\   )010r   )rD  r   )r4  )r   )r3  r  )r  r[   )00000r   )11110r   )r  r  )r  r[   )z
00000000 0r   )z
11111111 0rA  )r0  i )z
11111111 1r[   rG   r\   r  r[   rH   )rM   r4   r   rl   r{  r5   )rP   r   r   len_ss       rU   test_signedzIntegerizationTests.test_signedk  s    
 	7DAq0 VHQ$9!DaHVHQttWe$<QGK$EVAuhqA%a24VAueA>%a"gu57=	7rW   c           	      0   dD ]  }t        d|      }| j                  |t        d|             t        dd      D ]V  }t        d||d      }t        |dz  |      }| j                  ||       d	D ]  }| j	                  t        ||
      d       ! X  y )NrG   rH   r   rD   rJ   r\   rI   Tr{  rE   r  r  r  )r5   r{  r   rL   rM   r4   )rP   rE   rR   rS   rT   r  s         rU   	test_zerozIntegerizationTests.test_zero  s    % 	BFq(AQV <=1c] B1QvdCQWf-  A&" BF$$VAf%=qAB	B	BrW   c                     dD ]`  }t        dd      D ]O  }t        d||d      }t        |dz  |      }| j                  ||       | j	                  t        |d      d       Q b y )	Nr  r\   rI   r[   Tr  rK   r  )rL   r5   r   r{  rM   r4   )rP   rE   rS   rR   rT   s        rU   test_negative_onez%IntegerizationTests.test_negative_one  sm    % 	=F1c] =2atDQWf-  A&  $!7<	=	=rW   c                    | j                  t        t        d       | j                  t        t        dd       | j                  t        t        dd       | j                  t        t        ddd       | j                  t        t        ddd       t        dd	      D ]m  }| j                  t        t        d|z  |       | j                  t        t        d|dz
  z  |d       | j                  t        t        d|dz
  z   dz
  |d       o y )
Nr[   r}   rw  r   r
  r\   r  irk   )r^   rK  r5   rL   r[  s     rU   test_int2ba_overflowz(IntegerizationTests.test_int2ba_overflow  s    -4-Q7-a8-QqA-aBq" 	(AmVQ!VQ?mVQ1q5\1%&  (mVqQU|_q5H!%&  (		(rW   c           	         | j                  t        t        dd       | j                  t        t        dd       | j	                  t        ddd      t        d             t        dd	      D ]  }t        d|d      }t        d|d
      }| j	                  |j                  d       | j	                  |j                  d
       | j	                  t        |      |      f | j	                  t        |      |       | j	                  |t        |dz
  dz        t        d      z          | j	                  |t        d      t        |dz
  dz        z          t        d|d      }t        d|d
      }| j	                  t        |      |       | j	                  t        |      |       | j	                  |t        |dz  d             | j	                  |t        |dz  d
             | j	                  t        d|z  dz
        t        |dz               | j	                  t        d|z  dz
  d
      t        |dz                y )Nr   rZ   r   r  rH   rz  000101r\   rI   rG   rJ   rK   r   rD   )	r^   r_   r5   r`   rM   r   rL   rE   rl   )rP   rS   abals       rU   test_int2ba_lengthz&IntegerizationTests.test_int2ba_length  s   )VQ4*fa3!E:!(+	-q# 	0A1e$B1h'BRYY.RYY1SWa()SWa(R1q5C-!88C=!HIR#1q5C-1H!HI1e$B1h'BSWa(SWa(R!c'5!9:R!c'8!<=VAFQJ/!c'1BCVAFQJx@%a#g.0%	0rW   c                 f   dD ]  \  }}t        |d      }t        |d d d   d      }| j                  t        |      t               dk(  r|n|       | j                  t        |d      |       | j                  t        |d      |       | j	                  t        |      t        |      |        y )N))r   rJ   )r\   rK   )r   r   )r   r  )r1  11001)i	  	100001001)iR8 1110000101001000011110rH   r[   rG   rD   )r   r{  r5   r   rM   r4   )rP   r   sar  r  s        rU   rR  z!IntegerizationTests.test_explicit  s    ; 
	8EAr "e$B"TrT(H-BVAY#5#75#@RbJVAe4b9VAh7<VBZQ7
	8rW   c                    dD ]R  }t        ||      }| j                  |       | j                  |j                  |       | j	                  t        |      dkD         |j                  dk(  r3| j	                  t        |      dk(  xs |j                  d      dk(         | j                  t        |      |       |dkD  r)| j                  |j                         t        |             |dk(  rt        t        d      |      |z   }n|t        t        d      |      z   }| j                  |j                  |       | j                  t        |      |       U y )NrH   rG   rD   r   rH   r\   r}   )r5   r  rM   rE   rq   rl   indexr4   rn  r   r   )rP   r   rE   rR   s       rU   check_round_tripz$IntegerizationTests.check_round_trip  s   % 	+Fq(ANN1QXXv.OOCFQJ'xx5 A! >qwwqzQ?VAY*1u  Q8)A,/!3ilF33QXXv.VAY*#	+rW   c           
      r    t        d      D ])  }| j                  t        dt        dd      z               + y )Nrk   r   r   r   )rL   r  r   r	   )rP   rQ   s     rU   	test_manyzIntegerizationTests.test_many  s5    r 	DA!!)B'!S/,A"BC	DrW   c                 ,    d|dz
  z  }| |z   | | z  z   S Nr   r\   rg   )r   num_bitsmasks      rU   twos_complementz#IntegerizationTests.twos_complement  s)     X\"T{a4%i((rW   c           
      R   | j                  d      D ]  }t        |d      }t        |t        |      |j                  d      }| j                  ||       t        |d      }|dk\  r| j                  ||       | j                  || j                  |t        |                    y )Nr\   r  Tr  Fr   )r  r4   r5   rl   rE   r{  rM   r  )rP   rR   r   rT   r  s        rU   test_random_signedz&IntegerizationTests.test_random_signed  s    %%A%. 		AAq&Aq#a&!((48AQ"q'AAv  A&Q 4 4QA ?@		ArW   N)rd   re   rf   r  r  r  r  r  r  r  r  r  r  rR  r  r  rn  r  r  rg   rW   rU   r  r  5  s`    #:+? 7D	B=(048+(D ) )

ArW   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)
MixedTestsc                 P   t        d      D ]  }t        d      }t        |      }| j                  |d d d       t	        |dd  d      }| j                  t        |      |       |j                         }| j                  ||dd         | j                  t        |d      |        y )Nrk   r   r   0brH   )rL   r   binrM   r   r4   rO   r   rP   rQ   r   r   rR   r  s         rU   test_binzMixedTests.test_bin	  s    r 	+A$AAAQrUD)12&AVAY*AQ!"&SAY*	+rW   c                 J   t        d      D ]  }t        d      }t        |      }| j                  |d d d       t	        d|dd  d      }| j                  t        |      |       t        d|      }| j                  ||dd         | j                  t        |d      |        y )Nrk   r   r   0or   rH   )rL   r   octrM   r3   r4   r2   r   r  s         rU   test_octzMixedTests.test_oct	  s    r 	+A$AAAQrUD)1QR5%(AVAY*1AQ!"&SAY*	+rW   c                 F   t        d      D ]  }t        d      }t        |      }| j                  |d d d       t	        |dd  d      }| j                  t        |      |       t        |      }| j                  ||dd         | j                  t        |d      |        y )Nrk   r   r   0xrH   r  )rL   r   hexrM   r1   r4   r0   r   r  s         rU   test_hexzMixedTests.test_hex	  s    r 	,A$AAAQrUD)que$AVAY*q	AQ!"&SBZ+	,rW   c                    | j                  d      D ]]  }t        t        |      |j                        }|j	                         }|j	                         }t        |      }t        |      }| j                  t        ||z        ||z         | j                  t        ||z        ||z         | j                  t        ||z        ||z         t        dt        |            }|j                  dk(  rZ| j                  t        ||z	        ||z	         t        t        |      d      |z   }| j                  t        ||z        ||z         | j                  ||       | j                  ||       ` y Nr\   r  r   rH   )
r  r   rl   rE   r  r4   rM   r	   r   r{  )	rP   rR   rT   r  r  r   r  rS   r-  s	            rU   test_bitwisezMixedTests.test_bitwise%	  s8   %%A%. 	$AA)ABBq	Aq	AVAE]AE2VAE]AE2VAE]AE23q6"Axx5   Qa8#a&%(1,  Qa8Q#Q##	$rW   c                 >   | j                  d      D ]  }t        t        |      |j                        }|j	                         }t        |      }t        |      }|j	                         }||z  }| j                  t        |      ||z         |j	                         }||z  }| j                  t        |      ||z         |j	                         }||z  }| j                  t        |      ||z         | j                  ||       t        dt        |            }|j                  dk(  s|j	                         }||z  }| j                  t        |      ||z	         t        t        |      d      |z   }||z  }| j                  t        |      ||z          y r  )
r  r   rl   rE   r  r4   rM   r{  r	   r   )rP   rR   rT   r  r   r  r-  rS   s           rU   test_bitwise_inplacezMixedTests.test_bitwise_inplace9	  sb   %%A%. 	4AA)ABq	Aq	AAFAVAYA.AFAVAYA.AFAVAYA.Q#3q6"Axx5 FFHa  AF3#a&%(1,a  AF3/	4rW   N)rd   re   rf   r  r  r  r  r  rg   rW   rU   r  r  	  s    	+	+	,$(4rW   r  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)SerializationTestsc                 Z   dD ]  \  }}}t        ||      }t        |      }| j                  ||       | j                  t        |      t               t        |      }| j                  ||       | j                  |j                  |       | j                  t        |      t                 y )N))r  rG   rY   )   rG   rK   )   rH   rK   )s   rH   r  )s    rG   11110000)s   rH   r  )s   rH   z10000111 110110)r   r.   rM   rN   r5  r/   rE   )rP   r;  rE   r2  rR   r   rT   s          rU   rR  z SerializationTests.test_explicitW	  s    #
 	0D&$ v&A!AT1%T!We,D!AQ"QXXv.T!Wh/#	0rW   c           	      Z   dddddddgt        dg      fD ]  }| j                  t        t        |        | j                  t        t               | j                  t        t        t	               d       t	        dd      t        dd      fD ]  }| j                  t        |      d        y )	NrJ   r   r\   r  r   r  rH   s   p)r  r^   r_   r.   r   r   rM   )rP   rb   rR   s      rU   test_serialize_argsz&SerializationTests.test_serialize_argsk	  s    aGS1a&)QC.@ 	7AiA6	7 	)Y/)Y
A>&%(.*GG 	8AYq\;7	8rW   c           
         ddddd dddddgf	D ]  }| j                  t        t        |        | j                  t        t               | j                  t        t        dd       d	}t        |      }|t	        |      t        |      |fD ]I  }t        |      }| j                  |j                         d
       | j                  |j                  d       K y )Nr   r\   FTrY   r   r   r  s   01100rG   )	r^   r_   r/   r   r  r  rM   rO   rE   )rP   rb   r;  r   rR   s        rU   test_deserialize_argsz(SerializationTests.test_deserialize_argsv	  s    AudD"dC!Q? 	9Aia8	9 	)[1)['1=TNy
4(8!; 	1AAAQVVXw/QXXx0	1rW   c           	           j                  t        t        d        fd}t        d      D ]  }t	        |g      }|dk(  s|dk(  r$ j                  t        |      t                      n# j                  t        t        |        ||       |j                  d       |dk  r3|dz  dk  r+ j                  t        |      t        d|dz  z
                j                  t        t        |        ||        y )NrW   c                 N    d| d   z  }j                  t        |t        |        y )Nzinvalid header byte: 0x%02xr   )r  r`   r/   )rT   r  rP   s     rU   	check_msgz8SerializationTests.test_invalid_bytes.<locals>.check_msg	  s%    /!A$6C$$Zk1ErW   r  r   r  r   r   )	r^   r`   r/   rL   r  rM   r   r   r   )rP   r  r   rT   s   `   rU   test_invalid_bytesz%SerializationTests.test_invalid_bytes	  s    *k37	F s 	A1#AAvb  Q<!!*k1=!HHQK2v!b&1*  Qq1q5y1AB!!*k1=!	rW   c                     dD ]L  \  }}t        |      }| j                  |j                         d       | j                  |j                  |       N y )N))r  rG   )s   rG   )s   rG   )r  rH   )s   rH   )s   rH   rK   )r/   rM   rO   rE   )rP   r;  rE   rR   s       rU   test_padbits_ignoredz'SerializationTests.test_padbits_ignored	  sM    
 
	/LD& D!AQVVXs+QXXv.
	/rW   c                     | j                         D ]a  }t        |      }t        |      }| j                  ||       | j                  |j                  |j                         | j                  |       c y r?  )r  r.   r/   rM   rE   r  r|  s       rU   r\  zSerializationTests.test_random	  s`    %%' 	A!AAAQ"QXXqxx0NN1	rW   N)	rd   re   rf   rR  r  r  r  r  r\  rg   rW   rU   r  r  U	  s     0(	81,/rW   r  c                       e Zd Zd Zd Zd Zy)HuffmanTreeTestsc                 >    i }| j                  t        t        |       y r?  )r^   
IndexErrorr:   rP   freqs     rU   r  zHuffmanTreeTests.test_empty	  s    *mT:rW   c                     ddi}t        |      }| j                  |j                  d       | j                  |j                  d       | j	                  t
        t        |d       y )NAr\   child)r:   rM   symbolr  r^   AttributeErrorgetattrrP   r  trees      rU   test_one_symbolz HuffmanTreeTests.test_one_symbol	  sQ    QxT"c*A&.'4ArW   c                    ddd}t        |      }| j                  t        t        |d       | j	                  |j
                  d       | j	                  |j                  d   j                  d       | j	                  |j                  d   j
                  d       | j	                  |j                  d   j                  d       | j	                  |j                  d   j
                  d       y )Nr\   r  r9  r  r   r   r  r9  )r:   r^   r  r  rM   r  r  r  r  s      rU   test_two_symbolsz!HuffmanTreeTests.test_two_symbols	  s    QT".'4BA&A--s3A++Q/A--s3A++Q/rW   N)rd   re   rf   r  r  r  rg   rW   rU   r  r  	  s    ;B0rW   r  c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)HuffmanTestsc                    dddd}t        |      }| j                  t        |      d       | j                  t        |d         d       | j                  t        |d         d       | j                  t        |d          d       y )	Nr   r   g?)r   asNr   r   r\   r  )r;   rM   rl   )rP   r  rX  s      rU   r}  zHuffmanTests.test_simple	  st    Qc*D!TA&T!Wq)T$Z!,T$Z!,rW   c                     dddd}dD ]Z  }t        ||      }| j                  t        |      d       |j                         D ]  }| j                  |j                  |         \ y )Nr   r   r   )r  r9  Cr  r   )r;   rM   rl   r  rE   )rP   r  rE   rX  r  s        rU   test_endiannesszHuffmanTests.test_endianness	  sf    aa(% 	3Ff-DSY*[[] 3  623	3rW   c                    | j                  t        t        dg       | j                  t        t        d       | j                  t        t        d        | j                  t        t        ddd       | j                  t        t        i        y )N)rR   r\   rs  rR   r\   r  )r^   r_   r;   r`   r   s    rU   test_wrong_argzHuffmanTests.test_wrong_arg	  sc    )\H:>)\37)\48)\13EF*lB7rW   c                    ddi}t        |      }| j                  |dt        d      i       t        d      D ]  }|dgz  }t               }|j	                  ||       | j                  |j                         |dz         | j                  t        |j                  |            |       |j                  d       | j                  t        t        |j                  |              y )NrR   r\   rJ   r}   )r;   rM   r   rL   r*  rO   r+  r  r   r^   r`   )rP   r  rX  rS   r  rR   s         rU   r  zHuffmanTests.test_one_symbol	  s    AhC Xc]34q 	@Ase)C
AHHT3QVVXq3w/T!((4.137HHQKj$?	@rW   c                     t        |      }t        |      }| j                  |j                         |       | j                  |j	                         d|z  dz
         | j                  |j                                y r  )rl   r   rM   todictnodesrq   complete)rP   rX  rS   r  s       rU   
check_treezHuffmanTests.check_tree	  s[    I$-q1uqy1(rW   c                    di }t        dz        D ]  }d||<   	 t        |      }| j                  t        |      dz         | j	                  t        fd|j                         D                     | j                  |       y )Nr  r\   c              3   :   K   | ]  }t        |      k(    y wr?  rl   rA  r  rS   s     rU   rB  z-HuffmanTests.test_balanced.<locals>.<genexpr>
       ?ACFaK?   )rL   r;   rM   rl   rq   r   r  r'  )rP   r  r   rX  rS   s       @rU   test_balancedzHuffmanTests.test_balanced	  sx    qAv 	ADG	D!TAF+???@rW   c           	          d}i }t        |      D ]
  }d|z  ||<    t        |      }| j                  t        |      |       t        |      D ]-  }| j                  t        ||         |t	        d|      z
         / | j                  |       y )N   r\   )rL   r;   rM   rl   r   r'  rP   rS   r  r   rX  s        rU   test_unbalancedzHuffmanTests.test_unbalanced
  s    q 	A1fDG	D!TA&q 	:ASa\1s1ay=9	:rW   c                     d}t        t        |            }t               }|j                  ||       | j	                  dj                  |j                  |            |       | j                  |       y )Nz,the quick brown fox jumps over the lazy dog.rY   )r;   r   r   r*  rM   rd  r  r'  )rP   messagerX  rR   s       rU   test_counterzHuffmanTests.test_counter
  sX    @GG,-J	w$0':rW   c                    t        t        d      d      }t        t        |            }t	               }|j                  ||       | j                  t        |j                  |            |       | j                  |       y )NrI   r   r   )
r   rL   r;   r   r   r*  rM   r+  r  r'  )rP   plainrX  rR   s       rU   test_random_listzHuffmanTests.test_random_list
  s^    c
c*GEN+J	uahhtn-u5rW   c           	          dddt        dd      fD ]>  }t        t        |      D ci c]  }|t                c}      }| j	                  |       @ y c c}w Nr   r   r}   r   rI  )r	   r;   rL   r
   r'  )rP   rS   r   rX  s       rU   test_random_freqzHuffmanTests.test_random_freq 
  sN    Aq'!S/) 	"AeAh ?FH ?@DOOD!	" ?s   A
N)rd   re   rf   r}  r  r!  r  r'  r.  r2  r5  r8  r;  rg   rW   rU   r  r  	  s5    -38@)	"rW   r  c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)CanonicalHuffmanTestsc           	         t        d      }t        t        |            \  }}}| j                  t	        |      t
               | j                  t	        |      t               | j                  t	        |      t               t               }|j                  ||       | j                  t        |j                  |            |       | j                  t        t        |||            |       y Ns,   the quick brown fox jumps over the lazy dog.)r  r<   r   rM   rN   dictr+  r   r*  r  r=   )rP   r7  chcrs   r  rR   s         rU   rV   z CanonicalHuffmanTests.test_basic*
  s    IJ.wu~>UFcD)ed+ft,J	e188C=159#3Auf#EFNrW   c           
         dddddd}t        |      \  }}}| j                  |t        d      t        d      t        d      t        d	      t        d
      d       | j                  |g d       | j                  |g d       t        d      }d}| j                  dj                  |j	                  |            |       | j                  dj                  t        |||            |       y )Nr   r   r\   r   )rR   rT   r-  dr   rJ   r   r  1111rD  )r   r\   r\   r\   r   )rR   rT   r   r-  rC  01011001110011110101100abracadabrarY   )r<   rM   r   rd  r  r=   )rP   r  codedictrs   r  rR   r  s          rU   test_examplez"CanonicalHuffmanTests.test_example5
  s    AAAA6"3C"8%#)1$)1&)9)1&)9)1%	$: 	;
 	0!:;./(!34c:!1!UF!CDcJrW   c                    | j                  t        t        g        | j                  t        t        i        | j                  t        t               t	        t        d            }| j                  t        t        |d       y )NaabcrR   )r^   r_   r<   r`   r;   r   )rP   r  s     rU   test_canonical_huffman_errorsz3CanonicalHuffmanTests.test_canonical_huffman_errorsD
  s\    )%6;*&7<)%6776?+)%6SArW   c           
         ddi}t        |      \  }}}| j                  |dt        d      i       | j                  |ddg       | j                  |dg       t        d      D ]  }|dgz  }t               }|j	                  ||       | j                  |j                         |dz         | j                  t        t        |||            |       |j                  d       | j                  t        t        t        |||              y )NrR   r\   rJ   r   r}   )r<   rM   r   rL   r*  rO   r+  r=   r   r^   r`   )rP   r  rA  rs   r  rS   r  rR   s           rU   r  z%CanonicalHuffmanTests.test_one_symbolL
  s    Ah.s3UFsHSM23A'#'q 	BAse)C
AHHS#QVVXq3w/T"21eV"DEsKHHQKj$.q%@B	BrW   c                    t        d      }dg}| j                  t        t        dddg|       | j                  t        t        |ddh|       | j                  t        t        |ddg|       | j                  t        t        |ddg|       | j                  t        t        |ddgd       g d	}| j                  t        d
t        |g d|       | j                  t        dt        |ddgz  |       y )Nr  rR   r  r   r\   rZ   l             r   )rR   rT   r-  rC  z#sum(count) = 3, but len(symbol) = 4)r   r\   r   z#len(count) cannot be larger than 32r  )r   r^   r_   r=   rK  r  r`   )rP   rR   r   r  s       rU   test_canonical_decode_errorsz2CanonicalHuffmanTests.test_canonical_decode_errors\
  s    VE)%5taVQG)%5q1a&!D)%5q1c(AF-)91q'lAN)%5q1a&"E%  !F!11i	I 	  !F!11bA3h	HrW   c           	          t               }t        dd      D ]  }ddgz  }d||<   | j                  t        d|d|z  fz  t        ||g        d|z  }|||<   |dk(  r't
        dk(  r| j                  t        t        ||g        j| j                  t        d|z  t        ||g        |dz   ||<   | j                  t        d	||||   fz  t        ||g         t	        |ddgz  g       }| j                  t        |      g        y )
Nr\   r   r   r[   z count[%d] not in [0..%d], got -1r   r}   z$sum(count) = %d, but len(symbol) = 0z count[%d] not in [0..%d], got %d)
r   rL   r  r`   r=   r   r^   rK  rM   r+  )rP   rR   r   rs   maxbitsrB  s         rU   !test_canonical_decode_count_rangez7CanonicalHuffmanTests.test_canonical_decode_count_ranget
  s   Jq" 	0A!HEE!H$$Z2aa[@ !UB0 1fGE!HBw7a<!!-"2AubB$$Z6@ !UB0 {E!H$$Z2a%(5KK !UB0'	0.  28R0dR(rW   c                    g d}ddddgddig}t        d      }| j                  t        t        |||            |       | j                  t        t        |d|            |       | j                  t        t        d	|z  ||            d	|z         g d
}| j                  t        t        |||            |       | j                  t        t        |g d|            |       | j                  t        t        |g d|            |       g d}| j                  t        t        |||            |       | j                  t        t        ||t	        |                  |       | j                  t        t        ||t        |                  |       | j                  t        t        ||t        |                  |       | j                  t        t        ||t        |                  |       y )N)r   r   r}   r  *   y333333?y              @r9  r  z00 01 10 11r   )r   r   r}   r   r   r   r   r   )ir   r}   )Nr   r}   )r  B   r   b   )r   rM   r+  r=   r  tupler5  rB  )rP   r  r   rR   rs   s        rU   test_canonical_decode_simplez2CanonicalHuffmanTests.test_canonical_decode_simple
  s   "xnsAh/]#.q#q9:A>.q)Q?@!D.q1uc1=>AF(.q%;<a@.q+qABAF.q,BCQG .q#q9:A>.q#y|DEqI.q#uQx@A1E.q#uQx@A1E 	.q#tAw?@!DrW   c           
      8   t               }| j                  t        t        |g g             g        |j	                  d       | j                  t        dt        t        |g g              t        d      }| j                  t        dt        t        |g g              y )Nr   reached end of bitarray0000000000000000000000000000000ran out of codes)r   rM   r+  r=   r   r  r`   rt   s     rU   test_canonical_decode_emptyz1CanonicalHuffmanTests.test_canonical_decode_empty
  s    J.q"b9:B?	  -F!%'72r'B	DX  -?!%'72r'B	DrW   c           	         dg}ddg}t        d      }| j                  t        t        |||            d|z         |j	                  d       |j                  t        d             t        |||      }| j                  t        dt        |       |j                  t        d             t        |||      }| j                  t        d	t        |       y )
Nr  r   r\   r  r   
0000000000rY  00000000000000000000r[  )r   rM   r+  r=   r   r  r  r`   )rP   symbolsrs   rR   iterators        rU    test_canonical_decode_one_symbolz6CanonicalHuffmanTests.test_canonical_decode_one_symbol
  s    %AUO.q%ABW	&		(#$#Aug6  -F!%x	1 	
(#$#Aug6  -?!%x	1rW   c           	         t        t        d      5 }t        |j                               }d d d        | j	                  t              dkD         t        t        |            \  }}}t               }|j                  ||       | j                  t        t        |||            |       | j                  |||       y # 1 sw Y   xY w)NrbiP  )re  __file__r  rf  rq   rl   r<   r   r   r*  rM   r=   
check_code)rP   ra   r  rG  rs   r  rR   s          rU   test_canonical_decode_largez1CanonicalHuffmanTests.test_canonical_decode_large
  s    (D! 	&QAFFH%C	&C5()"3GCL"A%J	3#3Auf#EFL%0	& 	&s   B>>Cc                    t        d      t        t                    \  }}}| j                  |||       t	               }|j                  |dz         t        |||      fd}| j                   |              t        d      ||j                  t        d            <   | j                   |       t        d             |d d = | j                  t        |       y )Ns   Hello World!r   c                  P    t         fdt        t                    D              S )Nc              3   4   K   | ]  }t                y wr?  )rC  )rA  rQ   its     rU   rB  zdCanonicalHuffmanTests.test_canonical_decode_symbol_change.<locals>.decode_one_msg.<locals>.<genexpr>
  s     ?!T"X?   )r  rL   rl   )rk  r  s   rU   decode_one_msgzQCanonicalHuffmanTests.test_canonical_decode_symbol_change.<locals>.decode_one_msg
  s    ?uSX???rW   r{   ls   Hekko Workd!)r  r<   r   rf  r   r*  r=   rM   r  r  r^   r
  )rP   rG  rs   r  rR   rm  rk  r  s         @@rU   #test_canonical_decode_symbol_changez9CanonicalHuffmanTests.test_canonical_decode_symbol_change
  s    ("3GCL"A%%0J	28$a/	@ 	)3/),Sv||CH%&)9_+EF1I*n5rW   c                     t        t        |      dz
        D ];  }|||      }|||dz         }| j                  t        |      t        |      k         = y )Nr\   )rL   rl   rq   r4   )rP   rA  r  r   rR   rT   s         rU   ensure_sortedz#CanonicalHuffmanTests.ensure_sorted
  sV    s6{Q' 	3AF1IAF1q5M"AOOF1Iq	12	3rW   c                 <   d}t        |      D ]  \  }}t        |||z   dz
        D ]m  }|||      }|||dz         }	| j                  t        |      t        |	      cxk(  xr |k(  nc        | j	                  t        |      dz   t        |	             o ||z  } y r  )rE  rL   rq   rl   rM   r4   )
rP   rA  rs   r  r  rX  r  r   rR   rT   s
             rU   ensure_consecutivez(CanonicalHuffmanTests.ensure_consecutive
  s    #E* 	JE35%#+/2 ; q	Nq1u&A#a& 9E 9:  Qq	:; SLE	rW   c                 D   t        |      dz
  }| j                  |t        d |j                         D                     |dz   dgz  }|j                         D ]4  }| j                  |j                  d       |t        |      xx   dz  cc<   6 | j                  ||       y )Nr\   c              3   2   K   | ]  }t        |        y wr?  r*  r  s     rU   rB  z5CanonicalHuffmanTests.ensure_count.<locals>.<genexpr>
  s     %Cc!f%Cr  r   rH   )rl   rM   r   r  rE   )rP   rA  rs   rP  my_countrR   s         rU   ensure_countz"CanonicalHuffmanTests.ensure_count
  s    e*q.#%Ccjjl%C"CDaKA3& 	"AQXXu-SV!	" 	5)rW   c                     t              t        fdt        d      D              }| j                  |dz         y )Nc              3   4   K   | ]  }|   |z
  z    y wr?  rg   )rA  r   rs   len_cs     rU   rB  z8CanonicalHuffmanTests.ensure_complete.<locals>.<genexpr>  s     AAaUQY'Arl  r\   )rl   r   rL   rM   )rP   rs   rb   rz  s    ` @rU   ensure_completez%CanonicalHuffmanTests.ensure_complete  s6    E
Aq%AAAJ'rW   c                 X    t        |      }| j                  |j                                y r?  )r   rq   r&  )rP   rA  dts      rU   ensure_complete_2z'CanonicalHuffmanTests.ensure_complete_2  s    _&rW   c                     t        |d      }t               }|j                  ||       t        |||      }~~~| j	                  t        |      j                  d       | j	                  t        |      |       y )Nr   r   canonical_decodeiter)r   r   r*  r=   rM   rN   rd   r+  )rP   rA  rs   r  r  rR   rk  s          rU   ensure_round_tripz'CanonicalHuffmanTests.ensure_round_trip  sg    f#J	ca/ufb**,BCb3'rW   c                 D   | j                  t        |      t        |      cxk(  xr t        |      k(  nc        | j                  |d   d       | j                  t	        |      t	        |      k(         | j                  ||d      j                                | j                  ||d      d          | j                  ||       | j                  |||       | j                  ||       | j                  |       | j                  |       | j                  |||       y )Nr   r[   )rq   rl   r   rM   r   r   r  rq  rs  rw  r{  r~  r  )rP   rA  rs   r  s       rU   rf  z CanonicalHuffmanTests.check_code  s    CCK=3u:=>q1%CCK/0F2J++-.VAY*+3'UF3#u%U#s#sE62rW   c                 `    t        d      }t        |      } | j                  t        |        y r?  )r  r   rf  r<   )rP   r7  r  s      rU   test_simple_counterz)CanonicalHuffmanTests.test_simple_counter+  s*    IJen*3/0rW   c                 >    ddd} | j                   t        |        y )Nr\   )Nr  )rf  r<   r  s     rU   test_no_compz"CanonicalHuffmanTests.test_no_comp0  s     a *401rW   c                     di }t        dz        D ]  }d||<   	 t        |      \  }}}| j                  t        |      dz         | j	                  t        fd|j                         D                     | j                  |||       y )Nr   r\   c              3   :   K   | ]  }t        |      k(    y wr?  r*  r+  s     rU   rB  z6CanonicalHuffmanTests.test_balanced.<locals>.<genexpr>;  r,  r-  )rL   r<   rM   rl   rq   r   r  rf  )rP   r  r   rX  rs   symrS   s         @rU   r.  z#CanonicalHuffmanTests.test_balanced4  s    qAv 	ADG	,T2eSTAF+???@eS)rW   c           	      4   d}i }t        |      D ]
  }d|z  ||<    t        |      d   }| j                  t        |      |       t        |      D ]-  }| j                  t        ||         |t	        d|      z
         /  | j
                  t        |        y )Nr   r\   r   )rL   r<   rM   rl   r   rf  r1  s        rU   r2  z%CanonicalHuffmanTests.test_unbalanced>  s    q 	A1fDG	 &q)TA&q 	:ASa\1s1ay=9	:*401rW   c                     dddt        dd      fD ];  }t        |      D ci c]  }|t                }} | j                  t	        |        = y c c}w r:  )r	   rL   r
   rf  r<   )rP   rS   r   r  s       rU   r;  z&CanonicalHuffmanTests.test_random_freqI  sT    Aq'!S/) 	6A).q2AAvxK2D2DOO.t45	62s   AN)rd   re   rf   rV   rH  rK  r  rN  rQ  rW  r\  rb  rg  ro  rq  rs  rw  r{  r~  r  rf  r  r  r.  r2  r;  rg   rW   rU   r=  r=  (
  s}    	OKBB H0)8EB	D1"16"3
*('
	(3 1
2*	26rW   r=  __main__)s__doc__rb  r   r   r  r  r  rr  r^  rg  r`  unittestior   	functoolsr   r
   r   r   r   r   r	   r   r   stringr   r   collectionsr   r   r   r   r   r   bitarray.test_bitarrayr   r   r   r   r   bitarray.utilr   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   TestCaserA   ri   rw   r   HAVE_BINOMIALVARIATEr   r   r   r9  rp  r  r  r  r  r  r  r$  r1  rP  r_  re  r  r  r  r  r,  rv  r  r  r  r  r  r=  rd   mainrg   rW   rU   <module>r     s  
 
 
           " " " ( * * L L	 	 	 	 	 	 	 	 	 	 )"7X&& "7L>8$$ >DV;X&& V;t ''+w6 Dx00 D D   !L+X&& L+ "L+`O)"" O)fC"(## C"N>(""D >(DJ.8$$d J.\P2))4 P2hO2h'' O2f-#(##T -#b"*** "*L ])H%% ]) ])BA(## AB0X&& 0fA ADDn D:L))4 L`(+#X&& +#^d.8$$d d.PJ!!4 J\Z#x  $ Z#|Qx  $ QjIA(++T IAZO4""D O4fY**D Yz0x(( 00Z"8$$ Z"|d6H--t d6P	 zHMMO rW   