annotate tests/test_AudioSource.py @ 338:f424ac9193b7

Make sure all modules define __all__
author Amine Sehili <amine.sehili@gmail.com>
date Sun, 27 Oct 2019 15:23:00 +0100
parents 8220dfaa03c6
children 323d59b404a2
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 BufferAudioSource,
amine@164 10 RawAudioSource,
amine@164 11 WaveAudioSource,
amine@164 12 )
amine@321 13 from auditok.signal import FORMAT
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@321 62 fmt = 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@321 92 fmt = 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@321 117 data=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@335 192 def test_sr10_sw1_ch1_sampling_rate(self):
amine@335 193 srate = self.audio_source.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@335 200 def test_sr10_sw1_ch1_sample_width(self):
amine@335 201 swidth = self.audio_source.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@335 208 def test_sr10_sw1_ch1_channels(self):
amine@335 209 channels = self.audio_source.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@330 388 def test_sr10_sw1_ch1_initial_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@330 396 def test_sr10_sw1_ch1_position_s_1_after_read(self):
amine@330 397 srate = self.audio_source.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_read_closed(self):
amine@164 445 self.audio_source.close()
amine@164 446 with self.assertRaises(Exception):
amine@164 447 self.audio_source.read(1)
amine@164 448
amine@209 449
amine@169 450 @genty
amine@164 451 class TestBufferAudioSource_SR16_SW2_CH1(unittest.TestCase):
amine@164 452 def setUp(self):
amine@164 453 self.data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
amine@164 454 self.audio_source = BufferAudioSource(
amine@321 455 data=self.data, sampling_rate=16, sample_width=2, channels=1
amine@164 456 )
amine@164 457 self.audio_source.open()
amine@164 458
amine@164 459 def tearDown(self):
amine@164 460 self.audio_source.close()
amine@164 461
amine@164 462 def test_sr16_sw2_ch1_read_1(self):
amine@164 463 block = self.audio_source.read(1)
amine@164 464 exp = b"AB"
amine@164 465 self.assertEqual(
amine@164 466 block,
amine@164 467 exp,
amine@164 468 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 469 )
amine@164 470
amine@164 471 def test_sr16_sw2_ch1_read_6(self):
amine@164 472 block = self.audio_source.read(6)
amine@164 473 exp = b"ABCDEFGHIJKL"
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_multiple(self):
amine@164 481 block = self.audio_source.read(1)
amine@164 482 exp = b"AB"
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 block = self.audio_source.read(6)
amine@164 490 exp = b"CDEFGHIJKLMN"
amine@164 491 self.assertEqual(
amine@164 492 block,
amine@164 493 exp,
amine@164 494 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 495 )
amine@164 496
amine@164 497 block = self.audio_source.read(5)
amine@164 498 exp = b"OPQRSTUVWX"
amine@164 499 self.assertEqual(
amine@164 500 block,
amine@164 501 exp,
amine@164 502 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 503 )
amine@164 504
amine@164 505 block = self.audio_source.read(9999)
amine@164 506 exp = b"YZ012345"
amine@164 507 self.assertEqual(
amine@164 508 block,
amine@164 509 exp,
amine@164 510 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 511 )
amine@164 512
amine@164 513 def test_sr16_sw2_ch1_read_all(self):
amine@164 514 block = self.audio_source.read(9999)
amine@164 515 self.assertEqual(
amine@164 516 block,
amine@164 517 self.data,
amine@164 518 msg="wrong block, expected: {0}, found: {1} ".format(
amine@164 519 self.data, block
amine@164 520 ),
amine@164 521 )
amine@164 522
amine@164 523 block = self.audio_source.read(1)
amine@164 524 self.assertEqual(
amine@164 525 block,
amine@164 526 None,
amine@164 527 msg="wrong block, expected: {0}, found: {1} ".format(None, block),
amine@164 528 )
amine@164 529
amine@335 530 def test_sr16_sw2_ch1_sampling_rate(self):
amine@335 531 srate = self.audio_source.sampling_rate
amine@164 532 self.assertEqual(
amine@164 533 srate,
amine@164 534 16,
amine@164 535 msg="wrong sampling rate, expected: 10, found: {0} ".format(srate),
amine@164 536 )
amine@164 537
amine@335 538 def test_sr16_sw2_ch1_sample_width(self):
amine@335 539 swidth = self.audio_source.sample_width
amine@164 540 self.assertEqual(
amine@164 541 swidth,
amine@164 542 2,
amine@164 543 msg="wrong sample width, expected: 1, found: {0} ".format(swidth),
amine@164 544 )
amine@164 545
amine@335 546 def test_sr16_sw2_ch1_channels(self):
amine@164 547
amine@335 548 channels = self.audio_source.channels
amine@164 549 self.assertEqual(
amine@164 550 channels,
amine@164 551 1,
amine@164 552 msg="wrong number of channels, expected: 1, found: {0} ".format(
amine@164 553 channels
amine@164 554 ),
amine@164 555 )
amine@164 556
amine@169 557 @genty_dataset(
amine@169 558 empty=([], 0, 0, 0),
amine@169 559 zero=([0], 0, 0, 0),
amine@209 560 two=([2], 2, 2 / 16, int(2000 / 16)),
amine@209 561 eleven=([11], 11, 11 / 16, int(11 * 1000 / 16)),
amine@169 562 multiple=([4, 8], 12, 0.75, 750),
amine@169 563 )
amine@169 564 def test_position(
amine@169 565 self, block_sizes, expected_sample, expected_second, expected_ms
amine@169 566 ):
amine@169 567 for block_size in block_sizes:
amine@169 568 self.audio_source.read(block_size)
amine@169 569 position = self.audio_source.position
amine@169 570 self.assertEqual(
amine@169 571 position,
amine@169 572 expected_sample,
amine@169 573 msg="wrong stream position, expected: {}, found: {}".format(
amine@169 574 expected_sample, position
amine@169 575 ),
amine@169 576 )
amine@169 577
amine@169 578 position_s = self.audio_source.position_s
amine@169 579 self.assertEqual(
amine@169 580 position_s,
amine@169 581 expected_second,
amine@169 582 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 583 expected_second, position_s
amine@169 584 ),
amine@169 585 )
amine@169 586
amine@169 587 position_ms = self.audio_source.position_ms
amine@169 588 self.assertEqual(
amine@169 589 position_ms,
amine@169 590 expected_ms,
amine@169 591 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 592 expected_ms, position_ms
amine@169 593 ),
amine@169 594 )
amine@169 595
amine@216 596 def test_sr16_sw2_ch1_read_position_0(self):
amine@169 597 self.audio_source.read(10)
amine@169 598 self.audio_source.position = 0
amine@169 599 pos = self.audio_source.position
amine@164 600 self.assertEqual(
amine@164 601 pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
amine@164 602 )
amine@164 603
amine@169 604 @genty_dataset(
amine@169 605 zero=(0, 0, 0, 0),
amine@209 606 one=(1, 1, 1 / 16, int(1000 / 16)),
amine@209 607 ten=(10, 10, 10 / 16, int(10000 / 16)),
amine@209 608 negative_1=(-1, 15, 15 / 16, int(15000 / 16)),
amine@209 609 negative_2=(-7, 9, 9 / 16, int(9000 / 16)),
amine@169 610 )
amine@169 611 def test_position_setter(
amine@169 612 self, position, expected_sample, expected_second, expected_ms
amine@169 613 ):
amine@169 614 self.audio_source.position = position
amine@169 615
amine@169 616 position = self.audio_source.position
amine@164 617 self.assertEqual(
amine@169 618 position,
amine@169 619 expected_sample,
amine@169 620 msg="wrong stream position, expected: {}, found: {}".format(
amine@169 621 expected_sample, position
amine@169 622 ),
amine@164 623 )
amine@164 624
amine@169 625 position_s = self.audio_source.position_s
amine@164 626 self.assertEqual(
amine@169 627 position_s,
amine@169 628 expected_second,
amine@169 629 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 630 expected_second, position_s
amine@169 631 ),
amine@164 632 )
amine@164 633
amine@169 634 position_ms = self.audio_source.position_ms
amine@164 635 self.assertEqual(
amine@169 636 position_ms,
amine@169 637 expected_ms,
amine@169 638 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 639 expected_ms, position_ms
amine@169 640 ),
amine@164 641 )
amine@164 642
amine@169 643 @genty_dataset(
amine@169 644 zero=(0, 0, 0, 0),
amine@209 645 one=(0.1, 1, 1 / 16, int(1000 / 16)),
amine@209 646 two=(1 / 8, 2, 1 / 8, int(1 / 8 * 1000)),
amine@209 647 twelve=(0.75, 12, 0.75, 750),
amine@209 648 negative_1=(-0.1, 15, 15 / 16, int(15000 / 16)),
amine@209 649 negative_2=(-0.7, 5, 5 / 16, int(5000 / 16)),
amine@169 650 )
amine@169 651 def test_position_s_setter(
amine@169 652 self, position_s, expected_sample, expected_second, expected_ms
amine@169 653 ):
amine@169 654 self.audio_source.position_s = position_s
amine@169 655
amine@169 656 position = self.audio_source.position
amine@164 657 self.assertEqual(
amine@169 658 position,
amine@169 659 expected_sample,
amine@169 660 msg="wrong stream position, expected: {}, found: {}".format(
amine@169 661 expected_sample, position
amine@169 662 ),
amine@164 663 )
amine@164 664
amine@169 665 position_s = self.audio_source.position_s
amine@164 666 self.assertEqual(
amine@169 667 position_s,
amine@169 668 expected_second,
amine@169 669 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 670 expected_second, position_s
amine@169 671 ),
amine@164 672 )
amine@164 673
amine@169 674 position_ms = self.audio_source.position_ms
amine@164 675 self.assertEqual(
amine@169 676 position_ms,
amine@169 677 expected_ms,
amine@169 678 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 679 expected_ms, position_ms
amine@169 680 ),
amine@164 681 )
amine@164 682
amine@169 683 @genty_dataset(
amine@169 684 zero=(0, 0, 0, 0),
amine@209 685 one=(100, 1, 1 / 16, int(1000 / 16)),
amine@169 686 ten=(1000, 16, 1, 1000),
amine@209 687 negative_1=(-100, 15, 15 / 16, int(15 * 1000 / 16)),
amine@169 688 negative_2=(-500, 8, 0.5, 500),
amine@209 689 negative_3=(-700, 5, 5 / 16, int(5 * 1000 / 16)),
amine@169 690 )
amine@169 691 def test_position_ms_setter(
amine@169 692 self, position_ms, expected_sample, expected_second, expected_ms
amine@169 693 ):
amine@169 694 self.audio_source.position_ms = position_ms
amine@169 695
amine@169 696 position = self.audio_source.position
amine@164 697 self.assertEqual(
amine@169 698 position,
amine@169 699 expected_sample,
amine@169 700 msg="wrong stream position, expected: {}, found: {}".format(
amine@169 701 expected_sample, position
amine@169 702 ),
amine@164 703 )
amine@164 704
amine@169 705 position_s = self.audio_source.position_s
amine@164 706 self.assertEqual(
amine@169 707 position_s,
amine@169 708 expected_second,
amine@169 709 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 710 expected_second, position_s
amine@169 711 ),
amine@164 712 )
amine@164 713
amine@169 714 position_ms = self.audio_source.position_ms
amine@164 715 self.assertEqual(
amine@169 716 position_ms,
amine@169 717 expected_ms,
amine@169 718 msg="wrong stream position_s, expected: {}, found: {}".format(
amine@169 719 expected_ms, position_ms
amine@169 720 ),
amine@164 721 )
amine@164 722
amine@164 723 def test_sr16_sw2_ch1_rewind(self):
amine@164 724 self.audio_source.read(10)
amine@164 725 self.audio_source.rewind()
amine@216 726 tp = self.audio_source.position
amine@164 727 self.assertEqual(
amine@164 728 tp, 0, msg="wrong position, expected: 0.0, found: {0} ".format(tp)
amine@164 729 )
amine@164 730
amine@164 731
amine@164 732 class TestBufferAudioSource_SR11_SW4_CH1(unittest.TestCase):
amine@164 733 def setUp(self):
amine@164 734 self.data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefgh"
amine@164 735 self.audio_source = BufferAudioSource(
amine@321 736 data=self.data, sampling_rate=11, sample_width=4, channels=1
amine@164 737 )
amine@164 738 self.audio_source.open()
amine@164 739
amine@164 740 def tearDown(self):
amine@164 741 self.audio_source.close()
amine@164 742
amine@164 743 def test_sr11_sw4_ch1_read_1(self):
amine@164 744 block = self.audio_source.read(1)
amine@164 745 exp = b"ABCD"
amine@164 746 self.assertEqual(
amine@164 747 block,
amine@164 748 exp,
amine@164 749 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 750 )
amine@164 751
amine@164 752 def test_sr11_sw4_ch1_read_6(self):
amine@164 753 block = self.audio_source.read(6)
amine@164 754 exp = b"ABCDEFGHIJKLMNOPQRSTUVWX"
amine@164 755 self.assertEqual(
amine@164 756 block,
amine@164 757 exp,
amine@164 758 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 759 )
amine@164 760
amine@164 761 def test_sr11_sw4_ch1_read_multiple(self):
amine@164 762 block = self.audio_source.read(1)
amine@164 763 exp = b"ABCD"
amine@164 764 self.assertEqual(
amine@164 765 block,
amine@164 766 exp,
amine@164 767 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 768 )
amine@164 769
amine@164 770 block = self.audio_source.read(6)
amine@164 771 exp = b"EFGHIJKLMNOPQRSTUVWXYZ01"
amine@164 772 self.assertEqual(
amine@164 773 block,
amine@164 774 exp,
amine@164 775 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 776 )
amine@164 777
amine@164 778 block = self.audio_source.read(3)
amine@164 779 exp = b"23456789abcd"
amine@164 780 self.assertEqual(
amine@164 781 block,
amine@164 782 exp,
amine@164 783 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 784 )
amine@164 785
amine@164 786 block = self.audio_source.read(9999)
amine@164 787 exp = b"efgh"
amine@164 788 self.assertEqual(
amine@164 789 block,
amine@164 790 exp,
amine@164 791 msg="wrong block, expected: {}, found: {} ".format(exp, block),
amine@164 792 )
amine@164 793
amine@164 794 def test_sr11_sw4_ch1_read_all(self):
amine@164 795 block = self.audio_source.read(9999)
amine@164 796 self.assertEqual(
amine@164 797 block,
amine@164 798 self.data,
amine@164 799 msg="wrong block, expected: {0}, found: {1} ".format(
amine@164 800 self.data, block
amine@164 801 ),
amine@164 802 )
amine@164 803
amine@164 804 block = self.audio_source.read(1)
amine@164 805 self.assertEqual(
amine@164 806 block,
amine@164 807 None,
amine@164 808 msg="wrong block, expected: {0}, found: {1} ".format(None, block),
amine@164 809 )
amine@164 810
amine@335 811 def test_sr11_sw4_ch1_sampling_rate(self):
amine@335 812 srate = self.audio_source.sampling_rate
amine@164 813 self.assertEqual(
amine@164 814 srate,
amine@164 815 11,
amine@164 816 msg="wrong sampling rate, expected: 10, found: {0} ".format(srate),
amine@164 817 )
amine@164 818
amine@335 819 def test_sr11_sw4_ch1_sample_width(self):
amine@335 820 swidth = self.audio_source.sample_width
amine@164 821 self.assertEqual(
amine@164 822 swidth,
amine@164 823 4,
amine@164 824 msg="wrong sample width, expected: 1, found: {0} ".format(swidth),
amine@164 825 )
amine@164 826
amine@335 827 def test_sr11_sw4_ch1_channels(self):
amine@335 828 channels = self.audio_source.channels
amine@164 829 self.assertEqual(
amine@164 830 channels,
amine@164 831 1,
amine@164 832 msg="wrong number of channels, expected: 1, found: {0} ".format(
amine@164 833 channels
amine@164 834 ),
amine@164 835 )
amine@164 836
amine@330 837 def test_sr11_sw4_ch1_intial_position_0(self):
amine@216 838 pos = self.audio_source.position
amine@164 839 self.assertEqual(
amine@164 840 pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
amine@164 841 )
amine@164 842
amine@216 843 def test_sr11_sw4_ch1_position_5(self):
amine@164 844 self.audio_source.read(5)
amine@216 845 pos = self.audio_source.position
amine@164 846 self.assertEqual(
amine@164 847 pos, 5, msg="wrong position, expected: 5, found: {0} ".format(pos)
amine@164 848 )
amine@164 849
amine@216 850 def test_sr11_sw4_ch1_position_9(self):
amine@164 851 self.audio_source.read(5)
amine@164 852 self.audio_source.read(4)
amine@216 853 pos = self.audio_source.position
amine@164 854 self.assertEqual(
amine@164 855 pos, 9, msg="wrong position, expected: 5, found: {0} ".format(pos)
amine@164 856 )
amine@164 857
amine@216 858 def test_sr11_sw4_ch1_position_0(self):
amine@164 859 self.audio_source.read(10)
amine@216 860 self.audio_source.position = 0
amine@216 861 pos = self.audio_source.position
amine@164 862 self.assertEqual(
amine@164 863 pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
amine@164 864 )
amine@164 865
amine@216 866 def test_sr11_sw4_ch1_position_10(self):
amine@216 867 self.audio_source.position = 10
amine@216 868 pos = self.audio_source.position
amine@164 869 self.assertEqual(
amine@164 870 pos,
amine@164 871 10,
amine@164 872 msg="wrong position, expected: 10, found: {0} ".format(pos),
amine@164 873 )
amine@164 874
amine@330 875 def test_sr11_sw4_ch1_initial_position_s_0(self):
amine@216 876 tp = self.audio_source.position_s
amine@164 877 self.assertEqual(
amine@164 878 tp,
amine@164 879 0.0,
amine@164 880 msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
amine@164 881 )
amine@164 882
amine@330 883 def test_sr11_sw4_ch1_position_s_1_after_read(self):
amine@330 884 srate = self.audio_source.sampling_rate
amine@164 885 # read one second
amine@164 886 self.audio_source.read(srate)
amine@216 887 tp = self.audio_source.position_s
amine@164 888 self.assertEqual(
amine@164 889 tp,
amine@164 890 1.0,
amine@164 891 msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
amine@164 892 )
amine@164 893
amine@216 894 def test_sr11_sw4_ch1_position_s_0_63(self):
amine@164 895 # read 2.5 seconds
amine@164 896 self.audio_source.read(7)
amine@216 897 tp = self.audio_source.position_s
amine@164 898 self.assertAlmostEqual(
amine@164 899 tp,
amine@164 900 0.636363636364,
amine@164 901 msg="wrong time position, expected: 0.636363636364, "
amine@164 902 "found: {0} ".format(tp),
amine@164 903 )
amine@164 904
amine@216 905 def test_sr11_sw4_ch1_position_s_0(self):
amine@164 906 self.audio_source.read(10)
amine@216 907 self.audio_source.position_s = 0
amine@216 908 tp = self.audio_source.position_s
amine@164 909 self.assertEqual(
amine@164 910 tp,
amine@164 911 0.0,
amine@164 912 msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
amine@164 913 )
amine@164 914
amine@216 915 def test_sr11_sw4_ch1_position_s_1(self):
amine@216 916 self.audio_source.position_s = 1
amine@216 917 tp = self.audio_source.position_s
amine@164 918 self.assertEqual(
amine@164 919 tp,
amine@164 920 1.0,
amine@164 921 msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
amine@164 922 )
amine@164 923
amine@164 924 def test_sr11_sw4_ch1_rewind(self):
amine@164 925 self.audio_source.read(10)
amine@164 926 self.audio_source.rewind()
amine@169 927 tp = self.audio_source.position
amine@164 928 self.assertEqual(
amine@164 929 tp, 0, msg="wrong position, expected: 0.0, found: {0} ".format(tp)
amine@164 930 )
amine@164 931
amine@164 932
amine@164 933 class TestBufferAudioSourceCreationException(unittest.TestCase):
amine@164 934 def test_wrong_sample_width_value(self):
amine@164 935 with self.assertRaises(AudioParameterError) as audio_param_err:
amine@164 936 _ = BufferAudioSource(
amine@321 937 data=b"ABCDEFGHI", sampling_rate=9, sample_width=3, channels=1
amine@164 938 )
amine@164 939 self.assertEqual(
amine@164 940 "Sample width must be one of: 1, 2 or 4 (bytes)",
amine@164 941 str(audio_param_err.exception),
amine@164 942 )
amine@164 943
amine@164 944 def test_wrong_data_buffer_size(self):
amine@164 945 with self.assertRaises(AudioParameterError) as audio_param_err:
amine@164 946 _ = BufferAudioSource(
amine@321 947 data=b"ABCDEFGHI", sampling_rate=8, sample_width=2, channels=1
amine@164 948 )
amine@164 949 self.assertEqual(
amine@164 950 "The length of audio data must be an integer "
amine@164 951 "multiple of `sample_width * channels`",
amine@164 952 str(audio_param_err.exception),
amine@164 953 )
amine@164 954
amine@164 955
amine@164 956 class TestAudioSourceProperties(unittest.TestCase):
amine@164 957 def test_read_properties(self):
amine@164 958 data = b""
amine@164 959 sampling_rate = 8000
amine@164 960 sample_width = 2
amine@164 961 channels = 1
amine@164 962 a_source = BufferAudioSource(
amine@164 963 data, sampling_rate, sample_width, channels
amine@164 964 )
amine@164 965
amine@164 966 self.assertEqual(a_source.sampling_rate, sampling_rate)
amine@164 967 self.assertEqual(a_source.sample_width, sample_width)
amine@164 968 self.assertEqual(a_source.channels, channels)
amine@164 969
amine@164 970 def test_set_readonly_properties_exception(self):
amine@164 971 data = b""
amine@164 972 sampling_rate = 8000
amine@164 973 sample_width = 2
amine@164 974 channels = 1
amine@164 975 a_source = BufferAudioSource(
amine@164 976 data, sampling_rate, sample_width, channels
amine@164 977 )
amine@164 978
amine@164 979 with self.assertRaises(AttributeError):
amine@164 980 a_source.sampling_rate = 16000
amine@164 981 a_source.sample_width = 1
amine@164 982 a_source.channels = 2
amine@164 983
amine@164 984
amine@164 985 class TestAudioSourceShortProperties(unittest.TestCase):
amine@164 986 def test_read_short_properties(self):
amine@164 987 data = b""
amine@164 988 sampling_rate = 8000
amine@164 989 sample_width = 2
amine@164 990 channels = 1
amine@164 991 a_source = BufferAudioSource(
amine@164 992 data, sampling_rate, sample_width, channels
amine@164 993 )
amine@164 994
amine@164 995 self.assertEqual(a_source.sr, sampling_rate)
amine@164 996 self.assertEqual(a_source.sw, sample_width)
amine@164 997 self.assertEqual(a_source.ch, channels)
amine@164 998
amine@164 999 def test_set_readonly_short_properties_exception(self):
amine@164 1000 data = b""
amine@164 1001 sampling_rate = 8000
amine@164 1002 sample_width = 2
amine@164 1003 channels = 1
amine@164 1004 a_source = BufferAudioSource(
amine@164 1005 data, sampling_rate, sample_width, channels
amine@164 1006 )
amine@164 1007
amine@164 1008 with self.assertRaises(AttributeError):
amine@164 1009 a_source.sr = 16000
amine@164 1010 a_source.sw = 1
amine@164 1011 a_source.ch = 2
amine@164 1012
amine@164 1013
amine@164 1014 if __name__ == "__main__":
amine@209 1015 unittest.main()