diff options
author | alexander <alexander.efremov@arm.com> | 2021-03-26 21:42:19 +0000 |
---|---|---|
committer | Kshitij Sisodia <kshitij.sisodia@arm.com> | 2021-03-29 16:29:55 +0100 |
commit | 3c79893217bc632c9b0efa815091bef3c779490c (patch) | |
tree | ad06b444557eb8124652b45621d736fa1b92f65d /tests/common/SlidingWindowTests.cc | |
parent | 6ad6d55715928de72979b04194da1bdf04a4c51b (diff) | |
download | ml-embedded-evaluation-kit-3c79893217bc632c9b0efa815091bef3c779490c.tar.gz |
Opensource ML embedded evaluation kit21.03
Change-Id: I12e807f19f5cacad7cef82572b6dd48252fd61fd
Diffstat (limited to 'tests/common/SlidingWindowTests.cc')
-rw-r--r-- | tests/common/SlidingWindowTests.cc | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/tests/common/SlidingWindowTests.cc b/tests/common/SlidingWindowTests.cc new file mode 100644 index 0000000..bfdb5b7 --- /dev/null +++ b/tests/common/SlidingWindowTests.cc @@ -0,0 +1,266 @@ +/* + * Copyright (c) 2021 Arm Limited. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "AudioUtils.hpp" +#include "catch.hpp" + +TEST_CASE("Common: Slide long data") +{ + std::vector<int> test{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + + SECTION("Fit the data") + { + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1); + + for (int i = 0 ; i < 10; ++i) { + REQUIRE(slider.HasNext()); + REQUIRE(*slider.Next() == i + 1); + } + + REQUIRE(!slider.HasNext()); + REQUIRE(nullptr == slider.Next()); + } + + SECTION("Fit the data stride> window") + { + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 2, 3); + + REQUIRE(slider.HasNext()); + REQUIRE(*slider.Next() == 1); + + REQUIRE(slider.HasNext()); + REQUIRE(*slider.Next() == 4); + + REQUIRE(slider.HasNext()); + REQUIRE(*slider.Next() == 7); + + REQUIRE(!slider.HasNext()); + REQUIRE(nullptr == slider.Next()); + } + + SECTION("Fit the data stride < window") + { + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 5, 1); + + for (int i = 0 ; i < 6; i++) { + REQUIRE(slider.HasNext()); + REQUIRE(*slider.Next() == i + 1); + } + + REQUIRE(!slider.HasNext()); + REQUIRE(nullptr == slider.Next()); + } +} + + +TEST_CASE("Common: Slide data size 1") +{ + std::vector<int> test{1}; + + SECTION("Fit the data") + { + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1); + + REQUIRE(slider.HasNext()); + REQUIRE(*slider.Next() == 1); + REQUIRE(!slider.HasNext()); + REQUIRE(nullptr == slider.Next()); + } + + SECTION("Does not Fit the data because of big window") + { + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 2, 1); + + REQUIRE(!slider.HasNext()); + REQUIRE(nullptr == slider.Next()); + } + + SECTION("Does not Fit the data because of big stride") + { + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 2); + + REQUIRE(slider.HasNext()); + REQUIRE(*slider.Next() == 1); + REQUIRE(!slider.HasNext()); + REQUIRE(nullptr == slider.Next()); + } + +} + + +TEST_CASE("Common: Slide reset") +{ + SECTION("current range") + { + std::vector<int> test{1}; + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1); + int *saved = slider.Next(); + slider.Reset(); + + REQUIRE(slider.Next() == saved); + } + + SECTION("new range") + { + std::vector<int> test{1}; + std::vector<int> test2{100}; + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1); + slider.Next(); + slider.Reset(test2.data()); + + REQUIRE(*slider.Next() == 100); + } +} + + +TEST_CASE("Common: Slide fast forward") +{ + std::vector<int> test{1, 2, 3, 4, 5}; + + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1); + SECTION("at the beginning") { + slider.FastForward(3); + + REQUIRE(slider.HasNext()); + REQUIRE(*slider.Next() == 4); + } + + SECTION("in the middle") + { + slider.Next(); + slider.FastForward(3); + + REQUIRE(slider.HasNext()); + REQUIRE(*slider.Next() == 4); + } + + SECTION("at the end") + { + while(slider.HasNext()) { + slider.Next(); + } + slider.FastForward(3); + + REQUIRE(slider.HasNext()); + REQUIRE(*slider.Next() == 4); + } + + SECTION("out of the range") + { + slider.FastForward(100); + + REQUIRE(!slider.HasNext()); + REQUIRE(slider.Next() == nullptr); + } +} + + +TEST_CASE("Common: Slide Index") +{ + std::vector<int> test{1, 2, 3, 4, 5}; + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1); + REQUIRE(slider.Index() == 0); + for (int i = 0; i < 5; i++) { + slider.Next(); + REQUIRE(slider.Index() == i); + } +} + + +TEST_CASE("Common: Total strides") +{ + std::vector<int> test{1, 2, 3, 4, 5}; + + SECTION("Element by element") + { + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 1); + REQUIRE(slider.TotalStrides() == 4 ); + } + + SECTION("Step through element") + { + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 1, 2); + REQUIRE(slider.TotalStrides() == 2 ); + } + + SECTION("Window = data") + { + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 5, 2); + REQUIRE(slider.TotalStrides() == 0 ); + } + + SECTION("Window > data") + { + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 6, 2); + REQUIRE(slider.TotalStrides() == 0 ); + } + + SECTION("Window < data, not enough for the next stride") + { + auto slider = arm::app::audio::SlidingWindow<int>(test.data(), test.size(), 4, 2); + REQUIRE(slider.TotalStrides() == 0 ); + } +} + + +TEST_CASE("Common: Next window data index") +{ + std::vector<int> test{1, 2, 3, 4, 5}; + + /* Check we get the correct index returned */ + SECTION("Stride 1") + { + auto slider = arm::app::audio::ASRSlidingWindow<int>(test.data(), test.size(), 1, 1); + REQUIRE(slider.NextWindowStartIndex() == 0); + slider.Next(); + REQUIRE(slider.NextWindowStartIndex() == 1); + slider.Next(); + REQUIRE(slider.NextWindowStartIndex() == 2); + slider.Next(); + REQUIRE(slider.NextWindowStartIndex() == 3); + slider.Next(); + REQUIRE(slider.NextWindowStartIndex() == 4); + slider.Next(); + REQUIRE(slider.NextWindowStartIndex() == 5); + slider.Next(); + REQUIRE(slider.NextWindowStartIndex() == 5); + } + + SECTION("Stride 2") + { + auto slider = arm::app::audio::ASRSlidingWindow<int>(test.data(), test.size(), 1, 2); + REQUIRE(slider.NextWindowStartIndex() == 0); + slider.Next(); + REQUIRE(slider.NextWindowStartIndex() == 2); + REQUIRE(slider.NextWindowStartIndex() == 2); + slider.Next(); + REQUIRE(slider.NextWindowStartIndex() == 4); + } + + SECTION("Stride 3") + { + auto slider = arm::app::audio::ASRSlidingWindow<int>(test.data(), test.size(), 1, 3); + REQUIRE(slider.NextWindowStartIndex() == 0); + slider.Next(); + REQUIRE(slider.NextWindowStartIndex() == 3); + REQUIRE(slider.NextWindowStartIndex() == 3); + slider.Next(); + REQUIRE(slider.NextWindowStartIndex() == 6); + REQUIRE(!slider.HasNext()); + REQUIRE(slider.Next() == nullptr); + REQUIRE(slider.NextWindowStartIndex() == 6); + } +} |