diff options
Diffstat (limited to 'tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp')
-rw-r--r-- | tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp | 379 |
1 files changed, 180 insertions, 199 deletions
diff --git a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp index 354a5f182f..2d9689db41 100644 --- a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp +++ b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2021 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <qapplication.h> #include <qgroupbox.h> @@ -47,6 +47,8 @@ #include <private/qdatetimeedit_p.h> +#include <QtWidgets/private/qapplication_p.h> + #ifdef Q_OS_WIN # include <qt_windows.h> #endif @@ -231,10 +233,12 @@ private slots: void nextPrevSection(); void dateEditTimeEditFormats(); +#if QT_DEPRECATED_SINCE(6, 10) void timeSpec_data(); void timeSpec(); - void timeSpecBug(); - void timeSpecInit(); +#endif + void timeZoneBug(); + void timeZoneInit(); void setDateTime_data(); void setDateTime(); @@ -250,7 +254,7 @@ private slots: void task196924(); void focusNextPrevChild(); - void taskQTBUG_12384_timeSpecShowTimeOnly(); + void taskQTBUG_12384_timeZoneShowTimeOnly(); void deleteCalendarWidget(); @@ -404,8 +408,8 @@ void tst_QDateTimeEdit::initTestCase() qWarning("Running under locale %s/%s -- this test may generate failures due to language differences", qPrintable(QLocale::languageToString(system.language())), qPrintable(QLocale::territoryToString(system.territory()))); - testWidget = new EditorDateEdit(0); - testFocusWidget = new QWidget(0); + testWidget = new EditorDateEdit; + testFocusWidget = new QWidget(nullptr); testFocusWidget->resize(200, 100); testFocusWidget->show(); } @@ -434,7 +438,7 @@ void tst_QDateTimeEdit::cleanup() { testWidget->clearMinimumDateTime(); testWidget->clearMaximumDateTime(); - testWidget->setTimeSpec(Qt::LocalTime); + testWidget->setTimeZone(QTimeZone::LocalTime); testWidget->setSpecialValueText(QString()); testWidget->setWrapping(false); // Restore the default. @@ -456,121 +460,104 @@ void tst_QDateTimeEdit::constructor_qwidget() void tst_QDateTimeEdit::constructor_qdatetime_data() { QTest::addColumn<QDateTime>("parameter"); - QTest::addColumn<QDateTime>("displayDateTime"); - QTest::addColumn<QDate>("minimumDate"); - QTest::addColumn<QTime>("minimumTime"); - QTest::addColumn<QDate>("maximumDate"); - QTest::addColumn<QTime>("maximumTime"); - - QTest::newRow("normal") << QDateTime(QDate(2004, 6, 16), QTime(13, 46, 32, 764)) - << QDateTime(QDate(2004, 6, 16), QTime(13, 46, 32, 764)) - << QDate(1752, 9, 14) << QTime(0, 0, 0, 0) - << QDate(9999, 12, 31) << QTime(23, 59, 59, 999); - QTest::newRow("invalid") << QDateTime(QDate(9999, 99, 99), QTime(13, 46, 32, 764)) - << QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0, 0)) - << QDate(1752, 9, 14) << QTime(0, 0, 0, 0) - << QDate(9999, 12, 31) << QTime(23, 59, 59, 999); + QTest::newRow("normal") << QDateTime(QDate(2004, 6, 16), QTime(13, 46, 32, 764)); + QTest::newRow("invalid") << QDateTime(QDate(9999, 99, 99), QTime(13, 46, 32, 764)); } void tst_QDateTimeEdit::constructor_qdatetime() { QFETCH(QDateTime, parameter); - QFETCH(QDateTime, displayDateTime); - QFETCH(QDate, minimumDate); - QFETCH(QTime, minimumTime); - QFETCH(QDate, maximumDate); - QFETCH(QTime, maximumTime); - testWidget->hide(); QDateTimeEdit dte(parameter); dte.show(); - QCOMPARE(dte.dateTime(), displayDateTime); - QCOMPARE(dte.minimumDate(), minimumDate); - QCOMPARE(dte.minimumTime(), minimumTime); - QCOMPARE(dte.maximumDate(), maximumDate); - QCOMPARE(dte.maximumTime(), maximumTime); + if (QByteArrayView(QTest::currentDataTag()) == "invalid") + QCOMPARE(dte.dateTime(), QDateTime(QDate(2000, 1, 1), QTime(0, 0))); + else + QCOMPARE(dte.dateTime(), parameter); + QCOMPARE(dte.minimumDate(), QDate(1752, 9, 14)); + QCOMPARE(dte.minimumTime(), QTime(0, 0)); + QCOMPARE(dte.maximumDate(), QDate(9999, 12, 31)); + QCOMPARE(dte.maximumTime(), QTime(23, 59, 59, 999)); } void tst_QDateTimeEdit::constructor_qdate_data() { QTest::addColumn<QDate>("parameter"); - QTest::addColumn<QDateTime>("displayDateTime"); - QTest::addColumn<QDate>("minimumDate"); - QTest::addColumn<QTime>("minimumTime"); - QTest::addColumn<QDate>("maximumDate"); - QTest::addColumn<QTime>("maximumTime"); - - QTest::newRow("normal") << QDate(2004, 6, 16) - << QDateTime(QDate(2004, 6, 16), QTime(0, 0, 0, 0)) - << QDate(1752, 9, 14) << QTime(0, 0, 0, 0) - << QDate(9999, 12, 31) << QTime(23, 59, 59, 999); - QTest::newRow("invalid") << QDate(9999, 99, 99) - << QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0, 0)) - << QDate(1752, 9, 14) << QTime(0, 0, 0, 0) - << QDate(9999, 12, 31) << QTime(23, 59, 59, 999); + QTest::newRow("normal") << QDate(2004, 6, 16); + QTest::newRow("invalid") << QDate(9999, 99, 99); } void tst_QDateTimeEdit::constructor_qdate() { QFETCH(QDate, parameter); - QFETCH(QDateTime, displayDateTime); - QFETCH(QDate, minimumDate); - QFETCH(QTime, minimumTime); - QFETCH(QDate, maximumDate); - QFETCH(QTime, maximumTime); - testWidget->hide(); - QDateTimeEdit dte(parameter); - dte.show(); - QCOMPARE(dte.dateTime(), displayDateTime); - QCOMPARE(dte.minimumDate(), minimumDate); - QCOMPARE(dte.minimumTime(), minimumTime); - QCOMPARE(dte.maximumDate(), maximumDate); - QCOMPARE(dte.maximumTime(), maximumTime); + { + QDateTimeEdit dte(parameter); + dte.show(); + if (QByteArrayView(QTest::currentDataTag()) == "invalid") + QCOMPARE(dte.dateTime(), QDateTime(QDate(2000, 1, 1), QTime(0, 0))); + else + QCOMPARE(dte.dateTime(), QDateTime(parameter, QTime(0, 0))); + QCOMPARE(dte.minimumDate(), QDate(1752, 9, 14)); + QCOMPARE(dte.minimumTime(), QTime(0, 0)); + QCOMPARE(dte.maximumDate(), QDate(9999, 12, 31)); + QCOMPARE(dte.maximumTime(), QTime(23, 59, 59, 999)); + } + { + QDateEdit dte(parameter); + dte.show(); + if (QByteArrayView(QTest::currentDataTag()) == "invalid") + QCOMPARE(dte.date(), QDate(2000, 1, 1)); + else + QCOMPARE(dte.date(), parameter); + QCOMPARE(dte.minimumDate(), QDate(1752, 9, 14)); + QCOMPARE(dte.minimumTime(), QTime(0, 0)); + QCOMPARE(dte.maximumDate(), QDate(9999, 12, 31)); + QCOMPARE(dte.maximumTime(), QTime(23, 59, 59, 999)); + } } void tst_QDateTimeEdit::constructor_qtime_data() { QTest::addColumn<QTime>("parameter"); - QTest::addColumn<QDateTime>("displayDateTime"); - QTest::addColumn<QDate>("minimumDate"); - QTest::addColumn<QTime>("minimumTime"); - QTest::addColumn<QDate>("maximumDate"); - QTest::addColumn<QTime>("maximumTime"); - - QTest::newRow("normal") << QTime(13, 46, 32, 764) - << QDateTime(QDate(2000, 1, 1), QTime(13, 46, 32, 764)) - << QDate(2000, 1, 1) << QTime(0, 0, 0, 0) - << QDate(2000, 1, 1) << QTime(23, 59, 59, 999); - QTest::newRow("invalid") << QTime(99, 99, 99, 5000) - << QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0, 0)) - << QDate(2000, 1, 1) << QTime(0, 0, 0, 0) - << QDate(2000, 1, 1) << QTime(23, 59, 59, 999); + QTest::newRow("normal") << QTime(13, 46, 32, 764); + QTest::newRow("invalid") << QTime(99, 99, 99, 5000); } void tst_QDateTimeEdit::constructor_qtime() { QFETCH(QTime, parameter); - QFETCH(QDateTime, displayDateTime); - QFETCH(QDate, minimumDate); - QFETCH(QTime, minimumTime); - QFETCH(QDate, maximumDate); - QFETCH(QTime, maximumTime); - testWidget->hide(); - QDateTimeEdit dte(parameter); - dte.show(); - QCOMPARE(dte.dateTime(), displayDateTime); - QCOMPARE(dte.minimumDate(), minimumDate); - QCOMPARE(dte.minimumTime(), minimumTime); - QCOMPARE(dte.maximumDate(), maximumDate); - QCOMPARE(dte.maximumTime(), maximumTime); + { + QDateTimeEdit dte(parameter); + dte.show(); + if (QByteArrayView(QTest::currentDataTag()) == "invalid") + QCOMPARE(dte.dateTime(), QDateTime(QDate(2000, 1, 1), QTime(0, 0))); + else + QCOMPARE(dte.dateTime(), QDateTime(QDate(2000, 1, 1), parameter)); + QCOMPARE(dte.minimumDate(), QDate(2000, 1, 1)); + QCOMPARE(dte.minimumTime(), QTime(0, 0)); + QCOMPARE(dte.maximumDate(), QDate(2000, 1, 1)); + QCOMPARE(dte.maximumTime(), QTime(23, 59, 59, 999)); + } + { + QTimeEdit dte(parameter); + dte.show(); + if (QByteArrayView(QTest::currentDataTag()) == "invalid") + QCOMPARE(dte.time(), QTime(0, 0)); + else + QCOMPARE(dte.time(), parameter); + QCOMPARE(dte.minimumDate(), QDate(2000, 1, 1)); + QCOMPARE(dte.minimumTime(), QTime(0, 0)); + QCOMPARE(dte.maximumDate(), QDate(2000, 1, 1)); + QCOMPARE(dte.maximumTime(), QTime(23, 59, 59, 999)); + } } void tst_QDateTimeEdit::minimumDate_data() @@ -840,7 +827,6 @@ void tst_QDateTimeEdit::selectAndScrollWithKeys() return; #endif - qApp->setActiveWindow(testWidget); testWidget->setDate(QDate(2004, 05, 11)); testWidget->setDisplayFormat("dd/MM/yyyy"); testWidget->show(); @@ -942,7 +928,6 @@ void tst_QDateTimeEdit::selectAndScrollWithKeys() void tst_QDateTimeEdit::backspaceKey() { - qApp->setActiveWindow(testWidget); testWidget->setDate(QDate(2004, 05, 11)); testWidget->setDisplayFormat("d/MM/yyyy"); testWidget->show(); @@ -1008,7 +993,6 @@ void tst_QDateTimeEdit::backspaceKey() void tst_QDateTimeEdit::deleteKey() { - qApp->setActiveWindow(testWidget); testWidget->setDate(QDate(2004, 05, 11)); testWidget->setDisplayFormat("d/MM/yyyy"); #ifdef Q_OS_MAC @@ -1027,7 +1011,6 @@ void tst_QDateTimeEdit::deleteKey() void tst_QDateTimeEdit::tabKeyNavigation() { - qApp->setActiveWindow(testWidget); testWidget->setDate(QDate(2004, 05, 11)); testWidget->setDisplayFormat("dd/MM/yyyy"); testWidget->show(); @@ -1045,7 +1028,6 @@ void tst_QDateTimeEdit::tabKeyNavigation() void tst_QDateTimeEdit::tabKeyNavigationWithPrefix() { - qApp->setActiveWindow(testWidget); testWidget->setDate(QDate(2004, 05, 11)); testWidget->setDisplayFormat("prefix dd/MM/yyyy"); @@ -1063,7 +1045,6 @@ void tst_QDateTimeEdit::tabKeyNavigationWithPrefix() void tst_QDateTimeEdit::tabKeyNavigationWithSuffix() { - qApp->setActiveWindow(testWidget); testWidget->setDate(QDate(2004, 05, 11)); testWidget->setDisplayFormat("dd/MM/yyyy 'suffix'"); @@ -1079,7 +1060,6 @@ void tst_QDateTimeEdit::tabKeyNavigationWithSuffix() void tst_QDateTimeEdit::enterKey() { - qApp->setActiveWindow(testWidget); testWidget->setDate(QDate(2004, 5, 11)); testWidget->setDisplayFormat("prefix d/MM/yyyy 'suffix'"); testWidget->lineEdit()->setFocus(); @@ -1137,7 +1117,7 @@ void tst_QDateTimeEdit::enterKey() // we include this test so a change to the behaviour can't go unnoticed. QSignalSpy enterSpy(testWidget, SIGNAL(dateChanged(QDate))); QTest::keyClick(testWidget, Qt::Key_Enter); - QCOMPARE(enterSpy.count(), 1); + QCOMPARE(enterSpy.size(), 1); QVariantList list = enterSpy.takeFirst(); QCOMPARE(list.at(0).toDate(), QDate(2004, 5, 9)); } @@ -1331,7 +1311,7 @@ void tst_QDateTimeEdit::editingRanged_data() << QDate(2010, 12, 30) << QTime() << QDate(2011, 1, 2) << QTime() << QString::fromLatin1("01012011") - << QDateTime(QDate(2011, 1, 1), QTime(), Qt::UTC); + << QDateTime(QDate(2011, 1, 1), QTime(), QTimeZone::UTC); } void tst_QDateTimeEdit::editingRanged() @@ -1367,7 +1347,6 @@ void tst_QDateTimeEdit::editingRanged() }); edit->show(); - QApplication::setActiveWindow(edit.get()); if (!QTest::qWaitForWindowActive(edit.get())) QSKIP("Failed to make window active, aborting"); edit->setFocus(); @@ -2212,7 +2191,7 @@ void tst_QDateTimeEdit::dateSignalChecking() QSignalSpy timeSpy(testWidget, SIGNAL(timeChanged(QTime))); testWidget->setDate(newDate); - QCOMPARE(dateSpy.count(), timesEmitted); + QCOMPARE(dateSpy.size(), timesEmitted); if (timesEmitted > 0) { QList<QVariant> list = dateSpy.takeFirst(); @@ -2220,8 +2199,8 @@ void tst_QDateTimeEdit::dateSignalChecking() d = qvariant_cast<QDate>(list.at(0)); QCOMPARE(d, newDate); } - QCOMPARE(dateTimeSpy.count(), timesEmitted); - QCOMPARE(timeSpy.count(), 0); + QCOMPARE(dateTimeSpy.size(), timesEmitted); + QCOMPARE(timeSpy.size(), 0); } void tst_QDateTimeEdit::timeSignalChecking_data() @@ -2248,7 +2227,7 @@ void tst_QDateTimeEdit::timeSignalChecking() QSignalSpy timeSpy(testWidget, SIGNAL(timeChanged(QTime))); testWidget->setTime(newTime); - QCOMPARE(timeSpy.count(), timesEmitted); + QCOMPARE(timeSpy.size(), timesEmitted); if (timesEmitted > 0) { QList<QVariant> list = timeSpy.takeFirst(); @@ -2256,8 +2235,8 @@ void tst_QDateTimeEdit::timeSignalChecking() t = qvariant_cast<QTime>(list.at(0)); QCOMPARE(t, newTime); } - QCOMPARE(dateTimeSpy.count(), timesEmitted); - QCOMPARE(dateSpy.count(), 0); + QCOMPARE(dateTimeSpy.size(), timesEmitted); + QCOMPARE(dateSpy.size(), 0); } void tst_QDateTimeEdit::dateTimeSignalChecking_data() @@ -2298,7 +2277,7 @@ void tst_QDateTimeEdit::dateTimeSignalChecking() QSignalSpy dateTimeSpy(testWidget, SIGNAL(dateTimeChanged(QDateTime))); testWidget->setDateTime(newDateTime); - QCOMPARE(dateSpy.count(), timesDateEmitted); + QCOMPARE(dateSpy.size(), timesDateEmitted); if (timesDateEmitted > 0) { QCOMPARE(timesDateEmitted, 1); QList<QVariant> list = dateSpy.takeFirst(); @@ -2306,14 +2285,14 @@ void tst_QDateTimeEdit::dateTimeSignalChecking() d = qvariant_cast<QDate>(list.at(0)); QCOMPARE(d, newDateTime.date()); } - QCOMPARE(timeSpy.count(), timesTimeEmitted); + QCOMPARE(timeSpy.size(), timesTimeEmitted); if (timesTimeEmitted > 0) { QList<QVariant> list = timeSpy.takeFirst(); QTime t; t = qvariant_cast<QTime>(list.at(0)); QCOMPARE(t, newDateTime.time()); } - QCOMPARE(dateTimeSpy.count(), timesDateTimeEmitted); + QCOMPARE(dateTimeSpy.size(), timesDateTimeEmitted); if (timesDateTimeEmitted > 0) { QList<QVariant> list = dateTimeSpy.takeFirst(); QDateTime dt; @@ -3177,22 +3156,22 @@ void tst_QDateTimeEdit::task149097() testWidget->setDisplayFormat("yyyy/MM/dd hh:mm:ss"); testWidget->setDateTime(QDateTime(QDate(2001, 02, 03), QTime(5, 1, 2))); // QTest::keyClick(testWidget, Qt::Key_Enter); - QCOMPARE(dtSpy.count(), 1); - QCOMPARE(dSpy.count(), 1); - QCOMPARE(tSpy.count(), 1); + QCOMPARE(dtSpy.size(), 1); + QCOMPARE(dSpy.size(), 1); + QCOMPARE(tSpy.size(), 1); testWidget->setCurrentSection(QDateTimeEdit::YearSection); testWidget->stepBy(1); - QCOMPARE(dtSpy.count(), 2); - QCOMPARE(dSpy.count(), 2); - QCOMPARE(tSpy.count(), 1); + QCOMPARE(dtSpy.size(), 2); + QCOMPARE(dSpy.size(), 2); + QCOMPARE(tSpy.size(), 1); testWidget->setCurrentSection(QDateTimeEdit::MinuteSection); testWidget->stepBy(1); - QCOMPARE(dtSpy.count(), 3); - QCOMPARE(dSpy.count(), 2); - QCOMPARE(tSpy.count(), 2); + QCOMPARE(dtSpy.size(), 3); + QCOMPARE(dSpy.size(), 2); + QCOMPARE(tSpy.size(), 2); } void tst_QDateTimeEdit::task148725() @@ -3380,7 +3359,7 @@ void tst_QDateTimeEdit::wheelEvent() QFETCH(QDate, startDate); QFETCH(DateList, expectedDates); - EditorDateEdit edit(0); + EditorDateEdit edit; edit.setDate(startDate); edit.setCurrentSection(section); @@ -3506,6 +3485,7 @@ void tst_QDateTimeEdit::dateEditTimeEditFormats() QCOMPARE(d.displayedSections(), QDateTimeEdit::YearSection); } +#if QT_DEPRECATED_SINCE(6, 10) void tst_QDateTimeEdit::timeSpec_data() { QTest::addColumn<bool>("useSetProperty"); @@ -3513,6 +3493,8 @@ void tst_QDateTimeEdit::timeSpec_data() QTest::newRow("setTimeSpec") << false; } +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED void tst_QDateTimeEdit::timeSpec() { QFETCH(bool, useSetProperty); @@ -3538,7 +3520,7 @@ void tst_QDateTimeEdit::timeSpec() QCOMPARE(edit.timeSpec(), Qt::LocalTime); const QDateTime utc = dt.toUTC(); if (dt.time() != utc.time()) { - const QDateTime min(QDate(1999, 1, 1), QTime(1, 0, 0), Qt::LocalTime); + const QDateTime min(QDate(1999, 1, 1), QTime(1, 0)); edit.setMinimumDateTime(min); QCOMPARE(edit.minimumTime(), min.time()); if (useSetProperty) { @@ -3553,10 +3535,12 @@ void tst_QDateTimeEdit::timeSpec() QSKIP("Not tested in the GMT timezone"); } } +QT_WARNING_POP +#endif // test deprecated timeSpec property -void tst_QDateTimeEdit::timeSpecBug() +void tst_QDateTimeEdit::timeZoneBug() { - testWidget->setTimeSpec(Qt::UTC); + testWidget->setTimeZone(QTimeZone::UTC); testWidget->setDisplayFormat("hh:mm"); testWidget->setTime(QTime(2, 2)); const QString oldText = testWidget->text(); @@ -3566,57 +3550,33 @@ void tst_QDateTimeEdit::timeSpecBug() QCOMPARE(oldText, testWidget->text()); } -void tst_QDateTimeEdit::timeSpecInit() +void tst_QDateTimeEdit::timeZoneInit() { - QDateTime utc(QDate(2000, 1, 1), QTime(12, 0, 0), Qt::UTC); + QDateTime utc(QDate(2000, 1, 1), QTime(12, 0), QTimeZone::UTC); QDateTimeEdit widget(utc); QCOMPARE(widget.dateTime(), utc); } void tst_QDateTimeEdit::setDateTime_data() { - QTest::addColumn<Qt::TimeSpec>("spec"); - QDateTime localNoon(QDate(2019, 12, 24), QTime(12, 0), Qt::LocalTime); -#if 0 // Not yet supported - QTest::addColumn<int>("offset"); - QTest::addColumn<QByteArray>("zoneName"); - - QTest::newRow("OffsetFromUTC/LocalTime") - << Qt::OffsetFromUTC << 7200 << "" - << localNoon << localNoon.toOffsetFromUtc(7200); -#if QT_CONFIG(timezone) - QTest::newRow("TimeZone/LocalTime") - << Qt::TimeZone << 0 << "Europe/Berlin" - << localNoon << localNoon.toTimeZone(QTimeZone("Europe/Berlin")); -#endif -#endif // unsupported + const QDateTime localNoon(QDate(2019, 12, 24), QTime(12, 0)); + const QTimeZone UTC(QTimeZone::UTC), local(QTimeZone::LocalTime); + QTest::addColumn<QTimeZone>("zone"); QTest::addColumn<QDateTime>("store"); QTest::addColumn<QDateTime>("expect"); - QTest::newRow("LocalTime/LocalTime") - << Qt::LocalTime // << 0 << "" - << localNoon << localNoon; - QTest::newRow("LocalTime/UTC") - << Qt::LocalTime // << 0 << "" - << localNoon.toUTC() << localNoon; - QTest::newRow("UTC/LocalTime") - << Qt::UTC // << 0 << "" - << localNoon << localNoon.toUTC(); - QTest::newRow("UTC/UTC") - << Qt::UTC // << 0 << "" - << localNoon.toUTC() << localNoon.toUTC(); + QTest::newRow("LocalTime/LocalTime") << local << localNoon << localNoon; + QTest::newRow("LocalTime/UTC") << local << localNoon.toUTC() << localNoon; + QTest::newRow("UTC/LocalTime") << UTC << localNoon << localNoon.toUTC(); + QTest::newRow("UTC/UTC") << UTC << localNoon.toUTC() << localNoon.toUTC(); } void tst_QDateTimeEdit::setDateTime() { - QFETCH(const Qt::TimeSpec, spec); -#if 0 // Not yet supported - QFETCH(const int, offset); - QFETCH(const QByteArray, zoneName); -#endif // configuring the spec, when OffsetFromUTC or TimeZone + QFETCH(const QTimeZone, zone); QFETCH(const QDateTime, store); QFETCH(const QDateTime, expect); QDateTimeEdit editor; - editor.setTimeSpec(spec); + editor.setTimeZone(zone); editor.setDateTime(store); QCOMPARE(editor.dateTime(), expect); } @@ -3810,14 +3770,14 @@ void tst_QDateTimeEdit::focusNextPrevChild() QCOMPARE(edit.currentSection(), QDateTimeEdit::MonthSection); } -void tst_QDateTimeEdit::taskQTBUG_12384_timeSpecShowTimeOnly() +void tst_QDateTimeEdit::taskQTBUG_12384_timeZoneShowTimeOnly() { QDateTime time = QDateTime::fromString("20100723 04:02:40", "yyyyMMdd hh:mm:ss"); - time.setTimeSpec(Qt::UTC); + time.setTimeZone(QTimeZone::UTC); EditorDateEdit edit; edit.setDisplayFormat("hh:mm:ss"); - edit.setTimeSpec(Qt::UTC); + edit.setTimeZone(QTimeZone::UTC); edit.setDateTime(time); QCOMPARE(edit.minimumTime(), QTime(0, 0, 0, 0)); @@ -3833,7 +3793,7 @@ void tst_QDateTimeEdit::deleteCalendarWidget() QVERIFY(!edit.calendarWidget()); edit.setCalendarPopup(true); QVERIFY(edit.calendarWidget()); - edit.calendarWidget()->setObjectName("cw1");; + edit.calendarWidget()->setObjectName("cw1"); // delete delete edit.calendarWidget(); @@ -4459,7 +4419,7 @@ void tst_QDateTimeEdit::stepModifierButtons() testWidget->hide(); - EditorDateEdit edit(0); + EditorDateEdit edit; edit.setTime(startTime); edit.show(); QVERIFY(QTest::qWaitForWindowActive(&edit)); @@ -4545,11 +4505,15 @@ void tst_QDateTimeEdit::stepModifierPressAndHold() QFETCH(Qt::KeyboardModifiers, modifiers); QFETCH(int, expectedStepModifier); - const QDate startDate(2000, 1, 1); + // Some west African zones (e.g. Niamey, Conakry) changed from 1 hour west + // of GMT to GMT at the start of 1960; and spy.size() can get as high as 4, + // causing the expectedDate below, when expectedStepModifier is -10, to land + // in a transition gap for these zones, if we use Jan 1st; so use Jan 2nd. + const QDate startDate(2000, 1, 2); testWidget->hide(); - EditorDateEdit edit(0); + EditorDateEdit edit; edit.setDate(startDate); QScopedPointer<StepModifierStyle, QScopedPointerDeleteLater> stepModifierStyle( @@ -4570,12 +4534,12 @@ void tst_QDateTimeEdit::stepModifierPressAndHold() QStyle::CC_SpinBox, &spinBoxStyleOption, subControl, &edit); QTest::mousePress(&edit, Qt::LeftButton, modifiers, buttonRect.center()); - QTRY_VERIFY(spy.length() >= 3); + QTRY_VERIFY(spy.size() >= 3); QTest::mouseRelease(&edit, Qt::LeftButton, modifiers, buttonRect.center()); const auto value = spy.last().at(0); QVERIFY(value.userType() == QMetaType::QDate); - const QDate expectedDate = startDate.addYears(spy.length() * + const QDate expectedDate = startDate.addYears(spy.size() * expectedStepModifier); QCOMPARE(value.toDate(), expectedDate); } @@ -4599,13 +4563,20 @@ static QDateTime findSpring(int year, const QTimeZone &timeZone) const QTimeZone::OffsetData transition = midSummer.isDaylightTime() ? timeZone.previousTransition(midSummer) : timeZone.nextTransition(midSummer); - const QDateTime spring = transition.atUtc.toLocalTime(); + const QDateTime spring = transition.atUtc.toTimeZone(timeZone); // there might have been DST at some point, but not in the year we care about if (spring.date().year() != year || !spring.isDaylightTime()) return QDateTime(); return spring; }; + +// Number of missing seconds between a day before and a day after when. +// If when is the time of a spring-forward transition, this is the width of its gap. +static int missingSecondsNear(const QDateTime &when) +{ + return 2 * 24 * 60 * 60 - when.addDays(-1).secsTo(when.addDays(1)); +} #endif /*! @@ -4629,36 +4600,40 @@ void tst_QDateTimeEdit::springForward_data() QSKIP("Failed to obtain valid spring forward datetime for 2019!"); const QDate springDate = springTransition.date(); - const int gapWidth = timeZone.daylightTimeOffset(springTransition.addDays(1)); + const int gapWidth = missingSecondsNear(springTransition); + if (gapWidth <= 0) + QSKIP("Spring forward transition did not actually skip any time!"); + const QTime springGap = springTransition.time().addSecs(-gapWidth); - const QByteArray springTime = springGap.toString("hh:mm").toLocal8Bit(); - const QTime springGapMiddle = springTransition.time().addSecs(-gapWidth/2); + const QTime springGapMiddle = springTransition.time().addSecs(-gapWidth / 2); + const QByteArray startGapTime = springGap.toString("hh:mm").toLocal8Bit(); + const QByteArray midGapTime = springGapMiddle.toString("hh:mm").toLocal8Bit(); - QTest::addRow("forward to %s, correct to previous", springTime.data()) + QTest::addRow("forward to %s, correct to previous", startGapTime.data()) << QDateTime(springDate, springGap.addSecs(-gapWidth)) << QAbstractSpinBox::CorrectToPreviousValue << springGap << QDateTime(springDate, springGap.addSecs(-gapWidth)); - QTest::addRow("back to %s, correct to previous", springTime.data()) + QTest::addRow("back to %s, correct to previous", startGapTime.data()) << springTransition << QAbstractSpinBox::CorrectToPreviousValue << springGap << springTransition; - QTest::addRow("forward to %s, correct to nearest", springTime.data()) + QTest::addRow("forward to %s, correct to nearest", midGapTime.data()) << QDateTime(springDate, springGap.addSecs(-gapWidth)) << QAbstractSpinBox::CorrectToNearestValue << springGapMiddle << springTransition; - QTest::addRow("back to %s, correct to nearest", springTime.data()) + QTest::addRow("back to %s, correct to nearest", midGapTime.data()) << springTransition << QAbstractSpinBox::CorrectToNearestValue << springGapMiddle << springTransition; - QTest::addRow("jump to %s, correct to nearest", qPrintable(springGapMiddle.toString("hh:mm"))) + QTest::addRow("jump to %s, correct to nearest", midGapTime.data()) << QDateTime(QDate(1980, 5, 10), springGap) << QAbstractSpinBox::CorrectToNearestValue << springGapMiddle @@ -4686,11 +4661,11 @@ void tst_QDateTimeEdit::springForward() edit.setSelectedSection(QDateTimeEdit::DaySection); const QDate date = expected.date(); - const QString day = QString::number(date.day()).rightJustified(2, QLatin1Char('0')); - const QString month = QString::number(date.month()).rightJustified(2, QLatin1Char('0')); + const QString day = QString::number(date.day()).rightJustified(2, u'0'); + const QString month = QString::number(date.month()).rightJustified(2, u'0'); const QString year = QString::number(date.year()); - const QString hour = QString::number(inputTime.hour()).rightJustified(2, QLatin1Char('0')); - const QString minute = QString::number(inputTime.minute()).rightJustified(2, QLatin1Char('0')); + const QString hour = QString::number(inputTime.hour()).rightJustified(2, u'0'); + const QString minute = QString::number(inputTime.minute()).rightJustified(2, u'0'); QTest::keyClicks(&edit, day); QTest::keyClicks(&edit, month); QTest::keyClicks(&edit, year); @@ -4717,7 +4692,7 @@ void tst_QDateTimeEdit::stepIntoDSTGap_data() QTest::addColumn<int>("steps"); QTest::addColumn<QDateTime>("end"); - const QTimeZone timeZone = QTimeZone("Europe/Oslo"); + const QTimeZone timeZone = QTimeZone::systemTimeZone(); if (!timeZone.hasDaylightTime()) QSKIP("This test needs to run in a timezone that observes DST!"); @@ -4726,11 +4701,14 @@ void tst_QDateTimeEdit::stepIntoDSTGap_data() QSKIP("Failed to obtain valid spring forward datetime for 2007!"); const QDate spring = springTransition.date(); - const int gapWidth = timeZone.daylightTimeOffset(springTransition.addDays(1)); + const int gapWidth = missingSecondsNear(springTransition); + if (gapWidth <= 0) + QSKIP("Spring forward transition did not actually skip any time!"); + const QTime springGap = springTransition.time().addSecs(-gapWidth); const QByteArray springTime = springGap.toString("hh:mm").toLocal8Bit(); - // change hour + // change hour (can't change day): if (springGap.hour() != 0) { QTest::addRow("hour up into %s gap", springTime.data()) << QDateTime(spring, springGap.addSecs(-3600)) @@ -4740,7 +4718,7 @@ void tst_QDateTimeEdit::stepIntoDSTGap_data() // 3:00:10 into 2:00:10 should get us to 1:00:10 QTest::addRow("hour down into %s gap", springTime.data()) - << QDateTime(spring, springGap.addSecs(3610)) + << QDateTime(spring, springGap.addSecs(gapWidth + 10)) << QDateTimeEdit::HourSection << -1 << QDateTime(spring, springGap.addSecs(-3590)); @@ -4765,28 +4743,31 @@ void tst_QDateTimeEdit::stepIntoDSTGap_data() } // change month - QTest::addRow("month up into %s gap", springTime.data()) - << QDateTime(spring.addMonths(-1), springGap) - << QDateTimeEdit::MonthSection - << +1 - << springTransition; - QTest::addRow("month down into %s gap", springTime.data()) - << QDateTime(spring.addMonths(1), springGap) - << QDateTimeEdit::MonthSection - << -1 - << springTransition; + // Previous month may well be February, so lack the day-of-month that + // matches spring (e.g. Asia/Jerusalem, March 30). + if (QDate prior = spring.addMonths(-1); prior.day() == spring.day()) { + QTest::addRow("month up into %s gap", springTime.data()) + << QDateTime(prior, springGap) << QDateTimeEdit::MonthSection << +1 << springTransition; + } + // America/{Jujuy,Cordoba,Catamarca} did a 2007 Dec 30th 00:00 spring + // forward; and QDTE month steps won't change the year. + if (QDate prior = spring.addMonths(1); + prior.year() == spring.year() && prior.day() == spring.day()) { + QTest::addRow("month down into %s gap", springTime.data()) + << QDateTime(prior, springGap) << QDateTimeEdit::MonthSection << -1 << springTransition; + } // change year - QTest::addRow("year up into %s gap", springTime.data()) - << QDateTime(spring.addYears(-1), springGap) - << QDateTimeEdit::YearSection - << +1 - << springTransition; - QTest::addRow("year down into %s gap", springTime.data()) - << QDateTime(spring.addYears(1), springGap) - << QDateTimeEdit::YearSection - << -1 - << springTransition; + // Some zones (e.g. Asia/Baghdad) do transitions on a fixed date; for these, + // the springGap moment is invalid every year, so skip this test. + if (QDateTime prior = QDateTime(spring.addYears(-1), springGap); prior.isValid()) { + QTest::addRow("year up into %s gap", springTime.data()) + << prior << QDateTimeEdit::YearSection << +1 << springTransition; + } + if (QDateTime later(spring.addYears(1), springGap); later.isValid()) { + QTest::addRow("year down into %s gap", springTime.data()) + << later << QDateTimeEdit::YearSection << -1 << springTransition; + } #else QSKIP("Needs timezone feature enabled"); #endif |