File indexing completed on 2024-05-26 05:22:55

0001 /*
0002  *  SPDX-FileCopyrightText: 2022 Glen Ditchfield <GJDitchfield@acm.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "calendarview.h"
0008 
0009 #include <QTest>
0010 
0011 const auto TEST_TZ = "UTC";
0012 
0013 class TestToggleTodo : public QObject
0014 {
0015     Q_OBJECT
0016 private Q_SLOTS:
0017 
0018     void initTestCase()
0019     {
0020         qputenv("TZ", TEST_TZ);
0021     }
0022 
0023     void testToggleNonRecurringComplete()
0024     {
0025         const KCalendarCore::Todo::Ptr todo{new KCalendarCore::Todo};
0026         QVERIFY(!todo->isCompleted());
0027 
0028         CalendarView::toggleCompleted(todo, QDate::currentDate());
0029         QVERIFY(todo->isCompleted());
0030 
0031         CalendarView::toggleCompleted(todo, QDate::currentDate());
0032         QVERIFY(!todo->isCompleted());
0033     }
0034 
0035     void testToggleRecurringComplete()
0036     {
0037         const QDateTime day1{{2022, 12, 01}, {12, 00, 00}, QTimeZone(TEST_TZ)};
0038         const QDateTime day2 = day1.addDays(1);
0039         const QDateTime day3 = day2.addDays(1);
0040 
0041         const KCalendarCore::Todo::Ptr todo{new KCalendarCore::Todo};
0042         todo->setDtStart(day1);
0043         todo->setDtRecurrence(day1);
0044         todo->recurrence()->setDaily(1);
0045         todo->recurrence()->setDuration(3);
0046         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day1));
0047         QVERIFY(!todo->isCompleted());
0048 
0049         // Toggle the first occurrance.
0050         CalendarView::toggleCompleted(todo, day1.date());
0051 
0052         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day2));
0053         QVERIFY(!todo->isCompleted());
0054         CalendarView::toggleCompleted(todo, day1.date());
0055         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day1));
0056         QVERIFY(!todo->isCompleted());
0057 
0058         // Toggle the second occurrance.
0059         CalendarView::toggleCompleted(todo, day2.date());
0060         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day3));
0061         QVERIFY(!todo->isCompleted());
0062         CalendarView::toggleCompleted(todo, day2.date());
0063         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day2));
0064         QVERIFY(!todo->isCompleted());
0065 
0066         // Complete the second occurrance, then discomplete the first (and
0067         // hence the second).
0068         CalendarView::toggleCompleted(todo, day2.date());
0069         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day3));
0070         QVERIFY(!todo->isCompleted());
0071         CalendarView::toggleCompleted(todo, day1.date());
0072         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day1));
0073         QVERIFY(!todo->isCompleted());
0074 
0075         // Complete the final occurrance, and hence the entire todo.
0076         CalendarView::toggleCompleted(todo, day3.date());
0077         QVERIFY(todo->isCompleted());
0078 
0079         CalendarView::toggleCompleted(todo, day3.date());
0080         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day3));
0081         QVERIFY(!todo->isCompleted());
0082     }
0083 
0084     void testToggleRecurringEastern()
0085     {
0086         // This date-time would appear on the 12th in a calendar running in the
0087         // UTC time zone.
0088         const QDateTime day1{{2022, 10, 13}, {00, 00, 00}, QTimeZone("Asia/Tokyo")};
0089         const QDateTime day2 = day1.addDays(1);
0090         const QDateTime day3 = day2.addDays(1);
0091 
0092         const KCalendarCore::Todo::Ptr todo{new KCalendarCore::Todo};
0093         todo->setDtStart(day1);
0094         todo->setDtRecurrence(day1);
0095         todo->recurrence()->setDaily(1);
0096         todo->recurrence()->setDuration(3);
0097         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day1));
0098         QVERIFY(!todo->isCompleted());
0099 
0100         // Toggle the first occurrance.
0101         CalendarView::toggleCompleted(todo, day1.toLocalTime().date());
0102         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day2));
0103         QVERIFY(!todo->isCompleted());
0104         CalendarView::toggleCompleted(todo, day1.toLocalTime().date());
0105         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day1));
0106         QVERIFY(!todo->isCompleted());
0107     }
0108 
0109     void testToggleRecurringWestern()
0110     {
0111         // This date-time would appear on the 14th in a calendar running in the
0112         // UTC time zone.
0113         const QDateTime day1{{2022, 10, 13}, {19, 00, 00}, QTimeZone("America/Winnipeg")};
0114         const QDateTime day2 = day1.addDays(1);
0115         const QDateTime day3 = day2.addDays(1);
0116 
0117         const KCalendarCore::Todo::Ptr todo{new KCalendarCore::Todo};
0118         todo->setDtStart(day1);
0119         todo->setDtRecurrence(day1);
0120         todo->recurrence()->setDaily(1);
0121         todo->recurrence()->setDuration(3);
0122         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day1));
0123         QVERIFY(!todo->isCompleted());
0124 
0125         // Complete the final occurrance, and hence the entire todo.
0126         CalendarView::toggleCompleted(todo, day3.toLocalTime().date());
0127         QVERIFY(todo->isCompleted());
0128 
0129         CalendarView::toggleCompleted(todo, day3.toLocalTime().date());
0130         QVERIFY(KCalendarCore::identical(todo->dtRecurrence(), day3));
0131         QVERIFY(!todo->isCompleted());
0132     }
0133 };
0134 
0135 QTEST_MAIN(TestToggleTodo)
0136 
0137 #include "testtoggletodo.moc"