fix QString::isRightToLeft() for SMP code points
authorKonstantin Ritt <ritt.ks@gmail.com>
Thu, 10 May 2012 09:07:58 +0000 (12:07 +0300)
committerQt by Nokia <qt-info@nokia.com>
Thu, 10 May 2012 23:42:02 +0000 (01:42 +0200)
Change-Id: Ib8afc932d9566df1a8922da9a75b9f9cbbdd321d
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
src/corelib/tools/qstring.cpp
tests/auto/corelib/tools/qstring/tst_qstring.cpp

index ebf157a..a0963b6 100644 (file)
@@ -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;
index ed3f04a..78a1983 100644 (file)
@@ -239,6 +239,8 @@ private slots:
     void compareQLatin1Strings();
     void fromQLatin1StringWithLength();
     void assignQLatin1String();
+    void isRightToLeft_data();
+    void isRightToLeft();
 };
 
 template <class T> const T &verifyZeroTermination(const T &t) { return t; }
@@ -5627,6 +5629,39 @@ void tst_QString::assignQLatin1String()
 
 }
 
+void tst_QString::isRightToLeft_data()
+{
+    QTest::addColumn<QString>("unicode");
+    QTest::addColumn<bool>("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"