1 /*
2 SPDX-FileCopyrightText: 2011 John Layt <john@layt.net>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
7 #include "kdatetimeedittest.h"
8
9 #include <QAction>
10 #include <QComboBox>
11 #include <QDate>
12 #include <QMenu>
13
14 #include "kdatecombobox.h"
15 #include "kdatetimeedit.h"
16 #include <QTest>
17
QTEST_MAIN(KDateTimeEditTest)18 QTEST_MAIN(KDateTimeEditTest)
19
20 void KDateTimeEditTest::testDefaults()
21 {
22 m_edit = new KDateTimeEdit(nullptr);
23 QCOMPARE(m_edit->dateTime(), QDateTime(QDate::currentDate(), QTime(0, 0, 0)));
24 QCOMPARE(m_edit->date(), QDate::currentDate());
25 QCOMPARE(m_edit->time(), QTime(0, 0, 0));
26 // Missing support in QLocale
27 // QCOMPARE(m_edit->minimumDateTime(), KDateTime(KLocale::global()->calendar()->earliestValidDate(), QTime(0, 0, 0)));
28 // QCOMPARE(m_edit->maximumDateTime(), KDateTime(KLocale::global()->calendar()->latestValidDate(), QTime(23, 59, 59, 999)));
29 QCOMPARE(m_edit->isValid(), true);
30 QCOMPARE(m_edit->isNull(), false);
31 QCOMPARE(m_edit->options(),
32 KDateTimeEdit::ShowDate | KDateTimeEdit::EditDate | KDateTimeEdit::SelectDate | KDateTimeEdit::DatePicker | KDateTimeEdit::DateKeywords
33 | KDateTimeEdit::ShowTime | KDateTimeEdit::EditTime | KDateTimeEdit::SelectTime);
34 QCOMPARE(m_edit->dateDisplayFormat(), QLocale::ShortFormat);
35 QCOMPARE(m_edit->timeListInterval(), 15);
36 QCOMPARE(m_edit->timeDisplayFormat(), QLocale::ShortFormat);
37 delete m_edit;
38 }
39
testValidNull()40 void KDateTimeEditTest::testValidNull()
41 {
42 m_edit = new KDateTimeEdit(nullptr);
43 QCOMPARE(m_edit->isValid(), true);
44 QCOMPARE(m_edit->isNull(), false);
45 m_edit->setDateTime(QDateTime());
46 QCOMPARE(m_edit->isValid(), false);
47 QCOMPARE(m_edit->isNull(), true);
48 delete m_edit;
49 }
50
testDateTimeRange()51 void KDateTimeEditTest::testDateTimeRange()
52 {
53 m_edit = new KDateTimeEdit(nullptr);
54 m_edit->setDateTime(QDateTime(QDate(2000, 1, 1), QTime(12, 0, 0)));
55 // Missing support in QLocale
56 // QCOMPARE(m_edit->minimumDateTime(), KDateTime(KLocale::global()->calendar()->earliestValidDate(), QTime(0, 0, 0)));
57 // QCOMPARE(m_edit->maximumDateTime(), KDateTime(KLocale::global()->calendar()->latestValidDate(), QTime(23, 59, 59, 999)));
58 QCOMPARE(m_edit->isValid(), true);
59
60 m_edit->setDateTimeRange(QDateTime(QDate(2001, 1, 1), QTime(10, 0, 0)), QDateTime(QDate(2002, 1, 1), QTime(20, 0, 0)));
61 QCOMPARE(m_edit->minimumDateTime(), QDateTime(QDate(2001, 1, 1), QTime(10, 0, 0)));
62 QCOMPARE(m_edit->maximumDateTime(), QDateTime(QDate(2002, 1, 1), QTime(20, 0, 0)));
63 QCOMPARE(m_edit->isValid(), false);
64
65 m_edit->setDateTime(QDateTime(QDate(2001, 1, 1), QTime(9, 59, 59, 999)));
66 QCOMPARE(m_edit->isValid(), false);
67 m_edit->setDateTime(QDateTime(QDate(2001, 1, 1), QTime(10, 0, 0)));
68 QCOMPARE(m_edit->isValid(), true);
69 m_edit->setDateTime(QDateTime(QDate(2002, 1, 1), QTime(20, 0, 0, 1)));
70 QCOMPARE(m_edit->isValid(), false);
71 m_edit->setDateTime(QDateTime(QDate(2002, 1, 1), QTime(20, 0, 0, 0)));
72 QCOMPARE(m_edit->isValid(), true);
73
74 m_edit->setDateTimeRange(QDateTime(QDate(1995, 1, 1), QTime(10, 0, 0)), QDateTime(QDate(1990, 1, 1), QTime(20, 0, 0)));
75 QCOMPARE(m_edit->minimumDateTime(), QDateTime(QDate(2001, 1, 1), QTime(10, 0, 0)));
76 QCOMPARE(m_edit->maximumDateTime(), QDateTime(QDate(2002, 1, 1), QTime(20, 0, 0)));
77
78 m_edit->setMinimumDateTime(QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0)));
79 QCOMPARE(m_edit->minimumDateTime(), QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0)));
80 QCOMPARE(m_edit->maximumDateTime(), QDateTime(QDate(2002, 1, 1), QTime(20, 0, 0)));
81
82 m_edit->setMaximumDateTime(QDateTime(QDate(2003, 1, 1), QTime(0, 0, 0)));
83 QCOMPARE(m_edit->minimumDateTime(), QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0)));
84 QCOMPARE(m_edit->maximumDateTime(), QDateTime(QDate(2003, 1, 1), QTime(0, 0, 0)));
85
86 delete m_edit;
87 }
88
testDateList()89 void KDateTimeEditTest::testDateList()
90 {
91 m_edit = new KDateTimeEdit(nullptr);
92 QMap<QDate, QString> map;
93
94 // KDateTimeEditTest default map
95 QCOMPARE(m_edit->dateMap(), map);
96
97 // KDateTimeEditTest basic map
98 map.clear();
99 map.insert(QDate(2000, 1, 1), QStringLiteral("New Years Day"));
100 map.insert(QDate(2000, 1, 2), QString());
101 map.insert(QDate(2000, 1, 3), QStringLiteral("separator"));
102 map.insert(QDate(), QStringLiteral("No Date"));
103 m_edit->setDateMap(map);
104 QCOMPARE(m_edit->dateMap(), map);
105
106 delete m_edit;
107 }
108
testOptions()109 void KDateTimeEditTest::testOptions()
110 {
111 m_edit = new KDateTimeEdit(nullptr);
112 KDateTimeEdit::Options options = KDateTimeEdit::ShowDate | KDateTimeEdit::EditDate | KDateTimeEdit::SelectDate | KDateTimeEdit::DatePicker
113 | KDateTimeEdit::DateKeywords | KDateTimeEdit::ShowTime | KDateTimeEdit::EditTime | KDateTimeEdit::SelectTime;
114 QCOMPARE(m_edit->options(), options);
115 options = KDateTimeEdit::EditDate | KDateTimeEdit::WarnOnInvalid;
116 m_edit->setOptions(options);
117 QCOMPARE(m_edit->options(), options);
118 delete m_edit;
119 }
120
testDateDisplayFormat()121 void KDateTimeEditTest::testDateDisplayFormat()
122 {
123 m_edit = new KDateTimeEdit(nullptr);
124 QLocale::FormatType format = QLocale::ShortFormat;
125 QCOMPARE(m_edit->dateDisplayFormat(), format);
126 format = QLocale::NarrowFormat;
127 m_edit->setDateDisplayFormat(format);
128 QCOMPARE(m_edit->dateDisplayFormat(), format);
129 delete m_edit;
130 }
131
testTimeListInterval()132 void KDateTimeEditTest::testTimeListInterval()
133 {
134 m_edit = new KDateTimeEdit();
135 QCOMPARE(m_edit->timeListInterval(), 15);
136 m_edit->setTimeListInterval(60);
137 QCOMPARE(m_edit->timeListInterval(), 60);
138 delete m_edit;
139 }
140
testTimeList()141 void KDateTimeEditTest::testTimeList()
142 {
143 m_edit = new KDateTimeEdit();
144 QList<QTime> list;
145
146 // KDateTimeEditTest default list
147 QTime thisTime = QTime(0, 0, 0);
148 for (int i = 0; i < 1440; i = i + 15) {
149 list << thisTime.addSecs(i * 60);
150 }
151 list << QTime(23, 59, 59, 999);
152 QCOMPARE(m_edit->timeList(), list);
153
154 // KDateTimeEditTest basic list
155 list.clear();
156 list << QTime(3, 0, 0) << QTime(15, 16, 17);
157 m_edit->setTimeList(list);
158 QCOMPARE(m_edit->timeList(), list);
159
160 delete m_edit;
161 }
162
testTimeDisplayFormat()163 void KDateTimeEditTest::testTimeDisplayFormat()
164 {
165 m_edit = new KDateTimeEdit();
166 QLocale::FormatType format = QLocale::ShortFormat;
167 QCOMPARE(m_edit->timeDisplayFormat(), format);
168 format = QLocale::NarrowFormat;
169 m_edit->setTimeDisplayFormat(format);
170 QCOMPARE(m_edit->timeDisplayFormat(), format);
171 delete m_edit;
172 }
173
testCalendarSystem()174 void KDateTimeEditTest::testCalendarSystem()
175 {
176 m_edit = new KDateTimeEdit();
177 QList<QLocale> calendars;
178 calendars << QLocale();
179
180 QCOMPARE(m_edit->locale(), QLocale());
181 QCOMPARE(m_edit->calendarLocalesList(), calendars);
182
183 m_edit->setLocale(QLocale(QLocale::Hebrew));
184 QCOMPARE(m_edit->locale(), QLocale(QLocale::Hebrew));
185
186 calendars.clear();
187 calendars.append(QLocale(QLocale::Hebrew));
188 calendars.append(QLocale(QLocale::Chinese));
189 m_edit->setCalendarLocalesList(calendars);
190 QCOMPARE(m_edit->calendarLocalesList(), calendars);
191
192 delete m_edit;
193 }
194
testTimeSpec()195 void KDateTimeEditTest::testTimeSpec()
196 {
197 m_edit = new KDateTimeEdit();
198
199 QCOMPARE(m_edit->timeZone(), QDateTime::currentDateTime().timeZone());
200 QList<QTimeZone> zones;
201 const auto zoneIds = QTimeZone::availableTimeZoneIds();
202 for (const QByteArray &zoneId : zoneIds) {
203 zones << QTimeZone(zoneId);
204 }
205 QCOMPARE(m_edit->timeZones(), zones);
206
207 QTimeZone zone(3600);
208 m_edit->setTimeZone(zone);
209 QCOMPARE(m_edit->timeZone(), zone);
210
211 zones << zone;
212 m_edit->setTimeZones(zones);
213 QCOMPARE(m_edit->timeZones(), zones);
214
215 delete m_edit;
216 }
217
218 template<typename T>
findVisibleChild(QWidget * parent)219 static T findVisibleChild(QWidget *parent)
220 {
221 const auto children = parent->findChildren<T>();
222 for (T child : children) {
223 if (child->isVisible()) {
224 return child;
225 }
226 }
227 return nullptr;
228 }
229
testDateMenu()230 void KDateTimeEditTest::testDateMenu()
231 {
232 m_edit = new KDateTimeEdit();
233 KDateTimeEdit::Options options =
234 KDateTimeEdit::ShowDate | KDateTimeEdit::EditDate | KDateTimeEdit::SelectDate | KDateTimeEdit::DatePicker | KDateTimeEdit::DateKeywords;
235 m_edit->setOptions(options);
236 m_edit->setDate(QDate(2002, 1, 1));
237 m_edit->show();
238 QComboBox *combo = findVisibleChild<QComboBox *>(m_edit);
239 QVERIFY(combo);
240 combo->showPopup();
241 QMenu *menu = findVisibleChild<QMenu *>(combo);
242 QVERIFY(menu);
243 QAction *nextMonthAction = menu->actions().at(3);
244 QCOMPARE(nextMonthAction->text(), KDateComboBox::tr("Next Month", "@option next month"));
245 nextMonthAction->trigger();
246 QCOMPARE(m_edit->date(), QDate::currentDate().addMonths(1));
247 }
248