blob: b1625c14d17bf309f5581af4564123bc6d5e2f82 [file] [log] [blame]
// Copyright 2017 The Chromium 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 "chrome/browser/vr/fps_meter.h"
#include "base/macros.h"
#include "chrome/browser/vr/test/animation_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace vr {
namespace {
static constexpr double kTolerance = 0.01;
} // namespace
TEST(FPSMeter, GetFPSWithTooFewFrames) {
FPSMeter meter;
EXPECT_FALSE(meter.CanComputeFPS());
EXPECT_FLOAT_EQ(0.0, meter.GetFPS());
meter.AddFrame(MicrosecondsToTicks(16000));
EXPECT_FALSE(meter.CanComputeFPS());
EXPECT_FLOAT_EQ(0.0, meter.GetFPS());
meter.AddFrame(MicrosecondsToTicks(32000));
EXPECT_TRUE(meter.CanComputeFPS());
EXPECT_LT(0.0, meter.GetFPS());
}
TEST(FPSMeter, AccurateFPSWithManyFrames) {
FPSMeter meter;
EXPECT_FALSE(meter.CanComputeFPS());
EXPECT_FLOAT_EQ(0.0, meter.GetFPS());
base::TimeTicks now = MicrosecondsToTicks(1);
base::TimeDelta frame_time = MicrosecondsToDelta(16666);
meter.AddFrame(now);
EXPECT_FALSE(meter.CanComputeFPS());
EXPECT_FLOAT_EQ(0.0, meter.GetFPS());
for (size_t i = 0; i < 2 * meter.GetNumFrameTimes(); ++i) {
now += frame_time;
meter.AddFrame(now);
EXPECT_TRUE(meter.CanComputeFPS());
EXPECT_NEAR(60.0, meter.GetFPS(), kTolerance);
}
}
TEST(FPSMeter, AccurateFPSWithHigherFramerate) {
FPSMeter meter;
EXPECT_FALSE(meter.CanComputeFPS());
EXPECT_FLOAT_EQ(0.0, meter.GetFPS());
base::TimeTicks now = MicrosecondsToTicks(1);
base::TimeDelta frame_time = base::TimeDelta::FromSecondsD(1.0 / 90.0);
meter.AddFrame(now);
EXPECT_FALSE(meter.CanComputeFPS());
EXPECT_FLOAT_EQ(0.0, meter.GetFPS());
for (int i = 0; i < 5; ++i) {
now += frame_time;
meter.AddFrame(now);
EXPECT_TRUE(meter.CanComputeFPS());
EXPECT_NEAR(1.0 / frame_time.InSecondsF(), meter.GetFPS(), kTolerance);
}
}
} // namespace vr