annotate tests/test_AudioSource.py @ 313:10b725735637

Remove unused functions from io.py
author Amine Sehili <amine.sehili@gmail.com>
date Mon, 14 Oct 2019 20:22:50 +0100
parents 173ffca58d23
children 903b5e1e8af9
rev   line source
amine@164 1 """
amine@164 2 @author: Amine Sehili <amine.sehili@gmail.com>
amine@164 3 """
amine@164 4 from array import array
amine@164 5 import unittest
amine@164 6 from genty import genty, genty_dataset
amine@164 7 from auditok.io import (
amine@164 8 AudioParameterError,
amine@164 9 DATA_FORMAT,
amine@164 10 BufferAudioSource,
amine@164 11 RawAudioSource,
amine@164 12 WaveAudioSource,
amine@164 13 )
amine@240 14 from test_util import PURE_TONE_DICT, _sample_generator
amine@164 15
amine@164 16
amine@164 17 def audio_source_read_all_gen(audio_source, size=None):
amine@164 18 if size is None:
amine@164 19 size = int(audio_source.sr * 0.1) # 100ms
amine@164 20 while True:
amine@164 21 data = audio_source.read(size)
amine@164 22 if data is None:
amine@164 23 break
amine@164 24 yield data
amine@164 25
amine@164 26
amine@164 27 @genty
amine@164 28 class TestAudioSource(unittest.TestCase):
amine@164 29
amine@164 30 # TODO when use_channel is None, return samples from all channels
amine@164 31
amine@164 32 @genty_dataset(
amine@240 33 mono=("mono_400Hz", (400,)),
amine@240 34 multichannel=("3channel_400-800-1600Hz", (400, 800, 1600)),
amine@164 35 )
amine@240 36 def test_BufferAudioSource_read_all(self, file_suffix, frequencies):
amine@238 37 file = "tests/data/test_16KHZ_{}.raw".format(file_suffix)
amine@238 38 with open(file, "rb") as fp:
amine@238 39 expected = fp.read()
amine@240 40 channels = len(frequencies)
amine@240 41 audio_source = BufferAudioSource(expected, 16000, 2, channels)
amine@240 42 audio_source.open()
amine@240 43 data = audio_source.read(None)
amine@240 44 self.assertEqual(data, expected)
amine@240 45 audio_source.rewind()
amine@240 46 data = audio_source.read(-10)
amine@240 47 self.assertEqual(data, expected)
amine@240 48 audio_source.close()
amine@238 49
amine@238 50 @genty_dataset(
amine@240 51 mono=("mono_400Hz", (400,)),
amine@240 52 multichannel=("3channel_400-800-1600Hz", (400, 800, 1600)),
amine@238 53 )
amine@240 54 def test_RawAudioSource(self, file_suffix, frequencies):
amine@164 55 file = "tests/data/test_16KHZ_{}.raw".format(file_suffix)
amine@240 56 channels = len(frequencies)
amine@240 57 audio_source = RawAudioSource(file, 16000, 2, channels)
amine@164 58 audio_source.open()
amine@240 59 data_read_all = b"".join(audio_source_read_all_gen(audio_source))
amine@164 60 audio_source.close()
amine@240 61 mono_channels = [PURE_TONE_DICT[freq] for freq in frequencies]
amine@240 62 fmt = DATA_FORMAT[audio_source.sample_width]
amine@313 63 expected = array(fmt, _sample_generator(*mono_channels)).tobytes()
amine@240 64
amine@240 65 self.assertEqual(data_read_all, expected)
amine@164 66
amine@238 67 # assert read all data with None
amine@240 68 audio_source = RawAudioSource(file, 16000, 2, channels)
amine@238 69 audio_source.open()
amine@238 70 data_read_all = audio_source.read(None)
amine@238 71 audio_source.close()
amine@238 72 self.assertEqual(data_read_all, expected)
amine@238 73
amine@238 74 # assert read all data with a negative size
amine@240 75 audio_source = RawAudioSource(file, 16000, 2, channels)
amine@238 76 audio_source.open()
amine@238 77 data_read_all = audio_source.read(-10)
amine@238 78 audio_source.close()
amine@238 79 self.assertEqual(data_read_all, expected)
amine@238 80
amine@240 81 @genty_dataset(
amine@240 82 mono=("mono_400Hz", (400,)),
amine@240 83 multichannel=("3channel_400-800-1600Hz", (400, 800, 1600)),
amine@240 84 )
amine@240 85 def test_WaveAudioSource(self, file_suffix, frequencies):
amine@240 86 file = "tests/data/test_16KHZ_{}.wav".format(file_suffix)
amine@240 87 audio_source = WaveAudioSource(file)
amine@164 88 audio_source.open()
amine@164 89 data = b"".join(audio_source_read_all_gen(audio_source))
amine@164 90 audio_source.close()
amine@240 91 mono_channels = [PURE_TONE_DICT[freq] for freq in frequencies]
amine@240 92 fmt = DATA_FORMAT[audio_source.sample_width]
amine@313 93 expected = array(fmt, _sample_generator(*mono_channels)).tobytes()
amine@164 94
amine@164 95 self.assertEqual(data, expected)
amine@164 96
amine@238 97 # assert read all data with None
amine@240 98 audio_source = WaveAudioSource(file)
amine@238 99 audio_source.open()
amine@238 100 data_read_all = audio_source.read(None)
amine@238 101 audio_source.close()
amine@238 102 self.assertEqual(data_read_all, expected)
amine@238 103
amine@238 104 # assert read all data with a negative size
amine@240 105 audio_source = WaveAudioSource(file)
amine@238 106 audio_source.open()
amine@238 107 data_read_all = audio_source.read(-10)
amine@238 108 audio_source.close()
amine@238 109 self.assertEqual(data_read_all, expected)
amine@238 110
amine@164 111
amine@166 112 @genty
amine@164 113 class TestBufferAudioSource_SR10_SW1_CH1(unittest.TestCase):
amine@164 114 def setUp(self):
amine@164 115 self.data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
amine@164 116 self.audio_source = BufferAudioSource(
amine@164 117 data_buffer=self.data, sampling_rate=10, sample_width=1, channels=1
amine@164 118 )
amine@164 119 self.audio_source.open()
amine@164 120
amine@164 121 def tearDown(self):
amine@164 122 self.audio_source.close()
amine@164 123
amine@164 124 def test_sr10_sw1_ch1_read_1(self):
amine@164 125 block = self.audio_source.read(1)
amine@164 126 exp = b"A"
amine@164 127 self.assertEqual(
amine@164 128 block,
amine@164 129 exp,
amine@164 130 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 131 )
amine@164 132
amine@164 133 def test_sr10_sw1_ch1_read_6(self):
amine@164 134 block = self.audio_source.read(6)
amine@164 135 exp = b"ABCDEF"
amine@164 136 self.assertEqual(
amine@164 137 block,
amine@164 138 exp,
amine@164 139 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 140 )
amine@164 141
amine@164 142 def test_sr10_sw1_ch1_read_multiple(self):
amine@164 143 block = self.audio_source.read(1)
amine@164 144 exp = b"A"
amine@164 145 self.assertEqual(
amine@164 146 block,
amine@164 147 exp,
amine@164 148 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 149 )
amine@164 150
amine@164 151 block = self.audio_source.read(6)
amine@164 152 exp = b"BCDEFG"
amine@164 153 self.assertEqual(
amine@164 154 block,
amine@164 155 exp,
amine@164 156 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 157 )
amine@164 158
amine@164 159 block = self.audio_source.read(13)
amine@164 160 exp = b"HIJKLMNOPQRST"
amine@164 161 self.assertEqual(
amine@164 162 block,
amine@164 163 exp,
amine@164 164 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 165 )
amine@164 166
amine@164 167 block = self.audio_source.read(9999)
amine@164 168 exp = b"UVWXYZ012345"
amine@164 169 self.assertEqual(
amine@164 170 block,
amine@164 171 exp,
amine@164 172 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 173 )
amine@164 174
amine@164 175 def test_sr10_sw1_ch1_read_all(self):
amine@164 176 block = self.audio_source.read(9999)
amine@164 177 self.assertEqual(
amine@164 178 block,
amine@164 179 self.data,
amine@164 180 msg="wrong block, expected: {}, found: {} ".format(
amine@164 181 self.data, block
amine@164 182 ),
amine@164 183 )
amine@164 184
amine@164 185 block = self.audio_source.read(1)
amine@164 186 self.assertEqual(
amine@164 187 block,
amine@164 188 None,
amine@164 189 msg="wrong block, expected: {}, found: {} ".format(None, block),
amine@164 190 )
amine@164 191
amine@164 192 def test_sr10_sw1_ch1_get_sampling_rate(self):
amine@164 193 srate = self.audio_source.get_sampling_rate()
amine@164 194 self.assertEqual(
amine@164 195 srate,
amine@164 196 10,
amine@164 197 msg="wrong sampling rate, expected: 10, found: {0} ".format(srate),
amine@164 198 )
amine@164 199
amine@164 200 def test_sr10_sw1_ch1_get_sample_width(self):
amine@164 201 swidth = self.audio_source.get_sample_width()
amine@164 202 self.assertEqual(
amine@164 203 swidth,
amine@164 204 1,
amine@164 205 msg="wrong sample width, expected: 1, found: {0} ".format(swidth),
amine@164 206 )
amine@164 207
amine@164 208 def test_sr10_sw1_ch1_get_channels(self):
amine@164 209 channels = self.audio_source.get_channels()
amine@164 210 self.assertEqual(
amine@164 211 channels,
amine@164 212 1,
amine@164 213 msg="wrong number of channels, expected: 1, found: {0} ".format(
amine@164 214 channels
amine@164 215 ),
amine@164 216 )
amine@164 217
amine@166 218 @genty_dataset(
amine@166 219 empty=([], 0, 0, 0),
amine@166 220 zero=([0], 0, 0, 0),
amine@166 221 five=([5], 5, 0.5, 500),
amine@166 222 multiple=([5, 20], 25, 2.5, 2500),
amine@166 223 )
amine@166 224 def test_position(
amine@166 225 self, block_sizes, expected_sample, expected_second, expected_ms
amine@166 226 ):
amine@166 227 for block_size in block_sizes:
amine@166 228 self.audio_source.read(block_size)
amine@166 229 position = self.audio_source.position
amine@166 230 self.assertEqual(
amine@166 231 position,
amine@166 232 expected_sample,
amine@166 233 msg="wrong stream position, expected: {}, found: {}".format(
amine@166 234 expected_sample, position
amine@166 235 ),
amine@166 236 )
amine@166 237
amine@166 238 position_s = self.audio_source.position_s
amine@166 239 self.assertEqual(
amine@166 240 position_s,
amine@166 241 expected_second,
amine@166 242 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@166 243 expected_second, position_s
amine@166 244 ),
amine@166 245 )
amine@166 246
amine@166 247 position_ms = self.audio_source.position_ms
amine@166 248 self.assertEqual(
amine@166 249 position_ms,
amine@166 250 expected_ms,
amine@166 251 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@166 252 expected_ms, position_ms
amine@166 253 ),
amine@166 254 )
amine@166 255
amine@166 256 @genty_dataset(
amine@166 257 zero=(0, 0, 0, 0),
amine@166 258 one=(1, 1, 0.1, 100),
amine@166 259 ten=(10, 10, 1, 1000),
amine@166 260 negative_1=(-1, 31, 3.1, 3100),
amine@166 261 negative_2=(-7, 25, 2.5, 2500),
amine@166 262 )
amine@166 263 def test_position_setter(
amine@166 264 self, position, expected_sample, expected_second, expected_ms
amine@166 265 ):
amine@166 266 self.audio_source.position = position
amine@166 267
amine@166 268 position = self.audio_source.position
amine@166 269 self.assertEqual(
amine@166 270 position,
amine@166 271 expected_sample,
amine@166 272 msg="wrong stream position, expected: {}, found: {}".format(
amine@166 273 expected_sample, position
amine@166 274 ),
amine@166 275 )
amine@166 276
amine@166 277 position_s = self.audio_source.position_s
amine@166 278 self.assertEqual(
amine@166 279 position_s,
amine@166 280 expected_second,
amine@166 281 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@166 282 expected_second, position_s
amine@166 283 ),
amine@166 284 )
amine@166 285
amine@166 286 position_ms = self.audio_source.position_ms
amine@166 287 self.assertEqual(
amine@166 288 position_ms,
amine@166 289 expected_ms,
amine@166 290 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@166 291 expected_ms, position_ms
amine@166 292 ),
amine@166 293 )
amine@166 294
amine@166 295 @genty_dataset(
amine@166 296 zero=(0, 0, 0, 0),
amine@166 297 one=(0.1, 1, 0.1, 100),
amine@166 298 ten=(1, 10, 1, 1000),
amine@166 299 negative_1=(-0.1, 31, 3.1, 3100),
amine@166 300 negative_2=(-0.7, 25, 2.5, 2500),
amine@166 301 )
amine@166 302 def test_position_s_setter(
amine@166 303 self, position_s, expected_sample, expected_second, expected_ms
amine@166 304 ):
amine@166 305 self.audio_source.position_s = position_s
amine@166 306
amine@166 307 position = self.audio_source.position
amine@166 308 self.assertEqual(
amine@166 309 position,
amine@166 310 expected_sample,
amine@166 311 msg="wrong stream position, expected: {}, found: {}".format(
amine@166 312 expected_sample, position
amine@166 313 ),
amine@166 314 )
amine@166 315
amine@166 316 position_s = self.audio_source.position_s
amine@166 317 self.assertEqual(
amine@166 318 position_s,
amine@166 319 expected_second,
amine@166 320 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@166 321 expected_second, position_s
amine@166 322 ),
amine@166 323 )
amine@166 324
amine@166 325 position_ms = self.audio_source.position_ms
amine@166 326 self.assertEqual(
amine@166 327 position_ms,
amine@166 328 expected_ms,
amine@166 329 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@166 330 expected_ms, position_ms
amine@166 331 ),
amine@166 332 )
amine@166 333
amine@166 334 @genty_dataset(
amine@166 335 zero=(0, 0, 0, 0),
amine@166 336 one=(100, 1, 0.1, 100),
amine@166 337 ten=(1000, 10, 1, 1000),
amine@166 338 negative_1=(-100, 31, 3.1, 3100),
amine@166 339 negative_2=(-700, 25, 2.5, 2500),
amine@166 340 )
amine@166 341 def test_position_ms_setter(
amine@166 342 self, position_ms, expected_sample, expected_second, expected_ms
amine@166 343 ):
amine@166 344 self.audio_source.position_ms = position_ms
amine@166 345
amine@166 346 position = self.audio_source.position
amine@166 347 self.assertEqual(
amine@166 348 position,
amine@166 349 expected_sample,
amine@166 350 msg="wrong stream position, expected: {}, found: {}".format(
amine@166 351 expected_sample, position
amine@166 352 ),
amine@166 353 )
amine@166 354
amine@166 355 position_s = self.audio_source.position_s
amine@166 356 self.assertEqual(
amine@166 357 position_s,
amine@166 358 expected_second,
amine@166 359 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@166 360 expected_second, position_s
amine@166 361 ),
amine@166 362 )
amine@166 363
amine@166 364 position_ms = self.audio_source.position_ms
amine@166 365 self.assertEqual(
amine@166 366 position_ms,
amine@166 367 expected_ms,
amine@166 368 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@166 369 expected_ms, position_ms
amine@166 370 ),
amine@166 371 )
amine@166 372
amine@166 373 @genty_dataset(positive=((100,)), negative=(-100,))
amine@166 374 def test_position_setter_out_of_range(self, position):
amine@166 375 with self.assertRaises(IndexError):
amine@166 376 self.audio_source.position = position
amine@166 377
amine@166 378 @genty_dataset(positive=((100,)), negative=(-100,))
amine@166 379 def test_position_s_setter_out_of_range(self, position_s):
amine@166 380 with self.assertRaises(IndexError):
amine@166 381 self.audio_source.position_s = position_s
amine@166 382
amine@166 383 @genty_dataset(positive=((10000,)), negative=(-10000,))
amine@166 384 def test_position_ms_setter_out_of_range(self, position_ms):
amine@166 385 with self.assertRaises(IndexError):
amine@166 386 self.audio_source.position_ms = position_ms
amine@166 387
amine@216 388 def test_sr10_sw1_ch1_position_s_0(self):
amine@216 389 tp = self.audio_source.position_s
amine@164 390 self.assertEqual(
amine@164 391 tp,
amine@164 392 0.0,
amine@164 393 msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
amine@164 394 )
amine@164 395
amine@216 396 def test_sr10_sw1_ch1_position_s_1(self):
amine@164 397 srate = self.audio_source.get_sampling_rate()
amine@164 398 # read one second
amine@164 399 self.audio_source.read(srate)
amine@216 400 tp = self.audio_source.position_s
amine@164 401 self.assertEqual(
amine@164 402 tp,
amine@164 403 1.0,
amine@164 404 msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
amine@164 405 )
amine@164 406
amine@216 407 def test_sr10_sw1_ch1_position_s_2_5(self):
amine@164 408 # read 2.5 seconds
amine@164 409 self.audio_source.read(25)
amine@216 410 tp = self.audio_source.position_s
amine@164 411 self.assertEqual(
amine@164 412 tp,
amine@164 413 2.5,
amine@164 414 msg="wrong time position, expected: 2.5, found: {0} ".format(tp),
amine@164 415 )
amine@164 416
amine@216 417 def test_sr10_sw1_ch1_position_s_0(self):
amine@164 418 self.audio_source.read(10)
amine@216 419 self.audio_source.position_s = 0
amine@216 420 tp = self.audio_source.position_s
amine@164 421 self.assertEqual(
amine@164 422 tp,
amine@164 423 0.0,
amine@164 424 msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
amine@164 425 )
amine@164 426
amine@216 427 def test_sr10_sw1_ch1_position_s_1(self):
amine@216 428 self.audio_source.position_s = 1
amine@216 429 tp = self.audio_source.position_s
amine@164 430 self.assertEqual(
amine@164 431 tp,
amine@164 432 1.0,
amine@164 433 msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
amine@164 434 )
amine@164 435
amine@164 436 def test_sr10_sw1_ch1_rewind(self):
amine@164 437 self.audio_source.read(10)
amine@164 438 self.audio_source.rewind()
amine@169 439 tp = self.audio_source.position
amine@164 440 self.assertEqual(
amine@164 441 tp, 0, msg="wrong position, expected: 0.0, found: {0} ".format(tp)
amine@164 442 )
amine@164 443
amine@164 444 def test_sr10_sw1_ch1_set_data(self):
amine@164 445 self.audio_source.set_data(b"12345")
amine@164 446 block = self.audio_source.read(9999)
amine@164 447 self.assertEqual(
amine@164 448 block,
amine@164 449 b"12345",
amine@164 450 msg="wrong block, expected: '12345', found: {0} ".format(block),
amine@164 451 )
amine@164 452
amine@164 453 def test_sr10_sw1_ch1_read_closed(self):
amine@164 454 self.audio_source.close()
amine@164 455 with self.assertRaises(Exception):
amine@164 456 self.audio_source.read(1)
amine@164 457
amine@209 458
amine@169 459 @genty
amine@164 460 class TestBufferAudioSource_SR16_SW2_CH1(unittest.TestCase):
amine@164 461 def setUp(self):
amine@164 462 self.data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
amine@164 463 self.audio_source = BufferAudioSource(
amine@164 464 data_buffer=self.data, sampling_rate=16, sample_width=2, channels=1
amine@164 465 )
amine@164 466 self.audio_source.open()
amine@164 467
amine@164 468 def tearDown(self):
amine@164 469 self.audio_source.close()
amine@164 470
amine@164 471 def test_sr16_sw2_ch1_read_1(self):
amine@164 472 block = self.audio_source.read(1)
amine@164 473 exp = b"AB"
amine@164 474 self.assertEqual(
amine@164 475 block,
amine@164 476 exp,
amine@164 477 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 478 )
amine@164 479
amine@164 480 def test_sr16_sw2_ch1_read_6(self):
amine@164 481 block = self.audio_source.read(6)
amine@164 482 exp = b"ABCDEFGHIJKL"
amine@164 483 self.assertEqual(
amine@164 484 block,
amine@164 485 exp,
amine@164 486 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 487 )
amine@164 488
amine@164 489 def test_sr16_sw2_ch1_read_multiple(self):
amine@164 490 block = self.audio_source.read(1)
amine@164 491 exp = b"AB"
amine@164 492 self.assertEqual(
amine@164 493 block,
amine@164 494 exp,
amine@164 495 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 496 )
amine@164 497
amine@164 498 block = self.audio_source.read(6)
amine@164 499 exp = b"CDEFGHIJKLMN"
amine@164 500 self.assertEqual(
amine@164 501 block,
amine@164 502 exp,
amine@164 503 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 504 )
amine@164 505
amine@164 506 block = self.audio_source.read(5)
amine@164 507 exp = b"OPQRSTUVWX"
amine@164 508 self.assertEqual(
amine@164 509 block,
amine@164 510 exp,
amine@164 511 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 512 )
amine@164 513
amine@164 514 block = self.audio_source.read(9999)
amine@164 515 exp = b"YZ012345"
amine@164 516 self.assertEqual(
amine@164 517 block,
amine@164 518 exp,
amine@164 519 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 520 )
amine@164 521
amine@164 522 def test_sr16_sw2_ch1_read_all(self):
amine@164 523 block = self.audio_source.read(9999)
amine@164 524 self.assertEqual(
amine@164 525 block,
amine@164 526 self.data,
amine@164 527 msg="wrong block, expected: {0}, found: {1} ".format(
amine@164 528 self.data, block
amine@164 529 ),
amine@164 530 )
amine@164 531
amine@164 532 block = self.audio_source.read(1)
amine@164 533 self.assertEqual(
amine@164 534 block,
amine@164 535 None,
amine@164 536 msg="wrong block, expected: {0}, found: {1} ".format(None, block),
amine@164 537 )
amine@164 538
amine@164 539 def test_sr16_sw2_ch1_get_sampling_rate(self):
amine@164 540 srate = self.audio_source.get_sampling_rate()
amine@164 541 self.assertEqual(
amine@164 542 srate,
amine@164 543 16,
amine@164 544 msg="wrong sampling rate, expected: 10, found: {0} ".format(srate),
amine@164 545 )
amine@164 546
amine@164 547 def test_sr16_sw2_ch1_get_sample_width(self):
amine@164 548 swidth = self.audio_source.get_sample_width()
amine@164 549 self.assertEqual(
amine@164 550 swidth,
amine@164 551 2,
amine@164 552 msg="wrong sample width, expected: 1, found: {0} ".format(swidth),
amine@164 553 )
amine@164 554
amine@164 555 def test_sr16_sw2_ch1_get_channels(self):
amine@164 556
amine@164 557 channels = self.audio_source.get_channels()
amine@164 558 self.assertEqual(
amine@164 559 channels,
amine@164 560 1,
amine@164 561 msg="wrong number of channels, expected: 1, found: {0} ".format(
amine@164 562 channels
amine@164 563 ),
amine@164 564 )
amine@164 565
amine@169 566 @genty_dataset(
amine@169 567 empty=([], 0, 0, 0),
amine@169 568 zero=([0], 0, 0, 0),
amine@209 569 two=([2], 2, 2 / 16, int(2000 / 16)),
amine@209 570 eleven=([11], 11, 11 / 16, int(11 * 1000 / 16)),
amine@169 571 multiple=([4, 8], 12, 0.75, 750),
amine@169 572 )
amine@169 573 def test_position(
amine@169 574 self, block_sizes, expected_sample, expected_second, expected_ms
amine@169 575 ):
amine@169 576 for block_size in block_sizes:
amine@169 577 self.audio_source.read(block_size)
amine@169 578 position = self.audio_source.position
amine@169 579 self.assertEqual(
amine@169 580 position,
amine@169 581 expected_sample,
amine@169 582 msg="wrong stream position, expected: {}, found: {}".format(
amine@169 583 expected_sample, position
amine@169 584 ),
amine@169 585 )
amine@169 586
amine@169 587 position_s = self.audio_source.position_s
amine@169 588 self.assertEqual(
amine@169 589 position_s,
amine@169 590 expected_second,
amine@169 591 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 592 expected_second, position_s
amine@169 593 ),
amine@169 594 )
amine@169 595
amine@169 596 position_ms = self.audio_source.position_ms
amine@169 597 self.assertEqual(
amine@169 598 position_ms,
amine@169 599 expected_ms,
amine@169 600 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 601 expected_ms, position_ms
amine@169 602 ),
amine@169 603 )
amine@169 604
amine@216 605 def test_sr16_sw2_ch1_read_position_0(self):
amine@169 606 self.audio_source.read(10)
amine@169 607 self.audio_source.position = 0
amine@169 608 pos = self.audio_source.position
amine@164 609 self.assertEqual(
amine@164 610 pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
amine@164 611 )
amine@164 612
amine@169 613 @genty_dataset(
amine@169 614 zero=(0, 0, 0, 0),
amine@209 615 one=(1, 1, 1 / 16, int(1000 / 16)),
amine@209 616 ten=(10, 10, 10 / 16, int(10000 / 16)),
amine@209 617 negative_1=(-1, 15, 15 / 16, int(15000 / 16)),
amine@209 618 negative_2=(-7, 9, 9 / 16, int(9000 / 16)),
amine@169 619 )
amine@169 620 def test_position_setter(
amine@169 621 self, position, expected_sample, expected_second, expected_ms
amine@169 622 ):
amine@169 623 self.audio_source.position = position
amine@169 624
amine@169 625 position = self.audio_source.position
amine@164 626 self.assertEqual(
amine@169 627 position,
amine@169 628 expected_sample,
amine@169 629 msg="wrong stream position, expected: {}, found: {}".format(
amine@169 630 expected_sample, position
amine@169 631 ),
amine@164 632 )
amine@164 633
amine@169 634 position_s = self.audio_source.position_s
amine@164 635 self.assertEqual(
amine@169 636 position_s,
amine@169 637 expected_second,
amine@169 638 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 639 expected_second, position_s
amine@169 640 ),
amine@164 641 )
amine@164 642
amine@169 643 position_ms = self.audio_source.position_ms
amine@164 644 self.assertEqual(
amine@169 645 position_ms,
amine@169 646 expected_ms,
amine@169 647 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 648 expected_ms, position_ms
amine@169 649 ),
amine@164 650 )
amine@164 651
amine@169 652 @genty_dataset(
amine@169 653 zero=(0, 0, 0, 0),
amine@209 654 one=(0.1, 1, 1 / 16, int(1000 / 16)),
amine@209 655 two=(1 / 8, 2, 1 / 8, int(1 / 8 * 1000)),
amine@209 656 twelve=(0.75, 12, 0.75, 750),
amine@209 657 negative_1=(-0.1, 15, 15 / 16, int(15000 / 16)),
amine@209 658 negative_2=(-0.7, 5, 5 / 16, int(5000 / 16)),
amine@169 659 )
amine@169 660 def test_position_s_setter(
amine@169 661 self, position_s, expected_sample, expected_second, expected_ms
amine@169 662 ):
amine@169 663 self.audio_source.position_s = position_s
amine@169 664
amine@169 665 position = self.audio_source.position
amine@164 666 self.assertEqual(
amine@169 667 position,
amine@169 668 expected_sample,
amine@169 669 msg="wrong stream position, expected: {}, found: {}".format(
amine@169 670 expected_sample, position
amine@169 671 ),
amine@164 672 )
amine@164 673
amine@169 674 position_s = self.audio_source.position_s
amine@164 675 self.assertEqual(
amine@169 676 position_s,
amine@169 677 expected_second,
amine@169 678 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 679 expected_second, position_s
amine@169 680 ),
amine@164 681 )
amine@164 682
amine@169 683 position_ms = self.audio_source.position_ms
amine@164 684 self.assertEqual(
amine@169 685 position_ms,
amine@169 686 expected_ms,
amine@169 687 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 688 expected_ms, position_ms
amine@169 689 ),
amine@164 690 )
amine@164 691
amine@169 692 @genty_dataset(
amine@169 693 zero=(0, 0, 0, 0),
amine@209 694 one=(100, 1, 1 / 16, int(1000 / 16)),
amine@169 695 ten=(1000, 16, 1, 1000),
amine@209 696 negative_1=(-100, 15, 15 / 16, int(15 * 1000 / 16)),
amine@169 697 negative_2=(-500, 8, 0.5, 500),
amine@209 698 negative_3=(-700, 5, 5 / 16, int(5 * 1000 / 16)),
amine@169 699 )
amine@169 700 def test_position_ms_setter(
amine@169 701 self, position_ms, expected_sample, expected_second, expected_ms
amine@169 702 ):
amine@169 703 self.audio_source.position_ms = position_ms
amine@169 704
amine@169 705 position = self.audio_source.position
amine@164 706 self.assertEqual(
amine@169 707 position,
amine@169 708 expected_sample,
amine@169 709 msg="wrong stream position, expected: {}, found: {}".format(
amine@169 710 expected_sample, position
amine@169 711 ),
amine@164 712 )
amine@164 713
amine@169 714 position_s = self.audio_source.position_s
amine@164 715 self.assertEqual(
amine@169 716 position_s,
amine@169 717 expected_second,
amine@169 718 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 719 expected_second, position_s
amine@169 720 ),
amine@164 721 )
amine@164 722
amine@169 723 position_ms = self.audio_source.position_ms
amine@164 724 self.assertEqual(
amine@169 725 position_ms,
amine@169 726 expected_ms,
amine@169 727 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 728 expected_ms, position_ms
amine@169 729 ),
amine@164 730 )
amine@164 731
amine@164 732 def test_sr16_sw2_ch1_rewind(self):
amine@164 733 self.audio_source.read(10)
amine@164 734 self.audio_source.rewind()
amine@216 735 tp = self.audio_source.position
amine@164 736 self.assertEqual(
amine@164 737 tp, 0, msg="wrong position, expected: 0.0, found: {0} ".format(tp)
amine@164 738 )
amine@164 739
amine@164 740 def test_sr16_sw2_ch1_set_data(self):
amine@164 741 self.audio_source.set_data(b"abcdef")
amine@164 742 block = self.audio_source.read(9999)
amine@164 743 self.assertEqual(
amine@164 744 block,
amine@164 745 b"abcdef",
amine@164 746 msg="wrong block, expected: 'abcdef', found: {0} ".format(block),
amine@164 747 )
amine@164 748
amine@164 749 def test_sr16_sw2_ch1_set_data_exception(self):
amine@164 750 with self.assertRaises(AudioParameterError) as audio_param_err:
amine@164 751 self.audio_source.set_data("abcde")
amine@164 752 self.assertEqual(
amine@164 753 "The length of audio data must be an integer "
amine@164 754 "multiple of `sample_width * channels`",
amine@164 755 str(audio_param_err.exception),
amine@164 756 )
amine@164 757
amine@164 758 def test_sr16_sw2_ch1_append_data_exception(self):
amine@164 759 with self.assertRaises(AudioParameterError) as audio_param_err:
amine@164 760 self.audio_source.append_data("abcde")
amine@164 761 self.assertEqual(
amine@164 762 "The length of audio data must be an integer "
amine@164 763 "multiple of `sample_width * channels`",
amine@164 764 str(audio_param_err.exception),
amine@164 765 )
amine@164 766
amine@164 767
amine@164 768 class TestBufferAudioSource_SR11_SW4_CH1(unittest.TestCase):
amine@164 769 def setUp(self):
amine@164 770 self.data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefgh"
amine@164 771 self.audio_source = BufferAudioSource(
amine@164 772 data_buffer=self.data, sampling_rate=11, sample_width=4, channels=1
amine@164 773 )
amine@164 774 self.audio_source.open()
amine@164 775
amine@164 776 def tearDown(self):
amine@164 777 self.audio_source.close()
amine@164 778
amine@164 779 def test_sr11_sw4_ch1_read_1(self):
amine@164 780 block = self.audio_source.read(1)
amine@164 781 exp = b"ABCD"
amine@164 782 self.assertEqual(
amine@164 783 block,
amine@164 784 exp,
amine@164 785 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 786 )
amine@164 787
amine@164 788 def test_sr11_sw4_ch1_read_6(self):
amine@164 789 block = self.audio_source.read(6)
amine@164 790 exp = b"ABCDEFGHIJKLMNOPQRSTUVWX"
amine@164 791 self.assertEqual(
amine@164 792 block,
amine@164 793 exp,
amine@164 794 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 795 )
amine@164 796
amine@164 797 def test_sr11_sw4_ch1_read_multiple(self):
amine@164 798 block = self.audio_source.read(1)
amine@164 799 exp = b"ABCD"
amine@164 800 self.assertEqual(
amine@164 801 block,
amine@164 802 exp,
amine@164 803 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 804 )
amine@164 805
amine@164 806 block = self.audio_source.read(6)
amine@164 807 exp = b"EFGHIJKLMNOPQRSTUVWXYZ01"
amine@164 808 self.assertEqual(
amine@164 809 block,
amine@164 810 exp,
amine@164 811 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 812 )
amine@164 813
amine@164 814 block = self.audio_source.read(3)
amine@164 815 exp = b"23456789abcd"
amine@164 816 self.assertEqual(
amine@164 817 block,
amine@164 818 exp,
amine@164 819 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 820 )
amine@164 821
amine@164 822 block = self.audio_source.read(9999)
amine@164 823 exp = b"efgh"
amine@164 824 self.assertEqual(
amine@164 825 block,
amine@164 826 exp,
amine@164 827 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 828 )
amine@164 829
amine@164 830 def test_sr11_sw4_ch1_read_all(self):
amine@164 831 block = self.audio_source.read(9999)
amine@164 832 self.assertEqual(
amine@164 833 block,
amine@164 834 self.data,
amine@164 835 msg="wrong block, expected: {0}, found: {1} ".format(
amine@164 836 self.data, block
amine@164 837 ),
amine@164 838 )
amine@164 839
amine@164 840 block = self.audio_source.read(1)
amine@164 841 self.assertEqual(
amine@164 842 block,
amine@164 843 None,
amine@164 844 msg="wrong block, expected: {0}, found: {1} ".format(None, block),
amine@164 845 )
amine@164 846
amine@164 847 def test_sr11_sw4_ch1_get_sampling_rate(self):
amine@164 848 srate = self.audio_source.get_sampling_rate()
amine@164 849 self.assertEqual(
amine@164 850 srate,
amine@164 851 11,
amine@164 852 msg="wrong sampling rate, expected: 10, found: {0} ".format(srate),
amine@164 853 )
amine@164 854
amine@164 855 def test_sr11_sw4_ch1_get_sample_width(self):
amine@164 856 swidth = self.audio_source.get_sample_width()
amine@164 857 self.assertEqual(
amine@164 858 swidth,
amine@164 859 4,
amine@164 860 msg="wrong sample width, expected: 1, found: {0} ".format(swidth),
amine@164 861 )
amine@164 862
amine@164 863 def test_sr11_sw4_ch1_get_channels(self):
amine@164 864 channels = self.audio_source.get_channels()
amine@164 865 self.assertEqual(
amine@164 866 channels,
amine@164 867 1,
amine@164 868 msg="wrong number of channels, expected: 1, found: {0} ".format(
amine@164 869 channels
amine@164 870 ),
amine@164 871 )
amine@164 872
amine@216 873 def test_sr11_sw4_ch1_position_0(self):
amine@216 874 pos = self.audio_source.position
amine@164 875 self.assertEqual(
amine@164 876 pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
amine@164 877 )
amine@164 878
amine@216 879 def test_sr11_sw4_ch1_position_5(self):
amine@164 880 self.audio_source.read(5)
amine@216 881 pos = self.audio_source.position
amine@164 882 self.assertEqual(
amine@164 883 pos, 5, msg="wrong position, expected: 5, found: {0} ".format(pos)
amine@164 884 )
amine@164 885
amine@216 886 def test_sr11_sw4_ch1_position_9(self):
amine@164 887 self.audio_source.read(5)
amine@164 888 self.audio_source.read(4)
amine@216 889 pos = self.audio_source.position
amine@164 890 self.assertEqual(
amine@164 891 pos, 9, msg="wrong position, expected: 5, found: {0} ".format(pos)
amine@164 892 )
amine@164 893
amine@216 894 def test_sr11_sw4_ch1_position_0(self):
amine@164 895 self.audio_source.read(10)
amine@216 896 self.audio_source.position = 0
amine@216 897 pos = self.audio_source.position
amine@164 898 self.assertEqual(
amine@164 899 pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
amine@164 900 )
amine@164 901
amine@216 902 def test_sr11_sw4_ch1_position_10(self):
amine@216 903 self.audio_source.position = 10
amine@216 904 pos = self.audio_source.position
amine@164 905 self.assertEqual(
amine@164 906 pos,
amine@164 907 10,
amine@164 908 msg="wrong position, expected: 10, found: {0} ".format(pos),
amine@164 909 )
amine@164 910
amine@216 911 def test_sr11_sw4_ch1_position_s_0(self):
amine@216 912 tp = self.audio_source.position_s
amine@164 913 self.assertEqual(
amine@164 914 tp,
amine@164 915 0.0,
amine@164 916 msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
amine@164 917 )
amine@164 918
amine@216 919 def test_sr11_sw4_ch1_position_s_1(self):
amine@164 920 srate = self.audio_source.get_sampling_rate()
amine@164 921 # read one second
amine@164 922 self.audio_source.read(srate)
amine@216 923 tp = self.audio_source.position_s
amine@164 924 self.assertEqual(
amine@164 925 tp,
amine@164 926 1.0,
amine@164 927 msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
amine@164 928 )
amine@164 929
amine@216 930 def test_sr11_sw4_ch1_position_s_0_63(self):
amine@164 931 # read 2.5 seconds
amine@164 932 self.audio_source.read(7)
amine@216 933 tp = self.audio_source.position_s
amine@164 934 self.assertAlmostEqual(
amine@164 935 tp,
amine@164 936 0.636363636364,
amine@164 937 msg="wrong time position, expected: 0.636363636364, "
amine@164 938 "found: {0} ".format(tp),
amine@164 939 )
amine@164 940
amine@216 941 def test_sr11_sw4_ch1_position_s_0(self):
amine@164 942 self.audio_source.read(10)
amine@216 943 self.audio_source.position_s = 0
amine@216 944 tp = self.audio_source.position_s
amine@164 945 self.assertEqual(
amine@164 946 tp,
amine@164 947 0.0,
amine@164 948 msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
amine@164 949 )
amine@164 950
amine@216 951 def test_sr11_sw4_ch1_position_s_1(self):
amine@164 952
amine@216 953 self.audio_source.position_s = 1
amine@216 954 tp = self.audio_source.position_s
amine@164 955 self.assertEqual(
amine@164 956 tp,
amine@164 957 1.0,
amine@164 958 msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
amine@164 959 )
amine@164 960
amine@164 961 def test_sr11_sw4_ch1_rewind(self):
amine@164 962 self.audio_source.read(10)
amine@164 963 self.audio_source.rewind()
amine@169 964 tp = self.audio_source.position
amine@164 965 self.assertEqual(
amine@164 966 tp, 0, msg="wrong position, expected: 0.0, found: {0} ".format(tp)
amine@164 967 )
amine@164 968
amine@164 969 def test_sr11_sw4_ch1_set_data(self):
amine@164 970 self.audio_source.set_data(b"abcdefgh")
amine@164 971 block = self.audio_source.read(9999)
amine@164 972 exp = b"abcdefgh"
amine@164 973 self.assertEqual(
amine@164 974 block,
amine@164 975 exp,
amine@164 976 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 977 )
amine@164 978
amine@164 979 def test_sr11_sw4_ch1_set_data_exception(self):
amine@164 980 with self.assertRaises(AudioParameterError) as audio_param_err:
amine@164 981 self.audio_source.set_data(b"abcdef")
amine@164 982 self.assertEqual(
amine@164 983 "The length of audio data must be an integer "
amine@164 984 "multiple of `sample_width * channels`",
amine@164 985 str(audio_param_err.exception),
amine@164 986 )
amine@164 987
amine@164 988 def test_sr11_sw4_ch1_append_data_exception(self):
amine@164 989 with self.assertRaises(AudioParameterError) as audio_param_err:
amine@164 990 self.audio_source.append_data(b"abcdef")
amine@164 991 self.assertEqual(
amine@164 992 "The length of audio data must be an integer "
amine@164 993 "multiple of `sample_width * channels`",
amine@164 994 str(audio_param_err.exception),
amine@164 995 )
amine@164 996
amine@164 997
amine@164 998 class TestBufferAudioSourceCreationException(unittest.TestCase):
amine@164 999 def test_wrong_sample_width_value(self):
amine@164 1000 with self.assertRaises(AudioParameterError) as audio_param_err:
amine@164 1001 _ = BufferAudioSource(
amine@164 1002 data_buffer=b"ABCDEFGHI",
amine@164 1003 sampling_rate=9,
amine@164 1004 sample_width=3,
amine@164 1005 channels=1,
amine@164 1006 )
amine@164 1007 self.assertEqual(
amine@164 1008 "Sample width must be one of: 1, 2 or 4 (bytes)",
amine@164 1009 str(audio_param_err.exception),
amine@164 1010 )
amine@164 1011
amine@164 1012 def test_wrong_data_buffer_size(self):
amine@164 1013 with self.assertRaises(AudioParameterError) as audio_param_err:
amine@164 1014 _ = BufferAudioSource(
amine@164 1015 data_buffer=b"ABCDEFGHI",
amine@164 1016 sampling_rate=8,
amine@164 1017 sample_width=2,
amine@164 1018 channels=1,
amine@164 1019 )
amine@164 1020 self.assertEqual(
amine@164 1021 "The length of audio data must be an integer "
amine@164 1022 "multiple of `sample_width * channels`",
amine@164 1023 str(audio_param_err.exception),
amine@164 1024 )
amine@164 1025
amine@164 1026
amine@164 1027 class TestAudioSourceProperties(unittest.TestCase):
amine@164 1028 def test_read_properties(self):
amine@164 1029 data = b""
amine@164 1030 sampling_rate = 8000
amine@164 1031 sample_width = 2
amine@164 1032 channels = 1
amine@164 1033 a_source = BufferAudioSource(
amine@164 1034 data, sampling_rate, sample_width, channels
amine@164 1035 )
amine@164 1036
amine@164 1037 self.assertEqual(a_source.sampling_rate, sampling_rate)
amine@164 1038 self.assertEqual(a_source.sample_width, sample_width)
amine@164 1039 self.assertEqual(a_source.channels, channels)
amine@164 1040
amine@164 1041 def test_set_readonly_properties_exception(self):
amine@164 1042 data = b""
amine@164 1043 sampling_rate = 8000
amine@164 1044 sample_width = 2
amine@164 1045 channels = 1
amine@164 1046 a_source = BufferAudioSource(
amine@164 1047 data, sampling_rate, sample_width, channels
amine@164 1048 )
amine@164 1049
amine@164 1050 with self.assertRaises(AttributeError):
amine@164 1051 a_source.sampling_rate = 16000
amine@164 1052 a_source.sample_width = 1
amine@164 1053 a_source.channels = 2
amine@164 1054
amine@164 1055
amine@164 1056 class TestAudioSourceShortProperties(unittest.TestCase):
amine@164 1057 def test_read_short_properties(self):
amine@164 1058 data = b""
amine@164 1059 sampling_rate = 8000
amine@164 1060 sample_width = 2
amine@164 1061 channels = 1
amine@164 1062 a_source = BufferAudioSource(
amine@164 1063 data, sampling_rate, sample_width, channels
amine@164 1064 )
amine@164 1065
amine@164 1066 self.assertEqual(a_source.sr, sampling_rate)
amine@164 1067 self.assertEqual(a_source.sw, sample_width)
amine@164 1068 self.assertEqual(a_source.ch, channels)
amine@164 1069
amine@164 1070 def test_set_readonly_short_properties_exception(self):
amine@164 1071 data = b""
amine@164 1072 sampling_rate = 8000
amine@164 1073 sample_width = 2
amine@164 1074 channels = 1
amine@164 1075 a_source = BufferAudioSource(
amine@164 1076 data, sampling_rate, sample_width, channels
amine@164 1077 )
amine@164 1078
amine@164 1079 with self.assertRaises(AttributeError):
amine@164 1080 a_source.sr = 16000
amine@164 1081 a_source.sw = 1
amine@164 1082 a_source.ch = 2
amine@164 1083
amine@164 1084
amine@164 1085 if __name__ == "__main__":
amine@209 1086 unittest.main()