From 3f9b5086525ac4552fd4d7cc89c74bf76f45b1dc Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Thu, 10 May 2012 12:07:58 +0300 Subject: [PATCH] fix QString::isRightToLeft() for SMP code points Change-Id: Ib8afc932d9566df1a8922da9a75b9f9cbbdd321d Reviewed-by: Lars Knoll Reviewed-by: Thiago Macieira --- src/corelib/tools/qstring.cpp | 10 ++++++- tests/auto/corelib/tools/qstring/tst_qstring.cpp | 35 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index ebf157a..a0963b6 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -7304,7 +7304,15 @@ bool QString::isRightToLeft() const const ushort *p = d->data(); const ushort * const end = p + d->size; while (p < end) { - switch(QChar::direction(*p)) + uint ucs4 = *p; + if (QChar::isHighSurrogate(ucs4) && p < end - 1) { + ushort low = p[1]; + if (QChar::isLowSurrogate(low)) { + ucs4 = QChar::surrogateToUcs4(ucs4, low); + ++p; + } + } + switch (QChar::direction(ucs4)) { case QChar::DirL: return false; diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp index ed3f04a..78a1983 100644 --- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp @@ -239,6 +239,8 @@ private slots: void compareQLatin1Strings(); void fromQLatin1StringWithLength(); void assignQLatin1String(); + void isRightToLeft_data(); + void isRightToLeft(); }; template const T &verifyZeroTermination(const T &t) { return t; } @@ -5627,6 +5629,39 @@ void tst_QString::assignQLatin1String() } +void tst_QString::isRightToLeft_data() +{ + QTest::addColumn("unicode"); + QTest::addColumn("rtl"); + + QTest::newRow("null") << QString() << false; + QTest::newRow("empty") << QString("") << false; + + QTest::newRow("numbers-only") << QString("12345") << false; + QTest::newRow("latin1-only") << QString("hello") << false; + QTest::newRow("numbers-latin1") << (QString("12345") + QString("hello")) << false; + + static const ushort unicode1[] = { 0x627, 0x627 }; + QTest::newRow("arabic-only") << QString::fromUtf16(unicode1, 2) << true; + QTest::newRow("numbers-arabic") << (QString("12345") + QString::fromUtf16(unicode1, 2)) << true; + QTest::newRow("numbers-latin1-arabic") << (QString("12345") + QString("hello") + QString::fromUtf16(unicode1, 2)) << false; + QTest::newRow("numbers-arabic-latin1") << (QString("12345") + QString::fromUtf16(unicode1, 2) + QString("hello")) << true; + + static const ushort unicode2[] = { QChar::highSurrogate(0xE01DAu), QChar::lowSurrogate(0xE01DAu), QChar::highSurrogate(0x2F800u), QChar::lowSurrogate(0x2F800u) }; + QTest::newRow("surrogates-VS-CJK") << QString::fromUtf16(unicode2, 4) << false; + + static const ushort unicode3[] = { QChar::highSurrogate(0x10800u), QChar::lowSurrogate(0x10800u), QChar::highSurrogate(0x10805u), QChar::lowSurrogate(0x10805u) }; + QTest::newRow("surrogates-cypriot") << QString::fromUtf16(unicode3, 4) << true; +} + +void tst_QString::isRightToLeft() +{ + QFETCH(QString, unicode); + QFETCH(bool, rtl); + + QCOMPARE(unicode.isRightToLeft(), rtl); +} + QTEST_APPLESS_MAIN(tst_QString) #include "tst_qstring.moc" -- 2.7.4