blob: c505fb897de06916fa34188f70cd8cc612a76c27 [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 Murray536ffe12013-07-31 20:48:26 -040072 def test_wave_write_context_manager_calls_close(self):
73 # Close checks for a minimum header and will raise an error
74 # if it is not set, so this proves that close is called.
75 with self.assertRaises(wave.Error):
76 with wave.open(TESTFN, 'wb') as f:
77 pass
78 print('in test:', f._file)
79 with self.assertRaises(wave.Error):
80 with open(TESTFN, 'wb') as testfile:
81 with wave.open(testfile):
82 pass
Benjamin Peterson5efea042010-01-13 03:49:50 +000083
R David Murray536ffe12013-07-31 20:48:26 -040084 def test_context_manager_with_open_file(self):
85 with open(TESTFN, 'wb') as testfile:
86 with wave.open(testfile) as f:
87 f.setnchannels(nchannels)
88 f.setsampwidth(sampwidth)
89 f.setframerate(framerate)
90 self.assertFalse(testfile.closed)
91 with open(TESTFN, 'rb') as testfile:
92 with wave.open(testfile) as f:
93 self.assertFalse(f.getfp().closed)
94 params = f.getparams()
95 self.assertEqual(params.nchannels, nchannels)
96 self.assertEqual(params.sampwidth, sampwidth)
97 self.assertEqual(params.framerate, framerate)
98 self.assertIsNone(f.getfp())
99 self.assertFalse(testfile.closed)
100
101 def test_context_manager_with_filename(self):
102 # If the file doesn't get closed, this test won't fail, but it will
103 # produce a resource leak warning.
104 with wave.open(TESTFN, 'wb') as f:
105 f.setnchannels(nchannels)
106 f.setsampwidth(sampwidth)
107 f.setframerate(framerate)
R David Murrayc91d5ee2013-07-31 13:46:08 -0400108 with wave.open(TESTFN) as f:
109 self.assertFalse(f.getfp().closed)
R David Murray536ffe12013-07-31 20:48:26 -0400110 params = f.getparams()
111 self.assertEqual(params.nchannels, nchannels)
112 self.assertEqual(params.sampwidth, sampwidth)
113 self.assertEqual(params.framerate, framerate)
114 self.assertIsNone(f.getfp())
R David Murrayc91d5ee2013-07-31 13:46:08 -0400115
Christian Heimes2202f872008-02-06 14:31:34 +0000116
117if __name__ == '__main__':
R David Murrayc91d5ee2013-07-31 13:46:08 -0400118 unittest.main()