blob: 7084204fabf3fb78d592d6e49ae2e34c8522dfc9 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/scenic/lib/scheduling/duration_predictor.h"
#include <lib/gtest/test_loop_fixture.h>
namespace scheduling {
namespace test {
TEST(DurationPredictor, FirstPredictionIsInitialPrediction) {
const size_t kWindowSize = 4;
const zx::duration kInitialPrediction = zx::usec(500);
DurationPredictor predictor(kWindowSize, kInitialPrediction);
EXPECT_EQ(predictor.GetPrediction(), kInitialPrediction);
}
TEST(DurationPredictor, PredictionAfterWindowFlushIsMeasurement) {
const size_t kWindowSize = 4;
const zx::duration kInitialPrediction = zx::msec(1);
DurationPredictor predictor(kWindowSize, kInitialPrediction);
const zx::duration measurement = zx::msec(5);
EXPECT_GT(measurement, kInitialPrediction);
predictor.InsertNewMeasurement(measurement);
for (size_t i = 0; i < kWindowSize - 1; ++i) {
predictor.InsertNewMeasurement(measurement);
}
EXPECT_EQ(predictor.GetPrediction(), measurement);
}
TEST(DurationPredictor, PredictionIsLargestInWindowAsMeasurementsIncrease) {
size_t window_size = 10;
DurationPredictor predictor(window_size, /* initial prediction */ zx::usec(0));
for (size_t i = 1; i <= window_size; ++i) {
predictor.InsertNewMeasurement(zx::msec(i));
EXPECT_EQ(predictor.GetPrediction(), zx::msec(i));
}
}
TEST(DurationPredictor, PredictionIsLargestInWindowAsMeasurementsDecrease) {
size_t window_size = 10;
DurationPredictor predictor(window_size, /* initial prediction */ zx::usec(0));
for (size_t i = window_size; i > 0; --i) {
predictor.InsertNewMeasurement(zx::msec(i));
EXPECT_EQ(predictor.GetPrediction(), zx::msec(window_size));
}
}
TEST(DurationPredictor, PredictionIsLargestInWindow) {
size_t window_size = 10;
DurationPredictor predictor(window_size, /* initial prediction */ zx::usec(0));
const std::vector<zx::duration> measurements{
zx::msec(12), zx::msec(4), zx::msec(5), zx::msec(2), zx::msec(8),
zx::msec(15), zx::msec(13), zx::msec(6), zx::msec(8), zx::msec(9)};
for (const auto& m : measurements) {
predictor.InsertNewMeasurement(m);
}
EXPECT_EQ(predictor.GetPrediction(), zx::msec(15));
}
TEST(DurationPredictor, MaxIsResetWhenLargestIsOutOfWindow) {
size_t window_size = 4;
DurationPredictor predictor(window_size, /* initial prediction */ zx::usec(0));
const std::vector<zx::duration> measurements{
zx::msec(12), zx::msec(4), zx::msec(5), zx::msec(2), zx::msec(8),
zx::msec(55), zx::msec(13), zx::msec(6), zx::msec(8), zx::msec(9)};
for (const auto& m : measurements) {
predictor.InsertNewMeasurement(m);
}
EXPECT_EQ(predictor.GetPrediction(), zx::msec(13));
}
TEST(DurationPredictor, WindowSizeOfOneWorks) {
size_t window_size = 1;
DurationPredictor predictor(window_size, /* initial prediction */ zx::usec(0));
for (size_t i = 0; i < 5; ++i) {
predictor.InsertNewMeasurement(zx::msec(i));
}
EXPECT_EQ(predictor.GetPrediction(), zx::msec(4));
}
} // namespace test
} // namespace scheduling