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"