Fix QDateEdit displaying day as a number for short and long day formats
[profile/ivi/qtbase.git] / tests / auto / widgets / widgets / qdatetimeedit / tst_qdatetimeedit.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the test suite of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42
43 #include <QtTest/QtTest>
44 #include <qapplication.h>
45 #include <qgroupbox.h>
46 #include <qlineedit.h>
47 #include <qwindowsstyle.h>
48
49
50
51 #include <qdatetimeedit.h>
52 #include <qlocale.h>
53 #include <qlayout.h>
54 #include <qeventloop.h>
55 #include <qstyle.h>
56 #include <qstyle.h>
57 #include <QStyleOptionSpinBox>
58 #include <QDate>
59 #include <QDateTime>
60 #include <QTime>
61 #include <QList>
62 #include <QDateTimeEdit>
63 #include <QCalendarWidget>
64 #include <QWidget>
65 #include <QLineEdit>
66 #include <QObject>
67 #include <QLocale>
68 #include <QString>
69 #include <QVariantList>
70 #include <QVariant>
71 #include <QApplication>
72 #include <QPoint>
73 #include <QVBoxLayout>
74 #include <QRect>
75 #include <QCursor>
76 #include <QEventLoop>
77 #include <QStyle>
78 #include <QStyleOptionComboBox>
79 #include <QTimeEdit>
80 #include <QMetaType>
81 #include <QDebug>
82 #include <QWheelEvent>
83 #include <QTest>
84 #include <QSignalSpy>
85 #include <QTestEventList>
86 #include <QDateEdit>
87
88 #include <private/qdatetimeedit_p.h>
89
90 #ifdef Q_OS_WIN
91 # include <windows.h>
92 # undef min
93 # undef max
94 #endif
95
96
97 Q_DECLARE_METATYPE(QDate);
98 Q_DECLARE_METATYPE(Qt::Key);
99 Q_DECLARE_METATYPE(Qt::KeyboardModifiers);
100 Q_DECLARE_METATYPE(Qt::KeyboardModifier);
101 Q_DECLARE_METATYPE(QDateTime);
102 Q_DECLARE_METATYPE(QTime);
103 Q_DECLARE_METATYPE(QList<int>);
104
105 #if defined(Q_OS_WINCE)
106 #ifndef SPI_GETPLATFORMTYPE
107 #define SPI_GETPLATFORMTYPE 257
108 #endif
109
110 bool qt_wince_is_platform(const QString &platformString) {
111     wchar_t tszPlatform[64];
112     if (SystemParametersInfo(SPI_GETPLATFORMTYPE,
113                              sizeof(tszPlatform)/sizeof(*tszPlatform),tszPlatform,0))
114       if (0 == _tcsicmp(reinterpret_cast<const wchar_t *> (platformString.utf16()), tszPlatform))
115             return true;
116     return false;
117 }
118 bool qt_wince_is_pocket_pc() {
119     return qt_wince_is_platform(QString::fromLatin1("PocketPC"));
120 }
121 bool qt_wince_is_smartphone() {
122        return qt_wince_is_platform(QString::fromLatin1("Smartphone"));
123 }
124 bool qt_wince_is_mobile() {
125      return (qt_wince_is_smartphone() || qt_wince_is_pocket_pc());
126 }
127 #endif
128
129 class EditorDateEdit : public QDateTimeEdit
130 {
131     Q_OBJECT
132 public:
133     EditorDateEdit(QWidget *parent = 0) : QDateTimeEdit(parent) {}
134     QLineEdit *lineEdit() { return QDateTimeEdit::lineEdit(); }
135     friend class tst_QDateTimeEdit;
136 };
137
138 class tst_QDateTimeEdit : public QObject
139 {
140     Q_OBJECT
141 public:
142     tst_QDateTimeEdit();
143     virtual ~tst_QDateTimeEdit();
144 public slots:
145     void initTestCase();
146     void init();
147     void cleanup();
148     void cleanupTestCase();
149 private slots:
150     void cachedDayTest();
151     void getSetCheck();
152     void constructor_qwidget();
153     void constructor_qdatetime_data();
154     void constructor_qdatetime();
155     void constructor_qdate_data();
156     void constructor_qdate();
157     void constructor_qtime_data();
158     void constructor_qtime();
159
160     void sectionText_data();
161     void sectionText();
162     void dateTimeSignalChecking_data();
163     void dateTimeSignalChecking();
164     void mousePress();
165     void stepHourAMPM_data();
166
167     void stepHourAMPM();
168     void displayedSections_data();
169     void displayedSections();
170     void currentSection_data();
171     void currentSection();
172
173     void setCurrentSection();
174     void setCurrentSection_data();
175
176     void minimumDate_data();
177     void minimumDate();
178     void maximumDate_data();
179     void maximumDate();
180     void clearMinimumDate_data();
181     void clearMinimumDate();
182     void clearMaximumDate_data();
183     void clearMaximumDate();
184
185     void minimumDateTime_data();
186     void minimumDateTime();
187     void maximumDateTime_data();
188     void maximumDateTime();
189
190     void clearMinimumDateTime_data();
191     void clearMinimumDateTime();
192     void clearMaximumDateTime_data();
193     void clearMaximumDateTime();
194
195     void displayFormat_data();
196     void displayFormat();
197
198     void specialValueText();
199     void setRange_data();
200     void setRange();
201
202     void selectAndScrollWithKeys();
203     void backspaceKey();
204     void deleteKey();
205     void tabKeyNavigation();
206     void tabKeyNavigationWithPrefix();
207     void tabKeyNavigationWithSuffix();
208     void enterKey();
209
210     void readOnly();
211
212     void wrappingDate_data();
213     void wrappingDate();
214
215     void dateSignalChecking_data();
216     void dateSignalChecking();
217
218     void wrappingTime_data();
219     void wrappingTime();
220
221     void userKeyPress_Time_data();
222     void userKeyPress_Time();
223
224     void timeSignalChecking_data();
225     void timeSignalChecking();
226
227     void weirdCase();
228     void newCase();
229     void newCase2();
230     void newCase3();
231     void newCase4();
232     void newCase5();
233     void newCase6();
234
235     void task98554();
236     void task149097();
237
238     void cursorPos();
239     void calendarPopup();
240
241     void hour12Test();
242     void yyTest();
243     void task108572();
244
245     void task148725();
246     void task148522();
247
248     void setSelectedSection();
249     void reverseTest();
250
251     void ddMMMMyyyy();
252     void wheelEvent();
253
254     void specialValueCornerCase();
255     void cursorPositionOnInit();
256
257     void task118867();
258
259     void nextPrevSection_data();
260     void nextPrevSection();
261
262     void dateEditTimeEditFormats();
263     void timeSpec_data();
264     void timeSpec();
265     void timeSpecBug();
266
267     void monthEdgeCase();
268     void setLocale();
269
270     void potentialYYValueBug();
271     void textSectionAtEnd();
272
273     void keypadAutoAdvance_data();
274     void keypadAutoAdvance();
275
276     void task196924();
277     void focusNextPrevChild();
278
279     void taskQTBUG_12384_timeSpecShowTimeOnly();
280     
281     void deleteCalendarWidget();
282
283 #ifdef QT_BUILD_INTERNAL
284     void dateEditCorrectSectionSize_data();
285     void dateEditCorrectSectionSize();
286 #endif
287 private:
288     EditorDateEdit* testWidget;
289     QWidget *testFocusWidget;
290 };
291
292 typedef QList<QTime> TimeList;
293 typedef QList<Qt::Key> KeyList;
294
295 Q_DECLARE_METATYPE(TimeList)
296 Q_DECLARE_METATYPE(KeyList)
297
298 // Testing get/set functions
299 void tst_QDateTimeEdit::getSetCheck()
300 {
301     QDateTimeEdit obj1;
302     obj1.setDisplayFormat("dd/MM/yyyy hh:mm:ss.zzz d/M/yy h:m:s.z AP");
303     // Section QDateTimeEdit::currentSection()
304     // void QDateTimeEdit::setCurrentSection(Section)
305     obj1.setCurrentSection(QDateTimeEdit::NoSection);
306     QVERIFY(obj1.currentSection() != QDateTimeEdit::NoSection);
307     obj1.setCurrentSection(QDateTimeEdit::AmPmSection);
308     QCOMPARE(QDateTimeEdit::AmPmSection, obj1.currentSection());
309     obj1.setCurrentSection(QDateTimeEdit::MSecSection);
310     QCOMPARE(QDateTimeEdit::MSecSection, obj1.currentSection());
311     obj1.setCurrentSection(QDateTimeEdit::SecondSection);
312     QCOMPARE(QDateTimeEdit::SecondSection, obj1.currentSection());
313     obj1.setCurrentSection(QDateTimeEdit::MinuteSection);
314     QCOMPARE(QDateTimeEdit::MinuteSection, obj1.currentSection());
315     obj1.setCurrentSection(QDateTimeEdit::HourSection);
316     QCOMPARE(QDateTimeEdit::HourSection, obj1.currentSection());
317     obj1.setCurrentSection(QDateTimeEdit::DaySection);
318     QCOMPARE(QDateTimeEdit::DaySection, obj1.currentSection());
319     obj1.setCurrentSection(QDateTimeEdit::MonthSection);
320     QCOMPARE(QDateTimeEdit::MonthSection, obj1.currentSection());
321     obj1.setCurrentSection(QDateTimeEdit::YearSection);
322     QCOMPARE(QDateTimeEdit::YearSection, obj1.currentSection());
323 }
324
325 tst_QDateTimeEdit::tst_QDateTimeEdit()
326 {
327     qRegisterMetaType<QDate>("QDate");
328     qRegisterMetaType<QTime>("QTime");
329     qRegisterMetaType<QDateTime>("QDateTime");
330     qRegisterMetaType<QList<int> >("QList<int>");
331 }
332
333 tst_QDateTimeEdit::~tst_QDateTimeEdit()
334 {
335
336 }
337
338 void tst_QDateTimeEdit::initTestCase()
339 {
340     QLocale system = QLocale::system();
341     if (system.language() != QLocale::C && system.language() != QLocale::English)
342         qWarning("Running under locale %s/%s -- this test may generate failures due to language differences",
343                  qPrintable(QLocale::languageToString(system.language())),
344                  qPrintable(QLocale::countryToString(system.country())));
345     testWidget = new EditorDateEdit(0);
346     testFocusWidget = new QWidget(0);
347     testFocusWidget->resize(200, 100);
348     testFocusWidget->show();
349 }
350
351 void tst_QDateTimeEdit::cleanupTestCase()
352 {
353     delete testFocusWidget;
354     testFocusWidget = 0;
355     delete testWidget;
356     testWidget = 0;
357 }
358
359
360 void tst_QDateTimeEdit::init()
361 {
362     QLocale::setDefault(QLocale(QLocale::C));
363 #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
364     SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT));
365 #endif
366     testWidget->setDisplayFormat("dd/MM/yyyy"); // Nice default to have
367     testWidget->setDateTime(QDateTime(QDate(2000, 1, 1), QTime(0, 0)));
368     testWidget->show();
369     testFocusWidget->move(-1000, -1000);
370 }
371
372 void tst_QDateTimeEdit::cleanup()
373 {
374     testWidget->clearMinimumDateTime();
375     testWidget->clearMaximumDateTime();
376     testWidget->setTimeSpec(Qt::LocalTime);
377     testWidget->setSpecialValueText(QString());
378     testWidget->setWrapping(false);
379 }
380
381 void tst_QDateTimeEdit::constructor_qwidget()
382 {
383     testWidget->hide();
384     QDateTimeEdit dte(0);
385     dte.show();
386     QCOMPARE(dte.dateTime(), QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0, 0)));
387     QCOMPARE(dte.minimumDate(), QDate(1752, 9, 14));
388     QCOMPARE(dte.minimumTime(), QTime(0, 0, 0, 0));
389     QCOMPARE(dte.maximumDate(), QDate(7999, 12, 31));
390     QCOMPARE(dte.maximumTime(), QTime(23, 59, 59, 999));
391 }
392
393 void tst_QDateTimeEdit::constructor_qdatetime_data()
394 {
395     QTest::addColumn<QDateTime>("parameter");
396     QTest::addColumn<QDateTime>("displayDateTime");
397     QTest::addColumn<QDate>("minimumDate");
398     QTest::addColumn<QTime>("minimumTime");
399     QTest::addColumn<QDate>("maximumDate");
400     QTest::addColumn<QTime>("maximumTime");
401
402     QTest::newRow("normal") << QDateTime(QDate(2004, 6, 16), QTime(13, 46, 32, 764))
403                          << QDateTime(QDate(2004, 6, 16), QTime(13, 46, 32, 764))
404                          << QDate(1752, 9, 14) << QTime(0, 0, 0, 0)
405                          << QDate(7999, 12, 31) << QTime(23, 59, 59, 999);
406
407     QTest::newRow("invalid") << QDateTime(QDate(9999, 99, 99), QTime(13, 46, 32, 764))
408                           << QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0, 0))
409                           << QDate(1752, 9, 14) << QTime(0, 0, 0, 0)
410                           << QDate(7999, 12, 31) << QTime(23, 59, 59, 999);
411 }
412
413
414
415 void tst_QDateTimeEdit::constructor_qdatetime()
416 {
417     QFETCH(QDateTime, parameter);
418     QFETCH(QDateTime, displayDateTime);
419     QFETCH(QDate, minimumDate);
420     QFETCH(QTime, minimumTime);
421     QFETCH(QDate, maximumDate);
422     QFETCH(QTime, maximumTime);
423
424     testWidget->hide();
425
426     QDateTimeEdit dte(parameter);
427     dte.show();
428     QCOMPARE(dte.dateTime(), displayDateTime);
429     QCOMPARE(dte.minimumDate(), minimumDate);
430     QCOMPARE(dte.minimumTime(), minimumTime);
431     QCOMPARE(dte.maximumDate(), maximumDate);
432     QCOMPARE(dte.maximumTime(), maximumTime);
433 }
434
435 void tst_QDateTimeEdit::constructor_qdate_data()
436 {
437     QTest::addColumn<QDate>("parameter");
438     QTest::addColumn<QDateTime>("displayDateTime");
439     QTest::addColumn<QDate>("minimumDate");
440     QTest::addColumn<QTime>("minimumTime");
441     QTest::addColumn<QDate>("maximumDate");
442     QTest::addColumn<QTime>("maximumTime");
443
444     QTest::newRow("normal") << QDate(2004, 6, 16)
445                          << QDateTime(QDate(2004, 6, 16), QTime(0, 0, 0, 0))
446                          << QDate(1752, 9, 14) << QTime(0, 0, 0, 0)
447                          << QDate(7999, 12, 31) << QTime(23, 59, 59, 999);
448
449     QTest::newRow("invalid") << QDate(9999, 99, 99)
450                           << QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0, 0))
451                           << QDate(1752, 9, 14) << QTime(0, 0, 0, 0)
452                           << QDate(7999, 12, 31) << QTime(23, 59, 59, 999);
453 }
454
455
456
457 void tst_QDateTimeEdit::constructor_qdate()
458 {
459     QFETCH(QDate, parameter);
460     QFETCH(QDateTime, displayDateTime);
461     QFETCH(QDate, minimumDate);
462     QFETCH(QTime, minimumTime);
463     QFETCH(QDate, maximumDate);
464     QFETCH(QTime, maximumTime);
465
466     testWidget->hide();
467
468     QDateTimeEdit dte(parameter);
469     dte.show();
470     QCOMPARE(dte.dateTime(), displayDateTime);
471     QCOMPARE(dte.minimumDate(), minimumDate);
472     QCOMPARE(dte.minimumTime(), minimumTime);
473     QCOMPARE(dte.maximumDate(), maximumDate);
474     QCOMPARE(dte.maximumTime(), maximumTime);
475 }
476
477 void tst_QDateTimeEdit::constructor_qtime_data()
478 {
479     QTest::addColumn<QTime>("parameter");
480     QTest::addColumn<QDateTime>("displayDateTime");
481     QTest::addColumn<QDate>("minimumDate");
482     QTest::addColumn<QTime>("minimumTime");
483     QTest::addColumn<QDate>("maximumDate");
484     QTest::addColumn<QTime>("maximumTime");
485
486     QTest::newRow("normal") << QTime(13, 46, 32, 764)
487                          << QDateTime(QDate(2000, 1, 1), QTime(13, 46, 32, 764))
488                          << QDate(2000, 1, 1) << QTime(0, 0, 0, 0)
489                          << QDate(2000, 1, 1) << QTime(23, 59, 59, 999);
490
491     QTest::newRow("invalid") << QTime(99, 99, 99, 5000)
492                           << QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0, 0))
493                           << QDate(2000, 1, 1) << QTime(0, 0, 0, 0)
494                           << QDate(2000, 1, 1) << QTime(23, 59, 59, 999);
495 }
496
497
498
499 void tst_QDateTimeEdit::constructor_qtime()
500 {
501     QFETCH(QTime, parameter);
502     QFETCH(QDateTime, displayDateTime);
503     QFETCH(QDate, minimumDate);
504     QFETCH(QTime, minimumTime);
505     QFETCH(QDate, maximumDate);
506     QFETCH(QTime, maximumTime);
507
508     testWidget->hide();
509
510     QDateTimeEdit dte(parameter);
511     dte.show();
512     QCOMPARE(dte.dateTime(), displayDateTime);
513     QCOMPARE(dte.minimumDate(), minimumDate);
514     QCOMPARE(dte.minimumTime(), minimumTime);
515     QCOMPARE(dte.maximumDate(), maximumDate);
516     QCOMPARE(dte.maximumTime(), maximumTime);
517 }
518
519 void tst_QDateTimeEdit::minimumDate_data()
520 {
521     QTest::addColumn<QDate>("minimumDate");
522     QTest::addColumn<QDate>("expectedMinDate");
523
524     QTest::newRow("normal-0") << QDate(2004, 5, 10) << QDate(2004, 5, 10);
525     QTest::newRow("normal-1") << QDate(2002, 3, 15) << QDate(2002, 3, 15);
526     QTest::newRow("normal-2") << QDate(7999, 12, 31) << QDate(7999, 12, 31);
527     QTest::newRow("normal-3") << QDate(1753, 1, 1) << QDate(1753, 1, 1);
528     QTest::newRow("invalid-0") << QDate(0, 0, 0) << QDate(1752, 9, 14);
529     QTest::newRow("old") << QDate(1492, 8, 3) << QDate(1492, 8, 3);
530 }
531
532 void tst_QDateTimeEdit::minimumDate()
533 {
534     QFETCH(QDate, minimumDate);
535     QFETCH(QDate, expectedMinDate);
536
537     testWidget->setMinimumDate(minimumDate);
538     QCOMPARE(testWidget->minimumDate(), expectedMinDate);
539 }
540
541 void tst_QDateTimeEdit::minimumDateTime_data()
542 {
543     QTest::addColumn<QDateTime>("minimumDateTime");
544     QTest::addColumn<QDateTime>("expectedMinDateTime");
545
546     QTest::newRow("normal-0") << QDateTime(QDate(2004, 5, 10), QTime(2, 3, 14))
547                               << QDateTime(QDate(2004, 5, 10), QTime(2, 3, 14));
548
549     QTest::newRow("normal-1") << QDateTime(QDate(2005, 5, 10), QTime(22, 33, 1))
550                               << QDateTime(QDate(2005, 5, 10), QTime(22, 33, 1));
551     QTest::newRow("normal-2") << QDateTime(QDate(2006, 5, 10), QTime(13, 31, 23))
552                               << QDateTime(QDate(2006, 5, 10), QTime(13, 31, 23));
553     QTest::newRow("normal-3") << QDateTime(QDate(2007, 5, 10), QTime(22, 23, 23))
554                               << QDateTime(QDate(2007, 5, 10), QTime(22, 23, 23));
555     QTest::newRow("normal-4") << QDateTime(QDate(2008, 5, 10), QTime(2, 3, 1))
556                               << QDateTime(QDate(2008, 5, 10), QTime(2, 3, 1));
557     QTest::newRow("invalid-0") << QDateTime() << QDateTime(QDate(1752, 9, 14), QTime(0, 0, 0));
558     QTest::newRow("old") << QDateTime(QDate(1492, 8, 3), QTime(2, 3, 1))
559                          << QDateTime(QDate(1492, 8, 3), QTime(2, 3, 1));
560 }
561
562 void tst_QDateTimeEdit::minimumDateTime()
563 {
564     QFETCH(QDateTime, minimumDateTime);
565     QFETCH(QDateTime, expectedMinDateTime);
566
567     testWidget->setMinimumDateTime(minimumDateTime);
568     QCOMPARE(testWidget->minimumDateTime(), expectedMinDateTime);
569 }
570
571
572 void tst_QDateTimeEdit::maximumDateTime_data()
573 {
574     QTest::addColumn<QDateTime>("maximumDateTime");
575     QTest::addColumn<QDateTime>("expectedMinDateTime");
576
577     QTest::newRow("normal-0") << QDateTime(QDate(2004, 5, 10), QTime(2, 3, 14))
578                               << QDateTime(QDate(2004, 5, 10), QTime(2, 3, 14));
579
580     QTest::newRow("normal-1") << QDateTime(QDate(2005, 5, 10), QTime(22, 33, 1))
581                               << QDateTime(QDate(2005, 5, 10), QTime(22, 33, 1));
582     QTest::newRow("normal-2") << QDateTime(QDate(2006, 5, 10), QTime(13, 31, 23))
583                               << QDateTime(QDate(2006, 5, 10), QTime(13, 31, 23));
584     QTest::newRow("normal-3") << QDateTime(QDate(2007, 5, 10), QTime(22, 23, 23))
585                               << QDateTime(QDate(2007, 5, 10), QTime(22, 23, 23));
586     QTest::newRow("normal-4") << QDateTime(QDate(2008, 5, 10), QTime(2, 3, 1))
587                               << QDateTime(QDate(2008, 5, 10), QTime(2, 3, 1));
588     QTest::newRow("invalid-0") << QDateTime() << QDateTime(QDate(7999, 12, 31), QTime(23, 59, 59, 999));
589 }
590
591 void tst_QDateTimeEdit::maximumDateTime()
592 {
593     QFETCH(QDateTime, maximumDateTime);
594     QFETCH(QDateTime, expectedMinDateTime);
595
596     testWidget->setMaximumDateTime(maximumDateTime);
597     QCOMPARE(testWidget->maximumDateTime(), expectedMinDateTime);
598 }
599
600 void tst_QDateTimeEdit::maximumDate_data()
601 {
602     QTest::addColumn<QDate>("maximumDate");
603     QTest::addColumn<QDate>("expectedMaxDate");
604
605     QTest::newRow("normal-0") << QDate(2004, 05, 10) << QDate(2004, 5, 10);
606     QTest::newRow("normal-1") << QDate(2002, 03, 15) << QDate(2002, 3, 15);
607     QTest::newRow("normal-2") << QDate(7999, 12, 31) << QDate(7999, 12, 31);
608     QTest::newRow("normal-3") << QDate(1753, 1, 1) << QDate(1753, 1, 1);
609     QTest::newRow("invalid-0") << QDate(0, 0, 0) << QDate(7999, 12, 31);
610 }
611
612 void tst_QDateTimeEdit::maximumDate()
613 {
614     QFETCH(QDate, maximumDate);
615     QFETCH(QDate, expectedMaxDate);
616
617     testWidget->setMaximumDate(maximumDate);
618     QCOMPARE(testWidget->maximumDate(), expectedMaxDate);
619 }
620
621 void tst_QDateTimeEdit::clearMinimumDate_data()
622 {
623     QTest::addColumn<QDate>("minimumDate");
624     QTest::addColumn<bool>("valid");
625     QTest::addColumn<QDate>("expectedMinDateAfterClear");
626
627     QTest::newRow("normal-0") << QDate(2004, 05, 10) << true << QDate(1752, 9, 14);
628     QTest::newRow("normal-1") << QDate(2002, 3, 15) << true << QDate(1752, 9, 14);
629     QTest::newRow("normal-2") << QDate(7999, 12, 31) << true << QDate(1752, 9, 14);
630     QTest::newRow("normal-3") << QDate(1753, 1, 1) << true << QDate(1752, 9, 14);
631     QTest::newRow("invalid-0") << QDate(0, 0, 0) << false << QDate(1752, 9, 14);
632 }
633
634 void tst_QDateTimeEdit::clearMinimumDate()
635 {
636     QFETCH(QDate, minimumDate);
637     QFETCH(bool, valid);
638     QFETCH(QDate, expectedMinDateAfterClear);
639
640     testWidget->setMinimumDate(minimumDate);
641     if (valid) {
642         QCOMPARE(testWidget->minimumDate(), minimumDate);
643     }
644     testWidget->clearMinimumDate();
645     QCOMPARE(testWidget->minimumDate(), expectedMinDateAfterClear);
646 }
647
648 void tst_QDateTimeEdit::clearMinimumDateTime_data()
649 {
650     QTest::addColumn<QDateTime>("minimumDateTime");
651     QTest::addColumn<bool>("valid");
652     QTest::addColumn<QDateTime>("expectedMinDateTimeAfterClear");
653
654     QTest::newRow("normal-0") << QDateTime(QDate(2004, 05, 10), QTime(12, 12, 12))
655                               << true << QDateTime(QDate(1752, 9, 14), QTime(0, 0));
656     QTest::newRow("normal-1") << QDateTime(QDate(2002, 3, 15), QTime(13, 13, 13))
657                               << true << QDateTime(QDate(1752, 9, 14), QTime(0, 0));
658     QTest::newRow("normal-2") << QDateTime(QDate(7999, 12, 31), QTime(14, 14, 14))
659                               << true << QDateTime(QDate(1752, 9, 14), QTime(0, 0));
660     QTest::newRow("normal-3") << QDateTime(QDate(1753, 1, 1), QTime(15, 15, 15))
661                               << true << QDateTime(QDate(1752, 9, 14), QTime(0, 0));
662     QTest::newRow("invalid-0") << QDateTime() << false << QDateTime(QDate(1752, 9, 14), QTime(0, 0));
663     QTest::newRow("old") << QDateTime(QDate(1492, 8, 3), QTime(2, 3, 1)) << true
664                          << QDateTime(QDate(1752, 9, 14), QTime(0, 0));
665
666 }
667
668 void tst_QDateTimeEdit::clearMinimumDateTime()
669 {
670     QFETCH(QDateTime, minimumDateTime);
671     QFETCH(bool, valid);
672     QFETCH(QDateTime, expectedMinDateTimeAfterClear);
673
674     testWidget->setMinimumDateTime(minimumDateTime);
675     if (valid) {
676         QCOMPARE(testWidget->minimumDateTime(), minimumDateTime);
677     }
678     testWidget->clearMinimumDateTime();
679     QCOMPARE(testWidget->minimumDateTime(), expectedMinDateTimeAfterClear);
680 }
681
682
683 void tst_QDateTimeEdit::clearMaximumDateTime_data()
684 {
685     QTest::addColumn<QDateTime>("maximumDateTime");
686     QTest::addColumn<bool>("valid");
687     QTest::addColumn<QDateTime>("expectedMinDateTimeAfterClear");
688
689     QTest::newRow("normal-0") << QDateTime(QDate(2004, 05, 10), QTime(12, 12, 12))
690                               << true << QDateTime(QDate(7999, 12, 31), QTime(23, 59, 59, 999));
691     QTest::newRow("normal-1") << QDateTime(QDate(2002, 3, 15), QTime(13, 13, 13))
692                               << true << QDateTime(QDate(7999, 12, 31), QTime(23, 59, 59, 999));
693     QTest::newRow("normal-2") << QDateTime(QDate(7999, 12, 31), QTime(14, 14, 14))
694                               << true << QDateTime(QDate(7999, 12, 31), QTime(23, 59, 59, 999));
695     QTest::newRow("normal-3") << QDateTime(QDate(1753, 1, 1), QTime(15, 15, 15))
696                               << true << QDateTime(QDate(7999, 12, 31), QTime(23, 59, 59, 999));
697     QTest::newRow("invalid-0") << QDateTime()
698                                << false << QDateTime(QDate(7999, 12, 31), QTime(23, 59, 59, 999));
699 }
700
701 void tst_QDateTimeEdit::clearMaximumDateTime()
702 {
703     QFETCH(QDateTime, maximumDateTime);
704     QFETCH(bool, valid);
705     QFETCH(QDateTime, expectedMinDateTimeAfterClear);
706
707     testWidget->setMaximumDateTime(maximumDateTime);
708     if (valid) {
709         QCOMPARE(testWidget->maximumDateTime(), maximumDateTime);
710     }
711     testWidget->clearMaximumDateTime();
712     QCOMPARE(testWidget->maximumDateTime(), expectedMinDateTimeAfterClear);
713 }
714
715
716 void tst_QDateTimeEdit::clearMaximumDate_data()
717 {
718     QTest::addColumn<QDate>("maximumDate");
719     QTest::addColumn<bool>("valid");
720     QTest::addColumn<QDate>("expectedMaxDateAfterClear");
721
722     QTest::newRow("normal-0") << QDate(2004, 05, 10) << true << QDate(7999, 12, 31);
723     QTest::newRow("normal-1") << QDate(2002, 03, 15) << true << QDate(7999, 12, 31);
724     QTest::newRow("normal-2") << QDate(7999, 12, 31) << true << QDate(7999, 12, 31);
725     QTest::newRow("normal-3") << QDate(2000, 1, 1) << true << QDate(7999, 12, 31);
726     QTest::newRow("invalid-0") << QDate(0, 0, 0) << false << QDate(7999, 12, 31);
727 }
728
729 void tst_QDateTimeEdit::clearMaximumDate()
730 {
731     QFETCH(QDate, maximumDate);
732     QFETCH(bool, valid);
733     QFETCH(QDate, expectedMaxDateAfterClear);
734
735     testWidget->setMaximumDate(maximumDate);
736     if (valid) {
737         QCOMPARE(testWidget->maximumDate(), maximumDate);
738     }
739     testWidget->clearMaximumDate();
740     QCOMPARE(testWidget->maximumDate(), expectedMaxDateAfterClear);
741 }
742
743 void tst_QDateTimeEdit::displayFormat_data()
744 {
745     QTest::addColumn<QString>("format");
746     QTest::addColumn<bool>("valid");
747     QTest::addColumn<QString>("text");
748     QTest::addColumn<QDateTime>("date");
749
750     const QDateTime dt(QDate(2999, 12, 31), QTime(3, 59, 59, 999));
751
752     QTest::newRow("valid-0") << QString("yyyy MM dd") << true << QString("2999 12 31") << dt;
753     QTest::newRow("valid-1") << QString("dd MM yyyy::ss:mm:hh") << true
754                              << QString("31 12 2999::59:59:03") << dt;
755     QTest::newRow("valid-2") << QString("hh-dd-mm-MM-yy") << true << QString("03-31-59-12-99") << dt;
756     QTest::newRow("valid-3") << QString("ddd MM d yyyy::ss:mm:hh") << true
757                              << QDate::shortDayName(2) + " 12 31 2999::59:59:03" << dt;
758     QTest::newRow("valid-4") << QString("hh-dd-mm-MM-yyyy") << true << QString("03-31-59-12-2999") << dt;
759     QTest::newRow("invalid-0") << QString("yyyy.MM.yy") << true << QString("2999.12.99") << dt;
760     QTest::newRow("invalid-1") << QString("y") << false << QString() << dt;
761     QTest::newRow("invalid-2") << QString("") << false << QString() << dt;
762     QTest::newRow("quoted-1") << QString("'Midday is at:' dd") << true << QString("Midday is at: 31") << dt;
763     QTest::newRow("leading1") << QString("h:hh:hhh") << true << QString("3:03:033") << dt;
764     QTest::newRow("H1") << QString("HH:hh:ap") << true << QString("03:03:am") << dt;
765     QTest::newRow("H2") << QString("HH:hh:ap") << true << QString("23:11:pm")
766                         << QDateTime(dt.date(), QTime(23, 0, 0));
767 }
768
769 void tst_QDateTimeEdit::displayFormat()
770 {
771     QFETCH(QString, format);
772     QFETCH(bool, valid);
773     QFETCH(QString, text);
774     QFETCH(QDateTime, date);
775
776     testWidget->setDateTime(date);
777
778     QString compareFormat = format;
779     if (!valid)
780         compareFormat = testWidget->displayFormat();
781     testWidget->setDisplayFormat(format);
782     QCOMPARE(testWidget->displayFormat(), compareFormat);
783     if (valid)
784         QCOMPARE(testWidget->text(), text);
785 }
786
787 void tst_QDateTimeEdit::selectAndScrollWithKeys()
788 {
789     qApp->setActiveWindow(testWidget);
790     testWidget->setDate(QDate(2004, 05, 11));
791     testWidget->setDisplayFormat("dd/MM/yyyy");
792     testWidget->show();
793 #ifdef Q_OS_MAC
794     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
795 #else
796     QTest::keyClick(testWidget, Qt::Key_Home);
797 #endif
798     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
799 #ifdef Q_OS_MAC
800     QEXPECT_FAIL("", "QTBUG-23674", Abort);
801 #endif
802     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("1"));
803     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
804     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11"));
805     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
806     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11/"));
807     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
808     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11/0"));
809     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
810     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11/05"));
811     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
812     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11/05/"));
813     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
814     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11/05/2"));
815     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
816     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11/05/20"));
817     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
818     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11/05/200"));
819     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
820     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11/05/2004"));
821     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
822     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11/05/2004"));
823
824     // Now the year part should be selected
825     QTest::keyClick(testWidget, Qt::Key_Up);
826     QCOMPARE(testWidget->date(), QDate(2005, 5, 11));
827     QCOMPARE(testWidget->currentSection(), QDateTimeEdit::YearSection);
828     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("2005"));
829     QTest::keyClick(testWidget, Qt::Key_Down);
830     QCOMPARE(testWidget->date(), QDate(2004, 5, 11));
831     QCOMPARE(testWidget->currentSection(), QDateTimeEdit::YearSection);
832     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("2004"));
833
834
835 #ifdef Q_OS_MAC
836     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
837 #else
838     QTest::keyClick(testWidget, Qt::Key_End);
839 #endif
840     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
841     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("4"));
842     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
843     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("04"));
844     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
845     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("004"));
846     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
847     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("2004"));
848     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
849     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("/2004"));
850     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
851     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("5/2004"));
852     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
853     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("05/2004"));
854     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
855     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("/05/2004"));
856     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
857     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("1/05/2004"));
858     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
859     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11/05/2004"));
860     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
861     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11/05/2004"));
862 #ifdef Q_OS_MAC
863     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
864 #else
865     QTest::keyClick(testWidget, Qt::Key_Home);
866 #endif
867
868     // Now the day part should be selected
869     QTest::keyClick(testWidget, Qt::Key_Up);
870     QCOMPARE(testWidget->date(), QDate(2004, 5, 12));
871     QCOMPARE(testWidget->currentSection(), QDateTimeEdit::DaySection);
872     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("12"));
873     QTest::keyClick(testWidget, Qt::Key_Down);
874     QCOMPARE(testWidget->date(), QDate(2004, 5, 11));
875     QCOMPARE(testWidget->currentSection(), QDateTimeEdit::DaySection);
876     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11"));
877
878 #ifdef Q_OS_MAC
879     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
880 #else
881     QTest::keyClick(testWidget, Qt::Key_Home);
882 #endif
883
884     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
885     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
886     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11"));
887     // Now the day part should be selected
888     QTest::keyClick(testWidget, Qt::Key_Up);
889     QCOMPARE(testWidget->date(), QDate(2004, 05, 12));
890 }
891
892 void tst_QDateTimeEdit::backspaceKey()
893 {
894     qApp->setActiveWindow(testWidget);
895     testWidget->setDate(QDate(2004, 05, 11));
896     testWidget->setDisplayFormat("d/MM/yyyy");
897     testWidget->show();
898 #ifdef Q_OS_MAC
899     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
900 #else
901     QTest::keyClick(testWidget, Qt::Key_End);
902 #endif
903     QCOMPARE(testWidget->text(), QString("11/05/2004"));
904     QTest::keyClick(testWidget, Qt::Key_Backspace);
905 #ifdef Q_OS_MAC
906     QEXPECT_FAIL("", "QTBUG-23674", Abort);
907 #endif
908     QCOMPARE(testWidget->text(), QString("11/05/200"));
909     QTest::keyClick(testWidget, Qt::Key_Backspace);
910     QCOMPARE(testWidget->text(), QString("11/05/20"));
911     // Check that moving into another field reverts it
912     for (int i=0;i<3;i++)
913         QTest::keyClick(testWidget, Qt::Key_Left);
914     QCOMPARE(testWidget->text(), QString("11/05/2004"));
915 #ifdef Q_OS_MAC
916     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
917 #else
918     QTest::keyClick(testWidget, Qt::Key_End);
919 #endif
920     for (int i=0;i<4;i++) {
921         QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
922     }
923
924     QTest::keyClick(testWidget, Qt::Key_Backspace);
925     QCOMPARE(testWidget->text(), QString("11/05/"));
926     QTest::keyClick(testWidget, Qt::Key_Left);
927     QTest::keyClick(testWidget, Qt::Key_Backspace);
928     QCOMPARE(testWidget->text(), QString("11/0/2004"));
929     testWidget->interpretText();
930 #ifdef Q_OS_MAC
931     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
932 #else
933     QTest::keyClick(testWidget, Qt::Key_End);
934 #endif
935     QTest::keyClick(testWidget, Qt::Key_Backspace);
936     QCOMPARE(testWidget->text(), QString("11/05/200"));
937     QTest::keyClick(testWidget, Qt::Key_Backspace);
938     QCOMPARE(testWidget->text(), QString("11/05/20"));
939     QTest::keyClick(testWidget, Qt::Key_Backspace);
940     QCOMPARE(testWidget->text(), QString("11/05/2"));
941     QTest::keyClick(testWidget, Qt::Key_Backspace);
942     QCOMPARE(testWidget->text(), QString("11/05/"));
943     QTest::keyClick(testWidget, Qt::Key_Left);
944     QTest::keyClick(testWidget, Qt::Key_Backspace);
945     QCOMPARE(testWidget->text(), QString("11/0/2004"));
946     QTest::keyClick(testWidget, Qt::Key_Backspace);
947     QCOMPARE(testWidget->text(), QString("11//2004"));
948     QTest::keyClick(testWidget, Qt::Key_Left);
949     QTest::keyClick(testWidget, Qt::Key_Backspace);
950     QCOMPARE(testWidget->text(), QString("1/05/2004"));
951     QTest::keyClick(testWidget, Qt::Key_Backspace);
952     QCOMPARE(testWidget->text(), QString("/05/2004"));
953     QTest::keyClick(testWidget, Qt::Key_Backspace);
954     QCOMPARE(testWidget->text(), QString("/05/2004"));
955     QTest::keyClick(testWidget, Qt::Key_Enter);
956     QCOMPARE(testWidget->text(), QString("1/05/2004"));
957 }
958
959 void tst_QDateTimeEdit::deleteKey()
960 {
961     qApp->setActiveWindow(testWidget);
962     testWidget->setDate(QDate(2004, 05, 11));
963     testWidget->setDisplayFormat("d/MM/yyyy");
964 #ifdef Q_OS_MAC
965     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
966 #else
967     QTest::keyClick(testWidget, Qt::Key_Home);
968 #endif
969     QTest::keyClick(testWidget, Qt::Key_Delete);
970     QCOMPARE(testWidget->text(), QString("1/05/2004"));
971     QTest::keyClick(testWidget, Qt::Key_Delete);
972     QCOMPARE(testWidget->text(), QString("/05/2004"));
973     QTest::keyClick(testWidget, Qt::Key_Right);
974     QTest::keyClick(testWidget, Qt::Key_Right);
975     QCOMPARE(testWidget->text(), QString("1/05/2004"));
976 }
977
978 void tst_QDateTimeEdit::tabKeyNavigation()
979 {
980     qApp->setActiveWindow(testWidget);
981     testWidget->setDate(QDate(2004, 05, 11));
982     testWidget->setDisplayFormat("dd/MM/yyyy");
983     testWidget->show();
984     testWidget->setCurrentSection(QDateTimeEdit::DaySection);
985
986     QTest::keyClick(testWidget, Qt::Key_Tab);
987     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("05"));
988     QTest::keyClick(testWidget, Qt::Key_Tab);
989     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("2004"));
990     QTest::keyClick(testWidget, Qt::Key_Tab, Qt::ShiftModifier);
991     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("05"));
992     QTest::keyClick(testWidget, Qt::Key_Tab, Qt::ShiftModifier);
993     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11"));
994 }
995
996 void tst_QDateTimeEdit::tabKeyNavigationWithPrefix()
997 {
998     qApp->setActiveWindow(testWidget);
999     testWidget->setDate(QDate(2004, 05, 11));
1000     testWidget->setDisplayFormat("prefix dd/MM/yyyy");
1001
1002     QTest::keyClick(testWidget, Qt::Key_Tab);
1003     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11"));
1004     QTest::keyClick(testWidget, Qt::Key_Tab);
1005     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("05"));
1006     QTest::keyClick(testWidget, Qt::Key_Tab);
1007     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("2004"));
1008     QTest::keyClick(testWidget, Qt::Key_Tab, Qt::ShiftModifier);
1009     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("05"));
1010     QTest::keyClick(testWidget, Qt::Key_Tab, Qt::ShiftModifier);
1011     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11"));
1012 }
1013
1014 void tst_QDateTimeEdit::tabKeyNavigationWithSuffix()
1015 {
1016     qApp->setActiveWindow(testWidget);
1017     testWidget->setDate(QDate(2004, 05, 11));
1018     testWidget->setDisplayFormat("dd/MM/yyyy 'suffix'");
1019
1020     QTest::keyClick(testWidget, Qt::Key_Tab);
1021     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("05"));
1022     QTest::keyClick(testWidget, Qt::Key_Tab);
1023     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("2004"));
1024     QTest::keyClick(testWidget, Qt::Key_Tab, Qt::ShiftModifier);
1025     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("05"));
1026     QTest::keyClick(testWidget, Qt::Key_Tab, Qt::ShiftModifier);
1027     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11"));
1028 }
1029
1030
1031 void tst_QDateTimeEdit::enterKey()
1032 {
1033     qApp->setActiveWindow(testWidget);
1034     testWidget->setDate(QDate(2004, 5, 11));
1035     testWidget->setDisplayFormat("prefix d/MM/yyyy 'suffix'");
1036     testWidget->lineEdit()->setFocus();
1037
1038 #ifdef Q_OS_MAC
1039     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
1040 #else
1041     QTest::keyClick(testWidget, Qt::Key_Home);
1042 #endif
1043     QTest::keyClick(testWidget, Qt::Key_Enter);
1044 #ifdef Q_OS_MAC
1045     QEXPECT_FAIL("", "QTBUG-23674", Abort);
1046 #endif
1047     QVERIFY(!testWidget->lineEdit()->hasSelectedText());
1048 #ifdef Q_OS_MAC
1049     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
1050 #else
1051     QTest::keyClick(testWidget, Qt::Key_End);
1052 #endif
1053     QTest::keyClick(testWidget, Qt::Key_Enter);
1054     QVERIFY(!testWidget->lineEdit()->hasSelectedText());
1055 #ifdef Q_OS_MAC
1056     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
1057 #else
1058     QTest::keyClick(testWidget, Qt::Key_Home);
1059 #endif
1060     QTest::keyClick(testWidget, Qt::Key_Tab);
1061     QTest::keyClick(testWidget, Qt::Key_Enter);
1062     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11"));
1063     QTest::keyClick(testWidget, Qt::Key_1);
1064     QTest::keyClick(testWidget, Qt::Key_5);
1065
1066     QTest::keyClick(testWidget, Qt::Key_Left);
1067     QTest::keyClick(testWidget, Qt::Key_Left);
1068
1069     QTest::keyClick(testWidget, Qt::Key_Enter);
1070     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("15"));
1071     QCOMPARE(testWidget->date(), QDate(2004, 5, 15));
1072
1073     QTest::keyClick(testWidget, Qt::Key_9);
1074     QTest::keyClick(testWidget, Qt::Key_Tab, Qt::ShiftModifier);
1075     QTest::keyClick(testWidget, Qt::Key_Enter);
1076     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("9"));
1077     QCOMPARE(testWidget->date(), QDate(2004, 5, 9));
1078
1079     QTest::keyClick(testWidget, Qt::Key_0);
1080     QTest::keyClick(testWidget, Qt::Key_0);
1081     QTest::keyClick(testWidget, Qt::Key_Enter);
1082     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("9"));
1083     QCOMPARE(testWidget->date(), QDate(2004, 5, 9));
1084
1085     // Current behaviour is that pressing the Enter key in a QDateTimeEdit
1086     // causes the dateChanged() signal to be emitted, even if the date
1087     // wasn't actually changed.  While this behaviour is questionable,
1088     // we include this test so a change to the behaviour can't go unnoticed.
1089     QSignalSpy enterSpy(testWidget, SIGNAL(dateChanged(const QDate &)));
1090     QTest::keyClick(testWidget, Qt::Key_Enter);
1091     QCOMPARE(enterSpy.count(), 1);
1092     QVariantList list = enterSpy.takeFirst();
1093     QCOMPARE(list.at(0).toDate(), QDate(2004, 5, 9));
1094 }
1095
1096 void tst_QDateTimeEdit::specialValueText()
1097 {
1098     testWidget->setDisplayFormat("dd/MM/yyyy");
1099     testWidget->setDateRange(QDate(2000, 1, 1), QDate(2001, 1, 1));
1100     testWidget->setDate(QDate(2000, 1, 2));
1101     testWidget->setSpecialValueText("fOo");
1102     testWidget->setCurrentSection(QDateTimeEdit::DaySection);
1103     QCOMPARE(testWidget->date(), QDate(2000, 1, 2));
1104     QCOMPARE(testWidget->text(), QString("02/01/2000"));
1105     QTest::keyClick(testWidget, Qt::Key_Down);
1106     QCOMPARE(testWidget->date(), QDate(2000, 1, 1));
1107     QCOMPARE(testWidget->text(), QString("fOo"));
1108     QTest::keyClick(testWidget, Qt::Key_Down);
1109     QCOMPARE(testWidget->date(), QDate(2000, 1, 1));
1110     QCOMPARE(testWidget->text(), QString("fOo"));
1111     QTest::keyClick(testWidget, Qt::Key_Up);
1112     QCOMPARE(testWidget->date(), QDate(2000, 1, 2));
1113     QCOMPARE(testWidget->text(), QString("02/01/2000"));
1114     QTest::keyClick(testWidget, Qt::Key_Down);
1115     QCOMPARE(testWidget->date(), QDate(2000, 1, 1));
1116     QCOMPARE(testWidget->text(), QString("fOo"));
1117
1118 #ifdef Q_OS_MAC
1119     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
1120 #else
1121     QTest::keyClick(testWidget, Qt::Key_End);
1122 #endif
1123     QTest::keyClick(testWidget, Qt::Key_Up);
1124     QCOMPARE(testWidget->date(), QDate(2000, 1, 2));
1125     QCOMPARE(testWidget->text(), QString("02/01/2000"));
1126     QTest::keyClick(testWidget, Qt::Key_Down);
1127     QCOMPARE(testWidget->text(), QString("fOo"));
1128
1129 #ifdef Q_OS_MAC
1130     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
1131 #else
1132     QTest::keyClick(testWidget, Qt::Key_End);
1133 #endif
1134     QTest::keyClick(testWidget, Qt::Key_Backspace);
1135     QCOMPARE(testWidget->text(), QString("fO"));
1136     QTest::keyClick(testWidget, Qt::Key_Backspace);
1137     QCOMPARE(testWidget->text(), QString("f"));
1138     QTest::keyClick(testWidget, Qt::Key_Backspace);
1139     QCOMPARE(testWidget->text(), QString());
1140     QTest::keyClick(testWidget, Qt::Key_F);
1141     QCOMPARE(testWidget->text(), QString("f"));
1142     QTest::keyClick(testWidget, Qt::Key_O); // will automatically uppercase
1143     QCOMPARE(testWidget->text(), QString("fO"));
1144     QTest::keyClick(testWidget, Qt::Key_O);
1145     QCOMPARE(testWidget->text(), QString("fOo"));
1146 }
1147
1148
1149 void tst_QDateTimeEdit::setRange_data()
1150 {
1151     QTest::addColumn<QTime>("minTime");
1152     QTest::addColumn<QTime>("maxTime");
1153     QTest::addColumn<QDate>("minDate");
1154     QTest::addColumn<QDate>("maxDate");
1155     QTest::addColumn<QDateTime>("expectedMin");
1156     QTest::addColumn<QDateTime>("expectedMax");
1157
1158     const QDate cdt = QDate::currentDate();
1159
1160     QTest::newRow("data0") << QTime(0, 0) << QTime(14, 12, 0)
1161                            << cdt << cdt
1162                            << QDateTime(cdt, QTime(0, 0))
1163                            << QDateTime(cdt, QTime(14, 12, 0));
1164
1165     QTest::newRow("data1") << QTime(10, 0) << QTime(1, 12, 0) << cdt.addDays(-1)
1166                            << cdt
1167                            << QDateTime(cdt.addDays(-1), QTime(10, 0))
1168                            << QDateTime(cdt, QTime(1, 12, 0));
1169 }
1170
1171 void tst_QDateTimeEdit::setRange()
1172 {
1173     QFETCH(QTime, minTime);
1174     QFETCH(QTime, maxTime);
1175     QFETCH(QDate, minDate);
1176     QFETCH(QDate, maxDate);
1177     QFETCH(QDateTime, expectedMin);
1178     QFETCH(QDateTime, expectedMax);
1179     testWidget->hide();
1180
1181     {
1182         QDateTimeEdit dte(0);
1183         dte.setTimeRange(minTime, maxTime);
1184         QCOMPARE(dte.minimumTime(), expectedMin.time());
1185         QCOMPARE(dte.maximumTime(), expectedMax.time());
1186         dte.setDateRange(minDate, maxDate);
1187         QCOMPARE(dte.minimumDate(), expectedMin.date());
1188         QCOMPARE(dte.minimumDateTime(), expectedMin);
1189         QCOMPARE(dte.maximumDate(), expectedMax.date());
1190         QCOMPARE(dte.maximumDateTime(), expectedMax);
1191         QCOMPARE(dte.minimumTime(), expectedMin.time());
1192         QCOMPARE(dte.maximumTime(), expectedMax.time());
1193         dte.setDateTimeRange(QDateTime(minDate, minTime), QDateTime(maxDate, maxTime));
1194         QCOMPARE(dte.minimumDate(), expectedMin.date());
1195         QCOMPARE(dte.minimumDateTime(), expectedMin);
1196         QCOMPARE(dte.maximumDate(), expectedMax.date());
1197         QCOMPARE(dte.maximumDateTime(), expectedMax);
1198         QCOMPARE(dte.minimumTime(), expectedMin.time());
1199         QCOMPARE(dte.maximumTime(), expectedMax.time());
1200     }
1201     {
1202
1203         QDateTimeEdit dte2(0);
1204         dte2.setDateRange(minDate, maxDate);
1205         dte2.setTimeRange(minTime, maxTime);
1206
1207         QCOMPARE(dte2.minimumDate(), expectedMin.date());
1208         QCOMPARE(dte2.maximumDate(), expectedMax.date());
1209         QCOMPARE(dte2.minimumTime(), expectedMin.time());
1210         QCOMPARE(dte2.maximumTime(), expectedMax.time());
1211     }
1212
1213     {
1214         QDateTimeEdit dte3(0);
1215         dte3.setMinimumTime(minTime);
1216         dte3.setMaximumTime(maxTime);
1217         dte3.setMinimumDate(minDate);
1218         dte3.setMaximumDate(maxDate);
1219
1220         QCOMPARE(dte3.minimumDate(), expectedMin.date());
1221         QCOMPARE(dte3.maximumDate(), expectedMax.date());
1222         QCOMPARE(dte3.minimumTime(), expectedMin.time());
1223         QCOMPARE(dte3.maximumTime(), expectedMax.time());
1224     }
1225
1226     {
1227         QDateTimeEdit dte4(0);
1228         dte4.setMinimumDate(minDate);
1229         dte4.setMaximumDate(maxDate);
1230         dte4.setMinimumTime(minTime);
1231         dte4.setMaximumTime(maxTime);
1232
1233         QCOMPARE(dte4.minimumDate(), expectedMin.date());
1234         QCOMPARE(dte4.maximumDate(), expectedMax.date());
1235         QCOMPARE(dte4.minimumTime(), expectedMin.time());
1236         QCOMPARE(dte4.maximumTime(), expectedMax.time());
1237     }
1238 }
1239
1240 void tst_QDateTimeEdit::wrappingTime_data()
1241 {
1242     QTest::addColumn<bool>("startWithMin");
1243     QTest::addColumn<QTime>("minimumTime");
1244     QTest::addColumn<QTime>("maximumTime");
1245     QTest::addColumn<uint>("section");
1246     QTest::addColumn<QTime>("newTime");
1247
1248     QTest::newRow("data0") << false << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::HourSection
1249                         << QTime(0,2,2);
1250     QTest::newRow("data1") << true << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::HourSection
1251                         << QTime(2,0,0);
1252     QTest::newRow("data2") << false << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::MinuteSection
1253                         << QTime(2,0,2);
1254     QTest::newRow("data3") << true << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::MinuteSection
1255                         << QTime(0,59,0);
1256     QTest::newRow("data4") << false << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::SecondSection
1257                         << QTime(2,2,0);
1258     QTest::newRow("data5") << true << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::SecondSection
1259                         << QTime(0,0,59);
1260     QTest::newRow("data6") << false << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::HourSection
1261                         << QTime(1,22,22);
1262     QTest::newRow("data7") << true << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::HourSection
1263                         << QTime(22,1,1);
1264     QTest::newRow("data8") << false << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::MinuteSection
1265                         << QTime(22,0,22);
1266     QTest::newRow("data9") << true << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::MinuteSection
1267                         << QTime(1,59,1);
1268     QTest::newRow("data10") << false << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::SecondSection
1269                          << QTime(22,22,0);
1270     QTest::newRow("data11") << true << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::SecondSection
1271                          << QTime(1,1,59);
1272     QTest::newRow("data12") << false << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::HourSection
1273                          << QTime(1,2,1);
1274     QTest::newRow("data13") << true << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::HourSection
1275                          << QTime(1,1,1);
1276     QTest::newRow("data14") << false << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::MinuteSection
1277                          << QTime(1,1,1);
1278     QTest::newRow("data15") << true << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::MinuteSection
1279                          << QTime(1,2,1);
1280     QTest::newRow("data16") << false << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::SecondSection
1281                          << QTime(1,2,0);
1282     QTest::newRow("data17") << true << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::SecondSection
1283                          << QTime(1,1,59);
1284 }
1285
1286
1287 void tst_QDateTimeEdit::wrappingTime()
1288 {
1289     QFETCH(bool, startWithMin);
1290     QFETCH(QTime, minimumTime);
1291     QFETCH(QTime, maximumTime);
1292     QFETCH(uint, section);
1293     QFETCH(QTime, newTime);
1294
1295     testWidget->setDisplayFormat("hh:mm:ss");
1296     testWidget->setMinimumTime(minimumTime);
1297     testWidget->setMaximumTime(maximumTime);
1298     testWidget->setWrapping(true);
1299     testWidget->setCurrentSection((QDateTimeEdit::Section)section);
1300     if (startWithMin) {
1301         testWidget->setTime(minimumTime);
1302         QTest::keyClick(testWidget, Qt::Key_Down);
1303     } else {
1304         testWidget->setTime(maximumTime);
1305         QTest::keyClick(testWidget, Qt::Key_Up);
1306     }
1307     QTest::keyClick(testWidget, Qt::Key_Enter);
1308     QCOMPARE(testWidget->time(), newTime);
1309 }
1310
1311 void tst_QDateTimeEdit::userKeyPress_Time_data()
1312 {
1313     QTest::addColumn<bool>("ampm");
1314     QTest::addColumn<QTestEventList>("keys");
1315     QTest::addColumn<QTime>("expected_time");
1316
1317     // ***************** test the hours ***************
1318
1319     // use up/down keys to change hour in 12 h mode
1320     {
1321         QTestEventList keys;
1322         keys.addKeyClick( Qt::Key_Down );
1323         QTime expected( 10, 0, 0 );
1324         QTest::newRow( "data0" ) << bool(true) << keys << expected;
1325     }
1326     {
1327         QTestEventList keys;
1328         for (uint i=0; i<5; i++)
1329             keys.addKeyClick( Qt::Key_Down );
1330         QTime expected( 6, 0, 0 );
1331         QTest::newRow( "data1" ) << bool(true) << keys << expected;
1332     }
1333     {
1334         QTestEventList keys;
1335         for (uint i=0; i<10; i++)
1336             keys.addKeyClick( Qt::Key_Down );
1337         QTime expected( 1, 0, 0 );
1338         QTest::newRow( "data2" ) << bool(true) << keys << expected;
1339     }
1340     {
1341         QTestEventList keys;
1342         for (uint i=0; i<12; i++)
1343             keys.addKeyClick( Qt::Key_Down );
1344         QTime expected( 23, 0, 0 );
1345         QTest::newRow( "data3" ) << bool(true) << keys << expected;
1346     }
1347     {
1348         QTestEventList keys;
1349         keys.addKeyClick( Qt::Key_Up );
1350         QTime expected( 12, 0, 0 );
1351         QTest::newRow( "data4" ) << bool(true) << keys << expected;
1352     }
1353     {
1354         QTestEventList keys;
1355         for (uint i=0; i<2; i++)
1356             keys.addKeyClick( Qt::Key_Up );
1357         QTime expected( 13, 0, 0 );
1358         QTest::newRow( "data5" ) << bool(true) << keys << expected;
1359     }
1360
1361     // use up/down keys to change hour in 24 h mode
1362     {
1363         QTestEventList keys;
1364         keys.addKeyClick( Qt::Key_Down );
1365         QTime expected( 10, 0, 0 );
1366         QTest::newRow( "data6" ) << bool(false) << keys << expected;
1367     }
1368     {
1369         QTestEventList keys;
1370         for (uint i=0; i<5; i++)
1371             keys.addKeyClick( Qt::Key_Down );
1372         QTime expected( 6, 0, 0 );
1373         QTest::newRow( "data7" ) << bool(false) << keys << expected;
1374     }
1375     {
1376         QTestEventList keys;
1377         for (uint i=0; i<10; i++)
1378             keys.addKeyClick( Qt::Key_Down );
1379         QTime expected( 1, 0, 0 );
1380         QTest::newRow( "data8" ) << bool(false) << keys << expected;
1381     }
1382     {
1383         QTestEventList keys;
1384         for (uint i=0; i<12; i++)
1385             keys.addKeyClick( Qt::Key_Down );
1386         QTime expected( 23, 0, 0 );
1387         QTest::newRow( "data9" ) << bool(false) << keys << expected;
1388     }
1389     {
1390         QTestEventList keys;
1391         keys.addKeyClick( Qt::Key_Up );
1392         QTime expected( 12, 0, 0 );
1393         QTest::newRow( "data10" ) << bool(false) << keys << expected;
1394     }
1395     {
1396         QTestEventList keys;
1397         for (uint i=0; i<2; i++)
1398             keys.addKeyClick( Qt::Key_Up );
1399         QTime expected( 13, 0, 0 );
1400         QTest::newRow( "data11" ) << bool(false) << keys << expected;
1401     }
1402
1403     // enter a one digit valid hour
1404     {
1405         QTestEventList keys;
1406         keys.addKeyClick( '5' );
1407         QTime expected( 5, 0, 0 );
1408         QTest::newRow( "data12" ) << bool(true) << keys << expected;
1409     }
1410
1411     // entering a two digit valid hour
1412     {
1413         QTestEventList keys;
1414         keys.addKeyClick( '1' );
1415         keys.addKeyClick( '1' );
1416         QTime expected( 11, 0, 0 );
1417         QTest::newRow( "data13" ) << bool(true) << keys << expected;
1418     }
1419
1420     // entering an invalid hour
1421     {
1422         QTestEventList keys;
1423         keys.addKeyClick( '2' );
1424         // the '5' creates an invalid hour (25) so it must be ignored
1425         keys.addKeyClick( '5' );
1426         QTime expected( 2, 0, 0 );
1427         QTest::newRow( "data14" ) << bool(true) << keys << expected;
1428     }
1429
1430     // enter a value, in hour which causes a field change
1431     {
1432         QTestEventList keys;
1433         keys.addKeyClick( '0' );
1434         keys.addKeyClick( '2' );
1435         keys.addKeyClick( '1' );
1436         QTime expected( 2, 1, 0 );
1437         QTest::newRow( "data15" ) << bool(true) << keys << expected;
1438     }
1439
1440     // enter a one digit valid hour in 24 h mode
1441     {
1442         QTestEventList keys;
1443         keys.addKeyClick( '5' );
1444         QTime expected( 5, 0, 0 );
1445         QTest::newRow( "data16" ) << bool(false) << keys << expected;
1446     }
1447
1448     // enter a two digit valid hour in 24 h mode
1449     {
1450         QTestEventList keys;
1451         keys.addKeyClick( '1' );
1452         keys.addKeyClick( '1' );
1453         QTime expected( 11, 0, 0 );
1454         QTest::newRow( "data17" ) << bool(false) << keys << expected;
1455     }
1456
1457     // enter a two digit valid hour (>12) in 24 h mode
1458     {
1459         QTestEventList keys;
1460         keys.addKeyClick( '1' );
1461         keys.addKeyClick( '5' );
1462         QTime expected( 15, 0, 0 );
1463         QTest::newRow( "data18" ) << bool(false) << keys << expected;
1464     }
1465
1466     // enter a two digit valid hour (>20) in 24 h mode
1467     {
1468         QTestEventList keys;
1469         keys.addKeyClick( '2' );
1470         keys.addKeyClick( '1' );
1471         QTime expected( 21, 0, 0 );
1472         QTest::newRow( "data19" ) << bool(false) << keys << expected;
1473     }
1474
1475     // enter a two digit invalid hour (>23) in 24 h mode
1476     {
1477         QTestEventList keys;
1478         keys.addKeyClick( '2' );
1479         keys.addKeyClick( '4' );
1480         QTime expected( 2, 0, 0 );
1481         QTest::newRow( "data20" ) << bool(false) << keys << expected;
1482     }
1483
1484     // ***************** test the minutes ***************
1485
1486     // use up/down keys to change the minutes in 12 hour mode
1487     { // test a valid value
1488         QTestEventList keys;
1489         keys.addKeyClick( Qt::Key_Tab );
1490         for (uint i=0; i<2; i++)
1491             keys.addKeyClick( Qt::Key_Up );
1492         QTime expected( 11, 2, 0 );
1493         QTest::newRow( "data21" ) << bool(true) << keys << expected;
1494     }
1495     { // test a valid value
1496         QTestEventList keys;
1497         keys.addKeyClick( Qt::Key_Tab );
1498         for (uint i=0; i<16; i++)
1499             keys.addKeyClick( Qt::Key_Up );
1500         QTime expected( 11, 16, 0 );
1501         QTest::newRow( "data22" ) << bool(true) << keys << expected;
1502     }
1503     { // test maximum value
1504         QTestEventList keys;
1505         keys.addKeyClick( Qt::Key_Tab );
1506         for (uint i=0; i<59; i++)
1507             keys.addKeyClick( Qt::Key_Up );
1508         QTime expected( 11, 59, 0 );
1509         QTest::newRow( "data23" ) << bool(true) << keys << expected;
1510     }
1511     { // test 'overflow'
1512         QTestEventList keys;
1513         keys.addKeyClick( Qt::Key_Tab );
1514         for (uint i=0; i<60; i++)
1515             keys.addKeyClick( Qt::Key_Up );
1516         QTime expected( 11, 0, 0 );
1517         QTest::newRow( "data24" ) << bool(true) << keys << expected;
1518     }
1519     { // test 'underflow'
1520         QTestEventList keys;
1521         keys.addKeyClick( Qt::Key_Tab );
1522         keys.addKeyClick( Qt::Key_Down );
1523         QTime expected( 11, 59, 0 );
1524         QTest::newRow( "data25" ) << bool(true) << keys << expected;
1525     }
1526     { // test valid value
1527         QTestEventList keys;
1528         keys.addKeyClick( Qt::Key_Tab );
1529         for (uint i=0; i<2; i++)
1530             keys.addKeyClick( Qt::Key_Down );
1531         QTime expected( 11, 58, 0 );
1532         QTest::newRow( "data26" ) << bool(true) << keys << expected;
1533     }
1534
1535     // use up/down keys to change the minutes in 24 hour mode
1536
1537     { // test a valid value
1538         QTestEventList keys;
1539         keys.addKeyClick( Qt::Key_Tab );
1540         for (uint i=0; i<2; i++)
1541             keys.addKeyClick( Qt::Key_Up );
1542         QTime expected( 11, 2, 0 );
1543         QTest::newRow( "data27" ) << bool(false) << keys << expected;
1544     }
1545     { // test a valid value
1546         QTestEventList keys;
1547         keys.addKeyClick( Qt::Key_Tab );
1548         for (uint i=0; i<16; i++)
1549             keys.addKeyClick( Qt::Key_Up );
1550         QTime expected( 11, 16, 0 );
1551         QTest::newRow( "data28" ) << bool(false) << keys << expected;
1552     }
1553     { // test maximum value
1554         QTestEventList keys;
1555         keys.addKeyClick( Qt::Key_Tab );
1556         for (uint i=0; i<59; i++)
1557             keys.addKeyClick( Qt::Key_Up );
1558         QTime expected( 11, 59, 0 );
1559         QTest::newRow( "data29" ) << bool(false) << keys << expected;
1560     }
1561     { // test 'overflow'
1562         QTestEventList keys;
1563         keys.addKeyClick( Qt::Key_Tab );
1564         for (uint i=0; i<60; i++)
1565             keys.addKeyClick( Qt::Key_Up );
1566         QTime expected( 11, 0, 0 );
1567         QTest::newRow( "data30" ) << bool(false) << keys << expected;
1568     }
1569     { // test 'underflow'
1570         QTestEventList keys;
1571         keys.addKeyClick( Qt::Key_Tab );
1572         keys.addKeyClick( Qt::Key_Down );
1573         QTime expected( 11, 59, 0 );
1574         QTest::newRow( "data31" ) << bool(false) << keys << expected;
1575     }
1576     { // test valid value
1577         QTestEventList keys;
1578         keys.addKeyClick( Qt::Key_Tab );
1579         for (uint i=0; i<2; i++)
1580             keys.addKeyClick( Qt::Key_Down );
1581         QTime expected( 11, 58, 0 );
1582         QTest::newRow( "data32" ) << bool(false) << keys << expected;
1583     }
1584
1585     // enter a valid one digit minute in 12 h mode
1586     {
1587         QTestEventList keys;
1588         keys.addKeyClick(Qt::Key_Tab);
1589         keys.addKeyClick( '2' );
1590         QTime expected( 11, 2, 0 );
1591         QTest::newRow( "data33" ) << bool(true) << keys << expected;
1592     }
1593
1594     // enter a valid two digit minutes in 12 h mode
1595     {
1596         QTestEventList keys;
1597         keys.addKeyClick(Qt::Key_Tab);
1598         keys.addKeyClick( '2' );
1599         keys.addKeyClick( '4' );
1600         QTime expected( 11, 24, 0 );
1601         QTest::newRow( "data34" ) << bool(true) << keys << expected;
1602     }
1603
1604     // check the lower limit of the minutes in 12 h mode
1605     {
1606         QTestEventList keys;
1607         keys.addKeyClick(Qt::Key_Tab);
1608         keys.addKeyClick( '0' );
1609         QTime expected( 11, 0, 0 );
1610         QTest::newRow( "data35" ) << bool(true) << keys << expected;
1611     }
1612
1613     // check the upper limit of the minutes in 12 h mode
1614     {
1615         QTestEventList keys;
1616         keys.addKeyClick(Qt::Key_Tab);
1617         keys.addKeyClick( '5' );
1618         keys.addKeyClick( '9' );
1619         QTime expected( 11, 59, 0 );
1620         QTest::newRow( "data36" ) << bool(true) << keys << expected;
1621     }
1622
1623     // enter an invalid two digit minutes in 12 h mode
1624     {
1625         QTestEventList keys;
1626         keys.addKeyClick( Qt::Key_Tab );
1627         keys.addKeyClick( '6' );
1628         keys.addKeyClick( '0' );
1629         QTime expected( 11, 6, 0 );
1630         QTest::newRow( "data37" ) << bool(true) << keys << expected;
1631     }
1632
1633     // test minutes in 24 hour motestWidget-> Behaviour should be exactly the same
1634
1635     // enter a valid one digit minute in 24 h mode
1636     {
1637         QTestEventList keys;
1638         keys.addKeyClick( Qt::Key_Tab );
1639         keys.addKeyClick( '2' );
1640         QTime expected( 11, 2, 0 );
1641         QTest::newRow( "data38" ) << bool(false) << keys << expected;
1642     }
1643
1644     // enter a valid two digit minutes in 24 h mode
1645     {
1646         QTestEventList keys;
1647         keys.addKeyClick( Qt::Key_Tab );
1648         keys.addKeyClick( '2' );
1649         keys.addKeyClick( '4' );
1650         QTime expected( 11, 24, 0 );
1651         QTest::newRow( "data39" ) << bool(false) << keys << expected;
1652     }
1653
1654     // check the lower limit of the minutes in 24 h mode
1655     {
1656         QTestEventList keys;
1657         keys.addKeyClick( Qt::Key_Tab );
1658         keys.addKeyClick( '0' );
1659         QTime expected( 11, 0, 0 );
1660         QTest::newRow( "data40" ) << bool(false) << keys << expected;
1661     }
1662
1663     // check the upper limit of the minutes in 24 h mode
1664     {
1665         QTestEventList keys;
1666         keys.addKeyClick( Qt::Key_Tab );
1667         keys.addKeyClick( '5' );
1668         keys.addKeyClick( '9' );
1669         QTime expected( 11, 59, 0 );
1670         QTest::newRow( "data41" ) << bool(false) << keys << expected;
1671     }
1672
1673     // enter an invalid two digit minutes in 24 h mode
1674     {
1675         QTestEventList keys;
1676         keys.addKeyClick( Qt::Key_Tab );
1677         keys.addKeyClick( '6' );
1678         keys.addKeyClick( '0' );
1679         QTime expected( 11, 6, 0 );
1680         QTest::newRow( "data42" ) << bool(false) << keys << expected;
1681     }
1682
1683     // ***************** test the seconds ***************
1684
1685     // use up/down to edit the seconds...
1686
1687     // use up/down keys to change the seconds in 12 hour mode
1688     { // test a valid value
1689         QTestEventList keys;
1690         keys.addKeyClick( Qt::Key_Tab );
1691         keys.addKeyClick( Qt::Key_Tab );
1692         for (uint i=0; i<2; i++)
1693             keys.addKeyClick( Qt::Key_Up );
1694         QTime expected( 11, 0, 2 );
1695         QTest::newRow( "data43" ) << bool(true) << keys << expected;
1696     }
1697     { // test a valid value
1698         QTestEventList keys;
1699         keys.addKeyClick( Qt::Key_Tab );
1700         keys.addKeyClick( Qt::Key_Tab );
1701         for (uint i=0; i<16; i++)
1702             keys.addKeyClick( Qt::Key_Up );
1703         QTime expected( 11, 0, 16 );
1704         QTest::newRow( "data44" ) << bool(true) << keys << expected;
1705     }
1706     { // test maximum value
1707         QTestEventList keys;
1708         keys.addKeyClick( Qt::Key_Tab );
1709         keys.addKeyClick( Qt::Key_Tab );
1710         for (uint i=0; i<59; i++)
1711             keys.addKeyClick( Qt::Key_Up );
1712         QTime expected( 11, 0, 59 );
1713         QTest::newRow( "data45" ) << bool(true) << keys << expected;
1714     }
1715     { // test 'overflow'
1716         QTestEventList keys;
1717         keys.addKeyClick( Qt::Key_Tab );
1718         keys.addKeyClick( Qt::Key_Tab );
1719         for (uint i=0; i<60; i++)
1720             keys.addKeyClick( Qt::Key_Up );
1721         QTime expected( 11, 0, 0 );
1722         QTest::newRow( "data46" ) << bool(true) << keys << expected;
1723     }
1724     { // test 'underflow'
1725         QTestEventList keys;
1726         keys.addKeyClick( Qt::Key_Tab );
1727         keys.addKeyClick( Qt::Key_Tab );
1728         keys.addKeyClick( Qt::Key_Down );
1729         QTime expected( 11, 0, 59 );
1730         QTest::newRow( "data47" ) << bool(true) << keys << expected;
1731     }
1732     { // test valid value
1733         QTestEventList keys;
1734         keys.addKeyClick( Qt::Key_Tab );
1735         keys.addKeyClick( Qt::Key_Tab );
1736         for (uint i=0; i<2; i++)
1737             keys.addKeyClick( Qt::Key_Down );
1738         QTime expected( 11, 0, 58 );
1739         QTest::newRow( "data48" ) << bool(true) << keys << expected;
1740     }
1741
1742     // use up/down keys to change the seconds in 24 hour mode
1743
1744     { // test a valid value
1745         QTestEventList keys;
1746         keys.addKeyClick( Qt::Key_Tab );
1747         keys.addKeyClick( Qt::Key_Tab );
1748         for (uint i=0; i<2; i++)
1749             keys.addKeyClick( Qt::Key_Up );
1750         QTime expected( 11, 0, 2 );
1751         QTest::newRow( "data49" ) << bool(false) << keys << expected;
1752     }
1753     { // test a valid value
1754         QTestEventList keys;
1755         keys.addKeyClick( Qt::Key_Tab );
1756         keys.addKeyClick( Qt::Key_Tab );
1757         for (uint i=0; i<16; i++)
1758             keys.addKeyClick( Qt::Key_Up );
1759         QTime expected( 11, 0, 16 );
1760         QTest::newRow( "data50" ) << bool(false) << keys << expected;
1761     }
1762     { // test maximum value
1763         QTestEventList keys;
1764         keys.addKeyClick( Qt::Key_Tab );
1765         keys.addKeyClick( Qt::Key_Tab );
1766         for (uint i=0; i<59; i++)
1767             keys.addKeyClick( Qt::Key_Up );
1768         QTime expected( 11, 0, 59 );
1769         QTest::newRow( "data51" ) << bool(false) << keys << expected;
1770     }
1771     { // test 'overflow'
1772         QTestEventList keys;
1773         keys.addKeyClick( Qt::Key_Tab );
1774         keys.addKeyClick( Qt::Key_Tab );
1775         for (uint i=0; i<60; i++)
1776             keys.addKeyClick( Qt::Key_Up );
1777         QTime expected( 11, 0, 0 );
1778         QTest::newRow( "data52" ) << bool(false) << keys << expected;
1779     }
1780     { // test 'underflow'
1781         QTestEventList keys;
1782         keys.addKeyClick( Qt::Key_Tab );
1783         keys.addKeyClick( Qt::Key_Tab );
1784         keys.addKeyClick( Qt::Key_Down );
1785         QTime expected( 11, 0, 59 );
1786         QTest::newRow( "data53" ) << bool(false) << keys << expected;
1787     }
1788     { // test valid value
1789         QTestEventList keys;
1790         keys.addKeyClick( Qt::Key_Tab );
1791         keys.addKeyClick( Qt::Key_Tab );
1792         for (uint i=0; i<2; i++)
1793             keys.addKeyClick( Qt::Key_Down );
1794         QTime expected( 11, 0, 58 );
1795         QTest::newRow( "data54" ) << bool(false) << keys << expected;
1796     }
1797
1798     // enter a valid one digit second in 12 h mode
1799     {
1800         QTestEventList keys;
1801         keys.addKeyClick( Qt::Key_Tab );
1802         keys.addKeyClick( Qt::Key_Tab );
1803         keys.addKeyClick( '2' );
1804         QTime expected( 11, 0, 2 );
1805         QTest::newRow( "data55" ) << bool(true) << keys << expected;
1806     }
1807
1808     // enter a valid two digit seconds in 12 h mode
1809     {
1810         QTestEventList keys;
1811         keys.addKeyClick( Qt::Key_Tab );
1812         keys.addKeyClick( Qt::Key_Tab );
1813         keys.addKeyClick( '2' );
1814         keys.addKeyClick( '4' );
1815         QTime expected( 11, 0, 24 );
1816         QTest::newRow( "data56" ) << bool(true) << keys << expected;
1817     }
1818
1819     // check the lower limit of the seconds in 12 h mode
1820     {
1821         QTestEventList keys;
1822         keys.addKeyClick( Qt::Key_Tab );
1823         keys.addKeyClick( Qt::Key_Tab );
1824         keys.addKeyClick( '0' );
1825         QTime expected( 11, 0, 0 );
1826         QTest::newRow( "data57" ) << bool(true) << keys << expected;
1827     }
1828
1829     // check the upper limit of the seconds in 12 h mode
1830     {
1831         QTestEventList keys;
1832         keys.addKeyClick( Qt::Key_Tab );
1833         keys.addKeyClick( Qt::Key_Tab );
1834         keys.addKeyClick( '5' );
1835         keys.addKeyClick( '9' );
1836         QTime expected( 11, 0, 59 );
1837         QTest::newRow( "data58" ) << bool(true) << keys << expected;
1838     }
1839
1840     // enter an invalid two digit seconds in 12 h mode
1841     {
1842         QTestEventList keys;
1843         keys.addKeyClick( Qt::Key_Tab );
1844         keys.addKeyClick( Qt::Key_Tab );
1845         keys.addKeyClick( '6' );
1846         keys.addKeyClick( '0' );
1847         QTime expected( 11, 0, 6 );
1848         QTest::newRow( "data59" ) << bool(true) << keys << expected;
1849     }
1850
1851     // test seconds in 24 hour mode. Behaviour should be exactly the same
1852
1853     // enter a valid one digit minute in 24 h mode
1854     {
1855         QTestEventList keys;
1856         keys.addKeyClick( Qt::Key_Tab );
1857         keys.addKeyClick( Qt::Key_Tab );
1858         keys.addKeyClick( '2' );
1859         QTime expected( 11, 0, 2 );
1860         QTest::newRow( "data60" ) << bool(false) << keys << expected;
1861     }
1862
1863     // enter a valid two digit seconds in 24 h mode
1864     {
1865         QTestEventList keys;
1866         keys.addKeyClick( Qt::Key_Tab );
1867         keys.addKeyClick( Qt::Key_Tab );
1868         keys.addKeyClick( '2' );
1869         keys.addKeyClick( '4' );
1870         QTime expected( 11, 0, 24 );
1871         QTest::newRow( "data61" ) << bool(false) << keys << expected;
1872     }
1873
1874     // check the lower limit of the seconds in 24 h mode
1875     {
1876         QTestEventList keys;
1877         keys.addKeyClick( Qt::Key_Tab );
1878         keys.addKeyClick( Qt::Key_Tab );
1879         keys.addKeyClick( '0' );
1880         QTime expected( 11, 0, 0 );
1881         QTest::newRow( "data62" ) << bool(false) << keys << expected;
1882     }
1883
1884     // check the upper limit of the seconds in 24 h mode
1885     {
1886         QTestEventList keys;
1887         keys.addKeyClick( Qt::Key_Tab );
1888         keys.addKeyClick( Qt::Key_Tab );
1889         keys.addKeyClick( '5' );
1890         keys.addKeyClick( '9' );
1891         QTime expected( 11, 0, 59 );
1892         QTest::newRow( "data63" ) << bool(false) << keys << expected;
1893     }
1894
1895     // enter an invalid two digit seconds in 24 h mode
1896     {
1897         QTestEventList keys;
1898         keys.addKeyClick( Qt::Key_Tab );
1899         keys.addKeyClick( Qt::Key_Tab );
1900         keys.addKeyClick( '6' );
1901         keys.addKeyClick( '0' );
1902         QTime expected( 11, 0, 6 );
1903         QTest::newRow( "data64" ) << bool(false) << keys << expected;
1904     }
1905
1906     // Test the AMPM indicator
1907     {
1908         QTestEventList keys;
1909         keys.addKeyClick( Qt::Key_Tab );
1910         keys.addKeyClick( Qt::Key_Tab );
1911         keys.addKeyClick( Qt::Key_Tab );
1912         keys.addKeyClick( Qt::Key_Up );
1913         QTime expected( 23, 0, 0 );
1914         QTest::newRow( "data65" ) << bool(true) << keys << expected;
1915     }
1916     // Test the AMPM indicator
1917     {
1918         QTestEventList keys;
1919         keys.addKeyClick( Qt::Key_Tab );
1920         keys.addKeyClick( Qt::Key_Tab );
1921         keys.addKeyClick( Qt::Key_Tab );
1922         keys.addKeyClick( Qt::Key_Down );
1923         QTime expected( 23, 0, 0 );
1924         QTest::newRow( "data66" ) << bool(true) << keys << expected;
1925     }
1926     // Test the AMPM indicator
1927     {
1928         QTestEventList keys;
1929         keys.addKeyClick( Qt::Key_Tab );
1930         keys.addKeyClick( Qt::Key_Tab );
1931         keys.addKeyClick( Qt::Key_Tab );
1932         keys.addKeyClick( Qt::Key_Down );
1933         keys.addKeyClick( Qt::Key_Down );
1934         QTime expected( 11, 0, 0 );
1935         QTest::newRow( "data67" ) << bool(true) << keys << expected;
1936     }
1937     // Test the AMPM indicator
1938     {
1939         QTestEventList keys;
1940         keys.addKeyClick( Qt::Key_Tab );
1941         keys.addKeyClick( Qt::Key_Tab );
1942         keys.addKeyClick( Qt::Key_Tab );
1943         keys.addKeyClick( Qt::Key_Up );
1944         keys.addKeyClick( Qt::Key_Down );
1945         QTime expected( 11, 0, 0 );
1946         QTest::newRow( "data68" ) << bool(true) << keys << expected;
1947     }
1948 }
1949
1950 void tst_QDateTimeEdit::userKeyPress_Time()
1951 {
1952     QFETCH(bool, ampm);
1953     QFETCH(QTestEventList, keys);
1954     QFETCH(QTime, expected_time);
1955
1956     if (ampm)
1957         testWidget->setDisplayFormat("hh:mm:ss ap");
1958     else
1959         testWidget->setDisplayFormat("hh:mm:ss");
1960
1961     testWidget->setTime(QTime(11, 0, 0));
1962     testWidget->setFocus();
1963
1964     testWidget->setWrapping(true);
1965
1966     QTest::keyClick(testWidget, Qt::Key_Enter); // Make sure the first section is now focused
1967     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("11"));
1968     keys.simulate(testWidget);
1969     QTest::keyClick(testWidget, Qt::Key_Enter);
1970
1971     QCOMPARE(testWidget->time(), expected_time);
1972 }
1973
1974 void tst_QDateTimeEdit::wrappingDate_data()
1975 {
1976     QTest::addColumn<bool>("startWithMin");
1977     QTest::addColumn<QDate>("minimumDate");
1978     QTest::addColumn<QDate>("maximumDate");
1979     QTest::addColumn<uint>("section");
1980     QTest::addColumn<QDate>("newDate");
1981
1982     QTest::newRow("data0") << false << QDate(1999, 1, 1) << QDate(1999, 1, 31) << (uint)QDateTimeEdit::DaySection
1983                         << QDate(1999, 1, 1);
1984     QTest::newRow("data1") << true << QDate(1999, 1, 1) << QDate(1999, 1, 31) << (uint)QDateTimeEdit::DaySection
1985                         << QDate(1999, 1, 31);
1986     QTest::newRow("data2") << false << QDate(1999, 1, 1) << QDate(1999, 1, 31) << (uint)QDateTimeEdit::MonthSection
1987                         << QDate(1999, 1, 31);
1988     QTest::newRow("data3") << true << QDate(1999, 1, 1) << QDate(1999, 1, 31) << (uint)QDateTimeEdit::MonthSection
1989                         << QDate(1999, 1, 1);
1990     QTest::newRow("data4") << false << QDate(1999, 1, 1) << QDate(1999, 1, 31) << (uint)QDateTimeEdit::YearSection
1991                         << QDate(1999, 1, 31);
1992     QTest::newRow("data5") << true << QDate(1999, 1, 1) << QDate(1999, 1, 31) << (uint)QDateTimeEdit::YearSection
1993                         << QDate(1999, 1, 1);
1994     QTest::newRow("data6") << false << QDate(1999, 1, 1) << QDate(2000, 1, 31) << (uint)QDateTimeEdit::DaySection
1995                         << QDate(2000, 1, 1);
1996     QTest::newRow("data7") << true << QDate(1999, 1, 1) << QDate(2000, 1, 31) << (uint)QDateTimeEdit::DaySection
1997                         << QDate(1999, 1, 31);
1998     QTest::newRow("data8") << false << QDate(1999, 1, 1) << QDate(2000, 1, 31) << (uint)QDateTimeEdit::MonthSection
1999                         << QDate(2000, 1, 31);
2000     QTest::newRow("data9") << true << QDate(1999, 1, 1) << QDate(2000, 1, 31) << (uint)QDateTimeEdit::MonthSection
2001                         << QDate(1999, 12, 1);
2002     QTest::newRow("data10") << false << QDate(1999, 1, 1) << QDate(2000, 1, 31) << (uint)QDateTimeEdit::YearSection
2003                          << QDate(1999, 1, 31);
2004     QTest::newRow("data11") << true << QDate(1999, 1, 1) << QDate(2000, 1, 31) << (uint)QDateTimeEdit::YearSection
2005                          << QDate(2000, 1, 1);
2006 }
2007
2008
2009 void tst_QDateTimeEdit::wrappingDate()
2010 {
2011     QFETCH(bool, startWithMin);
2012     QFETCH(QDate, minimumDate);
2013     QFETCH(QDate, maximumDate);
2014     QFETCH(uint, section);
2015     QFETCH(QDate, newDate);
2016
2017     testWidget->setDisplayFormat("dd/MM/yyyy");
2018     testWidget->setMinimumDate(minimumDate);
2019     testWidget->setMaximumDate(maximumDate);
2020     testWidget->setWrapping(true);
2021     testWidget->setCurrentSection((QDateTimeEdit::Section)section);
2022
2023     if (startWithMin) {
2024         testWidget->setDate(minimumDate);
2025         QTest::keyClick(testWidget, Qt::Key_Down);
2026     } else {
2027         testWidget->setDate(maximumDate);
2028         QTest::keyClick(testWidget, Qt::Key_Up);
2029     }
2030     if (testWidget->currentSection() == QDateTimeEdit::MonthSection)
2031         QCOMPARE(testWidget->date(), newDate);
2032 }
2033
2034 void tst_QDateTimeEdit::dateSignalChecking_data()
2035 {
2036     QTest::addColumn<QDate>("originalDate");
2037     QTest::addColumn<QDate>("newDate");
2038     QTest::addColumn<int>("timesEmitted");
2039
2040     QTest::newRow("data0") << QDate(2004, 06, 22) << QDate(2004, 07, 23) << 1;
2041     QTest::newRow("data1") << QDate(2004, 06, 22) << QDate(2004, 06, 22) << 0;
2042 }
2043
2044 void tst_QDateTimeEdit::dateSignalChecking()
2045 {
2046     QFETCH(QDate, originalDate);
2047     QFETCH(QDate, newDate);
2048     QFETCH(int, timesEmitted);
2049
2050     testWidget->setDate(originalDate);
2051
2052     QSignalSpy dateSpy(testWidget, SIGNAL(dateChanged(const QDate &)));
2053     QSignalSpy dateTimeSpy(testWidget, SIGNAL(dateTimeChanged(const QDateTime &)));
2054     QSignalSpy timeSpy(testWidget, SIGNAL(timeChanged(const QTime &)));
2055
2056     testWidget->setDate(newDate);
2057     QCOMPARE(dateSpy.count(), timesEmitted);
2058
2059     if (timesEmitted > 0) {
2060         QList<QVariant> list = dateSpy.takeFirst();
2061         QDate d;
2062         d = qvariant_cast<QDate>(list.at(0));
2063         QCOMPARE(d, newDate);
2064     }
2065     QCOMPARE(dateTimeSpy.count(), timesEmitted);
2066     QCOMPARE(timeSpy.count(), 0);
2067 }
2068
2069 void tst_QDateTimeEdit::timeSignalChecking_data()
2070 {
2071     QTest::addColumn<QTime>("originalTime");
2072     QTest::addColumn<QTime>("newTime");
2073     QTest::addColumn<int>("timesEmitted");
2074
2075     QTest::newRow("data0") << QTime(15, 55, 00) << QTime(15, 17, 12) << 1;
2076     QTest::newRow("data1") << QTime(15, 55, 00) << QTime(15, 55, 00) << 0;
2077 }
2078
2079 void tst_QDateTimeEdit::timeSignalChecking()
2080 {
2081     QFETCH(QTime, originalTime);
2082     QFETCH(QTime, newTime);
2083     QFETCH(int, timesEmitted);
2084
2085     testWidget->setTime(originalTime);
2086
2087     testWidget->setDisplayFormat("hh:mm:ss");
2088     QSignalSpy dateSpy(testWidget, SIGNAL(dateChanged(const QDate &)));
2089     QSignalSpy dateTimeSpy(testWidget, SIGNAL(dateTimeChanged(const QDateTime &)));
2090     QSignalSpy timeSpy(testWidget, SIGNAL(timeChanged(const QTime &)));
2091
2092     testWidget->setTime(newTime);
2093     QCOMPARE(timeSpy.count(), timesEmitted);
2094
2095     if (timesEmitted > 0) {
2096         QList<QVariant> list = timeSpy.takeFirst();
2097         QTime t;
2098         t = qvariant_cast<QTime>(list.at(0));
2099         QCOMPARE(t, newTime);
2100     }
2101     QCOMPARE(dateTimeSpy.count(), timesEmitted);
2102     QCOMPARE(dateSpy.count(), 0);
2103 }
2104
2105 void tst_QDateTimeEdit::dateTimeSignalChecking_data()
2106 {
2107     QTest::addColumn<QDateTime>("originalDateTime");
2108     QTest::addColumn<QDateTime>("newDateTime");
2109     QTest::addColumn<int>("timesDateEmitted");
2110     QTest::addColumn<int>("timesTimeEmitted");
2111     QTest::addColumn<int>("timesDateTimeEmitted");
2112
2113     QTest::newRow("data0") << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 0))
2114                         << QDateTime(QDate(2004, 7, 23), QTime(15, 17, 12))
2115                         << 1 << 1 << 1;
2116     QTest::newRow("data1") << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 0))
2117                         << QDateTime(QDate(2004, 6, 22), QTime(15, 17, 12))
2118                         << 0 << 1 << 1;
2119     QTest::newRow("data2") << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 0))
2120                         << QDateTime(QDate(2004, 7, 23), QTime(15, 55, 0))
2121                         << 1 << 0 << 1;
2122     QTest::newRow("data3") << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 0))
2123                         << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 0))
2124                         << 0 << 0 << 0;
2125 }
2126
2127 void tst_QDateTimeEdit::dateTimeSignalChecking()
2128 {
2129     QFETCH(QDateTime, originalDateTime);
2130     QFETCH(QDateTime, newDateTime);
2131     QFETCH(int, timesDateEmitted);
2132     QFETCH(int, timesTimeEmitted);
2133     QFETCH(int, timesDateTimeEmitted);
2134
2135     testWidget->setDisplayFormat("dd/MM/yyyy hh:mm:ss");
2136     testWidget->setDateTime(originalDateTime);
2137
2138     QSignalSpy dateSpy(testWidget, SIGNAL(dateChanged(const QDate &)));
2139     QSignalSpy timeSpy(testWidget, SIGNAL(timeChanged(const QTime &)));
2140     QSignalSpy dateTimeSpy(testWidget, SIGNAL(dateTimeChanged(const QDateTime &)));
2141
2142     testWidget->setDateTime(newDateTime);
2143     QCOMPARE(dateSpy.count(), timesDateEmitted);
2144     if (timesDateEmitted > 0) {
2145         QCOMPARE(timesDateEmitted, 1);
2146         QList<QVariant> list = dateSpy.takeFirst();
2147         QDate d;
2148         d = qvariant_cast<QDate>(list.at(0));
2149         QCOMPARE(d, newDateTime.date());
2150     }
2151     QCOMPARE(timeSpy.count(), timesTimeEmitted);
2152     if (timesTimeEmitted > 0) {
2153         QList<QVariant> list = timeSpy.takeFirst();
2154         QTime t;
2155         t = qvariant_cast<QTime>(list.at(0));
2156         QCOMPARE(t, newDateTime.time());
2157     }
2158     QCOMPARE(dateTimeSpy.count(), timesDateTimeEmitted);
2159     if (timesDateTimeEmitted > 0) {
2160         QList<QVariant> list = dateTimeSpy.takeFirst();
2161         QDateTime dt;
2162         dt = qvariant_cast<QDateTime>(list.at(0));
2163         QCOMPARE(dt, newDateTime);
2164     }
2165 }
2166
2167
2168 void tst_QDateTimeEdit::sectionText_data()
2169 {
2170     QTest::addColumn<QString>("format");
2171     QTest::addColumn<QDateTime>("dateTime");
2172     QTest::addColumn<uint>("section");
2173     QTest::addColumn<QString>("sectionText");
2174
2175     QTest::newRow("data0") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2176                         << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2177                         << (uint)QDateTimeEdit::NoSection << QString();
2178     QTest::newRow("data1") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2179                         << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2180                         << (uint)QDateTimeEdit::AmPmSection << QString("pm");
2181     QTest::newRow("data2") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2182                         << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2183                         << (uint)QDateTimeEdit::MSecSection << QString("789");
2184     QTest::newRow("data3") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2185                         << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2186                         << (uint)QDateTimeEdit::SecondSection << QString("03");
2187     QTest::newRow("data4") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2188                         << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2189                         << (uint)QDateTimeEdit::MinuteSection << QString("55");
2190     QTest::newRow("data5") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2191                         << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2192                         << (uint)QDateTimeEdit::HourSection << QString("03");
2193     QTest::newRow("data6") << QString("dd/MM/yyyy hh:mm:ss zzz")
2194                         << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2195                         << (uint)QDateTimeEdit::HourSection << QString("15");
2196     QTest::newRow("data7") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2197                         << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2198                         << (uint)QDateTimeEdit::DaySection << QString("22");
2199     QTest::newRow("data8") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2200                         << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2201                         << (uint)QDateTimeEdit::MonthSection << QString("06");
2202     QTest::newRow("data9") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2203                         << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2204                         << (uint)QDateTimeEdit::YearSection << QString("2004");
2205     QTest::newRow("data10") << QString("dd/MM/yyyy hh:mm:ss zzz AP")
2206                          << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2207                          << (uint)QDateTimeEdit::AmPmSection << QString("PM");
2208     QTest::newRow("data11") << QString("dd/MM/yyyy hh:mm:ss ap")
2209                          << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 3, 789))
2210                          << (uint)QDateTimeEdit::MSecSection << QString();
2211 }
2212
2213 void tst_QDateTimeEdit::sectionText()
2214 {
2215     QFETCH(QString, format);
2216     QFETCH(QDateTime, dateTime);
2217     QFETCH(uint, section);
2218     QFETCH(QString, sectionText);
2219
2220     testWidget->setDisplayFormat(format);
2221     testWidget->setDateTime(dateTime);
2222     QCOMPARE(testWidget->sectionText((QDateTimeEdit::Section)section), sectionText);
2223 //    QApplication::setLayoutDirection(Qt::RightToLeft);
2224 //    testWidget->setDisplayFormat(format);
2225 //    QCOMPARE(format, testWidget->displayFormat());
2226 //     testWidget->setDateTime(dateTime);
2227 //     QCOMPARE(testWidget->sectionText((QDateTimeEdit::Section)section), sectionText);
2228 //     QApplication::setLayoutDirection(Qt::LeftToRight);
2229 }
2230
2231 void tst_QDateTimeEdit::mousePress()
2232 {
2233     testWidget->setDate(QDate(2004, 6, 23));
2234     testWidget->setCurrentSection(QDateTimeEdit::YearSection);
2235     QCOMPARE(testWidget->currentSection(), QDateTimeEdit::YearSection);
2236
2237     // Ask the SC_SpinBoxUp button location from style
2238     QStyleOptionSpinBox so;
2239     so.rect = testWidget->rect();
2240     QRect rectUp = testWidget->style()->subControlRect(QStyle::CC_SpinBox, &so, QStyle::SC_SpinBoxUp, testWidget);
2241
2242     // Send mouseClick to center of SC_SpinBoxUp
2243     QTest::mouseClick(testWidget, Qt::LeftButton, 0, rectUp.center());
2244     QCOMPARE(testWidget->date().year(), 2005);
2245
2246 }
2247
2248 void tst_QDateTimeEdit::stepHourAMPM_data()
2249 {
2250     QTest::addColumn<QString>("format");
2251     QTest::addColumn<KeyList>("keys");
2252     QTest::addColumn<TimeList>("expected");
2253     QTest::addColumn<QTime>("start");
2254     QTest::addColumn<QTime>("min");
2255     QTest::addColumn<QTime>("max");
2256
2257     {
2258         KeyList keys;
2259         TimeList expected;
2260         keys << Qt::Key_Up;
2261         expected << QTime(1, 0, 0);
2262         keys << Qt::Key_Up;
2263         expected << QTime(2, 0, 0);
2264         keys << Qt::Key_Up;
2265         expected << QTime(3, 0, 0);
2266         keys << Qt::Key_Up;
2267         expected << QTime(4, 0, 0);
2268         keys << Qt::Key_Up;
2269         expected << QTime(5, 0, 0);
2270         keys << Qt::Key_Up;
2271         expected << QTime(6, 0, 0);
2272         keys << Qt::Key_Up;
2273         expected << QTime(7, 0, 0);
2274         keys << Qt::Key_Up;
2275         expected << QTime(8, 0, 0);
2276         keys << Qt::Key_Up;
2277         expected << QTime(9, 0, 0);
2278         keys << Qt::Key_Up;
2279         expected << QTime(10, 0, 0);
2280         keys << Qt::Key_Up;
2281         expected << QTime(11, 0, 0);
2282         keys << Qt::Key_Up;
2283         expected << QTime(12, 0, 0);
2284         keys << Qt::Key_Up;
2285         expected << QTime(13, 0, 0);
2286         keys << Qt::Key_Up;
2287         expected << QTime(14, 0, 0);
2288         keys << Qt::Key_Up;
2289         expected << QTime(15, 0, 0);
2290         keys << Qt::Key_Up;
2291         expected << QTime(16, 0, 0);
2292         keys << Qt::Key_Up;
2293         expected << QTime(17, 0, 0);
2294         keys << Qt::Key_Up;
2295         expected << QTime(18, 0, 0);
2296         keys << Qt::Key_Up;
2297         expected << QTime(19, 0, 0);
2298         keys << Qt::Key_Up;
2299         expected << QTime(20, 0, 0);
2300         keys << Qt::Key_Up;
2301         expected << QTime(21, 0, 0);
2302         keys << Qt::Key_Up;
2303         expected << QTime(22, 0, 0);
2304         keys << Qt::Key_Up;
2305         expected << QTime(23, 0, 0);
2306         keys << Qt::Key_Down;
2307         expected << QTime(22, 0, 0);
2308         keys << Qt::Key_Down;
2309         expected << QTime(21, 0, 0);
2310         keys << Qt::Key_Down;
2311         expected << QTime(20, 0, 0);
2312         keys << Qt::Key_Down;
2313         expected << QTime(19, 0, 0);
2314         keys << Qt::Key_Down;
2315         expected << QTime(18, 0, 0);
2316         keys << Qt::Key_Down;
2317         expected << QTime(17, 0, 0);
2318         keys << Qt::Key_Down;
2319         expected << QTime(16, 0, 0);
2320         keys << Qt::Key_Down;
2321         expected << QTime(15, 0, 0);
2322         keys << Qt::Key_Down;
2323         expected << QTime(14, 0, 0);
2324         keys << Qt::Key_Down;
2325         expected << QTime(13, 0, 0);
2326         keys << Qt::Key_Down;
2327         expected << QTime(12, 0, 0);
2328         keys << Qt::Key_Down;
2329         expected << QTime(11, 0, 0);
2330         keys << Qt::Key_Down;
2331         expected << QTime(10, 0, 0);
2332         keys << Qt::Key_Down;
2333         expected << QTime(9, 0, 0);
2334         keys << Qt::Key_Down;
2335         expected << QTime(8, 0, 0);
2336         keys << Qt::Key_Down;
2337         expected << QTime(7, 0, 0);
2338         keys << Qt::Key_Down;
2339         expected << QTime(6, 0, 0);
2340         keys << Qt::Key_Down;
2341         expected << QTime(5, 0, 0);
2342         keys << Qt::Key_Down;
2343         expected << QTime(4, 0, 0);
2344         keys << Qt::Key_Down;
2345         expected << QTime(3, 0, 0);
2346         keys << Qt::Key_Down;
2347         expected << QTime(2, 0, 0);
2348         keys << Qt::Key_Down;
2349         expected << QTime(1, 0, 0);
2350         keys << Qt::Key_Down;
2351         expected << QTime(0, 0, 0);
2352
2353         QTest::newRow("hh 1") << QString("hh") << keys << expected << QTime(0, 0)
2354                               << QTime(0, 0) << QTime(23, 59, 59);
2355         QTest::newRow("hh:ap 1") << QString("hh:ap") << keys << expected
2356                                  << QTime(0, 0) << QTime(0, 0)
2357                                  << QTime(23, 59, 59);
2358
2359         QTest::newRow("HH:ap 2") << QString("HH:ap") << keys << expected
2360                                  << QTime(0, 0) << QTime(0, 0)
2361                                  << QTime(23, 59, 59);
2362
2363     }
2364     {
2365         KeyList keys;
2366         TimeList expected;
2367         keys << Qt::Key_Down;
2368         expected << QTime(2, 0, 0);
2369         QTest::newRow("hh 2") << QString("hh") << keys << expected << QTime(0, 0) << QTime(2, 0, 0) << QTime(23, 59, 59);
2370         QTest::newRow("hh:ap 2") << QString("hh:ap") << keys << expected << QTime(0, 0) << QTime(2, 0, 0) << QTime(23, 59, 59);
2371     }
2372     {
2373         KeyList keys;
2374         TimeList expected;
2375         keys << Qt::Key_Up;
2376         expected << QTime(23, 0, 0);
2377         keys << Qt::Key_Up;
2378         expected << QTime(23, 0, 0);
2379         QTest::newRow("hh 3") << QString("hh") << keys << expected << QTime(0, 0) << QTime(22, 0, 0)
2380                               << QTime(23, 59, 59);
2381         QTest::newRow("hh:ap 3") << QString("hh:ap") << keys << expected << QTime(0, 0)
2382                                  << QTime(22, 0, 0) << QTime(23, 59, 59);
2383     }
2384     {
2385         KeyList keys;
2386         TimeList expected;
2387         keys << Qt::Key_Up;
2388         expected << QTime(15, 31, 0);
2389         QTest::newRow("hh:mm:ap 3") << QString("hh:mm:ap") << keys << expected << QTime(15, 31, 0)
2390                                     << QTime(9, 0, 0) << QTime(16, 0, 0);
2391         QTest::newRow("hh:mm 3") << QString("hh:mm") << keys << expected << QTime(15, 31, 0)
2392                                  << QTime(9, 0, 0) << QTime(16, 0, 0);
2393     }
2394 }
2395
2396 void tst_QDateTimeEdit::stepHourAMPM()
2397 {
2398     QFETCH(QString, format);
2399     QFETCH(KeyList, keys);
2400     QFETCH(TimeList, expected);
2401     QFETCH(QTime, start);
2402     QFETCH(QTime, min);
2403     QFETCH(QTime, max);
2404
2405
2406     testWidget->setDisplayFormat(format);
2407     testWidget->setTime(start);
2408     testWidget->setMinimumTime(min);
2409     testWidget->setMaximumTime(max);
2410     if (keys.size() != expected.size()) {
2411         qWarning("%s:%d Test broken", __FILE__, __LINE__);
2412         QCOMPARE(keys.size(), expected.size());
2413     }
2414
2415     for (int i=0; i<keys.size(); ++i) {
2416         QTest::keyClick(testWidget, keys.at(i));
2417         QCOMPARE(testWidget->time(), expected.at(i));
2418     }
2419 }
2420
2421
2422 void tst_QDateTimeEdit::displayedSections_data()
2423 {
2424     QTest::addColumn<QString>("format");
2425     QTest::addColumn<uint>("section");
2426
2427     QTest::newRow("data0") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2428                         << (uint)(QDateTimeEdit::DaySection | QDateTimeEdit::MonthSection
2429                                   | QDateTimeEdit::YearSection | QDateTimeEdit::HourSection
2430                                   | QDateTimeEdit::MinuteSection | QDateTimeEdit::SecondSection
2431                                   | QDateTimeEdit::MSecSection | QDateTimeEdit::AmPmSection);
2432     QTest::newRow("data1") << QString("dd/yyyy hh:mm:ss zzz ap")
2433                         << (uint)(QDateTimeEdit::DaySection
2434                                   | QDateTimeEdit::YearSection | QDateTimeEdit::HourSection
2435                                   | QDateTimeEdit::MinuteSection | QDateTimeEdit::SecondSection
2436                                   | QDateTimeEdit::MSecSection | QDateTimeEdit::AmPmSection);
2437     QTest::newRow("data2") << QString("dd/MM/yyyy mm zzz ap")
2438                         << (uint)(QDateTimeEdit::DaySection | QDateTimeEdit::MonthSection
2439                                   | QDateTimeEdit::YearSection
2440                                   | QDateTimeEdit::MinuteSection
2441                                   | QDateTimeEdit::MSecSection | QDateTimeEdit::AmPmSection);
2442     QTest::newRow("data3") << QString("dd/MM/yyyy")
2443                         << (uint)(QDateTimeEdit::DaySection | QDateTimeEdit::MonthSection
2444                                   | QDateTimeEdit::YearSection);
2445     QTest::newRow("data4") << QString("hh:mm:ss zzz ap")
2446                         << (uint)(QDateTimeEdit::HourSection
2447                                   | QDateTimeEdit::MinuteSection | QDateTimeEdit::SecondSection
2448                                   | QDateTimeEdit::MSecSection | QDateTimeEdit::AmPmSection);
2449     QTest::newRow("data5") << QString("dd ap")
2450                         << (uint)(QDateTimeEdit::DaySection | QDateTimeEdit::AmPmSection);
2451     QTest::newRow("data6") << QString("zzz")
2452                         << (uint)QDateTimeEdit::MSecSection;
2453 }
2454
2455 void tst_QDateTimeEdit::displayedSections()
2456 {
2457     QFETCH(QString, format);
2458     QFETCH(uint, section);
2459
2460     testWidget->setDisplayFormat(format);
2461     QVERIFY((QDateTimeEdit::Section)section == testWidget->displayedSections());
2462 }
2463
2464 void tst_QDateTimeEdit::currentSection_data()
2465 {
2466     QTest::addColumn<QString>("format");
2467     QTest::addColumn<uint>("section");
2468     QTest::addColumn<uint>("currentSection");
2469
2470     // First is deliberate, this way we can make sure that it is not reset by specifying no section.
2471     QTest::newRow("data0") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2472                         << (uint)QDateTimeEdit::NoSection << (uint)QDateTimeEdit::YearSection;
2473     QTest::newRow("data1") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2474                         << (uint)QDateTimeEdit::AmPmSection << (uint)QDateTimeEdit::AmPmSection;
2475     QTest::newRow("data2") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2476                         << (uint)QDateTimeEdit::MSecSection << (uint)QDateTimeEdit::MSecSection;
2477     QTest::newRow("data3") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2478                         << (uint)QDateTimeEdit::SecondSection << (uint)QDateTimeEdit::SecondSection;
2479     QTest::newRow("data4") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2480                         << (uint)QDateTimeEdit::MinuteSection << (uint)QDateTimeEdit::MinuteSection;
2481     QTest::newRow("data5") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2482                         << (uint)QDateTimeEdit::HourSection << (uint)QDateTimeEdit::HourSection;
2483     QTest::newRow("data6") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2484                         << (uint)QDateTimeEdit::DaySection << (uint)QDateTimeEdit::DaySection;
2485     QTest::newRow("data7") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2486                         << (uint)QDateTimeEdit::MonthSection << (uint)QDateTimeEdit::MonthSection;
2487     QTest::newRow("data8") << QString("dd/MM/yyyy hh:mm:ss zzz ap")
2488                         << (uint)QDateTimeEdit::YearSection << (uint)QDateTimeEdit::YearSection;
2489     QTest::newRow("data9") << QString("dd/MM/yyyy hh:mm:ss zzz AP")
2490                         << (uint)QDateTimeEdit::AmPmSection << (uint)QDateTimeEdit::AmPmSection;
2491     QTest::newRow("data10") << QString("dd/MM/yyyy hh:mm:ss ap")
2492                          << (uint)QDateTimeEdit::MSecSection << (uint)QDateTimeEdit::DaySection;
2493 }
2494
2495 void tst_QDateTimeEdit::currentSection()
2496 {
2497     QFETCH(QString, format);
2498     QFETCH(uint, section);
2499     QFETCH(uint, currentSection);
2500
2501     testWidget->setDisplayFormat(format);
2502     if ((QDateTimeEdit::Section)section == QDateTimeEdit::NoSection)
2503         testWidget->setCurrentSection(QDateTimeEdit::YearSection); // Ensure it's not reset (see above)
2504     testWidget->setCurrentSection((QDateTimeEdit::Section)section);
2505     QVERIFY((QDateTimeEdit::Section)currentSection == testWidget->currentSection());
2506 }
2507
2508 void tst_QDateTimeEdit::readOnly()
2509 {
2510     testWidget->hide();
2511     QDateTimeEdit dt(QDate(2000, 2, 1));
2512     dt.setDisplayFormat("yyyy.MM.dd");
2513     dt.show();
2514     dt.setCurrentSection(QDateTimeEdit::DaySection);
2515     QTest::keyClick(&dt, Qt::Key_Up);
2516     QCOMPARE(dt.date(), QDate(2000, 2, 2));
2517     dt.setReadOnly(true);
2518     QTest::keyClick(&dt, Qt::Key_Up);
2519     QCOMPARE(dt.date(), QDate(2000, 2, 2));
2520     dt.stepBy(1); // stepBy should still work
2521     QCOMPARE(dt.date(), QDate(2000, 2, 3));
2522     dt.setReadOnly(false);
2523     QTest::keyClick(&dt, Qt::Key_Up);
2524     QCOMPARE(dt.date(), QDate(2000, 2, 4));
2525 }
2526
2527 void tst_QDateTimeEdit::weirdCase()
2528 {
2529     testWidget->lineEdit()->setCursorPosition(0);
2530     testWidget->setDateRange(QDate(2005, 1, 1), QDate(2010, 12, 31));
2531     testWidget->setDisplayFormat("dd//MM//yyyy");
2532     testWidget->setDate(testWidget->minimumDate());
2533     QTest::keyClick(testWidget, Qt::Key_Left);
2534     QVERIFY(!testWidget->lineEdit()->hasSelectedText());
2535     QCOMPARE(testWidget->lineEdit()->cursorPosition(), 0);
2536     QTest::keyClick(testWidget, Qt::Key_Right);
2537     QTest::keyClick(testWidget, Qt::Key_Right);
2538     QTest::keyClick(testWidget, Qt::Key_Right);
2539     QTest::keyClick(testWidget, Qt::Key_Right);
2540     QTest::keyClick(testWidget, Qt::Key_Right);
2541     QTest::keyClick(testWidget, Qt::Key_Right);
2542     QVERIFY(!testWidget->lineEdit()->hasSelectedText());
2543     QCOMPARE(testWidget->lineEdit()->cursorPosition(), 8);
2544
2545     QTest::keyClick(testWidget, Qt::Key_Delete);
2546     QCOMPARE(testWidget->text(), QString("01//01//005"));
2547     QTest::keyClick(testWidget, Qt::Key_4);
2548     QCOMPARE(testWidget->text(), QString("01//01//005"));
2549 }
2550
2551 void tst_QDateTimeEdit::newCase()
2552 {
2553     if (QDate::shortMonthName(6) != "Jun" || QDate::shortMonthName(7) != "Jul" ||
2554         QDate::longMonthName(6) != "June" || QDate::longMonthName(7) != "July")
2555         QSKIP("This test only works in English");
2556
2557     testWidget->setDisplayFormat("MMMM'a'MbMMMcMM");
2558     testWidget->setDate(QDate(2005, 6, 1));
2559     QCOMPARE(testWidget->text(), QString("Junea6bJunc06"));
2560 #ifdef Q_OS_MAC
2561     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2562 #else
2563     QTest::keyClick(testWidget, Qt::Key_Home);
2564 #endif
2565     QTest::keyClick(testWidget, Qt::Key_Up);
2566     QCOMPARE(testWidget->text(), QString("Julya7bJulc07"));
2567     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("July"));
2568 #ifdef Q_OS_MAC
2569     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2570 #else
2571     QTest::keyClick(testWidget, Qt::Key_Home);
2572 #endif
2573 #ifdef Q_OS_MAC
2574     QEXPECT_FAIL("", "QTBUG-23674", Abort);
2575 #endif
2576     QCOMPARE(testWidget->lineEdit()->selectedText(), QString());
2577     QTest::keyClick(testWidget, Qt::Key_Right);
2578     QTest::keyClick(testWidget, Qt::Key_Right);
2579     QTest::keyClick(testWidget, Qt::Key_Right);
2580     QTest::keyClick(testWidget, Qt::Key_Delete);
2581     QTest::keyClick(testWidget, Qt::Key_Left);
2582
2583
2584     QCOMPARE(testWidget->text(), QString("Jula7bJulc07"));
2585     QTest::keyClick(testWidget, Qt::Key_Delete);
2586     QCOMPARE(testWidget->text(), QString("Jua7bJulc07"));
2587     QTest::keyClick(testWidget, Qt::Key_N);
2588     QCOMPARE(testWidget->text(), QString("Juna7bJulc07"));
2589     QTest::keyClick(testWidget, Qt::Key_E);
2590     QCOMPARE(testWidget->text(), QString("Junea6bJunc06"));
2591 }
2592
2593 void tst_QDateTimeEdit::newCase2()
2594 {
2595     testWidget->setDisplayFormat("MMMM yyyy-MM-dd MMMM");
2596     testWidget->setDate(QDate(2005, 8, 8));
2597     QTest::keyClick(testWidget, Qt::Key_Return);
2598     QTest::keyClick(testWidget, Qt::Key_Backspace);
2599     QCOMPARE(testWidget->text(), QString(" 2005-08-08 ") + QDate::longMonthName(8));
2600 }
2601
2602 void tst_QDateTimeEdit::newCase3()
2603 {
2604     if (!QDate::longMonthName(1).startsWith("Januar"))
2605         QSKIP("This test does not work in this locale");
2606
2607     testWidget->setDisplayFormat("dd MMMM yyyy");
2608     testWidget->setDate(QDate(2000, 1, 1));
2609     testWidget->setGeometry(QRect(QPoint(0, 0), testWidget->sizeHint()));
2610     testWidget->setCurrentSection(QDateTimeEdit::MonthSection);
2611     QTest::keyClick(testWidget, Qt::Key_Return);
2612     QTest::keyClick(testWidget, Qt::Key_J);
2613     QCOMPARE(testWidget->lineEdit()->displayText(), QString("01 J 2000"));
2614     QCOMPARE(testWidget->lineEdit()->cursorPosition(), 4);
2615     QTest::keyClick(testWidget, Qt::Key_A);
2616     QTest::keyClick(testWidget, Qt::Key_N);
2617     QTest::keyClick(testWidget, Qt::Key_U);
2618     QTest::keyClick(testWidget, Qt::Key_A);
2619     QTest::keyClick(testWidget, Qt::Key_R);
2620 }
2621
2622
2623 void tst_QDateTimeEdit::cursorPos()
2624 {
2625     if (QDate::longMonthName(1) != "January")
2626         QSKIP("This test only works in English");
2627
2628     testWidget->setDisplayFormat("dd MMMM yyyy");
2629     //testWidget->setGeometry(0, 0, 200, 200);
2630     testWidget->setCurrentSection(QDateTimeEdit::MonthSection);
2631     QTest::keyClick(testWidget, Qt::Key_Return);
2632     QCOMPARE(testWidget->lineEdit()->cursorPosition(), 10);
2633     QTest::keyClick(testWidget, Qt::Key_J);
2634     QTest::keyClick(testWidget, Qt::Key_A);
2635     QTest::keyClick(testWidget, Qt::Key_N);
2636     QTest::keyClick(testWidget, Qt::Key_U);
2637     QTest::keyClick(testWidget, Qt::Key_A);
2638     QTest::keyClick(testWidget, Qt::Key_R);
2639     //QCursor::setPos(20, 20);
2640     //QEventLoop l;
2641     //l.exec();
2642     QTest::keyClick(testWidget, Qt::Key_Y);
2643     QCOMPARE(testWidget->lineEdit()->cursorPosition(), 11);
2644 #ifdef Q_OS_MAC
2645     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2646 #else
2647     QTest::keyClick(testWidget, Qt::Key_Home);
2648 #endif
2649     QTest::keyClick(testWidget, Qt::Key_Return);
2650     QTest::keyClick(testWidget, Qt::Key_3);
2651     QTest::keyClick(testWidget, Qt::Key_1);
2652 #ifdef Q_OS_MAC
2653     QEXPECT_FAIL("", "QTBUG-23674", Abort);
2654 #endif
2655     QCOMPARE(testWidget->lineEdit()->cursorPosition(), 3);
2656 }
2657
2658 void tst_QDateTimeEdit::newCase4()
2659 {
2660     testWidget->setDisplayFormat("hh:mm");
2661     testWidget->setMinimumTime(QTime(3, 3, 0));
2662     QTest::keyClick(testWidget, Qt::Key_Return);
2663     QTest::keyClick(testWidget, Qt::Key_0);
2664     QCOMPARE(testWidget->lineEdit()->displayText(), QString("0:03"));
2665     QTest::keyClick(testWidget, Qt::Key_2);
2666     QCOMPARE(testWidget->lineEdit()->displayText(), QString("0:03"));
2667     QTest::keyClick(testWidget, Qt::Key_4);
2668     QCOMPARE(testWidget->lineEdit()->displayText(), QString("04:03"));
2669 }
2670
2671 void tst_QDateTimeEdit::newCase5()
2672 {
2673     testWidget->setDisplayFormat("yyyy-MM-dd hh:mm:ss zzz 'ms'");
2674     testWidget->setDateTime(QDateTime(QDate(2005, 10, 7), QTime(17, 44, 13, 100)));
2675     testWidget->show();
2676     QCOMPARE(testWidget->lineEdit()->displayText(), QString("2005-10-07 17:44:13 100 ms"));
2677 #ifdef Q_OS_MAC
2678     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
2679 #else
2680     QTest::keyClick(testWidget, Qt::Key_End);
2681 #endif
2682     QTest::keyClick(testWidget, Qt::Key_Backtab, Qt::ShiftModifier);
2683
2684     QTest::keyClick(testWidget, Qt::Key_Return);
2685     QTest::keyClick(testWidget, Qt::Key_1);
2686     QTest::keyClick(testWidget, Qt::Key_2);
2687     QTest::keyClick(testWidget, Qt::Key_4);
2688 #ifdef Q_OS_MAC
2689     QEXPECT_FAIL("", "QTBUG-23674", Abort);
2690 #endif
2691     QCOMPARE(testWidget->lineEdit()->displayText(), QString("2005-10-07 17:44:13 124 ms"));
2692
2693     QTest::keyClick(testWidget, Qt::Key_Backspace);
2694     QCOMPARE(testWidget->lineEdit()->displayText(), QString("2005-10-07 17:44:13 12 ms"));
2695 }
2696
2697 void tst_QDateTimeEdit::newCase6()
2698 {
2699     testWidget->setDisplayFormat("d-yyyy-MM-dd");
2700     testWidget->setDate(QDate(2005, 10, 7));
2701     testWidget->show();
2702     QCOMPARE(testWidget->lineEdit()->displayText(), QString("7-2005-10-07"));
2703 #ifdef Q_OS_MAC
2704     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2705 #else
2706     QTest::keyClick(testWidget, Qt::Key_Home);
2707 #endif
2708     QTest::keyClick(testWidget, Qt::Key_Return);
2709     QTest::keyClick(testWidget, Qt::Key_1);
2710     QTest::keyClick(testWidget, Qt::Key_2);
2711     QCOMPARE(testWidget->lineEdit()->displayText(), QString("12-2005-10-12"));
2712 }
2713
2714
2715 void tst_QDateTimeEdit::task98554()
2716 {
2717     testWidget->setDisplayFormat("mm.ss.zzz(ms)");
2718     testWidget->setTime(QTime(0, 0, 9));
2719     testWidget->setCurrentSection(QDateTimeEdit::SecondSection);
2720     testWidget->show();
2721     QCOMPARE(testWidget->lineEdit()->displayText(), QString("00.09.000(09)"));
2722     QCOMPARE(testWidget->time(), QTime(0, 0, 9, 0));
2723     QTest::keyClick(testWidget, Qt::Key_Up);
2724     QCOMPARE(testWidget->lineEdit()->displayText(), QString("00.10.000(010)"));
2725     QCOMPARE(testWidget->time(), QTime(0, 0, 10, 0));
2726 }
2727
2728 static QList<int> makeList(int val1, int val2, int val3)
2729 {
2730     QList<int> ret;
2731     ret << val1 << val2 << val3;
2732     return ret;
2733 }
2734
2735
2736 void tst_QDateTimeEdit::setCurrentSection_data()
2737 {
2738     QTest::addColumn<QString>("format");
2739     QTest::addColumn<QDateTime>("dateTime");
2740     QTest::addColumn<QList<int> >("setCurrentSections");
2741     QTest::addColumn<QList<int> >("expectedCursorPositions");
2742
2743     QTest::newRow("Day") << QString("dd/MM/yyyy hh:mm:ss.zzz d/M/yy h:m:s.z") << QDateTime(QDate(2001, 1, 1), QTime(1, 2, 3, 4))
2744                          << makeList(QDateTimeEdit::DaySection, QDateTimeEdit::DaySection, QDateTimeEdit::DaySection)
2745                          << makeList(24, 0, 24);
2746     QTest::newRow("Month") << QString("dd/MM/yyyy hh:mm:ss.zzz d/M/yy h:m:s.z") << QDateTime(QDate(2001, 1, 1), QTime(1, 2, 3, 4))
2747                            << makeList(QDateTimeEdit::MonthSection, QDateTimeEdit::MonthSection, QDateTimeEdit::MonthSection)
2748                            << makeList(3, 26, 3);
2749     QTest::newRow("Year") << QString("dd/MM/yyyy hh:mm:ss.zzz d/M/yy h:m:s.z") << QDateTime(QDate(2001, 1, 1), QTime(1, 2, 3, 4))
2750                           << makeList(QDateTimeEdit::YearSection, QDateTimeEdit::YearSection, QDateTimeEdit::YearSection)
2751                           << makeList(6, 28, 6);
2752     QTest::newRow("Hour") << QString("dd/MM/yyyy hh:mm:ss.zzz d/M/yy h:m:s.z") << QDateTime(QDate(2001, 1, 1), QTime(1, 2, 3, 4))
2753                           << makeList(QDateTimeEdit::HourSection, QDateTimeEdit::HourSection, QDateTimeEdit::HourSection)
2754                           << makeList(11, 31, 11);
2755     QTest::newRow("Minute") << QString("dd/MM/yyyy hh:mm:ss.zzz d/M/yy h:m:s.z") << QDateTime(QDate(2001, 1, 1), QTime(1, 2, 3, 4))
2756                             << makeList(QDateTimeEdit::MinuteSection, QDateTimeEdit::MinuteSection, QDateTimeEdit::MinuteSection)
2757                             << makeList(14, 33, 14);
2758     QTest::newRow("Second") << QString("dd/MM/yyyy hh:mm:ss.zzz d/M/yy h:m:s.z") << QDateTime(QDate(2001, 1, 1), QTime(1, 2, 3, 4))
2759                             << makeList(QDateTimeEdit::SecondSection, QDateTimeEdit::SecondSection, QDateTimeEdit::SecondSection)
2760                             << makeList(17, 35, 17);
2761     QTest::newRow("MSec") << QString("dd/MM/yyyy hh:mm:ss.zzz d/M/yy h:m:s.z") << QDateTime(QDate(2001, 1, 1), QTime(1, 2, 3, 4))
2762                           << makeList(QDateTimeEdit::MSecSection, QDateTimeEdit::MSecSection, QDateTimeEdit::MSecSection)
2763                           << makeList(20, 37, 20);
2764 }
2765
2766 void tst_QDateTimeEdit::setCurrentSection()
2767 {
2768     QFETCH(QString, format);
2769     QFETCH(QDateTime, dateTime);
2770     QFETCH(QList<int>, setCurrentSections);
2771     QFETCH(QList<int>, expectedCursorPositions);
2772
2773     QCOMPARE(setCurrentSections.size(), expectedCursorPositions.size());
2774     testWidget->setDisplayFormat(format);
2775     testWidget->setDateTime(dateTime);
2776 #ifdef Q_OS_MAC
2777     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2778 #else
2779     QTest::keyClick(testWidget, Qt::Key_Home);
2780 #endif
2781
2782     testWidget->resize(400, 100);
2783     for (int i=0; i<setCurrentSections.size(); ++i) {
2784         testWidget->setCurrentSection((QDateTimeEdit::Section)setCurrentSections.at(i));
2785         QCOMPARE(testWidget->currentSection(), (QDateTimeEdit::Section)setCurrentSections.at(i));
2786         QCOMPARE(testWidget->lineEdit()->cursorPosition(), expectedCursorPositions.at(i));
2787     }
2788 }
2789
2790
2791 void tst_QDateTimeEdit::setSelectedSection()
2792 {
2793     testWidget->setDisplayFormat("mm.ss.zzz('ms') m");
2794     testWidget->setTime(QTime(0, 0, 9));
2795     testWidget->show();
2796 #ifdef Q_OS_MAC
2797     QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2798 #else
2799     QTest::keyClick(testWidget, Qt::Key_Home);
2800 #endif
2801 #ifdef Q_OS_MAC
2802     QEXPECT_FAIL("", "QTBUG-23674", Abort);
2803 #endif
2804     QVERIFY(!testWidget->lineEdit()->hasSelectedText());
2805     testWidget->setSelectedSection(QDateTimeEdit::MinuteSection);
2806     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("00"));
2807     testWidget->setCurrentSection(QDateTimeEdit::MinuteSection);
2808     testWidget->setSelectedSection(QDateTimeEdit::MinuteSection);
2809     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("0"));
2810     testWidget->setSelectedSection(QDateTimeEdit::SecondSection);
2811     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("09"));
2812     testWidget->setSelectedSection(QDateTimeEdit::NoSection);
2813     QVERIFY(!testWidget->lineEdit()->hasSelectedText());
2814 }
2815
2816 void tst_QDateTimeEdit::calendarPopup()
2817 {
2818     {
2819         QDateEdit edit;
2820         QVERIFY(!edit.calendarWidget());
2821         edit.setCalendarPopup(true);
2822         QVERIFY(edit.calendarWidget());
2823     }
2824
2825     {
2826         QTimeEdit edit;
2827         QVERIFY(!edit.calendarWidget());
2828         edit.setCalendarPopup(true);
2829         QVERIFY(!edit.calendarWidget());
2830     }
2831
2832     {
2833         QDateEdit edit;
2834         QVERIFY(!edit.calendarWidget());
2835         QCalendarWidget *cw = new QCalendarWidget;
2836         edit.setCalendarWidget(cw);
2837         QVERIFY(!edit.calendarWidget());
2838         edit.setCalendarPopup(true);
2839         edit.setCalendarWidget(cw);
2840         QCOMPARE(edit.calendarWidget(), cw);
2841         edit.setDateRange(QDate(1980, 1, 5), QDate(1980, 2, 11));
2842         QCOMPARE(cw->minimumDate(), edit.minimumDate());
2843         QCOMPARE(cw->maximumDate(), edit.maximumDate());
2844         edit.setDate(QDate(1980, 1, 31));
2845         QCOMPARE(edit.date(), cw->selectedDate());
2846         cw->setSelectedDate(QDate(1980, 1, 30));
2847         QCOMPARE(edit.date(), cw->selectedDate());
2848     }
2849
2850     testWidget->setDisplayFormat("dd/MM/yyyy");
2851     testWidget->setDateTime(QDateTime(QDate(2000, 1, 1), QTime(0, 0)));
2852     testWidget->show();
2853     testWidget->setCalendarPopup(true);
2854     QCOMPARE(testWidget->calendarPopup(), true);
2855     QStyle *style = testWidget->style();
2856     QStyleOptionComboBox opt;
2857     opt.initFrom(testWidget);
2858     opt.editable = true;
2859     opt.subControls = QStyle::SC_ComboBoxArrow;
2860     QRect rect = style->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxArrow, testWidget);
2861     QTest::mouseClick(testWidget, Qt::LeftButton, 0, QPoint(rect.left()+rect.width()/2, rect.top()+rect.height()/2));
2862     QWidget *wid = qFindChild<QWidget *>(testWidget, "qt_datetimedit_calendar");
2863     QVERIFY(wid != 0);
2864     testWidget->hide();
2865
2866     QTimeEdit timeEdit;
2867     timeEdit.setCalendarPopup(true);
2868     timeEdit.show();
2869
2870     opt.initFrom(&timeEdit);
2871     opt.subControls = QStyle::SC_ComboBoxArrow;
2872     rect = style->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxArrow, &timeEdit);
2873     QTest::mouseClick(&timeEdit, Qt::LeftButton, 0, QPoint(rect.left()+rect.width()/2, rect.top()+rect.height()/2));
2874     QWidget *wid2 = qFindChild<QWidget *>(&timeEdit, "qt_datetimedit_calendar");
2875     QVERIFY(wid2 == 0);
2876     timeEdit.hide();
2877
2878
2879     QDateEdit dateEdit;
2880     dateEdit.setCalendarPopup(true);
2881     dateEdit.setReadOnly(true);
2882     dateEdit.show();
2883
2884     opt.initFrom(&dateEdit);
2885     opt.subControls = QStyle::SC_ComboBoxArrow;
2886     rect = style->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxArrow, &dateEdit);
2887     QTest::mouseClick(&dateEdit, Qt::LeftButton, 0, QPoint(rect.left()+rect.width()/2, rect.top()+rect.height()/2));
2888     QWidget *wid3 = qFindChild<QWidget *>(&dateEdit, "qt_datetimedit_calendar");
2889     QVERIFY(wid3 == 0);
2890     dateEdit.hide();
2891
2892 }
2893
2894 class RestoreLayoutDirectioner
2895 {
2896 public:
2897     RestoreLayoutDirectioner(Qt::LayoutDirection was)
2898         : old(was)
2899     {}
2900
2901     ~RestoreLayoutDirectioner()
2902     {
2903         QApplication::setLayoutDirection(old);
2904     }
2905 private:
2906     const Qt::LayoutDirection old;
2907 };
2908
2909 void tst_QDateTimeEdit::reverseTest()
2910 {
2911     const RestoreLayoutDirectioner restorer(QApplication::layoutDirection());
2912     QApplication::setLayoutDirection(Qt::RightToLeft);
2913     testWidget->setDisplayFormat("dd/MM/yyyy");
2914     testWidget->setDate(QDate(2001, 3, 30));
2915     QCOMPARE(testWidget->lineEdit()->displayText(), QString("2001/03/30"));
2916 #ifdef Q_OS_MAC
2917     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
2918 #else
2919     QTest::keyClick(testWidget, Qt::Key_End);
2920 #endif
2921 #ifdef Q_OS_MAC
2922     QEXPECT_FAIL("", "QTBUG-23674", Abort);
2923 #endif
2924     QCOMPARE(testWidget->currentSection(), QDateTimeEdit::DaySection);
2925     QTest::keyClick(testWidget, Qt::Key_Up);
2926     QCOMPARE(testWidget->date(), QDate(2001, 3, 31));
2927     QCOMPARE(testWidget->lineEdit()->displayText(), QString("2001/03/31"));
2928 }
2929
2930
2931 void tst_QDateTimeEdit::hour12Test()
2932 {
2933     testWidget->setDisplayFormat("hh a");
2934     testWidget->setTime(QTime(0, 0, 0));
2935     QCOMPARE(testWidget->lineEdit()->displayText(), QString("12 am"));
2936     for (int i=0; i<11; ++i) {
2937         QTest::keyClick(testWidget, Qt::Key_Up);
2938     }
2939     QCOMPARE(testWidget->lineEdit()->displayText(), QString("11 am"));
2940     QTest::keyClick(testWidget, Qt::Key_Up);
2941     QCOMPARE(testWidget->lineEdit()->displayText(), QString("12 pm"));
2942     for (int i=0; i<11; ++i) {
2943         QTest::keyClick(testWidget, Qt::Key_Up);
2944     }
2945     QCOMPARE(testWidget->lineEdit()->displayText(), QString("11 pm"));
2946     QTest::keyClick(testWidget, Qt::Key_Up);
2947     QCOMPARE(testWidget->lineEdit()->displayText(), QString("11 pm"));
2948     for (int i=0; i<12; ++i) {
2949         QTest::keyClick(testWidget, Qt::Key_Down);
2950     }
2951     QCOMPARE(testWidget->lineEdit()->displayText(), QString("11 am"));
2952     QTest::keyClick(testWidget, Qt::Key_1);
2953     QCOMPARE(testWidget->lineEdit()->displayText(), QString("1 am"));
2954     QTest::keyClick(testWidget, Qt::Key_3);
2955     QCOMPARE(testWidget->lineEdit()->displayText(), QString("1 am"));
2956 }
2957
2958 void tst_QDateTimeEdit::yyTest()
2959 {
2960     testWidget->setDisplayFormat("dd-MMM-yy");
2961     testWidget->setTime(QTime(0, 0, 0));
2962     testWidget->setDateRange(QDate(2005, 1, 1), QDate(2010, 12, 31));
2963     testWidget->setDate(testWidget->minimumDate());
2964     testWidget->setCurrentSection(QDateTimeEdit::YearSection);
2965
2966     QString jan = QDate::shortMonthName(1);
2967     QCOMPARE(testWidget->lineEdit()->displayText(), "01-" + jan + "-05");
2968     QTest::keyClick(testWidget, Qt::Key_Up);
2969     QCOMPARE(testWidget->lineEdit()->displayText(), "01-" + jan + "-06");
2970     QTest::keyClick(testWidget, Qt::Key_Up);
2971     QCOMPARE(testWidget->lineEdit()->displayText(), "01-" + jan + "-07");
2972     QTest::keyClick(testWidget, Qt::Key_Up);
2973     QCOMPARE(testWidget->lineEdit()->displayText(), "01-" + jan + "-08");
2974     QTest::keyClick(testWidget, Qt::Key_Up);
2975     QCOMPARE(testWidget->lineEdit()->displayText(), "01-" + jan + "-09");
2976     QTest::keyClick(testWidget, Qt::Key_Up);
2977     QCOMPARE(testWidget->lineEdit()->displayText(), "01-" + jan + "-10");
2978     QTest::keyClick(testWidget, Qt::Key_Up);
2979     QCOMPARE(testWidget->lineEdit()->displayText(), "01-" + jan + "-10");
2980     testWidget->setWrapping(true);
2981     QTest::keyClick(testWidget, Qt::Key_Up);
2982     QCOMPARE(testWidget->lineEdit()->displayText(), "01-" + jan + "-05");
2983
2984     testWidget->setDateRange(QDate(100, 1, 1), QDate(8000, 12, 31));
2985     testWidget->setDate(QDate(2000, 1, 1));
2986     testWidget->setCurrentSection(QDateTimeEdit::YearSection);
2987     testWidget->setWrapping(false);
2988     for (int i=0; i<10; ++i) {
2989         for (int j=0; j<50; ++j) {
2990             testWidget->stepBy(-1);
2991         }
2992         testWidget->stepBy(-50);
2993         QCOMPARE(testWidget->sectionText(QDateTimeEdit::YearSection), QString("00"));
2994         QCOMPARE(testWidget->date(), QDate(2000 - ((i + 1) * 100), 1, 1));
2995     }
2996 }
2997
2998 void tst_QDateTimeEdit::task108572()
2999 {
3000     testWidget->setDisplayFormat("hh:mm:ss.zzz");
3001     testWidget->setTime(QTime(0, 1, 2, 0));
3002     QCOMPARE(testWidget->lineEdit()->displayText(), QString("00:01:02.000"));
3003
3004     testWidget->setCurrentSection(QDateTimeEdit::MSecSection);
3005     QTest::keyClick(testWidget, Qt::Key_Return);
3006     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("000"));
3007     QTest::keyClick(testWidget, Qt::Key_2);
3008     QCOMPARE(testWidget->lineEdit()->displayText(), QString("00:01:02.2"));
3009     QTest::keyClick(testWidget, Qt::Key_Return);
3010     QCOMPARE(testWidget->lineEdit()->displayText(), QString("00:01:02.200"));
3011     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("200"));
3012     QCOMPARE(testWidget->time(), QTime(0, 1, 2, 200));
3013 }
3014
3015 void tst_QDateTimeEdit::task149097()
3016 {
3017     QSignalSpy dtSpy(testWidget, SIGNAL(dateTimeChanged(const QDateTime &)));
3018     QSignalSpy dSpy(testWidget, SIGNAL(dateChanged(const QDate &)));
3019     QSignalSpy tSpy(testWidget, SIGNAL(timeChanged(const QTime &)));
3020
3021     testWidget->setDisplayFormat("yyyy/MM/dd hh:mm:ss");
3022     testWidget->setDateTime(QDateTime(QDate(2001, 02, 03), QTime(5, 1, 2)));
3023 //    QTest::keyClick(testWidget, Qt::Key_Enter);
3024     QCOMPARE(dtSpy.count(), 1);
3025     QCOMPARE(dSpy.count(), 1);
3026     QCOMPARE(tSpy.count(), 1);
3027     testWidget->setCurrentSection(QDateTimeEdit::YearSection);
3028     testWidget->stepBy(1);
3029
3030     QCOMPARE(dtSpy.count(), 2);
3031     QCOMPARE(dSpy.count(), 2);
3032     QCOMPARE(tSpy.count(), 1);
3033
3034     testWidget->setCurrentSection(QDateTimeEdit::MinuteSection);
3035     testWidget->stepBy(1);
3036
3037     QCOMPARE(dtSpy.count(), 3);
3038     QCOMPARE(dSpy.count(), 2);
3039     QCOMPARE(tSpy.count(), 2);
3040 }
3041
3042 void tst_QDateTimeEdit::task148725()
3043 {
3044     testWidget->setDisplayFormat("dd/MM");
3045     testWidget->setDate(QDate(2001, 2, 27));
3046     testWidget->stepBy(1);
3047     QCOMPARE(testWidget->date(), QDate(2001, 2, 28));
3048     testWidget->stepBy(1);
3049     QCOMPARE(testWidget->date(), QDate(2001, 2, 28));
3050     testWidget->setWrapping(true);
3051     testWidget->stepBy(1);
3052     QCOMPARE(testWidget->date(), QDate(2001, 2, 1));
3053 }
3054
3055 void tst_QDateTimeEdit::task148522()
3056 {
3057     QTimeEdit edit;
3058     const QDateTime dt(QDate(2000, 12, 12), QTime(12, 13, 14, 15));
3059     edit.setDateTime(dt);
3060     QCOMPARE(edit.dateTime(), dt);
3061 }
3062
3063 void tst_QDateTimeEdit::ddMMMMyyyy()
3064 {
3065     testWidget->setDisplayFormat("dd.MMMM.yyyy");
3066     testWidget->setDate(QDate(2000, 1, 1));
3067     testWidget->setCurrentSection(QDateTimeEdit::YearSection);
3068     QTest::keyClick(testWidget, Qt::Key_Enter);
3069     QCOMPARE(testWidget->lineEdit()->selectedText(), QString("2000"));
3070 #ifdef Q_OS_MAC
3071     QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
3072 #else
3073     QTest::keyClick(testWidget, Qt::Key_End);
3074 #endif
3075     QTest::keyClick(testWidget, Qt::Key_Backspace);
3076 #ifdef Q_OS_MAC
3077     QEXPECT_FAIL("", "QTBUG-23674", Abort);
3078 #endif
3079     QCOMPARE(testWidget->lineEdit()->text(), "01." + QDate::longMonthName(1) + ".200");
3080 }
3081
3082 void tst_QDateTimeEdit::wheelEvent()
3083 {
3084     testWidget->setDisplayFormat("dddd/MM");
3085     testWidget->setDate(QDate(2000, 2, 21));
3086     testWidget->setCurrentSection(QDateTimeEdit::DaySection);
3087     QWheelEvent w(testWidget->lineEdit()->geometry().center(), 120, 0, 0);
3088     qApp->sendEvent(testWidget, &w);
3089     QCOMPARE(testWidget->date(), QDate(2000, 2, 22));
3090     testWidget->setCurrentSection(QDateTimeEdit::MonthSection);
3091     qApp->sendEvent(testWidget, &w);
3092     QCOMPARE(testWidget->date(), QDate(2000, 3, 22));
3093 }
3094
3095 void tst_QDateTimeEdit::specialValueCornerCase()
3096 {
3097     // if you set minimum to value it won't update since value won't
3098     // be bounded to anything. If you have a specialValueText it needs
3099     // to call updateEdit to make sure the text is changed
3100
3101     QDateTimeEdit edit;
3102     edit.setSpecialValueText("foobar");
3103     edit.setMinimumDate(edit.date());
3104     QCOMPARE(edit.minimumDate(), edit.date());
3105     QCOMPARE(edit.text(), QString("foobar"));
3106 }
3107
3108 void tst_QDateTimeEdit::cursorPositionOnInit()
3109 {
3110     {
3111         EditorDateEdit edit;
3112         edit.setDisplayFormat("dd/MM");
3113         edit.show();
3114         QCOMPARE(edit.lineEdit()->cursorPosition(), 0);
3115     }
3116
3117     {
3118         EditorDateEdit edit;
3119         edit.setDisplayFormat("dd/MM");
3120         edit.setSpecialValueText("special");
3121         edit.setMinimumDate(edit.date());
3122         edit.show();
3123         QCOMPARE(edit.lineEdit()->cursorPosition(), 7);
3124         // ### legacy behavior. Keep it like this rather than changing
3125         // ### but add a test none-the-less
3126     }
3127 }
3128
3129 void tst_QDateTimeEdit::task118867()
3130 {
3131     EditorDateEdit edit;
3132     edit.setDisplayFormat("hh:mm");
3133     edit.setMinimumTime(QTime(5, 30));
3134     edit.setMaximumTime(QTime(6, 30));
3135     QCOMPARE(edit.text(), QString("05:30"));
3136     edit.lineEdit()->setCursorPosition(5);
3137     QTest::keyClick(&edit, Qt::Key_Backspace);
3138     QCOMPARE(edit.text(), QString("05:3"));
3139     QTest::keyClick(&edit, Qt::Key_Backspace);
3140     QCOMPARE(edit.text(), QString("05:"));
3141     QTest::keyClick(&edit, Qt::Key_1);
3142     QCOMPARE(edit.text(), QString("05:"));
3143     QTest::keyClick(&edit, Qt::Key_2);
3144     QCOMPARE(edit.text(), QString("05:"));
3145     QTest::keyClick(&edit, Qt::Key_3);
3146     QCOMPARE(edit.text(), QString("05:3"));
3147     QTest::keyClick(&edit, Qt::Key_3);
3148     QCOMPARE(edit.text(), QString("05:33"));
3149 }
3150
3151 void tst_QDateTimeEdit::nextPrevSection_data()
3152 {
3153     QTest::addColumn<Qt::Key>("key");
3154     QTest::addColumn<Qt::KeyboardModifiers>("modifiers");
3155     QTest::addColumn<QString>("selectedText");
3156
3157     QTest::newRow("tab") << Qt::Key_Tab << (Qt::KeyboardModifiers)Qt::NoModifier << QString("56");
3158     QTest::newRow("backtab") << Qt::Key_Backtab << (Qt::KeyboardModifiers)Qt::NoModifier << QString("12");
3159     QTest::newRow("shift-tab") << Qt::Key_Tab << (Qt::KeyboardModifiers)Qt::ShiftModifier << QString("12");
3160     QTest::newRow("/") << Qt::Key_Slash << (Qt::KeyboardModifiers)Qt::NoModifier << QString("56");
3161     QTest::newRow("b") << Qt::Key_B << (Qt::KeyboardModifiers)Qt::NoModifier << QString("56");
3162     QTest::newRow("c") << Qt::Key_C << (Qt::KeyboardModifiers)Qt::NoModifier << QString("56");
3163
3164     // 1. mac doesn't do these,
3165     // 2. some WinCE devices do not have modifiers
3166 #if !defined(Q_OS_MAC) && !defined(WINCE_NO_MODIFIER_KEYS)
3167     QTest::newRow("ctrl-right") << Qt::Key_Right << (Qt::KeyboardModifiers)Qt::ControlModifier << QString("56");
3168     QTest::newRow("ctrl-left") << Qt::Key_Left << (Qt::KeyboardModifiers)Qt::ControlModifier << QString("12");
3169 #endif
3170 }
3171
3172
3173 void tst_QDateTimeEdit::nextPrevSection()
3174 {
3175     QFETCH(Qt::Key, key);
3176     QFETCH(Qt::KeyboardModifiers, modifiers);
3177     QFETCH(QString, selectedText);
3178
3179     EditorDateEdit edit;
3180     edit.setDisplayFormat("hh/mm/bc9ss");
3181     edit.setTime(QTime(12, 34, 56));
3182     edit.show();
3183     edit.setSelectedSection(QDateTimeEdit::MinuteSection);
3184     QCOMPARE(edit.lineEdit()->selectedText(), QString("34")); // selftest
3185     QTest::keyClick(&edit, key, modifiers);
3186     QCOMPARE(edit.lineEdit()->selectedText(), selectedText);
3187 }
3188
3189 void tst_QDateTimeEdit::dateEditTimeEditFormats()
3190 {
3191     QTimeEdit t;
3192     t.setDisplayFormat("hh yyyy");
3193     QCOMPARE(t.displayedSections(), QDateTimeEdit::HourSection);
3194
3195     QDateEdit d;
3196     d.setDisplayFormat("hh yyyy");
3197     QCOMPARE(d.displayedSections(), QDateTimeEdit::YearSection);
3198 }
3199
3200
3201 void tst_QDateTimeEdit::timeSpec_data()
3202 {
3203     QTest::addColumn<bool>("useSetProperty");
3204     QTest::newRow("setProperty") << true;
3205     QTest::newRow("setTimeSpec") << false;
3206 }
3207
3208
3209 void tst_QDateTimeEdit::timeSpec()
3210 {
3211     QFETCH(bool, useSetProperty);
3212
3213     QDateTimeEdit edit;
3214     QCOMPARE(edit.dateTime().timeSpec(), edit.timeSpec());
3215     QCOMPARE(edit.minimumDateTime().timeSpec(), edit.timeSpec());
3216     QCOMPARE(edit.maximumDateTime().timeSpec(), edit.timeSpec());
3217     if (useSetProperty) {
3218         edit.setProperty("timeSpec", Qt::UTC);
3219     } else {
3220         edit.setTimeSpec(Qt::UTC);
3221     }
3222     QCOMPARE(edit.minimumDateTime().timeSpec(), edit.timeSpec());
3223     QCOMPARE(edit.maximumDateTime().timeSpec(), edit.timeSpec());
3224     QCOMPARE(edit.dateTime().timeSpec(), edit.timeSpec());
3225     if (useSetProperty) {
3226         edit.setProperty("timeSpec", Qt::LocalTime);
3227     } else {
3228         edit.setTimeSpec(Qt::LocalTime);
3229     }
3230     const QDateTime dt = edit.dateTime();
3231     QCOMPARE(edit.timeSpec(), Qt::LocalTime);
3232     const QDateTime utc = dt.toUTC();
3233     if (dt.time() != utc.time()) {
3234         const QDateTime min(QDate(1999, 1, 1), QTime(1, 0, 0), Qt::LocalTime);
3235         edit.setMinimumDateTime(min);
3236         QCOMPARE(edit.minimumTime(), min.time());
3237         if (useSetProperty) {
3238             edit.setProperty("timeSpec", Qt::UTC);
3239         } else {
3240             edit.setTimeSpec(Qt::UTC);
3241         }
3242         QVERIFY(edit.minimumTime() != min.time());
3243         QVERIFY(edit.minimumDateTime().timeSpec() != min.timeSpec());
3244         QCOMPARE(edit.minimumDateTime().toTime_t(), min.toTime_t());
3245     } else {
3246         QSKIP("Not tested in the GMT timezone");
3247     }
3248 }
3249
3250 void tst_QDateTimeEdit::timeSpecBug()
3251 {
3252     testWidget->setTimeSpec(Qt::UTC);
3253     testWidget->setDisplayFormat("hh:mm");
3254     testWidget->setTime(QTime(2, 2));
3255     const QString oldText = testWidget->text();
3256     const QDateTime oldDateTime = testWidget->dateTime();
3257     QTest::keyClick(testWidget, Qt::Key_Tab);
3258     QCOMPARE(oldDateTime, testWidget->dateTime());
3259     QCOMPARE(oldText, testWidget->text());
3260 }
3261
3262
3263 void tst_QDateTimeEdit::cachedDayTest()
3264 {
3265     testWidget->setDisplayFormat("MM/dd");
3266     testWidget->setDate(QDate(2007, 1, 30));
3267     testWidget->setCurrentSection(QDateTimeEdit::DaySection);
3268     //QTest::keyClick(testWidget->lineEdit(), Qt::Key_Up); // this doesn't work
3269     //on Mac. QTestLib bug? ###
3270     QTest::keyClick(testWidget, Qt::Key_Up);
3271     testWidget->setCurrentSection(QDateTimeEdit::MonthSection);
3272     QTest::keyClick(testWidget, Qt::Key_Up);
3273     QCOMPARE(testWidget->date(), QDate(2007, 2, 28));
3274     QTest::keyClick(testWidget, Qt::Key_Up);
3275     QCOMPARE(testWidget->date(), QDate(2007, 3, 31));
3276     QTest::keyClick(testWidget, Qt::Key_Down);
3277     QCOMPARE(testWidget->date(), QDate(2007, 2, 28));
3278     QTest::keyClick(testWidget, Qt::Key_Down);
3279     QCOMPARE(testWidget->date(), QDate(2007, 1, 31));
3280
3281     testWidget->setCurrentSection(QDateTimeEdit::DaySection);
3282     QTest::keyClick(testWidget, Qt::Key_Down);
3283     QCOMPARE(testWidget->date(), QDate(2007, 1, 30));
3284     testWidget->setCurrentSection(QDateTimeEdit::MonthSection);
3285     QTest::keyClick(testWidget, Qt::Key_Up);
3286     QCOMPARE(testWidget->date(), QDate(2007, 2, 28));
3287     testWidget->setCurrentSection(QDateTimeEdit::MonthSection);
3288     QTest::keyClick(testWidget, Qt::Key_Up);
3289     QCOMPARE(testWidget->date(), QDate(2007, 3, 30));
3290
3291 }
3292
3293 void tst_QDateTimeEdit::monthEdgeCase()
3294 {
3295     EditorDateEdit edit;
3296     edit.setLocale(QLocale("fr_FR"));
3297     edit.setDisplayFormat("MMM d");
3298     edit.setDate(QDate(2000, 1, 1));
3299     QCOMPARE(edit.text(), QString("janv. 1"));
3300     edit.lineEdit()->setCursorPosition(5);
3301     QTest::keyClick(&edit, Qt::Key_Backspace);
3302     QCOMPARE(edit.text(), QString("janv 1"));
3303 }
3304
3305 class RestoreLocaler
3306 {
3307 public:
3308     RestoreLocaler()
3309         : old(QLocale())
3310     {}
3311
3312     ~RestoreLocaler()
3313     {
3314         QLocale::setDefault(old);
3315     }
3316 private:
3317     const QLocale old;
3318 };
3319
3320
3321
3322
3323 void tst_QDateTimeEdit::setLocale()
3324 {
3325     RestoreLocaler r;
3326     QLocale::setDefault(QLocale("en_US"));
3327     {
3328         EditorDateEdit edit;
3329         edit.setDisplayFormat("MMMM d");
3330         edit.setDate(QDate(2000, 1, 1));
3331         QCOMPARE(edit.text(), QString("January 1"));
3332     }
3333     QLocale::setDefault(QLocale("no_NO"));
3334     {
3335         EditorDateEdit edit;
3336         edit.setDisplayFormat("MMMM d");
3337         edit.setDate(QDate(2000, 1, 1));
3338         QCOMPARE(edit.text().toLower(), QString("januar 1"));
3339         // I get Januar on Mac and januar on linux
3340     }
3341     QLocale::setDefault(QLocale("en_US"));
3342     {
3343         EditorDateEdit edit;
3344         edit.setDisplayFormat("MMMM d");
3345         edit.setDate(QDate(2000, 1, 1));
3346         QCOMPARE(edit.text(), QString("January 1"));
3347         edit.setLocale(QLocale("no_NO"));
3348         QCOMPARE(edit.text().toLower(), QString("januar 1"));
3349         edit.setLocale(QLocale("no_NO"));
3350     }
3351 }
3352
3353
3354 void tst_QDateTimeEdit::potentialYYValueBug()
3355 {
3356     EditorDateEdit edit;
3357     edit.setDisplayFormat("dd/MM/yy");
3358     QCOMPARE(edit.minimumDate(), QDate(1752, 9, 14));
3359     edit.setDate(edit.minimumDate());
3360     edit.lineEdit()->setFocus();
3361
3362 #ifdef Q_OS_MAC
3363     QTest::keyClick(&edit, Qt::Key_Right, Qt::ControlModifier);
3364 #else
3365     QTest::keyClick(&edit, Qt::Key_End);
3366 #endif
3367     QTest::keyClick(&edit, Qt::Key_Backspace);
3368 #ifdef Q_OS_MAC
3369     QEXPECT_FAIL("", "QTBUG-23674", Abort);
3370 #endif
3371     QCOMPARE(edit.text(), QString("14/09/5"));
3372 }
3373
3374 void tst_QDateTimeEdit::textSectionAtEnd()
3375 {
3376     EditorDateEdit edit;
3377     edit.setDisplayFormat("MMMM");
3378     edit.setDate(QDate(2000, 1, 1));
3379     edit.lineEdit()->setFocus();
3380 #ifdef Q_OS_MAC
3381     QTest::keyClick(&edit, Qt::Key_Right, Qt::ControlModifier);
3382 #else
3383     QTest::keyClick(&edit, Qt::Key_End);
3384 #endif
3385     QTest::keyClick(&edit, Qt::Key_Backspace);
3386 #ifdef Q_OS_MAC
3387     QEXPECT_FAIL("", "QTBUG-23674", Abort);
3388 #endif
3389     QCOMPARE(edit.text(), QString("Januar"));
3390 }
3391
3392 void tst_QDateTimeEdit::keypadAutoAdvance_data()
3393 {
3394     QTest::addColumn<Qt::KeyboardModifiers>("modifiers");
3395     QTest::newRow("None") << (Qt::KeyboardModifiers)Qt::NoModifier;
3396     QTest::newRow("Keypad") << (Qt::KeyboardModifiers)Qt::KeypadModifier;
3397     // QTBUG-7842: Using KeyPad with shift (numlock off)
3398     QTest::newRow("Keypad+Shift") << (Qt::KeyboardModifiers)(Qt::KeypadModifier|Qt::ShiftModifier);
3399 }
3400
3401
3402 void tst_QDateTimeEdit::keypadAutoAdvance()
3403 {
3404     QFETCH(Qt::KeyboardModifiers, modifiers);
3405
3406     EditorDateEdit edit;
3407     edit.setDate(QDate(2000, 2, 1));
3408     edit.setDisplayFormat("dd/MM");
3409 #ifdef Q_OS_MAC
3410     QTest::keyClick(&edit, Qt::Key_Left, Qt::ControlModifier);
3411 #else
3412     QTest::keyClick(&edit, Qt::Key_Home);
3413 #endif
3414     QTest::keyClick(&edit, Qt::Key_Return);
3415     QCOMPARE(edit.lineEdit()->selectedText(), QString("01"));
3416     QTest::keyClick(&edit, Qt::Key_1, modifiers);
3417     QTest::keyClick(&edit, Qt::Key_2, modifiers);
3418     QCOMPARE(edit.lineEdit()->selectedText(), QString("02"));
3419 }
3420
3421
3422 void tst_QDateTimeEdit::task196924()
3423 {
3424     EditorDateEdit edit;
3425     edit.setDisplayFormat("dd/M/yyyy");
3426     edit.setDate(QDate(2345, 6, 17));
3427     QCOMPARE(edit.text(), QString("17/6/2345"));
3428     QTest::keyClick(&edit, Qt::Key_Tab);
3429     QCOMPARE(edit.lineEdit()->selectedText(), QString("6"));
3430     QTest::keyClick(&edit, Qt::Key_3);
3431     QCOMPARE(edit.lineEdit()->selectedText(), QString("2345"));
3432     QCOMPARE(edit.text(), QString("17/3/2345"));
3433
3434     edit.setDisplayFormat("dd/MM/yyyy");
3435     edit.setDate(QDate(2345, 6, 17));
3436     edit.lineEdit()->setCursorPosition(0);
3437     QCOMPARE(edit.text(), QString("17/06/2345"));
3438     QTest::keyClick(&edit, Qt::Key_Tab);
3439     QCOMPARE(edit.lineEdit()->selectedText(), QString("06"));
3440     QTest::keyClick(&edit, Qt::Key_3);
3441     QCOMPARE(edit.lineEdit()->selectedText(), QString("2345"));
3442     QCOMPARE(edit.text(), QString("17/03/2345"));
3443
3444 }
3445
3446 void tst_QDateTimeEdit::focusNextPrevChild()
3447 {
3448     EditorDateEdit edit;
3449     edit.setDisplayFormat("dd/MM/yyyy");
3450
3451     edit.show();
3452     edit.setFocus();
3453     edit.setCurrentSection(QDateTimeEdit::DaySection);
3454
3455     QCOMPARE(edit.currentSection(), QDateTimeEdit::DaySection);
3456     edit.focusNextPrevChild(true);
3457     QCOMPARE(edit.currentSection(), QDateTimeEdit::MonthSection);
3458 }
3459
3460 void tst_QDateTimeEdit::taskQTBUG_12384_timeSpecShowTimeOnly()
3461 {
3462     QDateTime time = QDateTime::fromString("20100723 04:02:40", "yyyyMMdd hh:mm:ss");
3463     time.setTimeSpec(Qt::UTC);
3464
3465     EditorDateEdit edit;
3466     edit.setDisplayFormat("hh:mm:ss");
3467     edit.setTimeSpec(Qt::UTC);
3468     edit.setDateTime(time);
3469
3470     QCOMPARE(edit.minimumTime(), QTime(0, 0, 0, 0));
3471     QCOMPARE(edit.maximumTime(), QTime(23, 59, 59, 999));
3472     QCOMPARE(edit.time(), time.time());
3473 }
3474
3475 void tst_QDateTimeEdit::deleteCalendarWidget()
3476 {
3477     {
3478         // setup
3479         QCalendarWidget *cw = 0;
3480         QDateEdit edit;
3481         QVERIFY(!edit.calendarWidget());
3482         edit.setCalendarPopup(true);
3483         QVERIFY(edit.calendarWidget());
3484         edit.calendarWidget()->setObjectName("cw1");;
3485         
3486         // delete
3487         cw = edit.calendarWidget();
3488         delete cw;
3489         
3490         // it should create a new widget
3491         QVERIFY(edit.calendarWidget());
3492         QVERIFY(edit.calendarWidget()->objectName() != "cw1");
3493     }
3494 }
3495
3496 #ifdef QT_BUILD_INTERNAL
3497
3498 typedef QPair<Qt::Key, Qt::KeyboardModifier> KeyPair;
3499 typedef QList<KeyPair> KeyPairList;
3500
3501 Q_DECLARE_METATYPE(QLocale)
3502 Q_DECLARE_METATYPE(KeyPair)
3503 Q_DECLARE_METATYPE(KeyPairList)
3504
3505 static inline KeyPair key(Qt::Key key, Qt::KeyboardModifier modifier = Qt::NoModifier) {
3506     return KeyPair(key, modifier);
3507 }
3508
3509 /*
3510 When a QDateEdit has its display format set to 'yyyy/MM/dd', its day
3511 set to 31 and its month set to 2, it will display 291 as the day until
3512 the cursor is moved or the focus changed. This is because
3513 QDateTimeParser::parse calls sectionSize() for the day section, which
3514 returns 1 when it should return 2.
3515
3516 This test verifies that QDateTimeEditPrivate has the correct text,
3517 which is the text that is displayed until the cursor is moved or the
3518 focus changed.
3519 */
3520
3521 void tst_QDateTimeEdit::dateEditCorrectSectionSize_data()
3522 {
3523     QTest::addColumn<QLocale>("locale");
3524     QTest::addColumn<QDate>("defaultDate");
3525     QTest::addColumn<QString>("displayFormat");
3526     QTest::addColumn<KeyPairList>("keyPresses");
3527     QTest::addColumn<QString>("expectedDisplayString");
3528
3529     const QDate defaultDate(2000, 1, 1);
3530     const QLocale defaultLocale(QLocale::English, QLocale::Australia);
3531
3532     KeyPairList thirtyUpKeypresses;
3533     thirtyUpKeypresses.reserve(30);
3534     for (int i = 0; i < 30; ++i) {
3535         thirtyUpKeypresses << key(Qt::Key_Up);
3536     }
3537
3538     // Make day the current section, set day to 31st (invalid for february),
3539     // move to month field, set month to february (2).
3540     KeyPairList threeDigitDayIssueKeypresses;
3541     threeDigitDayIssueKeypresses << key(Qt::Key_Tab) << key(Qt::Key_Tab)
3542         << key(Qt::Key_3) << key(Qt::Key_1) << key(Qt::Key_Tab, Qt::ShiftModifier) << key(Qt::Key_2);
3543
3544     // Same as above, except day-year-month format.
3545     KeyPairList threeDigitDayIssueKeypresses_DayYearMonth;
3546     threeDigitDayIssueKeypresses_DayYearMonth << key(Qt::Key_3) << key(Qt::Key_1) << key(Qt::Key_Tab)
3547         << key(Qt::Key_2);
3548
3549     // Same as threeDigitDayIssueKeypresses, except doesn't require the day to be corrected.
3550     KeyPairList threeDigitDayIssueKeypresses_Nofixday;
3551     threeDigitDayIssueKeypresses_Nofixday << key(Qt::Key_Tab) << key(Qt::Key_Tab)
3552         << key(Qt::Key_2) << key(Qt::Key_8) << key(Qt::Key_Tab, Qt::ShiftModifier) << key(Qt::Key_2);
3553
3554     // Set day to 31st (invalid for february), set month to february (2).
3555     KeyPairList reverseThreeDigitDayIssueKeypresses;
3556     reverseThreeDigitDayIssueKeypresses
3557         << key(Qt::Key_3) << key(Qt::Key_1) << key(Qt::Key_2);
3558
3559     // Make day the current section, set day to 31st, move to month field, set month to november (11).
3560     KeyPairList threeDigitDayIssueKeypresses_TwoDigitMonth;
3561     threeDigitDayIssueKeypresses_TwoDigitMonth << key(Qt::Key_Tab) << key(Qt::Key_Tab) << key(Qt::Key_3)
3562         << key(Qt::Key_1) << key(Qt::Key_Tab, Qt::ShiftModifier) << key(Qt::Key_1) << key(Qt::Key_1);
3563
3564     // Make day the current section, set day to 3rd, move to month field, set month to february (2).
3565     KeyPairList threeDigitDayIssueKeypresses_OneDigitDay;
3566     threeDigitDayIssueKeypresses_OneDigitDay << key(Qt::Key_Tab) << key(Qt::Key_Tab)
3567         << key(Qt::Key_3) << key(Qt::Key_Tab, Qt::ShiftModifier) << key(Qt::Key_2);
3568
3569     // Make day the current section, set day to 31st (invalid for february), move to month field,
3570     // set month to february (2).
3571     KeyPairList threeDigitDayIssueKeypresses_ShortMonthName;
3572     threeDigitDayIssueKeypresses_ShortMonthName << key(Qt::Key_Tab) << key(Qt::Key_Tab)
3573         << key(Qt::Key_3) << key(Qt::Key_1) << key(Qt::Key_Tab, Qt::ShiftModifier) << key(Qt::Key_Up);
3574
3575     // Make day the current section, set day to 31st (Monday), move to month field, set month to february (2).
3576     // Will probably never see this display format in a QDateTimeEdit, but it's good to test it anyway.
3577     KeyPairList threeDigitDayIssueKeypresses_DayName;
3578     threeDigitDayIssueKeypresses_DayName << key(Qt::Key_Tab) << key(Qt::Key_Tab) << thirtyUpKeypresses
3579         << key(Qt::Key_Tab, Qt::ShiftModifier) << key(Qt::Key_2);
3580
3581     KeyPairList threeDigitDayIssueKeypresses_DayName_DayYearMonth;
3582     threeDigitDayIssueKeypresses_DayName_DayYearMonth << thirtyUpKeypresses << key(Qt::Key_Tab)
3583         << key(Qt::Key_Tab) << key(Qt::Key_2);
3584
3585     KeyPairList threeDigitDayIssueKeypresses_DayName_YearDayMonth;
3586     threeDigitDayIssueKeypresses_DayName_YearDayMonth << key(Qt::Key_Tab) << thirtyUpKeypresses
3587         << key(Qt::Key_Tab) << key(Qt::Key_2);
3588
3589     KeyPairList threeDigitDayIssueKeypresses_DayName_DayMonthYear;
3590     threeDigitDayIssueKeypresses_DayName_DayMonthYear << thirtyUpKeypresses << key(Qt::Key_Tab)
3591         << key(Qt::Key_2);
3592
3593     KeyPairList threeDigitDayIssueKeypresses_DayName_MonthDayYear;
3594     threeDigitDayIssueKeypresses_DayName_MonthDayYear << key(Qt::Key_Tab) << thirtyUpKeypresses
3595         << key(Qt::Key_Tab, Qt::ShiftModifier) << key(Qt::Key_2);
3596
3597     // Make day the current section, set day to 31st (invalid for february), move to month field,
3598     // set month to february (2).
3599     KeyPairList threeDigitDayIssueKeypresses_YearDayMonth;
3600     threeDigitDayIssueKeypresses_YearDayMonth << key(Qt::Key_Tab) << key(Qt::Key_3) << key(Qt::Key_1)
3601         << key(Qt::Key_Tab) << key(Qt::Key_2);
3602
3603     // Make day the current section, set day to 31st, move to month field, set month to february (2).
3604     KeyPairList threeDigitDayIssueKeypresses_MonthDayYear;
3605     threeDigitDayIssueKeypresses_MonthDayYear << key(Qt::Key_Tab) << key(Qt::Key_3) << key(Qt::Key_1)
3606         << key(Qt::Key_Tab, Qt::ShiftModifier) << key(Qt::Key_Tab, Qt::ShiftModifier) << key(Qt::Key_2);
3607
3608     // Same as above, except month-year-day format.
3609     KeyPairList threeDigitDayIssueKeypresses_MonthYearDay;
3610     threeDigitDayIssueKeypresses_MonthYearDay << key(Qt::Key_Tab) << key(Qt::Key_Tab) << key(Qt::Key_3)
3611         << key(Qt::Key_1) << key(Qt::Key_Tab, Qt::ShiftModifier) << key(Qt::Key_Tab, Qt::ShiftModifier)
3612         << key(Qt::Key_2);
3613
3614     // Same as above, except short month name.
3615     KeyPairList threeDigitDayIssueKeypresses_ShortMonthName_MonthYearDay;
3616     threeDigitDayIssueKeypresses_ShortMonthName_MonthYearDay << key(Qt::Key_Tab) << key(Qt::Key_Tab)
3617         << key(Qt::Key_3) << key(Qt::Key_1) << key(Qt::Key_Tab, Qt::ShiftModifier)
3618         << key(Qt::Key_Tab, Qt::ShiftModifier) << key(Qt::Key_Up);
3619
3620     KeyPairList shortAndLongNameIssueKeypresses;
3621     shortAndLongNameIssueKeypresses << key(Qt::Key_Tab) << key(Qt::Key_3) << key(Qt::Key_1) << key(Qt::Key_Up);
3622
3623     QTest::newRow("no fixday, leap, yy/M/dddd") << defaultLocale << defaultDate << QString::fromLatin1("yy/M/dddd")
3624         << threeDigitDayIssueKeypresses_DayName << QString::fromLatin1("00/2/Tuesday");
3625
3626     QTest::newRow("no fixday, leap, yy/M/ddd") << defaultLocale << defaultDate << QString::fromLatin1("yy/M/ddd")
3627         << threeDigitDayIssueKeypresses_DayName << QString::fromLatin1("00/2/Tue");
3628
3629     QTest::newRow("no fixday, leap, yy/MM/dddd") << defaultLocale << defaultDate << QString::fromLatin1("yy/MM/dddd")
3630         << threeDigitDayIssueKeypresses_DayName << QString::fromLatin1("00/02/Tuesday");
3631
3632     QTest::newRow("fixday, leap, yy/MM/dd") << defaultLocale << defaultDate << QString::fromLatin1("yy/MM/dd")
3633         << threeDigitDayIssueKeypresses << QString::fromLatin1("00/02/29");
3634
3635     QTest::newRow("fixday, leap, yy/MM/d") << defaultLocale << defaultDate << QString::fromLatin1("yy/MM/d")
3636         << threeDigitDayIssueKeypresses << QString::fromLatin1("00/02/29");
3637
3638     QTest::newRow("fixday, leap, yyyy/M/d") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/M/d")
3639         << threeDigitDayIssueKeypresses << QString::fromLatin1("2000/2/29");
3640
3641     QTest::newRow("no fixday, yyyy/M/d") << defaultLocale << defaultDate.addYears(1) << QString::fromLatin1("yyyy/M/d")
3642         << threeDigitDayIssueKeypresses_Nofixday << QString::fromLatin1("2001/2/28");
3643
3644     QTest::newRow("fixday, leap, 2-digit month, yyyy/M/dd") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/M/dd")
3645         << threeDigitDayIssueKeypresses_TwoDigitMonth << QString::fromLatin1("2000/11/30");
3646
3647     QTest::newRow("no fixday, leap, 1-digit day, yyyy/M/dd") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/M/dd")
3648         << threeDigitDayIssueKeypresses_OneDigitDay << QString::fromLatin1("2000/2/03");
3649
3650     QTest::newRow("fixday, leap, yyyy/MM/dd") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/MM/dd")
3651         << threeDigitDayIssueKeypresses << QString::fromLatin1("2000/02/29");
3652
3653     QTest::newRow("no fixday, yyyy/MM/dd") << defaultLocale << defaultDate.addYears(1) << QString::fromLatin1("yyyy/MM/dd")
3654         << threeDigitDayIssueKeypresses_Nofixday << QString::fromLatin1("2001/02/28");
3655
3656     QTest::newRow("fixday, leap, 2-digit month, yyyy/MM/dd") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/MM/dd")
3657         << threeDigitDayIssueKeypresses_TwoDigitMonth << QString::fromLatin1("2000/11/30");
3658
3659     QTest::newRow("no fixday, leap, yyyy/M/dddd") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/M/dddd")
3660         << threeDigitDayIssueKeypresses_DayName << QString::fromLatin1("2000/2/Tuesday");
3661
3662     QTest::newRow("no fixday, leap, yyyy/MM/dddd") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/MM/dddd")
3663         << threeDigitDayIssueKeypresses_DayName << QString::fromLatin1("2000/02/Tuesday");
3664
3665     QTest::newRow("fixday, leap, yyyy/dd/MM") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/dd/MM")
3666         << threeDigitDayIssueKeypresses_YearDayMonth << QString::fromLatin1("2000/29/02");
3667
3668     QTest::newRow("fixday, leap, yyyy/dd/M") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/dd/M")
3669         << threeDigitDayIssueKeypresses_YearDayMonth << QString::fromLatin1("2000/29/2");
3670
3671     QTest::newRow("fixday, leap, yyyy/d/M") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/d/M")
3672         << threeDigitDayIssueKeypresses_YearDayMonth << QString::fromLatin1("2000/29/2");
3673
3674     QTest::newRow("fixday, leap, yyyy/MMM/dd") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/MMM/dd")
3675         << threeDigitDayIssueKeypresses_ShortMonthName << QString::fromLatin1("2000/Feb/29");
3676
3677     QTest::newRow("fixday, leap, yyyy/MMM/d") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/MMM/d")
3678         << threeDigitDayIssueKeypresses_ShortMonthName << QString::fromLatin1("2000/Feb/29");
3679
3680     QTest::newRow("fixday, leap, yy/MMM/dd") << defaultLocale << defaultDate << QString::fromLatin1("yy/MMM/dd")
3681         << threeDigitDayIssueKeypresses_ShortMonthName << QString::fromLatin1("00/Feb/29");
3682
3683     QTest::newRow("fixday, leap, yyyy/dddd/M") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/dddd/M")
3684         << threeDigitDayIssueKeypresses_DayName_YearDayMonth << QString::fromLatin1("2000/Tuesday/2");
3685
3686     QTest::newRow("fixday, leap, yyyy/dddd/MM") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/dddd/MM")
3687         << threeDigitDayIssueKeypresses_DayName_YearDayMonth << QString::fromLatin1("2000/Tuesday/02");
3688
3689     QTest::newRow("fixday, leap, d/M/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("d/M/yyyy")
3690         << reverseThreeDigitDayIssueKeypresses << QString::fromLatin1("29/2/2000");
3691
3692     QTest::newRow("fixday, leap, dd/MM/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("dd/MM/yyyy")
3693         << reverseThreeDigitDayIssueKeypresses << QString::fromLatin1("29/02/2000");
3694
3695     QTest::newRow("fixday, dd/MM/yyyy") << defaultLocale << defaultDate.addYears(1) << QString::fromLatin1("dd/MM/yyyy")
3696         << reverseThreeDigitDayIssueKeypresses << QString::fromLatin1("28/02/2001");
3697
3698     QTest::newRow("fixday, leap, dddd/MM/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("dddd/MM/yyyy")
3699         << threeDigitDayIssueKeypresses_DayName_DayMonthYear << QString::fromLatin1("Tuesday/02/2000");
3700
3701     QTest::newRow("fixday, leap, d/yy/M") << defaultLocale << defaultDate << QString::fromLatin1("d/yy/M")
3702         << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/00/2");
3703
3704     QTest::newRow("fixday, leap, d/yyyy/M") << defaultLocale << defaultDate << QString::fromLatin1("d/yyyy/M")
3705         << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/2000/2");
3706
3707     QTest::newRow("fixday, leap, d/yyyy/MM") << defaultLocale << defaultDate << QString::fromLatin1("d/yyyy/MM")
3708         << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/2000/02");
3709
3710     QTest::newRow("fixday, leap, dd/yy/MM") << defaultLocale << defaultDate << QString::fromLatin1("dd/yy/MM")
3711         << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/00/02");
3712
3713     QTest::newRow("fixday, leap, dd/yyyy/M") << defaultLocale << defaultDate << QString::fromLatin1("dd/yyyy/M")
3714         << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/2000/2");
3715
3716     QTest::newRow("fixday, leap, dd/yyyy/MM") << defaultLocale << defaultDate << QString::fromLatin1("dd/yyyy/MM")
3717         << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/2000/02");
3718
3719     QTest::newRow("fixday, leap, dddd/yy/M") << defaultLocale << defaultDate << QString::fromLatin1("dddd/yy/M")
3720         << threeDigitDayIssueKeypresses_DayName_DayYearMonth << QString::fromLatin1("Tuesday/00/2");
3721
3722     QTest::newRow("fixday, leap, dddd/yy/MM") << defaultLocale << defaultDate << QString::fromLatin1("dddd/yy/MM")
3723         << threeDigitDayIssueKeypresses_DayName_DayYearMonth << QString::fromLatin1("Tuesday/00/02");
3724
3725     QTest::newRow("fixday, leap, M/d/yy") << defaultLocale << defaultDate << QString::fromLatin1("M/d/yy")
3726         << threeDigitDayIssueKeypresses_MonthDayYear << QString::fromLatin1("2/29/00");
3727
3728     QTest::newRow("fixday, leap, M/d/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("M/d/yyyy")
3729         << threeDigitDayIssueKeypresses_MonthDayYear << QString::fromLatin1("2/29/2000");
3730
3731     QTest::newRow("fixday, leap, M/dd/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("M/dd/yyyy")
3732         << threeDigitDayIssueKeypresses_MonthDayYear << QString::fromLatin1("2/29/2000");
3733
3734     QTest::newRow("fixday, leap, M/dddd/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("M/dddd/yyyy")
3735         << threeDigitDayIssueKeypresses_DayName_MonthDayYear << QString::fromLatin1("2/Tuesday/2000");
3736
3737     QTest::newRow("fixday, leap, MM/dd/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("MM/dd/yyyy")
3738         << threeDigitDayIssueKeypresses_MonthDayYear << QString::fromLatin1("02/29/2000");
3739
3740     QTest::newRow("fixday, leap, MM/dddd/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("MM/dddd/yyyy")
3741         << threeDigitDayIssueKeypresses_DayName_MonthDayYear << QString::fromLatin1("02/Tuesday/2000");
3742
3743     QTest::newRow("fixday, leap, M/yyyy/dd") << defaultLocale << defaultDate << QString::fromLatin1("M/yyyy/dd")
3744         << threeDigitDayIssueKeypresses_MonthYearDay << QString::fromLatin1("2/2000/29");
3745
3746     QTest::newRow("fixday, leap, M/yy/dd") << defaultLocale << defaultDate << QString::fromLatin1("M/yy/dd")
3747         << threeDigitDayIssueKeypresses_MonthYearDay << QString::fromLatin1("2/00/29");
3748
3749     QTest::newRow("fixday, leap, M/yy/d") << defaultLocale << defaultDate << QString::fromLatin1("M/yy/d")
3750         << threeDigitDayIssueKeypresses_MonthYearDay << QString::fromLatin1("2/00/29");
3751
3752     QTest::newRow("fixday, leap, MM/yyyy/dd") << defaultLocale << defaultDate << QString::fromLatin1("MM/yyyy/dd")
3753         << threeDigitDayIssueKeypresses_MonthYearDay << QString::fromLatin1("02/2000/29");
3754
3755     QTest::newRow("fixday, leap, MMM/yy/d") << defaultLocale << defaultDate << QString::fromLatin1("MMM/yy/d")
3756         << threeDigitDayIssueKeypresses_ShortMonthName_MonthYearDay << QString::fromLatin1("Feb/00/29");
3757
3758     QTest::newRow("fixday, leap, MMM/yyyy/d") << defaultLocale << defaultDate << QString::fromLatin1("MMM/yyyy/d")
3759         << threeDigitDayIssueKeypresses_ShortMonthName_MonthYearDay << QString::fromLatin1("Feb/2000/29");
3760
3761     QTest::newRow("fixday, MMM/yyyy/d") << defaultLocale << defaultDate.addYears(1) << QString::fromLatin1("MMM/yyyy/d")
3762         << threeDigitDayIssueKeypresses_ShortMonthName_MonthYearDay << QString::fromLatin1("Feb/2001/28");
3763
3764     QTest::newRow("fixday, leap, MMM/yyyy/dd") << defaultLocale << defaultDate << QString::fromLatin1("MMM/yyyy/dd")
3765         << threeDigitDayIssueKeypresses_ShortMonthName_MonthYearDay << QString::fromLatin1("Feb/2000/29");
3766
3767     QTest::newRow("fixday, leap, dddd, dd. MMMM yyyy") << defaultLocale
3768         << defaultDate << QString::fromLatin1("dddd, dd. MMMM yyyy")
3769         << shortAndLongNameIssueKeypresses << QString::fromLatin1("Tuesday, 29. February 2000");
3770
3771     QTest::newRow("fixday, leap, german, dddd, dd. MMMM yyyy") << QLocale(QLocale::German, QLocale::Germany)
3772         << defaultDate << QString::fromLatin1("dddd, dd. MMMM yyyy")
3773         << shortAndLongNameIssueKeypresses << QString::fromLatin1("Dienstag, 29. Februar 2000");
3774 }
3775
3776 void tst_QDateTimeEdit::dateEditCorrectSectionSize()
3777 {
3778     QFETCH(QLocale, locale);
3779     QFETCH(QDate, defaultDate);
3780     QFETCH(QString, displayFormat);
3781     QFETCH(KeyPairList, keyPresses);
3782     QFETCH(QString, expectedDisplayString);
3783
3784     QDateEdit edit;
3785     edit.setLocale(locale);
3786     edit.setDate(defaultDate);
3787     edit.setDisplayFormat(displayFormat);
3788     edit.show();
3789     edit.setFocus();
3790     // For some reason, we need to set the selected section for the dd/MM/yyyy tests,
3791     // otherwise the 3 is inserted at the front of 01/01/2000 (301/01/2000), instead of the
3792     // selected text being replaced. This is not an issue for the yyyy/MM/dd format though...
3793     edit.setSelectedSection(edit.sectionAt(0));
3794
3795     foreach (const KeyPair &keyPair, keyPresses)
3796         QTest::keyClick(&edit, keyPair.first, keyPair.second);
3797
3798     QDateTimeEditPrivate* edit_d_ptr(static_cast<QDateTimeEditPrivate*>(qt_widget_private(&edit)));
3799     QCOMPARE(edit_d_ptr->text, expectedDisplayString);
3800 }
3801 #endif
3802
3803 QTEST_MAIN(tst_QDateTimeEdit)
3804 #include "tst_qdatetimeedit.moc"