Home | History | Annotate | Download | only in test
      1 # Ridiculously simple test of the winsound module for Windows.
      2 
      3 import functools
      4 import os
      5 import subprocess
      6 import time
      7 import unittest
      8 
      9 from test import support
     10 
     11 support.requires('audio')
     12 winsound = support.import_module('winsound')
     13 
     14 
     15 # Unless we actually have an ear in the room, we have no idea whether a sound
     16 # actually plays, and it's incredibly flaky trying to figure out if a sound
     17 # even *should* play.  Instead of guessing, just call the function and assume
     18 # it either passed or raised the RuntimeError we expect in case of failure.
     19 def sound_func(func):
     20     @functools.wraps(func)
     21     def wrapper(*args, **kwargs):
     22         try:
     23             ret = func(*args, **kwargs)
     24         except RuntimeError as e:
     25             if support.verbose:
     26                 print(func.__name__, 'failed:', e)
     27         else:
     28             if support.verbose:
     29                 print(func.__name__, 'returned')
     30             return ret
     31     return wrapper
     32 
     33 
     34 safe_Beep = sound_func(winsound.Beep)
     35 safe_MessageBeep = sound_func(winsound.MessageBeep)
     36 safe_PlaySound = sound_func(winsound.PlaySound)
     37 
     38 
     39 class BeepTest(unittest.TestCase):
     40 
     41     def test_errors(self):
     42         self.assertRaises(TypeError, winsound.Beep)
     43         self.assertRaises(ValueError, winsound.Beep, 36, 75)
     44         self.assertRaises(ValueError, winsound.Beep, 32768, 75)
     45 
     46     def test_extremes(self):
     47         safe_Beep(37, 75)
     48         safe_Beep(32767, 75)
     49 
     50     def test_increasingfrequency(self):
     51         for i in range(100, 2000, 100):
     52             safe_Beep(i, 75)
     53 
     54     def test_keyword_args(self):
     55         safe_Beep(duration=75, frequency=2000)
     56 
     57 
     58 class MessageBeepTest(unittest.TestCase):
     59 
     60     def tearDown(self):
     61         time.sleep(0.5)
     62 
     63     def test_default(self):
     64         self.assertRaises(TypeError, winsound.MessageBeep, "bad")
     65         self.assertRaises(TypeError, winsound.MessageBeep, 42, 42)
     66         safe_MessageBeep()
     67 
     68     def test_ok(self):
     69         safe_MessageBeep(winsound.MB_OK)
     70 
     71     def test_asterisk(self):
     72         safe_MessageBeep(winsound.MB_ICONASTERISK)
     73 
     74     def test_exclamation(self):
     75         safe_MessageBeep(winsound.MB_ICONEXCLAMATION)
     76 
     77     def test_hand(self):
     78         safe_MessageBeep(winsound.MB_ICONHAND)
     79 
     80     def test_question(self):
     81         safe_MessageBeep(winsound.MB_ICONQUESTION)
     82 
     83     def test_keyword_args(self):
     84         safe_MessageBeep(type=winsound.MB_OK)
     85 
     86 
     87 class PlaySoundTest(unittest.TestCase):
     88 
     89     def test_errors(self):
     90         self.assertRaises(TypeError, winsound.PlaySound)
     91         self.assertRaises(TypeError, winsound.PlaySound, "bad", "bad")
     92         self.assertRaises(
     93             RuntimeError,
     94             winsound.PlaySound,
     95             "none", winsound.SND_ASYNC | winsound.SND_MEMORY
     96         )
     97         self.assertRaises(TypeError, winsound.PlaySound, b"bad", 0)
     98         self.assertRaises(TypeError, winsound.PlaySound, "bad",
     99                           winsound.SND_MEMORY)
    100         self.assertRaises(TypeError, winsound.PlaySound, 1, 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