1 /*
2  *  Copyright (c) 2021 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "modules/audio_processing/agc2/clipping_predictor_level_buffer.h"
12 
13 #include <algorithm>
14 
15 #include "test/gmock.h"
16 #include "test/gtest.h"
17 
18 namespace webrtc {
19 namespace {
20 
21 using ::testing::Eq;
22 using ::testing::Optional;
23 
24 class ClippingPredictorLevelBufferParametrization
25     : public ::testing::TestWithParam<int> {
26  protected:
capacity() const27   int capacity() const { return GetParam(); }
28 };
29 
TEST_P(ClippingPredictorLevelBufferParametrization,CheckEmptyBufferSize)30 TEST_P(ClippingPredictorLevelBufferParametrization, CheckEmptyBufferSize) {
31   ClippingPredictorLevelBuffer buffer(capacity());
32   EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
33   EXPECT_EQ(buffer.Size(), 0);
34 }
35 
TEST_P(ClippingPredictorLevelBufferParametrization,CheckHalfEmptyBufferSize)36 TEST_P(ClippingPredictorLevelBufferParametrization, CheckHalfEmptyBufferSize) {
37   ClippingPredictorLevelBuffer buffer(capacity());
38   for (int i = 0; i < buffer.Capacity() / 2; ++i) {
39     buffer.Push({2, 4});
40   }
41   EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
42   EXPECT_EQ(buffer.Size(), std::max(capacity(), 1) / 2);
43 }
44 
TEST_P(ClippingPredictorLevelBufferParametrization,CheckFullBufferSize)45 TEST_P(ClippingPredictorLevelBufferParametrization, CheckFullBufferSize) {
46   ClippingPredictorLevelBuffer buffer(capacity());
47   for (int i = 0; i < buffer.Capacity(); ++i) {
48     buffer.Push({2, 4});
49   }
50   EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
51   EXPECT_EQ(buffer.Size(), std::max(capacity(), 1));
52 }
53 
TEST_P(ClippingPredictorLevelBufferParametrization,CheckLargeBufferSize)54 TEST_P(ClippingPredictorLevelBufferParametrization, CheckLargeBufferSize) {
55   ClippingPredictorLevelBuffer buffer(capacity());
56   for (int i = 0; i < 2 * buffer.Capacity(); ++i) {
57     buffer.Push({2, 4});
58   }
59   EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
60   EXPECT_EQ(buffer.Size(), std::max(capacity(), 1));
61 }
62 
TEST_P(ClippingPredictorLevelBufferParametrization,CheckSizeAfterReset)63 TEST_P(ClippingPredictorLevelBufferParametrization, CheckSizeAfterReset) {
64   ClippingPredictorLevelBuffer buffer(capacity());
65   buffer.Push({1, 1});
66   buffer.Push({1, 1});
67   buffer.Reset();
68   EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
69   EXPECT_EQ(buffer.Size(), 0);
70   buffer.Push({1, 1});
71   EXPECT_EQ(buffer.Capacity(), std::max(capacity(), 1));
72   EXPECT_EQ(buffer.Size(), 1);
73 }
74 
75 INSTANTIATE_TEST_SUITE_P(ClippingPredictorLevelBufferTest,
76                          ClippingPredictorLevelBufferParametrization,
77                          ::testing::Values(-1, 0, 1, 123));
78 
TEST(ClippingPredictorLevelBufferTest,CheckMetricsAfterFullBuffer)79 TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterFullBuffer) {
80   ClippingPredictorLevelBuffer buffer(/*capacity=*/2);
81   buffer.Push({1, 2});
82   buffer.Push({3, 6});
83   EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/1),
84               Optional(Eq(ClippingPredictorLevelBuffer::Level{3, 6})));
85   EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/1, /*num_items=*/1),
86               Optional(Eq(ClippingPredictorLevelBuffer::Level{1, 2})));
87   EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/2),
88               Optional(Eq(ClippingPredictorLevelBuffer::Level{2, 6})));
89 }
90 
TEST(ClippingPredictorLevelBufferTest,CheckMetricsAfterPushBeyondCapacity)91 TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterPushBeyondCapacity) {
92   ClippingPredictorLevelBuffer buffer(/*capacity=*/2);
93   buffer.Push({1, 1});
94   buffer.Push({3, 6});
95   buffer.Push({5, 10});
96   buffer.Push({7, 14});
97   buffer.Push({6, 12});
98   EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/1),
99               Optional(Eq(ClippingPredictorLevelBuffer::Level{6, 12})));
100   EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/1, /*num_items=*/1),
101               Optional(Eq(ClippingPredictorLevelBuffer::Level{7, 14})));
102   EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/2),
103               Optional(Eq(ClippingPredictorLevelBuffer::Level{6.5f, 14})));
104 }
105 
TEST(ClippingPredictorLevelBufferTest,CheckMetricsAfterTooFewItems)106 TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterTooFewItems) {
107   ClippingPredictorLevelBuffer buffer(/*capacity=*/4);
108   buffer.Push({1, 2});
109   buffer.Push({3, 6});
110   EXPECT_EQ(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/3),
111             absl::nullopt);
112   EXPECT_EQ(buffer.ComputePartialMetrics(/*delay=*/2, /*num_items=*/1),
113             absl::nullopt);
114 }
115 
TEST(ClippingPredictorLevelBufferTest,CheckMetricsAfterReset)116 TEST(ClippingPredictorLevelBufferTest, CheckMetricsAfterReset) {
117   ClippingPredictorLevelBuffer buffer(/*capacity=*/2);
118   buffer.Push({1, 2});
119   buffer.Reset();
120   buffer.Push({5, 10});
121   buffer.Push({7, 14});
122   EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/1),
123               Optional(Eq(ClippingPredictorLevelBuffer::Level{7, 14})));
124   EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/0, /*num_items=*/2),
125               Optional(Eq(ClippingPredictorLevelBuffer::Level{6, 14})));
126   EXPECT_THAT(buffer.ComputePartialMetrics(/*delay=*/1, /*num_items=*/1),
127               Optional(Eq(ClippingPredictorLevelBuffer::Level{5, 10})));
128 }
129 
130 }  // namespace
131 }  // namespace webrtc
132