annotate tests/test_AudioSource.py @ 168:1fa7fa2857d4

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