changeset 164:80820182921a

Rename test_audio_source.py as test_AudioSource.py
author Amine Sehili <amine.sehili@gmail.com>
date Sun, 03 Mar 2019 08:40:50 +0100
parents 3ddaa5eda8d4
children 8591a92127de
files tests/test_AudioSource.py tests/test_audio_source.py
diffstat 2 files changed, 887 insertions(+), 887 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test_AudioSource.py	Sun Mar 03 08:40:50 2019 +0100
@@ -0,0 +1,887 @@
+"""
+@author: Amine Sehili <amine.sehili@gmail.com>
+"""
+from array import array
+import unittest
+from genty import genty, genty_dataset
+from auditok.io import (
+    AudioParameterError,
+    _array_to_bytes,
+    DATA_FORMAT,
+    BufferAudioSource,
+    RawAudioSource,
+    WaveAudioSource,
+)
+from test_util import PURE_TONE_DICT
+
+
+def audio_source_read_all_gen(audio_source, size=None):
+    if size is None:
+        size = int(audio_source.sr * 0.1)  # 100ms
+    while True:
+        data = audio_source.read(size)
+        if data is None:
+            break
+        yield data
+
+
+@genty
+class TestAudioSource(unittest.TestCase):
+
+    # TODO when use_channel is None, return samples from all channels
+
+    @genty_dataset(
+        mono_default=("mono_400Hz", 1, None, 400),
+        mono_mix=("mono_400Hz", 1, "mix", 400),
+        mono_channel_selection=("mono_400Hz", 1, 2, 400),
+        multichannel_default=("3channel_400-800-1600Hz", 3, None, 400),
+        multichannel_channel_selection=("3channel_400-800-1600Hz", 3, 1, 800),
+    )
+    def test_RawAudioSource(
+        self, file_suffix, channels, use_channel, frequency
+    ):
+        file = "tests/data/test_16KHZ_{}.raw".format(file_suffix)
+        audio_source = RawAudioSource(file, 16000, 2, channels, use_channel)
+        audio_source.open()
+        data = b"".join(audio_source_read_all_gen(audio_source))
+        audio_source.close()
+        expected = _array_to_bytes(PURE_TONE_DICT[frequency])
+        self.assertEqual(data, expected)
+
+    def test_RawAudioSource_mix(self):
+        file = "tests/data/test_16KHZ_3channel_400-800-1600Hz.raw"
+        audio_source = RawAudioSource(file, 16000, 2, 3, use_channel="mix")
+        audio_source.open()
+        data = b"".join(audio_source_read_all_gen(audio_source))
+        audio_source.close()
+
+        mono_channels = [PURE_TONE_DICT[freq] for freq in [400, 800, 1600]]
+        fmt = DATA_FORMAT[2]
+        expected = _array_to_bytes(
+            array(fmt, (sum(samples) // 3 for samples in zip(*mono_channels)))
+        )
+        expected = expected
+        self.assertEqual(data, expected)
+
+    @genty_dataset(
+        mono_default=("mono_400Hz", 1, None, 400),
+        mono_mix=("mono_400Hz", 1, "mix", 400),
+        mono_channel_selection=("mono_400Hz", 1, 2, 400),
+        multichannel_default=("3channel_400-800-1600Hz", 3, None, 400),
+        multichannel_channel_selection=("3channel_400-800-1600Hz", 3, 1, 800),
+    )
+    def test_WaveAudioSource(
+        self, file_suffix, channels, use_channel, frequency
+    ):
+        file = "tests/data/test_16KHZ_{}.wav".format(file_suffix)
+        audio_source = WaveAudioSource(file, use_channel)
+        audio_source.open()
+        data = b"".join(audio_source_read_all_gen(audio_source))
+        audio_source.close()
+        expected = _array_to_bytes(PURE_TONE_DICT[frequency])
+        self.assertEqual(data, expected)
+
+    def test_WaveAudioSource_mix(self):
+        file = "tests/data/test_16KHZ_3channel_400-800-1600Hz.wav"
+        audio_source = WaveAudioSource(file, use_channel="mix")
+        audio_source.open()
+        data = b"".join(audio_source_read_all_gen(audio_source))
+        audio_source.close()
+
+        mono_channels = [PURE_TONE_DICT[freq] for freq in [400, 800, 1600]]
+        fmt = DATA_FORMAT[2]
+        expected = _array_to_bytes(
+            array(fmt, (sum(samples) // 3 for samples in zip(*mono_channels)))
+        )
+        self.assertEqual(data, expected)
+
+
+class TestBufferAudioSource_SR10_SW1_CH1(unittest.TestCase):
+    def setUp(self):
+        self.data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
+        self.audio_source = BufferAudioSource(
+            data_buffer=self.data, sampling_rate=10, sample_width=1, channels=1
+        )
+        self.audio_source.open()
+
+    def tearDown(self):
+        self.audio_source.close()
+
+    def test_sr10_sw1_ch1_read_1(self):
+        block = self.audio_source.read(1)
+        exp = b"A"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+    def test_sr10_sw1_ch1_read_6(self):
+        block = self.audio_source.read(6)
+        exp = b"ABCDEF"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+    def test_sr10_sw1_ch1_read_multiple(self):
+        block = self.audio_source.read(1)
+        exp = b"A"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+        block = self.audio_source.read(6)
+        exp = b"BCDEFG"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+        block = self.audio_source.read(13)
+        exp = b"HIJKLMNOPQRST"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+        block = self.audio_source.read(9999)
+        exp = b"UVWXYZ012345"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+    def test_sr10_sw1_ch1_read_all(self):
+        block = self.audio_source.read(9999)
+        self.assertEqual(
+            block,
+            self.data,
+            msg="wrong block, expected: {}, found: {} ".format(
+                self.data, block
+            ),
+        )
+
+        block = self.audio_source.read(1)
+        self.assertEqual(
+            block,
+            None,
+            msg="wrong block, expected: {}, found: {} ".format(None, block),
+        )
+
+    def test_sr10_sw1_ch1_get_sampling_rate(self):
+        srate = self.audio_source.get_sampling_rate()
+        self.assertEqual(
+            srate,
+            10,
+            msg="wrong sampling rate, expected: 10, found: {0} ".format(srate),
+        )
+
+    def test_sr10_sw1_ch1_get_sample_width(self):
+        swidth = self.audio_source.get_sample_width()
+        self.assertEqual(
+            swidth,
+            1,
+            msg="wrong sample width, expected: 1, found: {0} ".format(swidth),
+        )
+
+    def test_sr10_sw1_ch1_get_channels(self):
+        channels = self.audio_source.get_channels()
+        self.assertEqual(
+            channels,
+            1,
+            msg="wrong number of channels, expected: 1, found: {0} ".format(
+                channels
+            ),
+        )
+
+    def test_sr10_sw1_ch1_get_position_0(self):
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
+        )
+
+    def test_sr10_sw1_ch1_get_position_5(self):
+        self.audio_source.read(5)
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 5, msg="wrong position, expected: 5, found: {0} ".format(pos)
+        )
+
+    def test_sr10_sw1_ch1_get_position_25(self):
+        self.audio_source.read(5)
+        self.audio_source.read(20)
+
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 25, msg="wrong position, expected: 5, found: {0} ".format(pos)
+        )
+
+    def test_sr10_sw1_ch1_set_position_0(self):
+        self.audio_source.read(10)
+        self.audio_source.set_position(0)
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
+        )
+
+    def test_sr10_sw1_ch1_set_position_10(self):
+        self.audio_source.set_position(10)
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos,
+            10,
+            msg="wrong position, expected: 10, found: {0} ".format(pos),
+        )
+
+    def test_sr10_sw1_ch1_get_time_position_0(self):
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            0.0,
+            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
+        )
+
+    def test_sr10_sw1_ch1_get_time_position_1(self):
+        srate = self.audio_source.get_sampling_rate()
+        # read one second
+        self.audio_source.read(srate)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            1.0,
+            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
+        )
+
+    def test_sr10_sw1_ch1_get_time_position_2_5(self):
+        # read 2.5 seconds
+        self.audio_source.read(25)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            2.5,
+            msg="wrong time position, expected: 2.5, found: {0} ".format(tp),
+        )
+
+    def test_sr10_sw1_ch1_set_time_position_0(self):
+        self.audio_source.read(10)
+        self.audio_source.set_time_position(0)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            0.0,
+            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
+        )
+
+    def test_sr10_sw1_ch1_set_time_position_1(self):
+        self.audio_source.set_time_position(1)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            1.0,
+            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
+        )
+
+    def test_sr10_sw1_ch1_set_time_position_end(self):
+        self.audio_source.set_time_position(100)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            3.2,
+            msg="wrong time position, expected: 3.2, found: {0} ".format(tp),
+        )
+
+    def test_sr10_sw1_ch1_rewind(self):
+        self.audio_source.read(10)
+        self.audio_source.rewind()
+        tp = self.audio_source.get_position()
+        self.assertEqual(
+            tp, 0, msg="wrong position, expected: 0.0, found: {0} ".format(tp)
+        )
+
+    def test_sr10_sw1_ch1_set_data(self):
+        self.audio_source.set_data(b"12345")
+        block = self.audio_source.read(9999)
+        self.assertEqual(
+            block,
+            b"12345",
+            msg="wrong block, expected: '12345', found: {0} ".format(block),
+        )
+
+    def test_sr10_sw1_ch1_read_closed(self):
+        self.audio_source.close()
+        with self.assertRaises(Exception):
+            self.audio_source.read(1)
+
+
+class TestBufferAudioSource_SR16_SW2_CH1(unittest.TestCase):
+    def setUp(self):
+        self.data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
+        self.audio_source = BufferAudioSource(
+            data_buffer=self.data, sampling_rate=16, sample_width=2, channels=1
+        )
+        self.audio_source.open()
+
+    def tearDown(self):
+        self.audio_source.close()
+
+    def test_sr16_sw2_ch1_read_1(self):
+        block = self.audio_source.read(1)
+        exp = b"AB"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+    def test_sr16_sw2_ch1_read_6(self):
+        block = self.audio_source.read(6)
+        exp = b"ABCDEFGHIJKL"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+    def test_sr16_sw2_ch1_read_multiple(self):
+        block = self.audio_source.read(1)
+        exp = b"AB"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+        block = self.audio_source.read(6)
+        exp = b"CDEFGHIJKLMN"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+        block = self.audio_source.read(5)
+        exp = b"OPQRSTUVWX"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+        block = self.audio_source.read(9999)
+        exp = b"YZ012345"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+    def test_sr16_sw2_ch1_read_all(self):
+        block = self.audio_source.read(9999)
+        self.assertEqual(
+            block,
+            self.data,
+            msg="wrong block, expected: {0}, found: {1} ".format(
+                self.data, block
+            ),
+        )
+
+        block = self.audio_source.read(1)
+        self.assertEqual(
+            block,
+            None,
+            msg="wrong block, expected: {0}, found: {1} ".format(None, block),
+        )
+
+    def test_sr16_sw2_ch1_get_sampling_rate(self):
+        srate = self.audio_source.get_sampling_rate()
+        self.assertEqual(
+            srate,
+            16,
+            msg="wrong sampling rate, expected: 10, found: {0} ".format(srate),
+        )
+
+    def test_sr16_sw2_ch1_get_sample_width(self):
+        swidth = self.audio_source.get_sample_width()
+        self.assertEqual(
+            swidth,
+            2,
+            msg="wrong sample width, expected: 1, found: {0} ".format(swidth),
+        )
+
+    def test_sr16_sw2_ch1_get_channels(self):
+
+        channels = self.audio_source.get_channels()
+        self.assertEqual(
+            channels,
+            1,
+            msg="wrong number of channels, expected: 1, found: {0} ".format(
+                channels
+            ),
+        )
+
+    def test_sr16_sw2_ch1_get_position_0(self):
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
+        )
+
+    def test_sr16_sw2_ch1_get_position_5(self):
+        self.audio_source.read(5)
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 5, msg="wrong position, expected: 5, found: {0} ".format(pos)
+        )
+
+    def test_sr16_sw2_ch1_get_position_15(self):
+        self.audio_source.read(5)
+        self.audio_source.read(10)
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 15, msg="wrong position, expected: 5, found: {0} ".format(pos)
+        )
+
+    def test_sr16_sw2_ch1_set_position_0(self):
+        self.audio_source.read(10)
+        self.audio_source.set_position(0)
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
+        )
+
+    def test_sr16_sw2_ch1_set_position_10(self):
+        self.audio_source.set_position(10)
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos,
+            10,
+            msg="wrong position, expected: 10, found: {0} ".format(pos),
+        )
+
+    def test_sr16_sw2_ch1_get_time_position_0(self):
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            0.0,
+            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
+        )
+
+    def test_sr16_sw2_ch1_get_time_position_1(self):
+        srate = self.audio_source.get_sampling_rate()
+        # read one second
+        self.audio_source.read(srate)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            1.0,
+            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
+        )
+
+    def test_sr16_sw2_ch1_get_time_position_0_75(self):
+        # read 2.5 seconds
+        self.audio_source.read(12)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            0.75,
+            msg="wrong time position, expected: 0.75, found: {0} ".format(tp),
+        )
+
+    def test_sr16_sw2_ch1_set_time_position_0(self):
+        self.audio_source.read(10)
+        self.audio_source.set_time_position(0)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            0.0,
+            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
+        )
+
+    def test_sr16_sw2_ch1_set_time_position_1(self):
+        self.audio_source.set_time_position(1)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            1.0,
+            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
+        )
+
+    def test_sr16_sw2_ch1_set_time_position_end(self):
+        self.audio_source.set_time_position(100)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            1.0,
+            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
+        )
+
+    def test_sr16_sw2_ch1_rewind(self):
+        self.audio_source.read(10)
+        self.audio_source.rewind()
+        tp = self.audio_source.get_position()
+        self.assertEqual(
+            tp, 0, msg="wrong position, expected: 0.0, found: {0} ".format(tp)
+        )
+
+    def test_sr16_sw2_ch1_set_data(self):
+        self.audio_source.set_data(b"abcdef")
+        block = self.audio_source.read(9999)
+        self.assertEqual(
+            block,
+            b"abcdef",
+            msg="wrong block, expected: 'abcdef', found: {0} ".format(block),
+        )
+
+    def test_sr16_sw2_ch1_set_data_exception(self):
+        with self.assertRaises(AudioParameterError) as audio_param_err:
+            self.audio_source.set_data("abcde")
+            self.assertEqual(
+                "The length of audio data must be an integer "
+                "multiple of `sample_width * channels`",
+                str(audio_param_err.exception),
+            )
+
+    def test_sr16_sw2_ch1_append_data_exception(self):
+        with self.assertRaises(AudioParameterError) as audio_param_err:
+            self.audio_source.append_data("abcde")
+            self.assertEqual(
+                "The length of audio data must be an integer "
+                "multiple of `sample_width * channels`",
+                str(audio_param_err.exception),
+            )
+
+
+class TestBufferAudioSource_SR11_SW4_CH1(unittest.TestCase):
+    def setUp(self):
+        self.data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefgh"
+        self.audio_source = BufferAudioSource(
+            data_buffer=self.data, sampling_rate=11, sample_width=4, channels=1
+        )
+        self.audio_source.open()
+
+    def tearDown(self):
+        self.audio_source.close()
+
+    def test_sr11_sw4_ch1_read_1(self):
+        block = self.audio_source.read(1)
+        exp = b"ABCD"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+    def test_sr11_sw4_ch1_read_6(self):
+        block = self.audio_source.read(6)
+        exp = b"ABCDEFGHIJKLMNOPQRSTUVWX"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+    def test_sr11_sw4_ch1_read_multiple(self):
+        block = self.audio_source.read(1)
+        exp = b"ABCD"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+        block = self.audio_source.read(6)
+        exp = b"EFGHIJKLMNOPQRSTUVWXYZ01"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+        block = self.audio_source.read(3)
+        exp = b"23456789abcd"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+        block = self.audio_source.read(9999)
+        exp = b"efgh"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+    def test_sr11_sw4_ch1_read_all(self):
+        block = self.audio_source.read(9999)
+        self.assertEqual(
+            block,
+            self.data,
+            msg="wrong block, expected: {0}, found: {1} ".format(
+                self.data, block
+            ),
+        )
+
+        block = self.audio_source.read(1)
+        self.assertEqual(
+            block,
+            None,
+            msg="wrong block, expected: {0}, found: {1} ".format(None, block),
+        )
+
+    def test_sr11_sw4_ch1_get_sampling_rate(self):
+        srate = self.audio_source.get_sampling_rate()
+        self.assertEqual(
+            srate,
+            11,
+            msg="wrong sampling rate, expected: 10, found: {0} ".format(srate),
+        )
+
+    def test_sr11_sw4_ch1_get_sample_width(self):
+        swidth = self.audio_source.get_sample_width()
+        self.assertEqual(
+            swidth,
+            4,
+            msg="wrong sample width, expected: 1, found: {0} ".format(swidth),
+        )
+
+    def test_sr11_sw4_ch1_get_channels(self):
+        channels = self.audio_source.get_channels()
+        self.assertEqual(
+            channels,
+            1,
+            msg="wrong number of channels, expected: 1, found: {0} ".format(
+                channels
+            ),
+        )
+
+    def test_sr11_sw4_ch1_get_position_0(self):
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
+        )
+
+    def test_sr11_sw4_ch1_get_position_5(self):
+        self.audio_source.read(5)
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 5, msg="wrong position, expected: 5, found: {0} ".format(pos)
+        )
+
+    def test_sr11_sw4_ch1_get_position_9(self):
+        self.audio_source.read(5)
+        self.audio_source.read(4)
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 9, msg="wrong position, expected: 5, found: {0} ".format(pos)
+        )
+
+    def test_sr11_sw4_ch1_set_position_0(self):
+        self.audio_source.read(10)
+        self.audio_source.set_position(0)
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
+        )
+
+    def test_sr11_sw4_ch1_set_position_10(self):
+        self.audio_source.set_position(10)
+        pos = self.audio_source.get_position()
+        self.assertEqual(
+            pos,
+            10,
+            msg="wrong position, expected: 10, found: {0} ".format(pos),
+        )
+
+    def test_sr11_sw4_ch1_get_time_position_0(self):
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            0.0,
+            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
+        )
+
+    def test_sr11_sw4_ch1_get_time_position_1(self):
+        srate = self.audio_source.get_sampling_rate()
+        # read one second
+        self.audio_source.read(srate)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            1.0,
+            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
+        )
+
+    def test_sr11_sw4_ch1_get_time_position_0_63(self):
+        # read 2.5 seconds
+        self.audio_source.read(7)
+        tp = self.audio_source.get_time_position()
+        self.assertAlmostEqual(
+            tp,
+            0.636363636364,
+            msg="wrong time position, expected: 0.636363636364, "
+            "found: {0} ".format(tp),
+        )
+
+    def test_sr11_sw4_ch1_set_time_position_0(self):
+        self.audio_source.read(10)
+        self.audio_source.set_time_position(0)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            0.0,
+            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
+        )
+
+    def test_sr11_sw4_ch1_set_time_position_1(self):
+
+        self.audio_source.set_time_position(1)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            1.0,
+            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
+        )
+
+    def test_sr11_sw4_ch1_set_time_position_end(self):
+        self.audio_source.set_time_position(100)
+        tp = self.audio_source.get_time_position()
+        self.assertEqual(
+            tp,
+            1.0,
+            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
+        )
+
+    def test_sr11_sw4_ch1_rewind(self):
+        self.audio_source.read(10)
+        self.audio_source.rewind()
+        tp = self.audio_source.get_position()
+        self.assertEqual(
+            tp, 0, msg="wrong position, expected: 0.0, found: {0} ".format(tp)
+        )
+
+    def test_sr11_sw4_ch1_set_data(self):
+        self.audio_source.set_data(b"abcdefgh")
+        block = self.audio_source.read(9999)
+        exp = b"abcdefgh"
+        self.assertEqual(
+            block,
+            exp,
+            msg="wrong block, expected: {}, found: {} ".format(exp, block),
+        )
+
+    def test_sr11_sw4_ch1_set_data_exception(self):
+        with self.assertRaises(AudioParameterError) as audio_param_err:
+            self.audio_source.set_data(b"abcdef")
+        self.assertEqual(
+            "The length of audio data must be an integer "
+            "multiple of `sample_width * channels`",
+            str(audio_param_err.exception),
+        )
+
+    def test_sr11_sw4_ch1_append_data_exception(self):
+        with self.assertRaises(AudioParameterError) as audio_param_err:
+            self.audio_source.append_data(b"abcdef")
+        self.assertEqual(
+            "The length of audio data must be an integer "
+            "multiple of `sample_width * channels`",
+            str(audio_param_err.exception),
+        )
+
+
+class TestBufferAudioSourceCreationException(unittest.TestCase):
+    def test_wrong_sample_width_value(self):
+        with self.assertRaises(AudioParameterError) as audio_param_err:
+            _ = BufferAudioSource(
+                data_buffer=b"ABCDEFGHI",
+                sampling_rate=9,
+                sample_width=3,
+                channels=1,
+            )
+        self.assertEqual(
+            "Sample width must be one of: 1, 2 or 4 (bytes)",
+            str(audio_param_err.exception),
+        )
+
+    def test_wrong_data_buffer_size(self):
+        with self.assertRaises(AudioParameterError) as audio_param_err:
+            _ = BufferAudioSource(
+                data_buffer=b"ABCDEFGHI",
+                sampling_rate=8,
+                sample_width=2,
+                channels=1,
+            )
+        self.assertEqual(
+            "The length of audio data must be an integer "
+            "multiple of `sample_width * channels`",
+            str(audio_param_err.exception),
+        )
+
+
+class TestAudioSourceProperties(unittest.TestCase):
+    def test_read_properties(self):
+        data = b""
+        sampling_rate = 8000
+        sample_width = 2
+        channels = 1
+        a_source = BufferAudioSource(
+            data, sampling_rate, sample_width, channels
+        )
+
+        self.assertEqual(a_source.sampling_rate, sampling_rate)
+        self.assertEqual(a_source.sample_width, sample_width)
+        self.assertEqual(a_source.channels, channels)
+
+    def test_set_readonly_properties_exception(self):
+        data = b""
+        sampling_rate = 8000
+        sample_width = 2
+        channels = 1
+        a_source = BufferAudioSource(
+            data, sampling_rate, sample_width, channels
+        )
+
+        with self.assertRaises(AttributeError):
+            a_source.sampling_rate = 16000
+            a_source.sample_width = 1
+            a_source.channels = 2
+
+
+class TestAudioSourceShortProperties(unittest.TestCase):
+    def test_read_short_properties(self):
+        data = b""
+        sampling_rate = 8000
+        sample_width = 2
+        channels = 1
+        a_source = BufferAudioSource(
+            data, sampling_rate, sample_width, channels
+        )
+
+        self.assertEqual(a_source.sr, sampling_rate)
+        self.assertEqual(a_source.sw, sample_width)
+        self.assertEqual(a_source.ch, channels)
+
+    def test_set_readonly_short_properties_exception(self):
+        data = b""
+        sampling_rate = 8000
+        sample_width = 2
+        channels = 1
+        a_source = BufferAudioSource(
+            data, sampling_rate, sample_width, channels
+        )
+
+        with self.assertRaises(AttributeError):
+            a_source.sr = 16000
+            a_source.sw = 1
+            a_source.ch = 2
+
+
+if __name__ == "__main__":
+    unittest.main()
--- a/tests/test_audio_source.py	Sat Mar 02 15:04:36 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,887 +0,0 @@
-"""
-@author: Amine Sehili <amine.sehili@gmail.com>
-"""
-from array import array
-import unittest
-from genty import genty, genty_dataset
-from auditok.io import (
-    AudioParameterError,
-    _array_to_bytes,
-    DATA_FORMAT,
-    BufferAudioSource,
-    RawAudioSource,
-    WaveAudioSource,
-)
-from test_util import PURE_TONE_DICT
-
-
-def audio_source_read_all_gen(audio_source, size=None):
-    if size is None:
-        size = int(audio_source.sr * 0.1)  # 100ms
-    while True:
-        data = audio_source.read(size)
-        if data is None:
-            break
-        yield data
-
-
-@genty
-class TestAudioSource(unittest.TestCase):
-
-    # TODO when use_channel is None, return samples from all channels
-
-    @genty_dataset(
-        mono_default=("mono_400Hz", 1, None, 400),
-        mono_mix=("mono_400Hz", 1, "mix", 400),
-        mono_channel_selection=("mono_400Hz", 1, 2, 400),
-        multichannel_default=("3channel_400-800-1600Hz", 3, None, 400),
-        multichannel_channel_selection=("3channel_400-800-1600Hz", 3, 1, 800),
-    )
-    def test_RawAudioSource(
-        self, file_suffix, channels, use_channel, frequency
-    ):
-        file = "tests/data/test_16KHZ_{}.raw".format(file_suffix)
-        audio_source = RawAudioSource(file, 16000, 2, channels, use_channel)
-        audio_source.open()
-        data = b"".join(audio_source_read_all_gen(audio_source))
-        audio_source.close()
-        expected = _array_to_bytes(PURE_TONE_DICT[frequency])
-        self.assertEqual(data, expected)
-
-    def test_RawAudioSource_mix(self):
-        file = "tests/data/test_16KHZ_3channel_400-800-1600Hz.raw"
-        audio_source = RawAudioSource(file, 16000, 2, 3, use_channel="mix")
-        audio_source.open()
-        data = b"".join(audio_source_read_all_gen(audio_source))
-        audio_source.close()
-
-        mono_channels = [PURE_TONE_DICT[freq] for freq in [400, 800, 1600]]
-        fmt = DATA_FORMAT[2]
-        expected = _array_to_bytes(
-            array(fmt, (sum(samples) // 3 for samples in zip(*mono_channels)))
-        )
-        expected = expected
-        self.assertEqual(data, expected)
-
-    @genty_dataset(
-        mono_default=("mono_400Hz", 1, None, 400),
-        mono_mix=("mono_400Hz", 1, "mix", 400),
-        mono_channel_selection=("mono_400Hz", 1, 2, 400),
-        multichannel_default=("3channel_400-800-1600Hz", 3, None, 400),
-        multichannel_channel_selection=("3channel_400-800-1600Hz", 3, 1, 800),
-    )
-    def test_WaveAudioSource(
-        self, file_suffix, channels, use_channel, frequency
-    ):
-        file = "tests/data/test_16KHZ_{}.wav".format(file_suffix)
-        audio_source = WaveAudioSource(file, use_channel)
-        audio_source.open()
-        data = b"".join(audio_source_read_all_gen(audio_source))
-        audio_source.close()
-        expected = _array_to_bytes(PURE_TONE_DICT[frequency])
-        self.assertEqual(data, expected)
-
-    def test_WaveAudioSource_mix(self):
-        file = "tests/data/test_16KHZ_3channel_400-800-1600Hz.wav"
-        audio_source = WaveAudioSource(file, use_channel="mix")
-        audio_source.open()
-        data = b"".join(audio_source_read_all_gen(audio_source))
-        audio_source.close()
-
-        mono_channels = [PURE_TONE_DICT[freq] for freq in [400, 800, 1600]]
-        fmt = DATA_FORMAT[2]
-        expected = _array_to_bytes(
-            array(fmt, (sum(samples) // 3 for samples in zip(*mono_channels)))
-        )
-        self.assertEqual(data, expected)
-
-
-class TestBufferAudioSource_SR10_SW1_CH1(unittest.TestCase):
-    def setUp(self):
-        self.data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
-        self.audio_source = BufferAudioSource(
-            data_buffer=self.data, sampling_rate=10, sample_width=1, channels=1
-        )
-        self.audio_source.open()
-
-    def tearDown(self):
-        self.audio_source.close()
-
-    def test_sr10_sw1_ch1_read_1(self):
-        block = self.audio_source.read(1)
-        exp = b"A"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-    def test_sr10_sw1_ch1_read_6(self):
-        block = self.audio_source.read(6)
-        exp = b"ABCDEF"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-    def test_sr10_sw1_ch1_read_multiple(self):
-        block = self.audio_source.read(1)
-        exp = b"A"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-        block = self.audio_source.read(6)
-        exp = b"BCDEFG"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-        block = self.audio_source.read(13)
-        exp = b"HIJKLMNOPQRST"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-        block = self.audio_source.read(9999)
-        exp = b"UVWXYZ012345"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-    def test_sr10_sw1_ch1_read_all(self):
-        block = self.audio_source.read(9999)
-        self.assertEqual(
-            block,
-            self.data,
-            msg="wrong block, expected: {}, found: {} ".format(
-                self.data, block
-            ),
-        )
-
-        block = self.audio_source.read(1)
-        self.assertEqual(
-            block,
-            None,
-            msg="wrong block, expected: {}, found: {} ".format(None, block),
-        )
-
-    def test_sr10_sw1_ch1_get_sampling_rate(self):
-        srate = self.audio_source.get_sampling_rate()
-        self.assertEqual(
-            srate,
-            10,
-            msg="wrong sampling rate, expected: 10, found: {0} ".format(srate),
-        )
-
-    def test_sr10_sw1_ch1_get_sample_width(self):
-        swidth = self.audio_source.get_sample_width()
-        self.assertEqual(
-            swidth,
-            1,
-            msg="wrong sample width, expected: 1, found: {0} ".format(swidth),
-        )
-
-    def test_sr10_sw1_ch1_get_channels(self):
-        channels = self.audio_source.get_channels()
-        self.assertEqual(
-            channels,
-            1,
-            msg="wrong number of channels, expected: 1, found: {0} ".format(
-                channels
-            ),
-        )
-
-    def test_sr10_sw1_ch1_get_position_0(self):
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
-        )
-
-    def test_sr10_sw1_ch1_get_position_5(self):
-        self.audio_source.read(5)
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 5, msg="wrong position, expected: 5, found: {0} ".format(pos)
-        )
-
-    def test_sr10_sw1_ch1_get_position_25(self):
-        self.audio_source.read(5)
-        self.audio_source.read(20)
-
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 25, msg="wrong position, expected: 5, found: {0} ".format(pos)
-        )
-
-    def test_sr10_sw1_ch1_set_position_0(self):
-        self.audio_source.read(10)
-        self.audio_source.set_position(0)
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
-        )
-
-    def test_sr10_sw1_ch1_set_position_10(self):
-        self.audio_source.set_position(10)
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos,
-            10,
-            msg="wrong position, expected: 10, found: {0} ".format(pos),
-        )
-
-    def test_sr10_sw1_ch1_get_time_position_0(self):
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            0.0,
-            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
-        )
-
-    def test_sr10_sw1_ch1_get_time_position_1(self):
-        srate = self.audio_source.get_sampling_rate()
-        # read one second
-        self.audio_source.read(srate)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            1.0,
-            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
-        )
-
-    def test_sr10_sw1_ch1_get_time_position_2_5(self):
-        # read 2.5 seconds
-        self.audio_source.read(25)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            2.5,
-            msg="wrong time position, expected: 2.5, found: {0} ".format(tp),
-        )
-
-    def test_sr10_sw1_ch1_set_time_position_0(self):
-        self.audio_source.read(10)
-        self.audio_source.set_time_position(0)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            0.0,
-            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
-        )
-
-    def test_sr10_sw1_ch1_set_time_position_1(self):
-        self.audio_source.set_time_position(1)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            1.0,
-            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
-        )
-
-    def test_sr10_sw1_ch1_set_time_position_end(self):
-        self.audio_source.set_time_position(100)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            3.2,
-            msg="wrong time position, expected: 3.2, found: {0} ".format(tp),
-        )
-
-    def test_sr10_sw1_ch1_rewind(self):
-        self.audio_source.read(10)
-        self.audio_source.rewind()
-        tp = self.audio_source.get_position()
-        self.assertEqual(
-            tp, 0, msg="wrong position, expected: 0.0, found: {0} ".format(tp)
-        )
-
-    def test_sr10_sw1_ch1_set_data(self):
-        self.audio_source.set_data(b"12345")
-        block = self.audio_source.read(9999)
-        self.assertEqual(
-            block,
-            b"12345",
-            msg="wrong block, expected: '12345', found: {0} ".format(block),
-        )
-
-    def test_sr10_sw1_ch1_read_closed(self):
-        self.audio_source.close()
-        with self.assertRaises(Exception):
-            self.audio_source.read(1)
-
-
-class TestBufferAudioSource_SR16_SW2_CH1(unittest.TestCase):
-    def setUp(self):
-        self.data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
-        self.audio_source = BufferAudioSource(
-            data_buffer=self.data, sampling_rate=16, sample_width=2, channels=1
-        )
-        self.audio_source.open()
-
-    def tearDown(self):
-        self.audio_source.close()
-
-    def test_sr16_sw2_ch1_read_1(self):
-        block = self.audio_source.read(1)
-        exp = b"AB"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-    def test_sr16_sw2_ch1_read_6(self):
-        block = self.audio_source.read(6)
-        exp = b"ABCDEFGHIJKL"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-    def test_sr16_sw2_ch1_read_multiple(self):
-        block = self.audio_source.read(1)
-        exp = b"AB"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-        block = self.audio_source.read(6)
-        exp = b"CDEFGHIJKLMN"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-        block = self.audio_source.read(5)
-        exp = b"OPQRSTUVWX"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-        block = self.audio_source.read(9999)
-        exp = b"YZ012345"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-    def test_sr16_sw2_ch1_read_all(self):
-        block = self.audio_source.read(9999)
-        self.assertEqual(
-            block,
-            self.data,
-            msg="wrong block, expected: {0}, found: {1} ".format(
-                self.data, block
-            ),
-        )
-
-        block = self.audio_source.read(1)
-        self.assertEqual(
-            block,
-            None,
-            msg="wrong block, expected: {0}, found: {1} ".format(None, block),
-        )
-
-    def test_sr16_sw2_ch1_get_sampling_rate(self):
-        srate = self.audio_source.get_sampling_rate()
-        self.assertEqual(
-            srate,
-            16,
-            msg="wrong sampling rate, expected: 10, found: {0} ".format(srate),
-        )
-
-    def test_sr16_sw2_ch1_get_sample_width(self):
-        swidth = self.audio_source.get_sample_width()
-        self.assertEqual(
-            swidth,
-            2,
-            msg="wrong sample width, expected: 1, found: {0} ".format(swidth),
-        )
-
-    def test_sr16_sw2_ch1_get_channels(self):
-
-        channels = self.audio_source.get_channels()
-        self.assertEqual(
-            channels,
-            1,
-            msg="wrong number of channels, expected: 1, found: {0} ".format(
-                channels
-            ),
-        )
-
-    def test_sr16_sw2_ch1_get_position_0(self):
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
-        )
-
-    def test_sr16_sw2_ch1_get_position_5(self):
-        self.audio_source.read(5)
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 5, msg="wrong position, expected: 5, found: {0} ".format(pos)
-        )
-
-    def test_sr16_sw2_ch1_get_position_15(self):
-        self.audio_source.read(5)
-        self.audio_source.read(10)
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 15, msg="wrong position, expected: 5, found: {0} ".format(pos)
-        )
-
-    def test_sr16_sw2_ch1_set_position_0(self):
-        self.audio_source.read(10)
-        self.audio_source.set_position(0)
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
-        )
-
-    def test_sr16_sw2_ch1_set_position_10(self):
-        self.audio_source.set_position(10)
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos,
-            10,
-            msg="wrong position, expected: 10, found: {0} ".format(pos),
-        )
-
-    def test_sr16_sw2_ch1_get_time_position_0(self):
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            0.0,
-            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
-        )
-
-    def test_sr16_sw2_ch1_get_time_position_1(self):
-        srate = self.audio_source.get_sampling_rate()
-        # read one second
-        self.audio_source.read(srate)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            1.0,
-            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
-        )
-
-    def test_sr16_sw2_ch1_get_time_position_0_75(self):
-        # read 2.5 seconds
-        self.audio_source.read(12)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            0.75,
-            msg="wrong time position, expected: 0.75, found: {0} ".format(tp),
-        )
-
-    def test_sr16_sw2_ch1_set_time_position_0(self):
-        self.audio_source.read(10)
-        self.audio_source.set_time_position(0)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            0.0,
-            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
-        )
-
-    def test_sr16_sw2_ch1_set_time_position_1(self):
-        self.audio_source.set_time_position(1)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            1.0,
-            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
-        )
-
-    def test_sr16_sw2_ch1_set_time_position_end(self):
-        self.audio_source.set_time_position(100)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            1.0,
-            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
-        )
-
-    def test_sr16_sw2_ch1_rewind(self):
-        self.audio_source.read(10)
-        self.audio_source.rewind()
-        tp = self.audio_source.get_position()
-        self.assertEqual(
-            tp, 0, msg="wrong position, expected: 0.0, found: {0} ".format(tp)
-        )
-
-    def test_sr16_sw2_ch1_set_data(self):
-        self.audio_source.set_data(b"abcdef")
-        block = self.audio_source.read(9999)
-        self.assertEqual(
-            block,
-            b"abcdef",
-            msg="wrong block, expected: 'abcdef', found: {0} ".format(block),
-        )
-
-    def test_sr16_sw2_ch1_set_data_exception(self):
-        with self.assertRaises(AudioParameterError) as audio_param_err:
-            self.audio_source.set_data("abcde")
-            self.assertEqual(
-                "The length of audio data must be an integer "
-                "multiple of `sample_width * channels`",
-                str(audio_param_err.exception),
-            )
-
-    def test_sr16_sw2_ch1_append_data_exception(self):
-        with self.assertRaises(AudioParameterError) as audio_param_err:
-            self.audio_source.append_data("abcde")
-            self.assertEqual(
-                "The length of audio data must be an integer "
-                "multiple of `sample_width * channels`",
-                str(audio_param_err.exception),
-            )
-
-
-class TestBufferAudioSource_SR11_SW4_CH1(unittest.TestCase):
-    def setUp(self):
-        self.data = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefgh"
-        self.audio_source = BufferAudioSource(
-            data_buffer=self.data, sampling_rate=11, sample_width=4, channels=1
-        )
-        self.audio_source.open()
-
-    def tearDown(self):
-        self.audio_source.close()
-
-    def test_sr11_sw4_ch1_read_1(self):
-        block = self.audio_source.read(1)
-        exp = b"ABCD"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-    def test_sr11_sw4_ch1_read_6(self):
-        block = self.audio_source.read(6)
-        exp = b"ABCDEFGHIJKLMNOPQRSTUVWX"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-    def test_sr11_sw4_ch1_read_multiple(self):
-        block = self.audio_source.read(1)
-        exp = b"ABCD"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-        block = self.audio_source.read(6)
-        exp = b"EFGHIJKLMNOPQRSTUVWXYZ01"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-        block = self.audio_source.read(3)
-        exp = b"23456789abcd"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-        block = self.audio_source.read(9999)
-        exp = b"efgh"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-    def test_sr11_sw4_ch1_read_all(self):
-        block = self.audio_source.read(9999)
-        self.assertEqual(
-            block,
-            self.data,
-            msg="wrong block, expected: {0}, found: {1} ".format(
-                self.data, block
-            ),
-        )
-
-        block = self.audio_source.read(1)
-        self.assertEqual(
-            block,
-            None,
-            msg="wrong block, expected: {0}, found: {1} ".format(None, block),
-        )
-
-    def test_sr11_sw4_ch1_get_sampling_rate(self):
-        srate = self.audio_source.get_sampling_rate()
-        self.assertEqual(
-            srate,
-            11,
-            msg="wrong sampling rate, expected: 10, found: {0} ".format(srate),
-        )
-
-    def test_sr11_sw4_ch1_get_sample_width(self):
-        swidth = self.audio_source.get_sample_width()
-        self.assertEqual(
-            swidth,
-            4,
-            msg="wrong sample width, expected: 1, found: {0} ".format(swidth),
-        )
-
-    def test_sr11_sw4_ch1_get_channels(self):
-        channels = self.audio_source.get_channels()
-        self.assertEqual(
-            channels,
-            1,
-            msg="wrong number of channels, expected: 1, found: {0} ".format(
-                channels
-            ),
-        )
-
-    def test_sr11_sw4_ch1_get_position_0(self):
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
-        )
-
-    def test_sr11_sw4_ch1_get_position_5(self):
-        self.audio_source.read(5)
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 5, msg="wrong position, expected: 5, found: {0} ".format(pos)
-        )
-
-    def test_sr11_sw4_ch1_get_position_9(self):
-        self.audio_source.read(5)
-        self.audio_source.read(4)
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 9, msg="wrong position, expected: 5, found: {0} ".format(pos)
-        )
-
-    def test_sr11_sw4_ch1_set_position_0(self):
-        self.audio_source.read(10)
-        self.audio_source.set_position(0)
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos, 0, msg="wrong position, expected: 0, found: {0} ".format(pos)
-        )
-
-    def test_sr11_sw4_ch1_set_position_10(self):
-        self.audio_source.set_position(10)
-        pos = self.audio_source.get_position()
-        self.assertEqual(
-            pos,
-            10,
-            msg="wrong position, expected: 10, found: {0} ".format(pos),
-        )
-
-    def test_sr11_sw4_ch1_get_time_position_0(self):
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            0.0,
-            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
-        )
-
-    def test_sr11_sw4_ch1_get_time_position_1(self):
-        srate = self.audio_source.get_sampling_rate()
-        # read one second
-        self.audio_source.read(srate)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            1.0,
-            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
-        )
-
-    def test_sr11_sw4_ch1_get_time_position_0_63(self):
-        # read 2.5 seconds
-        self.audio_source.read(7)
-        tp = self.audio_source.get_time_position()
-        self.assertAlmostEqual(
-            tp,
-            0.636363636364,
-            msg="wrong time position, expected: 0.636363636364, "
-            "found: {0} ".format(tp),
-        )
-
-    def test_sr11_sw4_ch1_set_time_position_0(self):
-        self.audio_source.read(10)
-        self.audio_source.set_time_position(0)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            0.0,
-            msg="wrong time position, expected: 0.0, found: {0} ".format(tp),
-        )
-
-    def test_sr11_sw4_ch1_set_time_position_1(self):
-
-        self.audio_source.set_time_position(1)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            1.0,
-            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
-        )
-
-    def test_sr11_sw4_ch1_set_time_position_end(self):
-        self.audio_source.set_time_position(100)
-        tp = self.audio_source.get_time_position()
-        self.assertEqual(
-            tp,
-            1.0,
-            msg="wrong time position, expected: 1.0, found: {0} ".format(tp),
-        )
-
-    def test_sr11_sw4_ch1_rewind(self):
-        self.audio_source.read(10)
-        self.audio_source.rewind()
-        tp = self.audio_source.get_position()
-        self.assertEqual(
-            tp, 0, msg="wrong position, expected: 0.0, found: {0} ".format(tp)
-        )
-
-    def test_sr11_sw4_ch1_set_data(self):
-        self.audio_source.set_data(b"abcdefgh")
-        block = self.audio_source.read(9999)
-        exp = b"abcdefgh"
-        self.assertEqual(
-            block,
-            exp,
-            msg="wrong block, expected: {}, found: {} ".format(exp, block),
-        )
-
-    def test_sr11_sw4_ch1_set_data_exception(self):
-        with self.assertRaises(AudioParameterError) as audio_param_err:
-            self.audio_source.set_data(b"abcdef")
-        self.assertEqual(
-            "The length of audio data must be an integer "
-            "multiple of `sample_width * channels`",
-            str(audio_param_err.exception),
-        )
-
-    def test_sr11_sw4_ch1_append_data_exception(self):
-        with self.assertRaises(AudioParameterError) as audio_param_err:
-            self.audio_source.append_data(b"abcdef")
-        self.assertEqual(
-            "The length of audio data must be an integer "
-            "multiple of `sample_width * channels`",
-            str(audio_param_err.exception),
-        )
-
-
-class TestBufferAudioSourceCreationException(unittest.TestCase):
-    def test_wrong_sample_width_value(self):
-        with self.assertRaises(AudioParameterError) as audio_param_err:
-            _ = BufferAudioSource(
-                data_buffer=b"ABCDEFGHI",
-                sampling_rate=9,
-                sample_width=3,
-                channels=1,
-            )
-        self.assertEqual(
-            "Sample width must be one of: 1, 2 or 4 (bytes)",
-            str(audio_param_err.exception),
-        )
-
-    def test_wrong_data_buffer_size(self):
-        with self.assertRaises(AudioParameterError) as audio_param_err:
-            _ = BufferAudioSource(
-                data_buffer=b"ABCDEFGHI",
-                sampling_rate=8,
-                sample_width=2,
-                channels=1,
-            )
-        self.assertEqual(
-            "The length of audio data must be an integer "
-            "multiple of `sample_width * channels`",
-            str(audio_param_err.exception),
-        )
-
-
-class TestAudioSourceProperties(unittest.TestCase):
-    def test_read_properties(self):
-        data = b""
-        sampling_rate = 8000
-        sample_width = 2
-        channels = 1
-        a_source = BufferAudioSource(
-            data, sampling_rate, sample_width, channels
-        )
-
-        self.assertEqual(a_source.sampling_rate, sampling_rate)
-        self.assertEqual(a_source.sample_width, sample_width)
-        self.assertEqual(a_source.channels, channels)
-
-    def test_set_readonly_properties_exception(self):
-        data = b""
-        sampling_rate = 8000
-        sample_width = 2
-        channels = 1
-        a_source = BufferAudioSource(
-            data, sampling_rate, sample_width, channels
-        )
-
-        with self.assertRaises(AttributeError):
-            a_source.sampling_rate = 16000
-            a_source.sample_width = 1
-            a_source.channels = 2
-
-
-class TestAudioSourceShortProperties(unittest.TestCase):
-    def test_read_short_properties(self):
-        data = b""
-        sampling_rate = 8000
-        sample_width = 2
-        channels = 1
-        a_source = BufferAudioSource(
-            data, sampling_rate, sample_width, channels
-        )
-
-        self.assertEqual(a_source.sr, sampling_rate)
-        self.assertEqual(a_source.sw, sample_width)
-        self.assertEqual(a_source.ch, channels)
-
-    def test_set_readonly_short_properties_exception(self):
-        data = b""
-        sampling_rate = 8000
-        sample_width = 2
-        channels = 1
-        a_source = BufferAudioSource(
-            data, sampling_rate, sample_width, channels
-        )
-
-        with self.assertRaises(AttributeError):
-            a_source.sr = 16000
-            a_source.sw = 1
-            a_source.ch = 2
-
-
-if __name__ == "__main__":
-    unittest.main()