blob: e9ee15ca9ac0c03b7d611ef30a345bb85738b575 [file] [log] [blame]
R David Murrayc91d5ee2013-07-31 13:46:08 -04001from test.support import TESTFN, unlink
Guido van Rossuma00afc12000-10-09 20:05:59 +00002import wave
Christian Heimes2202f872008-02-06 14:31:34 +00003import unittest
Guido van Rossuma00afc12000-10-09 20:05:59 +00004
5nchannels = 2
6sampwidth = 2
7framerate = 8000
8nframes = 100
9
Christian Heimes2202f872008-02-06 14:31:34 +000010class TestWave(unittest.TestCase):
Guido van Rossuma00afc12000-10-09 20:05:59 +000011
Christian Heimes2202f872008-02-06 14:31:34 +000012 def setUp(self):
13 self.f = None
Guido van Rossuma00afc12000-10-09 20:05:59 +000014
Christian Heimes2202f872008-02-06 14:31:34 +000015 def tearDown(self):
16 if self.f is not None:
17 self.f.close()
R David Murrayc91d5ee2013-07-31 13:46:08 -040018 unlink(TESTFN)
Christian Heimes2202f872008-02-06 14:31:34 +000019
Mark Dickinson64a38c02010-08-28 17:22:16 +000020 def test_it(self, test_rounding=False):
Christian Heimes2202f872008-02-06 14:31:34 +000021 self.f = wave.open(TESTFN, 'wb')
22 self.f.setnchannels(nchannels)
23 self.f.setsampwidth(sampwidth)
Mark Dickinson64a38c02010-08-28 17:22:16 +000024 if test_rounding:
25 self.f.setframerate(framerate - 0.1)
26 else:
27 self.f.setframerate(framerate)
Christian Heimes2202f872008-02-06 14:31:34 +000028 self.f.setnframes(nframes)
29 output = b'\0' * nframes * nchannels * sampwidth
30 self.f.writeframes(output)
31 self.f.close()
32
33 self.f = wave.open(TESTFN, 'rb')
34 self.assertEqual(nchannels, self.f.getnchannels())
35 self.assertEqual(sampwidth, self.f.getsampwidth())
36 self.assertEqual(framerate, self.f.getframerate())
37 self.assertEqual(nframes, self.f.getnframes())
38 self.assertEqual(self.f.readframes(nframes), output)
39
Mark Dickinson64a38c02010-08-28 17:22:16 +000040 def test_fractional_framerate(self):
41 """
42 Addresses [ 1512791 ] module wave does no rounding
43 Floating point framerates should be rounded, rather than truncated.
44 """
45 self.test_it(test_rounding=True)
46
Benjamin Peterson5efea042010-01-13 03:49:50 +000047 def test_issue7681(self):
48 self.f = wave.open(TESTFN, 'wb')
49 self.f.setnchannels(nchannels)
50 self.f.setsampwidth(sampwidth)
51 self.f.setframerate(framerate)
52 # Don't call setnframes, make _write_header divide to figure it out
53 output = b'\0' * nframes * nchannels * sampwidth
54 self.f.writeframes(output)
55
R David Murray671cd322013-04-10 12:31:43 -040056 def test_getparams(self):
57 self.f = wave.open(TESTFN, 'wb')
58 self.f.setnchannels(nchannels)
59 self.f.setsampwidth(sampwidth)
60 self.f.setframerate(framerate)
61 self.f.close()
62
63 self.f = wave.open(TESTFN, 'rb')
64 params = self.f.getparams()
65 self.assertEqual(params.nchannels, self.f.getnchannels())
66 self.assertEqual(params.nframes, self.f.getnframes())
67 self.assertEqual(params.sampwidth, self.f.getsampwidth())
68 self.assertEqual(params.framerate, self.f.getframerate())
69 self.assertEqual(params.comptype, self.f.getcomptype())
70 self.assertEqual(params.compname, self.f.getcompname())
71
R David Murrayc91d5ee2013-07-31 13:46:08 -040072 def test_context_manager(self):
73 self.f = wave.open(TESTFN, 'wb')
74 self.f.setnchannels(nchannels)
75 self.f.setsampwidth(sampwidth)
76 self.f.setframerate(framerate)
77 self.f.close()
Benjamin Peterson5efea042010-01-13 03:49:50 +000078
R David Murrayc91d5ee2013-07-31 13:46:08 -040079 with wave.open(TESTFN) as f:
80 self.assertFalse(f.getfp().closed)
81 self.assertIs(f.getfp(), None)
82
83 with open(TESTFN, 'wb') as testfile:
84 with self.assertRaises(wave.Error):
85 with wave.open(testfile, 'wb'):
86 pass
87 self.assertEqual(testfile.closed, False)
88
Christian Heimes2202f872008-02-06 14:31:34 +000089
90if __name__ == '__main__':
R David Murrayc91d5ee2013-07-31 13:46:08 -040091 unittest.main()