annotate tests/test_signal.py @ 400:323d59b404a2

Use pytest instead of genty
author Amine Sehili <amine.sehili@gmail.com>
date Sat, 25 May 2024 21:54:13 +0200
parents d653e3f58f3c
children 996948ada980
rev   line source
amine@400 1 import pytest
amine@257 2 from array import array as array_
amine@257 3 import numpy as np
amine@257 4 from auditok import signal as signal_
amine@257 5 from auditok import signal_numpy
amine@257 6
amine@257 7
amine@400 8 @pytest.fixture
amine@400 9 def setup_data():
amine@400 10 return b"012345679ABC"
amine@257 11
amine@257 12
amine@400 13 @pytest.fixture
amine@400 14 def numpy_fmt():
amine@400 15 return {"b": np.int8, "h": np.int16, "i": np.int32}
amine@400 16
amine@400 17
amine@400 18 @pytest.mark.parametrize(
amine@400 19 "sample_width, expected",
amine@400 20 [
amine@400 21 (1, [[48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67]]), # int8_mono
amine@400 22 (2, [[12592, 13106, 13620, 14134, 16697, 17218]]), # int16_mono
amine@400 23 (4, [[858927408, 926299444, 1128415545]]), # int32_mono
amine@400 24 (
amine@400 25 1,
amine@400 26 [[48, 50, 52, 54, 57, 66], [49, 51, 53, 55, 65, 67]],
amine@400 27 ), # int8_stereo
amine@400 28 (2, [[12592, 13620, 16697], [13106, 14134, 17218]]), # int16_stereo
amine@400 29 (4, [[858927408], [926299444], [1128415545]]), # int32_3channel
amine@400 30 ],
amine@400 31 ids=[
amine@400 32 "int8_mono",
amine@400 33 "int16_mono",
amine@400 34 "int32_mono",
amine@400 35 "int8_stereo",
amine@400 36 "int16_stereo",
amine@400 37 "int32_3channel",
amine@400 38 ],
amine@400 39 )
amine@400 40 def test_to_array(setup_data, sample_width, expected):
amine@400 41 data = setup_data
amine@400 42 channels = len(expected)
amine@400 43 expected = [array_(signal_.FORMAT[sample_width], xi) for xi in expected]
amine@400 44 result = signal_.to_array(data, sample_width, channels)
amine@400 45 result_numpy = signal_numpy.to_array(data, sample_width, channels)
amine@400 46 assert result == expected
amine@400 47 assert (result_numpy == np.asarray(expected)).all()
amine@400 48 assert result_numpy.dtype == np.float64
amine@400 49
amine@400 50
amine@400 51 @pytest.mark.parametrize(
amine@400 52 "fmt, channels, selected, expected",
amine@400 53 [
amine@400 54 (
amine@257 55 "b",
amine@257 56 1,
amine@257 57 0,
amine@257 58 [48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67],
amine@400 59 ), # int8_1channel_select_0
amine@400 60 ("b", 2, 0, [48, 50, 52, 54, 57, 66]), # int8_2channel_select_0
amine@400 61 ("b", 3, 0, [48, 51, 54, 65]), # int8_3channel_select_0
amine@400 62 ("b", 3, 1, [49, 52, 55, 66]), # int8_3channel_select_1
amine@400 63 ("b", 3, 2, [50, 53, 57, 67]), # int8_3channel_select_2
amine@400 64 ("b", 4, 0, [48, 52, 57]), # int8_4channel_select_0
amine@400 65 (
amine@257 66 "h",
amine@257 67 1,
amine@257 68 0,
amine@257 69 [12592, 13106, 13620, 14134, 16697, 17218],
amine@400 70 ), # int16_1channel_select_0
amine@400 71 ("h", 2, 0, [12592, 13620, 16697]), # int16_2channel_select_0
amine@400 72 ("h", 2, 1, [13106, 14134, 17218]), # int16_2channel_select_1
amine@400 73 ("h", 3, 0, [12592, 14134]), # int16_3channel_select_0
amine@400 74 ("h", 3, 1, [13106, 16697]), # int16_3channel_select_1
amine@400 75 ("h", 3, 2, [13620, 17218]), # int16_3channel_select_2
amine@400 76 (
amine@257 77 "i",
amine@257 78 1,
amine@257 79 0,
amine@257 80 [858927408, 926299444, 1128415545],
amine@400 81 ), # int32_1channel_select_0
amine@400 82 ("i", 3, 0, [858927408]), # int32_3channel_select_0
amine@400 83 ("i", 3, 1, [926299444]), # int32_3channel_select_1
amine@400 84 ("i", 3, 2, [1128415545]), # int32_3channel_select_2
amine@400 85 ],
amine@400 86 ids=[
amine@400 87 "int8_1channel_select_0",
amine@400 88 "int8_2channel_select_0",
amine@400 89 "int8_3channel_select_0",
amine@400 90 "int8_3channel_select_1",
amine@400 91 "int8_3channel_select_2",
amine@400 92 "int8_4channel_select_0",
amine@400 93 "int16_1channel_select_0",
amine@400 94 "int16_2channel_select_0",
amine@400 95 "int16_2channel_select_1",
amine@400 96 "int16_3channel_select_0",
amine@400 97 "int16_3channel_select_1",
amine@400 98 "int16_3channel_select_2",
amine@400 99 "int32_1channel_select_0",
amine@400 100 "int32_3channel_select_0",
amine@400 101 "int32_3channel_select_1",
amine@400 102 "int32_3channel_select_2",
amine@400 103 ],
amine@400 104 )
amine@400 105 def test_extract_single_channel(
amine@400 106 setup_data, numpy_fmt, fmt, channels, selected, expected
amine@400 107 ):
amine@400 108 data = setup_data
amine@400 109 result = signal_.extract_single_channel(data, fmt, channels, selected)
amine@400 110 expected = array_(fmt, expected)
amine@400 111 expected_numpy_fmt = numpy_fmt[fmt]
amine@400 112 assert result == expected
amine@400 113 result_numpy = signal_numpy.extract_single_channel(
amine@400 114 data, numpy_fmt[fmt], channels, selected
amine@257 115 )
amine@400 116 assert all(result_numpy == expected)
amine@400 117 assert result_numpy.dtype == expected_numpy_fmt
amine@257 118
amine@400 119
amine@400 120 @pytest.mark.parametrize(
amine@400 121 "fmt, channels, expected",
amine@400 122 [
amine@400 123 ("b", 2, [48, 50, 52, 54, 61, 66]), # int8_2channel
amine@400 124 ("b", 4, [50, 54, 64]), # int8_4channel
amine@400 125 ("h", 1, [12592, 13106, 13620, 14134, 16697, 17218]), # int16_1channel
amine@400 126 ("h", 2, [12849, 13877, 16958]), # int16_2channel
amine@400 127 ("i", 3, [971214132]), # int32_3channel
amine@400 128 ],
amine@400 129 ids=[
amine@400 130 "int8_2channel",
amine@400 131 "int8_4channel",
amine@400 132 "int16_1channel",
amine@400 133 "int16_2channel",
amine@400 134 "int32_3channel",
amine@400 135 ],
amine@400 136 )
amine@400 137 def test_compute_average_channel(
amine@400 138 setup_data, numpy_fmt, fmt, channels, expected
amine@400 139 ):
amine@400 140 data = setup_data
amine@400 141 result = signal_.compute_average_channel(data, fmt, channels)
amine@400 142 expected = array_(fmt, expected)
amine@400 143 expected_numpy_fmt = numpy_fmt[fmt]
amine@400 144 assert result == expected
amine@400 145 result_numpy = signal_numpy.compute_average_channel(
amine@400 146 data, numpy_fmt[fmt], channels
amine@257 147 )
amine@400 148 assert all(result_numpy == expected)
amine@400 149 assert result_numpy.dtype == expected_numpy_fmt
amine@358 150
amine@257 151
amine@400 152 @pytest.mark.parametrize(
amine@400 153 "sample_width, expected",
amine@400 154 [
amine@400 155 (1, [48, 50, 52, 54, 61, 66]), # int8_2channel
amine@400 156 (2, [12849, 13877, 16957]), # int16_2channel
amine@400 157 ],
amine@400 158 ids=["int8_2channel", "int16_2channel"],
amine@400 159 )
amine@400 160 def test_compute_average_channel_stereo(setup_data, sample_width, expected):
amine@400 161 data = setup_data
amine@400 162 result = signal_.compute_average_channel_stereo(data, sample_width)
amine@400 163 fmt = signal_.FORMAT[sample_width]
amine@400 164 expected = array_(fmt, expected)
amine@400 165 assert result == expected
amine@400 166
amine@400 167
amine@400 168 @pytest.mark.parametrize(
amine@400 169 "fmt, channels, expected",
amine@400 170 [
amine@400 171 (
amine@257 172 "b",
amine@257 173 1,
amine@257 174 [[48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67]],
amine@400 175 ), # int8_1channel
amine@400 176 (
amine@257 177 "b",
amine@257 178 2,
amine@257 179 [[48, 50, 52, 54, 57, 66], [49, 51, 53, 55, 65, 67]],
amine@400 180 ), # int8_2channel
amine@400 181 (
amine@257 182 "b",
amine@257 183 4,
amine@257 184 [[48, 52, 57], [49, 53, 65], [50, 54, 66], [51, 55, 67]],
amine@400 185 ), # int8_4channel
amine@400 186 (
amine@257 187 "h",
amine@257 188 2,
amine@257 189 [[12592, 13620, 16697], [13106, 14134, 17218]],
amine@400 190 ), # int16_2channel
amine@400 191 ("i", 3, [[858927408], [926299444], [1128415545]]), # int32_3channel
amine@400 192 ],
amine@400 193 ids=[
amine@400 194 "int8_1channel",
amine@400 195 "int8_2channel",
amine@400 196 "int8_4channel",
amine@400 197 "int16_2channel",
amine@400 198 "int32_3channel",
amine@400 199 ],
amine@400 200 )
amine@400 201 def test_separate_channels(setup_data, numpy_fmt, fmt, channels, expected):
amine@400 202 data = setup_data
amine@400 203 result = signal_.separate_channels(data, fmt, channels)
amine@400 204 expected = [array_(fmt, exp) for exp in expected]
amine@400 205 expected_numpy_fmt = numpy_fmt[fmt]
amine@400 206 assert result == expected
amine@400 207 result_numpy = signal_numpy.separate_channels(
amine@400 208 data, numpy_fmt[fmt], channels
amine@257 209 )
amine@400 210 assert (result_numpy == expected).all()
amine@400 211 assert result_numpy.dtype == expected_numpy_fmt
amine@257 212
amine@257 213
amine@400 214 @pytest.mark.parametrize(
amine@400 215 "x, sample_width, expected",
amine@400 216 [
amine@400 217 ([300, 320, 400, 600], 2, 52.50624901923348), # simple
amine@400 218 ([0], 2, -200), # zero
amine@400 219 ([0, 0, 0], 2, -200), # zeros
amine@400 220 ],
amine@400 221 ids=["simple", "zero", "zeros"],
amine@400 222 )
amine@400 223 def test_calculate_energy_single_channel(x, sample_width, expected):
amine@400 224 x = array_(signal_.FORMAT[sample_width], x)
amine@400 225 energy = signal_.calculate_energy_single_channel(x, sample_width)
amine@400 226 assert energy == expected
amine@400 227 energy = signal_numpy.calculate_energy_single_channel(x, sample_width)
amine@400 228 assert energy == expected
amine@257 229
amine@400 230
amine@400 231 @pytest.mark.parametrize(
amine@400 232 "x, sample_width, aggregation_fn, expected",
amine@400 233 [
amine@400 234 (
amine@257 235 [[300, 320, 400, 600], [150, 160, 200, 300]],
amine@315 236 2,
amine@257 237 min,
amine@315 238 46.485649105953854,
amine@400 239 ), # min_
amine@400 240 (
amine@257 241 [[300, 320, 400, 600], [150, 160, 200, 300]],
amine@315 242 2,
amine@257 243 max,
amine@315 244 52.50624901923348,
amine@400 245 ), # max_
amine@400 246 ],
amine@400 247 ids=["min_", "max_"],
amine@400 248 )
amine@400 249 def test_calculate_energy_multichannel(
amine@400 250 x, sample_width, aggregation_fn, expected
amine@400 251 ):
amine@400 252 x = [array_(signal_.FORMAT[sample_width], xi) for xi in x]
amine@400 253 energy = signal_.calculate_energy_multichannel(
amine@400 254 x, sample_width, aggregation_fn
amine@257 255 )
amine@400 256 assert energy == expected
amine@400 257 energy = signal_numpy.calculate_energy_multichannel(
amine@400 258 x, sample_width, aggregation_fn
amine@400 259 )
amine@400 260 assert energy == expected