Calculate event recurrance
[wakeup.git] / test / event_recurrance.cpp
diff --git a/test/event_recurrance.cpp b/test/event_recurrance.cpp
new file mode 100644 (file)
index 0000000..3f12c0e
--- /dev/null
@@ -0,0 +1,96 @@
+#include "event.h"
+#include "assert.h"
+
+int main()
+{
+   std::list<Event>   set_alarms;
+   std::list<Event>::iterator alarm;
+   UTC                time_to_check;
+   UTC                time_expected;
+   UTC                next_time;
+
+   set_alarms = read_alarms("wakeup-02.xml");
+
+   // The first alarm at 2020-03-22 06:00 does not recurr
+
+
+   alarm = set_alarms.begin();
+
+   // Check before the alarm time
+   time_to_check = UTC(date(20, 3, 2020), hour(2, 2, 2));
+   time_expected = UTC(date(22, 3, 2020), hour(6, 0, 0));
+   next_time = alarm->next_occurance(time_to_check);
+   std::cout << "Next alarm after " << time_to_check << " will be " << next_time << "\n";
+   assert(next_time == time_expected);
+
+   // Check after the alarm time
+   time_to_check = UTC(date(22, 3, 2020), hour(6, 2, 2));
+   time_expected = UTC(date(0, 0, 0), hour(0, 0, 0));
+   next_time = alarm->next_occurance(time_to_check);
+   std::cout << "Next alarm after " << time_to_check << " will be " << next_time << "\n";
+   std::cout.flush();
+   assert(next_time == time_expected);
+
+   // The second alarm at 2020-05-24 08:00 recurs weekly
+
+   alarm++;
+
+   //  Before the first occurance
+
+   time_to_check = UTC(date(20, 5, 2020), hour(2, 2, 2));
+   time_expected = UTC(date(24, 5, 2020), hour(8, 0, 0));
+   next_time = alarm->next_occurance(time_to_check);
+   std::cout << "Next alarm after " << time_to_check << " will be " << next_time << "\n";
+   std::cout.flush();
+   assert(next_time == time_expected);
+
+   //  After the first occurance
+
+   time_to_check = UTC(date(24, 5, 2020), hour(8, 2, 2));
+   time_expected = UTC(date(31, 5, 2020), hour(8, 0, 0));
+   next_time = alarm->next_occurance(time_to_check);
+   std::cout << "Next alarm after " << time_to_check << " will be " << next_time << "\n";
+   std::cout.flush();
+   assert(next_time == time_expected);
+
+   //  Much later after the first occurance
+
+   time_to_check = UTC(date(25, 11, 2020), hour(2, 2, 2));
+   time_expected = UTC(date(29, 11, 2020), hour(8, 0, 0));
+   next_time = alarm->next_occurance(time_to_check);
+   std::cout << "Next alarm after " << time_to_check << " will be " << next_time << "\n";
+   std::cout.flush();
+   assert(next_time == time_expected);
+
+   // The third alarm at 2020-04-01 07:00 (Wednesday) recurs every Tuesday, Thursday and Friday
+
+   alarm++;
+
+   //  Before the first occurance
+
+   time_to_check = UTC(date(20, 3, 2020), hour(2, 2, 2));
+   time_expected = UTC(date( 2, 4, 2020), hour(7, 0, 0)); // the first Thursday
+   next_time = alarm->next_occurance(time_to_check);
+   std::cout << "Next alarm after " << time_to_check << " will be " << next_time << ". Expected " << time_expected << "\n";
+   std::cout.flush();
+   assert(next_time == time_expected);
+
+   //  After the first occurance
+
+   time_to_check = UTC(date( 2, 4, 2020), hour(7, 2, 2));
+   time_expected = UTC(date( 3, 4, 2020), hour(7, 0, 0));   // the next Friday
+   next_time = alarm->next_occurance(time_to_check);
+   std::cout << "Next alarm after " << time_to_check << " will be " << next_time << ". Expected " << time_expected << "\n";
+   std::cout.flush();
+   assert(next_time == time_expected);
+
+   //  After the second occurance
+
+   time_to_check = UTC(date( 3, 4, 2020), hour(7, 2, 2));
+   time_expected = UTC(date( 7, 4, 2020), hour(7, 0, 0));   // the next Tuesday
+   next_time = alarm->next_occurance(time_to_check);
+   std::cout << "Next alarm after " << time_to_check << " will be " << next_time << ". Expected " << time_expected << "\n";
+   std::cout.flush();
+   assert(next_time == time_expected);
+
+}