From 5108192f67042656afdb3508f8cc2563167fae97 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Wed, 8 Nov 2023 18:28:35 +0100 Subject: [PATCH] Clean up QDate(Time)?::fromString() test-data tables, adding a column The new column is currently unused, added for the benefit of an imminent change, but adding its value was going to change every data row, making the new rows with a different value there hard to see amid the diff. So add the unused value to the existing data rows and clean them up in the process: * Use modern string literals * Split lines (that need it) in a consistent way * Give test-cases not-entirely-meaningless names. Change-Id: I9abdd24b7bb945796878c664d2ed82ca6c409fc1 Reviewed-by: Isak Fyksen Reviewed-by: Thiago Macieira --- tests/auto/corelib/time/qdate/tst_qdate.cpp | 211 +++++------ .../corelib/time/qdatetime/tst_qdatetime.cpp | 342 +++++++++--------- 2 files changed, 273 insertions(+), 280 deletions(-) diff --git a/tests/auto/corelib/time/qdate/tst_qdate.cpp b/tests/auto/corelib/time/qdate/tst_qdate.cpp index 235c7eec03..ce135fceb9 100644 --- a/tests/auto/corelib/time/qdate/tst_qdate.cpp +++ b/tests/auto/corelib/time/qdate/tst_qdate.cpp @@ -17,6 +17,7 @@ #endif using namespace QtPrivate::DateTimeConstants; +using namespace Qt::StringLiterals; #if defined(Q_OS_WIN) && !QT_CONFIG(icu) # define USING_WIN_TZ @@ -1314,164 +1315,164 @@ void tst_QDate::fromStringFormat_data() { QTest::addColumn("string"); QTest::addColumn("format"); + QTest::addColumn("baseYear"); QTest::addColumn("expected"); - // Get names: - const QString january = QStringLiteral("January"); - const QString february = QStringLiteral("February"); - const QString march = QStringLiteral("March"); - const QString august = QStringLiteral("August"); - const QString mon = QStringLiteral("Mon"); - const QString monday = QStringLiteral("Monday"); - const QString tuesday = QStringLiteral("Tuesday"); - const QString wednesday = QStringLiteral("Wednesday"); - const QString thursday = QStringLiteral("Thursday"); - const QString friday = QStringLiteral("Friday"); - const QString saturday = QStringLiteral("Saturday"); - const QString sunday = QStringLiteral("Sunday"); + QTest::newRow("empty") << u""_s << u""_s << 1900 << defDate(); + QTest::newRow("space-as-empty") << u" "_s << u""_s << 1900 << invalidDate(); + QTest::newRow("space") << u" "_s << u" "_s << 1900 << defDate(); + QTest::newRow("mispunc") << u"-%$%#"_s << u"$*(#@"_s << 1900 << invalidDate(); + QTest::newRow("literal-d") << u"d"_s << u"'d'"_s << 1900 << defDate(); + QTest::newRow("greedy") << u"101010"_s << u"dMyy"_s << 1900 << QDate(1910, 10, 10); + QTest::newRow("greedy-miss") << u"101010b"_s << u"dMyy"_s << 1900 << invalidDate(); + QTest::newRow("January") << u"January"_s << u"MMMM"_s << 1900 << defDate(); + QTest::newRow("mistext") << u"ball"_s << u"balle"_s << 1900 << invalidDate(); + QTest::newRow("text") << u"balleh"_s << u"balleh"_s << 1900 << defDate(); + QTest::newRow("yearless:19") << u"10.01.1"_s << u"M.dd.d"_s << 1900 << QDate(1900, 10, 1); + QTest::newRow("neg-month") << u"-1.01.1"_s << u"M.dd.d"_s << 1900 << invalidDate(); + QTest::newRow("greedy-break") << u"11010"_s << u"dMMyy"_s << 1900 << invalidDate(); + QTest::newRow("neg-day") << u"-2"_s << u"d"_s << 1900 << invalidDate(); + QTest::newRow("Md:132") << u"132"_s << u"Md"_s << 1900 << invalidDate(); + QTest::newRow("February") << u"February"_s << u"MMMM"_s << 1900 << QDate(1900, 2, 1); - QTest::newRow("data0") << QString("") << QString("") << defDate(); - QTest::newRow("data1") << QString(" ") << QString("") << invalidDate(); - QTest::newRow("data2") << QString(" ") << QString(" ") << defDate(); - QTest::newRow("data3") << QString("-%$%#") << QString("$*(#@") << invalidDate(); - QTest::newRow("data4") << QString("d") << QString("'d'") << defDate(); - QTest::newRow("data5") << QString("101010") << QString("dMyy") << QDate(1910, 10, 10); - QTest::newRow("data6") << QString("101010b") << QString("dMyy") << invalidDate(); - QTest::newRow("data7") << january << QString("MMMM") << defDate(); - QTest::newRow("data8") << QString("ball") << QString("balle") << invalidDate(); - QTest::newRow("data9") << QString("balleh") << QString("balleh") << defDate(); - QTest::newRow("data10") << QString("10.01.1") << QString("M.dd.d") << QDate(defDate().year(), 10, 1); - QTest::newRow("data11") << QString("-1.01.1") << QString("M.dd.d") << invalidDate(); - QTest::newRow("data12") << QString("11010") << QString("dMMyy") << invalidDate(); - QTest::newRow("data13") << QString("-2") << QString("d") << invalidDate(); - QTest::newRow("data14") << QString("132") << QString("Md") << invalidDate(); - QTest::newRow("data15") << february << QString("MMMM") << QDate(defDate().year(), 2, 1); + QTest::newRow("mon-aug-8th") + << u"Mon August 8 2005"_s << u"ddd MMMM d yyyy"_s << 1900 << QDate(2005, 8, 8); + QTest::newRow("year-match-20000") << u"2000:00"_s << u"yyyy:yy"_s << 1900 << QDate(2000, 1, 1); + QTest::newRow("year-match-1999") << u"1999:99"_s << u"yyyy:yy"_s << 1900 << QDate(1999, 1, 1); + QTest::newRow("year-match-2099") << u"2099:99"_s << u"yyyy:yy"_s << 1900 << QDate(2099, 1, 1); + QTest::newRow("year-match-2001") << u"2001:01"_s << u"yyyy:yy"_s << 1900 << QDate(2001, 1, 1); + QTest::newRow("year-match-1999") << u"99"_s << u"yy"_s << 1900 << QDate(1999, 1, 1); + QTest::newRow("just-yy-1901") << u"01"_s << u"yy"_s << 1900 << QDate(1901, 1, 1); - QString date = mon + QLatin1Char(' ') + august + " 8 2005"; - QTest::newRow("data16") << date << QString("ddd MMMM d yyyy") << QDate(2005, 8, 8); - QTest::newRow("data17") << QString("2000:00") << QString("yyyy:yy") << QDate(2000, 1, 1); - QTest::newRow("data18") << QString("1999:99") << QString("yyyy:yy") << QDate(1999, 1, 1); - QTest::newRow("data19") << QString("2099:99") << QString("yyyy:yy") << QDate(2099, 1, 1); - QTest::newRow("data20") << QString("2001:01") << QString("yyyy:yy") << QDate(2001, 1, 1); - QTest::newRow("data21") << QString("99") << QString("yy") << QDate(1999, 1, 1); - QTest::newRow("data22") << QString("01") << QString("yy") << QDate(1901, 1, 1); + QTest::newRow("Monday") << u"Monday"_s << u"dddd"_s << 1900 << QDate(1900, 1, 1); + QTest::newRow("Tuesday") << u"Tuesday"_s << u"dddd"_s << 1900 << QDate(1900, 1, 2); + QTest::newRow("Wednesday") << u"Wednesday"_s << u"dddd"_s << 1900 << QDate(1900, 1, 3); + QTest::newRow("Thursday") << u"Thursday"_s << u"dddd"_s << 1900 << QDate(1900, 1, 4); + QTest::newRow("Friday") << u"Friday"_s << u"dddd"_s << 1900 << QDate(1900, 1, 5); + QTest::newRow("Saturday") << u"Saturday"_s << u"dddd"_s << 1900 << QDate(1900, 1, 6); + QTest::newRow("Sunday") << u"Sunday"_s << u"dddd"_s << 1900 << QDate(1900, 1, 7); - QTest::newRow("data23") << monday << QString("dddd") << QDate(1900, 1, 1); - QTest::newRow("data24") << tuesday << QString("dddd") << QDate(1900, 1, 2); - QTest::newRow("data25") << wednesday << QString("dddd") << QDate(1900, 1, 3); - QTest::newRow("data26") << thursday << QString("dddd") << QDate(1900, 1, 4); - QTest::newRow("data27") << friday << QString("dddd") << QDate(1900, 1, 5); - QTest::newRow("data28") << saturday << QString("dddd") << QDate(1900, 1, 6); - QTest::newRow("data29") << sunday << QString("dddd") << QDate(1900, 1, 7); + QTest::newRow("Mon06") << u"Monday 2006"_s << u"dddd yyyy"_s << 1900 << QDate(2006, 1, 2); + QTest::newRow("Tues06") << u"Tuesday 2006"_s << u"dddd yyyy"_s << 1900 << QDate(2006, 1, 3); + QTest::newRow("Wed06") << u"Wednesday 2006"_s << u"dddd yyyy"_s << 1900 << QDate(2006, 1, 4); + QTest::newRow("Thu06") << u"Thursday 2006"_s << u"dddd yyyy"_s << 1900 << QDate(2006, 1, 5); + QTest::newRow("Fri06") << u"Friday 2006"_s << u"dddd yyyy"_s << 1900 << QDate(2006, 1, 6); + QTest::newRow("Sat06") << u"Saturday 2006"_s << u"dddd yyyy"_s << 1900 << QDate(2006, 1, 7); + QTest::newRow("Sun06") << u"Sunday 2006"_s << u"dddd yyyy"_s << 1900 << QDate(2006, 1, 1); + QTest::newRow("Tue07Mar") + << u"Tuesday 2007 March"_s << u"dddd yyyy MMMM"_s << 1900 << QDate(2007, 3, 6); - QTest::newRow("data30") << monday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 2); - QTest::newRow("data31") << tuesday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 3); - QTest::newRow("data32") << wednesday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 4); - QTest::newRow("data33") << thursday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 5); - QTest::newRow("data34") << friday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 6); - QTest::newRow("data35") << saturday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 7); - QTest::newRow("data36") << sunday + " 2006" << QString("dddd yyyy") << QDate(2006, 1, 1); + QTest::newRow("21May2006") + << u"21052006"_s << u"ddMMyyyy"_s << 1900 << QDate(2006, 5, 21); + QTest::newRow("21May06:19") + << u"210506"_s << u"ddMMyy"_s << 1900 << QDate(1906, 5, 21); + QTest::newRow("21/May/2006") + << u"21/5/2006"_s << u"d/M/yyyy"_s << 1900 << QDate(2006, 5, 21); + QTest::newRow("21/5/06") + << u"21/5/06"_s << u"d/M/yy"_s << 1900 << QDate(1906, 5, 21); + QTest::newRow("21/5/06:19") + << u"21/5/06"_s << u"d/M/yy"_s << 1900 << QDate(1906, 5, 21); + QTest::newRow("2006May21") + << u"20060521"_s << u"yyyyMMdd"_s << 1900 << QDate(2006, 5, 21); + QTest::newRow("06May21:19") + << u"060521"_s << u"yyMMdd"_s << 1900 << QDate(1906, 5, 21); + QTest::newRow("lateMarch") + << u"9999-03-06"_s << u"yyyy-MM-dd"_s << 1900 << QDate(9999, 3, 6); + QTest::newRow("late") + << u"9999-12-31"_s << u"yyyy-MM-dd"_s << 1900 << QDate(9999, 12, 31); - QTest::newRow("data37") << tuesday + " 2007 " + march << QString("dddd yyyy MMMM") << QDate(2007, 3, 6); - - QTest::newRow("data38") << QString("21052006") << QString("ddMMyyyy") << QDate(2006,5,21); - QTest::newRow("data39") << QString("210506") << QString("ddMMyy") << QDate(1906,5,21); - QTest::newRow("data40") << QString("21/5/2006") << QString("d/M/yyyy") << QDate(2006,5,21); - QTest::newRow("data41") << QString("21/5/06") << QString("d/M/yy") << QDate(1906,5,21); - QTest::newRow("data42") << QString("20060521") << QString("yyyyMMdd") << QDate(2006,5,21); - QTest::newRow("data43") << QString("060521") << QString("yyMMdd") << QDate(1906,5,21); - QTest::newRow("lateMarch") << QString("9999-03-06") << QString("yyyy-MM-dd") << QDate(9999, 3, 6); - QTest::newRow("late") << QString("9999-12-31") << QString("yyyy-MM-dd") << QDate(9999, 12, 31); - - QTest::newRow("quoted-dd") << QString("21dd-05-2006") << QString("dd'dd'-MM-yyyy") - << QDate(2006, 5, 21); - QTest::newRow("quoted-MM") << QString("21-MM05-2006") << QString("dd-'MM'MM-yyyy") - << QDate(2006, 5, 21); - QTest::newRow("quotes-empty") << QString("21-'05-2006") << QString("dd-MM-''yy") - << QDate(2006, 5, 21); + QTest::newRow("quoted-dd") + << u"21dd-05-2006"_s << u"dd'dd'-MM-yyyy"_s << 1900 << QDate(2006, 5, 21); + QTest::newRow("quoted-MM") + << u"21-MM05-2006"_s << u"dd-'MM'MM-yyyy"_s << 1900 << QDate(2006, 5, 21); + QTest::newRow("quotes-empty") + << u"21-'05-2006"_s << u"dd-MM-''yy"_s << 1900 << QDate(2006, 5, 21); // Test unicode handling. QTest::newRow("Unicode in format string") - << QString(u8"2020🤣09🤣21") << QString(u8"yyyy🤣MM🤣dd") << QDate(2020, 9, 21); + << QString(u8"2020🤣09🤣21") << QString(u8"yyyy🤣MM🤣dd") << 1900 << QDate(2020, 9, 21); QTest::newRow("Unicode-in-format-string-quoted-emoji") - << QString(u8"🤣🤣2020👍09🤣21") << QString(u8"'🤣🤣'yyyy👍MM🤣dd") << QDate(2020, 9, 21); + << QString(u8"🤣🤣2020👍09🤣21") << QString(u8"'🤣🤣'yyyy👍MM🤣dd") << 1900 + << QDate(2020, 9, 21); QTest::newRow("Unicode-in-quoted-dd-format-string") - << QString(u8"🤣🤣2020👍09🤣21dd") << QString(u8"🤣🤣yyyy👍MM🤣dd'dd'") << QDate(2020, 9, 21); + << QString(u8"🤣🤣2020👍09🤣21dd") << QString(u8"🤣🤣yyyy👍MM🤣dd'dd'") << 1900 + << QDate(2020, 9, 21); QTest::newRow("Unicode-in-all-formats-quoted-string") << QString(u8"🤣🤣yyyy2020👍MM09🤣21dd") << QString(u8"🤣🤣'yyyy'yyyy👍'MM'MM🤣dd'dd'") - << QDate(2020, 9, 21); + << 1900 << QDate(2020, 9, 21); // QTBUG-84334 QTest::newRow("-ve year: front, nosep") - << QString("-20060521") << QString("yyyyMMdd") << QDate(-2006, 5, 21); + << u"-20060521"_s << u"yyyyMMdd"_s << 1900 << QDate(-2006, 5, 21); QTest::newRow("-ve year: mid, nosep") - << QString("05-200621") << QString("MMyyyydd") << QDate(-2006, 5, 21); + << u"05-200621"_s << u"MMyyyydd"_s << 1900 << QDate(-2006, 5, 21); QTest::newRow("-ve year: back, nosep") - << QString("0521-2006") << QString("MMddyyyy") << QDate(-2006, 5, 21); + << u"0521-2006"_s << u"MMddyyyy"_s << 1900 << QDate(-2006, 5, 21); // - as separator should not interfere with negative year numbers: QTest::newRow("-ve year: front, dash") - << QString("-2006-05-21") << QString("yyyy-MM-dd") << QDate(-2006, 5, 21); + << u"-2006-05-21"_s << u"yyyy-MM-dd"_s << 1900 << QDate(-2006, 5, 21); QTest::newRow("positive year: front, dash") - << QString("-2006-05-21") << QString("-yyyy-MM-dd") << QDate(2006, 5, 21); + << u"-2006-05-21"_s << u"-yyyy-MM-dd"_s << 1900 << QDate(2006, 5, 21); QTest::newRow("-ve year: mid, dash") - << QString("05--2006-21") << QString("MM-yyyy-dd") << QDate(-2006, 5, 21); + << u"05--2006-21"_s << u"MM-yyyy-dd"_s << 1900 << QDate(-2006, 5, 21); QTest::newRow("-ve year: back, dash") - << QString("05-21--2006") << QString("MM-dd-yyyy") << QDate(-2006, 5, 21); + << u"05-21--2006"_s << u"MM-dd-yyyy"_s << 1900 << QDate(-2006, 5, 21); // negative three digit year numbers should be rejected: QTest::newRow("-ve 3digit year: front") - << QString("-206-05-21") << QString("yyyy-MM-dd") << QDate(); + << u"-206-05-21"_s << u"yyyy-MM-dd"_s << 1900 << QDate(); QTest::newRow("-ve 3digit year: mid") - << QString("05--206-21") << QString("MM-yyyy-dd") << QDate(); + << u"05--206-21"_s << u"MM-yyyy-dd"_s << 1900 << QDate(); QTest::newRow("-ve 3digit year: back") - << QString("05-21--206") << QString("MM-dd-yyyy") << QDate(); + << u"05-21--206"_s << u"MM-dd-yyyy"_s << 1900 << QDate(); // negative month numbers should be rejected: QTest::newRow("-ve 2digit month: mid") - << QString("2060--05-21") << QString("yyyy-MM-dd") << QDate(); + << u"2060--05-21"_s << u"yyyy-MM-dd"_s << 1900 << QDate(); QTest::newRow("-ve 2digit month: front") - << QString("-05-2060-21") << QString("MM-yyyy-dd") << QDate(); + << u"-05-2060-21"_s << u"MM-yyyy-dd"_s << 1900 << QDate(); QTest::newRow("-ve 2digit month: back") - << QString("21-2060--05") << QString("dd-yyyy-MM") << QDate(); + << u"21-2060--05"_s << u"dd-yyyy-MM"_s << 1900 << QDate(); // negative single digit month numbers should be rejected: QTest::newRow("-ve 1digit month: mid") - << QString("2060--5-21") << QString("yyyy-MM-dd") << QDate(); + << u"2060--5-21"_s << u"yyyy-MM-dd"_s << 1900 << QDate(); QTest::newRow("-ve 1digit month: front") - << QString("-5-2060-21") << QString("MM-yyyy-dd") << QDate(); + << u"-5-2060-21"_s << u"MM-yyyy-dd"_s << 1900 << QDate(); QTest::newRow("-ve 1digit month: back") - << QString("21-2060--5") << QString("dd-yyyy-MM") << QDate(); + << u"21-2060--5"_s << u"dd-yyyy-MM"_s << 1900 << QDate(); // negative day numbers should be rejected: QTest::newRow("-ve 2digit day: front") - << QString("-21-2060-05") << QString("dd-yyyy-MM") << QDate(); + << u"-21-2060-05"_s << u"dd-yyyy-MM"_s << 1900 << QDate(); QTest::newRow("-ve 2digit day: mid") - << QString("2060--21-05") << QString("yyyy-dd-MM") << QDate(); + << u"2060--21-05"_s << u"yyyy-dd-MM"_s << 1900 << QDate(); QTest::newRow("-ve 2digit day: back") - << QString("05-2060--21") << QString("MM-yyyy-dd") << QDate(); + << u"05-2060--21"_s << u"MM-yyyy-dd"_s << 1900 << QDate(); // negative single digit day numbers should be rejected: QTest::newRow("-ve 1digit day: front") - << QString("-2-2060-05") << QString("dd-yyyy-MM") << QDate(); + << u"-2-2060-05"_s << u"dd-yyyy-MM"_s << 1900 << QDate(); QTest::newRow("-ve 1digit day: mid") - << QString("05--2-2060") << QString("MM-dd-yyyy") << QDate(); + << u"05--2-2060"_s << u"MM-dd-yyyy"_s << 1900 << QDate(); QTest::newRow("-ve 1digit day: back") - << QString("2060-05--2") << QString("yyyy-MM-dd") << QDate(); + << u"2060-05--2"_s << u"yyyy-MM-dd"_s << 1900 << QDate(); // positive three digit year numbers should be rejected: - QTest::newRow("3digit year, front") << QString("206-05-21") << QString("yyyy-MM-dd") << QDate(); - QTest::newRow("3digit year, mid") << QString("05-206-21") << QString("MM-yyyy-dd") << QDate(); - QTest::newRow("3digit year, back") << QString("05-21-206") << QString("MM-dd-yyyy") << QDate(); + QTest::newRow("3digit year, front") << u"206-05-21"_s << u"yyyy-MM-dd"_s << 1900 << QDate(); + QTest::newRow("3digit year, mid") << u"05-206-21"_s << u"MM-yyyy-dd"_s << 1900 << QDate(); + QTest::newRow("3digit year, back") << u"05-21-206"_s << u"MM-dd-yyyy"_s << 1900 << QDate(); // positive five digit year numbers should be rejected: QTest::newRow("5digit year, front") - << QString("00206-05-21") << QString("yyyy-MM-dd") << QDate(); - QTest::newRow("5digit year, mid") << QString("05-00206-21") << QString("MM-yyyy-dd") << QDate(); + << u"00206-05-21"_s << u"yyyy-MM-dd"_s << 1900 << QDate(); + QTest::newRow("5digit year, mid") + << u"05-00206-21"_s << u"MM-yyyy-dd"_s << 1900 << QDate(); QTest::newRow("5digit year, back") - << QString("05-21-00206") << QString("MM-dd-yyyy") << QDate(); + << u"05-21-00206"_s << u"MM-dd-yyyy"_s << 1900 << QDate(); QTest::newRow("dash separator, no year at end") - << QString("05-21-") << QString("dd-MM-yyyy") << QDate(); + << u"05-21-"_s << u"dd-MM-yyyy"_s << 1900 << QDate(); QTest::newRow("slash separator, no year at end") - << QString("11/05/") << QString("d/MM/yyyy") << QDate(); + << u"11/05/"_s << u"d/MM/yyyy"_s << 1900 << QDate(); // QTBUG-84349 - QTest::newRow("+ sign in year field") << QString("+0200322") << QString("yyyyMMdd") << QDate(); - QTest::newRow("+ sign in month field") << QString("2020+322") << QString("yyyyMMdd") << QDate(); - QTest::newRow("+ sign in day field") << QString("202003+1") << QString("yyyyMMdd") << QDate(); + QTest::newRow("+ sign in year field") << u"+0200322"_s << u"yyyyMMdd"_s << 1900 << QDate(); + QTest::newRow("+ sign in month field") << u"2020+322"_s << u"yyyyMMdd"_s << 1900 << QDate(); + QTest::newRow("+ sign in day field") << u"202003+1"_s << u"yyyyMMdd"_s << 1900 << QDate(); } diff --git a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp index 5a6efc116e..c9348a2725 100644 --- a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp @@ -3100,247 +3100,242 @@ void tst_QDateTime::fromStringStringFormat_data() { QTest::addColumn("string"); QTest::addColumn("format"); + QTest::addColumn("baseYear"); QTest::addColumn("expected"); - const QDate defDate(1900, 1, 1); // Indian/Cocos had a transition at the start of 1900, so its Jan 1st starts // at 00:02:20 on that day; this leads to perverse results. QTBUG-77948. - if (defDate.startOfDay().time() == QTime(0, 0)) { + if (const QDate defDate(1900, 1, 1); defDate.startOfDay().time() == QTime(0, 0)) { QTest::newRow("dMyy-only") - << QString("101010") << QString("dMyy") << QDate(1910, 10, 10).startOfDay(); + << u"101010"_s << u"dMyy"_s << 1900 << QDate(1910, 10, 10).startOfDay(); QTest::newRow("secs-repeat-valid") - << QString("1010") << QString("sss") << QDateTime(defDate, QTime(0, 0, 10)); + << u"1010"_s << u"sss"_s << 1900 << QDateTime(defDate, QTime(0, 0, 10)); QTest::newRow("pm-only") - << QString("pm") << QString("ap") << QDateTime(defDate, QTime(12, 0)); + << u"pm"_s << u"ap"_s << 1900 << QDateTime(defDate, QTime(12, 0)); QTest::newRow("date-only") - << QString("10 Oct 10") << QString("dd MMM yy") << QDate(1910, 10, 10).startOfDay(); + << u"10 Oct 10"_s << u"dd MMM yy"_s << 1900 << QDate(1910, 10, 10).startOfDay(); QTest::newRow("dow-date-only") - << QString("Fri December 3 2004") << QString("ddd MMMM d yyyy") - << QDate(2004, 12, 3).startOfDay(); + << u"Fri December 3 2004"_s << u"ddd MMMM d yyyy"_s << 1900 + << QDate(2004, 12, 3).startOfDay(); QTest::newRow("dow-mon-yr-only") - << QString("Thu January 2004") << QString("ddd MMMM yyyy") - << QDate(2004, 1, 1).startOfDay(); + << u"Thu January 2004"_s << u"ddd MMMM yyyy"_s << 1900 + << QDate(2004, 1, 1).startOfDay(); } - QTest::newRow("data1") << QString("1020") << QString("sss") << QDateTime(); - QTest::newRow("data3") << QString("10hello20") << QString("ss'hello'ss") << QDateTime(); - QTest::newRow("data4") << QString("10") << QString("''") << QDateTime(); - QTest::newRow("data5") << QString("10") << QString("'") << QDateTime(); - QTest::newRow("data7") << QString("foo") << QString("ap") << QDateTime(); + QTest::newRow("secs-conflict") << u"1020"_s << u"sss"_s << 1900 << QDateTime(); + QTest::newRow("secs-split-conflict") + << u"10hello20"_s << u"ss'hello'ss"_s << 1900 << QDateTime(); + QTest::newRow("nomatch-quote-twice") << u"10"_s << u"''"_s << 1900 << QDateTime(); + QTest::newRow("momatch-quote") << u"10"_s << u"'"_s << 1900 << QDateTime(); + QTest::newRow("nomatch-am-pm") << u"foo"_s << u"ap"_s << 1900 << QDateTime(); // Day non-conflict should not hide earlier year conflict (1963-03-01 was a // Friday; asking for Thursday moves this, without conflict, to the 7th): - QTest::newRow("data8") - << QString("77 03 1963 Thu") << QString("yy MM yyyy ddd") << QDateTime(); - QTest::newRow("data13") << QString("30.02.2004") << QString("dd.MM.yyyy") << QDateTime(); - QTest::newRow("data14") << QString("32.01.2004") << QString("dd.MM.yyyy") << QDateTime(); + QTest::newRow("year-conflict") + << u"77 03 1963 Thu"_s << u"yy MM yyyy ddd"_s << 1900 << QDateTime(); + QTest::newRow("Feb-overflow") << u"30.02.2004"_s << u"dd.MM.yyyy"_s << 1900 << QDateTime(); + QTest::newRow("Jan-overflow") << u"32.01.2004"_s << u"dd.MM.yyyy"_s << 1900 << QDateTime(); QTest::newRow("zulu-time-with-z-centisec") - << QString("2005-06-28T07:57:30.01Z") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(QDate(2005, 06, 28), QTime(07, 57, 30, 10), UTC); + << u"2005-06-28T07:57:30.01Z"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(QDate(2005, 06, 28), QTime(07, 57, 30, 10), UTC); QTest::newRow("zulu-time-with-zz-decisec") - << QString("2005-06-28T07:57:30.1Z") << QString("yyyy-MM-ddThh:mm:ss.zzt") - << QDateTime(QDate(2005, 06, 28), QTime(07, 57, 30, 100), UTC); + << u"2005-06-28T07:57:30.1Z"_s << u"yyyy-MM-ddThh:mm:ss.zzt"_s << 1900 + << QDateTime(QDate(2005, 06, 28), QTime(07, 57, 30, 100), UTC); QTest::newRow("zulu-time-with-zzz-centisec") - << QString("2005-06-28T07:57:30.01Z") << QString("yyyy-MM-ddThh:mm:ss.zzzt") - << QDateTime(); // Invalid because too few digits for zzz + << u"2005-06-28T07:57:30.01Z"_s << u"yyyy-MM-ddThh:mm:ss.zzzt"_s << 1900 + << QDateTime(); // Invalid because too few digits for zzz QTest::newRow("zulu-time-with-z-millisec") - << QString("2005-06-28T07:57:30.001Z") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(QDate(2005, 06, 28), QTime(07, 57, 30, 1), UTC); + << u"2005-06-28T07:57:30.001Z"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(QDate(2005, 06, 28), QTime(07, 57, 30, 1), UTC); QTest::newRow("utc-time-spec-as:UTC+0") - << QString("2005-06-28T07:57:30.001UTC+0") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(QDate(2005, 6, 28), QTime(7, 57, 30, 1), UTC); + << u"2005-06-28T07:57:30.001UTC+0"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(QDate(2005, 6, 28), QTime(7, 57, 30, 1), UTC); QTest::newRow("utc-time-spec-as:UTC-0") - << QString("2005-06-28T07:57:30.001UTC-0") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(QDate(2005, 6, 28), QTime(7, 57, 30, 1), UTC); + << u"2005-06-28T07:57:30.001UTC-0"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(QDate(2005, 6, 28), QTime(7, 57, 30, 1), UTC); QTest::newRow("offset-from-utc:UTC+1") - << QString("2001-09-13T07:33:01.001 UTC+1") << QString("yyyy-MM-ddThh:mm:ss.z t") - << QDateTime(QDate(2001, 9, 13), QTime(7, 33, 1, 1), - QTimeZone::fromSecondsAheadOfUtc(3600)); + << u"2001-09-13T07:33:01.001 UTC+1"_s << u"yyyy-MM-ddThh:mm:ss.z t"_s << 1900 + << QDateTime(QDate(2001, 9, 13), QTime(7, 33, 1, 1), + QTimeZone::fromSecondsAheadOfUtc(3600)); QTest::newRow("offset-from-utc:UTC-11:01") - << QString("2008-09-13T07:33:01.001 UTC-11:01") << QString("yyyy-MM-ddThh:mm:ss.z t") - << QDateTime(QDate(2008, 9, 13), QTime(7, 33, 1, 1), - QTimeZone::fromSecondsAheadOfUtc(-39660)); + << u"2008-09-13T07:33:01.001 UTC-11:01"_s << u"yyyy-MM-ddThh:mm:ss.z t"_s << 1900 + << QDateTime(QDate(2008, 9, 13), QTime(7, 33, 1, 1), + QTimeZone::fromSecondsAheadOfUtc(-39660)); QTest::newRow("offset-from-utc:UTC+02:57") - << QString("2001-09-15T09:33:01.001UTC+02:57") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(QDate(2001, 9, 15), QTime(9, 33, 1, 1), - QTimeZone::fromSecondsAheadOfUtc(10620)); + << u"2001-09-15T09:33:01.001UTC+02:57"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(QDate(2001, 9, 15), QTime(9, 33, 1, 1), + QTimeZone::fromSecondsAheadOfUtc(10620)); QTest::newRow("offset-from-utc:-03:00") // RFC 3339 offset format - << QString("2001-09-15T09:33:01.001-03:00") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(QDate(2001, 9, 15), QTime(9, 33, 1, 1), - QTimeZone::fromSecondsAheadOfUtc(-10800)); + << u"2001-09-15T09:33:01.001-03:00"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(QDate(2001, 9, 15), QTime(9, 33, 1, 1), + QTimeZone::fromSecondsAheadOfUtc(-10800)); QTest::newRow("offset-from-utc:+0205") // ISO 8601 basic offset format - << QString("2001-09-15T09:33:01.001+0205") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(QDate(2001, 9, 15), QTime(9, 33, 1, 1), - QTimeZone::fromSecondsAheadOfUtc(7500)); + << u"2001-09-15T09:33:01.001+0205"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(QDate(2001, 9, 15), QTime(9, 33, 1, 1), + QTimeZone::fromSecondsAheadOfUtc(7500)); QTest::newRow("offset-from-utc:-0401") // ISO 8601 basic offset format - << QString("2001-09-15T09:33:01.001-0401") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(QDate(2001, 9, 15), QTime(9, 33, 1, 1), - QTimeZone::fromSecondsAheadOfUtc(-14460)); + << u"2001-09-15T09:33:01.001-0401"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(QDate(2001, 9, 15), QTime(9, 33, 1, 1), + QTimeZone::fromSecondsAheadOfUtc(-14460)); QTest::newRow("offset-from-utc:+10") // ISO 8601 basic (hour-only) offset format - << QString("2001-09-15T09:33:01.001 +10") << QString("yyyy-MM-ddThh:mm:ss.z t") - << QDateTime(QDate(2001, 9, 15), QTime(9, 33, 1, 1), - QTimeZone::fromSecondsAheadOfUtc(36000)); + << u"2001-09-15T09:33:01.001 +10"_s << u"yyyy-MM-ddThh:mm:ss.z t"_s << 1900 + << QDateTime(QDate(2001, 9, 15), QTime(9, 33, 1, 1), + QTimeZone::fromSecondsAheadOfUtc(36000)); QTest::newRow("offset-from-utc:UTC+10:00") // Time-spec specifier at the beginning - << QString("UTC+10:00 2008-10-13T07:33") << QString("t yyyy-MM-ddThh:mm") - << QDateTime(QDate(2008, 10, 13), QTime(7, 33), QTimeZone::fromSecondsAheadOfUtc(36000)); + << u"UTC+10:00 2008-10-13T07:33"_s << u"t yyyy-MM-ddThh:mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(7, 33), + QTimeZone::fromSecondsAheadOfUtc(36000)); QTest::newRow("offset-from-utc:UTC-03:30") // Time-spec specifier in the middle - << QString("2008-10-13 UTC-03:30 11.50") << QString("yyyy-MM-dd t hh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), - QTimeZone::fromSecondsAheadOfUtc(-12600)); + << u"2008-10-13 UTC-03:30 11.50"_s << u"yyyy-MM-dd t hh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), + QTimeZone::fromSecondsAheadOfUtc(-12600)); QTest::newRow("offset-from-utc:UTC-2") // Time-spec specifier joined with text/time - << QString("2008-10-13 UTC-2Z11.50") << QString("yyyy-MM-dd tZhh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), QTimeZone::fromSecondsAheadOfUtc(-7200)); + << u"2008-10-13 UTC-2Z11.50"_s << u"yyyy-MM-dd tZhh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), + QTimeZone::fromSecondsAheadOfUtc(-7200)); QTest::newRow("offset-from-utc:followed-by-colon") - << QString("2008-10-13 UTC-0100:11.50") << QString("yyyy-MM-dd t:hh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), QTimeZone::fromSecondsAheadOfUtc(-3600)); + << u"2008-10-13 UTC-0100:11.50"_s << u"yyyy-MM-dd t:hh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), + QTimeZone::fromSecondsAheadOfUtc(-3600)); QTest::newRow("offset-from-utc:late-colon") - << QString("2008-10-13 UTC+05T:11.50") << QString("yyyy-MM-dd tT:hh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), QTimeZone::fromSecondsAheadOfUtc(18000)); + << u"2008-10-13 UTC+05T:11.50"_s << u"yyyy-MM-dd tT:hh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), + QTimeZone::fromSecondsAheadOfUtc(18000)); QTest::newRow("offset-from-utc:merged-with-time") - << QString("2008-10-13 UTC+010011.50") << QString("yyyy-MM-dd thh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), QTimeZone::fromSecondsAheadOfUtc(3600)); + << u"2008-10-13 UTC+010011.50"_s << u"yyyy-MM-dd thh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), + QTimeZone::fromSecondsAheadOfUtc(3600)); QTest::newRow("offset-from-utc:double-colon-delimiter") - << QString("2008-10-13 UTC+12::11.50") << QString("yyyy-MM-dd t::hh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), QTimeZone::fromSecondsAheadOfUtc(43200)); + << u"2008-10-13 UTC+12::11.50"_s << u"yyyy-MM-dd t::hh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), + QTimeZone::fromSecondsAheadOfUtc(43200)); QTest::newRow("offset-from-utc:3-digit-with-colon") - << QString("2008-10-13 -4:30 11.50") << QString("yyyy-MM-dd t hh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), QTimeZone::fromSecondsAheadOfUtc(-16200)); + << u"2008-10-13 -4:30 11.50"_s << u"yyyy-MM-dd t hh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), + QTimeZone::fromSecondsAheadOfUtc(-16200)); QTest::newRow("offset-from-utc:with-colon-merged-with-time") - << QString("2008-10-13 UTC+01:0011.50") << QString("yyyy-MM-dd thh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), QTimeZone::fromSecondsAheadOfUtc(3600)); + << u"2008-10-13 UTC+01:0011.50"_s << u"yyyy-MM-dd thh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), + QTimeZone::fromSecondsAheadOfUtc(3600)); QTest::newRow("invalid-offset-from-utc:out-of-range") - << QString("2001-09-15T09:33:01.001-50") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(); + << u"2001-09-15T09:33:01.001-50"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(); QTest::newRow("invalid-offset-from-utc:single-digit-format") - << QString("2001-09-15T09:33:01.001+5") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(); + << u"2001-09-15T09:33:01.001+5"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 << QDateTime(); QTest::newRow("invalid-offset-from-utc:three-digit-format") - << QString("2001-09-15T09:33:01.001-701") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(); + << u"2001-09-15T09:33:01.001-701"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(); QTest::newRow("invalid-offset-from-utc:three-digit-minutes") - << QString("2001-09-15T09:33:01.001+11:570") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(); + << u"2001-09-15T09:33:01.001+11:570"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(); QTest::newRow("invalid-offset-from-utc:single-digit-minutes") - << QString("2001-09-15T09:33:01.001+11:5") << QString("yyyy-MM-ddThh:mm:ss.zt") - << QDateTime(); + << u"2001-09-15T09:33:01.001+11:5"_s << u"yyyy-MM-ddThh:mm:ss.zt"_s << 1900 + << QDateTime(); QTest::newRow("invalid-offset-from-utc:invalid-sign-symbol") - << QString("2001-09-15T09:33:01.001 ~11:30") << QString("yyyy-MM-ddThh:mm:ss.z t") - << QDateTime(); + << u"2001-09-15T09:33:01.001 ~11:30"_s << u"yyyy-MM-ddThh:mm:ss.z t"_s << 1900 + << QDateTime(); QTest::newRow("invalid-offset-from-utc:symbol-in-hours") - << QString("2001-09-15T09:33:01.001 UTC+o8:30") << QString("yyyy-MM-ddThh:mm:ss.z t") - << QDateTime(); + << u"2001-09-15T09:33:01.001 UTC+o8:30"_s << u"yyyy-MM-ddThh:mm:ss.z t"_s << 1900 + << QDateTime(); QTest::newRow("invalid-offset-from-utc:symbol-in-minutes") - << QString("2001-09-15T09:33:01.001 UTC+08:3i") << QString("yyyy-MM-ddThh:mm:ss.z t") - << QDateTime(); + << u"2001-09-15T09:33:01.001 UTC+08:3i"_s << u"yyyy-MM-ddThh:mm:ss.z t"_s << 1900 + << QDateTime(); QTest::newRow("invalid-offset-from-utc:UTC+123") // Invalid offset (UTC and 3 digit format) - << QString("2001-09-15T09:33:01.001 UTC+123") << QString("yyyy-MM-ddThh:mm:ss.z t") - << QDateTime(); + << u"2001-09-15T09:33:01.001 UTC+123"_s << u"yyyy-MM-ddThh:mm:ss.z t"_s << 1900 + << QDateTime(); QTest::newRow("invalid-offset-from-utc:UTC+00005") // Invalid offset with leading zeroes - << QString("2001-09-15T09:33:01.001 UTC+00005") << QString("yyyy-MM-ddThh:mm:ss.z t") - << QDateTime(); + << u"2001-09-15T09:33:01.001 UTC+00005"_s << u"yyyy-MM-ddThh:mm:ss.z t"_s << 1900 + << QDateTime(); QTest::newRow("invalid-offset-from-utc:three-digit-with-colon-delimiter") - << QString("2008-10-13 +123:11.50") << QString("yyyy-MM-dd t:hh.mm") - << QDateTime(); + << u"2008-10-13 +123:11.50"_s << u"yyyy-MM-dd t:hh.mm"_s << 1900 << QDateTime(); QTest::newRow("invalid-offset-from-utc:double-colon-as-part-of-offset") - << QString("2008-10-13 UTC+12::11.50") << QString("yyyy-MM-dd thh.mm") - << QDateTime(); + << u"2008-10-13 UTC+12::11.50"_s << u"yyyy-MM-dd thh.mm"_s << 1900 << QDateTime(); QTest::newRow("invalid-offset-from-utc:single-colon-as-part-of-offset") - << QString("2008-10-13 UTC+12::11.50") << QString("yyyy-MM-dd t:hh.mm") - << QDateTime(); + << u"2008-10-13 UTC+12::11.50"_s << u"yyyy-MM-dd t:hh.mm"_s << 1900 << QDateTime(); QTest::newRow("invalid-offset-from-utc:starts-with-colon") - << QString("2008-10-13 UTC+:59 11.50") << QString("yyyy-MM-dd t hh.mm") - << QDateTime(); + << u"2008-10-13 UTC+:59 11.50"_s << u"yyyy-MM-dd t hh.mm"_s << 1900 << QDateTime(); QTest::newRow("invalid-offset-from-utc:empty-offset") - << QString("2008-10-13 UTC+ 11.50") << QString("yyyy-MM-dd t hh.mm") - << QDateTime(); + << u"2008-10-13 UTC+ 11.50"_s << u"yyyy-MM-dd t hh.mm"_s << 1900 << QDateTime(); QTest::newRow("invalid-offset-from-utc:time-section-instead-of-offset") - << QString("2008-10-13 UTC+11.50") << QString("yyyy-MM-dd thh.mm") - << QDateTime(); + << u"2008-10-13 UTC+11.50"_s << u"yyyy-MM-dd thh.mm"_s << 1900 << QDateTime(); QTest::newRow("invalid-offset-from-utc:missing-minutes-if-colon") - << QString("2008-10-13 +05: 11.50") << QString("yyyy-MM-dd t hh.mm") - << QDateTime(); + << u"2008-10-13 +05: 11.50"_s << u"yyyy-MM-dd t hh.mm"_s << 1900 << QDateTime(); QTest::newRow("invalid-offset-from-utc:1-digit-minutes-if-colon") - << QString("2008-10-13 UTC+05:1 11.50") << QString("yyyy-MM-dd t hh.mm") - << QDateTime(); + << u"2008-10-13 UTC+05:1 11.50"_s << u"yyyy-MM-dd t hh.mm"_s << 1900 << QDateTime(); QTest::newRow("invalid-time-spec:random-symbol") - << QString("2001-09-15T09:33:01.001 $") << QString("yyyy-MM-ddThh:mm:ss.z t") - << QDateTime(); + << u"2001-09-15T09:33:01.001 $"_s << u"yyyy-MM-ddThh:mm:ss.z t"_s << 1900 + << QDateTime(); QTest::newRow("invalid-time-spec:random-digit") - << QString("2001-09-15T09:33:01.001 1") << QString("yyyy-MM-ddThh:mm:ss.z t") - << QDateTime(); + << u"2001-09-15T09:33:01.001 1"_s << u"yyyy-MM-ddThh:mm:ss.z t"_s << 1900 + << QDateTime(); QTest::newRow("invalid-offset-from-utc:merged-with-time") - << QString("2008-10-13 UTC+0111.50") << QString("yyyy-MM-dd thh.mm") - << QDateTime(); + << u"2008-10-13 UTC+0111.50"_s << u"yyyy-MM-dd thh.mm"_s << 1900 << QDateTime(); QTest::newRow("invalid-offset-from-utc:with-colon-3-digit-merged-with-time") - << QString("2008-10-13 UTC+01:011.50") << QString("yyyy-MM-dd thh.mm") - << QDateTime(); + << u"2008-10-13 UTC+01:011.50"_s << u"yyyy-MM-dd thh.mm"_s << 1900 << QDateTime(); QTest::newRow("invalid-time-spec:empty") - << QString("2001-09-15T09:33:01.001 ") << QString("yyyy-MM-ddThh:mm:ss.z t") - << QDateTime(); + << u"2001-09-15T09:33:01.001 "_s << u"yyyy-MM-ddThh:mm:ss.z t"_s << 1900 << QDateTime(); #if QT_CONFIG(timezone) QTimeZone southBrazil("America/Sao_Paulo"); if (southBrazil.isValid()) { QTest::newRow("spring-forward-midnight") - // NB: no hour field, so hour takes its default, 0, so that default - // can be over-ridden: - << QString("2008-10-19 23:45.678 America/Sao_Paulo") - << QString("yyyy-MM-dd mm:ss.zzz t") - // That's in the hour skipped - expect the matching time after the - // spring-forward, in DST: - << QDateTime(QDate(2008, 10, 19), QTime(1, 23, 45, 678), southBrazil); + // NB: no hour field, so hour takes its default, 0, so that + // default can be over-ridden: + << u"2008-10-19 23:45.678 America/Sao_Paulo"_s << u"yyyy-MM-dd mm:ss.zzz t"_s << 1900 + // That's in the hour skipped - expect the matching time after + // the spring-forward, in DST: + << QDateTime(QDate(2008, 10, 19), QTime(1, 23, 45, 678), southBrazil); } QTimeZone berlintz("Europe/Berlin"); if (berlintz.isValid()) { QTest::newRow("begin-of-high-summer-time-with-tz") - << QString("1947-05-11 03:23:45.678 Europe/Berlin") - << QString("yyyy-MM-dd hh:mm:ss.zzz t") - // That's in the hour skipped - expecting an invalid DateTime - << QDateTime(QDate(1947, 5, 11), QTime(3, 23, 45, 678), berlintz); + << u"1947-05-11 03:23:45.678 Europe/Berlin"_s << u"yyyy-MM-dd hh:mm:ss.zzz t"_s + // That's in the hour skipped - expecting an invalid DateTime + << 1900 << QDateTime(QDate(1947, 5, 11), QTime(3, 23, 45, 678), berlintz); } #endif - QTest::newRow("late") << QString("9999-12-31T23:59:59.999Z") - << QString("yyyy-MM-ddThh:mm:ss.zZ") - << QDateTime(QDate(9999, 12, 31), QTime(23, 59, 59, 999)); + QTest::newRow("late") + << u"9999-12-31T23:59:59.999Z"_s << u"yyyy-MM-ddThh:mm:ss.zZ"_s << 1900 + << QDateTime(QDate(9999, 12, 31), QTime(23, 59, 59, 999)); // Separators match /([^aAdhHMmstyz]*)/ QTest::newRow("oddly-separated") // To show broken-separator's format is valid. - << QStringLiteral("2018 wilful long working block relief 12-19T21:09 cruel blurb encore flux") - << QStringLiteral("yyyy wilful long working block relief MM-ddThh:mm cruel blurb encore flux") - << QDateTime(QDate(2018, 12, 19), QTime(21, 9)); + << u"2018 wilful long working block relief 12-19T21:09 cruel blurb encore flux"_s + << u"yyyy wilful long working block relief MM-ddThh:mm cruel blurb encore flux"_s + << 1900 << QDateTime(QDate(2018, 12, 19), QTime(21, 9)); QTest::newRow("broken-separator") - << QStringLiteral("2018 wilful") - << QStringLiteral("yyyy wilful long working block relief MM-ddThh:mm cruel blurb encore flux") - << QDateTime(); + << u"2018 wilful"_s + << u"yyyy wilful long working block relief MM-ddThh:mm cruel blurb encore flux"_s + << 1900 << QDateTime(); QTest::newRow("broken-terminator") - << QStringLiteral("2018 wilful long working block relief 12-19T21:09 cruel") - << QStringLiteral("yyyy wilful long working block relief MM-ddThh:mm cruel blurb encore flux") - << QDateTime(); + << u"2018 wilful long working block relief 12-19T21:09 cruel"_s + << u"yyyy wilful long working block relief MM-ddThh:mm cruel blurb encore flux"_s + << 1900 << QDateTime(); // test unicode - QTest::newRow("unicode handling") << QString(u8"2005🤣06🤣28T07🤣57🤣30.001Z") - << QString(u8"yyyy🤣MM🤣ddThh🤣mm🤣ss.zt") - << QDateTime(QDate(2005, 6, 28), QTime(7, 57, 30, 1), UTC); + QTest::newRow("unicode handling") + << QString(u8"2005🤣06🤣28T07🤣57🤣30.001Z") + << QString(u8"yyyy🤣MM🤣ddThh🤣mm🤣ss.zt") << 1900 + << QDateTime(QDate(2005, 6, 28), QTime(7, 57, 30, 1), UTC); // Two tests derived from malformed ASN.1 strings (QTBUG-84349): QTest::newRow("ASN.1:UTC") - << u"22+221102233Z"_s << u"yyMMddHHmmsst"_s << QDateTime(); + << u"22+221102233Z"_s << u"yyMMddHHmmsst"_s << 1900 << QDateTime(); QTest::newRow("ASN.1:Generalized") - << u"9922+221102233Z"_s << u"yyyyMMddHHmmsst"_s << QDateTime(); + << u"9922+221102233Z"_s << u"yyyyMMddHHmmsst"_s << 1900 << QDateTime(); // fuzzer test QTest::newRow("integer overflow found by fuzzer") - << QStringLiteral("EEE1200000MUB") << QStringLiteral("t") - << QDateTime(); + << u"EEE1200000MUB"_s << u"t"_s << 1900 << QDateTime(); // Rich time-zone specifiers (QTBUG-95966): const auto east3hours = QTimeZone::fromSecondsAheadOfUtc(10800); QTest::newRow("timezone-tt-with-offset:+0300") - << QString("2008-10-13 +0300 11.50") << QString("yyyy-MM-dd tt hh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), east3hours); + << u"2008-10-13 +0300 11.50"_s << u"yyyy-MM-dd tt hh.mm"_s + << 1900 << QDateTime(QDate(2008, 10, 13), QTime(11, 50), east3hours); QTest::newRow("timezone-ttt-with-offset:+03:00") - << QString("2008-10-13 +03:00 11.50") << QString("yyyy-MM-dd ttt hh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), east3hours); + << u"2008-10-13 +03:00 11.50"_s << u"yyyy-MM-dd ttt hh.mm"_s + << 1900 << QDateTime(QDate(2008, 10, 13), QTime(11, 50), east3hours); QTest::newRow("timezone-tttt-with-offset:+03:00") - << QString("2008-10-13 +03:00 11.50") << QString("yyyy-MM-dd tttt hh.mm") - << QDateTime(); // Offset not valid when zone name expected. + << u"2008-10-13 +03:00 11.50"_s << u"yyyy-MM-dd tttt hh.mm"_s + << 1900 << QDateTime(); // Offset not valid when zone name expected. } void tst_QDateTime::fromStringStringFormat() @@ -3366,6 +3361,7 @@ void tst_QDateTime::fromStringStringFormat_localTimeZone_data() QTest::addColumn("localTimeZone"); QTest::addColumn("string"); QTest::addColumn("format"); + QTest::addColumn("baseYear"); QTest::addColumn("expected"); #if QT_CONFIG(timezone) @@ -3378,29 +3374,24 @@ void tst_QDateTime::fromStringStringFormat_localTimeZone_data() if (etcGmtWithOffset.isValid()) { lacksRows = false; QTest::newRow("local-timezone-t-with-zone:Etc/GMT+3") - << QByteArrayLiteral("GMT") - << QString("2008-10-13 Etc/GMT+3 11.50") << QString("yyyy-MM-dd t hh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), etcGmtWithOffset); + << "GMT"_ba << u"2008-10-13 Etc/GMT+3 11.50"_s << u"yyyy-MM-dd t hh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), etcGmtWithOffset); QTest::newRow("local-timezone-tttt-with-zone:Etc/GMT+3") - << QByteArrayLiteral("GMT") - << QString("2008-10-13 Etc/GMT+3 11.50") << QString("yyyy-MM-dd tttt hh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), etcGmtWithOffset); + << "GMT"_ba << u"2008-10-13 Etc/GMT+3 11.50"_s << u"yyyy-MM-dd tttt hh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), etcGmtWithOffset); } QTest::newRow("local-timezone-tt-with-zone:Etc/GMT+3") - << QByteArrayLiteral("GMT") - << QString("2008-10-13 Etc/GMT+3 11.50") << QString("yyyy-MM-dd tt hh.mm") - << QDateTime(); // Zone name not valid when offset expected + << "GMT"_ba << u"2008-10-13 Etc/GMT+3 11.50"_s << u"yyyy-MM-dd tt hh.mm"_s << 1900 + << QDateTime(); // Zone name not valid when offset expected QTest::newRow("local-timezone-ttt-with-zone:Etc/GMT+3") - << QByteArrayLiteral("GMT") - << QString("2008-10-13 Etc/GMT+3 11.50") << QString("yyyy-MM-dd ttt hh.mm") - << QDateTime(); // Zone name not valid when offset expected + << "GMT"_ba << u"2008-10-13 Etc/GMT+3 11.50"_s << u"yyyy-MM-dd ttt hh.mm"_s << 1900 + << QDateTime(); // Zone name not valid when offset expected QTimeZone gmtWithOffset("GMT-2"); if (gmtWithOffset.isValid()) { lacksRows = false; QTest::newRow("local-timezone-with-offset:GMT-2") - << QByteArrayLiteral("GMT") - << QString("2008-10-13 GMT-2 11.50") << QString("yyyy-MM-dd t hh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), gmtWithOffset); + << "GMT"_ba << u"2008-10-13 GMT-2 11.50"_s << u"yyyy-MM-dd t hh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), gmtWithOffset); } QTimeZone gmt("GMT"); if (gmt.isValid()) { @@ -3410,10 +3401,9 @@ void tst_QDateTime::fromStringStringFormat_localTimeZone_data() return qTzName(0) == u"GMT"_s; })(); QTest::newRow("local-timezone-with-offset:GMT") - << QByteArrayLiteral("GMT") - << QString("2008-10-13 GMT 11.50") << QString("yyyy-MM-dd t hh.mm") - << QDateTime(QDate(2008, 10, 13), QTime(11, 50), - fullyLocal ? QTimeZone(QTimeZone::LocalTime) : gmt); + << "GMT"_ba << u"2008-10-13 GMT 11.50"_s << u"yyyy-MM-dd t hh.mm"_s << 1900 + << QDateTime(QDate(2008, 10, 13), QTime(11, 50), + fullyLocal ? QTimeZone(QTimeZone::LocalTime) : gmt); } QTimeZone helsinki("Europe/Helsinki"); if (helsinki.isValid()) { @@ -3422,10 +3412,12 @@ void tst_QDateTime::fromStringStringFormat_localTimeZone_data() // the first 20m 11s of 1921-05-01 being skipped, so the parser's // attempt to construct a local time after scanning yyMM tripped up on // the start of the day, when the zone backend lacked transition data. + // (Because QDTP tries to use local time until it reads the final zone + // field, constructing a new QDT after reading each field, hence + // transiently wanting 1921-05-01 00:00:00 before reading the dd field.) QTest::newRow("Helsinki-joins-EET") - << QByteArrayLiteral("Europe/Helsinki") - << QString("210506000000Z") << QString("yyMMddHHmmsst") - << QDateTime(QDate(1921, 5, 6), QTime(0, 0), UTC); + << "Europe/Helsinki"_ba << u"210506000000Z"_s << u"yyMMddHHmmsst"_s << 1900 + << QDateTime(QDate(1921, 5, 6), QTime(0, 0), UTC); } if (lacksRows) QSKIP("Testcases all use zones unsupported on this platform");