Home | History | Annotate | Download | only in test
      1 # Ridiculously simple test of the winsound module for Windows.
      2 
      3 import functools
      4 import time
      5 import unittest
      6 
      7 from test import support
      8 
      9 support.requires('audio')
     10 winsound = support.import_module('winsound')
     11 
     12 
     13 # 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.
     17 def 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 
     32 safe_Beep = sound_func(winsound.Beep)
     33 safe_MessageBeep = sound_func(winsound.MessageBeep)
     34 safe_PlaySound = sound_func(winsound.PlaySound)
     35 
     36 
     37 class 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):
     45         safe_Beep(37, 75)
     46         safe_Beep(32767, 75)
     47 
     48     def test_increasingfrequency(self):
     49         for i in range(100, 2000, 100):
     50             safe_Beep(i, 75)
     51 
     52     def test_keyword_args(self):
     53         safe_Beep(duration=75, frequency=2000)
     54 
     55 
     56 class 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)
     64         safe_MessageBeep()
     65 
     66     def test_ok(self):
     67         safe_MessageBeep(winsound.MB_OK)
     68 
     69     def test_asterisk(self):
     70         safe_MessageBeep(winsound.MB_ICONASTERISK)
     71 
     72     def test_exclamation(self):
     73         safe_MessageBeep(winsound.MB_ICONEXCLAMATION)
     74 
     75     def test_hand(self):
     76         safe_MessageBeep(winsound.MB_ICONHAND)
     77 
     78     def test_question(self):
     79         safe_MessageBeep(winsound.MB_ICONQUESTION)
     80 
     81     def test_keyword_args(self):
     82         safe_MessageBeep(type=winsound.MB_OK)
     83 
     84 
     85 class 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         )
     95         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)
     99         # embedded null character
    100         self.assertRaises(ValueError, winsound.PlaySound, 'bad\0', 0)
    101 
    102     def test_keyword_args(self):
    103         safe_PlaySound(flags=winsound.SND_ALIAS, sound="SystemExit")
    104 
    105     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)
    116 
    117     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)
    128 
    129     def test_alias_fallback(self):
    130         safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS)
    131 
    132     def test_alias_nofallback(self):
    133         safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS | winsound.SND_NODEFAULT)
    134 
    135     def test_stopasync(self):
    136         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)
    145 
    146 
    147 if __name__ == "__main__":
    148     unittest.main()
    149