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):