1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the test suite of the Qt Toolkit.
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.
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.
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.
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.
40 ****************************************************************************/
43 #include <QtTest/QtTest>
44 #include <qapplication.h>
45 #include <qgroupbox.h>
46 #include <qlineedit.h>
47 #include <qwindowsstyle.h>
51 #include <qdatetimeedit.h>
54 #include <qeventloop.h>
57 #include <QStyleOptionSpinBox>
62 #include <QDateTimeEdit>
63 #include <QCalendarWidget>
69 #include <QVariantList>
71 #include <QApplication>
73 #include <QVBoxLayout>
78 #include <QStyleOptionComboBox>
82 #include <QWheelEvent>
85 #include <QTestEventList>
88 #include <private/qdatetimeedit_p.h>
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>);
105 #if defined(Q_OS_WINCE)
106 #ifndef SPI_GETPLATFORMTYPE
107 #define SPI_GETPLATFORMTYPE 257
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))
118 bool qt_wince_is_pocket_pc() {
119 return qt_wince_is_platform(QString::fromLatin1("PocketPC"));
121 bool qt_wince_is_smartphone() {
122 return qt_wince_is_platform(QString::fromLatin1("Smartphone"));
124 bool qt_wince_is_mobile() {
125 return (qt_wince_is_smartphone() || qt_wince_is_pocket_pc());
129 class EditorDateEdit : public QDateTimeEdit
133 EditorDateEdit(QWidget *parent = 0) : QDateTimeEdit(parent) {}
134 QLineEdit *lineEdit() { return QDateTimeEdit::lineEdit(); }
135 friend class tst_QDateTimeEdit;
138 class tst_QDateTimeEdit : public QObject
143 virtual ~tst_QDateTimeEdit();
148 void cleanupTestCase();
150 void cachedDayTest();
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();
160 void sectionText_data();
162 void dateTimeSignalChecking_data();
163 void dateTimeSignalChecking();
165 void stepHourAMPM_data();
168 void displayedSections_data();
169 void displayedSections();
170 void currentSection_data();
171 void currentSection();
173 void setCurrentSection();
174 void setCurrentSection_data();
176 void minimumDate_data();
178 void maximumDate_data();
180 void clearMinimumDate_data();
181 void clearMinimumDate();
182 void clearMaximumDate_data();
183 void clearMaximumDate();
185 void minimumDateTime_data();
186 void minimumDateTime();
187 void maximumDateTime_data();
188 void maximumDateTime();
190 void clearMinimumDateTime_data();
191 void clearMinimumDateTime();
192 void clearMaximumDateTime_data();
193 void clearMaximumDateTime();
195 void displayFormat_data();
196 void displayFormat();
198 void specialValueText();
199 void setRange_data();
202 void selectAndScrollWithKeys();
205 void tabKeyNavigation();
206 void tabKeyNavigationWithPrefix();
207 void tabKeyNavigationWithSuffix();
212 void wrappingDate_data();
215 void dateSignalChecking_data();
216 void dateSignalChecking();
218 void wrappingTime_data();
221 void userKeyPress_Time_data();
222 void userKeyPress_Time();
224 void timeSignalChecking_data();
225 void timeSignalChecking();
239 void calendarPopup();
248 void setSelectedSection();
254 void specialValueCornerCase();
255 void cursorPositionOnInit();
259 void nextPrevSection_data();
260 void nextPrevSection();
262 void dateEditTimeEditFormats();
263 void timeSpec_data();
267 void monthEdgeCase();
270 void potentialYYValueBug();
271 void textSectionAtEnd();
273 void keypadAutoAdvance_data();
274 void keypadAutoAdvance();
277 void focusNextPrevChild();
279 void taskQTBUG_12384_timeSpecShowTimeOnly();
281 void deleteCalendarWidget();
283 #ifdef QT_BUILD_INTERNAL
284 void dateEditCorrectSectionSize_data();
285 void dateEditCorrectSectionSize();
288 EditorDateEdit* testWidget;
289 QWidget *testFocusWidget;
292 typedef QList<QTime> TimeList;
293 typedef QList<Qt::Key> KeyList;
295 Q_DECLARE_METATYPE(TimeList)
296 Q_DECLARE_METATYPE(KeyList)
298 // Testing get/set functions
299 void tst_QDateTimeEdit::getSetCheck()
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());
325 tst_QDateTimeEdit::tst_QDateTimeEdit()
327 qRegisterMetaType<QDate>("QDate");
328 qRegisterMetaType<QTime>("QTime");
329 qRegisterMetaType<QDateTime>("QDateTime");
330 qRegisterMetaType<QList<int> >("QList<int>");
333 tst_QDateTimeEdit::~tst_QDateTimeEdit()
338 void tst_QDateTimeEdit::initTestCase()
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();
351 void tst_QDateTimeEdit::cleanupTestCase()
353 delete testFocusWidget;
360 void tst_QDateTimeEdit::init()
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));
366 testWidget->setDisplayFormat("dd/MM/yyyy"); // Nice default to have
367 testWidget->setDateTime(QDateTime(QDate(2000, 1, 1), QTime(0, 0)));
369 testFocusWidget->move(-1000, -1000);
372 void tst_QDateTimeEdit::cleanup()
374 testWidget->clearMinimumDateTime();
375 testWidget->clearMaximumDateTime();
376 testWidget->setTimeSpec(Qt::LocalTime);
377 testWidget->setSpecialValueText(QString());
378 testWidget->setWrapping(false);
381 void tst_QDateTimeEdit::constructor_qwidget()
384 QDateTimeEdit dte(0);
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));
393 void tst_QDateTimeEdit::constructor_qdatetime_data()
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");
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);
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);
415 void tst_QDateTimeEdit::constructor_qdatetime()
417 QFETCH(QDateTime, parameter);
418 QFETCH(QDateTime, displayDateTime);
419 QFETCH(QDate, minimumDate);
420 QFETCH(QTime, minimumTime);
421 QFETCH(QDate, maximumDate);
422 QFETCH(QTime, maximumTime);
426 QDateTimeEdit dte(parameter);
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);
435 void tst_QDateTimeEdit::constructor_qdate_data()
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");
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);
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);
457 void tst_QDateTimeEdit::constructor_qdate()
459 QFETCH(QDate, parameter);
460 QFETCH(QDateTime, displayDateTime);
461 QFETCH(QDate, minimumDate);
462 QFETCH(QTime, minimumTime);
463 QFETCH(QDate, maximumDate);
464 QFETCH(QTime, maximumTime);
468 QDateTimeEdit dte(parameter);
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);
477 void tst_QDateTimeEdit::constructor_qtime_data()
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");
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);
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);
499 void tst_QDateTimeEdit::constructor_qtime()
501 QFETCH(QTime, parameter);
502 QFETCH(QDateTime, displayDateTime);
503 QFETCH(QDate, minimumDate);
504 QFETCH(QTime, minimumTime);
505 QFETCH(QDate, maximumDate);
506 QFETCH(QTime, maximumTime);
510 QDateTimeEdit dte(parameter);
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);
519 void tst_QDateTimeEdit::minimumDate_data()
521 QTest::addColumn<QDate>("minimumDate");
522 QTest::addColumn<QDate>("expectedMinDate");
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);
532 void tst_QDateTimeEdit::minimumDate()
534 QFETCH(QDate, minimumDate);
535 QFETCH(QDate, expectedMinDate);
537 testWidget->setMinimumDate(minimumDate);
538 QCOMPARE(testWidget->minimumDate(), expectedMinDate);
541 void tst_QDateTimeEdit::minimumDateTime_data()
543 QTest::addColumn<QDateTime>("minimumDateTime");
544 QTest::addColumn<QDateTime>("expectedMinDateTime");
546 QTest::newRow("normal-0") << QDateTime(QDate(2004, 5, 10), QTime(2, 3, 14))
547 << QDateTime(QDate(2004, 5, 10), QTime(2, 3, 14));
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));
562 void tst_QDateTimeEdit::minimumDateTime()
564 QFETCH(QDateTime, minimumDateTime);
565 QFETCH(QDateTime, expectedMinDateTime);
567 testWidget->setMinimumDateTime(minimumDateTime);
568 QCOMPARE(testWidget->minimumDateTime(), expectedMinDateTime);
572 void tst_QDateTimeEdit::maximumDateTime_data()
574 QTest::addColumn<QDateTime>("maximumDateTime");
575 QTest::addColumn<QDateTime>("expectedMinDateTime");
577 QTest::newRow("normal-0") << QDateTime(QDate(2004, 5, 10), QTime(2, 3, 14))
578 << QDateTime(QDate(2004, 5, 10), QTime(2, 3, 14));
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));
591 void tst_QDateTimeEdit::maximumDateTime()
593 QFETCH(QDateTime, maximumDateTime);
594 QFETCH(QDateTime, expectedMinDateTime);
596 testWidget->setMaximumDateTime(maximumDateTime);
597 QCOMPARE(testWidget->maximumDateTime(), expectedMinDateTime);
600 void tst_QDateTimeEdit::maximumDate_data()
602 QTest::addColumn<QDate>("maximumDate");
603 QTest::addColumn<QDate>("expectedMaxDate");
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);
612 void tst_QDateTimeEdit::maximumDate()
614 QFETCH(QDate, maximumDate);
615 QFETCH(QDate, expectedMaxDate);
617 testWidget->setMaximumDate(maximumDate);
618 QCOMPARE(testWidget->maximumDate(), expectedMaxDate);
621 void tst_QDateTimeEdit::clearMinimumDate_data()
623 QTest::addColumn<QDate>("minimumDate");
624 QTest::addColumn<bool>("valid");
625 QTest::addColumn<QDate>("expectedMinDateAfterClear");
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);
634 void tst_QDateTimeEdit::clearMinimumDate()
636 QFETCH(QDate, minimumDate);
638 QFETCH(QDate, expectedMinDateAfterClear);
640 testWidget->setMinimumDate(minimumDate);
642 QCOMPARE(testWidget->minimumDate(), minimumDate);
644 testWidget->clearMinimumDate();
645 QCOMPARE(testWidget->minimumDate(), expectedMinDateAfterClear);
648 void tst_QDateTimeEdit::clearMinimumDateTime_data()
650 QTest::addColumn<QDateTime>("minimumDateTime");
651 QTest::addColumn<bool>("valid");
652 QTest::addColumn<QDateTime>("expectedMinDateTimeAfterClear");
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));
668 void tst_QDateTimeEdit::clearMinimumDateTime()
670 QFETCH(QDateTime, minimumDateTime);
672 QFETCH(QDateTime, expectedMinDateTimeAfterClear);
674 testWidget->setMinimumDateTime(minimumDateTime);
676 QCOMPARE(testWidget->minimumDateTime(), minimumDateTime);
678 testWidget->clearMinimumDateTime();
679 QCOMPARE(testWidget->minimumDateTime(), expectedMinDateTimeAfterClear);
683 void tst_QDateTimeEdit::clearMaximumDateTime_data()
685 QTest::addColumn<QDateTime>("maximumDateTime");
686 QTest::addColumn<bool>("valid");
687 QTest::addColumn<QDateTime>("expectedMinDateTimeAfterClear");
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));
701 void tst_QDateTimeEdit::clearMaximumDateTime()
703 QFETCH(QDateTime, maximumDateTime);
705 QFETCH(QDateTime, expectedMinDateTimeAfterClear);
707 testWidget->setMaximumDateTime(maximumDateTime);
709 QCOMPARE(testWidget->maximumDateTime(), maximumDateTime);
711 testWidget->clearMaximumDateTime();
712 QCOMPARE(testWidget->maximumDateTime(), expectedMinDateTimeAfterClear);
716 void tst_QDateTimeEdit::clearMaximumDate_data()
718 QTest::addColumn<QDate>("maximumDate");
719 QTest::addColumn<bool>("valid");
720 QTest::addColumn<QDate>("expectedMaxDateAfterClear");
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);
729 void tst_QDateTimeEdit::clearMaximumDate()
731 QFETCH(QDate, maximumDate);
733 QFETCH(QDate, expectedMaxDateAfterClear);
735 testWidget->setMaximumDate(maximumDate);
737 QCOMPARE(testWidget->maximumDate(), maximumDate);
739 testWidget->clearMaximumDate();
740 QCOMPARE(testWidget->maximumDate(), expectedMaxDateAfterClear);
743 void tst_QDateTimeEdit::displayFormat_data()
745 QTest::addColumn<QString>("format");
746 QTest::addColumn<bool>("valid");
747 QTest::addColumn<QString>("text");
748 QTest::addColumn<QDateTime>("date");
750 const QDateTime dt(QDate(2999, 12, 31), QTime(3, 59, 59, 999));
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));
769 void tst_QDateTimeEdit::displayFormat()
771 QFETCH(QString, format);
773 QFETCH(QString, text);
774 QFETCH(QDateTime, date);
776 testWidget->setDateTime(date);
778 QString compareFormat = format;
780 compareFormat = testWidget->displayFormat();
781 testWidget->setDisplayFormat(format);
782 QCOMPARE(testWidget->displayFormat(), compareFormat);
784 QCOMPARE(testWidget->text(), text);
787 void tst_QDateTimeEdit::selectAndScrollWithKeys()
789 qApp->setActiveWindow(testWidget);
790 testWidget->setDate(QDate(2004, 05, 11));
791 testWidget->setDisplayFormat("dd/MM/yyyy");
794 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
796 QTest::keyClick(testWidget, Qt::Key_Home);
798 QTest::keyClick(testWidget, Qt::Key_Right, Qt::ShiftModifier);
800 QEXPECT_FAIL("", "QTBUG-23674", Abort);
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"));
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"));
836 QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
838 QTest::keyClick(testWidget, Qt::Key_End);
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"));
863 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
865 QTest::keyClick(testWidget, Qt::Key_Home);
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"));
879 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
881 QTest::keyClick(testWidget, Qt::Key_Home);
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));
892 void tst_QDateTimeEdit::backspaceKey()
894 qApp->setActiveWindow(testWidget);
895 testWidget->setDate(QDate(2004, 05, 11));
896 testWidget->setDisplayFormat("d/MM/yyyy");
899 QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
901 QTest::keyClick(testWidget, Qt::Key_End);
903 QCOMPARE(testWidget->text(), QString("11/05/2004"));
904 QTest::keyClick(testWidget, Qt::Key_Backspace);
906 QEXPECT_FAIL("", "QTBUG-23674", Abort);
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"));
916 QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
918 QTest::keyClick(testWidget, Qt::Key_End);
920 for (int i=0;i<4;i++) {
921 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ShiftModifier);
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();
931 QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
933 QTest::keyClick(testWidget, Qt::Key_End);
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"));
959 void tst_QDateTimeEdit::deleteKey()
961 qApp->setActiveWindow(testWidget);
962 testWidget->setDate(QDate(2004, 05, 11));
963 testWidget->setDisplayFormat("d/MM/yyyy");
965 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
967 QTest::keyClick(testWidget, Qt::Key_Home);
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"));
978 void tst_QDateTimeEdit::tabKeyNavigation()
980 qApp->setActiveWindow(testWidget);
981 testWidget->setDate(QDate(2004, 05, 11));
982 testWidget->setDisplayFormat("dd/MM/yyyy");
984 testWidget->setCurrentSection(QDateTimeEdit::DaySection);
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"));
996 void tst_QDateTimeEdit::tabKeyNavigationWithPrefix()
998 qApp->setActiveWindow(testWidget);
999 testWidget->setDate(QDate(2004, 05, 11));
1000 testWidget->setDisplayFormat("prefix dd/MM/yyyy");
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"));
1014 void tst_QDateTimeEdit::tabKeyNavigationWithSuffix()
1016 qApp->setActiveWindow(testWidget);
1017 testWidget->setDate(QDate(2004, 05, 11));
1018 testWidget->setDisplayFormat("dd/MM/yyyy 'suffix'");
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"));
1031 void tst_QDateTimeEdit::enterKey()
1033 qApp->setActiveWindow(testWidget);
1034 testWidget->setDate(QDate(2004, 5, 11));
1035 testWidget->setDisplayFormat("prefix d/MM/yyyy 'suffix'");
1036 testWidget->lineEdit()->setFocus();
1039 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
1041 QTest::keyClick(testWidget, Qt::Key_Home);
1043 QTest::keyClick(testWidget, Qt::Key_Enter);
1045 QEXPECT_FAIL("", "QTBUG-23674", Abort);
1047 QVERIFY(!testWidget->lineEdit()->hasSelectedText());
1049 QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
1051 QTest::keyClick(testWidget, Qt::Key_End);
1053 QTest::keyClick(testWidget, Qt::Key_Enter);
1054 QVERIFY(!testWidget->lineEdit()->hasSelectedText());
1056 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
1058 QTest::keyClick(testWidget, Qt::Key_Home);
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);
1066 QTest::keyClick(testWidget, Qt::Key_Left);
1067 QTest::keyClick(testWidget, Qt::Key_Left);
1069 QTest::keyClick(testWidget, Qt::Key_Enter);
1070 QCOMPARE(testWidget->lineEdit()->selectedText(), QString("15"));
1071 QCOMPARE(testWidget->date(), QDate(2004, 5, 15));
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));
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));
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));
1096 void tst_QDateTimeEdit::specialValueText()
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"));
1119 QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
1121 QTest::keyClick(testWidget, Qt::Key_End);
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"));
1130 QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
1132 QTest::keyClick(testWidget, Qt::Key_End);
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"));
1149 void tst_QDateTimeEdit::setRange_data()
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");
1158 const QDate cdt = QDate::currentDate();
1160 QTest::newRow("data0") << QTime(0, 0) << QTime(14, 12, 0)
1162 << QDateTime(cdt, QTime(0, 0))
1163 << QDateTime(cdt, QTime(14, 12, 0));
1165 QTest::newRow("data1") << QTime(10, 0) << QTime(1, 12, 0) << cdt.addDays(-1)
1167 << QDateTime(cdt.addDays(-1), QTime(10, 0))
1168 << QDateTime(cdt, QTime(1, 12, 0));
1171 void tst_QDateTimeEdit::setRange()
1173 QFETCH(QTime, minTime);
1174 QFETCH(QTime, maxTime);
1175 QFETCH(QDate, minDate);
1176 QFETCH(QDate, maxDate);
1177 QFETCH(QDateTime, expectedMin);
1178 QFETCH(QDateTime, expectedMax);
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());
1203 QDateTimeEdit dte2(0);
1204 dte2.setDateRange(minDate, maxDate);
1205 dte2.setTimeRange(minTime, maxTime);
1207 QCOMPARE(dte2.minimumDate(), expectedMin.date());
1208 QCOMPARE(dte2.maximumDate(), expectedMax.date());
1209 QCOMPARE(dte2.minimumTime(), expectedMin.time());
1210 QCOMPARE(dte2.maximumTime(), expectedMax.time());
1214 QDateTimeEdit dte3(0);
1215 dte3.setMinimumTime(minTime);
1216 dte3.setMaximumTime(maxTime);
1217 dte3.setMinimumDate(minDate);
1218 dte3.setMaximumDate(maxDate);
1220 QCOMPARE(dte3.minimumDate(), expectedMin.date());
1221 QCOMPARE(dte3.maximumDate(), expectedMax.date());
1222 QCOMPARE(dte3.minimumTime(), expectedMin.time());
1223 QCOMPARE(dte3.maximumTime(), expectedMax.time());
1227 QDateTimeEdit dte4(0);
1228 dte4.setMinimumDate(minDate);
1229 dte4.setMaximumDate(maxDate);
1230 dte4.setMinimumTime(minTime);
1231 dte4.setMaximumTime(maxTime);
1233 QCOMPARE(dte4.minimumDate(), expectedMin.date());
1234 QCOMPARE(dte4.maximumDate(), expectedMax.date());
1235 QCOMPARE(dte4.minimumTime(), expectedMin.time());
1236 QCOMPARE(dte4.maximumTime(), expectedMax.time());
1240 void tst_QDateTimeEdit::wrappingTime_data()
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");
1248 QTest::newRow("data0") << false << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::HourSection
1250 QTest::newRow("data1") << true << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::HourSection
1252 QTest::newRow("data2") << false << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::MinuteSection
1254 QTest::newRow("data3") << true << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::MinuteSection
1256 QTest::newRow("data4") << false << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::SecondSection
1258 QTest::newRow("data5") << true << QTime(0,0,0) << QTime(2,2,2) << (uint)QDateTimeEdit::SecondSection
1260 QTest::newRow("data6") << false << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::HourSection
1262 QTest::newRow("data7") << true << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::HourSection
1264 QTest::newRow("data8") << false << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::MinuteSection
1266 QTest::newRow("data9") << true << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::MinuteSection
1268 QTest::newRow("data10") << false << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::SecondSection
1270 QTest::newRow("data11") << true << QTime(1,1,1) << QTime(22,22,22) << (uint)QDateTimeEdit::SecondSection
1272 QTest::newRow("data12") << false << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::HourSection
1274 QTest::newRow("data13") << true << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::HourSection
1276 QTest::newRow("data14") << false << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::MinuteSection
1278 QTest::newRow("data15") << true << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::MinuteSection
1280 QTest::newRow("data16") << false << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::SecondSection
1282 QTest::newRow("data17") << true << QTime(1,1,1) << QTime(1,2,1) << (uint)QDateTimeEdit::SecondSection
1287 void tst_QDateTimeEdit::wrappingTime()
1289 QFETCH(bool, startWithMin);
1290 QFETCH(QTime, minimumTime);
1291 QFETCH(QTime, maximumTime);
1292 QFETCH(uint, section);
1293 QFETCH(QTime, newTime);
1295 testWidget->setDisplayFormat("hh:mm:ss");
1296 testWidget->setMinimumTime(minimumTime);
1297 testWidget->setMaximumTime(maximumTime);
1298 testWidget->setWrapping(true);
1299 testWidget->setCurrentSection((QDateTimeEdit::Section)section);
1301 testWidget->setTime(minimumTime);
1302 QTest::keyClick(testWidget, Qt::Key_Down);
1304 testWidget->setTime(maximumTime);
1305 QTest::keyClick(testWidget, Qt::Key_Up);
1307 QTest::keyClick(testWidget, Qt::Key_Enter);
1308 QCOMPARE(testWidget->time(), newTime);
1311 void tst_QDateTimeEdit::userKeyPress_Time_data()
1313 QTest::addColumn<bool>("ampm");
1314 QTest::addColumn<QTestEventList>("keys");
1315 QTest::addColumn<QTime>("expected_time");
1317 // ***************** test the hours ***************
1319 // use up/down keys to change hour in 12 h mode
1321 QTestEventList keys;
1322 keys.addKeyClick( Qt::Key_Down );
1323 QTime expected( 10, 0, 0 );
1324 QTest::newRow( "data0" ) << bool(true) << keys << expected;
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;
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;
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;
1348 QTestEventList keys;
1349 keys.addKeyClick( Qt::Key_Up );
1350 QTime expected( 12, 0, 0 );
1351 QTest::newRow( "data4" ) << bool(true) << keys << expected;
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;
1361 // use up/down keys to change hour in 24 h mode
1363 QTestEventList keys;
1364 keys.addKeyClick( Qt::Key_Down );
1365 QTime expected( 10, 0, 0 );
1366 QTest::newRow( "data6" ) << bool(false) << keys << expected;
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;
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;
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;
1390 QTestEventList keys;
1391 keys.addKeyClick( Qt::Key_Up );
1392 QTime expected( 12, 0, 0 );
1393 QTest::newRow( "data10" ) << bool(false) << keys << expected;
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;
1403 // enter a one digit valid hour
1405 QTestEventList keys;
1406 keys.addKeyClick( '5' );
1407 QTime expected( 5, 0, 0 );
1408 QTest::newRow( "data12" ) << bool(true) << keys << expected;
1411 // entering a two digit valid hour
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;
1420 // entering an invalid hour
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;
1430 // enter a value, in hour which causes a field change
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;
1440 // enter a one digit valid hour in 24 h mode
1442 QTestEventList keys;
1443 keys.addKeyClick( '5' );
1444 QTime expected( 5, 0, 0 );
1445 QTest::newRow( "data16" ) << bool(false) << keys << expected;
1448 // enter a two digit valid hour in 24 h mode
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;
1457 // enter a two digit valid hour (>12) in 24 h mode
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;
1466 // enter a two digit valid hour (>20) in 24 h mode
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;
1475 // enter a two digit invalid hour (>23) in 24 h mode
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;
1484 // ***************** test the minutes ***************
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;
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;
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;
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;
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;
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;
1535 // use up/down keys to change the minutes in 24 hour mode
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;
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;
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;
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;
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;
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;
1585 // enter a valid one digit minute in 12 h mode
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;
1594 // enter a valid two digit minutes in 12 h mode
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;
1604 // check the lower limit of the minutes in 12 h mode
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;
1613 // check the upper limit of the minutes in 12 h mode
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;
1623 // enter an invalid two digit minutes in 12 h mode
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;
1633 // test minutes in 24 hour motestWidget-> Behaviour should be exactly the same
1635 // enter a valid one digit minute in 24 h mode
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;
1644 // enter a valid two digit minutes in 24 h mode
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;
1654 // check the lower limit of the minutes in 24 h mode
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;
1663 // check the upper limit of the minutes in 24 h mode
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;
1673 // enter an invalid two digit minutes in 24 h mode
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;
1683 // ***************** test the seconds ***************
1685 // use up/down to edit the seconds...
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;
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;
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;
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;
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;
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;
1742 // use up/down keys to change the seconds in 24 hour mode
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;
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;
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;
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;
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;
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;
1798 // enter a valid one digit second in 12 h mode
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;
1808 // enter a valid two digit seconds in 12 h mode
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;
1819 // check the lower limit of the seconds in 12 h mode
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;
1829 // check the upper limit of the seconds in 12 h mode
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;
1840 // enter an invalid two digit seconds in 12 h mode
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;
1851 // test seconds in 24 hour mode. Behaviour should be exactly the same
1853 // enter a valid one digit minute in 24 h mode
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;
1863 // enter a valid two digit seconds in 24 h mode
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;
1874 // check the lower limit of the seconds in 24 h mode
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;
1884 // check the upper limit of the seconds in 24 h mode
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;
1895 // enter an invalid two digit seconds in 24 h mode
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;
1906 // Test the AMPM indicator
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;
1916 // Test the AMPM indicator
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;
1926 // Test the AMPM indicator
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;
1937 // Test the AMPM indicator
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;
1950 void tst_QDateTimeEdit::userKeyPress_Time()
1953 QFETCH(QTestEventList, keys);
1954 QFETCH(QTime, expected_time);
1957 testWidget->setDisplayFormat("hh:mm:ss ap");
1959 testWidget->setDisplayFormat("hh:mm:ss");
1961 testWidget->setTime(QTime(11, 0, 0));
1962 testWidget->setFocus();
1964 testWidget->setWrapping(true);
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);
1971 QCOMPARE(testWidget->time(), expected_time);
1974 void tst_QDateTimeEdit::wrappingDate_data()
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");
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);
2009 void tst_QDateTimeEdit::wrappingDate()
2011 QFETCH(bool, startWithMin);
2012 QFETCH(QDate, minimumDate);
2013 QFETCH(QDate, maximumDate);
2014 QFETCH(uint, section);
2015 QFETCH(QDate, newDate);
2017 testWidget->setDisplayFormat("dd/MM/yyyy");
2018 testWidget->setMinimumDate(minimumDate);
2019 testWidget->setMaximumDate(maximumDate);
2020 testWidget->setWrapping(true);
2021 testWidget->setCurrentSection((QDateTimeEdit::Section)section);
2024 testWidget->setDate(minimumDate);
2025 QTest::keyClick(testWidget, Qt::Key_Down);
2027 testWidget->setDate(maximumDate);
2028 QTest::keyClick(testWidget, Qt::Key_Up);
2030 if (testWidget->currentSection() == QDateTimeEdit::MonthSection)
2031 QCOMPARE(testWidget->date(), newDate);
2034 void tst_QDateTimeEdit::dateSignalChecking_data()
2036 QTest::addColumn<QDate>("originalDate");
2037 QTest::addColumn<QDate>("newDate");
2038 QTest::addColumn<int>("timesEmitted");
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;
2044 void tst_QDateTimeEdit::dateSignalChecking()
2046 QFETCH(QDate, originalDate);
2047 QFETCH(QDate, newDate);
2048 QFETCH(int, timesEmitted);
2050 testWidget->setDate(originalDate);
2052 QSignalSpy dateSpy(testWidget, SIGNAL(dateChanged(const QDate &)));
2053 QSignalSpy dateTimeSpy(testWidget, SIGNAL(dateTimeChanged(const QDateTime &)));
2054 QSignalSpy timeSpy(testWidget, SIGNAL(timeChanged(const QTime &)));
2056 testWidget->setDate(newDate);
2057 QCOMPARE(dateSpy.count(), timesEmitted);
2059 if (timesEmitted > 0) {
2060 QList<QVariant> list = dateSpy.takeFirst();
2062 d = qvariant_cast<QDate>(list.at(0));
2063 QCOMPARE(d, newDate);
2065 QCOMPARE(dateTimeSpy.count(), timesEmitted);
2066 QCOMPARE(timeSpy.count(), 0);
2069 void tst_QDateTimeEdit::timeSignalChecking_data()
2071 QTest::addColumn<QTime>("originalTime");
2072 QTest::addColumn<QTime>("newTime");
2073 QTest::addColumn<int>("timesEmitted");
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;
2079 void tst_QDateTimeEdit::timeSignalChecking()
2081 QFETCH(QTime, originalTime);
2082 QFETCH(QTime, newTime);
2083 QFETCH(int, timesEmitted);
2085 testWidget->setTime(originalTime);
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 &)));
2092 testWidget->setTime(newTime);
2093 QCOMPARE(timeSpy.count(), timesEmitted);
2095 if (timesEmitted > 0) {
2096 QList<QVariant> list = timeSpy.takeFirst();
2098 t = qvariant_cast<QTime>(list.at(0));
2099 QCOMPARE(t, newTime);
2101 QCOMPARE(dateTimeSpy.count(), timesEmitted);
2102 QCOMPARE(dateSpy.count(), 0);
2105 void tst_QDateTimeEdit::dateTimeSignalChecking_data()
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");
2113 QTest::newRow("data0") << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 0))
2114 << QDateTime(QDate(2004, 7, 23), QTime(15, 17, 12))
2116 QTest::newRow("data1") << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 0))
2117 << QDateTime(QDate(2004, 6, 22), QTime(15, 17, 12))
2119 QTest::newRow("data2") << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 0))
2120 << QDateTime(QDate(2004, 7, 23), QTime(15, 55, 0))
2122 QTest::newRow("data3") << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 0))
2123 << QDateTime(QDate(2004, 6, 22), QTime(15, 55, 0))
2127 void tst_QDateTimeEdit::dateTimeSignalChecking()
2129 QFETCH(QDateTime, originalDateTime);
2130 QFETCH(QDateTime, newDateTime);
2131 QFETCH(int, timesDateEmitted);
2132 QFETCH(int, timesTimeEmitted);
2133 QFETCH(int, timesDateTimeEmitted);
2135 testWidget->setDisplayFormat("dd/MM/yyyy hh:mm:ss");
2136 testWidget->setDateTime(originalDateTime);
2138 QSignalSpy dateSpy(testWidget, SIGNAL(dateChanged(const QDate &)));
2139 QSignalSpy timeSpy(testWidget, SIGNAL(timeChanged(const QTime &)));
2140 QSignalSpy dateTimeSpy(testWidget, SIGNAL(dateTimeChanged(const QDateTime &)));
2142 testWidget->setDateTime(newDateTime);
2143 QCOMPARE(dateSpy.count(), timesDateEmitted);
2144 if (timesDateEmitted > 0) {
2145 QCOMPARE(timesDateEmitted, 1);
2146 QList<QVariant> list = dateSpy.takeFirst();
2148 d = qvariant_cast<QDate>(list.at(0));
2149 QCOMPARE(d, newDateTime.date());
2151 QCOMPARE(timeSpy.count(), timesTimeEmitted);
2152 if (timesTimeEmitted > 0) {
2153 QList<QVariant> list = timeSpy.takeFirst();
2155 t = qvariant_cast<QTime>(list.at(0));
2156 QCOMPARE(t, newDateTime.time());
2158 QCOMPARE(dateTimeSpy.count(), timesDateTimeEmitted);
2159 if (timesDateTimeEmitted > 0) {
2160 QList<QVariant> list = dateTimeSpy.takeFirst();
2162 dt = qvariant_cast<QDateTime>(list.at(0));
2163 QCOMPARE(dt, newDateTime);
2168 void tst_QDateTimeEdit::sectionText_data()
2170 QTest::addColumn<QString>("format");
2171 QTest::addColumn<QDateTime>("dateTime");
2172 QTest::addColumn<uint>("section");
2173 QTest::addColumn<QString>("sectionText");
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();
2213 void tst_QDateTimeEdit::sectionText()
2215 QFETCH(QString, format);
2216 QFETCH(QDateTime, dateTime);
2217 QFETCH(uint, section);
2218 QFETCH(QString, sectionText);
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);
2231 void tst_QDateTimeEdit::mousePress()
2233 testWidget->setDate(QDate(2004, 6, 23));
2234 testWidget->setCurrentSection(QDateTimeEdit::YearSection);
2235 QCOMPARE(testWidget->currentSection(), QDateTimeEdit::YearSection);
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);
2242 // Send mouseClick to center of SC_SpinBoxUp
2243 QTest::mouseClick(testWidget, Qt::LeftButton, 0, rectUp.center());
2244 QCOMPARE(testWidget->date().year(), 2005);
2248 void tst_QDateTimeEdit::stepHourAMPM_data()
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");
2261 expected << QTime(1, 0, 0);
2263 expected << QTime(2, 0, 0);
2265 expected << QTime(3, 0, 0);
2267 expected << QTime(4, 0, 0);
2269 expected << QTime(5, 0, 0);
2271 expected << QTime(6, 0, 0);
2273 expected << QTime(7, 0, 0);
2275 expected << QTime(8, 0, 0);
2277 expected << QTime(9, 0, 0);
2279 expected << QTime(10, 0, 0);
2281 expected << QTime(11, 0, 0);
2283 expected << QTime(12, 0, 0);
2285 expected << QTime(13, 0, 0);
2287 expected << QTime(14, 0, 0);
2289 expected << QTime(15, 0, 0);
2291 expected << QTime(16, 0, 0);
2293 expected << QTime(17, 0, 0);
2295 expected << QTime(18, 0, 0);
2297 expected << QTime(19, 0, 0);
2299 expected << QTime(20, 0, 0);
2301 expected << QTime(21, 0, 0);
2303 expected << QTime(22, 0, 0);
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);
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);
2359 QTest::newRow("HH:ap 2") << QString("HH:ap") << keys << expected
2360 << QTime(0, 0) << QTime(0, 0)
2361 << QTime(23, 59, 59);
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);
2376 expected << QTime(23, 0, 0);
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);
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);
2396 void tst_QDateTimeEdit::stepHourAMPM()
2398 QFETCH(QString, format);
2399 QFETCH(KeyList, keys);
2400 QFETCH(TimeList, expected);
2401 QFETCH(QTime, start);
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());
2415 for (int i=0; i<keys.size(); ++i) {
2416 QTest::keyClick(testWidget, keys.at(i));
2417 QCOMPARE(testWidget->time(), expected.at(i));
2422 void tst_QDateTimeEdit::displayedSections_data()
2424 QTest::addColumn<QString>("format");
2425 QTest::addColumn<uint>("section");
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;
2455 void tst_QDateTimeEdit::displayedSections()
2457 QFETCH(QString, format);
2458 QFETCH(uint, section);
2460 testWidget->setDisplayFormat(format);
2461 QVERIFY((QDateTimeEdit::Section)section == testWidget->displayedSections());
2464 void tst_QDateTimeEdit::currentSection_data()
2466 QTest::addColumn<QString>("format");
2467 QTest::addColumn<uint>("section");
2468 QTest::addColumn<uint>("currentSection");
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;
2495 void tst_QDateTimeEdit::currentSection()
2497 QFETCH(QString, format);
2498 QFETCH(uint, section);
2499 QFETCH(uint, currentSection);
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());
2508 void tst_QDateTimeEdit::readOnly()
2511 QDateTimeEdit dt(QDate(2000, 2, 1));
2512 dt.setDisplayFormat("yyyy.MM.dd");
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));
2527 void tst_QDateTimeEdit::weirdCase()
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);
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"));
2551 void tst_QDateTimeEdit::newCase()
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");
2557 testWidget->setDisplayFormat("MMMM'a'MbMMMcMM");
2558 testWidget->setDate(QDate(2005, 6, 1));
2559 QCOMPARE(testWidget->text(), QString("Junea6bJunc06"));
2561 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2563 QTest::keyClick(testWidget, Qt::Key_Home);
2565 QTest::keyClick(testWidget, Qt::Key_Up);
2566 QCOMPARE(testWidget->text(), QString("Julya7bJulc07"));
2567 QCOMPARE(testWidget->lineEdit()->selectedText(), QString("July"));
2569 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2571 QTest::keyClick(testWidget, Qt::Key_Home);
2574 QEXPECT_FAIL("", "QTBUG-23674", Abort);
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);
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"));
2593 void tst_QDateTimeEdit::newCase2()
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));
2602 void tst_QDateTimeEdit::newCase3()
2604 if (!QDate::longMonthName(1).startsWith("Januar"))
2605 QSKIP("This test does not work in this locale");
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);
2623 void tst_QDateTimeEdit::cursorPos()
2625 if (QDate::longMonthName(1) != "January")
2626 QSKIP("This test only works in English");
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);
2642 QTest::keyClick(testWidget, Qt::Key_Y);
2643 QCOMPARE(testWidget->lineEdit()->cursorPosition(), 11);
2645 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2647 QTest::keyClick(testWidget, Qt::Key_Home);
2649 QTest::keyClick(testWidget, Qt::Key_Return);
2650 QTest::keyClick(testWidget, Qt::Key_3);
2651 QTest::keyClick(testWidget, Qt::Key_1);
2653 QEXPECT_FAIL("", "QTBUG-23674", Abort);
2655 QCOMPARE(testWidget->lineEdit()->cursorPosition(), 3);
2658 void tst_QDateTimeEdit::newCase4()
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"));
2671 void tst_QDateTimeEdit::newCase5()
2673 testWidget->setDisplayFormat("yyyy-MM-dd hh:mm:ss zzz 'ms'");
2674 testWidget->setDateTime(QDateTime(QDate(2005, 10, 7), QTime(17, 44, 13, 100)));
2676 QCOMPARE(testWidget->lineEdit()->displayText(), QString("2005-10-07 17:44:13 100 ms"));
2678 QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
2680 QTest::keyClick(testWidget, Qt::Key_End);
2682 QTest::keyClick(testWidget, Qt::Key_Backtab, Qt::ShiftModifier);
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);
2689 QEXPECT_FAIL("", "QTBUG-23674", Abort);
2691 QCOMPARE(testWidget->lineEdit()->displayText(), QString("2005-10-07 17:44:13 124 ms"));
2693 QTest::keyClick(testWidget, Qt::Key_Backspace);
2694 QCOMPARE(testWidget->lineEdit()->displayText(), QString("2005-10-07 17:44:13 12 ms"));
2697 void tst_QDateTimeEdit::newCase6()
2699 testWidget->setDisplayFormat("d-yyyy-MM-dd");
2700 testWidget->setDate(QDate(2005, 10, 7));
2702 QCOMPARE(testWidget->lineEdit()->displayText(), QString("7-2005-10-07"));
2704 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2706 QTest::keyClick(testWidget, Qt::Key_Home);
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"));
2715 void tst_QDateTimeEdit::task98554()
2717 testWidget->setDisplayFormat("mm.ss.zzz(ms)");
2718 testWidget->setTime(QTime(0, 0, 9));
2719 testWidget->setCurrentSection(QDateTimeEdit::SecondSection);
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));
2728 static QList<int> makeList(int val1, int val2, int val3)
2731 ret << val1 << val2 << val3;
2736 void tst_QDateTimeEdit::setCurrentSection_data()
2738 QTest::addColumn<QString>("format");
2739 QTest::addColumn<QDateTime>("dateTime");
2740 QTest::addColumn<QList<int> >("setCurrentSections");
2741 QTest::addColumn<QList<int> >("expectedCursorPositions");
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);
2766 void tst_QDateTimeEdit::setCurrentSection()
2768 QFETCH(QString, format);
2769 QFETCH(QDateTime, dateTime);
2770 QFETCH(QList<int>, setCurrentSections);
2771 QFETCH(QList<int>, expectedCursorPositions);
2773 QCOMPARE(setCurrentSections.size(), expectedCursorPositions.size());
2774 testWidget->setDisplayFormat(format);
2775 testWidget->setDateTime(dateTime);
2777 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2779 QTest::keyClick(testWidget, Qt::Key_Home);
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));
2791 void tst_QDateTimeEdit::setSelectedSection()
2793 testWidget->setDisplayFormat("mm.ss.zzz('ms') m");
2794 testWidget->setTime(QTime(0, 0, 9));
2797 QTest::keyClick(testWidget, Qt::Key_Left, Qt::ControlModifier);
2799 QTest::keyClick(testWidget, Qt::Key_Home);
2802 QEXPECT_FAIL("", "QTBUG-23674", Abort);
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());
2816 void tst_QDateTimeEdit::calendarPopup()
2820 QVERIFY(!edit.calendarWidget());
2821 edit.setCalendarPopup(true);
2822 QVERIFY(edit.calendarWidget());
2827 QVERIFY(!edit.calendarWidget());
2828 edit.setCalendarPopup(true);
2829 QVERIFY(!edit.calendarWidget());
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());
2850 testWidget->setDisplayFormat("dd/MM/yyyy");
2851 testWidget->setDateTime(QDateTime(QDate(2000, 1, 1), QTime(0, 0)));
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");
2867 timeEdit.setCalendarPopup(true);
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");
2880 dateEdit.setCalendarPopup(true);
2881 dateEdit.setReadOnly(true);
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");
2894 class RestoreLayoutDirectioner
2897 RestoreLayoutDirectioner(Qt::LayoutDirection was)
2901 ~RestoreLayoutDirectioner()
2903 QApplication::setLayoutDirection(old);
2906 const Qt::LayoutDirection old;
2909 void tst_QDateTimeEdit::reverseTest()
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"));
2917 QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
2919 QTest::keyClick(testWidget, Qt::Key_End);
2922 QEXPECT_FAIL("", "QTBUG-23674", Abort);
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"));
2931 void tst_QDateTimeEdit::hour12Test()
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);
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);
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);
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"));
2958 void tst_QDateTimeEdit::yyTest()
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);
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");
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);
2992 testWidget->stepBy(-50);
2993 QCOMPARE(testWidget->sectionText(QDateTimeEdit::YearSection), QString("00"));
2994 QCOMPARE(testWidget->date(), QDate(2000 - ((i + 1) * 100), 1, 1));
2998 void tst_QDateTimeEdit::task108572()
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"));
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));
3015 void tst_QDateTimeEdit::task149097()
3017 QSignalSpy dtSpy(testWidget, SIGNAL(dateTimeChanged(const QDateTime &)));
3018 QSignalSpy dSpy(testWidget, SIGNAL(dateChanged(const QDate &)));
3019 QSignalSpy tSpy(testWidget, SIGNAL(timeChanged(const QTime &)));
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);
3030 QCOMPARE(dtSpy.count(), 2);
3031 QCOMPARE(dSpy.count(), 2);
3032 QCOMPARE(tSpy.count(), 1);
3034 testWidget->setCurrentSection(QDateTimeEdit::MinuteSection);
3035 testWidget->stepBy(1);
3037 QCOMPARE(dtSpy.count(), 3);
3038 QCOMPARE(dSpy.count(), 2);
3039 QCOMPARE(tSpy.count(), 2);
3042 void tst_QDateTimeEdit::task148725()
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));
3055 void tst_QDateTimeEdit::task148522()
3058 const QDateTime dt(QDate(2000, 12, 12), QTime(12, 13, 14, 15));
3059 edit.setDateTime(dt);
3060 QCOMPARE(edit.dateTime(), dt);
3063 void tst_QDateTimeEdit::ddMMMMyyyy()
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"));
3071 QTest::keyClick(testWidget, Qt::Key_Right, Qt::ControlModifier);
3073 QTest::keyClick(testWidget, Qt::Key_End);
3075 QTest::keyClick(testWidget, Qt::Key_Backspace);
3077 QEXPECT_FAIL("", "QTBUG-23674", Abort);
3079 QCOMPARE(testWidget->lineEdit()->text(), "01." + QDate::longMonthName(1) + ".200");
3082 void tst_QDateTimeEdit::wheelEvent()
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));
3095 void tst_QDateTimeEdit::specialValueCornerCase()
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
3102 edit.setSpecialValueText("foobar");
3103 edit.setMinimumDate(edit.date());
3104 QCOMPARE(edit.minimumDate(), edit.date());
3105 QCOMPARE(edit.text(), QString("foobar"));
3108 void tst_QDateTimeEdit::cursorPositionOnInit()
3111 EditorDateEdit edit;
3112 edit.setDisplayFormat("dd/MM");
3114 QCOMPARE(edit.lineEdit()->cursorPosition(), 0);
3118 EditorDateEdit edit;
3119 edit.setDisplayFormat("dd/MM");
3120 edit.setSpecialValueText("special");
3121 edit.setMinimumDate(edit.date());
3123 QCOMPARE(edit.lineEdit()->cursorPosition(), 7);
3124 // ### legacy behavior. Keep it like this rather than changing
3125 // ### but add a test none-the-less
3129 void tst_QDateTimeEdit::task118867()
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"));
3151 void tst_QDateTimeEdit::nextPrevSection_data()
3153 QTest::addColumn<Qt::Key>("key");
3154 QTest::addColumn<Qt::KeyboardModifiers>("modifiers");
3155 QTest::addColumn<QString>("selectedText");
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");
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");
3173 void tst_QDateTimeEdit::nextPrevSection()
3175 QFETCH(Qt::Key, key);
3176 QFETCH(Qt::KeyboardModifiers, modifiers);
3177 QFETCH(QString, selectedText);
3179 EditorDateEdit edit;
3180 edit.setDisplayFormat("hh/mm/bc9ss");
3181 edit.setTime(QTime(12, 34, 56));
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);
3189 void tst_QDateTimeEdit::dateEditTimeEditFormats()
3192 t.setDisplayFormat("hh yyyy");
3193 QCOMPARE(t.displayedSections(), QDateTimeEdit::HourSection);
3196 d.setDisplayFormat("hh yyyy");
3197 QCOMPARE(d.displayedSections(), QDateTimeEdit::YearSection);
3201 void tst_QDateTimeEdit::timeSpec_data()
3203 QTest::addColumn<bool>("useSetProperty");
3204 QTest::newRow("setProperty") << true;
3205 QTest::newRow("setTimeSpec") << false;
3209 void tst_QDateTimeEdit::timeSpec()
3211 QFETCH(bool, useSetProperty);
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);
3220 edit.setTimeSpec(Qt::UTC);
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);
3228 edit.setTimeSpec(Qt::LocalTime);
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);
3240 edit.setTimeSpec(Qt::UTC);
3242 QVERIFY(edit.minimumTime() != min.time());
3243 QVERIFY(edit.minimumDateTime().timeSpec() != min.timeSpec());
3244 QCOMPARE(edit.minimumDateTime().toTime_t(), min.toTime_t());
3246 QSKIP("Not tested in the GMT timezone");
3250 void tst_QDateTimeEdit::timeSpecBug()
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());
3263 void tst_QDateTimeEdit::cachedDayTest()
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));
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));
3293 void tst_QDateTimeEdit::monthEdgeCase()
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"));
3305 class RestoreLocaler
3314 QLocale::setDefault(old);
3323 void tst_QDateTimeEdit::setLocale()
3326 QLocale::setDefault(QLocale("en_US"));
3328 EditorDateEdit edit;
3329 edit.setDisplayFormat("MMMM d");
3330 edit.setDate(QDate(2000, 1, 1));
3331 QCOMPARE(edit.text(), QString("January 1"));
3333 QLocale::setDefault(QLocale("no_NO"));
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
3341 QLocale::setDefault(QLocale("en_US"));
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"));
3354 void tst_QDateTimeEdit::potentialYYValueBug()
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();
3363 QTest::keyClick(&edit, Qt::Key_Right, Qt::ControlModifier);
3365 QTest::keyClick(&edit, Qt::Key_End);
3367 QTest::keyClick(&edit, Qt::Key_Backspace);
3369 QEXPECT_FAIL("", "QTBUG-23674", Abort);
3371 QCOMPARE(edit.text(), QString("14/09/5"));
3374 void tst_QDateTimeEdit::textSectionAtEnd()
3376 EditorDateEdit edit;
3377 edit.setDisplayFormat("MMMM");
3378 edit.setDate(QDate(2000, 1, 1));
3379 edit.lineEdit()->setFocus();
3381 QTest::keyClick(&edit, Qt::Key_Right, Qt::ControlModifier);
3383 QTest::keyClick(&edit, Qt::Key_End);
3385 QTest::keyClick(&edit, Qt::Key_Backspace);
3387 QEXPECT_FAIL("", "QTBUG-23674", Abort);
3389 QCOMPARE(edit.text(), QString("Januar"));
3392 void tst_QDateTimeEdit::keypadAutoAdvance_data()
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);
3402 void tst_QDateTimeEdit::keypadAutoAdvance()
3404 QFETCH(Qt::KeyboardModifiers, modifiers);
3406 EditorDateEdit edit;
3407 edit.setDate(QDate(2000, 2, 1));
3408 edit.setDisplayFormat("dd/MM");
3410 QTest::keyClick(&edit, Qt::Key_Left, Qt::ControlModifier);
3412 QTest::keyClick(&edit, Qt::Key_Home);
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"));
3422 void tst_QDateTimeEdit::task196924()
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"));
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"));
3446 void tst_QDateTimeEdit::focusNextPrevChild()
3448 EditorDateEdit edit;
3449 edit.setDisplayFormat("dd/MM/yyyy");
3453 edit.setCurrentSection(QDateTimeEdit::DaySection);
3455 QCOMPARE(edit.currentSection(), QDateTimeEdit::DaySection);
3456 edit.focusNextPrevChild(true);
3457 QCOMPARE(edit.currentSection(), QDateTimeEdit::MonthSection);
3460 void tst_QDateTimeEdit::taskQTBUG_12384_timeSpecShowTimeOnly()
3462 QDateTime time = QDateTime::fromString("20100723 04:02:40", "yyyyMMdd hh:mm:ss");
3463 time.setTimeSpec(Qt::UTC);
3465 EditorDateEdit edit;
3466 edit.setDisplayFormat("hh:mm:ss");
3467 edit.setTimeSpec(Qt::UTC);
3468 edit.setDateTime(time);
3470 QCOMPARE(edit.minimumTime(), QTime(0, 0, 0, 0));
3471 QCOMPARE(edit.maximumTime(), QTime(23, 59, 59, 999));
3472 QCOMPARE(edit.time(), time.time());
3475 void tst_QDateTimeEdit::deleteCalendarWidget()
3479 QCalendarWidget *cw = 0;
3481 QVERIFY(!edit.calendarWidget());
3482 edit.setCalendarPopup(true);
3483 QVERIFY(edit.calendarWidget());
3484 edit.calendarWidget()->setObjectName("cw1");;
3487 cw = edit.calendarWidget();
3490 // it should create a new widget
3491 QVERIFY(edit.calendarWidget());
3492 QVERIFY(edit.calendarWidget()->objectName() != "cw1");
3496 #ifdef QT_BUILD_INTERNAL
3498 typedef QPair<Qt::Key, Qt::KeyboardModifier> KeyPair;
3499 typedef QList<KeyPair> KeyPairList;
3501 Q_DECLARE_METATYPE(QLocale)
3502 Q_DECLARE_METATYPE(KeyPair)
3503 Q_DECLARE_METATYPE(KeyPairList)
3505 static inline KeyPair key(Qt::Key key, Qt::KeyboardModifier modifier = Qt::NoModifier) {
3506 return KeyPair(key, modifier);
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.
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
3521 void tst_QDateTimeEdit::dateEditCorrectSectionSize_data()
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");
3529 const QDate defaultDate(2000, 1, 1);
3530 const QLocale defaultLocale(QLocale::English, QLocale::Australia);
3532 KeyPairList thirtyUpKeypresses;
3533 thirtyUpKeypresses.reserve(30);
3534 for (int i = 0; i < 30; ++i) {
3535 thirtyUpKeypresses << key(Qt::Key_Up);
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);
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)
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);
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);
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);
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);
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);
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);
3581 KeyPairList threeDigitDayIssueKeypresses_DayName_DayYearMonth;
3582 threeDigitDayIssueKeypresses_DayName_DayYearMonth << thirtyUpKeypresses << key(Qt::Key_Tab)
3583 << key(Qt::Key_Tab) << key(Qt::Key_2);
3585 KeyPairList threeDigitDayIssueKeypresses_DayName_YearDayMonth;
3586 threeDigitDayIssueKeypresses_DayName_YearDayMonth << key(Qt::Key_Tab) << thirtyUpKeypresses
3587 << key(Qt::Key_Tab) << key(Qt::Key_2);
3589 KeyPairList threeDigitDayIssueKeypresses_DayName_DayMonthYear;
3590 threeDigitDayIssueKeypresses_DayName_DayMonthYear << thirtyUpKeypresses << key(Qt::Key_Tab)
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);
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);
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);
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)
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);
3620 KeyPairList shortAndLongNameIssueKeypresses;
3621 shortAndLongNameIssueKeypresses << key(Qt::Key_Tab) << key(Qt::Key_3) << key(Qt::Key_1) << key(Qt::Key_Up);
3623 QTest::newRow("no fixday, leap, yy/M/dddd") << defaultLocale << defaultDate << QString::fromLatin1("yy/M/dddd")
3624 << threeDigitDayIssueKeypresses_DayName << QString::fromLatin1("00/2/Tuesday");
3626 QTest::newRow("no fixday, leap, yy/M/ddd") << defaultLocale << defaultDate << QString::fromLatin1("yy/M/ddd")
3627 << threeDigitDayIssueKeypresses_DayName << QString::fromLatin1("00/2/Tue");
3629 QTest::newRow("no fixday, leap, yy/MM/dddd") << defaultLocale << defaultDate << QString::fromLatin1("yy/MM/dddd")
3630 << threeDigitDayIssueKeypresses_DayName << QString::fromLatin1("00/02/Tuesday");
3632 QTest::newRow("fixday, leap, yy/MM/dd") << defaultLocale << defaultDate << QString::fromLatin1("yy/MM/dd")
3633 << threeDigitDayIssueKeypresses << QString::fromLatin1("00/02/29");
3635 QTest::newRow("fixday, leap, yy/MM/d") << defaultLocale << defaultDate << QString::fromLatin1("yy/MM/d")
3636 << threeDigitDayIssueKeypresses << QString::fromLatin1("00/02/29");
3638 QTest::newRow("fixday, leap, yyyy/M/d") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/M/d")
3639 << threeDigitDayIssueKeypresses << QString::fromLatin1("2000/2/29");
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");
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");
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");
3650 QTest::newRow("fixday, leap, yyyy/MM/dd") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/MM/dd")
3651 << threeDigitDayIssueKeypresses << QString::fromLatin1("2000/02/29");
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");
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");
3659 QTest::newRow("no fixday, leap, yyyy/M/dddd") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/M/dddd")
3660 << threeDigitDayIssueKeypresses_DayName << QString::fromLatin1("2000/2/Tuesday");
3662 QTest::newRow("no fixday, leap, yyyy/MM/dddd") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/MM/dddd")
3663 << threeDigitDayIssueKeypresses_DayName << QString::fromLatin1("2000/02/Tuesday");
3665 QTest::newRow("fixday, leap, yyyy/dd/MM") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/dd/MM")
3666 << threeDigitDayIssueKeypresses_YearDayMonth << QString::fromLatin1("2000/29/02");
3668 QTest::newRow("fixday, leap, yyyy/dd/M") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/dd/M")
3669 << threeDigitDayIssueKeypresses_YearDayMonth << QString::fromLatin1("2000/29/2");
3671 QTest::newRow("fixday, leap, yyyy/d/M") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/d/M")
3672 << threeDigitDayIssueKeypresses_YearDayMonth << QString::fromLatin1("2000/29/2");
3674 QTest::newRow("fixday, leap, yyyy/MMM/dd") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/MMM/dd")
3675 << threeDigitDayIssueKeypresses_ShortMonthName << QString::fromLatin1("2000/Feb/29");
3677 QTest::newRow("fixday, leap, yyyy/MMM/d") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/MMM/d")
3678 << threeDigitDayIssueKeypresses_ShortMonthName << QString::fromLatin1("2000/Feb/29");
3680 QTest::newRow("fixday, leap, yy/MMM/dd") << defaultLocale << defaultDate << QString::fromLatin1("yy/MMM/dd")
3681 << threeDigitDayIssueKeypresses_ShortMonthName << QString::fromLatin1("00/Feb/29");
3683 QTest::newRow("fixday, leap, yyyy/dddd/M") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/dddd/M")
3684 << threeDigitDayIssueKeypresses_DayName_YearDayMonth << QString::fromLatin1("2000/Tuesday/2");
3686 QTest::newRow("fixday, leap, yyyy/dddd/MM") << defaultLocale << defaultDate << QString::fromLatin1("yyyy/dddd/MM")
3687 << threeDigitDayIssueKeypresses_DayName_YearDayMonth << QString::fromLatin1("2000/Tuesday/02");
3689 QTest::newRow("fixday, leap, d/M/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("d/M/yyyy")
3690 << reverseThreeDigitDayIssueKeypresses << QString::fromLatin1("29/2/2000");
3692 QTest::newRow("fixday, leap, dd/MM/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("dd/MM/yyyy")
3693 << reverseThreeDigitDayIssueKeypresses << QString::fromLatin1("29/02/2000");
3695 QTest::newRow("fixday, dd/MM/yyyy") << defaultLocale << defaultDate.addYears(1) << QString::fromLatin1("dd/MM/yyyy")
3696 << reverseThreeDigitDayIssueKeypresses << QString::fromLatin1("28/02/2001");
3698 QTest::newRow("fixday, leap, dddd/MM/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("dddd/MM/yyyy")
3699 << threeDigitDayIssueKeypresses_DayName_DayMonthYear << QString::fromLatin1("Tuesday/02/2000");
3701 QTest::newRow("fixday, leap, d/yy/M") << defaultLocale << defaultDate << QString::fromLatin1("d/yy/M")
3702 << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/00/2");
3704 QTest::newRow("fixday, leap, d/yyyy/M") << defaultLocale << defaultDate << QString::fromLatin1("d/yyyy/M")
3705 << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/2000/2");
3707 QTest::newRow("fixday, leap, d/yyyy/MM") << defaultLocale << defaultDate << QString::fromLatin1("d/yyyy/MM")
3708 << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/2000/02");
3710 QTest::newRow("fixday, leap, dd/yy/MM") << defaultLocale << defaultDate << QString::fromLatin1("dd/yy/MM")
3711 << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/00/02");
3713 QTest::newRow("fixday, leap, dd/yyyy/M") << defaultLocale << defaultDate << QString::fromLatin1("dd/yyyy/M")
3714 << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/2000/2");
3716 QTest::newRow("fixday, leap, dd/yyyy/MM") << defaultLocale << defaultDate << QString::fromLatin1("dd/yyyy/MM")
3717 << threeDigitDayIssueKeypresses_DayYearMonth << QString::fromLatin1("29/2000/02");
3719 QTest::newRow("fixday, leap, dddd/yy/M") << defaultLocale << defaultDate << QString::fromLatin1("dddd/yy/M")
3720 << threeDigitDayIssueKeypresses_DayName_DayYearMonth << QString::fromLatin1("Tuesday/00/2");
3722 QTest::newRow("fixday, leap, dddd/yy/MM") << defaultLocale << defaultDate << QString::fromLatin1("dddd/yy/MM")
3723 << threeDigitDayIssueKeypresses_DayName_DayYearMonth << QString::fromLatin1("Tuesday/00/02");
3725 QTest::newRow("fixday, leap, M/d/yy") << defaultLocale << defaultDate << QString::fromLatin1("M/d/yy")
3726 << threeDigitDayIssueKeypresses_MonthDayYear << QString::fromLatin1("2/29/00");
3728 QTest::newRow("fixday, leap, M/d/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("M/d/yyyy")
3729 << threeDigitDayIssueKeypresses_MonthDayYear << QString::fromLatin1("2/29/2000");
3731 QTest::newRow("fixday, leap, M/dd/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("M/dd/yyyy")
3732 << threeDigitDayIssueKeypresses_MonthDayYear << QString::fromLatin1("2/29/2000");
3734 QTest::newRow("fixday, leap, M/dddd/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("M/dddd/yyyy")
3735 << threeDigitDayIssueKeypresses_DayName_MonthDayYear << QString::fromLatin1("2/Tuesday/2000");
3737 QTest::newRow("fixday, leap, MM/dd/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("MM/dd/yyyy")
3738 << threeDigitDayIssueKeypresses_MonthDayYear << QString::fromLatin1("02/29/2000");
3740 QTest::newRow("fixday, leap, MM/dddd/yyyy") << defaultLocale << defaultDate << QString::fromLatin1("MM/dddd/yyyy")
3741 << threeDigitDayIssueKeypresses_DayName_MonthDayYear << QString::fromLatin1("02/Tuesday/2000");
3743 QTest::newRow("fixday, leap, M/yyyy/dd") << defaultLocale << defaultDate << QString::fromLatin1("M/yyyy/dd")
3744 << threeDigitDayIssueKeypresses_MonthYearDay << QString::fromLatin1("2/2000/29");
3746 QTest::newRow("fixday, leap, M/yy/dd") << defaultLocale << defaultDate << QString::fromLatin1("M/yy/dd")
3747 << threeDigitDayIssueKeypresses_MonthYearDay << QString::fromLatin1("2/00/29");
3749 QTest::newRow("fixday, leap, M/yy/d") << defaultLocale << defaultDate << QString::fromLatin1("M/yy/d")
3750 << threeDigitDayIssueKeypresses_MonthYearDay << QString::fromLatin1("2/00/29");
3752 QTest::newRow("fixday, leap, MM/yyyy/dd") << defaultLocale << defaultDate << QString::fromLatin1("MM/yyyy/dd")
3753 << threeDigitDayIssueKeypresses_MonthYearDay << QString::fromLatin1("02/2000/29");
3755 QTest::newRow("fixday, leap, MMM/yy/d") << defaultLocale << defaultDate << QString::fromLatin1("MMM/yy/d")
3756 << threeDigitDayIssueKeypresses_ShortMonthName_MonthYearDay << QString::fromLatin1("Feb/00/29");
3758 QTest::newRow("fixday, leap, MMM/yyyy/d") << defaultLocale << defaultDate << QString::fromLatin1("MMM/yyyy/d")
3759 << threeDigitDayIssueKeypresses_ShortMonthName_MonthYearDay << QString::fromLatin1("Feb/2000/29");
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");
3764 QTest::newRow("fixday, leap, MMM/yyyy/dd") << defaultLocale << defaultDate << QString::fromLatin1("MMM/yyyy/dd")
3765 << threeDigitDayIssueKeypresses_ShortMonthName_MonthYearDay << QString::fromLatin1("Feb/2000/29");
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");
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");
3776 void tst_QDateTimeEdit::dateEditCorrectSectionSize()
3778 QFETCH(QLocale, locale);
3779 QFETCH(QDate, defaultDate);
3780 QFETCH(QString, displayFormat);
3781 QFETCH(KeyPairList, keyPresses);
3782 QFETCH(QString, expectedDisplayString);
3785 edit.setLocale(locale);
3786 edit.setDate(defaultDate);
3787 edit.setDisplayFormat(displayFormat);
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));
3795 foreach (const KeyPair &keyPair, keyPresses)
3796 QTest::keyClick(&edit, keyPair.first, keyPair.second);
3798 QDateTimeEditPrivate* edit_d_ptr(static_cast<QDateTimeEditPrivate*>(qt_widget_private(&edit)));
3799 QCOMPARE(edit_d_ptr->text, expectedDisplayString);
3803 QTEST_MAIN(tst_QDateTimeEdit)
3804 #include "tst_qdatetimeedit.moc"