blob: 581d9739d54f7d5461a262e8331a94b9365eb83c [file] [log] [blame]
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001from test.support import TESTFN, run_unittest
Guido van Rossum3b0a3292002-08-09 16:38:32 +00002import os
Guido van Rossuma00afc12000-10-09 20:05:59 +00003import wave
Benjamin Peterson5efea042010-01-13 03:49:50 +00004import struct
Christian Heimes2202f872008-02-06 14:31:34 +00005import unittest
Guido van Rossuma00afc12000-10-09 20:05:59 +00006
7nchannels = 2
8sampwidth = 2
9framerate = 8000
10nframes = 100
11
Christian Heimes2202f872008-02-06 14:31:34 +000012class TestWave(unittest.TestCase):
Guido van Rossuma00afc12000-10-09 20:05:59 +000013
Christian Heimes2202f872008-02-06 14:31:34 +000014 def setUp(self):
15 self.f = None
Guido van Rossuma00afc12000-10-09 20:05:59 +000016
Christian Heimes2202f872008-02-06 14:31:34 +000017 def tearDown(self):
18 if self.f is not None:
19 self.f.close()
20 try:
21 os.remove(TESTFN)
22 except OSError:
23 pass
24
Mark Dickinson64a38c02010-08-28 17:22:16 +000025 def test_it(self, test_rounding=False):
Christian Heimes2202f872008-02-06 14:31:34 +000026 self.f = wave.open(TESTFN, 'wb')
27 self.f.setnchannels(nchannels)
28 self.f.setsampwidth(sampwidth)
Mark Dickinson64a38c02010-08-28 17:22:16 +000029 if test_rounding:
30 self.f.setframerate(framerate - 0.1)
31 else:
32 self.f.setframerate(framerate)
Christian Heimes2202f872008-02-06 14:31:34 +000033 self.f.setnframes(nframes)
34 output = b'\0' * nframes * nchannels * sampwidth
35 self.f.writeframes(output)
36 self.f.close()
37
38 self.f = wave.open(TESTFN, 'rb')
39 self.assertEqual(nchannels, self.f.getnchannels())
40 self.assertEqual(sampwidth, self.f.getsampwidth())
41 self.assertEqual(framerate, self.f.getframerate())
42 self.assertEqual(nframes, self.f.getnframes())
43 self.assertEqual(self.f.readframes(nframes), output)
44
Mark Dickinson64a38c02010-08-28 17:22:16 +000045 def test_fractional_framerate(self):
46 """
47 Addresses [ 1512791 ] module wave does no rounding
48 Floating point framerates should be rounded, rather than truncated.
49 """
50 self.test_it(test_rounding=True)
51
Benjamin Peterson5efea042010-01-13 03:49:50 +000052 def test_issue7681(self):
53 self.f = wave.open(TESTFN, 'wb')
54 self.f.setnchannels(nchannels)
55 self.f.setsampwidth(sampwidth)
56 self.f.setframerate(framerate)
57 # Don't call setnframes, make _write_header divide to figure it out
58 output = b'\0' * nframes * nchannels * sampwidth
59 self.f.writeframes(output)
60
R David Murray671cd322013-04-10 12:31:43 -040061 def test_getparams(self):
62 self.f = wave.open(TESTFN, 'wb')
63 self.f.setnchannels(nchannels)
64 self.f.setsampwidth(sampwidth)
65 self.f.setframerate(framerate)
66 self.f.close()
67
68 self.f = wave.open(TESTFN, 'rb')
69 params = self.f.getparams()
70 self.assertEqual(params.nchannels, self.f.getnchannels())
71 self.assertEqual(params.nframes, self.f.getnframes())
72 self.assertEqual(params.sampwidth, self.f.getsampwidth())
73 self.assertEqual(params.framerate, self.f.getframerate())
74 self.assertEqual(params.comptype, self.f.getcomptype())
75 self.assertEqual(params.compname, self.f.getcompname())
76
Benjamin Peterson5efea042010-01-13 03:49:50 +000077
Christian Heimes2202f872008-02-06 14:31:34 +000078def test_main():
79 run_unittest(TestWave)
80
81if __name__ == '__main__':
82 test_main()