o
    tVÆgÓ  ã                   @   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   úK/home/ubuntu/.local/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'   Ú
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   r5   )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<   ÚrangeÚ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 r8   )Ú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)rR   rN   )Úfoobarz&Unrecognized keyword argument 'foobar'rN   z!Unrecognized argument (type list)z1Expected object with buffer interface: got a listÚ12345678Ú	somethingz+Unicode object not allowed as buffer objectr   )rR   r   )r   r+   r   ÚosÚpathÚjoinÚstrÚencodeÚsysÚgetfilesystemencodingÚSoundÚ
assertTrueÚ
get_lengthÚlenr.   rC   Ú	TypeErrorÚ	exceptionÚIOErrorÚtyperH   )r'   rJ   ÚsampleÚ	wave_pathÚ
uwave_pathÚ
bwave_pathrI   Ú	snd_bytesÚarg_emsgÚcmÚemsgÚ
ufake_pathÚ	somebytesÚ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   NrK   u
   ä½ å¥½.wavrL   Úrbzthe path cannot be opened)r   r+   Úshutilr   rV   rW   rX   ÚcopyÚopenÚOSErrorÚunittestÚSkipTestr]   Úremove)r'   rr   ÚepÚ	temp_fileÚorg_filer   Úsoundr   r   r   Útest_sound_unicodeÔ   s$   ÿ€
ÿ
z"MixerModuleTest.test_sound_unicodeÚSDL_AUDIODRIVERÚ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   rŠ   r‹   r   rŒ   r   r   r   r     rŽ   éÿ   c                 S   rŠ   ©r   r   rŒ   r   r   r   r     rŽ   éÿÿÿÿc                 S   rŠ   r‘   r   rŒ   r   r   r   r     rŽ   )Únumpyr   r€   r   r‚   rƒ   r„   r…   r†   r‡   ÚImportErrorÚskipTestÚastypeÚextendÚshaper   r+   rD   rE   r-   r$   Ú_test_array_argument)$r'   r   r€   r   r‚   rƒ   r„   r…   r†   r‡   ÚfreqÚformat_listÚchannels_listÚa_listsÚ	a32u_monoÚ	a16u_monoÚa8u_monoÚau_list_monoÚformatÚ	a32s_monoÚ	a16s_monoÚa8s_monoÚas_list_monoÚa32u_stereoÚa16u_stereoÚ
a8u_stereoÚau_list_stereoÚa32s_stereoÚa16s_stereoÚ
a8s_stereoÚ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   r]   Ú
ValueErrorÚfailÚdtyper–   r/   Úitemsizer^   )
r'   r¢   r   Ú	test_passr   Úall_rI   Úa2Úa3Úlshiftr   r   r   r™   4  s$   ýÿ"z$MixerModuleTest._test_array_argumentc                 C   s   | j ttj|d d S )Nr   )rC   r²   r   r]   )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   r5   s(                       rQ   z<i2z>i2Útypestrr˜   )é   Ústridesr‘   rK   F)r   r+   r]   Ú__array_interface__r^   Ú
isinstanceÚdictrD   Úget_sdl_byteorderÚ
LIL_ENDIANr.   Ú_samples_address)r'   rI   Ú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Ñ   é
   rA   )r¢   r   )#r   r-   r/   Úpygame.tests.test_utilsrÐ   ÚExporterÚImporterrD   rÂ   rÃ   r]   r`   ÚPyBUF_SIMPLEr.   Úndimr^   r¢   rµ   r˜   r¾   Ú
suboffsetsÚassertFalseÚreadonlyÚbufrÄ   ÚPyBUF_WRITABLEÚPyBUF_FORMATÚPyBUF_NDÚPyBUF_STRIDESÚPyBUF_FULL_ROÚPyBUF_C_CONTIGUOUSÚPyBUF_ANY_CONTIGUOUSÚPyBUF_F_CONTIGUOUSrC   ÚBufferError)r'   rš   Úfmtr   rØ   rµ   Úformatsr¢   rÐ   rÕ   rÖ   Úis_lil_endianÚfsysÚfrevr˜   r¾   ÚexprI   Ú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+   rD   r]   r   Úfind_channelÚplayÚfadeoutÚtimeÚwaitrÚ   Úget_busy)r'   r|   Ú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 )NrK   rL   rM   r   T)Úforce)r   r+   r   rV   rW   rX   r]   r<   rñ   ÚassertIsNotNoner>   ÚChannelrò   Úappendr9   Ústop)r'   Úfilenamer|   Únum_channelsÚfound_channelr   Ú
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+   r]   r   rñ   rò   ÚpauserÚ   rö   Úunpauser^   ©r'   r|   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<   Ú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+   rD   r]   r   rü   rò   rþ   r>   r<   rÚ   rö   )r'   r|   r÷   rA   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	  rD   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  ©Ú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   rC   ra   rD   r   r  )r'   Ú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)rD   r   r  ÚassertTupleEqual)r'   Úlinked_versionÚ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(   r3   r4   r6   r7   r:   r=   rB   rF   rv   ÚskipIfr[   ÚplatformÚ
startswithÚIS_PYPYrp   r}   rV   ÚenvironÚgetr°   r™   r»   rÆ   rD   Ú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 r8   )r   r+   ©Úclsr   r   r   Ú
setUpClass‡  s   zChannelTypeTest.setUpClassc                 C   r.  r8   ©r   r$   r/  r   r   r   ÚtearDownClassŒ  ó   zChannelTypeTest.tearDownClassc                 C   ó   t  ¡ d u rt  ¡  d S d S r8   ©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  Ú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)rC   ra   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)rC   Ú
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$   ÚassertRaisesRegexrD   rE   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î   rP   éd   N)r   rü   r]   r   rò   ró   rD   rô   rõ   rÚ   rö   )r'   r÷   r|   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'   Ú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ü   r]   r   rò   r^   rö   ©r'   r÷   r|   r   r   r   Útest_get_busy__activeÅ  s   

z%ChannelTypeTest.test_get_busy__activec                 C   s   |   ¡  d S r8   ©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ï   é  rP   r   ó    rE  N)r   rü   r-   r	  r/   r]   rò   Úqueuer.   Ú	get_queuer_   rD   rô   rõ   r9   Ú	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ü   r]   r   rò   rS  r.   rþ   r9   )r'   r÷   r|   Ú	got_soundr   r   r   Útest_get_soundô  s   

zChannelTypeTest.test_get_soundc                 C   rF  )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  rJ  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+   rD   r]   r   rò   r  r^   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î   rB  N)
r   r]   r   rò   r$   rC  rD   rE   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
        ÚPYGAME_MSYS2Ú1zSkip test on MSYS2r   rï   rO  é,  rP   r   rP  rE  N)rV   r)  r*  r•   r   rü   r-   r	  r/   r]   rò   rQ  rD   rô   rõ   r^   rö   r.   rS  r9   rR  rÚ   rþ   )r'   r÷   r   r¢   r   rT  rU  Úsound_length_in_ms_3rV  rW  rX  Úsound3r   r   r   Ú
test_queue,  sL   












zChannelTypeTest.test_queuec                 C   st   t  d¡}t  tdƒ¡}| |¡ | ¡  |  | ¡ ¡ | |¡ | ¡  |  | ¡ ¡ | |¡ |  	| ¡ ¡ d S )Nr   rî   )
r   rü   r]   r   rò   rþ   rÚ   rö   rQ  r^   rK  r   r   r   r  f  s   




zChannelTypeTest.test_stopN)r   r   r    Úclassmethodr1  r3  r7  r<  r>  rA  rD  rù   rI  rL  rN  rY  r[  ra  rc  rd  rj  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+   rD   rü   r÷   r]   r   r|   r&   r   r   r   r7    s   zChannelSetVolumeTest.setUpc                 C   r.  r8   r2  r&   r   r   r   r(   †  ó   zChannelSetVolumeTest.tearDownc                 C   s0   | j  | j¡ | j  d¡ |  | j  ¡ d¡ d S )NrO   ©r÷   rò   r|   Ú
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æ?)rq  rr  rn  r&   r   r   r   Ú"test_set_volume_with_two_argumentsŽ  s   z7ChannelSetVolumeTest.test_set_volume_with_two_argumentsN)	r   r   r    r7  r(   rp  rv   r,  rs  r   r   r   r   rl  €  s    rl  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)é(   rv  )rD   Údisplayr+   Úset_moder   r-   r&   r   r   r   r7  ˜  s
   
ÿzChannelEndEventTest.setUpc                 C   s   t j ¡  t ¡  d S r8   )rD   rw  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ü   r]   r   rò   rD   Ú	USEREVENTÚset_endeventÚget_endeventr.   rþ   rö   rô   rõ   Úeventr*  r^   r`   )r'   r÷   r|   Ú	END_EVENTÚgot_end_eventÚeventsr   r   r   Útest_get_endevent¢  s   



ÿz%ChannelEndEventTest.test_get_endeventN)r   r   r    r7  r(   r€  r   r   r   r   ru  —  s    ru  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 )NrK   rL   rM   )	r   r+   r   rV   rW   rX   rÿ   r]   r|   r&   r   r   r   r7  ¼  s   zTestSoundPlay.setUpc                 C   r.  r8   r2  r&   r   r   r   r(   Á  rm  zTestSoundPlay.tearDownc                 C   s,   | j  ¡ }|  |tjj¡ |  | ¡ ¡ dS )zTest playing a sound once.N)r|   rò   r  rD   r   rü   r^   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.rE  rP   r   rP  g     @@r   )Úplacesé   ©Úloopsrï   N)r   r-   r	  r/   r]   r^  r_   rò   r  rD   rü   rô   rõ   r^   rö   rÚ   )	r'   r   r¢   r   rT  rV  r|   Ú	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.rE  rP   r   rP  r’   r…  r   N)r   r-   r	  r/   r]   rò   r  rD   rü   r>   r^   rö   rô   rõ   )	r'   r   r¢   r   rT  rV  r|   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ï   ©Úmaxtimeéú   N)r|   rò   r  rD   r   rü   r^   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ô  ©Úfade_msr  rq  gš™™™™™é?rg  r\  N)r|   rò   r  rD   r   rü   r^   rö   rô   rõ   ÚassertGreaterr]  Ú
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.Úinvalidr…  N©rC   ra   r|   rò   r&   r   r   r   Útest_play_with_invalid_loops  ó   "ÿz*TestSoundPlay.test_play_with_invalid_loopsc                 C   r”  )z*Test playing a sound with invalid maxtime.r•  r‹  Nr–  r&   r   r   r   Útest_play_with_invalid_maxtime  r˜  z,TestSoundPlay.test_play_with_invalid_maxtimec                 C   r”  )z*Test playing a sound with invalid fade_ms.r•  r  Nr–  r&   r   r   r   Útest_play_with_invalid_fade_ms  r˜  z,TestSoundPlay.test_play_with_invalid_fade_msN)r   r   r    r7  r(   r‚  rˆ  rŠ  rŽ  r“  r—  r™  rš  r   r   r   r   r  »  s    r  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.  r8   r2  r/  r   r   r   r3    r4  zSoundTypeTest.tearDownClassc                 C   r5  r8   r6  r/  r   r   r   r7    r8  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.rK   rL   rM   N©r   rV   rW   rX   r   r]   r  )r'   rÿ   rW  rX  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.rK   rL   rq   N)r   rV   rW   rX   rt   r   r]   r  )r'   rÿ   Úfile_objr|   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.rK   rL   rM   Nrœ  )r'   rÿ   Ú	sound_objr|   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.rK   rL   rM   N)	ÚpathlibÚPathr   rV   rW   rX   r   r]   r  )r'   rW   rW  rX  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.NrM  r&   r   r   r   Útodo_test_sound__from_bufferH  r4  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.ÚurK   rL   N)r   r   rV   rW   rX   r   r]   r  )r'   Úarray1rW  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)rC   ra   r   r]   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.rK   rL   rB  rM   N)
r   r$   r   rV   rW   rX   rC  rD   rE   r]   )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ó   abcdefghrQ   rB  N)Úctypesr«  r¬  r­  ÚPyBytes_FromStringÚrestypeÚargtypesr   r]   ÚassertNotEqualrÄ   rD   r$   rC  rE   )r'   r«  r¬  r­  ÚBytes_FromStringÚsamplesÚsample_bytesrI   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   rK   ú	punch.wavrM   r   rB  N)r   rD   r   r$   r+   r   rV   rW   rX   r]   rH   r-   r/   Úfloatr`   r^  r_   rC  rE   )
r'   r   rÿ   r|   Úsound_bytesÚmix_freqÚmix_bitsÚmix_channelsÚ	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.
        rK   rL   rM   r   r   r   rB  N)r   rV   rW   rX   r   r]   r.   r<   rò   rþ   rD   r$   rC  rE   )r'   rÿ   r|   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\  rK   rL   rM   rB  N)r   rV   rW   rX   r   r]   r]  r^  rD   r$   rC  rE   ©r'   r_  rÿ   r|   r`  r   r   r   ra     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\  rK   rL   rM   r’   rB  N)r   rV   rW   rX   r   r]   rò   r]  r^  rD   r$   rC  rE   rÁ  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.ç      €?rK   rL   rM   r’   ©r   g        ©ç{®Gáz„?rÆ  ©çš™™™™™¹?rÈ  ©rO   rO   ©çÍÌÌÌÌÌì?rË  ©ç®Gáz®ï?rÍ  ©r   r\  ©çš™™™™™ñ?r\  ©g       @r\  ©ÚdeltarB  r   N)r   rV   rW   rX   r   r]   r]  ro  r^  rD   r$   rC  rE   ©r'   Úfloat_deltarÿ   r|   Úcurrent_volumeÚvolumesÚ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.rÃ  rK   rL   rM   r’   rÄ  rÅ  rÇ  rÉ  rÊ  rÌ  rÎ  rÏ  rÑ  r…  rÒ  rB  r   N)r   rV   rW   rX   r   r]   r]  rò   ro  r^  rD   r$   rC  rE   rÔ  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   rK   rL   rM   rB  N)r   rV   rW   rX   r   r]   rþ   r.   r<   rD   r$   rC  rE   ©r'   Úexpected_channelsrÿ   r|   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   rK   rL   rM   r’   rB  N)r   rV   rW   rX   r   r]   rò   rþ   r.   r<   rD   r$   rC  rE   rÛ  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.r®  rQ   rB  N)
r   r]   rH   r  Úbytesr.   rD   r$   rC  rE   )r'   rµ  rI   Ú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 )NrM   )ÚsuperÚ__init__)r'   rN   ©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å  rK   rL   z#This should not raise an exception.)	r   r]   r   rV   rW   rX   r]  Ú	Exceptionr³   )r'   rå  rÿ   Ú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 r8   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   r]   rC   ÚRuntimeErrorr]  )r'   ré  Ú	incorrectr   r   r   Útest_incorrect_subclassing=  s   z(SoundTypeTest.test_incorrect_subclassingN)r   r   r    rk  r3  r7  r  rŸ  r¡  r¤  r¥  r¨  r©  rª  rv   r%  r(  r·  r¿  rÀ  ra  rÂ  rÙ  rÚ  r  rÝ  rà  rè  rì  r   r   r   r   r›    s2    
	
	

!"r›  c                   @   rt  )ÚTestSoundFadeoutc                 C   s   t  ¡ d u rtj  ¡  d S d S r8   )r   r-   rD   r+   r&   r   r   r   r7  H  s   ÿzTestSoundFadeout.setUpc                 C   ó   t j ¡  d S r8   ©rD   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.rK   r¸  rM   rP   iÐ  N)r   rV   rW   rX   r   r]   rò   ró   rD   rô   rõ   rÚ   rö   )r'   rÿ   r|   r÷   r   r   r   Útest_fadeout_with_valid_timeO  s   
z-TestSoundFadeout.test_fadeout_with_valid_timeN)r   r   r    r7  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î  r8   )rD   r   r+   r&   r   r   r   r7  {  rð  zTestGetBusy.setUpc                 C   rî  r8   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Ú   rD   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©
rD   r   r]   r   rò   rô   Úsleepr^   rö   rþ   ©r'   r|   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'   rW  rX  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)
rD   r   r]   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ô  rE  rq  N)
rD   r   r]   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î   rP   r  rÐ  Nrõ  r÷  r   r   r   Útest_sound_fading_out»  s
   
z!TestGetBusy.test_sound_fading_outN)r   r   r    r!   r7  r(   ró  rø  rú  rû  rü  rý  r   r   r   r   rò  u  s    
rò  Ú__main__)r[   rV   rv   r¢  r&  rô   r   rÔ   r   rD   r   Úpython_implementationr(  ÚFREQUENCIESr   r   ÚBUFFERSÚCONFIGSr,   r   ÚTestCaser#   r-  rl  ru  r  r›  rí  rò  r   Úmainr   r   r   r   Ú<module>   sL    þ	    [ {$\  2.Qÿ