Expand testing of QDateTime's isNull() and isValid()

Bring out the asymmetry between date and time more clearly; when date
is valid, an invalid time is ignored in favor of QTime(0, 0). At the
same time, eliminate an un-needed variable from the code that
implements this special handling. (Left over from when the QTime was
passed by const ref, rather than by value.)

Change-Id: I81d8a9026cbb7887a8c638a2761b3db54c088af7
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Edward Welbourne 2022-02-16 11:00:01 +01:00
parent a2236c7675
commit 795c94658d
2 changed files with 29 additions and 9 deletions

View File

@ -3180,9 +3180,8 @@ static void setTimeSpec(QDateTimeData &d, Qt::TimeSpec spec, int offsetSeconds)
static void setDateTime(QDateTimeData &d, QDate date, QTime time)
{
// If the date is valid and the time is not we set time to 00:00:00
QTime useTime = time;
if (!useTime.isValid() && date.isValid())
useTime = QTime::fromMSecsSinceStartOfDay(0);
if (!time.isValid() && date.isValid())
time = QTime::fromMSecsSinceStartOfDay(0);
QDateTimePrivate::StatusFlags newStatus = { };
@ -3195,8 +3194,8 @@ static void setDateTime(QDateTimeData &d, QDate date, QTime time)
// Set time value and status
int ds = 0;
if (useTime.isValid()) {
ds = useTime.msecsSinceStartOfDay();
if (time.isValid()) {
ds = time.msecsSinceStartOfDay();
newStatus |= QDateTimePrivate::ValidTime;
}
Q_ASSERT(ds < MSECS_PER_DAY);

View File

@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2021 The Qt Company Ltd.
** Copyright (C) 2022 The Qt Company Ltd.
** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
@ -341,14 +341,26 @@ void tst_QDateTime::isNull()
dt1.setTime(QTime());
QVERIFY(dt1.isNull());
dt1.setTimeSpec(Qt::UTC);
QVERIFY(dt1.isNull()); // maybe it should return false?
QVERIFY(dt1.isNull());
dt1.setTime(QTime(12, 34, 56));
QVERIFY(!dt1.isNull());
dt1.setTime(QTime()); // Date still invalid, so this really clears time.
QVERIFY(dt1.isNull());
dt1.setDate(QDate(2004, 1, 2));
QVERIFY(!dt1.isNull());
dt1.setTime(QTime(12, 34, 56));
QVERIFY(!dt1.isNull());
dt1.setTime(QTime());
dt1.setTime(QTime()); // Actually sets time to QTime(0, 0), as date is still valid.
QVERIFY(!dt1.isNull());
dt1.setDate(QDate()); // Time remains valid
QVERIFY(!dt1.isNull());
dt1.setTime(QTime()); // Now really sets time invalid, too
QVERIFY(dt1.isNull());
// Either date or time non-null => date-time isn't null:
QVERIFY(!QDateTime(QDate(), QTime(0, 0)).isNull());
QVERIFY(!QDateTime(QDate(2022, 2, 16), QTime()).isNull());
}
void tst_QDateTime::isValid()
@ -364,12 +376,21 @@ void tst_QDateTime::isValid()
dt1.setDate(QDate(2004, 1, 2));
QVERIFY(dt1.isValid());
dt1.setTime(QTime()); // Effectively QTime(0, 0)
QVERIFY(dt1.isValid());
dt1.setDate(QDate());
QVERIFY(!dt1.isValid());
dt1.setTime(QTime(12, 34, 56));
QVERIFY(!dt1.isValid());
dt1.setTime(QTime());
dt1.setTime(QTime()); // Does sets time invalid, as date is invalid
QVERIFY(!dt1.isValid());
dt1.setDate(QDate(2004, 1, 2)); // Kicks time back to QTime(0, 0)
QVERIFY(dt1.isValid());
// Invalid date => invalid date-time:
QVERIFY(!QDateTime(QDate(), QTime(0, 0)).isValid());
// Invalid time gets replaced with QTime(0, 0) when date is valid:
QVERIFY(QDateTime(QDate(2022, 2, 16), QTime()).isValid());
}
void tst_QDateTime::date()