annotate tests/test_AudioSource.py @ 297:7259b1eb9329

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