1#!/usr/local/bin/python3.8
2# vim:fileencoding=utf-8
3# License: GPL v3 Copyright: 2020, Kovid Goyal <kovid at kovidgoyal.net>
4
5from calibre_extensions.winsapi import ISpVoice
6
7
8def develop():
9    spv = ISpVoice()
10    spv.create_recording_wav('test.wav', 'Hello, world!')
11
12
13def find_tests():
14    import unittest
15    import os
16    is_ci = os.environ.get('CI', '').lower() == 'true'
17
18    class TestSAPI(unittest.TestCase):
19
20        def setUp(self):
21            self.sapi = ISpVoice()
22
23        def tearDown(self):
24            self.sapi = None
25
26        def test_enumeration_of_voices(self):
27            default_voice = self.sapi.get_current_voice()
28            self.assertTrue(default_voice)
29            all_voices = self.sapi.get_all_voices()
30            self.assertTrue(all_voices)
31            self.assertIn(default_voice, {x['id'] for x in all_voices})
32            for voice in all_voices:
33                for key in ('name', 'gender', 'age', 'language', 'description'):
34                    self.assertIn(key, voice)
35                self.sapi.set_current_voice(voice['id'])
36                self.assertEqual(self.sapi.get_current_voice(), voice['id'])
37            self.sapi.set_current_voice()
38            self.assertEqual(self.sapi.get_current_voice(), default_voice)
39
40        @unittest.skipIf(is_ci, 'No sound output on CI')
41        def test_enumeration_of_sound_outputs(self):
42            default_output = self.sapi.get_current_sound_output()
43            self.assertTrue(default_output)
44            all_outputs = self.sapi.get_all_sound_outputs()
45            self.assertTrue(all_outputs)
46            self.assertIn(default_output, {x['id'] for x in all_outputs})
47            for output in all_outputs:
48                for key in ('id', 'description',):
49                    self.assertIn(key, output)
50                self.sapi.set_current_voice(output['id'])
51                self.assertEqual(self.sapi.get_current_sound_output(), output['id'])
52            self.sapi.set_current_sound_output()
53            self.assertEqual(self.sapi.get_current_sound_output(), default_output)
54
55        def test_volume_and_rate(self):
56            dr = self.sapi.get_current_rate()
57            new_rate = dr // 2 + 1
58            self.sapi.set_current_rate(new_rate)
59            self.assertEqual(self.sapi.get_current_rate(), new_rate)
60            self.sapi.set_current_rate(dr)
61
62            dv = self.sapi.get_current_volume()
63            new_vol = dv // 2 + 3
64            self.sapi.set_current_volume(new_vol)
65            self.assertEqual(self.sapi.get_current_volume(), new_vol)
66            self.sapi.set_current_volume(dv)
67
68        def test_record_as_audio_file(self):
69            import tempfile
70            with tempfile.TemporaryDirectory() as tdir:
71                wav_path = os.path.join(tdir, 'test.wav')
72                self.sapi.create_recording_wav(wav_path, 'testing microsoft voices')
73                self.assertGreater(os.path.getsize(wav_path), 256)
74
75    return unittest.defaultTestLoader.loadTestsFromTestCase(TestSAPI)
76
77
78def run_tests():
79    from calibre.utils.run_tests import run_tests
80    run_tests(find_tests)
81