(root)/
Python-3.11.7/
Lib/
test/
test_winsound.py
       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  from test.support import import_helper
       9  
      10  
      11  support.requires('audio')
      12  winsound = import_helper.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 ESC[4;38;5;81mBeepTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
      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 ESC[4;38;5;81mMessageBeepTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
      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 ESC[4;38;5;81mPlaySoundTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
      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          # embedded null character
     102          self.assertRaises(ValueError, winsound.PlaySound, 'bad\0', 0)
     103  
     104      def test_keyword_args(self):
     105          safe_PlaySound(flags=winsound.SND_ALIAS, sound="SystemExit")
     106  
     107      def test_snd_memory(self):
     108          with open(support.findfile('pluck-pcm8.wav',
     109                                     subdir='audiodata'), 'rb') as f:
     110              audio_data = f.read()
     111          safe_PlaySound(audio_data, winsound.SND_MEMORY)
     112          audio_data = bytearray(audio_data)
     113          safe_PlaySound(audio_data, winsound.SND_MEMORY)
     114  
     115      def test_snd_filename(self):
     116          fn = support.findfile('pluck-pcm8.wav', subdir='audiodata')
     117          safe_PlaySound(fn, winsound.SND_FILENAME | winsound.SND_NODEFAULT)
     118  
     119      def test_aliases(self):
     120          aliases = [
     121              "SystemAsterisk",
     122              "SystemExclamation",
     123              "SystemExit",
     124              "SystemHand",
     125              "SystemQuestion",
     126          ]
     127          for alias in aliases:
     128              with self.subTest(alias=alias):
     129                  safe_PlaySound(alias, winsound.SND_ALIAS)
     130  
     131      def test_alias_fallback(self):
     132          safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS)
     133  
     134      def test_alias_nofallback(self):
     135          safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS | winsound.SND_NODEFAULT)
     136  
     137      def test_stopasync(self):
     138          safe_PlaySound(
     139              'SystemQuestion',
     140              winsound.SND_ALIAS | winsound.SND_ASYNC | winsound.SND_LOOP
     141          )
     142          time.sleep(0.5)
     143          safe_PlaySound('SystemQuestion', winsound.SND_ALIAS | winsound.SND_NOSTOP)
     144          # Issue 8367: PlaySound(None, winsound.SND_PURGE)
     145          # does not raise on systems without a sound card.
     146          winsound.PlaySound(None, winsound.SND_PURGE)
     147  
     148  
     149  if __name__ == "__main__":
     150      unittest.main()