blob: 33fe65efd04b523c4db06e5c4d15dbe0d1a6d4cb [file] [log] [blame]
alexander3c798932021-03-26 21:42:19 +00001/*
Richard Burtonf32a86a2022-11-15 11:46:11 +00002 * SPDX-FileCopyrightText: Copyright 2021 Arm Limited and/or its affiliates <open-source-office@arm.com>
alexander3c798932021-03-26 21:42:19 +00003 * SPDX-License-Identifier: Apache-2.0
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17#include "AudioUtils.hpp"
18#include "catch.hpp"
19
20TEST_CASE("Common: Slide long data")
21{
22 std::vector<int> test{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
23
24 SECTION("Fit the data")
25 {
26 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
27
28 for (int i = 0 ; i < 10; ++i) {
29 REQUIRE(slider.HasNext());
30 REQUIRE(*slider.Next() == i + 1);
31 }
32
33 REQUIRE(!slider.HasNext());
34 REQUIRE(nullptr == slider.Next());
35 }
36
37 SECTION("Fit the data stride> window")
38 {
39 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 2, 3);
40
41 REQUIRE(slider.HasNext());
42 REQUIRE(*slider.Next() == 1);
43
44 REQUIRE(slider.HasNext());
45 REQUIRE(*slider.Next() == 4);
46
47 REQUIRE(slider.HasNext());
48 REQUIRE(*slider.Next() == 7);
49
50 REQUIRE(!slider.HasNext());
51 REQUIRE(nullptr == slider.Next());
52 }
53
54 SECTION("Fit the data stride < window")
55 {
56 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 5, 1);
57
58 for (int i = 0 ; i < 6; i++) {
59 REQUIRE(slider.HasNext());
60 REQUIRE(*slider.Next() == i + 1);
61 }
62
63 REQUIRE(!slider.HasNext());
64 REQUIRE(nullptr == slider.Next());
65 }
66}
67
68
69TEST_CASE("Common: Slide data size 1")
70{
71 std::vector<int> test{1};
72
73 SECTION("Fit the data")
74 {
75 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
76
77 REQUIRE(slider.HasNext());
78 REQUIRE(*slider.Next() == 1);
79 REQUIRE(!slider.HasNext());
80 REQUIRE(nullptr == slider.Next());
81 }
82
83 SECTION("Does not Fit the data because of big window")
84 {
85 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 2, 1);
86
87 REQUIRE(!slider.HasNext());
88 REQUIRE(nullptr == slider.Next());
89 }
90
91 SECTION("Does not Fit the data because of big stride")
92 {
93 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 2);
94
95 REQUIRE(slider.HasNext());
96 REQUIRE(*slider.Next() == 1);
97 REQUIRE(!slider.HasNext());
98 REQUIRE(nullptr == slider.Next());
99 }
100
101}
102
103
104TEST_CASE("Common: Slide reset")
105{
106 SECTION("current range")
107 {
108 std::vector<int> test{1};
109 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
110 int *saved = slider.Next();
111 slider.Reset();
112
113 REQUIRE(slider.Next() == saved);
114 }
115
116 SECTION("new range")
117 {
118 std::vector<int> test{1};
119 std::vector<int> test2{100};
120 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
121 slider.Next();
122 slider.Reset(test2.data());
123
124 REQUIRE(*slider.Next() == 100);
125 }
126}
127
128
129TEST_CASE("Common: Slide fast forward")
130{
131 std::vector<int> test{1, 2, 3, 4, 5};
132
133 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
134 SECTION("at the beginning") {
135 slider.FastForward(3);
136
137 REQUIRE(slider.HasNext());
138 REQUIRE(*slider.Next() == 4);
139 }
140
141 SECTION("in the middle")
142 {
143 slider.Next();
144 slider.FastForward(3);
145
146 REQUIRE(slider.HasNext());
147 REQUIRE(*slider.Next() == 4);
148 }
149
150 SECTION("at the end")
151 {
152 while(slider.HasNext()) {
153 slider.Next();
154 }
155 slider.FastForward(3);
156
157 REQUIRE(slider.HasNext());
158 REQUIRE(*slider.Next() == 4);
159 }
160
161 SECTION("out of the range")
162 {
163 slider.FastForward(100);
164
165 REQUIRE(!slider.HasNext());
166 REQUIRE(slider.Next() == nullptr);
167 }
168}
169
170
171TEST_CASE("Common: Slide Index")
172{
173 std::vector<int> test{1, 2, 3, 4, 5};
174 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
175 REQUIRE(slider.Index() == 0);
176 for (int i = 0; i < 5; i++) {
177 slider.Next();
178 REQUIRE(slider.Index() == i);
179 }
180}
181
182
183TEST_CASE("Common: Total strides")
184{
185 std::vector<int> test{1, 2, 3, 4, 5};
186
187 SECTION("Element by element")
188 {
189 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1);
190 REQUIRE(slider.TotalStrides() == 4 );
191 }
192
193 SECTION("Step through element")
194 {
195 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 2);
196 REQUIRE(slider.TotalStrides() == 2 );
197 }
198
199 SECTION("Window = data")
200 {
201 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 5, 2);
202 REQUIRE(slider.TotalStrides() == 0 );
203 }
204
205 SECTION("Window > data")
206 {
207 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 6, 2);
208 REQUIRE(slider.TotalStrides() == 0 );
209 }
210
211 SECTION("Window < data, not enough for the next stride")
212 {
213 auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 4, 2);
214 REQUIRE(slider.TotalStrides() == 0 );
215 }
216}
217
218
219TEST_CASE("Common: Next window data index")
220{
221 std::vector<int> test{1, 2, 3, 4, 5};
222
223 /* Check we get the correct index returned */
224 SECTION("Stride 1")
225 {
alexander80eecfb2021-07-06 19:47:59 +0100226 auto slider = arm::app::audio::FractionalSlidingWindow<int>(test.data(), test.size(), 1, 1);
alexander3c798932021-03-26 21:42:19 +0000227 REQUIRE(slider.NextWindowStartIndex() == 0);
228 slider.Next();
229 REQUIRE(slider.NextWindowStartIndex() == 1);
230 slider.Next();
231 REQUIRE(slider.NextWindowStartIndex() == 2);
232 slider.Next();
233 REQUIRE(slider.NextWindowStartIndex() == 3);
234 slider.Next();
235 REQUIRE(slider.NextWindowStartIndex() == 4);
236 slider.Next();
237 REQUIRE(slider.NextWindowStartIndex() == 5);
238 slider.Next();
239 REQUIRE(slider.NextWindowStartIndex() == 5);
240 }
241
242 SECTION("Stride 2")
243 {
alexander80eecfb2021-07-06 19:47:59 +0100244 auto slider = arm::app::audio::FractionalSlidingWindow<int>(test.data(), test.size(), 1, 2);
alexander3c798932021-03-26 21:42:19 +0000245 REQUIRE(slider.NextWindowStartIndex() == 0);
246 slider.Next();
247 REQUIRE(slider.NextWindowStartIndex() == 2);
248 REQUIRE(slider.NextWindowStartIndex() == 2);
249 slider.Next();
250 REQUIRE(slider.NextWindowStartIndex() == 4);
251 }
252
253 SECTION("Stride 3")
254 {
alexander80eecfb2021-07-06 19:47:59 +0100255 auto slider = arm::app::audio::FractionalSlidingWindow<int>(test.data(), test.size(), 1, 3);
alexander3c798932021-03-26 21:42:19 +0000256 REQUIRE(slider.NextWindowStartIndex() == 0);
257 slider.Next();
258 REQUIRE(slider.NextWindowStartIndex() == 3);
259 REQUIRE(slider.NextWindowStartIndex() == 3);
260 slider.Next();
261 REQUIRE(slider.NextWindowStartIndex() == 6);
262 REQUIRE(!slider.HasNext());
263 REQUIRE(slider.Next() == nullptr);
264 REQUIRE(slider.NextWindowStartIndex() == 6);
265 }
266}