Fix off by one error in TimerRemaining::remaining(). Add test cases for Timer.

This commit is contained in:
Marek Bel 2018-06-12 02:24:52 +02:00
parent 490f0c9620
commit d669b4e93a
2 changed files with 146 additions and 20 deletions

View File

@ -37,14 +37,7 @@ public:
if (!running()) return 0; if (!running()) return 0;
if (expired()) return 0; if (expired()) return 0;
const unsigned long now = millis(); const unsigned long now = millis();
if ((started() <= started() + m_period) || (now < started())) return (started() + m_period - now);
{
return (started() + m_period - now);
}
else //(now >= m_started)
{
return ULONG_MAX - now + (started() + m_period);
}
} }
/** /**
* @brief Timer has expired. * @brief Timer has expired.

View File

@ -8,31 +8,164 @@
#include "../Firmware/Timer.h" #include "../Firmware/Timer.h"
#include "../Firmware/TimerRemaining.h" #include "../Firmware/TimerRemaining.h"
static unsigned long now = 0;
unsigned long millis() unsigned long millis()
{ {
return 1; return now;
} }
TEST_CASE( "LongTimer tested.", "[timer]" ) static void basicTimer()
{ {
LongTimer timer; LongTimer timer;
REQUIRE( timer.running() == false); CHECK( timer.running() == false);
timer.start(); timer.start();
REQUIRE( timer.running() == true); CHECK( timer.running() == true);
timer.stop(); timer.stop();
REQUIRE( timer.running() == false); CHECK( timer.running() == false);
timer.start(); timer.start();
REQUIRE( timer.expired(0) == true ); CHECK( timer.expired(0) == true);
REQUIRE( timer.expired(0) == false ); CHECK( timer.expired(0) == false);
REQUIRE( timer.running() == false); CHECK( timer.running() == false);
timer.start(); timer.start();
REQUIRE( timer.expired(1) == false ); CHECK( timer.expired(1) == false);
REQUIRE( timer.running() == true); CHECK( timer.running() == true);
++now;
CHECK( timer.expired(1) == true);
CHECK( timer.running() == false);
--now;
timer.start();
CHECK( timer.expired(ULONG_MAX - 1) == false);
now+= ULONG_MAX - 2;
CHECK( timer.expired(ULONG_MAX - 1) == false);
now++;
CHECK( timer.expired(ULONG_MAX - 1) == true);
CHECK( timer.running() == false);
now-= ULONG_MAX - 1;
timer.start();
CHECK( timer.expired(ULONG_MAX) == false);
now+= ULONG_MAX - 1;
CHECK( timer.expired(ULONG_MAX) == false);
now++;
CHECK( timer.expired(ULONG_MAX) == true);
CHECK( timer.running() == false);
now-= ULONG_MAX;
timer.start();
CHECK( timer.running() == true);
CHECK( timer.expired(12*3600000ul + 38*60000ul + 15000) == false);
now+= 12*3600000ul + 38*60000ul + 14999;
CHECK( timer.expired(12*3600000ul + 38*60000ul + 15000) == false);
++now;
CHECK( timer.expired(12*3600000ul + 38*60000ul + 15000) == true);
CHECK( timer.running() == false);
now-= 12*3600000ul + 38*60000ul + 15000;
}
TEST_CASE( "LongTimer test.", "[timer]" )
{
now = 0;
basicTimer();
now = 1;
basicTimer();
now = ULONG_MAX;
basicTimer();
now = ULONG_MAX - 1;
basicTimer();
now = 12*3600000ul + 38*60000ul + 15000;
basicTimer();
}
static void basicRemaining()
{
TimerRemaining timer;
CHECK( timer.running() == false);
CHECK( timer.remaining() == 0);
timer.start(100);
CHECK( timer.running() == true);
CHECK( timer.remaining() == 100);
now += 99;
CHECK( timer.running() == true);
CHECK( timer.remaining() == 1);
++now;
CHECK( timer.running() == true);
CHECK( timer.remaining() == 0);
CHECK( timer.running() == false);
now -=100;
timer.start(1);
timer.stop();
CHECK( timer.remaining() == 0);
CHECK( timer.running() == false);
timer.start(0);
CHECK( timer.remaining() == 0);
CHECK( timer.running() == false);
timer.start(1);
CHECK( timer.remaining() == 1);
CHECK( timer.running() == true);
++now;
CHECK( timer.running() == true);
CHECK( timer.remaining() == 0);
CHECK( timer.running() == false);
--now;
timer.start(ULONG_MAX - 1);
CHECK( timer.running() == true);
CHECK( timer.remaining() == ULONG_MAX - 1);
now+= ULONG_MAX - 2;
CHECK( timer.running() == true);
CHECK( timer.remaining() == 1);
CHECK( timer.running() == true);
++now;
CHECK( timer.remaining() == 0);
CHECK( timer.running() == false);
now-= ULONG_MAX - 1;
timer.start(ULONG_MAX);
CHECK( timer.running() == true);
CHECK( timer.remaining() == ULONG_MAX);
now+= ULONG_MAX - 1;
CHECK( timer.remaining() == 1);
CHECK( timer.running() == true);
++now;
CHECK( timer.remaining() == 0);
CHECK( timer.running() == false);
timer.start(12*3600000ul + 38*60000ul + 15000);
CHECK( timer.running() == true);
CHECK( timer.remaining() == 12*3600000ul + 38*60000ul + 15000);
now+= 12*3600000ul + 38*60000ul + 14999;
CHECK( timer.remaining() == 1);
++now;
CHECK( timer.remaining() == 0);
CHECK( timer.running() == false);
now-= 12*3600000ul + 38*60000ul + 15000;
}
TEST_CASE( "TimerRemaining test.", "[timer]" )
{
now = 0;
basicRemaining();
now = 1;
basicRemaining();
now = ULONG_MAX;
basicRemaining();
now = ULONG_MAX - 1;
basicRemaining();
now = 12*3600000ul + 38*60000ul + 15000;
basicRemaining();
TimerRemaining otherTimer;
otherTimer.start(100);
} }