blob: dca77cb45bfa915b4ed8d0064d5d3481f49ab912 [file] [log] [blame]
Guido van Rossum2512d6d2000-04-24 14:01:51 +00001# Ridiculously simple test of the winsound module for Windows.
Guido van Rossumcdd092f2000-04-21 21:28:47 +00002
Zachary Wareb3b7a5a2016-09-05 16:06:56 -05003import functools
Zachary Wareb3b7a5a2016-09-05 16:06:56 -05004import time
5import unittest
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006
Zachary Wareb3b7a5a2016-09-05 16:06:56 -05007from test import support
8
9support.requires('audio')
R. David Murraya21e4ca2009-03-31 23:16:50 +000010winsound = support.import_module('winsound')
11
Brian Curtinae16af22010-06-01 13:49:19 +000012
Zachary Wareb3b7a5a2016-09-05 16:06:56 -050013# Unless we actually have an ear in the room, we have no idea whether a sound
14# actually plays, and it's incredibly flaky trying to figure out if a sound
15# even *should* play. Instead of guessing, just call the function and assume
16# it either passed or raised the RuntimeError we expect in case of failure.
17def sound_func(func):
18 @functools.wraps(func)
19 def wrapper(*args, **kwargs):
20 try:
21 ret = func(*args, **kwargs)
22 except RuntimeError as e:
23 if support.verbose:
24 print(func.__name__, 'failed:', e)
25 else:
26 if support.verbose:
27 print(func.__name__, 'returned')
28 return ret
29 return wrapper
30
31
32safe_Beep = sound_func(winsound.Beep)
33safe_MessageBeep = sound_func(winsound.MessageBeep)
34safe_PlaySound = sound_func(winsound.PlaySound)
35
Walter Dörwald7fd94242003-05-18 00:47:47 +000036
37class BeepTest(unittest.TestCase):
38
39 def test_errors(self):
40 self.assertRaises(TypeError, winsound.Beep)
41 self.assertRaises(ValueError, winsound.Beep, 36, 75)
42 self.assertRaises(ValueError, winsound.Beep, 32768, 75)
43
44 def test_extremes(self):
Zachary Wareb3b7a5a2016-09-05 16:06:56 -050045 safe_Beep(37, 75)
46 safe_Beep(32767, 75)
Walter Dörwald7fd94242003-05-18 00:47:47 +000047
48 def test_increasingfrequency(self):
Amaury Forgeot d'Arc0a665ce2008-03-20 01:02:48 +000049 for i in range(100, 2000, 100):
Zachary Wareb3b7a5a2016-09-05 16:06:56 -050050 safe_Beep(i, 75)
Walter Dörwald7fd94242003-05-18 00:47:47 +000051
Zachary Warec4018812016-09-06 16:32:43 -050052 def test_keyword_args(self):
53 safe_Beep(duration=75, frequency=2000)
54
55
Walter Dörwald7fd94242003-05-18 00:47:47 +000056class MessageBeepTest(unittest.TestCase):
57
58 def tearDown(self):
59 time.sleep(0.5)
60
61 def test_default(self):
62 self.assertRaises(TypeError, winsound.MessageBeep, "bad")
63 self.assertRaises(TypeError, winsound.MessageBeep, 42, 42)
Zachary Wareb3b7a5a2016-09-05 16:06:56 -050064 safe_MessageBeep()
Walter Dörwald7fd94242003-05-18 00:47:47 +000065
66 def test_ok(self):
Zachary Wareb3b7a5a2016-09-05 16:06:56 -050067 safe_MessageBeep(winsound.MB_OK)
Walter Dörwald7fd94242003-05-18 00:47:47 +000068
69 def test_asterisk(self):
Zachary Wareb3b7a5a2016-09-05 16:06:56 -050070 safe_MessageBeep(winsound.MB_ICONASTERISK)
Walter Dörwald7fd94242003-05-18 00:47:47 +000071
72 def test_exclamation(self):
Zachary Wareb3b7a5a2016-09-05 16:06:56 -050073 safe_MessageBeep(winsound.MB_ICONEXCLAMATION)
Walter Dörwald7fd94242003-05-18 00:47:47 +000074
75 def test_hand(self):
Zachary Wareb3b7a5a2016-09-05 16:06:56 -050076 safe_MessageBeep(winsound.MB_ICONHAND)
Walter Dörwald7fd94242003-05-18 00:47:47 +000077
78 def test_question(self):
Zachary Wareb3b7a5a2016-09-05 16:06:56 -050079 safe_MessageBeep(winsound.MB_ICONQUESTION)
Walter Dörwald7fd94242003-05-18 00:47:47 +000080
Zachary Warec4018812016-09-06 16:32:43 -050081 def test_keyword_args(self):
82 safe_MessageBeep(type=winsound.MB_OK)
83
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000084
Walter Dörwald7fd94242003-05-18 00:47:47 +000085class PlaySoundTest(unittest.TestCase):
86
87 def test_errors(self):
88 self.assertRaises(TypeError, winsound.PlaySound)
89 self.assertRaises(TypeError, winsound.PlaySound, "bad", "bad")
90 self.assertRaises(
91 RuntimeError,
92 winsound.PlaySound,
93 "none", winsound.SND_ASYNC | winsound.SND_MEMORY
94 )
Zachary Wareae8298b2016-09-05 16:31:21 -050095 self.assertRaises(TypeError, winsound.PlaySound, b"bad", 0)
96 self.assertRaises(TypeError, winsound.PlaySound, "bad",
97 winsound.SND_MEMORY)
98 self.assertRaises(TypeError, winsound.PlaySound, 1, 0)
Serhiy Storchakaf7eae0a2017-06-28 08:30:06 +030099 # embedded null character
100 self.assertRaises(ValueError, winsound.PlaySound, 'bad\0', 0)
Zachary Wareae8298b2016-09-05 16:31:21 -0500101
Zachary Warec4018812016-09-06 16:32:43 -0500102 def test_keyword_args(self):
103 safe_PlaySound(flags=winsound.SND_ALIAS, sound="SystemExit")
104
Zachary Wareae8298b2016-09-05 16:31:21 -0500105 def test_snd_memory(self):
106 with open(support.findfile('pluck-pcm8.wav',
107 subdir='audiodata'), 'rb') as f:
108 audio_data = f.read()
109 safe_PlaySound(audio_data, winsound.SND_MEMORY)
110 audio_data = bytearray(audio_data)
111 safe_PlaySound(audio_data, winsound.SND_MEMORY)
112
113 def test_snd_filename(self):
114 fn = support.findfile('pluck-pcm8.wav', subdir='audiodata')
115 safe_PlaySound(fn, winsound.SND_FILENAME | winsound.SND_NODEFAULT)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000116
Zachary Wareb3b7a5a2016-09-05 16:06:56 -0500117 def test_aliases(self):
118 aliases = [
119 "SystemAsterisk",
120 "SystemExclamation",
121 "SystemExit",
122 "SystemHand",
123 "SystemQuestion",
124 ]
125 for alias in aliases:
126 with self.subTest(alias=alias):
127 safe_PlaySound(alias, winsound.SND_ALIAS)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000128
129 def test_alias_fallback(self):
Zachary Wareb3b7a5a2016-09-05 16:06:56 -0500130 safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000131
132 def test_alias_nofallback(self):
Zachary Waref4a73812016-09-05 18:08:27 -0500133 safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS | winsound.SND_NODEFAULT)
Walter Dörwald7fd94242003-05-18 00:47:47 +0000134
135 def test_stopasync(self):
Zachary Wareb3b7a5a2016-09-05 16:06:56 -0500136 safe_PlaySound(
137 'SystemQuestion',
138 winsound.SND_ALIAS | winsound.SND_ASYNC | winsound.SND_LOOP
139 )
140 time.sleep(0.5)
141 safe_PlaySound('SystemQuestion', winsound.SND_ALIAS | winsound.SND_NOSTOP)
142 # Issue 8367: PlaySound(None, winsound.SND_PURGE)
143 # does not raise on systems without a sound card.
144 winsound.PlaySound(None, winsound.SND_PURGE)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000145
Walter Dörwald7fd94242003-05-18 00:47:47 +0000146
Zachary Ware38c707e2015-04-13 15:00:43 -0500147if __name__ == "__main__":
148 unittest.main()