tst_QString: unit test for broken toLocal8bit() error-handling
We can't (at present) actually exercise the failure in QWindowsLocalCodec::convertFromUnicode() that prompted us to consider the possible failure here, but we should at least test for it. Change-Id: I5066c88d7b4caeb48aebc6b79c355fa49e1c581c Reviewed-by: Frederic Marchal <frederic.marchal@wowtechnology.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
b92f5a0f3b
commit
ceabcc0142
@ -503,6 +503,8 @@ private slots:
|
|||||||
void fromLocal8Bit();
|
void fromLocal8Bit();
|
||||||
void local8Bit_data();
|
void local8Bit_data();
|
||||||
void local8Bit();
|
void local8Bit();
|
||||||
|
void invalidToLocal8Bit_data();
|
||||||
|
void invalidToLocal8Bit();
|
||||||
void nullFromLocal8Bit();
|
void nullFromLocal8Bit();
|
||||||
void fromLatin1Roundtrip_data();
|
void fromLatin1Roundtrip_data();
|
||||||
void fromLatin1Roundtrip();
|
void fromLatin1Roundtrip();
|
||||||
@ -4277,6 +4279,66 @@ void tst_QString::local8Bit()
|
|||||||
QCOMPARE(local8Bit.toLocal8Bit(), QByteArray(result));
|
QCOMPARE(local8Bit.toLocal8Bit(), QByteArray(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QString::invalidToLocal8Bit_data()
|
||||||
|
{
|
||||||
|
QTest::addColumn<QString>("unicode");
|
||||||
|
QTest::addColumn<QByteArray>("expect"); // Initial validly-converted prefix
|
||||||
|
|
||||||
|
{
|
||||||
|
const QChar malformed[] = { 'A', 0xd800, 'B', 0 };
|
||||||
|
const char expected[] = "A";
|
||||||
|
QTest::newRow("LoneHighSurrogate")
|
||||||
|
<< QString(malformed, sizeof(malformed) / sizeof(QChar))
|
||||||
|
// Don't include the terminating '\0' of expected:
|
||||||
|
<< QByteArray(expected, sizeof(expected) / sizeof(char) - 1);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const QChar malformed[] = { 'A', 0xdc00, 'B', 0 };
|
||||||
|
const char expected[] = "A";
|
||||||
|
QTest::newRow("LoneLowSurrogate")
|
||||||
|
<< QString(malformed, sizeof(malformed) / sizeof(QChar))
|
||||||
|
<< QByteArray(expected, sizeof(expected) / sizeof(char) - 1);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const QChar malformed[] = { 'A', 0xd800, 0xd801, 'B', 0 };
|
||||||
|
const char expected[] = "A";
|
||||||
|
QTest::newRow("DoubleHighSurrogate")
|
||||||
|
<< QString(malformed, sizeof(malformed) / sizeof(QChar))
|
||||||
|
<< QByteArray(expected, sizeof(expected) / sizeof(char) - 1);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const QChar malformed[] = { 'A', 0xdc00, 0xdc01, 'B', 0 };
|
||||||
|
const char expected[] = "A";
|
||||||
|
QTest::newRow("DoubleLowSurrogate")
|
||||||
|
<< QString(malformed, sizeof(malformed) / sizeof(QChar))
|
||||||
|
<< QByteArray(expected, sizeof(expected) / sizeof(char) - 1);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const QChar malformed[] = { 'A', 0xdc00, 0xd800, 'B', 0 };
|
||||||
|
const char expected[] = "A";
|
||||||
|
QTest::newRow("ReversedSurrogates") // low before high
|
||||||
|
<< QString(malformed, sizeof(malformed) / sizeof(QChar))
|
||||||
|
<< QByteArray(expected, sizeof(expected) / sizeof(char) - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QString::invalidToLocal8Bit()
|
||||||
|
{
|
||||||
|
QFETCH(QString, unicode);
|
||||||
|
QFETCH(QByteArray, expect);
|
||||||
|
QByteArray local = unicode.toLocal8Bit();
|
||||||
|
/*
|
||||||
|
The main concern of this test is to check that any error-reporting that
|
||||||
|
toLocal8Bit() prompts on failure isn't dependent on outputting the data
|
||||||
|
it's converting via toLocal8Bit(), which would be apt to recurse. So the
|
||||||
|
real purpose of this QVERIFY(), for all that we should indeed check we get
|
||||||
|
the borked output that matches what we can reliably expect (despite
|
||||||
|
variation in how codecs respond to errors), is to verify that we got here
|
||||||
|
- i.e. we didn't crash in such a recursive stack over-flow.
|
||||||
|
*/
|
||||||
|
QVERIFY(local.startsWith(expect));
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QString::nullFromLocal8Bit()
|
void tst_QString::nullFromLocal8Bit()
|
||||||
{
|
{
|
||||||
QString a;
|
QString a;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user