// Copyright (c) FIRST and other WPILib contributors. // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. #include "frc/Timer.h" // NOLINT(build/include_order) #include "frc/simulation/SimHooks.h" #include "gtest/gtest.h" using namespace frc; namespace { class TimerTest : public ::testing::Test { protected: void SetUp() override { frc::sim::PauseTiming(); frc::sim::RestartTiming(); } void TearDown() override { frc::sim::ResumeTiming(); } }; } // namespace TEST_F(TimerTest, StartStop) { Timer timer; // Verify timer is initialized as stopped EXPECT_EQ(timer.Get(), 0_s); frc::sim::StepTiming(500_ms); EXPECT_EQ(timer.Get(), 0_s); // Verify timer increments after it's started timer.Start(); frc::sim::StepTiming(500_ms); EXPECT_EQ(timer.Get(), 500_ms); // Verify timer stops incrementing after it's stopped timer.Stop(); frc::sim::StepTiming(500_ms); EXPECT_EQ(timer.Get(), 500_ms); } TEST_F(TimerTest, Reset) { Timer timer; timer.Start(); // Advance timer to 500 ms EXPECT_EQ(timer.Get(), 0_s); frc::sim::StepTiming(500_ms); EXPECT_EQ(timer.Get(), 500_ms); // Verify timer reports 0 ms after reset timer.Reset(); EXPECT_EQ(timer.Get(), 0_s); // Verify timer continues incrementing frc::sim::StepTiming(500_ms); EXPECT_EQ(timer.Get(), 500_ms); // Verify timer doesn't start incrementing after reset if it was stopped timer.Stop(); timer.Reset(); frc::sim::StepTiming(500_ms); EXPECT_EQ(timer.Get(), 0_ms); } TEST_F(TimerTest, HasElapsed) { Timer timer; // Verify 0 ms has elapsed since timer hasn't started EXPECT_TRUE(timer.HasElapsed(0_s)); // Verify timer doesn't report elapsed time when stopped frc::sim::StepTiming(500_ms); EXPECT_FALSE(timer.HasElapsed(400_ms)); timer.Start(); // Verify timer reports >= 400 ms has elapsed after multiple calls frc::sim::StepTiming(500_ms); EXPECT_TRUE(timer.HasElapsed(400_ms)); EXPECT_TRUE(timer.HasElapsed(400_ms)); } TEST_F(TimerTest, AdvanceIfElapsed) { Timer timer; // Verify 0 ms has elapsed since timer hasn't started EXPECT_TRUE(timer.AdvanceIfElapsed(0_s)); // Verify timer doesn't report elapsed time when stopped frc::sim::StepTiming(500_ms); EXPECT_FALSE(timer.AdvanceIfElapsed(400_ms)); timer.Start(); // Verify timer reports >= 400 ms has elapsed for only first call frc::sim::StepTiming(500_ms); EXPECT_TRUE(timer.AdvanceIfElapsed(400_ms)); EXPECT_FALSE(timer.AdvanceIfElapsed(400_ms)); // Verify timer reports >= 400 ms has elapsed for two calls frc::sim::StepTiming(1_s); EXPECT_TRUE(timer.AdvanceIfElapsed(400_ms)); EXPECT_TRUE(timer.AdvanceIfElapsed(400_ms)); EXPECT_FALSE(timer.AdvanceIfElapsed(400_ms)); } TEST_F(TimerTest, GetFPGATimestamp) { auto start = frc::Timer::GetFPGATimestamp(); frc::sim::StepTiming(500_ms); auto end = frc::Timer::GetFPGATimestamp(); EXPECT_EQ(start + 500_ms, end); }