33 void testTimestampParsing();
38 void CTestStringUtils::testRemove()
40 QString s =
"loUwP PeERr69";
41 QVERIFY2(
removeChars(s, [](QChar c) {
return !c.isUpper(); }) ==
"UPPER",
42 "Test removing characters by predicate");
45 void CTestStringUtils::testContains()
47 QString s =
"string with a numb3r";
48 QVERIFY2(
containsChar(s, [](QChar c) {
return c.isNumber(); }),
"Test contains character by predicate");
49 s =
"string without a number";
50 QVERIFY2(!
containsChar(s, [](QChar c) {
return c.isNumber(); }),
"Test not contains character by predicate");
53 void CTestStringUtils::testIndexOf()
55 QString s =
"string with a numb3r";
56 QVERIFY2(
indexOfChar(s, [](QChar c) {
return c.isNumber(); }) == 18,
"Test index of character by predicate");
57 s =
"string without a number";
58 QVERIFY2(
indexOfChar(s, [](QChar c) {
return c.isNumber(); }) == -1,
59 "Test not index of character by predicate");
62 void CTestStringUtils::testSplit()
64 const QString s =
"line one\nline two\r\nline three\n";
66 QVERIFY2(lines.size() == 3,
"Test split string into lines: correct number of lines");
67 QVERIFY2(lines[0] ==
"line one",
"Test split string into lines: correct first line");
68 QVERIFY2(lines[1] ==
"line two",
"Test split string into lines: correct second line");
69 QVERIFY2(lines[2] ==
"line three",
"Test split string into lines: correct third line");
72 void CTestStringUtils::testTimestampParsing()
74 const QStringList dts({
"2018-01-01 11:11:11",
"2012-05-09 03:04:05.777",
"2012-05-09 00:00:00.000",
75 "2015-12-31 03:04:05",
"1999-12-31 23:59:59.999",
"1975-01-01 14:13:17",
76 "1982-05-09 03:01:05.123",
"2000-05-02 00:04:00.000",
"2002-12-31 03:34:33",
77 "1992-11-01 21:59:29.999" });
79 const int size = QString(
"yyyyMMddHHmmss").size();
80 for (
const QString &dt : dts)
86 QDateTime dt3 = (c.length() == size) ? QDateTime::fromString(c,
"yyyyMMddHHmmss") :
87 QDateTime::fromString(c,
"yyyyMMddHHmmsszzz");
88 dt3.setOffsetFromUtc(0);
90 const qint64 ms1 = dt1.toMSecsSinceEpoch();
91 const qint64 ms2 = dt2.toMSecsSinceEpoch();
92 const qint64 delta = ms1 - ms2;
94 QVERIFY2(dt1 == dt2,
"Expect same results of QDateTime");
95 QVERIFY2(dt1 == dt3,
"Expect same results of QDateTime");
96 QVERIFY2(delta == 0,
"Expect same results timestamp");
100 int constexpr Loops = 10000;
103 for (
int i = 0; i < Loops; i++)
105 for (
const QString &dt : dts)
113 const int elapsedOptimized = time.restart();
115 for (
int i = 0; i < Loops; i++)
117 for (
const QString &dt : dts)
120 const QDateTime dateTime =
125 const int elapsedQt = time.restart();
127 qDebug() <<
"Parsing date/time, optimized" << elapsedOptimized <<
"vs. QDateTime: " << elapsedQt;
128 QVERIFY2(elapsedOptimized < elapsedQt,
"Expect optimized being faster as QDateTim::fromString");
131 void CTestStringUtils::testCodecs()
133 QTextCodec *latin1 = QTextCodec::codecForName(
"latin1");
134 QTextCodec *cp1251 = QTextCodec::codecForName(
"windows-1251");
135 QTextCodec *utf8 = QTextCodec::codecForName(
"UTF-8");
136 const QString testEnglish = QStringLiteral(u
"test");
137 const QString testRussian = QStringLiteral(u
"тест");
138 bool okEn1 = latin1->toUnicode(latin1->fromUnicode(testEnglish)) == testEnglish;
139 bool okEn2 = utf8->toUnicode(utf8->fromUnicode(testEnglish)) == testEnglish;
140 bool okRu1 = cp1251->toUnicode(cp1251->fromUnicode(testRussian)) == testRussian;
141 bool okRu2 = utf8->toUnicode(utf8->fromUnicode(testRussian)) == testRussian;
142 QVERIFY2(okEn1,
"English \"test\" equal after round-trip with latin1");
143 QVERIFY2(okEn2,
"English \"test\" equal after round-trip with utf8");
144 QVERIFY2(okRu1,
"Russian \"test\" equal after round-trip with cp1251");
145 QVERIFY2(okRu2,
"Russian \"test\" equal after round-trip with utf8");
148 void CTestStringUtils::testSimplify()
150 const auto inputChars = u8
"ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöùúûüýÿ";
151 const auto outputChars =
"SZszYAAAAAACEEEEIIIINOOOOOUUUUYaaaaaaceeeeiiiinooooouuuuyy";
152 const QString input = QString::fromUtf8(
reinterpret_cast<const char *
>(inputChars));
153 const QString output = QLatin1String(outputChars);
162 #include "teststringutils.moc"
Testing string utilities.
Free functions in swift::misc.
QString removeChars(const QString &s, F predicate)
Return a string with characters removed that match the given predicate.
SWIFT_MISC_EXPORT QString removeDateTimeSeparators(const QString &s)
Remove the typical separators such as "-", " ".
SWIFT_MISC_EXPORT QString simplifyByDecomposition(const QString &candidate)
Remove accents / diacritic marks from a string by doing a Unicode decomposition and removing mark cha...
SWIFT_MISC_EXPORT QString simplifyAccents(const QString &candidate)
Remove accents / diacritic marks from a string.
int indexOfChar(const QString &s, F predicate)
Index of first character in the string matching the given predicate, or -1 if not found.
SWIFT_MISC_EXPORT QStringList splitLines(const QString &s)
Split a string into multiple lines. Blank lines are skipped.
SWIFT_MISC_EXPORT QDateTime fromStringUtc(const QString &dateTimeString, const QString &format)
Same as QDateTime::fromString but QDateTime will be set to UTC.
bool containsChar(const QString &s, F predicate)
True if any character in the string matches the given predicate.
SWIFT_MISC_EXPORT QDateTime parseDateTimeStringOptimized(const QString &dateTimeString)
Parse yyyyMMddHHmmsszzz strings optimized.
SWIFTTEST_APPLESS_MAIN(MiscTest::CTestStringUtils)
main