diff options
author | Edward Welbourne <edward.welbourne@qt.io> | 2018-06-13 19:12:15 +0200 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2020-10-09 01:11:20 +0200 |
commit | 92f0f99c23f981a551fde0d0242d414fac4dacbd (patch) | |
tree | 1ee66f4574837a813e83218c96bff93814fdab21 /tests | |
parent | 2a6f2fe9ef9a5d0755443ba94183d97b2fac1a28 (diff) |
Check validity before adding to a QDateTime
QDateTime's addDays(), addMonths() and addYears() neglected to check
for validity before doing their job, with the result that they could
produce "valid" (but wildly inappropriate) results if used on an
invalid date-time. Added tests for this case (and the boundary).
Change-Id: I7b0d638501cb5d875a678cde213547a83ed7529e
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp index 9d80583e72..13176e5afc 100644 --- a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp @@ -83,6 +83,7 @@ private Q_SLOTS: void toString_strformat(); #endif void addDays(); + void addInvalid(); void addMonths(); void addMonths_data(); void addYears(); @@ -1095,10 +1096,51 @@ void tst_QDateTime::addDays() dt1 = QDateTime(QDate(1970, 1, 1), QTime(23, 59, 59)); dt2 = dt1.addDays(-1); QVERIFY(dt2.isValid()); - - // ### test invalid QDateTime() } +void tst_QDateTime::addInvalid() +{ + QDateTime bad; + QVERIFY(!bad.isValid()); + QVERIFY(bad.isNull()); + + QDateTime offset = bad.addDays(2); + QVERIFY(offset.isNull()); + offset = bad.addMonths(-1); + QVERIFY(offset.isNull()); + offset = bad.addYears(23); + QVERIFY(offset.isNull()); + offset = bad.addSecs(73); + QVERIFY(offset.isNull()); + offset = bad.addMSecs(73); + QVERIFY(offset.isNull()); + + QDateTime bound = QDateTime::fromMSecsSinceEpoch(std::numeric_limits<qint64>::min(), Qt::UTC); + QVERIFY(bound.isValid()); + offset = bound.addMSecs(-1); + QVERIFY(!offset.isValid()); + offset = bound.addSecs(-1); + QVERIFY(!offset.isValid()); + offset = bound.addDays(-1); + QVERIFY(!offset.isValid()); + offset = bound.addMonths(-1); + QVERIFY(!offset.isValid()); + offset = bound.addYears(-1); + QVERIFY(!offset.isValid()); + + bound.setMSecsSinceEpoch(std::numeric_limits<qint64>::max()); + QVERIFY(bound.isValid()); + offset = bound.addMSecs(1); + QVERIFY(!offset.isValid()); + offset = bound.addSecs(1); + QVERIFY(!offset.isValid()); + offset = bound.addDays(1); + QVERIFY(!offset.isValid()); + offset = bound.addMonths(1); + QVERIFY(!offset.isValid()); + offset = bound.addYears(1); + QVERIFY(!offset.isValid()); +} void tst_QDateTime::addMonths_data() { |