/* * Copyright 2017 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "rtc_base/numerics/moving_percentile_filter.h" #include #include #include "test/gtest.h" namespace webrtc { // 25th percentile can be exactly found with a window of length 4. TEST(MovingPercentileFilter, Percentile25ReturnsMovingPercentile25WithWindow4) { MovingPercentileFilter perc25(0.25f, 4); const int64_t kSamples[10] = {1, 2, 3, 4, 4, 4, 5, 6, 7, 8}; const int64_t kExpectedFilteredValues[10] = {1, 1, 1, 1, 2, 3, 4, 4, 4, 5}; for (size_t i = 0; i < 10; ++i) { perc25.Insert(kSamples[i]); EXPECT_EQ(kExpectedFilteredValues[i], perc25.GetFilteredValue()); EXPECT_EQ(std::min(i + 1, 4), perc25.GetNumberOfSamplesStored()); } } // 90th percentile becomes the 67th percentile with a window of length 4. TEST(MovingPercentileFilter, Percentile90ReturnsMovingPercentile67WithWindow4) { MovingPercentileFilter perc67(0.67f, 4); MovingPercentileFilter perc90(0.9f, 4); const int64_t kSamples[8] = {1, 10, 1, 9, 1, 10, 1, 8}; const int64_t kExpectedFilteredValues[9] = {1, 1, 1, 9, 9, 9, 9, 8}; for (size_t i = 0; i < 8; ++i) { perc67.Insert(kSamples[i]); perc90.Insert(kSamples[i]); EXPECT_EQ(kExpectedFilteredValues[i], perc67.GetFilteredValue()); EXPECT_EQ(kExpectedFilteredValues[i], perc90.GetFilteredValue()); } } TEST(MovingMedianFilterTest, ProcessesNoSamples) { MovingMedianFilter filter(2); EXPECT_EQ(0, filter.GetFilteredValue()); EXPECT_EQ(0u, filter.GetNumberOfSamplesStored()); } TEST(MovingMedianFilterTest, ReturnsMovingMedianWindow5) { MovingMedianFilter filter(5); const int64_t kSamples[5] = {1, 5, 2, 3, 4}; const int64_t kExpectedFilteredValues[5] = {1, 1, 2, 2, 3}; for (size_t i = 0; i < 5; ++i) { filter.Insert(kSamples[i]); EXPECT_EQ(kExpectedFilteredValues[i], filter.GetFilteredValue()); EXPECT_EQ(i + 1, filter.GetNumberOfSamplesStored()); } } TEST(MovingMedianFilterTest, ReturnsMovingMedianWindow3) { MovingMedianFilter filter(3); const int64_t kSamples[5] = {1, 5, 2, 3, 4}; const int64_t kExpectedFilteredValues[5] = {1, 1, 2, 3, 3}; for (int i = 0; i < 5; ++i) { filter.Insert(kSamples[i]); EXPECT_EQ(kExpectedFilteredValues[i], filter.GetFilteredValue()); EXPECT_EQ(std::min(i + 1, 3), filter.GetNumberOfSamplesStored()); } } TEST(MovingMedianFilterTest, ReturnsMovingMedianWindow1) { MovingMedianFilter filter(1); const int64_t kSamples[5] = {1, 5, 2, 3, 4}; const int64_t kExpectedFilteredValues[5] = {1, 5, 2, 3, 4}; for (int i = 0; i < 5; ++i) { filter.Insert(kSamples[i]); EXPECT_EQ(kExpectedFilteredValues[i], filter.GetFilteredValue()); EXPECT_EQ(1u, filter.GetNumberOfSamplesStored()); } } } // namespace webrtc