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