From 233109e93f4090627271978cf541b1814ef1c940 Mon Sep 17 00:00:00 2001 From: Mate Barany Date: Wed, 23 Nov 2022 17:03:10 +0100 Subject: [PATCH] Refactor\Extend tst_QString::insert_data with additional test cases During the implementation of QString::append(QUtf8StringView) it has become apparent that the testing is insufficient as it did not warn about an extra growth. The following tests have been added that append: - y-umlaut and greek letter small theta (2 UTF-8 code units => 1 UTF-16) - devanagri letter ssa (3 UTF-8 code units => 1 UTF-16) - chakma digit zero (4 UTF-8 code units => 2 UTF-16 code units) - some combinations of the above Task-number: QTBUG-103302 Change-Id: I3d81cf10b7eb74433ce5bea9b92ce6bce1230dcd Reviewed-by: Marc Mutz (cherry picked from commit bc9e1c5c2724161b97560b2957b9273bee013316) Reviewed-by: Qt Cherry-pick Bot --- .../auto/corelib/text/qstring/tst_qstring.cpp | 100 ++++++++++++++++-- 1 file changed, 90 insertions(+), 10 deletions(-) diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp index f5357c56def..9d999c8cf40 100644 --- a/tests/auto/corelib/text/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp @@ -310,7 +310,7 @@ private: void insert_impl() const { do_apply1(MemFun(&QString::insert)); } template void insert_impl() const { insert_impl(); } - void insert_data(bool emptyIsNoop = false); + void insert_data(DataOptions options = {}); class TransientDefaultLocale { @@ -436,21 +436,21 @@ private slots: void operator_smaller(); void insert_qstring() { insert_impl(); } - void insert_qstring_data() { insert_data(true); } + void insert_qstring_data() { insert_data(EmptyIsNoop); } void insert_qstringview() { insert_impl(); } - void insert_qstringview_data() { insert_data(true); } + void insert_qstringview_data() { insert_data(EmptyIsNoop); } void insert_qlatin1string() { insert_impl(); } - void insert_qlatin1string_data() { insert_data(true); } + void insert_qlatin1string_data() { insert_data({EmptyIsNoop, Latin1Encoded}); } void insert_qcharstar_int() { insert_impl, QString &(QString::*)(qsizetype, const QChar*, qsizetype) >(); } - void insert_qcharstar_int_data() { insert_data(true); } + void insert_qcharstar_int_data() { insert_data(EmptyIsNoop); } void insert_qchar() { insert_impl, QString &(QString::*)(qsizetype, QChar)>(); } - void insert_qchar_data() { insert_data(true); } + void insert_qchar_data() { insert_data(EmptyIsNoop); } void insert_qbytearray() { insert_impl(); } - void insert_qbytearray_data() { insert_data(true); } + void insert_qbytearray_data() { insert_data(EmptyIsNoop); } void insert_char() { insert_impl, QString &(QString::*)(qsizetype, QChar)>(); } - void insert_char_data() { insert_data(true); } + void insert_char_data() { insert_data({EmptyIsNoop, Latin1Encoded}); } void insert_charstar() { insert_impl(); } - void insert_charstar_data() { insert_data(true); } + void insert_charstar_data() { insert_data(EmptyIsNoop); } void insert_special_cases(); void simplified_data(); @@ -2636,19 +2636,22 @@ void tst_QString::simplified() QCOMPARE(std::move(full).simplified(), simple); } -void tst_QString::insert_data(bool emptyIsNoop) +void tst_QString::insert_data(DataOptions options) { QTest::addColumn("s"); QTest::addColumn("arg"); QTest::addColumn("a1"); QTest::addColumn("expected"); + const bool emptyIsNoop = options.testFlag(EmptyIsNoop); + const CharStarContainer nullC; const CharStarContainer emptyC(""); const CharStarContainer aC("a"); const CharStarContainer bC("b"); //const CharStarContainer abC("ab"); const CharStarContainer baC("ba"); + const CharStarContainer yumlautC(options.testFlag(Latin1Encoded) ? "\xff" : "\xc3\xbf"); const QString null; const QString empty(""); @@ -2657,6 +2660,10 @@ void tst_QString::insert_data(bool emptyIsNoop) const QString ab("ab"); const QString ba("ba"); + const QString yumlaut = QStringLiteral("\u00ff"); // LATIN LETTER SMALL Y WITH UMLAUT + const QString yumlautA = QStringLiteral("\u00ffa"); + const QString aYumlaut = QStringLiteral("a\u00ff"); + QTest::newRow("null.insert(0, null)") << null << nullC << 0 << null; QTest::newRow("null.insert(0, empty)") << null << emptyC << 0 << (emptyIsNoop ? null : empty); QTest::newRow("null.insert(0, a)") << null << aC << 0 << a; @@ -2673,6 +2680,79 @@ void tst_QString::insert_data(bool emptyIsNoop) QTest::newRow("a.insert(1, ba)") << a << baC << 1 << (a + ba); QTest::newRow("ba.insert(1, a)") << ba << aC << 1 << (ba + a); QTest::newRow("ba.insert(2, b)") << ba << bC << 2 << (ba + b); + + QTest::newRow("null-insert-0-yumlaut") << null << yumlautC << 0 << yumlaut; + QTest::newRow("empty-insert-0-yumlaut") << empty << yumlautC << 0 << yumlaut; + QTest::newRow("yumlaut-insert-0-null") << yumlaut << nullC << 0 << yumlaut; + QTest::newRow("yumlaut-insert-0-empty") << yumlaut << emptyC << 0 << yumlaut; + QTest::newRow("a-insert-0-yumlaut") << a << yumlautC << 0 << yumlautA; + QTest::newRow("a-insert-1-yumlaut") << a << yumlautC << 1 << aYumlaut; + + if (!options.testFlag(Latin1Encoded)) { + const auto smallTheta = QStringLiteral("\u03b8"); // GREEK LETTER SMALL THETA + const auto ssa = QStringLiteral("\u0937"); // DEVANAGARI LETTER SSA + const auto chakmaZero = QStringLiteral("\U00011136"); // CHAKMA DIGIT ZERO + + const auto aSmallTheta = QStringLiteral("a\u03b8"); + const auto aSsa = QStringLiteral("a\u0937"); + const auto aChakmaZero = QStringLiteral("a\U00011136"); + + const auto smallThetaA = QStringLiteral("\u03b8a"); + const auto ssaA = QStringLiteral("\u0937a"); + const auto chakmaZeroA = QStringLiteral("\U00011136a"); + + const auto umlautTheta = QStringLiteral("\u00ff\u03b8"); + const auto thetaUmlaut = QStringLiteral("\u03b8\u00ff"); + const auto ssaChakma = QStringLiteral("\u0937\U00011136"); + const auto chakmaSsa = QStringLiteral("\U00011136\u0937"); + + const CharStarContainer smallThetaC("\xce\xb8"); // non-Latin1 + const CharStarContainer ssaC("\xe0\xa4\xb7"); // Higher BMP + const CharStarContainer chakmaZeroC("\xf0\x91\x84\xb6"); // Non-BMP + + QTest::newRow("null-insert-0-theta") << null << smallThetaC << 0 << smallTheta; + QTest::newRow("null-insert-0-ssa") << null << ssaC << 0 << ssa; + QTest::newRow("null-insert-0-chakma") << null << chakmaZeroC << 0 << chakmaZero; + + QTest::newRow("empty-insert-0-theta") << empty << smallThetaC << 0 << smallTheta; + QTest::newRow("empty-insert-0-ssa") << empty << ssaC << 0 << ssa; + QTest::newRow("empty-insert-0-chakma") << empty << chakmaZeroC << 0 << chakmaZero; + + QTest::newRow("theta-insert-0-null") << smallTheta << nullC << 0 << smallTheta; + QTest::newRow("ssa-insert-0-null") << ssa << nullC << 0 << ssa; + QTest::newRow("chakma-insert-0-null") << chakmaZero << nullC << 0 << chakmaZero; + + QTest::newRow("theta-insert-0-empty") << smallTheta << emptyC << 0 << smallTheta; + QTest::newRow("ssa-insert-0-empty") << ssa << emptyC << 0 << ssa; + QTest::newRow("chakma-insert-0-empty") << chakmaZero << emptyC << 0 << chakmaZero; + + QTest::newRow("a-insert-0-theta") << a << smallThetaC << 0 << smallThetaA; + QTest::newRow("a-insert-0-ssa") << a << ssaC << 0 << ssaA; + QTest::newRow("a-insert-0-chakma") << a << chakmaZeroC << 0 << chakmaZeroA; + QTest::newRow("yumlaut-insert-0-theta") << yumlaut << smallThetaC << 0 << thetaUmlaut; + QTest::newRow("theta-insert-0-yumlaut") << smallTheta << yumlautC << 0 << umlautTheta; + QTest::newRow("ssa-insert-0-chakma") << ssa << chakmaZeroC << 0 << chakmaSsa; + QTest::newRow("chakma-insert-0-ssa") << chakmaZero << ssaC << 0 << ssaChakma; + + QTest::newRow("theta-insert-1-null") << smallTheta << nullC << 1 << smallTheta; + QTest::newRow("ssa-insert-1-null") << ssa << nullC << 1 << ssa; + QTest::newRow("chakma-insert-1-null") << chakmaZero << nullC << 1 << chakmaZero; + + QTest::newRow("theta-insert-1-empty") << smallTheta << emptyC << 1 << smallTheta; + QTest::newRow("ssa-insert-1-empty") << ssa << emptyC << 1 << ssa; + QTest::newRow("chakma-insert-1-empty") << chakmaZero << emptyC << 1 << chakmaZero; + + QTest::newRow("a-insert-1-theta") << a << smallThetaC << 1 << aSmallTheta; + QTest::newRow("a-insert-1-ssa") << a << ssaC << 1 << aSsa; + QTest::newRow("a-insert-1-chakma") << a << chakmaZeroC << 1 << aChakmaZero; + QTest::newRow("yumlaut-insert-1-theta") << yumlaut << smallThetaC << 1 << umlautTheta; + QTest::newRow("theta-insert-1-yumlaut") << smallTheta << yumlautC << 1 << thetaUmlaut; + QTest::newRow("ssa-insert-1-chakma") << ssa << chakmaZeroC << 1 << ssaChakma; + // Beware, this will insert ssa right into the middle of the chakma: + // Actual (s) : "\uD804\u0937\uDD36" + // Expected (expected): "\uD804\uDD36\u0937" + // QTest::newRow("chakma.insert(1, ssa)") << chakmaZero << ssaC << 1 << chakmaSsa; + } } void tst_QString::insert_special_cases()