o
    OZŽhÓ  ã                   @   sX  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	Z	d dl	m
Z
 de ¡ kZg d¢Zg d¢Zdd	gZd
gZdd„ eD ƒZddd	d dœZG dd„ dƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG d d!„ d!ejƒZed"krªe ¡  dS dS )#é    N©Úarray)Úexample_path)ÚmixerÚPyPy)i+  é"V  éD¬  i€»  )éðÿÿÿéøÿÿÿé   é   é   é   iÐ  c                 C   s,   g | ]}t D ]}tD ]}|||d œ‘q
qqS ))Ú	frequencyÚsizeÚchannels)ÚSIZESÚCHANNELS)Ú.0ÚfÚsÚc© r   úF/var/www/auris/lib/python3.10/site-packages/pygame/tests/mixer_test.pyÚ
<listcomp>   s    ýü
ý
ÿr   r   é    )r   r   r   Úallowedchangesc                   @   s   e Zd ZdZdZdS )ÚInvalidBoolz!To help test invalid bool values.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__bool__r   r   r   r   r   &   s    r   c                   @   sb  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Ze ej d¡d¡e ed¡dd„ ƒƒZdd„ Ze ej d¡dkd¡dd„ ƒZdd „ Zd!d"„ Zd#d$„ Ze ej d%¡e ed&¡d'd(„ ƒƒZe ej d%¡e ed&¡d)d*„ ƒƒZd+d,„ Zd-d.„ Z d/d0„ Z!ej"d1d2„ ƒZ#d3d4„ Z$d5d6„ Z%d7d8„ Z&d9d:„ Z'd;d<„ Z(d=d>„ Z)d?d@„ Z*dAS )BÚMixerModuleTestc                 C   s   t  ¡  t  dddd¡ d S )Nr   )r   ÚquitÚpre_init©Úselfr   r   r   ÚtearDown0   ó   zMixerModuleTest.tearDownc                 C   s`   t jdi t¤Ž t  ¡ }|  |d td ¡ |  t|d ƒttd ƒ¡ |  |d td ¡ d S ©Nr   r   r   r   r   r   r   )r   ÚinitÚCONFIGÚget_initÚassertEqualÚabsÚassertGreaterEqual©r'   Z
mixer_confr   r   r   Útest_init__keyword_args4   s
   z'MixerModuleTest.test_init__keyword_argsc                 C   sh   t jdi t¤Ž t  ¡  t  ¡ }|  |d td ¡ |  t|d ƒttd ƒ¡ |  |d td ¡ d S r*   )r   r%   r,   r+   r-   r.   r/   r0   r1   r   r   r   Útest_pre_init__keyword_args>   s   z+MixerModuleTest.test_pre_init__keyword_argsc                 C   sh   t  ddd¡ t  ddd¡ t jdd |  t  ¡ d d¡ |  t  ¡ d d¡ |  t  ¡ d d¡ d S )	Nr   r
   r   r   ©r   r   r	   r   )r   r%   r+   r.   r-   r0   r&   r   r   r   Útest_pre_init__zero_valuesJ   s   z*MixerModuleTest.test_pre_init__zero_valuesc                 C   s4   t jddddd t  ddd¡ |  t  ¡ d¡ d S )Nr   r   r   r   r4   )r   r   r   )r   r%   r+   r.   r-   r&   r   r   r   Útest_init__zero_valuesT   s   z&MixerModuleTest.test_init__zero_valuesc                 C   s   |   t ¡ ¡ d S ©N)ÚassertIsNoner   r-   r&   r   r   r   Ú4test_get_init__returns_None_if_mixer_not_initializedn   ó   zDMixerModuleTest.test_get_init__returns_None_if_mixer_not_initializedc                 C   s   t  ¡  |  t  ¡ d¡ d S )Nr   )r   r+   r.   Úget_num_channelsr&   r   r   r   Ú0test_get_num_channels__defaults_eight_after_initq   r)   z@MixerModuleTest.test_get_num_channels__defaults_eight_after_initc                 C   sB   t  ¡  t  ¡ }td|d ƒD ]}t  |¡ |  t  ¡ |¡ qd S )Nr   )r   r+   r;   ÚrangeZset_num_channelsr.   )r'   Údefault_num_channelsÚir   r   r   Útest_set_num_channelsu   s   
þz%MixerModuleTest.test_set_num_channelsc                 C   s$   t  ¡  t  ¡  |  tjt j¡ dS )zXget_num_channels() Should throw pygame.error if uninitialized
        after mixer.quit()N)r   r+   r$   ÚassertRaisesÚpygameÚerrorr;   r&   r   r   r   Ú	test_quit}   s   zMixerModuleTest.test_quitÚwinzSee github issue 892.zrandom errors here with pypyc                 C   sš  dd„ }t  ¡  d}ttj dd¡ƒ}t|ƒ}| t 	¡ ¡}t j
|d}|  | ¡ dk¡ ||ƒ}|  t|ƒdk¡ |  |t  
|¡ƒ|¡ |  |t j
|dƒ|¡ |  |t  
|¡ƒ|¡ d	}|  t¡}	t  
¡  W d   ƒ n1 srw   Y  |  t|	jƒ|¡ |  t¡}	t j
||d
 W d   ƒ n1 s—w   Y  |  t|	jƒ|¡ |  t¡}	t j
||d W d   ƒ n1 s¼w   Y  |  t|	jƒ|¡ |  t¡}	t j
||d W d   ƒ n1 sáw   Y  |  t|	jƒ|¡ |  t¡}	t j
|d W d   ƒ n	1 sw   Y  |  t|	jƒd¡ t j
|fi i ¤Ž}|  ||ƒ|¡ t j
g i d|i¤Ž}|  t¡}	t  
g ¡ W d   ƒ n	1 sEw   Y  |  t|	jƒd¡ |  t¡}	t j
g d
}W d   ƒ n	1 sjw   Y  d}
|  t|	jƒ|
¡ d}|  tt j
|¡ |  tt j
d¡ |  t¡}	t j
dd
 W d   ƒ n	1 s£w   Y  d}
|  t|	jƒ|
¡ |  |t j
|d
ƒ|¡ t|ƒtkrÓ|t  
|¡ƒ}|  ||¡ |  |t j
|dƒ|¡ |  |t  
|¡ƒ|¡ t  
|¡}|  t¡}	t j
||d W d   ƒ n	1 sw   Y  |  t|	jƒ|¡ |  t¡}	t j
||d W d   ƒ n	1 s-w   Y  |  t|	jƒ|¡ t j
|d}|  | ¡ | ¡ ¡ d S )Nc                 S   s   |   ¡ S r7   )Úget_raw)Úsndr   r   r   Ú	get_bytesˆ   s   z2MixerModuleTest.test_sound_args.<locals>.get_bytess0    ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÚdataúhouse_lo.wav©Úfileç      à?éè  z5Sound takes either 1 positional or 1 keyword argument©Úbuffer)rP   rL   )Zfoobarz&Unrecognized keyword argument 'foobar'rL   z!Unrecognized argument (type list)z1Expected object with buffer interface: got a listZ12345678Z	somethingz+Unicode object not allowed as buffer objectr   )rP   r   )r   r+   r   ÚosÚpathÚjoinÚstrÚencodeÚsysÚgetfilesystemencodingÚSoundÚ
assertTrueÚ
get_lengthÚlenr.   rA   Ú	TypeErrorÚ	exceptionÚIOErrorÚtyperF   )r'   rH   ÚsampleZ	wave_pathZ
uwave_pathZ
bwave_pathrG   Z	snd_bytesZarg_emsgÚcmZemsgZ
ufake_pathZ	somebytesZsnd2r   r   r   Útest_sound_args…   sŽ   
ÿÿÿÿÿÿÿÿ
ÿÿzMixerModuleTest.test_sound_argsc              	   C   s²   t  ¡  ddl}tdƒ}tj |d¡}tj |d¡}| ||¡ zt|dƒ}W d  ƒ n1 s1w   Y  W n t	yC   t
 d¡‚w zt  |¡}~W t |¡ dS t |¡ w )ztest non-ASCII unicode pathr   NrI   u
   ä½ å¥½.wavrJ   Úrbzthe path cannot be opened)r   r+   Úshutilr   rQ   rR   rS   ÚcopyÚopenÚOSErrorÚunittestZSkipTestrX   Úremove)r'   rd   ÚepÚ	temp_fileZorg_filer   Úsoundr   r   r   Útest_sound_unicodeÔ   s$   ÿ€
ÿ
z"MixerModuleTest.test_sound_unicodeZSDL_AUDIODRIVERZdiskz'this test fails without real sound cardc           $   
   C   sÔ  zddl m}m}m}m}m}m}m}m}m	}	 W n t
y&   |  d¡ Y nw d}
g d¢}ddg}dd	„ |D ƒ}|dd
d|	ƒ}| |¡}| |¡}dd„ |||fD ƒ}|D ]}|dkrb||  |¡ qU|ddd|ƒ}| |¡}| |¡}dd„ |||fD ƒ}|D ]}|dk r||  |¡ q€||jd dg|	ƒ}||d d …df< d| |d d …df< | |¡}| |¡}dd„ |||fD ƒ}|D ]}|dkrÍ||  |¡ qÀ||jd dg|ƒ}||d d …df< d| |d d …df< | |¡}| |¡}dd„ |||fD ƒ}|D ]}|dk r||  |¡ q |D ]U}|D ]O}z	t |
||¡ W n tjy-   Y qw z2t ¡ \} }!}"|!|ks@|"|krGW t ¡  q|| D ]\}"}#|  ||#|"|k¡ qKW t ¡  qt ¡  w qd S )Nr   )	r   ÚarangeÚzerosÚint8Úuint8Úint16Úuint16Úint32Úuint32zrequires numpyr   )r
   r   r	   r   r   r   c                 S   s   i | ]}|g “qS r   r   )r   r   r   r   r   Ú
<dictcomp>  s    z6MixerModuleTest.test_array_keyword.<locals>.<dictcomp>é   c                 S   ó   g | ]}d |f‘qS ©r   r   ©r   Úar   r   r   r     ó    z6MixerModuleTest.test_array_keyword.<locals>.<listcomp>i€ÿÿÿé€   c                 S   rx   ry   r   rz   r   r   r   r     r|   éÿ   c                 S   rx   ©r   r   rz   r   r   r   r     r|   éÿÿÿÿc                 S   rx   r   r   rz   r   r   r   r     r|   )Únumpyr   rn   ro   rp   rq   rr   rs   rt   ru   ÚImportErrorÚskipTestÚastypeÚextendÚshaper   r+   rB   rC   r-   r$   Ú_test_array_argument)$r'   r   rn   ro   rp   rq   rr   rs   rt   ru   ÚfreqÚformat_listZchannels_listZa_listsZ	a32u_monoZ	a16u_monoZa8u_monoZau_list_monoÚformatZ	a32s_monoZ	a16s_monoZa8s_monoZas_list_monoZa32u_stereoZa16u_stereoZ
a8u_stereoZau_list_stereoZa32s_stereoZa16s_stereoZ
a8s_stereoZas_list_stereor   Ú__r   r   r{   r   r   r   Útest_array_keywordé   s~   0ÿ

€

€

€


€þýÿòÿz"MixerModuleTest.test_array_keywordc           
      C   sÂ   ddl m}m} ztj|d}W n ty(   |sY d S |  d||jf ¡ Y nw |s5|  d||jf ¡ ||ƒ}| |j¡}t	|ƒd|j
  }	|	dkrP||	K }|  |||kƒd||jf ¡ d S )Nr   )r   Úallr   z&Raised ValueError: Format %i, dtype %sz-Did not raise ValueError: Format %i, dtype %sr   zFormat %i, dtype %s)r   r   r   r   rX   Ú
ValueErrorÚfailZdtyper„   r/   ÚitemsizerY   )
r'   rŠ   r{   Z	test_passr   Zall_rG   Za2Úa3Úlshiftr   r   r   r‡   4  s$   ýÿ"z$MixerModuleTest._test_array_argumentc                 C   s   | j ttj|d d S )Nr   )rA   rŽ   r   rX   )r'   r{   r   r   r   Ú_test_array_interface_failI  s   z*MixerModuleTest._test_array_interface_failc                 C   s–   t jddddd t jdd}|j}|  t|tƒ¡ t ¡ tj	kr$d}nd	}|  
|d
 |¡ |  
|d d¡ |  
|d d¡ |  
|d |jdf¡ d S )Nr   r	   r   r   r4   s(                       rO   z<i2z>i2Útypestrr†   )é   Ústridesr   rI   F)r   r+   rX   Z__array_interface__rY   Ú
isinstanceÚdictrB   Úget_sdl_byteorderÚ
LIL_ENDIANr.   Ú_samples_address)r'   rG   Údr”   r   r   r   Útest_array_interfaceL  s   z$MixerModuleTest.test_array_interfaceznewbuf not implementedzpypy no likeyc                 C   ó   t  ddd¡ |  ¡  d S )Nr   r	   r   ©r   r+   Ú_NEWBUF_export_checkr&   r   r   r   Útest_newbuf__one_channelZ  ó   z(MixerModuleTest.test_newbuf__one_channelc                 C   rž   )Nr   r	   r   rŸ   r&   r   r   r   Útest_newbuf__twho_channel`  r¢   z)MixerModuleTest.test_newbuf__twho_channelc              	   C   sŠ  t  ¡ \}}}|dkrdnd}t|ƒd }dddddd	d
ddœ}|| }ddlm} |j}	|j}
t ¡ tj	k}|r;dnd\}}d|fd |… }|| |fd| d … }|	||d d}t j
|d}t|ƒ| | }|
||jƒ}|  |jd¡ |  |jd u ¡ |  |j|¡ |  |j|¡ |  |jd u ¡ |  |jd u ¡ |  |jd u ¡ |  |j¡ |  |j|j¡ |
||jƒ}|  |jd¡ |  |jd u ¡ |  |j|¡ |  |j|¡ |  |jd u ¡ |  |jd u ¡ |  |jd u ¡ |  |j¡ |  |j|j¡ |
||jƒ}|  |jd¡ |  |j|¡ |  |j|¡ |  |j|¡ |  |jd u ¡ |  |jd u ¡ |  |jd u ¡ |  |j¡ |  |j|j¡ |
||jƒ}|  |j|¡ |  |jd u ¡ |  |j|¡ |  |j|¡ |  |j|¡ |  |jd u ¡ |  |jd u ¡ |  |j¡ |  |j|j¡ |
||jƒ}|  |j|¡ |  |jd u ¡ |  |j|¡ |  |j|¡ |  |j|¡ |  |j|¡ |  |jd u ¡ |  |j¡ |  |j|j¡ |
||jƒ}|  |j|¡ |  |j|¡ |  |j|¡ |  |jd¡ |  |j|¡ |  |j|¡ |  |jd u ¡ |  |j¡ |  |j|j¡ |
||jƒ}|  |j|¡ |  |j|¡ |  |j|¡ |  |j|¡ |  |j|j¡ |  |j|¡ |  |jd u ¡ |  |j¡ |  |j|j¡ |
||jƒ}|  |j|¡ |  |jd u ¡ |  |j|¡ |
||jƒ}|  |j|¡ |  |jd u ¡ |  |j|¡ |dkrº|
||j ƒ}|  |jd¡ |  |jd u ¡ |  |j|¡ d S |  !t"|
||j ¡ d S )Nr   r   r   ÚBÚbz=Hz=hz=Iz=iz=Qz=q)r   r
   r   r	   r   iàÿÿÿé@   iÀÿÿÿr   )Úbuftools)ú<ú>)r©   r¨   é
   r?   )rŠ   r   )#r   r-   r/   Úpygame.tests.test_utilsr§   ÚExporterÚImporterrB   r™   rš   rX   r[   ZPyBUF_SIMPLEr.   ÚndimrY   rŠ   r   r†   r–   Ú
suboffsetsÚassertFalseÚreadonlyÚbufr›   ZPyBUF_WRITABLEZPyBUF_FORMATZPyBUF_NDZPyBUF_STRIDESZPyBUF_FULL_ROZPyBUF_C_CONTIGUOUSZPyBUF_ANY_CONTIGUOUSZPyBUF_F_CONTIGUOUSrA   ÚBufferError)r'   rˆ   Úfmtr   r®   r   ÚformatsrŠ   r§   r¬   r­   Zis_lil_endianZfsysZfrevr†   r–   ÚexprG   ÚbuflenÚimpr   r   r   r    f  sÖ   ø

z$MixerModuleTest._NEWBUF_export_checkc                 C   sh   t  ¡ du r
t  ¡  tj  tdƒ¡}tj  ¡ }| |¡ d}| |¡ tj	 
|d ¡ |  | ¡ ¡ dS )zHEnsure pygame.mixer.fadeout() stops playback after fading out the sound.Núdata/house_lo.wavéÈ   é   )r   r-   r+   rB   rX   r   Úfind_channelÚplayÚfadeoutÚtimeÚwaitr°   Úget_busy)r'   rl   ÚchannelÚfadeout_timer   r   r   Útest_fadeoutÖ  s   


zMixerModuleTest.test_fadeoutc                 C   sâ   t  ¡  ttj dd¡ƒ}t j|d}t  ¡ }|dkrot  ¡ }|  	|¡ g }t
d|ƒD ]}t  |¡}| |¡ | |¡ q+t  ¡ }|  |¡ t  d¡}|  	|¡ t jdd}|  	|¡ |D ]}| ¡  q]t  ¡ }|  	|¡ d S d S )NrI   rJ   rK   r   T)Úforce)r   r+   r   rQ   rR   rS   rX   r;   r¼   ZassertIsNotNoner=   ÚChannelr½   Úappendr8   Ústop)r'   Úfilenamerl   Znum_channelsZfound_channelr   Z
channel_idrÂ   r   r   r   Útest_find_channelä  s.   







æz!MixerModuleTest.test_find_channelc                 C   sd   t  ¡ du r
t  ¡  t  tdƒ¡}t  ¡ }| |¡ t  ¡  |  | 	¡ ¡ t  
¡  |  | 	¡ ¡ dS )zMEnsure pygame.mixer.pause() temporarily stops playback of all sound channels.Nr¹   )r   r-   r+   rX   r   r¼   r½   Úpauser°   rÁ   ÚunpauserY   ©r'   rl   rÂ   r   r   r   Ú
test_pause  s   
zMixerModuleTest.test_pausec                 C   s€   t  ¡  t  ¡ }t  |¡}|  ||¡ t  |d ¡}|  ||¡ t  d¡}|  |d¡ t  t|d ƒ¡}|  |t|d ƒ¡ dS )zIEnsure pygame.mixer.set_reserved() reserves the given number of channels.r   r   r   N)r   r+   r;   Zset_reservedr.   Úint)r'   r>   Úresultr   r   r   Útest_set_reserved   s   

z!MixerModuleTest.test_set_reservedc                 C   sr   t  ¡ du r
t  ¡  tj  tdƒ¡}tj  d¡}| |¡ tj  ¡  t	tj  
¡ ƒD ]}|  tj  |¡ ¡ ¡ q)dS )z,Stops playback of all active sound channels.Nr¹   r   )r   r-   r+   rB   rX   r   rÆ   r½   rÈ   r=   r;   r°   rÁ   )r'   rl   rÂ   r?   r   r   r   Ú	test_stop:  s   

ÿzMixerModuleTest.test_stopc                 C   sL   d}t }t}tj ¡ }|  ||¡ |  t|ƒ|¡ |D ]}|  ||¡ qdS )z;Ensures get_sdl_mixer_version works correctly with no args.é   N©ÚtuplerÏ   rB   r   Úget_sdl_mixer_versionÚassertIsInstancer.   r[   )r'   Úexpected_lengthÚexpected_typeÚexpected_item_typeÚversionÚitemr   r   r   Útest_get_sdl_mixer_versionE  s   
ÿz*MixerModuleTest.test_get_sdl_mixer_versionc                 C   sX   d}t }t}dD ]!}tj |¡}|  ||¡ |  t|ƒ|¡ |D ]}|  ||¡ q qdS )z9Ensures get_sdl_mixer_version works correctly using args.rÓ   ©TFNrÔ   ©r'   rØ   rÙ   rÚ   ÚvaluerÛ   rÜ   r   r   r   Ú test_get_sdl_mixer_version__argsS  s   ÿúz0MixerModuleTest.test_get_sdl_mixer_version__argsc                 C   sZ   d}t }t}dD ]"}tjj|d}|  ||¡ |  t|ƒ|¡ |D ]}|  ||¡ q!qdS )z;Ensures get_sdl_mixer_version works correctly using kwargs.rÓ   rÞ   ©ZlinkedNrÔ   rß   r   r   r   Ú"test_get_sdl_mixer_version__kwargsb  s   ÿúz2MixerModuleTest.test_get_sdl_mixer_version__kwargsc                 C   sz   t ƒ }|  t¡ tj |¡}W d  ƒ n1 sw   Y  |  t¡ tjj|d}W d  ƒ dS 1 s6w   Y  dS )z>Ensures get_sdl_mixer_version handles invalid args and kwargs.Nrâ   )r   rA   r\   rB   r   rÖ   )r'   Zinvalid_boolrÛ   r   r   r   Ú/test_get_sdl_mixer_version__invalid_args_kwargsq  s   ÿ"ÿz?MixerModuleTest.test_get_sdl_mixer_version__invalid_args_kwargsc                 C   s,   t jjdd}t jjdd}|  ||¡ dS )zCEnsures get_sdl_mixer_version's linked/compiled versions are equal.Trâ   FN)rB   r   rÖ   ZassertTupleEqual)r'   Zlinked_versionZcomplied_versionr   r   r   Ú2test_get_sdl_mixer_version__linked_equals_compiled{  s   zBMixerModuleTest.test_get_sdl_mixer_version__linked_equals_compiledN)+r   r   r    r(   r2   r3   r5   r6   r9   r<   r@   rD   rh   ÚskipIfrV   ÚplatformÚ
startswithÚIS_PYPYrb   rm   rQ   ÚenvironÚgetrŒ   r‡   r“   r   rB   ZHAVE_NEWBUFr¡   r£   r    rÄ   rÊ   ÚexpectedFailurerÎ   rÑ   rÒ   rÝ   rá   rã   rä   rå   r   r   r   r   r#   /   sP    


Mþ
G

p(

r#   c                   @   s¤   e Zd Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%S )&ÚChannelTypeTestc                 C   ó   t  ¡  d S r7   )r   r+   ©Úclsr   r   r   Ú
setUpClass‡  s   zChannelTypeTest.setUpClassc                 C   rî   r7   ©r   r$   rï   r   r   r   ÚtearDownClassŒ  ó   zChannelTypeTest.tearDownClassc                 C   ó   t  ¡ d u rt  ¡  d S d S r7   ©r   r-   r+   rï   r   r   r   ÚsetUp  ó   ÿzChannelTypeTest.setUpc                 C   s,   t  d¡}|  |t j¡ |  |jjd¡ dS )z Ensure Channel() creation works.r   rÆ   N)r   rÆ   r×   ZChannelTyper.   Ú	__class__r   ©r'   rÂ   r   r   r   Útest_channel–  s   
zChannelTypeTest.test_channelc                 C   ó8   |   t¡ t ¡  W d  ƒ dS 1 sw   Y  dS )z9Ensure exception for Channel() creation with no argument.N)rA   r\   r   rÆ   r&   r   r   r   Útest_channel__without_arg  ó   
"ÿz)ChannelTypeTest.test_channel__without_argc                 C   s:   |   t¡ t d¡ W d  ƒ dS 1 sw   Y  dS )z;Ensure exception for Channel() creation with an invalid id.r€   N)rA   Ú
IndexErrorr   rÆ   r&   r   r   r   Útest_channel__invalid_id¢  s   "ÿz(ChannelTypeTest.test_channel__invalid_idc                 C   sF   t  ¡  |  tjd¡ t  d¡ W d  ƒ dS 1 sw   Y  dS )z<Ensure exception for Channel() creation with non-init mixer.úmixer not initializedr   N)r   r$   ÚassertRaisesRegexrB   rC   rÆ   r&   r   r   r   Útest_channel__before_init§  s   "ÿz)ChannelTypeTest.test_channel__before_initc                 C   sR   t  d¡}t  tdƒ¡}| |¡ d}| |¡ tj |d ¡ |  	| 
¡ ¡ dS )z9Ensure Channel.fadeout() stops playback after fading out.r   r¹   rN   éd   N)r   rÆ   rX   r   r½   r¾   rB   r¿   rÀ   r°   rÁ   )r'   rÂ   rl   rÃ   r   r   r   rÄ   ®  s   


zChannelTypeTest.test_fadeoutc                 C   ó&   d}t  d¡}| ¡ }|  ||¡ dS )z/Ensure an idle channel's busy state is correct.Fr   N)r   rÆ   rÁ   r.   )r'   Zexpected_busyrÂ   Úbusyr   r   r   Útest_get_busy¼  ó   
zChannelTypeTest.test_get_busyc                 C   s4   t  d¡}t  tdƒ¡}| |¡ |  | ¡ ¡ dS )z1Ensure an active channel's busy state is correct.r   r¹   N)r   rÆ   rX   r   r½   rY   rÁ   ©r'   rÂ   rl   r   r   r   Útest_get_busy__activeÅ  s   

z%ChannelTypeTest.test_get_busy__activec                 C   s   |   ¡  d S r7   ©r   r&   r   r   r   Útodo_test_get_endeventÍ  s   z&ChannelTypeTest.todo_test_get_endeventc           
      C   sì   t  d¡}t  ¡ \}}}d}d}t|d | t|ƒd  ƒ}t  dt|| ƒ ¡}t  dt|| ƒ ¡}	| |¡ | |	¡ |  | 	¡  
¡ |	 
¡ ¡ tj |d ¡ |  | 	¡ ¡ |  | ¡  
¡ |	 
¡ ¡ tj |d ¡ |  | 	¡ ¡ dS )	z4Ensure Channel.get_queue() returns any queued Sound.r   rº   é  rN   r   ó    r  N)r   rÆ   r-   rÏ   r/   rX   r½   Úqueuer.   Ú	get_queuerZ   rB   r¿   rÀ   r8   Ú	get_sound)
r'   rÂ   r   rŠ   r   Úsound_length_in_msÚsound_length_in_ms_2Úbytes_per_msÚsound1Úsound2r   r   r   Útest_get_queueÚ  s   


zChannelTypeTest.test_get_queuec                 C   sT   t  d¡}t  tdƒ¡}| |¡ | ¡ }|  ||¡ | ¡  | ¡ }|  |¡ dS )z?Ensure Channel.get_sound() returns the currently playing Sound.r   r¹   N)	r   rÆ   rX   r   r½   r  r.   rÈ   r8   )r'   rÂ   rl   Z	got_soundr   r   r   Útest_get_soundô  s   

zChannelTypeTest.test_get_soundc                 C   r  )z+Ensure a channel's volume can be retrieved.ç      ð?r   N)r   rÆ   Ú
get_volumeÚassertAlmostEqual)r'   Úexpected_volumerÂ   Úvolumer   r   r   Útest_get_volume  r  zChannelTypeTest.test_get_volumec                 C   sl   t  ¡ du r
t  ¡  tj  tdƒ¡}| ¡ }| ¡  | j| 	¡ dd | 
¡  | j| 	¡ dd | ¡  dS )zA
        Test if the Channel can be paused and unpaused.
        Nr¹   z&Channel should be paused but it's not.)Úmsgz(Channel should be unpaused but it's not.)r   r-   r+   rB   rX   r   r½   rË   rY   rÁ   rÌ   rÈ   rÍ   r   r   r   Útest_pause_unpause  s   ÿÿz"ChannelTypeTest.test_pause_unpausec                 C   s   t  tdƒ¡}| ¡ }t  ¡  |  tjd¡ | ¡  W d  ƒ n1 s%w   Y  |  tjd¡ | 	¡  W d  ƒ dS 1 sAw   Y  dS )zK
        Ensure exception for Channel.pause() with non-init mixer.
        r¹   r  N)
r   rX   r   r½   r$   r  rB   rC   rË   rÌ   rÍ   r   r   r   Útest_pause_unpause__before_init  s   
ÿ
"ÿz/ChannelTypeTest.test_pause_unpause__before_initc                 C   sø  t j d¡dkr|  d¡ t d¡}t ¡ \}}}d}d}d}t|d | t|ƒd	  ƒ}t 	d
t|| ƒ ¡}	t 	d
t|| ƒ ¡}
t 	d
t|| ƒ ¡}| 
|	¡ | |
¡ tj |d ¡ |  | ¡ ¡ |  | ¡ |
¡ |  | ¡ ¡ tj |d ¡ | |	¡ |  | ¡ ¡ |  | ¡ |	¡ tj |d ¡ | 
|	¡ | |
¡ | 
|¡ |  | ¡ ¡ tj |d ¡ |  | ¡ ¡ | 
|	¡ | |
¡ | ¡  |  | ¡ ¡ |  | ¡ ¡ | 
|	¡ | |
¡ | |¡ |  | ¡ |	¡ |  | ¡ |¡ dS )z<
        Ensure the Channel.queue() works correctly
        ZPYGAME_MSYS2Ú1zSkip test on MSYS2r   rº   r  é,  rN   r   r  r  N)rQ   rê   rë   rƒ   r   rÆ   r-   rÏ   r/   rX   r½   r  rB   r¿   rÀ   rY   rÁ   r.   r  r8   r  r°   rÈ   )r'   rÂ   r   rŠ   r   r  r  Zsound_length_in_ms_3r  r  r  Zsound3r   r   r   Ú
test_queue,  sL   












zChannelTypeTest.test_queuec                 C   st   t  d¡}t  tdƒ¡}| |¡ | ¡  |  | ¡ ¡ | |¡ | ¡  |  | ¡ ¡ | |¡ |  	| ¡ ¡ d S )Nr   r¹   )
r   rÆ   rX   r   r½   rÈ   r°   rÁ   r  rY   r	  r   r   r   rÒ   f  s   




zChannelTypeTest.test_stopN)r   r   r    Úclassmethodrñ   ró   r÷   rû   rý   r   r  rÄ   r  r
  r  r  r  r  r   r!  r$  rÒ   r   r   r   r   rí   †  s*    

		:rí   c                   @   s2   e Zd Zdd„ Zdd„ Zdd„ Zejdd„ ƒZd	S )
ÚChannelSetVolumeTestc                 C   s,   t  ¡  tj  d¡| _tj  tdƒ¡| _d S )Nr   zdata/boom.wav)r   r+   rB   rÆ   rÂ   rX   r   rl   r&   r   r   r   r÷     s   zChannelSetVolumeTest.setUpc                 C   rî   r7   rò   r&   r   r   r   r(   †  ó   zChannelSetVolumeTest.tearDownc                 C   s0   | j  | j¡ | j  d¡ |  | j  ¡ d¡ d S )NrM   ©rÂ   r½   rl   Ú
set_volumer.   r  r&   r   r   r   Ú!test_set_volume_with_one_argument‰  s   z6ChannelSetVolumeTest.test_set_volume_with_one_argumentc                 C   s2   | j  | j¡ | j  dd¡ |  | j  ¡ d¡ d S )Nç333333Ó?çffffffæ?)r+  r,  r(  r&   r   r   r   Ú"test_set_volume_with_two_argumentsŽ  s   z7ChannelSetVolumeTest.test_set_volume_with_two_argumentsN)	r   r   r    r÷   r(   r*  rh   rì   r-  r   r   r   r   r&  €  s    r&  c                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚChannelEndEventTestc                 C   s2   t j ¡  t j d¡ t ¡ d u rt ¡  d S d S )N)é(   r0  )rB   Údisplayr+   Úset_moder   r-   r&   r   r   r   r÷   ˜  s
   
ÿzChannelEndEventTest.setUpc                 C   s   t j ¡  t ¡  d S r7   )rB   r1  r$   r   r&   r   r   r   r(   ž  s   
zChannelEndEventTest.tearDownc                 C   s   t  d¡}t  tdƒ¡}| |¡ tjd }| |¡ | ¡ }|  	||¡ | 
¡  | ¡ r7tj d¡ | ¡ s-tj |¡}|  t|ƒdk¡ dS )z=Ensure Channel.get_endevent() returns the correct event type.r   r¹   r   rª   N)r   rÆ   rX   r   r½   rB   Z	USEREVENTZset_endeventZget_endeventr.   rÈ   rÁ   r¿   rÀ   Úeventrë   rY   r[   )r'   rÂ   rl   Z	END_EVENTZgot_end_eventÚeventsr   r   r   Útest_get_endevent¢  s   



ÿz%ChannelEndEventTest.test_get_endeventN)r   r   r    r÷   r(   r5  r   r   r   r   r/  —  s    r/  c                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚTestSoundPlayc                 C   s0   t  ¡  ttj dd¡ƒ| _t j| jd| _d S )NrI   rJ   rK   )	r   r+   r   rQ   rR   rS   rÉ   rX   rl   r&   r   r   r   r÷   ¼  s   zTestSoundPlay.setUpc                 C   rî   r7   rò   r&   r   r   r   r(   Á  r'  zTestSoundPlay.tearDownc                 C   s,   | j  ¡ }|  |tjj¡ |  | ¡ ¡ dS )zTest playing a sound once.N)rl   r½   r×   rB   r   rÆ   rY   rÁ   rú   r   r   r   Útest_play_onceÄ  s   
zTestSoundPlay.test_play_oncec           	      C   sÀ   t  ¡ \}}}d}t|d | t|ƒd  ƒ}t  dt|| ƒ ¡}| j| ¡ |d dd d}|j|d	}|  |t	j j
¡ t	j || d ¡ |  | ¡ ¡ t	j |d
 ¡ |  | ¡ ¡ dS )z$Test playing a sound multiple times.r  rN   r   r  g     @@r   )Zplacesé   ©Zloopsrº   N)r   r-   rÏ   r/   rX   r  rZ   r½   r×   rB   rÆ   r¿   rÀ   rY   rÁ   r°   )	r'   r   rŠ   r   r  r  rl   Z	num_loopsrÂ   r   r   r   Útest_play_multiple_timesÊ  s   ÿz&TestSoundPlay.test_play_multiple_timesc           	      C   sŒ   t  ¡ \}}}d}t|d | t|ƒd  ƒ}t  dt|| ƒ ¡}|jdd}|  |tj j¡ t	dƒD ]}|  
| ¡ ¡ tj |¡ q4dS )	z"Test playing a sound indefinitely.r  rN   r   r  r€   r9  r   N)r   r-   rÏ   r/   rX   r½   r×   rB   rÆ   r=   rY   rÁ   r¿   rÀ   )	r'   r   rŠ   r   r  r  rl   rÂ   Ú_r   r   r   Útest_play_indefinitelyã  s   þz$TestSoundPlay.test_play_indefinitelyc                 C   sJ   | j jdd}|  |tjj¡ |  | ¡ ¡ tj 	d¡ |  
| ¡ ¡ dS )z"Test playing a sound with maxtime.rº   ©Zmaxtimeéú   N)rl   r½   r×   rB   r   rÆ   rY   rÁ   r¿   rÀ   r°   rú   r   r   r   Útest_play_with_maxtimeò  s
   z$TestSoundPlay.test_play_with_maxtimec                 C   sx   | j jdd}|  |tjj¡ |  | ¡ ¡ tj 	d¡ |  
| ¡ d¡ |  | ¡ d¡ tj 	d¡ |  | ¡ d¡ dS )	z"Test playing a sound with fade_ms.iô  ©Zfade_msr>  r+  gš™™™™™é?r#  r  N)rl   r½   r×   rB   r   rÆ   rY   rÁ   r¿   rÀ   ZassertGreaterr  Z
assertLessr.   rú   r   r   r   Útest_play_with_fade_msú  s   z$TestSoundPlay.test_play_with_fade_msc                 C   ó>   |   t¡ | jjdd W d  ƒ dS 1 sw   Y  dS )z(Test playing a sound with invalid loops.Úinvalidr9  N©rA   r\   rl   r½   r&   r   r   r   Útest_play_with_invalid_loops  ó   "ÿz*TestSoundPlay.test_play_with_invalid_loopsc                 C   rB  )z*Test playing a sound with invalid maxtime.rC  r=  NrD  r&   r   r   r   Útest_play_with_invalid_maxtime  rF  z,TestSoundPlay.test_play_with_invalid_maxtimec                 C   rB  )z*Test playing a sound with invalid fade_ms.rC  r@  NrD  r&   r   r   r   Útest_play_with_invalid_fade_ms  rF  z,TestSoundPlay.test_play_with_invalid_fade_msN)r   r   r    r÷   r(   r7  r:  r<  r?  rA  rE  rG  rH  r   r   r   r   r6  »  s    r6  c                   @   sÌ   e Zd Zedd„ ƒZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Ze ed¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.S )/ÚSoundTypeTestc                 C   rî   r7   rò   rï   r   r   r   ró     rô   zSoundTypeTest.tearDownClassc                 C   rõ   r7   rö   rï   r   r   r   r÷     rø   zSoundTypeTest.setUpc                 C   sH   t tj dd¡ƒ}t |¡}tj|d}|  |tj¡ |  |tj¡ dS )z.Ensure Sound() creation with a filename works.rI   rJ   rK   N©r   rQ   rR   rS   r   rX   r×   )r'   rÉ   r  r  r   r   r   Ú
test_sound$  s
   
zSoundTypeTest.test_soundc                 C   sZ   t tj dd¡ƒ}t|dƒ}t |¡}|  |tj¡ W d  ƒ dS 1 s&w   Y  dS )z1Ensure Sound() creation with a file object works.rI   rJ   rc   N)r   rQ   rR   rS   rf   r   rX   r×   )r'   rÉ   Zfile_objrl   r   r   r   Útest_sound__from_file_object-  s
   
"ýz*SoundTypeTest.test_sound__from_file_objectc                 C   s:   t tj dd¡ƒ}tj|d}t |¡}|  |tj¡ dS )z4Ensure Sound() creation with a Sound() object works.rI   rJ   rK   NrJ  )r'   rÉ   Z	sound_objrl   r   r   r   Útest_sound__from_sound_object7  s   
z+SoundTypeTest.test_sound__from_sound_objectc                 C   sN   t  ttj dd¡ƒ¡}t |¡}tj|d}|  |tj¡ |  |tj¡ dS )z9Ensure Sound() creation with a pathlib.Path object works.rI   rJ   rK   N)	ÚpathlibÚPathr   rQ   rR   rS   r   rX   r×   )r'   rR   r  r  r   r   r   Útest_sound__from_pathlib@  s
   
z&SoundTypeTest.test_sound__from_pathlibc                 C   s   |   ¡  dS )z,Ensure Sound() creation with a buffer works.Nr  r&   r   r   r   Útodo_test_sound__from_bufferH  rô   z*SoundTypeTest.todo_test_sound__from_bufferc                 C   s4   t dttj dd¡ƒƒ}t |¡}|  |tj¡ dS )z,Ensure Sound() creation with an array works.ÚurI   rJ   N)r   r   rQ   rR   rS   r   rX   r×   )r'   Zarray1r  r   r   r   Útest_sound__from_arrayL  s   
z$SoundTypeTest.test_sound__from_arrayc                 C   rü   )z>Ensure exception raised for Sound() creation with no argument.N)rA   r\   r   rX   r&   r   r   r   Útest_sound__without_argR  rþ   z%SoundTypeTest.test_sound__without_argc                 C   sZ   t  ¡  ttj dd¡ƒ}|  tjd¡ t j	|d W d  ƒ dS 1 s&w   Y  dS )zAEnsure exception raised for Sound() creation with non-init mixer.rI   rJ   r  rK   N)
r   r$   r   rQ   rR   rS   r  rB   rC   rX   )r'   rÉ   r   r   r   Útest_sound__before_initW  s
   "ÿz%SoundTypeTest.test_sound__before_initz	pypy skipc                 C   sÖ   zJddl m}m}m} |j}||_|g|_d}||ƒ}tj|d}|  	|j
|¡ W tj ¡  |  tjd¡ |j
 W d  ƒ dS 1 sDw   Y  dS tj ¡  |  tjd¡ |j
 W d  ƒ w 1 sew   Y  w )z!Test the _samples_address getter.r   )Ú	pythonapiÚc_void_pÚ	py_objectó   abcdefghrO   r  N)ÚctypesrV  rW  rX  ZPyBytes_FromStringÚrestypeÚargtypesr   rX   ZassertNotEqualr›   rB   r$   r  rC   )r'   rV  rW  rX  ZBytes_FromStringÚsamplesZsample_bytesrG   r   r   r   Útest_samples_address_  s"   
"ÿ
ÿÿz"SoundTypeTest.test_samples_addressc           
      C   s  zjt D ]C}tj ¡  tjj|d ttj dd¡ƒ}tj	|d}| 
¡ }tj ¡ \}}}t|ƒd }tt|ƒƒ| | | }	|  |	| ¡ ¡ qW tj ¡  |  tjd¡ | ¡  W d  ƒ dS 1 sdw   Y  dS tj ¡  |  tjd¡ | ¡  W d  ƒ w 1 s†w   Y  w )z-Tests if get_length returns a correct length.)r   rI   ú	punch.wavrK   r   r  N)r   rB   r   r$   r+   r   rQ   rR   rS   rX   rF   r-   r/   Úfloatr[   r  rZ   r  rC   )
r'   r   rÉ   rl   Zsound_bytesZmix_freqZmix_bitsZmix_channelsZ	mix_bytesrØ   r   r   r   Útest_get_lengtht  s*   
ÿò

"ÿ
ÿ
ÿzSoundTypeTest.test_get_lengthc                 C   s  z_t tj dd¡ƒ}tj|d}|  | ¡ d¡ | ¡  |  | ¡ d¡ | ¡  |  | ¡ d¡ | 	¡  |  | ¡ d¡ W t
j ¡  |  t
jd¡ | ¡  W d  ƒ dS 1 sYw   Y  dS t
j ¡  |  t
jd¡ | ¡  W d  ƒ w 1 s{w   Y  w )	zz
        Tests if Sound.get_num_channels returns the correct number
        of channels playing a specific sound.
        rI   rJ   rK   r   r   r   r  N)r   rQ   rR   rS   r   rX   r.   r;   r½   rÈ   rB   r$   r  rC   )r'   rÉ   rl   r   r   r   Útest_get_num_channels‹  s$   

"ÿ
ÿ
ÿz#SoundTypeTest.test_get_num_channelsc                 C   sÂ   z?d}t tj dd¡ƒ}tj|d}| ¡ }|  ||¡ W tj 	¡  |  
tjd¡ | ¡  W d  ƒ dS 1 s9w   Y  dS tj 	¡  |  
tjd¡ | ¡  W d  ƒ w 1 s[w   Y  w )z)Ensure a sound's volume can be retrieved.r  rI   rJ   rK   r  N)r   rQ   rR   rS   r   rX   r  r  rB   r$   r  rC   ©r'   r  rÉ   rl   r  r   r   r   r     s   

"ÿ
ÿ
ÿzSoundTypeTest.test_get_volumec                 C   sÌ   zDd}t tj dd¡ƒ}tj|d}| d¡ | ¡ }|  ||¡ W t	j 
¡  |  t	jd¡ | ¡  W d  ƒ dS 1 s>w   Y  dS t	j 
¡  |  t	jd¡ | ¡  W d  ƒ w 1 s`w   Y  w )z7Ensure a sound's volume can be retrieved while playing.r  rI   rJ   rK   r€   r  N)r   rQ   rR   rS   r   rX   r½   r  r  rB   r$   r  rC   rc  r   r   r   Útest_get_volume__while_playing¯  s   


"ÿ
ÿ
ÿz,SoundTypeTest.test_get_volume__while_playingc                 C   s  z^d}t tj dd¡ƒ}tj|d}| ¡ }d|fdddd	d
ddddf
}|D ]\}}| |¡ | j| ¡ ||d q&W t	j 
¡  |  t	jd¡ | d¡ W d  ƒ dS 1 sXw   Y  dS t	j 
¡  |  t	jd¡ | d¡ W d  ƒ w 1 s{w   Y  w )z#Ensure a sound's volume can be set.ç      €?rI   rJ   rK   r€   ©r   g        ©ç{®Gáz„?rh  ©çš™™™™™¹?rj  ©rM   rM   ©çÍÌÌÌÌÌì?rm  ©ç®Gáz®ï?ro  ©r   r  ©çš™™™™™ñ?r  ©g       @r  ©Údeltar  r   N)r   rQ   rR   rS   r   rX   r  r)  r  rB   r$   r  rC   ©r'   Zfloat_deltarÉ   rl   Zcurrent_volumeZvolumesZvolume_set_valuer  r   r   r   Útest_set_volume¿  s<   ö

ÿý
"ÿ
ÿÿzSoundTypeTest.test_set_volumec                 C   s  zdd}t tj dd¡ƒ}tj|d}| ¡ }d|fdddd	d
ddddf
}|jdd |D ]\}}| |¡ | j	| ¡ ||d q,W t
j ¡  |  t
jd¡ | d¡ W d  ƒ dS 1 s^w   Y  dS t
j ¡  |  t
jd¡ | d¡ W d  ƒ w 1 sw   Y  w )z1Ensure a sound's volume can be set while playing.re  rI   rJ   rK   r€   rf  rg  ri  rk  rl  rn  rp  rq  rs  r9  rt  r  r   N)r   rQ   rR   rS   r   rX   r  r½   r)  r  rB   r$   r  rC   rv  r   r   r   Útest_set_volume__while_playingà  s>   ö

ÿý
"ÿ
ÿÿz,SoundTypeTest.test_set_volume__while_playingc                 C   sÆ   zAd}t tj dd¡ƒ}tj|d}| ¡  |  | ¡ |¡ W t	j 
¡  |  t	jd¡ | ¡  W d  ƒ dS 1 s;w   Y  dS t	j 
¡  |  t	jd¡ | ¡  W d  ƒ w 1 s]w   Y  w )z4Ensure stop can be called while not playing a sound.r   rI   rJ   rK   r  N)r   rQ   rR   rS   r   rX   rÈ   r.   r;   rB   r$   r  rC   ©r'   Zexpected_channelsrÉ   rl   r   r   r   rÒ     s   

"ÿ
ÿ
ÿzSoundTypeTest.test_stopc                 C   sÐ   zFd}t tj dd¡ƒ}tj|d}| d¡ | ¡  |  | 	¡ |¡ W t
j ¡  |  t
jd¡ | ¡  W d  ƒ dS 1 s@w   Y  dS t
j ¡  |  t
jd¡ | ¡  W d  ƒ w 1 sbw   Y  w )z"Ensure stop stops a playing sound.r   rI   rJ   rK   r€   r  N)r   rQ   rR   rS   r   rX   r½   rÈ   r.   r;   rB   r$   r  rC   ry  r   r   r   Útest_stop__while_playing  s   


"ÿ
ÿ
ÿz&SoundTypeTest.test_stop__while_playingc                 C   s¼   z<d}t j|d}| ¡ }|  |t¡ |  ||¡ W tj  ¡  |  tj	d¡ | ¡  W d  ƒ dS 1 s6w   Y  dS tj  ¡  |  tj	d¡ | ¡  W d  ƒ w 1 sXw   Y  w )z.Ensure get_raw returns the correct bytestring.rY  rO   r  N)
r   rX   rF   r×   Úbytesr.   rB   r$   r  rC   )r'   r]  rG   Úrawr   r   r   Útest_get_raw!  s   

"ÿ
ÿ
ÿzSoundTypeTest.test_get_rawc                 C   sZ   G dd„ dt jƒ}ttj dd¡ƒ}||ƒ}z| ¡  W d S  ty,   |  d¡ Y d S w )Nc                       s   e Zd Z‡ fdd„Z‡  ZS )z>SoundTypeTest.test_correct_subclassing.<locals>.CorrectSublassc                    s   t ƒ j|d d S )NrK   )ÚsuperÚ__init__)r'   rL   ©rù   r   r   r  2  r:   zGSoundTypeTest.test_correct_subclassing.<locals>.CorrectSublass.__init__)r   r   r    r  Ú__classcell__r   r   r€  r   ÚCorrectSublass1  s    r‚  rI   rJ   z#This should not raise an exception.)	r   rX   r   rQ   rR   rS   r  Ú	Exceptionr   )r'   r‚  rÉ   Zcorrectr   r   r   Útest_correct_subclassing0  s   ÿz&SoundTypeTest.test_correct_subclassingc                 C   s*   G dd„ dt jƒ}|ƒ }|  t|j¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )zBSoundTypeTest.test_incorrect_subclassing.<locals>.IncorrectSuclassc                 S   s   d S r7   r   r&   r   r   r   r  ?  s   zKSoundTypeTest.test_incorrect_subclassing.<locals>.IncorrectSuclass.__init__N)r   r   r    r  r   r   r   r   ÚIncorrectSuclass>  s    r…  )r   rX   rA   ÚRuntimeErrorr  )r'   r…  Z	incorrectr   r   r   Útest_incorrect_subclassing=  s   z(SoundTypeTest.test_incorrect_subclassingN)r   r   r    r%  ró   r÷   rK  rL  rM  rP  rQ  rS  rT  rU  rh   ræ   ré   r^  ra  rb  r  rd  rw  rx  rÒ   rz  r}  r„  r‡  r   r   r   r   rI    s2    
	
	

!"rI  c                   @   r.  )ÚTestSoundFadeoutc                 C   s   t  ¡ d u rtj  ¡  d S d S r7   )r   r-   rB   r+   r&   r   r   r   r÷   H  s   ÿzTestSoundFadeout.setUpc                 C   ó   t j ¡  d S r7   ©rB   r   r$   r&   r   r   r   r(   L  ó   zTestSoundFadeout.tearDownc                 C   sN   t tj dd¡ƒ}tj|d}| ¡ }| d¡ tj	 
d¡ |  | ¡ ¡ dS )zaTests if fadeout stops sound playback after fading it out over the time argument in milliseconds.rI   r_  rK   rN   iÐ  N)r   rQ   rR   rS   r   rX   r½   r¾   rB   r¿   rÀ   r°   rÁ   )r'   rÉ   rl   rÂ   r   r   r   Útest_fadeout_with_valid_timeO  s   
z-TestSoundFadeout.test_fadeout_with_valid_timeN)r   r   r    r÷   r(   rŒ  r   r   r   r   rˆ  G  s    rˆ  c                   @   sP   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTestGetBusyz1Test pygame.mixer.get_busy.

    |tags:slow|
    c                 C   r‰  r7   )rB   r   r+   r&   r   r   r   r÷   {  r‹  zTestGetBusy.setUpc                 C   r‰  r7   rŠ  r&   r   r   r   r(   ~  r‹  zTestGetBusy.tearDownc                 C   s   |   tj ¡ ¡ dS )zL
        Test that get_busy returns False when no sound is playing.
        N)r°   rB   r   rÁ   r&   r   r   r   Útest_no_sound_playing  s   z!TestGetBusy.test_no_sound_playingc                 C   s>   t j tdƒ¡}| ¡  t d¡ |  t j ¡ ¡ | 	¡  dS )zL
        Test that get_busy returns True when one sound is playing.
        r¹   çš™™™™™É?N©
rB   r   rX   r   r½   r¿   ÚsleeprY   rÁ   rÈ   ©r'   rl   r   r   r   Útest_one_sound_playing‡  s
   
z"TestGetBusy.test_one_sound_playingc                 C   s^   t j tdƒ¡}t j tdƒ¡}| ¡  | ¡  t d¡ |  t j ¡ ¡ | 	¡  | 	¡  dS )zS
        Test that get_busy returns True when multiple sounds are playing.
        r¹   r  Nr  ©r'   r  r  r   r   r   Útest_multiple_sounds_playing‘  s   
z(TestGetBusy.test_multiple_sounds_playingc                 C   sh   t j tdƒ¡}t j tdƒ¡}| ¡  | ¡  t d¡ | ¡  | ¡  t d¡ |  t j 	¡ ¡ dS )zO
        Test that get_busy returns False when all sounds are stopped.
        r¹   r  N)
rB   r   rX   r   r½   r¿   r‘  rÈ   r°   rÁ   r”  r   r   r   Útest_all_sounds_stoppedž  s   

z#TestGetBusy.test_all_sounds_stoppedc                 C   sl   t j tdƒ¡}t j tdƒ¡}| ¡  | ¡  t d¡ | d¡ | d¡ t d¡ |  t j 	¡ ¡ dS )zd
        Test that get_busy returns False when all sounds are stopped with
        fadeout.
        r¹   r  r  r+  N)
rB   r   rX   r   r½   r¿   r‘  r¾   r°   rÁ   r”  r   r   r   Ú$test_all_sounds_stopped_with_fadeout¬  s   



z0TestGetBusy.test_all_sounds_stopped_with_fadeoutc                 C   sB   t j tdƒ¡}|jdd t d¡ |  t j ¡ ¡ | 	¡  dS )z=Tests that get_busy() returns True when a sound is fading outr¹   rN   r@  rr  Nr  r’  r   r   r   Útest_sound_fading_out»  s
   
z!TestGetBusy.test_sound_fading_outN)r   r   r    r!   r÷   r(   rŽ  r“  r•  r–  r—  r˜  r   r   r   r   r  u  s    
r  Ú__main__)rV   rQ   rh   rN  rç   r¿   r   r«   r   rB   r   Úpython_implementationré   ZFREQUENCIESr   r   ZBUFFERSZCONFIGSr,   r   ZTestCaser#   rí   r&  r/  r6  rI  rˆ  r  r   Úmainr   r   r   r   Ú<module>   sL    þ	    [ {$\  2.Qÿ