test_winsound.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. # Ridiculously simple test of the winsound module for Windows.
  2. import functools
  3. import time
  4. import unittest
  5. from test import support
  6. from test.support import import_helper
  7. support.requires('audio')
  8. winsound = import_helper.import_module('winsound')
  9. # Unless we actually have an ear in the room, we have no idea whether a sound
  10. # actually plays, and it's incredibly flaky trying to figure out if a sound
  11. # even *should* play. Instead of guessing, just call the function and assume
  12. # it either passed or raised the RuntimeError we expect in case of failure.
  13. def sound_func(func):
  14. @functools.wraps(func)
  15. def wrapper(*args, **kwargs):
  16. try:
  17. ret = func(*args, **kwargs)
  18. except RuntimeError as e:
  19. if support.verbose:
  20. print(func.__name__, 'failed:', e)
  21. else:
  22. if support.verbose:
  23. print(func.__name__, 'returned')
  24. return ret
  25. return wrapper
  26. safe_Beep = sound_func(winsound.Beep)
  27. safe_MessageBeep = sound_func(winsound.MessageBeep)
  28. safe_PlaySound = sound_func(winsound.PlaySound)
  29. class BeepTest(unittest.TestCase):
  30. def test_errors(self):
  31. self.assertRaises(TypeError, winsound.Beep)
  32. self.assertRaises(ValueError, winsound.Beep, 36, 75)
  33. self.assertRaises(ValueError, winsound.Beep, 32768, 75)
  34. def test_extremes(self):
  35. safe_Beep(37, 75)
  36. safe_Beep(32767, 75)
  37. def test_increasingfrequency(self):
  38. for i in range(100, 2000, 100):
  39. safe_Beep(i, 75)
  40. def test_keyword_args(self):
  41. safe_Beep(duration=75, frequency=2000)
  42. class MessageBeepTest(unittest.TestCase):
  43. def tearDown(self):
  44. time.sleep(0.5)
  45. def test_default(self):
  46. self.assertRaises(TypeError, winsound.MessageBeep, "bad")
  47. self.assertRaises(TypeError, winsound.MessageBeep, 42, 42)
  48. safe_MessageBeep()
  49. def test_ok(self):
  50. safe_MessageBeep(winsound.MB_OK)
  51. def test_asterisk(self):
  52. safe_MessageBeep(winsound.MB_ICONASTERISK)
  53. def test_exclamation(self):
  54. safe_MessageBeep(winsound.MB_ICONEXCLAMATION)
  55. def test_hand(self):
  56. safe_MessageBeep(winsound.MB_ICONHAND)
  57. def test_question(self):
  58. safe_MessageBeep(winsound.MB_ICONQUESTION)
  59. def test_keyword_args(self):
  60. safe_MessageBeep(type=winsound.MB_OK)
  61. class PlaySoundTest(unittest.TestCase):
  62. def test_errors(self):
  63. self.assertRaises(TypeError, winsound.PlaySound)
  64. self.assertRaises(TypeError, winsound.PlaySound, "bad", "bad")
  65. self.assertRaises(
  66. RuntimeError,
  67. winsound.PlaySound,
  68. "none", winsound.SND_ASYNC | winsound.SND_MEMORY
  69. )
  70. self.assertRaises(TypeError, winsound.PlaySound, b"bad", 0)
  71. self.assertRaises(TypeError, winsound.PlaySound, "bad",
  72. winsound.SND_MEMORY)
  73. self.assertRaises(TypeError, winsound.PlaySound, 1, 0)
  74. # embedded null character
  75. self.assertRaises(ValueError, winsound.PlaySound, 'bad\0', 0)
  76. def test_keyword_args(self):
  77. safe_PlaySound(flags=winsound.SND_ALIAS, sound="SystemExit")
  78. def test_snd_memory(self):
  79. with open(support.findfile('pluck-pcm8.wav',
  80. subdir='audiodata'), 'rb') as f:
  81. audio_data = f.read()
  82. safe_PlaySound(audio_data, winsound.SND_MEMORY)
  83. audio_data = bytearray(audio_data)
  84. safe_PlaySound(audio_data, winsound.SND_MEMORY)
  85. def test_snd_filename(self):
  86. fn = support.findfile('pluck-pcm8.wav', subdir='audiodata')
  87. safe_PlaySound(fn, winsound.SND_FILENAME | winsound.SND_NODEFAULT)
  88. def test_aliases(self):
  89. aliases = [
  90. "SystemAsterisk",
  91. "SystemExclamation",
  92. "SystemExit",
  93. "SystemHand",
  94. "SystemQuestion",
  95. ]
  96. for alias in aliases:
  97. with self.subTest(alias=alias):
  98. safe_PlaySound(alias, winsound.SND_ALIAS)
  99. def test_alias_fallback(self):
  100. safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS)
  101. def test_alias_nofallback(self):
  102. safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS | winsound.SND_NODEFAULT)
  103. def test_stopasync(self):
  104. safe_PlaySound(
  105. 'SystemQuestion',
  106. winsound.SND_ALIAS | winsound.SND_ASYNC | winsound.SND_LOOP
  107. )
  108. time.sleep(0.5)
  109. safe_PlaySound('SystemQuestion', winsound.SND_ALIAS | winsound.SND_NOSTOP)
  110. # Issue 8367: PlaySound(None, winsound.SND_PURGE)
  111. # does not raise on systems without a sound card.
  112. winsound.PlaySound(None, winsound.SND_PURGE)
  113. if __name__ == "__main__":
  114. unittest.main()