1 # Ridiculously simple test of the winsound module for Windows.
4 from test
import test_support
10 winsound
= test_support
.import_module('winsound')
14 """Find out if a particular event is configured with a default sound"""
16 # Ask the mixer API for the number of devices it knows about.
17 # When there are no devices, PlaySound will fail.
18 if ctypes
.windll
.winmm
.mixerGetNumDevs() is 0:
21 key
= _winreg
.OpenKeyEx(_winreg
.HKEY_CURRENT_USER
,
22 "AppEvents\Schemes\Apps\.Default\{0}\.Default".format(sound
))
23 value
= _winreg
.EnumValue(key
, 0)[1]
31 class BeepTest(unittest
.TestCase
):
32 # As with PlaySoundTest, incorporate the _have_soundcard() check
33 # into our test methods. If there's no audio device present,
34 # winsound.Beep returns 0 and GetLastError() returns 127, which
35 # is: ERROR_PROC_NOT_FOUND ("The specified procedure could not
36 # be found"). (FWIW, virtual/Hyper-V systems fall under this
37 # scenario as they have no sound devices whatsoever (not even
38 # a legacy Beep device).)
40 def test_errors(self
):
41 self
.assertRaises(TypeError, winsound
.Beep
)
42 self
.assertRaises(ValueError, winsound
.Beep
, 36, 75)
43 self
.assertRaises(ValueError, winsound
.Beep
, 32768, 75)
45 def test_extremes(self
):
49 def test_increasingfrequency(self
):
50 for i
in xrange(100, 2000, 100):
53 def _beep(self
, *args
):
54 # these tests used to use _have_soundcard(), but it's quite
55 # possible to have a soundcard, and yet have the beep driver
56 # disabled. So basically, we have no way of knowing whether
57 # a beep should be produced or not, so currently if these
58 # tests fail we're ignoring them
60 # XXX the right fix for this is to define something like
61 # _have_enabled_beep_driver() and use that instead of the
68 class MessageBeepTest(unittest
.TestCase
):
73 def test_default(self
):
74 self
.assertRaises(TypeError, winsound
.MessageBeep
, "bad")
75 self
.assertRaises(TypeError, winsound
.MessageBeep
, 42, 42)
76 winsound
.MessageBeep()
79 winsound
.MessageBeep(winsound
.MB_OK
)
81 def test_asterisk(self
):
82 winsound
.MessageBeep(winsound
.MB_ICONASTERISK
)
84 def test_exclamation(self
):
85 winsound
.MessageBeep(winsound
.MB_ICONEXCLAMATION
)
88 winsound
.MessageBeep(winsound
.MB_ICONHAND
)
90 def test_question(self
):
91 winsound
.MessageBeep(winsound
.MB_ICONQUESTION
)
94 class PlaySoundTest(unittest
.TestCase
):
96 def test_errors(self
):
97 self
.assertRaises(TypeError, winsound
.PlaySound
)
98 self
.assertRaises(TypeError, winsound
.PlaySound
, "bad", "bad")
102 "none", winsound
.SND_ASYNC | winsound
.SND_MEMORY
105 @unittest.skipUnless(has_sound("SystemAsterisk"), "No default SystemAsterisk")
106 def test_alias_asterisk(self
):
107 if _have_soundcard():
108 winsound
.PlaySound('SystemAsterisk', winsound
.SND_ALIAS
)
113 'SystemAsterisk', winsound
.SND_ALIAS
116 @unittest.skipUnless(has_sound("SystemExclamation"), "No default SystemExclamation")
117 def test_alias_exclamation(self
):
118 if _have_soundcard():
119 winsound
.PlaySound('SystemExclamation', winsound
.SND_ALIAS
)
124 'SystemExclamation', winsound
.SND_ALIAS
127 @unittest.skipUnless(has_sound("SystemExit"), "No default SystemExit")
128 def test_alias_exit(self
):
129 if _have_soundcard():
130 winsound
.PlaySound('SystemExit', winsound
.SND_ALIAS
)
135 'SystemExit', winsound
.SND_ALIAS
138 @unittest.skipUnless(has_sound("SystemHand"), "No default SystemHand")
139 def test_alias_hand(self
):
140 if _have_soundcard():
141 winsound
.PlaySound('SystemHand', winsound
.SND_ALIAS
)
146 'SystemHand', winsound
.SND_ALIAS
149 @unittest.skipUnless(has_sound("SystemQuestion"), "No default SystemQuestion")
150 def test_alias_question(self
):
151 if _have_soundcard():
152 winsound
.PlaySound('SystemQuestion', winsound
.SND_ALIAS
)
157 'SystemQuestion', winsound
.SND_ALIAS
160 def test_alias_fallback(self
):
161 # This test can't be expected to work on all systems. The MS
162 # PlaySound() docs say:
164 # If it cannot find the specified sound, PlaySound uses the
165 # default system event sound entry instead. If the function
166 # can find neither the system default entry nor the default
167 # sound, it makes no sound and returns FALSE.
169 # It's known to return FALSE on some real systems.
171 # winsound.PlaySound('!"$%&/(#+*', winsound.SND_ALIAS)
174 def test_alias_nofallback(self
):
175 if _have_soundcard():
176 # Note that this is not the same as asserting RuntimeError
177 # will get raised: you cannot convert this to
178 # self.assertRaises(...) form. The attempt may or may not
179 # raise RuntimeError, but it shouldn't raise anything other
180 # than RuntimeError, and that's all we're trying to test
181 # here. The MS docs aren't clear about whether the SDK
182 # PlaySound() with SND_ALIAS and SND_NODEFAULT will return
183 # True or False when the alias is unknown. On Tim's WinXP
184 # box today, it returns True (no exception is raised). What
185 # we'd really like to test is that no sound is played, but
186 # that requires first wiring an eardrum class into unittest
191 winsound
.SND_ALIAS | winsound
.SND_NODEFAULT
199 '!"$%&/(#+*', winsound
.SND_ALIAS | winsound
.SND_NODEFAULT
202 def test_stopasync(self
):
203 if _have_soundcard():
206 winsound
.SND_ALIAS | winsound
.SND_ASYNC | winsound
.SND_LOOP
212 winsound
.SND_ALIAS | winsound
.SND_NOSTOP
216 else: # the first sound might already be finished
218 winsound
.PlaySound(None, winsound
.SND_PURGE
)
220 # Issue 8367: PlaySound(None, winsound.SND_PURGE)
221 # does not raise on systems without a sound card.
225 def _get_cscript_path():
226 """Return the full path to cscript.exe or None."""
227 for dir in os
.environ
.get("PATH", "").split(os
.pathsep
):
228 cscript_path
= os
.path
.join(dir, "cscript.exe")
229 if os
.path
.exists(cscript_path
):
232 __have_soundcard_cache
= None
233 def _have_soundcard():
234 """Return True iff this computer has a soundcard."""
235 global __have_soundcard_cache
236 if __have_soundcard_cache
is None:
237 cscript_path
= _get_cscript_path()
238 if cscript_path
is None:
239 # Could not find cscript.exe to run our VBScript helper. Default
240 # to True: most computers these days *do* have a soundcard.
243 check_script
= os
.path
.join(os
.path
.dirname(__file__
),
244 "check_soundcard.vbs")
245 p
= subprocess
.Popen([cscript_path
, check_script
],
246 stdout
=subprocess
.PIPE
)
247 __have_soundcard_cache
= not p
.wait()
248 return __have_soundcard_cache
252 test_support
.run_unittest(BeepTest
, MessageBeepTest
, PlaySoundTest
)
254 if __name__
=="__main__":