17db96d56Sopenharmony_ci# Ridiculously simple test of the winsound module for Windows.
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciimport functools
47db96d56Sopenharmony_ciimport time
57db96d56Sopenharmony_ciimport unittest
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_cifrom test import support
87db96d56Sopenharmony_cifrom test.support import import_helper
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_cisupport.requires('audio')
127db96d56Sopenharmony_ciwinsound = import_helper.import_module('winsound')
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci# Unless we actually have an ear in the room, we have no idea whether a sound
167db96d56Sopenharmony_ci# actually plays, and it's incredibly flaky trying to figure out if a sound
177db96d56Sopenharmony_ci# even *should* play.  Instead of guessing, just call the function and assume
187db96d56Sopenharmony_ci# it either passed or raised the RuntimeError we expect in case of failure.
197db96d56Sopenharmony_cidef sound_func(func):
207db96d56Sopenharmony_ci    @functools.wraps(func)
217db96d56Sopenharmony_ci    def wrapper(*args, **kwargs):
227db96d56Sopenharmony_ci        try:
237db96d56Sopenharmony_ci            ret = func(*args, **kwargs)
247db96d56Sopenharmony_ci        except RuntimeError as e:
257db96d56Sopenharmony_ci            if support.verbose:
267db96d56Sopenharmony_ci                print(func.__name__, 'failed:', e)
277db96d56Sopenharmony_ci        else:
287db96d56Sopenharmony_ci            if support.verbose:
297db96d56Sopenharmony_ci                print(func.__name__, 'returned')
307db96d56Sopenharmony_ci            return ret
317db96d56Sopenharmony_ci    return wrapper
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_cisafe_Beep = sound_func(winsound.Beep)
357db96d56Sopenharmony_cisafe_MessageBeep = sound_func(winsound.MessageBeep)
367db96d56Sopenharmony_cisafe_PlaySound = sound_func(winsound.PlaySound)
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ciclass BeepTest(unittest.TestCase):
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci    def test_errors(self):
427db96d56Sopenharmony_ci        self.assertRaises(TypeError, winsound.Beep)
437db96d56Sopenharmony_ci        self.assertRaises(ValueError, winsound.Beep, 36, 75)
447db96d56Sopenharmony_ci        self.assertRaises(ValueError, winsound.Beep, 32768, 75)
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci    def test_extremes(self):
477db96d56Sopenharmony_ci        safe_Beep(37, 75)
487db96d56Sopenharmony_ci        safe_Beep(32767, 75)
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci    def test_increasingfrequency(self):
517db96d56Sopenharmony_ci        for i in range(100, 2000, 100):
527db96d56Sopenharmony_ci            safe_Beep(i, 75)
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci    def test_keyword_args(self):
557db96d56Sopenharmony_ci        safe_Beep(duration=75, frequency=2000)
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ciclass MessageBeepTest(unittest.TestCase):
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci    def tearDown(self):
617db96d56Sopenharmony_ci        time.sleep(0.5)
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci    def test_default(self):
647db96d56Sopenharmony_ci        self.assertRaises(TypeError, winsound.MessageBeep, "bad")
657db96d56Sopenharmony_ci        self.assertRaises(TypeError, winsound.MessageBeep, 42, 42)
667db96d56Sopenharmony_ci        safe_MessageBeep()
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci    def test_ok(self):
697db96d56Sopenharmony_ci        safe_MessageBeep(winsound.MB_OK)
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci    def test_asterisk(self):
727db96d56Sopenharmony_ci        safe_MessageBeep(winsound.MB_ICONASTERISK)
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci    def test_exclamation(self):
757db96d56Sopenharmony_ci        safe_MessageBeep(winsound.MB_ICONEXCLAMATION)
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci    def test_hand(self):
787db96d56Sopenharmony_ci        safe_MessageBeep(winsound.MB_ICONHAND)
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci    def test_question(self):
817db96d56Sopenharmony_ci        safe_MessageBeep(winsound.MB_ICONQUESTION)
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci    def test_keyword_args(self):
847db96d56Sopenharmony_ci        safe_MessageBeep(type=winsound.MB_OK)
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ciclass PlaySoundTest(unittest.TestCase):
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci    def test_errors(self):
907db96d56Sopenharmony_ci        self.assertRaises(TypeError, winsound.PlaySound)
917db96d56Sopenharmony_ci        self.assertRaises(TypeError, winsound.PlaySound, "bad", "bad")
927db96d56Sopenharmony_ci        self.assertRaises(
937db96d56Sopenharmony_ci            RuntimeError,
947db96d56Sopenharmony_ci            winsound.PlaySound,
957db96d56Sopenharmony_ci            "none", winsound.SND_ASYNC | winsound.SND_MEMORY
967db96d56Sopenharmony_ci        )
977db96d56Sopenharmony_ci        self.assertRaises(TypeError, winsound.PlaySound, b"bad", 0)
987db96d56Sopenharmony_ci        self.assertRaises(TypeError, winsound.PlaySound, "bad",
997db96d56Sopenharmony_ci                          winsound.SND_MEMORY)
1007db96d56Sopenharmony_ci        self.assertRaises(TypeError, winsound.PlaySound, 1, 0)
1017db96d56Sopenharmony_ci        # embedded null character
1027db96d56Sopenharmony_ci        self.assertRaises(ValueError, winsound.PlaySound, 'bad\0', 0)
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci    def test_keyword_args(self):
1057db96d56Sopenharmony_ci        safe_PlaySound(flags=winsound.SND_ALIAS, sound="SystemExit")
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci    def test_snd_memory(self):
1087db96d56Sopenharmony_ci        with open(support.findfile('pluck-pcm8.wav',
1097db96d56Sopenharmony_ci                                   subdir='audiodata'), 'rb') as f:
1107db96d56Sopenharmony_ci            audio_data = f.read()
1117db96d56Sopenharmony_ci        safe_PlaySound(audio_data, winsound.SND_MEMORY)
1127db96d56Sopenharmony_ci        audio_data = bytearray(audio_data)
1137db96d56Sopenharmony_ci        safe_PlaySound(audio_data, winsound.SND_MEMORY)
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci    def test_snd_filename(self):
1167db96d56Sopenharmony_ci        fn = support.findfile('pluck-pcm8.wav', subdir='audiodata')
1177db96d56Sopenharmony_ci        safe_PlaySound(fn, winsound.SND_FILENAME | winsound.SND_NODEFAULT)
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci    def test_aliases(self):
1207db96d56Sopenharmony_ci        aliases = [
1217db96d56Sopenharmony_ci            "SystemAsterisk",
1227db96d56Sopenharmony_ci            "SystemExclamation",
1237db96d56Sopenharmony_ci            "SystemExit",
1247db96d56Sopenharmony_ci            "SystemHand",
1257db96d56Sopenharmony_ci            "SystemQuestion",
1267db96d56Sopenharmony_ci        ]
1277db96d56Sopenharmony_ci        for alias in aliases:
1287db96d56Sopenharmony_ci            with self.subTest(alias=alias):
1297db96d56Sopenharmony_ci                safe_PlaySound(alias, winsound.SND_ALIAS)
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci    def test_alias_fallback(self):
1327db96d56Sopenharmony_ci        safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS)
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci    def test_alias_nofallback(self):
1357db96d56Sopenharmony_ci        safe_PlaySound('!"$%&/(#+*', winsound.SND_ALIAS | winsound.SND_NODEFAULT)
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci    def test_stopasync(self):
1387db96d56Sopenharmony_ci        safe_PlaySound(
1397db96d56Sopenharmony_ci            'SystemQuestion',
1407db96d56Sopenharmony_ci            winsound.SND_ALIAS | winsound.SND_ASYNC | winsound.SND_LOOP
1417db96d56Sopenharmony_ci        )
1427db96d56Sopenharmony_ci        time.sleep(0.5)
1437db96d56Sopenharmony_ci        safe_PlaySound('SystemQuestion', winsound.SND_ALIAS | winsound.SND_NOSTOP)
1447db96d56Sopenharmony_ci        # Issue 8367: PlaySound(None, winsound.SND_PURGE)
1457db96d56Sopenharmony_ci        # does not raise on systems without a sound card.
1467db96d56Sopenharmony_ci        winsound.PlaySound(None, winsound.SND_PURGE)
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ciif __name__ == "__main__":
1507db96d56Sopenharmony_ci    unittest.main()
151