Browse Source

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

Marek Bel 5 years ago
parent
commit
d669b4e93a
2 changed files with 146 additions and 20 deletions
  1. 1 8
      Firmware/TimerRemaining.h
  2. 145 12
      Tests/Timer_test.cpp

+ 1 - 8
Firmware/TimerRemaining.h

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

+ 145 - 12
Tests/Timer_test.cpp

@@ -8,31 +8,164 @@
 #include "../Firmware/Timer.h"
 #include "../Firmware/TimerRemaining.h"
 
+static unsigned long now = 0;
+
 unsigned long millis()
 {
-    return 1;
+    return now;
 }
 
-TEST_CASE( "LongTimer tested.", "[timer]" )
+static void basicTimer()
 {
     LongTimer timer;
-    REQUIRE( timer.running() == false);
+    CHECK( timer.running() == false);
 
     timer.start();
-    REQUIRE( timer.running() == true);
+    CHECK( timer.running() == true);
 
     timer.stop();
-    REQUIRE( timer.running() == false);
+    CHECK( timer.running() == false);
+
+    timer.start();
+    CHECK( timer.expired(0) == true);
+    CHECK( timer.expired(0) == false);
+    CHECK( timer.running() == false);
+
+    timer.start();
+    CHECK( timer.expired(1) == false);
+    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();
-    REQUIRE( timer.expired(0) == true );
-    REQUIRE( timer.expired(0) == false );
-    REQUIRE( timer.running() == false);
+    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();
-    REQUIRE( timer.expired(1) == false );
-    REQUIRE( timer.running() == true);
+    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);
 }