blob: 008281f9af22695b5036cefdefadc02c5fcfcf54 [file] [log] [blame]
Serhiy Storchaka1b80e632013-10-13 17:55:07 +03001from test.support import findfile, TESTFN, unlink
2import unittest
3import array
4import io
5import pickle
6import sys
7
8def byteswap2(data):
Serhiy Storchakad9a01822013-11-21 11:02:30 +02009 a = array.array('h')
10 a.frombytes(data)
Serhiy Storchaka1b80e632013-10-13 17:55:07 +030011 a.byteswap()
12 return a.tobytes()
13
14def byteswap3(data):
15 ba = bytearray(data)
16 ba[::3] = data[2::3]
17 ba[2::3] = data[::3]
18 return bytes(ba)
19
20def byteswap4(data):
Serhiy Storchakad9a01822013-11-21 11:02:30 +020021 a = array.array('i')
22 a.frombytes(data)
Serhiy Storchaka1b80e632013-10-13 17:55:07 +030023 a.byteswap()
24 return a.tobytes()
25
26
27class AudioTests:
28 close_fd = False
29
30 def setUp(self):
31 self.f = self.fout = None
32
33 def tearDown(self):
34 if self.f is not None:
35 self.f.close()
36 if self.fout is not None:
37 self.fout.close()
38 unlink(TESTFN)
39
40 def check_params(self, f, nchannels, sampwidth, framerate, nframes,
41 comptype, compname):
42 self.assertEqual(f.getnchannels(), nchannels)
43 self.assertEqual(f.getsampwidth(), sampwidth)
44 self.assertEqual(f.getframerate(), framerate)
45 self.assertEqual(f.getnframes(), nframes)
46 self.assertEqual(f.getcomptype(), comptype)
47 self.assertEqual(f.getcompname(), compname)
48
49 params = f.getparams()
50 self.assertEqual(params,
51 (nchannels, sampwidth, framerate, nframes, comptype, compname))
52
53 dump = pickle.dumps(params)
54 self.assertEqual(pickle.loads(dump), params)
55
56
57class AudioWriteTests(AudioTests):
58
59 def create_file(self, testfile):
60 f = self.fout = self.module.open(testfile, 'wb')
61 f.setnchannels(self.nchannels)
62 f.setsampwidth(self.sampwidth)
63 f.setframerate(self.framerate)
64 f.setcomptype(self.comptype, self.compname)
65 return f
66
67 def check_file(self, testfile, nframes, frames):
68 f = self.module.open(testfile, 'rb')
69 try:
70 self.assertEqual(f.getnchannels(), self.nchannels)
71 self.assertEqual(f.getsampwidth(), self.sampwidth)
72 self.assertEqual(f.getframerate(), self.framerate)
73 self.assertEqual(f.getnframes(), nframes)
74 self.assertEqual(f.readframes(nframes), frames)
75 finally:
76 f.close()
77
78 def test_write_params(self):
79 f = self.create_file(TESTFN)
80 f.setnframes(self.nframes)
81 f.writeframes(self.frames)
82 self.check_params(f, self.nchannels, self.sampwidth, self.framerate,
83 self.nframes, self.comptype, self.compname)
84 f.close()
85
86 def test_write(self):
87 f = self.create_file(TESTFN)
88 f.setnframes(self.nframes)
89 f.writeframes(self.frames)
90 f.close()
91
92 self.check_file(TESTFN, self.nframes, self.frames)
93
94 def test_incompleted_write(self):
95 with open(TESTFN, 'wb') as testfile:
96 testfile.write(b'ababagalamaga')
97 f = self.create_file(testfile)
98 f.setnframes(self.nframes + 1)
99 f.writeframes(self.frames)
100 f.close()
101
102 with open(TESTFN, 'rb') as testfile:
103 self.assertEqual(testfile.read(13), b'ababagalamaga')
104 self.check_file(testfile, self.nframes, self.frames)
105
106 def test_multiple_writes(self):
107 with open(TESTFN, 'wb') as testfile:
108 testfile.write(b'ababagalamaga')
109 f = self.create_file(testfile)
110 f.setnframes(self.nframes)
111 framesize = self.nchannels * self.sampwidth
112 f.writeframes(self.frames[:-framesize])
113 f.writeframes(self.frames[-framesize:])
114 f.close()
115
116 with open(TESTFN, 'rb') as testfile:
117 self.assertEqual(testfile.read(13), b'ababagalamaga')
118 self.check_file(testfile, self.nframes, self.frames)
119
120 def test_overflowed_write(self):
121 with open(TESTFN, 'wb') as testfile:
122 testfile.write(b'ababagalamaga')
123 f = self.create_file(testfile)
124 f.setnframes(self.nframes - 1)
125 f.writeframes(self.frames)
126 f.close()
127
128 with open(TESTFN, 'rb') as testfile:
129 self.assertEqual(testfile.read(13), b'ababagalamaga')
130 self.check_file(testfile, self.nframes, self.frames)
131
132
133class AudioTestsWithSourceFile(AudioTests):
134
135 @classmethod
136 def setUpClass(cls):
137 cls.sndfilepath = findfile(cls.sndfilename, subdir='audiodata')
138
139 def test_read_params(self):
140 f = self.f = self.module.open(self.sndfilepath)
141 #self.assertEqual(f.getfp().name, self.sndfilepath)
142 self.check_params(f, self.nchannels, self.sampwidth, self.framerate,
143 self.sndfilenframes, self.comptype, self.compname)
144
145 def test_close(self):
Serhiy Storchaka85812bc2013-10-14 20:09:47 +0300146 with open(self.sndfilepath, 'rb') as testfile:
147 f = self.f = self.module.open(testfile)
148 self.assertFalse(testfile.closed)
149 f.close()
150 self.assertEqual(testfile.closed, self.close_fd)
151 with open(TESTFN, 'wb') as testfile:
152 fout = self.fout = self.module.open(testfile, 'wb')
153 self.assertFalse(testfile.closed)
154 with self.assertRaises(self.module.Error):
155 fout.close()
156 self.assertEqual(testfile.closed, self.close_fd)
157 fout.close() # do nothing
Serhiy Storchaka1b80e632013-10-13 17:55:07 +0300158
159 def test_read(self):
160 framesize = self.nchannels * self.sampwidth
161 chunk1 = self.frames[:2 * framesize]
162 chunk2 = self.frames[2 * framesize: 4 * framesize]
163 f = self.f = self.module.open(self.sndfilepath)
164 self.assertEqual(f.readframes(0), b'')
165 self.assertEqual(f.tell(), 0)
166 self.assertEqual(f.readframes(2), chunk1)
167 f.rewind()
168 pos0 = f.tell()
169 self.assertEqual(pos0, 0)
170 self.assertEqual(f.readframes(2), chunk1)
171 pos2 = f.tell()
172 self.assertEqual(pos2, 2)
173 self.assertEqual(f.readframes(2), chunk2)
174 f.setpos(pos2)
175 self.assertEqual(f.readframes(2), chunk2)
176 f.setpos(pos0)
177 self.assertEqual(f.readframes(2), chunk1)
178 with self.assertRaises(self.module.Error):
179 f.setpos(-1)
180 with self.assertRaises(self.module.Error):
181 f.setpos(f.getnframes() + 1)
182
183 def test_copy(self):
184 f = self.f = self.module.open(self.sndfilepath)
185 fout = self.fout = self.module.open(TESTFN, 'wb')
186 fout.setparams(f.getparams())
187 i = 0
188 n = f.getnframes()
189 while n > 0:
190 i += 1
191 fout.writeframes(f.readframes(i))
192 n -= i
193 fout.close()
194 fout = self.fout = self.module.open(TESTFN, 'rb')
195 f.rewind()
196 self.assertEqual(f.getparams(), fout.getparams())
197 self.assertEqual(f.readframes(f.getnframes()),
198 fout.readframes(fout.getnframes()))
199
200 def test_read_not_from_start(self):
201 with open(TESTFN, 'wb') as testfile:
202 testfile.write(b'ababagalamaga')
203 with open(self.sndfilepath, 'rb') as f:
204 testfile.write(f.read())
205
206 with open(TESTFN, 'rb') as testfile:
207 self.assertEqual(testfile.read(13), b'ababagalamaga')
208 f = self.module.open(testfile, 'rb')
209 try:
210 self.assertEqual(f.getnchannels(), self.nchannels)
211 self.assertEqual(f.getsampwidth(), self.sampwidth)
212 self.assertEqual(f.getframerate(), self.framerate)
213 self.assertEqual(f.getnframes(), self.sndfilenframes)
214 self.assertEqual(f.readframes(self.nframes), self.frames)
215 finally:
216 f.close()