blob: 30dca90bc0320c5b46ef27bcc6acde7f4bbe800a [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
Serhiy Storchaka4c6a0202013-09-04 00:28:43 +03003import pickle
Christian Heimes2202f872008-02-06 14:31:34 +00004import unittest
Guido van Rossuma00afc12000-10-09 20:05:59 +00005
6nchannels = 2
7sampwidth = 2
8framerate = 8000
9nframes = 100
10
Christian Heimes2202f872008-02-06 14:31:34 +000011class TestWave(unittest.TestCase):
Guido van Rossuma00afc12000-10-09 20:05:59 +000012
Christian Heimes2202f872008-02-06 14:31:34 +000013 def setUp(self):
14 self.f = None
Guido van Rossuma00afc12000-10-09 20:05:59 +000015
Christian Heimes2202f872008-02-06 14:31:34 +000016 def tearDown(self):
17 if self.f is not None:
18 self.f.close()
R David Murrayc91d5ee2013-07-31 13:46:08 -040019 unlink(TESTFN)
Christian Heimes2202f872008-02-06 14:31:34 +000020
Mark Dickinson64a38c02010-08-28 17:22:16 +000021 def test_it(self, test_rounding=False):
Christian Heimes2202f872008-02-06 14:31:34 +000022 self.f = wave.open(TESTFN, 'wb')
23 self.f.setnchannels(nchannels)
24 self.f.setsampwidth(sampwidth)
Mark Dickinson64a38c02010-08-28 17:22:16 +000025 if test_rounding:
26 self.f.setframerate(framerate - 0.1)
27 else:
28 self.f.setframerate(framerate)
Christian Heimes2202f872008-02-06 14:31:34 +000029 self.f.setnframes(nframes)
30 output = b'\0' * nframes * nchannels * sampwidth
31 self.f.writeframes(output)
32 self.f.close()
33
34 self.f = wave.open(TESTFN, 'rb')
35 self.assertEqual(nchannels, self.f.getnchannels())
36 self.assertEqual(sampwidth, self.f.getsampwidth())
37 self.assertEqual(framerate, self.f.getframerate())
38 self.assertEqual(nframes, self.f.getnframes())
39 self.assertEqual(self.f.readframes(nframes), output)
40
Mark Dickinson64a38c02010-08-28 17:22:16 +000041 def test_fractional_framerate(self):
42 """
43 Addresses [ 1512791 ] module wave does no rounding
44 Floating point framerates should be rounded, rather than truncated.
45 """
46 self.test_it(test_rounding=True)
47
Benjamin Peterson5efea042010-01-13 03:49:50 +000048 def test_issue7681(self):
49 self.f = wave.open(TESTFN, 'wb')
50 self.f.setnchannels(nchannels)
51 self.f.setsampwidth(sampwidth)
52 self.f.setframerate(framerate)
53 # Don't call setnframes, make _write_header divide to figure it out
54 output = b'\0' * nframes * nchannels * sampwidth
55 self.f.writeframes(output)
56
R David Murray671cd322013-04-10 12:31:43 -040057 def test_getparams(self):
58 self.f = wave.open(TESTFN, 'wb')
59 self.f.setnchannels(nchannels)
60 self.f.setsampwidth(sampwidth)
61 self.f.setframerate(framerate)
62 self.f.close()
63
64 self.f = wave.open(TESTFN, 'rb')
65 params = self.f.getparams()
66 self.assertEqual(params.nchannels, self.f.getnchannels())
67 self.assertEqual(params.nframes, self.f.getnframes())
68 self.assertEqual(params.sampwidth, self.f.getsampwidth())
69 self.assertEqual(params.framerate, self.f.getframerate())
70 self.assertEqual(params.comptype, self.f.getcomptype())
71 self.assertEqual(params.compname, self.f.getcompname())
72
Serhiy Storchaka4c6a0202013-09-04 00:28:43 +030073 def test_getparams_picklable(self):
74 self.f = wave.open(TESTFN, 'wb')
75 self.f.setnchannels(nchannels)
76 self.f.setsampwidth(sampwidth)
77 self.f.setframerate(framerate)
78 self.f.close()
79
80 self.f = wave.open(TESTFN, 'rb')
81 params = self.f.getparams()
82 dump = pickle.dumps(params)
83 self.assertEqual(pickle.loads(dump), params)
84
R David Murray536ffe12013-07-31 20:48:26 -040085 def test_wave_write_context_manager_calls_close(self):
86 # Close checks for a minimum header and will raise an error
87 # if it is not set, so this proves that close is called.
88 with self.assertRaises(wave.Error):
89 with wave.open(TESTFN, 'wb') as f:
90 pass
R David Murray536ffe12013-07-31 20:48:26 -040091 with self.assertRaises(wave.Error):
92 with open(TESTFN, 'wb') as testfile:
93 with wave.open(testfile):
94 pass
Benjamin Peterson5efea042010-01-13 03:49:50 +000095
R David Murray536ffe12013-07-31 20:48:26 -040096 def test_context_manager_with_open_file(self):
97 with open(TESTFN, 'wb') as testfile:
98 with wave.open(testfile) as f:
99 f.setnchannels(nchannels)
100 f.setsampwidth(sampwidth)
101 f.setframerate(framerate)
102 self.assertFalse(testfile.closed)
103 with open(TESTFN, 'rb') as testfile:
104 with wave.open(testfile) as f:
105 self.assertFalse(f.getfp().closed)
106 params = f.getparams()
107 self.assertEqual(params.nchannels, nchannels)
108 self.assertEqual(params.sampwidth, sampwidth)
109 self.assertEqual(params.framerate, framerate)
110 self.assertIsNone(f.getfp())
111 self.assertFalse(testfile.closed)
112
113 def test_context_manager_with_filename(self):
114 # If the file doesn't get closed, this test won't fail, but it will
115 # produce a resource leak warning.
116 with wave.open(TESTFN, 'wb') as f:
117 f.setnchannels(nchannels)
118 f.setsampwidth(sampwidth)
119 f.setframerate(framerate)
R David Murrayc91d5ee2013-07-31 13:46:08 -0400120 with wave.open(TESTFN) as f:
121 self.assertFalse(f.getfp().closed)
R David Murray536ffe12013-07-31 20:48:26 -0400122 params = f.getparams()
123 self.assertEqual(params.nchannels, nchannels)
124 self.assertEqual(params.sampwidth, sampwidth)
125 self.assertEqual(params.framerate, framerate)
126 self.assertIsNone(f.getfp())
R David Murrayc91d5ee2013-07-31 13:46:08 -0400127
Christian Heimes2202f872008-02-06 14:31:34 +0000128
129if __name__ == '__main__':
R David Murrayc91d5ee2013-07-31 13:46:08 -0400130 unittest.main()