blob: b70f917ec644439a7e1c38412a01e1c78fee20d8 [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
R David Murray536ffe12013-07-31 20:48:26 -040078 with self.assertRaises(wave.Error):
79 with open(TESTFN, 'wb') as testfile:
80 with wave.open(testfile):
81 pass
Benjamin Peterson5efea042010-01-13 03:49:50 +000082
R David Murray536ffe12013-07-31 20:48:26 -040083 def test_context_manager_with_open_file(self):
84 with open(TESTFN, 'wb') as testfile:
85 with wave.open(testfile) as f:
86 f.setnchannels(nchannels)
87 f.setsampwidth(sampwidth)
88 f.setframerate(framerate)
89 self.assertFalse(testfile.closed)
90 with open(TESTFN, 'rb') as testfile:
91 with wave.open(testfile) as f:
92 self.assertFalse(f.getfp().closed)
93 params = f.getparams()
94 self.assertEqual(params.nchannels, nchannels)
95 self.assertEqual(params.sampwidth, sampwidth)
96 self.assertEqual(params.framerate, framerate)
97 self.assertIsNone(f.getfp())
98 self.assertFalse(testfile.closed)
99
100 def test_context_manager_with_filename(self):
101 # If the file doesn't get closed, this test won't fail, but it will
102 # produce a resource leak warning.
103 with wave.open(TESTFN, 'wb') as f:
104 f.setnchannels(nchannels)
105 f.setsampwidth(sampwidth)
106 f.setframerate(framerate)
R David Murrayc91d5ee2013-07-31 13:46:08 -0400107 with wave.open(TESTFN) as f:
108 self.assertFalse(f.getfp().closed)
R David Murray536ffe12013-07-31 20:48:26 -0400109 params = f.getparams()
110 self.assertEqual(params.nchannels, nchannels)
111 self.assertEqual(params.sampwidth, sampwidth)
112 self.assertEqual(params.framerate, framerate)
113 self.assertIsNone(f.getfp())
R David Murrayc91d5ee2013-07-31 13:46:08 -0400114
Christian Heimes2202f872008-02-06 14:31:34 +0000115
116if __name__ == '__main__':
R David Murrayc91d5ee2013-07-31 13:46:08 -0400117 unittest.main()