summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2018-06-13 19:12:15 +0200
committerEdward Welbourne <edward.welbourne@qt.io>2020-10-09 01:11:20 +0200
commit92f0f99c23f981a551fde0d0242d414fac4dacbd (patch)
tree1ee66f4574837a813e83218c96bff93814fdab21 /tests
parent2a6f2fe9ef9a5d0755443ba94183d97b2fac1a28 (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.cpp46
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()
{