/* * Copyright 2016 Canonical Ltd. * Copyright 2021 Robert Tari * * 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 . * * Authors: * Charles Kerr * Robert Tari */ #include "glib-fixture.h" #include "print-to.h" #include #include #include 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::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::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::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::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::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 appointments; std::vector 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({christmas, christmas_lunch, boxing_day, new_years_eve}), std::vector({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({airport, christmas_eve_candle_service, christmas, santa, christmas_lunch}), std::vector({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({christmas, bike, santa, christmas_lunch}), std::vector({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({christmas, santa, christmas_lunch}), std::vector({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({christmas_eve_candle_service, christmas, santa}), std::vector({christmas_eve_candle_service}), 1 }, { "test edge cases: confirm ({christmas, christmas_lunch}), std::vector({christmas, christmas_lunch}), 5 }, { "test edge cases: confirm 0 events works ok", DateTime::Local(2016,12,24,0,0,0), std::vector({}), std::vector({}), 5 }, { "test edge cases: confirm max-events of 0 doesn't crash", DateTime::Local(2016,12,24,0,0,0), std::vector({christmas, bike, santa, christmas_lunch}), std::vector({}), 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)); } }