Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: content/browser/media/capture/time_weighted_average_unittest.cc

Issue 1097633005: FeedbackSignalAccumulator utility class for averaging feedback signals (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Naming and comment changes throughout, per hubbe's suggestions. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/media/capture/time_weighted_average.h"
6
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace content {
10
11 class TimeWeightedAverageTest : public ::testing::Test {
12 public:
13 TimeWeightedAverageTest()
14 : half_life_(base::TimeDelta::FromSeconds(1)),
15 average_(half_life_),
16 t_(base::TimeTicks() + base::TimeDelta::FromSeconds(120)) {
17 average_.Reset(0.0, t_);
18 }
19
20 protected:
21 const base::TimeDelta half_life_;
22 TimeWeightedAverage average_;
23 base::TimeTicks t_;
24 };
25
26 TEST_F(TimeWeightedAverageTest, HasCorrectStartingValueAfterReset) {
27 ASSERT_EQ(0.0, average_.current());
28 ASSERT_EQ(t_, average_.last_reset_time());
29 ASSERT_EQ(t_, average_.latest_timestamp());
30
31 average_.Reset(1.0, t_);
32 ASSERT_EQ(1.0, average_.current());
33 ASSERT_EQ(t_, average_.last_reset_time());
34 ASSERT_EQ(t_, average_.latest_timestamp());
35
36 t_ += half_life_;
37 average_.Reset(2.0, t_);
38 ASSERT_EQ(2.0, average_.current());
39 ASSERT_EQ(t_, average_.last_reset_time());
40 ASSERT_EQ(t_, average_.latest_timestamp());
41 }
42
43 TEST_F(TimeWeightedAverageTest, DoesNotUpdateIfBeforeResetTime) {
44 average_.Reset(0.0, t_);
45 ASSERT_EQ(0.0, average_.current());
46 ASSERT_EQ(t_, average_.latest_timestamp());
47
48 const base::TimeTicks one_usec_before =
49 t_ - base::TimeDelta::FromMicroseconds(1);
50 ASSERT_FALSE(average_.Update(1.0, one_usec_before));
51 ASSERT_EQ(0.0, average_.current());
52 ASSERT_EQ(t_, average_.latest_timestamp());
53
54 const base::TimeTicks one_usec_after =
55 t_ + base::TimeDelta::FromMicroseconds(1);
56 ASSERT_TRUE(average_.Update(1.0, one_usec_after));
57 ASSERT_LT(0.0, average_.current());
58 ASSERT_EQ(one_usec_after, average_.latest_timestamp());
59 }
60
61 TEST_F(TimeWeightedAverageTest,
62 DoesArithmeticAverageIfAllUpdatesAreAtResetTime) {
63 average_.Reset(0.0, t_);
64 ASSERT_EQ(0.0, average_.current());
65 ASSERT_EQ(t_, average_.latest_timestamp());
66
67 ASSERT_TRUE(average_.Update(1.0, t_));
68 ASSERT_EQ(0.5, average_.current());
69 ASSERT_EQ(t_, average_.latest_timestamp());
70
71 ASSERT_TRUE(average_.Update(2.0, t_));
72 ASSERT_EQ(1.0, average_.current());
73 ASSERT_EQ(t_, average_.latest_timestamp());
74
75 ASSERT_TRUE(average_.Update(3.0, t_));
76 ASSERT_EQ(1.5, average_.current());
77 ASSERT_EQ(t_, average_.latest_timestamp());
78 }
79
80 TEST_F(TimeWeightedAverageTest, HandlesUpdatesWithSameTimestamp) {
81 average_.Reset(0.0, t_);
82 ASSERT_EQ(0.0, average_.current());
83 ASSERT_EQ(t_, average_.latest_timestamp());
84 t_ += 1 * half_life_;
85
86 // Update with an identical value at the same timestamp.
87 for (int i = 0; i < 3; ++i) {
88 ASSERT_TRUE(average_.Update(1.0, t_));
89 ASSERT_EQ(0.5, average_.current());
90 ASSERT_EQ(t_, average_.latest_timestamp());
91 }
92
93 // Now continue updating with different values at the same timestamp.
94 ASSERT_TRUE(average_.Update(2.0, t_));
95 ASSERT_EQ(0.625, average_.current());
96 ASSERT_EQ(t_, average_.latest_timestamp());
97 ASSERT_TRUE(average_.Update(3.0, t_));
98 ASSERT_EQ(0.8, average_.current());
99 ASSERT_EQ(t_, average_.latest_timestamp());
100 ASSERT_TRUE(average_.Update(4.0, t_));
101 ASSERT_EQ(1.0, average_.current());
102 ASSERT_EQ(t_, average_.latest_timestamp());
103 }
104
105 TEST_F(TimeWeightedAverageTest, ProvidesExpectedInputHoldResponse) {
106 // Step one half-life interval per update.
107 average_.Reset(0.0, t_);
108 ASSERT_EQ(0.0, average_.current());
109 ASSERT_EQ(t_, average_.latest_timestamp());
110 t_ += 1 * half_life_;
111 ASSERT_TRUE(average_.Update(1.0, t_));
112 ASSERT_EQ(0.5, average_.current());
113 ASSERT_EQ(t_, average_.latest_timestamp());
114 t_ += 1 * half_life_;
115 ASSERT_TRUE(average_.Update(1.0, t_));
116 ASSERT_EQ(0.75, average_.current());
117 ASSERT_EQ(t_, average_.latest_timestamp());
118 t_ += 1 * half_life_;
119 ASSERT_TRUE(average_.Update(1.0, t_));
120 ASSERT_EQ(0.875, average_.current());
121 ASSERT_EQ(t_, average_.latest_timestamp());
122 t_ += 1 * half_life_;
123 ASSERT_TRUE(average_.Update(1.0, t_));
124 ASSERT_EQ(0.9375, average_.current());
125 ASSERT_EQ(t_, average_.latest_timestamp());
126
127 // Step two half-life intervals per update.
128 average_.Reset(0.0, t_);
129 ASSERT_EQ(0.0, average_.current());
130 ASSERT_EQ(t_, average_.latest_timestamp());
131 t_ += 2 * half_life_;
132 ASSERT_TRUE(average_.Update(1.0, t_));
133 ASSERT_NEAR(0.666666667, average_.current(), 0.000000001);
134 ASSERT_EQ(t_, average_.latest_timestamp());
135 t_ += 2 * half_life_;
136 ASSERT_TRUE(average_.Update(1.0, t_));
137 ASSERT_NEAR(0.888888889, average_.current(), 0.000000001);
138 ASSERT_EQ(t_, average_.latest_timestamp());
139 t_ += 2 * half_life_;
140 ASSERT_TRUE(average_.Update(1.0, t_));
141 ASSERT_NEAR(0.962962963, average_.current(), 0.000000001);
142 ASSERT_EQ(t_, average_.latest_timestamp());
143 t_ += 2 * half_life_;
144 ASSERT_TRUE(average_.Update(1.0, t_));
145 ASSERT_NEAR(0.987654321, average_.current(), 0.000000001);
146 ASSERT_EQ(t_, average_.latest_timestamp());
147
148 // Step three half-life intervals per update.
149 average_.Reset(0.0, t_);
150 ASSERT_EQ(0.0, average_.current());
151 ASSERT_EQ(t_, average_.latest_timestamp());
152 t_ += 3 * half_life_;
153 ASSERT_TRUE(average_.Update(1.0, t_));
154 ASSERT_EQ(0.75, average_.current());
155 ASSERT_EQ(t_, average_.latest_timestamp());
156 t_ += 3 * half_life_;
157 ASSERT_TRUE(average_.Update(1.0, t_));
158 ASSERT_EQ(0.9375, average_.current());
159 ASSERT_EQ(t_, average_.latest_timestamp());
160 t_ += 3 * half_life_;
161 ASSERT_TRUE(average_.Update(1.0, t_));
162 ASSERT_EQ(0.984375, average_.current());
163 ASSERT_EQ(t_, average_.latest_timestamp());
164 t_ += 3 * half_life_;
165 ASSERT_TRUE(average_.Update(1.0, t_));
166 ASSERT_EQ(0.99609375, average_.current());
167 ASSERT_EQ(t_, average_.latest_timestamp());
168 }
169
170 TEST_F(TimeWeightedAverageTest, AccountsForUpdatesThatAreOneStepOutOfOrder) {
171 // Compute results at each step when updates are made in-order.
172 average_.Reset(0.0, t_);
173 ASSERT_EQ(0.0, average_.current());
174 ASSERT_EQ(t_, average_.latest_timestamp());
175 double input_values[5];
176 base::TimeTicks timestamps[5];
177 double results[5];
178 for (int i = 0; i < 5; ++i) {
179 input_values[i] = i + 1;
180 timestamps[i] = t_ + (i + 1) * half_life_;
181 ASSERT_TRUE(average_.Update(input_values[i], timestamps[i]));
182 results[i] = average_.current();
183 }
184
185 // Now reset and update out-of-order, checking for the same results along the
186 // way.
187 average_.Reset(0.0, t_);
188 ASSERT_TRUE(average_.Update(input_values[0], timestamps[0]));
189 ASSERT_EQ(results[0], average_.current());
190 ASSERT_TRUE(average_.Update(input_values[2], timestamps[2]));
191 ASSERT_TRUE(average_.Update(input_values[1], timestamps[1]));
192 ASSERT_EQ(results[2], average_.current());
193 ASSERT_TRUE(average_.Update(input_values[4], timestamps[4]));
194 ASSERT_TRUE(average_.Update(input_values[3], timestamps[3]));
195 ASSERT_EQ(results[4], average_.current());
196 }
197
198 TEST_F(TimeWeightedAverageTest, IgnoresUpdatesThatAreTwoOrMoreStepsOutOfOrder) {
199 // First, go forward several steps, in order.
200 average_.Reset(0.0, t_);
201 ASSERT_EQ(0.0, average_.current());
202 ASSERT_EQ(t_, average_.latest_timestamp());
203 t_ += 1 * half_life_;
204 ASSERT_TRUE(average_.Update(2.0, t_));
205 ASSERT_EQ(1.0, average_.current());
206 ASSERT_EQ(t_, average_.latest_timestamp());
207 t_ += 1 * half_life_;
208 ASSERT_TRUE(average_.Update(2.0, t_));
209 ASSERT_EQ(1.5, average_.current());
210 ASSERT_EQ(t_, average_.latest_timestamp());
211 t_ += 1 * half_life_;
212 ASSERT_TRUE(average_.Update(2.0, t_));
213 ASSERT_EQ(1.75, average_.current());
214 ASSERT_EQ(t_, average_.latest_timestamp());
215 t_ += 1 * half_life_;
216 ASSERT_TRUE(average_.Update(2.0, t_));
217 ASSERT_EQ(1.875, average_.current());
218 ASSERT_EQ(t_, average_.latest_timestamp());
219
220 // Go back 2 steps, then 2.5, then 3, then 3.5, etc. and expect the update to
221 // fail each time.
222 base::TimeTicks earlier = t_ - 2 * half_life_;
223 for (int i = 0; i < 3; ++i) {
224 ASSERT_FALSE(average_.Update(999.0, earlier));
225 ASSERT_EQ(1.875, average_.current());
226 ASSERT_EQ(t_, average_.latest_timestamp());
227 earlier -= half_life_ / 2;
228 }
229 }
230
231 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698