blob: ff60a7d93fb6aa68c678ceac14d91408b796f7ed [file] [log] [blame]
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00001import audioop
Benjamin Peterson41181742008-07-02 20:22:54 +00002import unittest
3from test.support import run_unittest
4
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00005
6def gendata1():
Martin v. Löwis3a2e5ce2007-07-20 07:36:26 +00007 return b'\0\1\2'
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00008
9def gendata2():
Martin v. Löwis3a2e5ce2007-07-20 07:36:26 +000010 if audioop.getsample(b'\0\1', 2, 0) == 1:
11 return b'\0\0\0\1\0\2'
Roger E. Masse7a61f871997-01-03 19:20:17 +000012 else:
Martin v. Löwis3a2e5ce2007-07-20 07:36:26 +000013 return b'\0\0\1\0\2\0'
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000014
15def gendata4():
Martin v. Löwis3a2e5ce2007-07-20 07:36:26 +000016 if audioop.getsample(b'\0\0\0\1', 4, 0) == 1:
17 return b'\0\0\0\0\0\0\0\1\0\0\0\2'
Roger E. Masse7a61f871997-01-03 19:20:17 +000018 else:
Martin v. Löwis3a2e5ce2007-07-20 07:36:26 +000019 return b'\0\0\0\0\1\0\0\0\2\0\0\0'
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000020
Benjamin Peterson41181742008-07-02 20:22:54 +000021data = [gendata1(), gendata2(), gendata4()]
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000022
Victor Stinnerbc5c54b2010-07-03 13:44:22 +000023INVALID_DATA = [
Antoine Pitrou75ff65e2012-01-28 22:01:59 +010024 (b'abc', 0),
25 (b'abc', 2),
26 (b'abc', 4),
Victor Stinnerbc5c54b2010-07-03 13:44:22 +000027]
28
Guido van Rossum4fdb7441996-12-20 03:13:06 +000029
Benjamin Peterson41181742008-07-02 20:22:54 +000030class TestAudioop(unittest.TestCase):
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000031
Benjamin Peterson41181742008-07-02 20:22:54 +000032 def test_max(self):
33 self.assertEqual(audioop.max(data[0], 1), 2)
34 self.assertEqual(audioop.max(data[1], 2), 2)
35 self.assertEqual(audioop.max(data[2], 4), 2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000036
Benjamin Peterson41181742008-07-02 20:22:54 +000037 def test_minmax(self):
38 self.assertEqual(audioop.minmax(data[0], 1), (0, 2))
39 self.assertEqual(audioop.minmax(data[1], 2), (0, 2))
40 self.assertEqual(audioop.minmax(data[2], 4), (0, 2))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000041
Benjamin Peterson41181742008-07-02 20:22:54 +000042 def test_maxpp(self):
43 self.assertEqual(audioop.maxpp(data[0], 1), 0)
44 self.assertEqual(audioop.maxpp(data[1], 2), 0)
45 self.assertEqual(audioop.maxpp(data[2], 4), 0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000046
Benjamin Peterson41181742008-07-02 20:22:54 +000047 def test_avg(self):
48 self.assertEqual(audioop.avg(data[0], 1), 1)
49 self.assertEqual(audioop.avg(data[1], 2), 1)
50 self.assertEqual(audioop.avg(data[2], 4), 1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000051
Benjamin Peterson41181742008-07-02 20:22:54 +000052 def test_avgpp(self):
53 self.assertEqual(audioop.avgpp(data[0], 1), 0)
54 self.assertEqual(audioop.avgpp(data[1], 2), 0)
55 self.assertEqual(audioop.avgpp(data[2], 4), 0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000056
Benjamin Peterson41181742008-07-02 20:22:54 +000057 def test_rms(self):
58 self.assertEqual(audioop.rms(data[0], 1), 1)
59 self.assertEqual(audioop.rms(data[1], 2), 1)
60 self.assertEqual(audioop.rms(data[2], 4), 1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000061
Benjamin Peterson41181742008-07-02 20:22:54 +000062 def test_cross(self):
63 self.assertEqual(audioop.cross(data[0], 1), 0)
64 self.assertEqual(audioop.cross(data[1], 2), 0)
65 self.assertEqual(audioop.cross(data[2], 4), 0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000066
Benjamin Peterson41181742008-07-02 20:22:54 +000067 def test_add(self):
68 data2 = []
69 for d in data:
70 str = bytearray(len(d))
71 for i,b in enumerate(d):
72 str[i] = 2*b
73 data2.append(str)
74 self.assertEqual(audioop.add(data[0], data[0], 1), data2[0])
75 self.assertEqual(audioop.add(data[1], data[1], 2), data2[1])
76 self.assertEqual(audioop.add(data[2], data[2], 4), data2[2])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000077
Benjamin Peterson41181742008-07-02 20:22:54 +000078 def test_bias(self):
79 # Note: this test assumes that avg() works
80 d1 = audioop.bias(data[0], 1, 100)
81 d2 = audioop.bias(data[1], 2, 100)
82 d4 = audioop.bias(data[2], 4, 100)
83 self.assertEqual(audioop.avg(d1, 1), 101)
84 self.assertEqual(audioop.avg(d2, 2), 101)
85 self.assertEqual(audioop.avg(d4, 4), 101)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000086
Benjamin Peterson41181742008-07-02 20:22:54 +000087 def test_lin2lin(self):
88 # too simple: we test only the size
89 for d1 in data:
90 for d2 in data:
91 got = len(d1)//3
92 wtd = len(d2)//3
93 self.assertEqual(len(audioop.lin2lin(d1, got, wtd)), len(d2))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000094
Benjamin Peterson41181742008-07-02 20:22:54 +000095 def test_adpcm2lin(self):
96 # Very cursory test
Antoine Pitrou75ff65e2012-01-28 22:01:59 +010097 self.assertEqual(audioop.adpcm2lin(b'\0\0', 1, None), (b'\0' * 4, (0,0)))
98 self.assertEqual(audioop.adpcm2lin(b'\0\0', 2, None), (b'\0' * 8, (0,0)))
99 self.assertEqual(audioop.adpcm2lin(b'\0\0', 4, None), (b'\0' * 16, (0,0)))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000100
Benjamin Peterson41181742008-07-02 20:22:54 +0000101 def test_lin2adpcm(self):
102 # Very cursory test
103 self.assertEqual(audioop.lin2adpcm(b'\0\0\0\0', 1, None), (b'\0\0', (0,0)))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000104
Benjamin Peterson41181742008-07-02 20:22:54 +0000105 def test_lin2alaw(self):
106 self.assertEqual(audioop.lin2alaw(data[0], 1), b'\xd5\xc5\xf5')
107 self.assertEqual(audioop.lin2alaw(data[1], 2), b'\xd5\xd5\xd5')
108 self.assertEqual(audioop.lin2alaw(data[2], 4), b'\xd5\xd5\xd5')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000109
Benjamin Peterson41181742008-07-02 20:22:54 +0000110 def test_alaw2lin(self):
111 # Cursory
112 d = audioop.lin2alaw(data[0], 1)
113 self.assertEqual(audioop.alaw2lin(d, 1), data[0])
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100114 self.assertEqual(audioop.alaw2lin(d, 2), b'\x08\x00\x08\x01\x10\x02')
115 self.assertEqual(audioop.alaw2lin(d, 4),
116 b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000117
Benjamin Peterson41181742008-07-02 20:22:54 +0000118 def test_lin2ulaw(self):
119 self.assertEqual(audioop.lin2ulaw(data[0], 1), b'\xff\xe7\xdb')
120 self.assertEqual(audioop.lin2ulaw(data[1], 2), b'\xff\xff\xff')
121 self.assertEqual(audioop.lin2ulaw(data[2], 4), b'\xff\xff\xff')
Guido van Rossumc8504e21997-02-14 15:58:00 +0000122
Benjamin Peterson41181742008-07-02 20:22:54 +0000123 def test_ulaw2lin(self):
124 # Cursory
125 d = audioop.lin2ulaw(data[0], 1)
126 self.assertEqual(audioop.ulaw2lin(d, 1), data[0])
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100127 self.assertEqual(audioop.ulaw2lin(d, 2), b'\x00\x00\x04\x01\x0c\x02')
128 self.assertEqual(audioop.ulaw2lin(d, 4),
129 b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x0c\x02')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000130
Benjamin Peterson41181742008-07-02 20:22:54 +0000131 def test_mul(self):
132 data2 = []
133 for d in data:
134 str = bytearray(len(d))
135 for i,b in enumerate(d):
136 str[i] = 2*b
137 data2.append(str)
138 self.assertEqual(audioop.mul(data[0], 1, 2), data2[0])
139 self.assertEqual(audioop.mul(data[1],2, 2), data2[1])
140 self.assertEqual(audioop.mul(data[2], 4, 2), data2[2])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000141
Benjamin Peterson41181742008-07-02 20:22:54 +0000142 def test_ratecv(self):
143 state = None
144 d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
145 d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
146 self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000147
Benjamin Peterson41181742008-07-02 20:22:54 +0000148 def test_reverse(self):
149 self.assertEqual(audioop.reverse(data[0], 1), b'\2\1\0')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000150
Benjamin Peterson41181742008-07-02 20:22:54 +0000151 def test_tomono(self):
152 data2 = bytearray()
153 for d in data[0]:
154 data2.append(d)
155 data2.append(d)
156 self.assertEqual(audioop.tomono(data2, 1, 0.5, 0.5), data[0])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000157
Benjamin Peterson41181742008-07-02 20:22:54 +0000158 def test_tostereo(self):
159 data2 = bytearray()
160 for d in data[0]:
161 data2.append(d)
162 data2.append(d)
163 self.assertEqual(audioop.tostereo(data[0], 1, 1, 1), data2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000164
Benjamin Peterson41181742008-07-02 20:22:54 +0000165 def test_findfactor(self):
166 self.assertEqual(audioop.findfactor(data[1], data[1]), 1.0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000167
Benjamin Peterson41181742008-07-02 20:22:54 +0000168 def test_findfit(self):
169 self.assertEqual(audioop.findfit(data[1], data[1]), (0, 1.0))
170
171 def test_findmax(self):
172 self.assertEqual(audioop.findmax(data[1], 1), 2)
173
174 def test_getsample(self):
175 for i in range(3):
176 self.assertEqual(audioop.getsample(data[0], 1, i), i)
177 self.assertEqual(audioop.getsample(data[1], 2, i), i)
178 self.assertEqual(audioop.getsample(data[2], 4, i), i)
179
Georg Brandl3dbca812008-07-23 16:10:53 +0000180 def test_negativelen(self):
Georg Brandl86b2fb92008-07-16 03:43:04 +0000181 # from issue 3306, previously it segfaulted
182 self.assertRaises(audioop.error,
183 audioop.findmax, ''.join(chr(x) for x in range(256)), -2392392)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000184
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000185 def test_issue7673(self):
186 state = None
187 for data, size in INVALID_DATA:
188 size2 = size
189 self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
190 self.assertRaises(audioop.error, audioop.max, data, size)
191 self.assertRaises(audioop.error, audioop.minmax, data, size)
192 self.assertRaises(audioop.error, audioop.avg, data, size)
193 self.assertRaises(audioop.error, audioop.rms, data, size)
194 self.assertRaises(audioop.error, audioop.avgpp, data, size)
195 self.assertRaises(audioop.error, audioop.maxpp, data, size)
196 self.assertRaises(audioop.error, audioop.cross, data, size)
197 self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
198 self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
199 self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
200 self.assertRaises(audioop.error, audioop.add, data, data, size)
201 self.assertRaises(audioop.error, audioop.bias, data, size, 0)
202 self.assertRaises(audioop.error, audioop.reverse, data, size)
203 self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
204 self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
205 self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000206 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000207 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
Antoine Pitrou75ff65e2012-01-28 22:01:59 +0100208
209 def test_wrongsize(self):
210 data = b'abc'
211 state = None
212 for size in (-1, 3, 5):
213 self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
214 self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000215 self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
216
Christian Heimes180510d2008-03-03 19:15:45 +0000217def test_main():
Benjamin Peterson41181742008-07-02 20:22:54 +0000218 run_unittest(TestAudioop)
Christian Heimes180510d2008-03-03 19:15:45 +0000219
220if __name__ == '__main__':
221 test_main()