diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp index 47ce067e6a..6cadac8447 100644 --- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp @@ -60,6 +60,7 @@ #include #include +#include #define CREATE_REF(string) \ const QString padded = QString::fromLatin1(" %1 ").arg(string); \ @@ -72,6 +73,9 @@ namespace { template class Arg; +template +class Reversed {}; // marker for Arg to apply the operation in reverse order (for prepend()) + class ArgBase { protected: @@ -81,7 +85,7 @@ protected: }; template <> -class Arg : ArgBase +class Arg : protected ArgBase { public: explicit Arg(const char *str) : ArgBase(str) {} @@ -91,6 +95,18 @@ public: { Q_FOREACH (QChar ch, this->pinned) (s.*mf)(ch); } }; +template <> +class Arg > : private Arg +{ +public: + explicit Arg(const char *str) : Arg(str) + { + std::reverse(this->pinned.begin(), this->pinned.end()); + } + + using Arg::apply0; +}; + template <> class Arg : ArgBase { @@ -156,6 +172,22 @@ public: } }; +template <> +class Arg > : private Arg +{ + static const char *dupAndReverse(const char *s) + { + char *s2 = qstrdup(s); + std::reverse(s2, s2 + qstrlen(s2)); + return s2; + } +public: + explicit Arg(const char *str) : Arg(dupAndReverse(str)) {} + ~Arg() { delete[] str; } + + using Arg::apply0; +}; + template <> class Arg { @@ -223,6 +255,11 @@ class tst_QString : public QObject template void append_impl() const { append_impl(); } void append_data(bool emptyIsNoop = false); + template + void prepend_impl() const { do_apply0(MemFun(&QString::prepend)); } + template + void prepend_impl() const { prepend_impl(); } + void prepend_data(bool emptyIsNoop = false); public: tst_QString(); public slots: @@ -271,9 +308,21 @@ private slots: void remove_regexp_data(); void remove_regexp(); void swap(); - void prepend(); - void prepend_bytearray_data(); - void prepend_bytearray(); + + void prepend_qstring() { prepend_impl(); } + void prepend_qstring_data() { prepend_data(true); } + void prepend_qlatin1string() { prepend_impl(); } + void prepend_qlatin1string_data() { prepend_data(true); } + void prepend_qchar() { prepend_impl, QString &(QString::*)(QChar)>(); } + void prepend_qchar_data() { prepend_data(true); } + void prepend_qbytearray() { prepend_impl(); } + void prepend_qbytearray_data() { prepend_data(true); } + void prepend_char() { prepend_impl, QString &(QString::*)(QChar)>(); } + void prepend_char_data() { prepend_data(true); } + void prepend_charstar() { prepend_impl(); } + void prepend_charstar_data() { prepend_data(true); } + void prepend_bytearray_special_cases_data(); + void prepend_bytearray_special_cases(); void append_qstring() { append_impl(); } void append_qstring_data() { append_data(); } @@ -2413,14 +2462,37 @@ void tst_QString::swap() QCOMPARE(s2,QLatin1String("s1")); } -void tst_QString::prepend() +void tst_QString::prepend_data(bool emptyIsNoop) { - QString a; - a = "<>ABCABCABCABC>"; - QCOMPARE(a.prepend("-"),(QString)"-<>ABCABCABCABC>"); + QTest::addColumn("s"); + QTest::addColumn("arg"); + QTest::addColumn("expected"); + + const CharStarContainer nullC; + const CharStarContainer emptyC(""); + const CharStarContainer aC("a"); + const CharStarContainer bC("b"); + const CharStarContainer baC("ba"); + + const QString null; + const QString empty(""); + const QString a("a"); + //const QString b("b"); + const QString ba("ba"); + + QTest::newRow("null.prepend(null)") << null << nullC << null; + QTest::newRow("null.prepend(empty)") << null << emptyC << (emptyIsNoop ? null : empty); + QTest::newRow("null.prepend(a)") << null << aC << a; + QTest::newRow("empty.prepend(null)") << empty << nullC << empty; + QTest::newRow("empty.prepend(empty)") << empty << emptyC << empty; + QTest::newRow("empty.prepend(a)") << empty << aC << a; + QTest::newRow("a.prepend(null)") << a << nullC << a; + QTest::newRow("a.prepend(empty)") << a << emptyC << a; + QTest::newRow("a.prepend(b)") << a << bC << ba; + QTest::newRow("a.prepend(ba)") << a << baC << (ba + a); } -void tst_QString::prepend_bytearray_data() +void tst_QString::prepend_bytearray_special_cases_data() { QTest::addColumn("str" ); QTest::addColumn("ba" ); @@ -2446,7 +2518,7 @@ void tst_QString::prepend_bytearray_data() QTest::newRow( "nonAsciiByteArray2") << QString() << QByteArray("\xc3\xa9") << QString::fromUtf8("\xc3\xa9"); } -void tst_QString::prepend_bytearray() +void tst_QString::prepend_bytearray_special_cases() { { QFETCH( QString, str );