blob: b065bc2e55e85ab7962d0195e946d171691f25d1 [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
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00005
6def gendata1():
Roger E. Masse7a61f871997-01-03 19:20:17 +00007 return '\0\1\2'
Guido van Rossumfa7fcb91994-01-12 09:55:11 +00008
9def gendata2():
Roger E. Masse7a61f871997-01-03 19:20:17 +000010 if audioop.getsample('\0\1', 2, 0) == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +000011 return '\0\0\0\1\0\2'
Roger E. Masse7a61f871997-01-03 19:20:17 +000012 else:
Guido van Rossum41360a41998-03-26 19:42:58 +000013 return '\0\0\1\0\2\0'
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000014
15def gendata4():
Roger E. Masse7a61f871997-01-03 19:20:17 +000016 if audioop.getsample('\0\0\0\1', 4, 0) == 1:
Guido van Rossum41360a41998-03-26 19:42:58 +000017 return '\0\0\0\0\0\0\0\1\0\0\0\2'
Roger E. Masse7a61f871997-01-03 19:20:17 +000018 else:
Guido van Rossum41360a41998-03-26 19:42:58 +000019 return '\0\0\0\0\1\0\0\0\2\0\0\0'
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000020
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000021data = [gendata1(), gendata2(), gendata4()]
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000022
Victor Stinner15e5b1b2010-07-03 13:36:19 +000023INVALID_DATA = [
Antoine Pitrou88c51e82012-01-28 22:01:59 +010024 (b'abc', 0),
25 (b'abc', 2),
26 (b'abc', 4),
Victor Stinner15e5b1b2010-07-03 13:36:19 +000027]
28
Guido van Rossum4fdb7441996-12-20 03:13:06 +000029
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000030class TestAudioop(unittest.TestCase):
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000031
Benjamin Peterson7416a4c2008-06-28 23:06:05 +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 Peterson7416a4c2008-06-28 23:06:05 +000037 def test_minmax(self):
38 self.assertEqual(audioop.minmax(data[0], 1), (0, 2))
Benjamin Petersonefc4a3a2008-06-28 23:35:31 +000039 self.assertEqual(audioop.minmax(data[1], 2), (0, 2))
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000040 self.assertEqual(audioop.minmax(data[2], 4), (0, 2))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +000041
Benjamin Peterson7416a4c2008-06-28 23:06:05 +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 Peterson7416a4c2008-06-28 23:06:05 +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 Peterson7416a4c2008-06-28 23:06:05 +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 Peterson7416a4c2008-06-28 23:06:05 +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 Peterson7416a4c2008-06-28 23:06:05 +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 Peterson7416a4c2008-06-28 23:06:05 +000067 def test_add(self):
68 data2 = []
69 for d in data:
70 str = ''
71 for s in d:
72 str = str + chr(ord(s)*2)
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 Peterson7416a4c2008-06-28 23:06:05 +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 Peterson7416a4c2008-06-28 23:06:05 +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))
Anthony Baxterfa869072006-03-20 05:21:58 +000094
Benjamin Peterson7416a4c2008-06-28 23:06:05 +000095 def test_adpcm2lin(self):
96 # Very cursory test
Antoine Pitrou88c51e82012-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)))
Anthony Baxterfa869072006-03-20 05:21:58 +0000100
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000101 def test_lin2adpcm(self):
102 # Very cursory test
103 self.assertEqual(audioop.lin2adpcm('\0\0\0\0', 1, None), ('\0\0', (0,0)))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000104
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000105 def test_lin2alaw(self):
106 self.assertEqual(audioop.lin2alaw(data[0], 1), '\xd5\xc5\xf5')
107 self.assertEqual(audioop.lin2alaw(data[1], 2), '\xd5\xd5\xd5')
108 self.assertEqual(audioop.lin2alaw(data[2], 4), '\xd5\xd5\xd5')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000109
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000110 def test_alaw2lin(self):
111 # Cursory
112 d = audioop.lin2alaw(data[0], 1)
113 self.assertEqual(audioop.alaw2lin(d, 1), data[0])
Antoine Pitrou88c51e82012-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 Peterson7416a4c2008-06-28 23:06:05 +0000118 def test_lin2ulaw(self):
119 self.assertEqual(audioop.lin2ulaw(data[0], 1), '\xff\xe7\xdb')
120 self.assertEqual(audioop.lin2ulaw(data[1], 2), '\xff\xff\xff')
121 self.assertEqual(audioop.lin2ulaw(data[2], 4), '\xff\xff\xff')
Guido van Rossumc8504e21997-02-14 15:58:00 +0000122
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000123 def test_ulaw2lin(self):
124 # Cursory
125 d = audioop.lin2ulaw(data[0], 1)
126 self.assertEqual(audioop.ulaw2lin(d, 1), data[0])
Antoine Pitrou88c51e82012-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 Peterson7416a4c2008-06-28 23:06:05 +0000131 def test_mul(self):
132 data2 = []
133 for d in data:
134 str = ''
135 for s in d:
136 str = str + chr(ord(s)*2)
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 Peterson7416a4c2008-06-28 23:06:05 +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, '\000\000\001\001\002\001\000\000\001\001\002')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000147
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000148 def test_reverse(self):
149 self.assertEqual(audioop.reverse(data[0], 1), '\2\1\0')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000150
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000151 def test_tomono(self):
152 data2 = ''
153 for d in data[0]:
154 data2 = data2 + d + d
155 self.assertEqual(audioop.tomono(data2, 1, 0.5, 0.5), data[0])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000156
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000157 def test_tostereo(self):
158 data2 = ''
159 for d in data[0]:
160 data2 = data2 + d + d
161 self.assertEqual(audioop.tostereo(data[0], 1, 1, 1), data2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000162
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000163 def test_findfactor(self):
164 self.assertEqual(audioop.findfactor(data[1], data[1]), 1.0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000165
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000166 def test_findfit(self):
167 self.assertEqual(audioop.findfit(data[1], data[1]), (0, 1.0))
168
169 def test_findmax(self):
170 self.assertEqual(audioop.findmax(data[1], 1), 2)
171
172 def test_getsample(self):
173 for i in range(3):
174 self.assertEqual(audioop.getsample(data[0], 1, i), i)
175 self.assertEqual(audioop.getsample(data[1], 2, i), i)
176 self.assertEqual(audioop.getsample(data[2], 4, i), i)
177
Neal Norwitzbe3ff9c2008-07-20 20:39:36 +0000178 def test_negativelen(self):
Facundo Batista1a664412008-07-07 17:02:59 +0000179 # from issue 3306, previously it segfaulted
180 self.assertRaises(audioop.error,
181 audioop.findmax, ''.join( chr(x) for x in xrange(256)), -2392392)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000182
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000183 def test_issue7673(self):
184 state = None
185 for data, size in INVALID_DATA:
186 size2 = size
187 self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
188 self.assertRaises(audioop.error, audioop.max, data, size)
189 self.assertRaises(audioop.error, audioop.minmax, data, size)
190 self.assertRaises(audioop.error, audioop.avg, data, size)
191 self.assertRaises(audioop.error, audioop.rms, data, size)
192 self.assertRaises(audioop.error, audioop.avgpp, data, size)
193 self.assertRaises(audioop.error, audioop.maxpp, data, size)
194 self.assertRaises(audioop.error, audioop.cross, data, size)
195 self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
196 self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
197 self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
198 self.assertRaises(audioop.error, audioop.add, data, data, size)
199 self.assertRaises(audioop.error, audioop.bias, data, size, 0)
200 self.assertRaises(audioop.error, audioop.reverse, data, size)
201 self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
202 self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
203 self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000204 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000205 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
Antoine Pitrou88c51e82012-01-28 22:01:59 +0100206
207 def test_wrongsize(self):
208 data = b'abc'
209 state = None
210 for size in (-1, 3, 5):
211 self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
212 self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
Victor Stinner15e5b1b2010-07-03 13:36:19 +0000213 self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
214
Brett Cannon7dbd9182008-03-03 04:19:29 +0000215def test_main():
Benjamin Peterson7416a4c2008-06-28 23:06:05 +0000216 run_unittest(TestAudioop)
Brett Cannon7dbd9182008-03-03 04:19:29 +0000217
218if __name__ == '__main__':
219 test_main()