changeset 357:96adb05e3a07

Add tests for make_channel_selector
author Amine Sehili <amine.sehili@gmail.com>
date Wed, 01 Apr 2020 21:31:06 +0200
parents c8cfe01ec9f5
children 379e36e4fe88
files tests/test_util.py
diffstat 1 files changed, 72 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/tests/test_util.py	Wed Apr 01 20:21:47 2020 +0200
+++ b/tests/test_util.py	Wed Apr 01 21:31:06 2020 +0200
@@ -1,10 +1,17 @@
 import unittest
 from unittest import TestCase
+from unittest.mock import patch
 import math
-from array import array
+from array import array as array_
 from genty import genty, genty_dataset
-from auditok.util import AudioEnergyValidator, make_duration_formatter
-from auditok.signal import FORMAT
+from auditok.util import (
+    AudioEnergyValidator,
+    make_duration_formatter,
+    make_channel_selector,
+)
+from auditok import signal as signal_
+from auditok import signal_numpy
+
 from auditok.exceptions import TimeFormatError
 
 
@@ -15,7 +22,7 @@
     generator can be used to build a multichannel audio buffer.
     >>> gen = _sample_generator("abcd", "ABCD")
     >>> list(gen)
-    ["a", "A", "b", "B", "c", "C", "d", "D"]
+    ["a", "A", 1, 1, "c", "C", "d", "D"]
     """
     frame_gen = zip(*data_buffers)
     return (sample for frame in frame_gen for sample in frame)
@@ -31,11 +38,11 @@
     max_value = (2 ** (sample_width * 8) // 2) - 1
     if volume > max_value:
         volume = max_value
-    fmt = FORMAT[sample_width]
+    fmt = signal_.FORMAT[sample_width]
     total_samples = int(sampling_rate * duration_sec)
     step = frequency / sampling_rate
     two_pi_step = 2 * math.pi * step
-    data = array(
+    data = array_(
         fmt,
         (
             int(math.sin(two_pi_step * i) * volume)
@@ -58,6 +65,9 @@
 
 @genty
 class TestFunctions(TestCase):
+    def setUp(self):
+        self.data = b"012345679ABC"
+
     @genty_dataset(
         only_seconds=("%S", 5400, "5400.000"),
         only_millis=("%I", 5400, "5400000"),
@@ -90,6 +100,61 @@
         with self.assertRaises(TimeFormatError):
             make_duration_formatter(fmt)
 
+    @genty_dataset(
+        int8_1channel_select_0=(
+            1,
+            1,
+            0,
+            [48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67],
+        ),
+        int8_2channel_select_0=(1, 2, 0, [48, 50, 52, 54, 57, 66]),
+        int8_3channel_select_0=(1, 3, 0, [48, 51, 54, 65]),
+        int8_3channel_select_1=(1, 3, 1, [49, 52, 55, 66]),
+        int8_3channel_select_2=(1, 3, 2, [50, 53, 57, 67]),
+        int8_4channel_select_0=(1, 4, 0, [48, 52, 57]),
+        int16_1channel_select_0=(
+            2,
+            1,
+            0,
+            [12592, 13106, 13620, 14134, 16697, 17218],
+        ),
+        int16_2channel_select_0=(2, 2, 0, [12592, 13620, 16697]),
+        int16_2channel_select_1=(2, 2, 1, [13106, 14134, 17218]),
+        int16_3channel_select_0=(2, 3, 0, [12592, 14134]),
+        int16_3channel_select_1=(2, 3, 1, [13106, 16697]),
+        int16_3channel_select_2=(2, 3, 2, [13620, 17218]),
+        int32_1channel_select_0=(4, 1, 0, [858927408, 926299444, 1128415545],),
+        int32_3channel_select_0=(4, 3, 0, [858927408]),
+        int32_3channel_select_1=(4, 3, 1, [926299444]),
+        int32_3channel_select_2=(4, 3, 2, [1128415545]),
+    )
+    def test_make_channel_selector_one_channel(
+        self, sample_width, channels, selected, expected
+    ):
+
+        # force using signal functions with standard python implementation
+        with patch("auditok.util.signal", signal_):
+            selector = make_channel_selector(sample_width, channels, selected)
+            result = selector(self.data)
+
+        fmt = signal_.FORMAT[sample_width]
+        expected = array_(fmt, expected)
+        if channels == 1:
+            expected = bytes(expected)
+        self.assertEqual(result, expected)
+
+        # Use signal functions with numpy implementation
+        with patch("auditok.util.signal", signal_numpy):
+            selector = make_channel_selector(sample_width, channels, selected)
+            resutl_numpy = selector(self.data)
+
+        expected = array_(fmt, expected)
+        if channels == 1:
+            expected = bytes(expected)
+            self.assertEqual(resutl_numpy, expected)
+        else:
+            self.assertTrue(all(resutl_numpy == expected))
+
 
 @genty
 class TestAudioEnergyValidator(TestCase):
@@ -124,7 +189,7 @@
         self, data, channels, use_channel, expected
     ):
 
-        data = array("h", data)
+        data = array_("h", data)
         sample_width = 2
         energy_threshold = 50
         validator = AudioEnergyValidator(