aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/test-menu-appointments.cpp263
1 files changed, 263 insertions, 0 deletions
diff --git a/tests/test-menu-appointments.cpp b/tests/test-menu-appointments.cpp
new file mode 100644
index 0000000..91a4b42
--- /dev/null
+++ b/tests/test-menu-appointments.cpp
@@ -0,0 +1,263 @@
+/*
+ * Copyright 2016 Canonical Ltd.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3, as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranties of
+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors:
+ * Charles Kerr <charles.kerr@canonical.com>
+ */
+
+#include "glib-fixture.h"
+#include "print-to.h"
+
+#include <datetime/appointment.h>
+#include <datetime/menu.h>
+
+#include <vector>
+
+using MenuAppointmentFixture = GlibFixture;
+
+using namespace ayatana::indicator::datetime;
+
+namespace
+{
+ Appointment create_appointment(
+ const Appointment::Type& type,
+ const std::string& uid,
+ const std::string& summary,
+ const DateTime& begin,
+ const DateTime& end)
+ {
+ Appointment a;
+ a.type = type;
+ a.uid = uid;
+ a.summary = summary;
+ a.begin = begin;
+ a.end = end;
+ return a;
+ }
+}
+
+TEST_F(MenuAppointmentFixture, DisplayEvents)
+{
+ const auto airport = create_appointment(
+ Appointment::UBUNTU_ALARM,
+ "uid-airport",
+ "Pick Aunt Mabel up at the airport",
+ DateTime::Local(2016,12,24,10,0,0),
+ DateTime::Local(2016,12,24,10,0,0)
+ );
+
+ const auto christmas_eve_candle_service = create_appointment(
+ Appointment::EVENT,
+ "uid-christmas-eve-candle-service",
+ "Christmas Eve Candle Service",
+ DateTime::Local(2016,12,24,22,0,0),
+ DateTime::Local(2016,12,24,23,0,0)
+ );
+
+ const auto christmas = create_appointment(
+ Appointment::EVENT,
+ "uid-christmas",
+ "Christmas",
+ DateTime::Local(2016,12,25,0,0,0),
+ DateTime::Local(2016,12,26,0,0,0)
+ );
+
+ const auto santa = create_appointment(
+ Appointment::UBUNTU_ALARM,
+ "uid-santa",
+ "Time to set out cookies and milk for Santa",
+ DateTime::Local(2016,12,25,1,0,0),
+ DateTime::Local(2016,12,25,1,0,0)
+ );
+
+ const auto bike = create_appointment(
+ Appointment::UBUNTU_ALARM,
+ "uid-bike",
+ "Remember to put out the bike, it's in the garage",
+ DateTime::Local(2016,12,25,1,0,0),
+ DateTime::Local(2016,12,25,1,0,0)
+ );
+
+
+ const auto christmas_lunch = create_appointment(
+ Appointment::EVENT,
+ "uid-christmas-lunch",
+ "Christmas Lunch at Grandma's",
+ DateTime::Local(2016,12,25,12,0,0),
+ DateTime::Local(2016,12,25,14,0,0)
+ );
+
+ const auto boxing_day = create_appointment(
+ Appointment::EVENT,
+ "uid-boxing-day",
+ "Boxing Day",
+ DateTime::Local(2016,12,26,0,0,0),
+ DateTime::Local(2016,12,27,0,0,0)
+ );
+
+ const auto new_years_eve = create_appointment(
+ Appointment::EVENT,
+ "uid-new-years-eve",
+ "New Years' Eve",
+ DateTime::Local(2016,12,31,0,0,0),
+ DateTime::Local(2017,1,1,0,0,0)
+ );
+
+ const auto nye_party = create_appointment(
+ Appointment::EVENT,
+ "uid-new-years-party",
+ "New Year Party at Ted's",
+ DateTime::Local(2016,12,31,19,0,0),
+ DateTime::Local(2017, 1, 1, 2,0,0)
+ );
+
+ const auto new_years_day = create_appointment(
+ Appointment::EVENT,
+ "uid-new-years-day",
+ "New Years' Day",
+ DateTime::Local(2017,1,1,0,0,0),
+ DateTime::Local(2017,1,2,0,0,0)
+ );
+
+ const auto weekday_wakeup_alarm = create_appointment(
+ Appointment::UBUNTU_ALARM,
+ "wakeup-alarm",
+ "Wake Up",
+ DateTime::Local(2017,1,3,6,0,0),
+ DateTime::Local(2017,1,3,6,0,0)
+ );
+
+ const auto dentist_appointment = create_appointment(
+ Appointment::EVENT,
+ "dentist",
+ "Dentist",
+ DateTime::Local(2017,1,5,14,0,0),
+ DateTime::Local(2017,1,5,15,0,0)
+ );
+
+ const auto marcus_birthday = create_appointment(
+ Appointment::EVENT,
+ "uid-mlk",
+ "Marcus' Birthday",
+ DateTime::Local(2017,1,8,0,0,0),
+ DateTime::Local(2017,1,9,0,0,0)
+ );
+
+ const auto mlk_day = create_appointment(
+ Appointment::EVENT,
+ "uid-mlk",
+ "Martin Luther King Day",
+ DateTime::Local(2017,1,16,0,0,0),
+ DateTime::Local(2017,1,17,0,0,0)
+ );
+
+ const auto rodney_party = create_appointment(
+ Appointment::EVENT,
+ "uid-rodney",
+ "Rodney's Party",
+ DateTime::Local(2017,1,30,19,0,0),
+ DateTime::Local(2017,1,30,23,0,0)
+ );
+
+ const auto pub_with_pawel = create_appointment(
+ Appointment::UBUNTU_ALARM,
+ "uid-pawel",
+ "Meet Pawel at the Pub",
+ DateTime::Local(2017,2,4,19,0,0),
+ DateTime::Local(2017,2,4,19,0,0)
+ );
+
+ const struct
+ {
+ const char* const description;
+ DateTime start;
+ std::vector<Appointment> appointments;
+ std::vector<Appointment> expected_display_appointments;
+ int max_items;
+ }
+ tests[] =
+ {
+ {
+ "test presentation order: full-day events come before part-day events",
+ DateTime::Local(2016,12,25,6,0,0),
+ std::vector<Appointment>({christmas, christmas_lunch, boxing_day, new_years_eve}),
+ std::vector<Appointment>({christmas, christmas_lunch, boxing_day, new_years_eve}),
+ 5
+ },
+ {
+ "test presentation order: part-day events in chronological order",
+ DateTime::Local(2016,12,24,0,0,0),
+ std::vector<Appointment>({airport, christmas_eve_candle_service, christmas, santa, christmas_lunch}),
+ std::vector<Appointment>({airport, christmas_eve_candle_service, christmas, santa, christmas_lunch}),
+ 5
+ },
+ {
+ "test presentation order: multiple events with the same start+end sorted alphabetically",
+ DateTime::Local(2016,12,25,0,0,0),
+ std::vector<Appointment>({christmas, bike, santa, christmas_lunch}),
+ std::vector<Appointment>({christmas, bike, santa, christmas_lunch}),
+ 5
+ },
+ {
+ "test culling priority: today's part-day events outrank today's full-day events",
+ DateTime::Local(2016,12,25,1,0,0),
+ std::vector<Appointment>({christmas, santa, christmas_lunch}),
+ std::vector<Appointment>({santa, christmas_lunch}),
+ 2
+ },
+ {
+ "test culling priority: events later today outrank both tomorrow's full-day and part-day events",
+ DateTime::Local(2016,12,24,0,0,0),
+ std::vector<Appointment>({christmas_eve_candle_service, christmas, santa}),
+ std::vector<Appointment>({christmas_eve_candle_service}),
+ 1
+ },
+ {
+ "test edge cases: confirm <max events works ok",
+ DateTime::Local(2016,12,24,0,0,0),
+ std::vector<Appointment>({christmas, christmas_lunch}),
+ std::vector<Appointment>({christmas, christmas_lunch}),
+ 5
+ },
+ {
+ "test edge cases: confirm 0 events works ok",
+ DateTime::Local(2016,12,24,0,0,0),
+ std::vector<Appointment>({}),
+ std::vector<Appointment>({}),
+ 5
+ },
+ {
+ "test edge cases: confirm max-events of 0 doesn't crash",
+ DateTime::Local(2016,12,24,0,0,0),
+ std::vector<Appointment>({christmas, bike, santa, christmas_lunch}),
+ std::vector<Appointment>({}),
+ 0
+ }
+ };
+
+ for (const auto& test : tests)
+ {
+ g_debug("running test: %s", test.description);
+
+ // run the test...
+ ASSERT_EQ(test.expected_display_appointments, Menu::get_display_appointments(test.appointments, test.start, test.max_items));
+
+ // ...and again with a reversed vector to confirm input order doesn't matter
+ auto reversed = test.appointments;
+ std::reverse(reversed.begin(), reversed.end());
+ ASSERT_EQ(test.expected_display_appointments, Menu::get_display_appointments(reversed, test.start, test.max_items));
+ }
+}
+