blob: 308c3e314b51934b5efc273b45a59eeb86fc16c6 [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 = [
24 ('abc', 0),
25 ('abc', 2),
26 ('abc', 4),
27]
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
97 self.assertEqual(audioop.adpcm2lin(b'\0\0', 1, None), (b'\0\0\0\0', (0,0)))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000098
Benjamin Peterson41181742008-07-02 20:22:54 +000099 def test_lin2adpcm(self):
100 # Very cursory test
101 self.assertEqual(audioop.lin2adpcm(b'\0\0\0\0', 1, None), (b'\0\0', (0,0)))
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000102
Benjamin Peterson41181742008-07-02 20:22:54 +0000103 def test_lin2alaw(self):
104 self.assertEqual(audioop.lin2alaw(data[0], 1), b'\xd5\xc5\xf5')
105 self.assertEqual(audioop.lin2alaw(data[1], 2), b'\xd5\xd5\xd5')
106 self.assertEqual(audioop.lin2alaw(data[2], 4), b'\xd5\xd5\xd5')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000107
Benjamin Peterson41181742008-07-02 20:22:54 +0000108 def test_alaw2lin(self):
109 # Cursory
110 d = audioop.lin2alaw(data[0], 1)
111 self.assertEqual(audioop.alaw2lin(d, 1), data[0])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000112
Benjamin Peterson41181742008-07-02 20:22:54 +0000113 def test_lin2ulaw(self):
114 self.assertEqual(audioop.lin2ulaw(data[0], 1), b'\xff\xe7\xdb')
115 self.assertEqual(audioop.lin2ulaw(data[1], 2), b'\xff\xff\xff')
116 self.assertEqual(audioop.lin2ulaw(data[2], 4), b'\xff\xff\xff')
Guido van Rossumc8504e21997-02-14 15:58:00 +0000117
Benjamin Peterson41181742008-07-02 20:22:54 +0000118 def test_ulaw2lin(self):
119 # Cursory
120 d = audioop.lin2ulaw(data[0], 1)
121 self.assertEqual(audioop.ulaw2lin(d, 1), data[0])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000122
Benjamin Peterson41181742008-07-02 20:22:54 +0000123 def test_mul(self):
124 data2 = []
125 for d in data:
126 str = bytearray(len(d))
127 for i,b in enumerate(d):
128 str[i] = 2*b
129 data2.append(str)
130 self.assertEqual(audioop.mul(data[0], 1, 2), data2[0])
131 self.assertEqual(audioop.mul(data[1],2, 2), data2[1])
132 self.assertEqual(audioop.mul(data[2], 4, 2), data2[2])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000133
Benjamin Peterson41181742008-07-02 20:22:54 +0000134 def test_ratecv(self):
135 state = None
136 d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
137 d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
138 self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000139
Benjamin Peterson41181742008-07-02 20:22:54 +0000140 def test_reverse(self):
141 self.assertEqual(audioop.reverse(data[0], 1), b'\2\1\0')
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000142
Benjamin Peterson41181742008-07-02 20:22:54 +0000143 def test_tomono(self):
144 data2 = bytearray()
145 for d in data[0]:
146 data2.append(d)
147 data2.append(d)
148 self.assertEqual(audioop.tomono(data2, 1, 0.5, 0.5), data[0])
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000149
Benjamin Peterson41181742008-07-02 20:22:54 +0000150 def test_tostereo(self):
151 data2 = bytearray()
152 for d in data[0]:
153 data2.append(d)
154 data2.append(d)
155 self.assertEqual(audioop.tostereo(data[0], 1, 1, 1), data2)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000156
Benjamin Peterson41181742008-07-02 20:22:54 +0000157 def test_findfactor(self):
158 self.assertEqual(audioop.findfactor(data[1], data[1]), 1.0)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000159
Benjamin Peterson41181742008-07-02 20:22:54 +0000160 def test_findfit(self):
161 self.assertEqual(audioop.findfit(data[1], data[1]), (0, 1.0))
162
163 def test_findmax(self):
164 self.assertEqual(audioop.findmax(data[1], 1), 2)
165
166 def test_getsample(self):
167 for i in range(3):
168 self.assertEqual(audioop.getsample(data[0], 1, i), i)
169 self.assertEqual(audioop.getsample(data[1], 2, i), i)
170 self.assertEqual(audioop.getsample(data[2], 4, i), i)
171
Georg Brandl3dbca812008-07-23 16:10:53 +0000172 def test_negativelen(self):
Georg Brandl86b2fb92008-07-16 03:43:04 +0000173 # from issue 3306, previously it segfaulted
174 self.assertRaises(audioop.error,
175 audioop.findmax, ''.join(chr(x) for x in range(256)), -2392392)
Guido van Rossumfa7fcb91994-01-12 09:55:11 +0000176
Victor Stinnerbc5c54b2010-07-03 13:44:22 +0000177 def test_issue7673(self):
178 state = None
179 for data, size in INVALID_DATA:
180 size2 = size
181 self.assertRaises(audioop.error, audioop.getsample, data, size, 0)
182 self.assertRaises(audioop.error, audioop.max, data, size)
183 self.assertRaises(audioop.error, audioop.minmax, data, size)
184 self.assertRaises(audioop.error, audioop.avg, data, size)
185 self.assertRaises(audioop.error, audioop.rms, data, size)
186 self.assertRaises(audioop.error, audioop.avgpp, data, size)
187 self.assertRaises(audioop.error, audioop.maxpp, data, size)
188 self.assertRaises(audioop.error, audioop.cross, data, size)
189 self.assertRaises(audioop.error, audioop.mul, data, size, 1.0)
190 self.assertRaises(audioop.error, audioop.tomono, data, size, 0.5, 0.5)
191 self.assertRaises(audioop.error, audioop.tostereo, data, size, 0.5, 0.5)
192 self.assertRaises(audioop.error, audioop.add, data, data, size)
193 self.assertRaises(audioop.error, audioop.bias, data, size, 0)
194 self.assertRaises(audioop.error, audioop.reverse, data, size)
195 self.assertRaises(audioop.error, audioop.lin2lin, data, size, size2)
196 self.assertRaises(audioop.error, audioop.ratecv, data, size, 1, 1, 1, state)
197 self.assertRaises(audioop.error, audioop.lin2ulaw, data, size)
198 self.assertRaises(audioop.error, audioop.ulaw2lin, data, size)
199 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
200 self.assertRaises(audioop.error, audioop.alaw2lin, data, size)
201 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, state)
202 self.assertRaises(audioop.error, audioop.adpcm2lin, data, size, state)
203
Christian Heimes180510d2008-03-03 19:15:45 +0000204def test_main():
Benjamin Peterson41181742008-07-02 20:22:54 +0000205 run_unittest(TestAudioop)
Christian Heimes180510d2008-03-03 19:15:45 +0000206
207if __name__ == '__main__':
208 test_main()