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);
+    }
+}
