Extend QString equality tests with more long strings

Vectorized versions of ucstrncmp work on larger chunks of text
(typically 8 characters and an optional 4 more in some cases), so there
are now 4 extra sets of tests:
- strings of 1-65 characters, all different
- strings of 1-65 characters, all the same
- strings of 1-65 characters, all the same *except* the last character
- strings of 16 characters long, all the same except one, and that one
  is different for every string (i.e. first string differs in first
  char, second in second char, etc)

This should excercise both 1 or more iterations of the vectorized loop,
the detection logic inside the loop, and off-by-one cases.

The input is all ascii, so the ::compare() test will run them for both
QChar-QChar comparisson and for QChar-latin1 comparisson.

Change-Id: Ifaa7e019c63b581d4af5aef6dcfb3e7456c7d360
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Erik Verbruggen 2017-01-27 15:30:48 +01:00
parent dbb2374d20
commit 268afd8aef

View File

@ -6071,14 +6071,6 @@ void tst_QString::compare_data()
lower += QChar(QChar::lowSurrogate(0x10428));
QTest::newRow("data8") << upper << lower << -1 << 0;
QTest::newRow("vectorized-boundaries-7") << QString("1234567") << QString("abcdefg") << -1 << -1;
QTest::newRow("vectorized-boundaries-8") << QString("12345678") << QString("abcdefgh") << -1 << -1;
QTest::newRow("vectorized-boundaries-9") << QString("123456789") << QString("abcdefghi") << -1 << -1;
QTest::newRow("vectorized-boundaries-15") << QString("123456789012345") << QString("abcdefghiklmnop") << -1 << -1;
QTest::newRow("vectorized-boundaries-16") << QString("1234567890123456") << QString("abcdefghiklmnopq") << -1 << -1;
QTest::newRow("vectorized-boundaries-17") << QString("12345678901234567") << QString("abcdefghiklmnopqr") << -1 << -1;
// embedded nulls
// These don't work as of now. It's OK that these don't work since \0 is not a valid unicode
/*QTest::newRow("data10") << QString(QByteArray("\0", 1)) << QString(QByteArray("\0", 1)) << 0 << 0;
@ -6087,6 +6079,44 @@ void tst_QString::compare_data()
QTest::newRow("data13") << QString("ab\0c") << QString(QByteArray("ab\0c", 4)) << 0 << 0;
QTest::newRow("data14") << QString(QByteArray("ab\0c", 4)) << QString("abc") << -1 << -1;
QTest::newRow("data15") << QString("abc") << QString(QByteArray("ab\0c", 4)) << 1 << 1;*/
// All tests below (generated by the 3 for-loops) are meant to excercise the vectorized versions
// of ucstrncmp.
QString in1, in2;
for (int i = 0; i < 70; ++i) {
in1 += QString::number(i % 10);
in2 += QString::number((70 - i + 1) % 10);
}
Q_ASSERT(in1.length() == in2.length());
Q_ASSERT(in1 != in2);
Q_ASSERT(in1.at(0) < in2.at(0));
for (int i = 0; i < in1.length(); ++i) {
Q_ASSERT(in1.at(i) != in2.at(i));
}
for (int i = 1; i <= 65; ++i) {
QString inp1 = in1.left(i);
QString inp2 = in2.left(i);
QTest::addRow("all-different-%d", i) << inp1 << inp2 << -1 << -1;
}
for (int i = 1; i <= 65; ++i) {
QString start(i - 1, 'a');
QString in = start + QLatin1Char('a');
QTest::addRow("all-same-%d", i) << in << in << 0 << 0;
QString in2 = start + QLatin1Char('b');
QTest::addRow("last-different-%d", i) << in << in2 << -1 << -1;
}
for (int i = 0; i < 16; ++i) {
QString in1(16, 'a');
QString in2 = in1;
in2[i] = 'b';
QTest::addRow("all-same-except-char-%d", i) << in1 << in2 << -1 << -1;
}
}
static bool isLatin(const QString &s)