--- /dev/null
+#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);
+
+}