blob: 5b8e0f1e152e8fd5de8bdbd0eb5edbf4b7f1bb2d [file] [log] [blame]
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00001import audioop
Benjamin Peterson7416a4c2008-06-28 23:06:05 +00002import unittest
3from test.test_support import run_unittest
4
Antoine Pitrou60be6f82012-02-04 16:44:21 +01005endian = 'big' if audioop.getsample('\0\1', 2, 0) == 1 else 'little'
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00006
7def gendata1():
Roger E. Masse7a61f871997-01-03 19:20:17 +00008 return '\0\1\2'
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00009
10def gendata2():
Antoine Pitrou60be6f82012-02-04 16:44:21 +010011 if endian == 'big':
Guido van Rossum41360a41998-03-26 19:42:58 +000012 return '\0\0\0\1\0\2'
Roger E. Masse7a61f871997-01-03 19:20:17 +000013 else:
Guido van Rossum41360a41998-03-26 19:42:58 +000014 return '\0\0\1\0\2\0'
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000015
16def gendata4():
Antoine Pitrou60be6f82012-02-04 16:44:21 +010017 if endian == 'big':
Guido van Rossum41360a41998-03-26 19:42:58 +000018 return '\0\0\0\0\0\0\0\1\0\0\0\2'
Roger E. Masse7a61f871997-01-03 19:20:17 +000019 else:
Guido van Rossum41360a41998-03-26 19:42:58 +000020 return '\0\0\0\0\1\0\0\0\2\0\0\0'
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000021
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000022data = [gendata1(), gendata2(), gendata4()]
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000023
Victor Stinner15e5b1b2010-07-03 13:36:19 +000024INVALID_DATA = [
Antoine Pitrou88c51e82012-01-28 22:01:59 +010025 (b'abc', 0),
26 (b'abc', 2),
27 (b'abc', 4),
Victor Stinner15e5b1b2010-07-03 13:36:19 +000028]
29
Guido van Rossum4fdb7441996-12-20 03:13:06 +000030
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000031class TestAudioop(unittest.TestCase):
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000032
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000033 def test_max(self):
34 self.assertEqual(audioop.max(data[0], 1), 2)
35 self.assertEqual(audioop.max(data[1], 2), 2)
36 self.assertEqual(audioop.max(data[2], 4), 2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000037
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000038 def test_minmax(self):
39 self.assertEqual(audioop.minmax(data[0], 1), (0, 2))
Benjamin Petersonefc4a3a2008-06-28 23:35:31 +000040 self.assertEqual(audioop.minmax(data[1], 2), (0, 2))
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000041 self.assertEqual(audioop.minmax(data[2], 4), (0, 2))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000042
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000043 def test_maxpp(self):
44 self.assertEqual(audioop.maxpp(data[0], 1), 0)
45 self.assertEqual(audioop.maxpp(data[1], 2), 0)
46 self.assertEqual(audioop.maxpp(data[2], 4), 0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000047
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000048 def test_avg(self):
49 self.assertEqual(audioop.avg(data[0], 1), 1)
50 self.assertEqual(audioop.avg(data[1], 2), 1)
51 self.assertEqual(audioop.avg(data[2], 4), 1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000052
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000053 def test_avgpp(self):
54 self.assertEqual(audioop.avgpp(data[0], 1), 0)
55 self.assertEqual(audioop.avgpp(data[1], 2), 0)
56 self.assertEqual(audioop.avgpp(data[2], 4), 0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000057
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000058 def test_rms(self):
59 self.assertEqual(audioop.rms(data[0], 1), 1)
60 self.assertEqual(audioop.rms(data[1], 2), 1)
61 self.assertEqual(audioop.rms(data[2], 4), 1)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000062
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000063 def test_cross(self):
64 self.assertEqual(audioop.cross(data[0], 1), 0)
65 self.assertEqual(audioop.cross(data[1], 2), 0)
66 self.assertEqual(audioop.cross(data[2], 4), 0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000067
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000068 def test_add(self):
69 data2 = []
70 for d in data:
71 str = ''
72 for s in d:
73 str = str + chr(ord(s)*2)
74 data2.append(str)
75 self.assertEqual(audioop.add(data[0], data[0], 1), data2[0])
76 self.assertEqual(audioop.add(data[1], data[1], 2), data2[1])
77 self.assertEqual(audioop.add(data[2], data[2], 4), data2[2])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000078
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000079 def test_bias(self):
80 # Note: this test assumes that avg() works
81 d1 = audioop.bias(data[0], 1, 100)
82 d2 = audioop.bias(data[1], 2, 100)
83 d4 = audioop.bias(data[2], 4, 100)
84 self.assertEqual(audioop.avg(d1, 1), 101)
85 self.assertEqual(audioop.avg(d2, 2), 101)
86 self.assertEqual(audioop.avg(d4, 4), 101)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000087
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000088 def test_lin2lin(self):
89 # too simple: we test only the size
90 for d1 in data:
91 for d2 in data:
92 got = len(d1)//3
93 wtd = len(d2)//3
94 self.assertEqual(len(audioop.lin2lin(d1, got, wtd)), len(d2))
Anthony Baxterfa869072006-03-20 05:21:58 +000095
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000096 def test_adpcm2lin(self):
97 # Very cursory test
Antoine Pitrou88c51e82012-01-28 22:01:59 +010098 self.assertEqual(audioop.adpcm2lin(b'\0\0', 1, None), (b'\0' * 4, (0,0)))
99 self.assertEqual(audioop.adpcm2lin(b'\0\0', 2, None), (b'\0' * 8, (0,0)))
100 self.assertEqual(audioop.adpcm2lin(b'\0\0', 4, None), (b'\0' * 16, (0,0)))
Anthony Baxterfa869072006-03-20 05:21:58 +0000101
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000102 def test_lin2adpcm(self):
103 # Very cursory test
104 self.assertEqual(audioop.lin2adpcm('\0\0\0\0', 1, None), ('\0\0', (0,0)))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000105
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000106 def test_lin2alaw(self):
107 self.assertEqual(audioop.lin2alaw(data[0], 1), '\xd5\xc5\xf5')
108 self.assertEqual(audioop.lin2alaw(data[1], 2), '\xd5\xd5\xd5')
109 self.assertEqual(audioop.lin2alaw(data[2], 4), '\xd5\xd5\xd5')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000110
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000111 def test_alaw2lin(self):
112 # Cursory
113 d = audioop.lin2alaw(data[0], 1)
114 self.assertEqual(audioop.alaw2lin(d, 1), data[0])
Antoine Pitrou60be6f82012-02-04 16:44:21 +0100115 if endian == 'big':
116 self.assertEqual(audioop.alaw2lin(d, 2),
117 b'\x00\x08\x01\x08\x02\x10')
118 self.assertEqual(audioop.alaw2lin(d, 4),
119 b'\x00\x08\x00\x00\x01\x08\x00\x00\x02\x10\x00\x00')
120 else:
121 self.assertEqual(audioop.alaw2lin(d, 2),
122 b'\x08\x00\x08\x01\x10\x02')
123 self.assertEqual(audioop.alaw2lin(d, 4),
124 b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000125
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000126 def test_lin2ulaw(self):
127 self.assertEqual(audioop.lin2ulaw(data[0], 1), '\xff\xe7\xdb')
128 self.assertEqual(audioop.lin2ulaw(data[1], 2), '\xff\xff\xff')
129 self.assertEqual(audioop.lin2ulaw(data[2], 4), '\xff\xff\xff')
Guido van Rossumc8504e21997-02-14 15:58:00 +0000130
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000131 def test_ulaw2lin(self):
132 # Cursory
133 d = audioop.lin2ulaw(data[0], 1)
134 self.assertEqual(audioop.ulaw2lin(d, 1), data[0])
Antoine Pitrou60be6f82012-02-04 16:44:21 +0100135 if endian == 'big':
136 self.assertEqual(audioop.ulaw2lin(d, 2),
137 b'\x00\x00\x01\x04\x02\x0c')
138 self.assertEqual(audioop.ulaw2lin(d, 4),
139 b'\x00\x00\x00\x00\x01\x04\x00\x00\x02\x0c\x00\x00')
140 else:
141 self.assertEqual(audioop.ulaw2lin(d, 2),
142 b'\x00\x00\x04\x01\x0c\x02')
143 self.assertEqual(audioop.ulaw2lin(d, 4),
144 b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x0c\x02')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000145
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000146 def test_mul(self):
147 data2 = []
148 for d in data:
149 str = ''
150 for s in d:
151 str = str + chr(ord(s)*2)
152 data2.append(str)
153 self.assertEqual(audioop.mul(data[0], 1, 2), data2[0])
154 self.assertEqual(audioop.mul(data[1],2, 2), data2[1])
155 self.assertEqual(audioop.mul(data[2], 4, 2), data2[2])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000156
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000157 def test_ratecv(self):
158 state = None
159 d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
160 d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
161 self.assertEqual(d1 + d2, '\000\000\001\001\002\001\000\000\001\001\002')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000162
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000163 def test_reverse(self):
164 self.assertEqual(audioop.reverse(data[0], 1), '\2\1\0')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000165
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000166 def test_tomono(self):
167 data2 = ''
168 for d in data[0]:
169 data2 = data2 + d + d
170 self.assertEqual(audioop.tomono(data2, 1, 0.5, 0.5), data[0])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000171
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000172 def test_tostereo(self):
173 data2 = ''
174 for d in data[0]:
175 data2 = data2 + d + d
176 self.assertEqual(audioop.tostereo(data[0], 1, 1, 1), data2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000177
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000178 def test_findfactor(self):
179 self.assertEqual(audioop.findfactor(data[1], data[1]), 1.0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000180
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000181 def test_findfit(self):
182 self.assertEqual(audioop.findfit(data[1], data[1]), (0, 1.0))
183
184 def test_findmax(self):
185 self.assertEqual(audioop.findmax(data[1], 1), 2)
186
187 def test_getsample(self):
188 for i in range(3):
189 self.assertEqual(audioop.getsample(data[0], 1, i), i)
190 self.assertEqual(audioop.getsample(data[1], 2, i), i)
191 self.assertEqual(audioop.getsample(data[2], 4, i), i)
192
Neal Norwitzbe3ff9c2008-07-20 20:39:36 +0000193 def test_negativelen(self):
Facundo Batista1a664412008-07-07 17:02:59 +0000194 # from issue 3306, previously it segfaulted
195 self.assertRaises(audioop.error,
196 audioop.findmax, ''.join( chr(x) for x in xrange(256)), -2392392)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000197
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000198 def test_issue7673(self):
199 state = None
200 for data, size in INVALID_DATA:
201 size2 = size
202 self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
203 self.assertRaises(audioop.error, audioop.max, data, size)
204 self.assertRaises(audioop.error, audioop.minmax, data, size)
205 self.assertRaises(audioop.error, audioop.avg, data, size)
206 self.assertRaises(audioop.error, audioop.rms, data, size)
207 self.assertRaises(audioop.error, audioop.avgpp, data, size)
208 self.assertRaises(audioop.error, audioop.maxpp, data, size)
209 self.assertRaises(audioop.error, audioop.cross, data, size)
210 self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
211 self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
212 self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
213 self.assertRaises(audioop.error, audioop.add, data, data, size)
214 self.assertRaises(audioop.error, audioop.bias, data, size, 0)
215 self.assertRaises(audioop.error, audioop.reverse, data, size)
216 self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
217 self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
218 self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000219 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000220 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
Antoine Pitrou88c51e82012-01-28 22:01:59 +0100221
222 def test_wrongsize(self):
223 data = b'abc'
224 state = None
225 for size in (-1, 3, 5):
226 self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
227 self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000228 self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
229
Brett Cannon7dbd9182008-03-03 04:19:29 +0000230def test_main():
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000231 run_unittest(TestAudioop)
Brett Cannon7dbd9182008-03-03 04:19:29 +0000232
233if __name__ == '__main__':
234 test_main()