2000-04-24 11:01:51 -03:00
|
|
|
# Ridiculously simple test of the winsound module for Windows.
|
2000-04-21 18:28:47 -03:00
|
|
|
|
2016-09-05 18:06:56 -03:00
|
|
|
import functools
|
2022-05-22 22:54:24 -03:00
|
|
|
import pathlib
|
2016-09-05 18:06:56 -03:00
|
|
|
import time
|
|
|
|
import unittest
|
|
|
|
|
|
|
|
from test import support
|
2020-08-06 08:51:29 -03:00
|
|
|
from test.support import import_helper
|
|
|
|
|
2006-04-21 07:40:58 -03:00
|
|
|
|
2016-09-05 18:06:56 -03:00
|
|
|
support.requires('audio')
|
2020-08-06 08:51:29 -03:00
|
|
|
winsound = import_helper.import_module('winsound')
|
2016-09-05 18:06:56 -03:00
|
|
|
|
|
|
|
|
|
|
|
# Unless we actually have an ear in the room, we have no idea whether a sound
|
|
|
|
# actually plays, and it's incredibly flaky trying to figure out if a sound
|
|
|
|
# even *should* play. Instead of guessing, just call the function and assume
|
|
|
|
# it either passed or raised the RuntimeError we expect in case of failure.
|
|
|
|
def sound_func(func):
|
|
|
|
@functools.wraps(func)
|
|
|
|
def wrapper(*args, **kwargs):
|
|
|
|
try:
|
|
|
|
ret = func(*args, **kwargs)
|
|
|
|
except RuntimeError as e:
|
|
|
|
if support.verbose:
|
|
|
|
print(func.__name__, 'failed:', e)
|
|
|
|
else:
|
|
|
|
if support.verbose:
|
|
|
|
print(func.__name__, 'returned')
|
|
|
|
return ret
|
|
|
|
return wrapper
|
|
|
|
|
|
|
|
|
|
|
|
safe_Beep = sound_func(winsound.Beep)
|
|
|
|
safe_MessageBeep = sound_func(winsound.MessageBeep)
|
|
|
|
safe_PlaySound = sound_func(winsound.PlaySound)
|
|
|
|
|
2003-05-17 21:47:47 -03:00
|
|
|
|
|
|
|
class BeepTest(unittest.TestCase):
|
|
|
|
|
|
|
|
def test_errors(self):
|
|
|
|
self.assertRaises(TypeError, winsound.Beep)
|
|
|
|
self.assertRaises(ValueError, winsound.Beep, 36, 75)
|
|
|
|
self.assertRaises(ValueError, winsound.Beep, 32768, 75)
|
|
|
|
|
|
|
|
def test_extremes(self):
|
2016-09-05 18:06:56 -03:00
|
|
|
safe_Beep(37, 75)
|
|
|
|
safe_Beep(32767, 75)
|
2003-05-17 21:47:47 -03:00
|
|
|
|
|
|
|
def test_increasingfrequency(self):
|
2008-03-19 22:02:48 -03:00
|
|
|
for i in range(100, 2000, 100):
|
2016-09-05 18:06:56 -03:00
|
|
|
safe_Beep(i, 75)
|
2003-05-17 21:47:47 -03:00
|
|
|
|
2016-09-06 18:32:43 -03:00
|
|
|
def test_keyword_args(self):
|
|
|
|
safe_Beep(duration=75, frequency=2000)
|
|
|
|
|
|
|
|
|
2003-05-17 21:47:47 -03:00
|
|
|
class MessageBeepTest(unittest.TestCase):
|
|
|
|
|
|
|
|
def tearDown(self):
|
|
|
|
time.sleep(0.5)
|
|
|
|
|
|
|
|
def test_default(self):
|
|
|
|
self.assertRaises(TypeError, winsound.MessageBeep, "bad")
|
|
|
|
self.assertRaises(TypeError, winsound.MessageBeep, 42, 42)
|
2016-09-05 18:06:56 -03:00
|
|
|
safe_MessageBeep()
|
2003-05-17 21:47:47 -03:00
|
|
|
|
|
|
|
def test_ok(self):
|
2016-09-05 18:06:56 -03:00
|
|
|
safe_MessageBeep(winsound.MB_OK)
|
2003-05-17 21:47:47 -03:00
|
|
|
|
|
|
|
def test_asterisk(self):
|
2016-09-05 18:06:56 -03:00
|
|
|
safe_MessageBeep(winsound.MB_ICONASTERISK)
|
2003-05-17 21:47:47 -03:00
|
|
|
|
|
|
|
def test_exclamation(self):
|
2016-09-05 18:06:56 -03:00
|
|
|
safe_MessageBeep(winsound.MB_ICONEXCLAMATION)
|
2003-05-17 21:47:47 -03:00
|
|
|
|
|
|
|
def test_hand(self):
|
2016-09-05 18:06:56 -03:00
|
|
|
safe_MessageBeep(winsound.MB_ICONHAND)
|
2003-05-17 21:47:47 -03:00
|
|
|
|
|
|
|
def test_question(self):
|
2016-09-05 18:06:56 -03:00
|
|
|
safe_MessageBeep(winsound.MB_ICONQUESTION)
|
2003-05-17 21:47:47 -03:00
|
|
|
|
2016-09-06 18:32:43 -03:00
|
|
|
def test_keyword_args(self):
|
|
|
|
safe_MessageBeep(type=winsound.MB_OK)
|
|
|
|
|
2006-04-21 07:40:58 -03:00
|
|
|
|
2022-05-22 22:54:24 -03:00
|
|
|
# A class for testing winsound when the given path resolves
|
|
|
|
# to bytes rather than str.
|
|
|
|
class BytesPath(pathlib.WindowsPath):
|
|
|
|
def __fspath__(self):
|
|
|
|
return bytes(super().__fspath__(), 'UTF-8')
|
|
|
|
|
|
|
|
|
2003-05-17 21:47:47 -03:00
|
|
|
class PlaySoundTest(unittest.TestCase):
|
|
|
|
|
|
|
|
def test_errors(self):
|
|
|
|
self.assertRaises(TypeError, winsound.PlaySound)
|
|
|
|
self.assertRaises(TypeError, winsound.PlaySound, "bad", "bad")
|
|
|
|
self.assertRaises(
|
|
|
|
RuntimeError,
|
|
|
|
winsound.PlaySound,
|
|
|
|
"none", winsound.SND_ASYNC | winsound.SND_MEMORY
|
|
|
|
)
|
2016-09-05 18:31:21 -03:00
|
|
|
self.assertRaises(TypeError, winsound.PlaySound, b"bad", 0)
|
|
|
|
self.assertRaises(TypeError, winsound.PlaySound, "bad",
|
|
|
|
winsound.SND_MEMORY)
|
|
|
|
self.assertRaises(TypeError, winsound.PlaySound, 1, 0)
|
2017-06-28 02:30:06 -03:00
|
|
|
# embedded null character
|
|
|
|
self.assertRaises(ValueError, winsound.PlaySound, 'bad\0', 0)
|
2016-09-05 18:31:21 -03:00
|
|
|
|
2016-09-06 18:32:43 -03:00
|
|
|
def test_keyword_args(self):
|
|
|
|
safe_PlaySound(flags=winsound.SND_ALIAS, sound="SystemExit")
|
|
|
|
|
2016-09-05 18:31:21 -03:00
|
|
|
def test_snd_memory(self):
|
|
|
|
with open(support.findfile('pluck-pcm8.wav',
|
|
|
|
subdir='audiodata'), 'rb') as f:
|
|
|
|
audio_data = f.read()
|
|
|
|
safe_PlaySound(audio_data, winsound.SND_MEMORY)
|
|
|
|
audio_data = bytearray(audio_data)
|
|
|
|
safe_PlaySound(audio_data, winsound.SND_MEMORY)
|
|
|
|
|
|
|
|
def test_snd_filename(self):
|
|
|
|
fn = support.findfile('pluck-pcm8.wav', subdir='audiodata')
|
|
|
|
safe_PlaySound(fn, winsound.SND_FILENAME | winsound.SND_NODEFAULT)
|
2003-05-17 21:47:47 -03:00
|
|
|
|
2022-05-22 22:54:24 -03:00
|
|
|
def test_snd_filepath(self):
|
|
|
|
fn = support.findfile('pluck-pcm8.wav', subdir='audiodata')
|
|
|
|
path = pathlib.Path(fn)
|
|
|
|
safe_PlaySound(path, winsound.SND_FILENAME | winsound.SND_NODEFAULT)
|
|
|
|
|
|
|
|
def test_snd_filepath_as_bytes(self):
|
|
|
|
fn = support.findfile('pluck-pcm8.wav', subdir='audiodata')
|
|
|
|
self.assertRaises(
|
|
|
|
TypeError,
|
|
|
|
winsound.PlaySound,
|
|
|
|
BytesPath(fn),
|
|
|
|
winsound.SND_FILENAME | winsound.SND_NODEFAULT
|
|
|
|
)
|
|
|
|
|
2016-09-05 18:06:56 -03:00
|
|
|
def test_aliases(self):
|
|
|
|
aliases = [
|
|
|
|
"SystemAsterisk",
|
|
|
|
"SystemExclamation",
|
|
|
|
"SystemExit",
|
|
|
|
"SystemHand",
|
|
|
|
"SystemQuestion",
|
|
|
|
]
|
|
|
|
for alias in aliases:
|
|
|
|
with self.subTest(alias=alias):
|
|
|
|
safe_PlaySound(alias, winsound.SND_ALIAS)
|
2003-05-17 21:47:47 -03:00
|
|
|
|
|
|
|
def test_alias_fallback(self):
|
2016-09-05 18:06:56 -03:00
|
|
|
safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS)
|
2003-05-17 21:47:47 -03:00
|
|
|
|
|
|
|
def test_alias_nofallback(self):
|
2016-09-05 20:08:27 -03:00
|
|
|
safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS | winsound.SND_NODEFAULT)
|
2003-05-17 21:47:47 -03:00
|
|
|
|
|
|
|
def test_stopasync(self):
|
2016-09-05 18:06:56 -03:00
|
|
|
safe_PlaySound(
|
|
|
|
'SystemQuestion',
|
|
|
|
winsound.SND_ALIAS | winsound.SND_ASYNC | winsound.SND_LOOP
|
|
|
|
)
|
|
|
|
time.sleep(0.5)
|
|
|
|
safe_PlaySound('SystemQuestion', winsound.SND_ALIAS | winsound.SND_NOSTOP)
|
|
|
|
# Issue 8367: PlaySound(None, winsound.SND_PURGE)
|
|
|
|
# does not raise on systems without a sound card.
|
|
|
|
winsound.PlaySound(None, winsound.SND_PURGE)
|
2006-04-21 07:40:58 -03:00
|
|
|
|
2003-05-17 21:47:47 -03:00
|
|
|
|
2015-04-13 17:00:43 -03:00
|
|
|
if __name__ == "__main__":
|
|
|
|
unittest.main()
|