Mercurial > hg > auditok
changeset 194:89872ec2e30d
Add tests for AudioRegion slicing
author | Amine Sehili <amine.sehili@gmail.com> |
---|---|
date | Wed, 01 May 2019 20:36:55 +0100 |
parents | b274a22c9685 |
children | 3aa8632d5cca |
files | auditok/core.py tests/test_core.py |
diffstat | 2 files changed, 126 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/auditok/core.py Tue Apr 23 18:37:22 2019 +0100 +++ b/auditok/core.py Wed May 01 20:36:55 2019 +0100 @@ -414,9 +414,9 @@ raise TypeError("Slicing Audioregion requires integers") if start_ms < 0: - start_ms += len(self) + start_ms = max(start_ms + len(self), 0) if stop_ms < 0: - stop_ms += len(self) + stop_ms = max(stop_ms + len(self), 0) samples_per_ms = self.sr / 1000 bytes_per_ms = samples_per_ms * self.sw * self.channels @@ -427,7 +427,7 @@ actual_start_s = onset / bytes_per_ms / 1000 new_start = ( self.start + actual_start_s - ) # TODO deal with negative indices + ) data = self._data[onset:offset] return AudioRegion(data, new_start, self.sr, self.sw, self.ch)
--- a/tests/test_core.py Tue Apr 23 18:37:22 2019 +0100 +++ b/tests/test_core.py Wed May 01 20:36:55 2019 +0100 @@ -248,6 +248,129 @@ region.save(filename, exists_ok=False) @genty_dataset( + first_half=( + AudioRegion(b"a" * 80 + b"b" * 80, 0, 160, 1, 1), + slice(0, 500), + 0, + b"a" * 80, + ), + second_half=( + AudioRegion(b"a" * 80 + b"b" * 80, 0, 160, 1, 1), + slice(500, None), + 0.5, + b"b" * 80, + ), + second_half_negative=( + AudioRegion(b"a" * 80 + b"b" * 80, 0, 160, 1, 1), + slice(-500, None), + 0.5, + b"b" * 80, + ), + middle=( + AudioRegion(b"a" * 80 + b"b" * 80, 0, 160, 1, 1), + slice(200, 750), + 0.2, + b"a" * 48 + b"b" * 40, + ), + middle_negative=( + AudioRegion(b"a" * 80 + b"b" * 80, 0, 160, 1, 1), + slice(-800, -250), + 0.2, + b"a" * 48 + b"b" * 40, + ), + middle_sw2=( + AudioRegion(b"a" * 160 + b"b" * 160, 0, 160, 2, 1), + slice(200, 750), + 0.2, + b"a" * 96 + b"b" * 80, + ), + middle_ch2=( + AudioRegion(b"a" * 160 + b"b" * 160, 0, 160, 1, 2), + slice(200, 750), + 0.2, + b"a" * 96 + b"b" * 80, + ), + middle_sw2_ch2=( + AudioRegion(b"a" * 320 + b"b" * 320, 0, 160, 2, 2), + slice(200, 750), + 0.2, + b"a" * 192 + b"b" * 160, + ), + but_first_sample=( + AudioRegion(b"a" * 4000 + b"b" * 4000, 0, 8000, 1, 1), + slice(1, None), + 0.001, + b"a" * (4000 - 8) + b"b" * 4000, + ), + but_first_sample_negative=( + AudioRegion(b"a" * 4000 + b"b" * 4000, 0, 8000, 1, 1), + slice(-999, None), + 0.001, + b"a" * (4000 - 8) + b"b" * 4000, + ), + but_last_sample=( + AudioRegion(b"a" * 4000 + b"b" * 4000, 0, 8000, 1, 1), + slice(0, 999), + 0, + b"a" * 4000 + b"b" * (4000 - 8), + ), + but_last_sample_negative=( + AudioRegion(b"a" * 4000 + b"b" * 4000, 0, 8000, 1, 1), + slice(0, -1), + 0, + b"a" * 4000 + b"b" * (4000 - 8), + ), + big_negative_start=( + AudioRegion(b"a" * 160, 0, 160, 1, 1), + slice(-5000, None), + 0, + b"a" * 160, + ), + big_negative_stop=( + AudioRegion(b"a" * 160, 0, 160, 1, 1), + slice(None, -1500), + 0, + b"", + ), + empty=( + AudioRegion(b"a" * 80 + b"b" * 80, 0, 160, 1, 1), + slice(0, 0), + 0, + b"", + ), + empty_start_stop_reversed=( + AudioRegion(b"a" * 80 + b"b" * 80, 0, 160, 1, 1), + slice(200, 100), + 0.2, + b"", + ), + empty_big_positive_start=( + AudioRegion(b"a" * 80 + b"b" * 80, 0, 160, 1, 1), + slice(2000, 3000), + 2, + b"", + ), + empty_negative_reversed=( + AudioRegion(b"a" * 80 + b"b" * 80, 0, 160, 1, 1), + slice(-100, -200), + 0.9, + b"", + ), + empty_big_negative_stop=( + AudioRegion(b"a" * 80 + b"b" * 80, 0, 160, 1, 1), + slice(0, -2000), + 0, + b"", + ), + ) + def test_region_slicing( + self, region, slice_, expected_start, expected_data + ): + sub_region = region[slice_] + self.assertEqual(sub_region.start, expected_start) + self.assertEqual(bytes(sub_region), expected_data) + + @genty_dataset( simple=(8000, 1, 1), stereo_sw_2=(8000, 2, 2), arbitray_sr_multichannel=(5413, 2, 3), @@ -293,8 +416,6 @@ concat_region.duration, expected_duration, places=6 ) self.assertEqual(bytes(concat_region), expected_data) - # see test_concatenation - self.assertEqual(len(concat_region), round(expected_duration * 1000)) def test_concatenation_different_sampling_rate_error(self):