summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorGiuseppe D'Angelo <giuseppe.dangelo@kdab.com>2019-12-16 20:09:25 +0100
committerGiuseppe D'Angelo <giuseppe.dangelo@kdab.com>2020-01-11 19:28:50 +0100
commit577d698b8e72bc0969ae7545a1a56d3a3d08bdda (patch)
treece87b65fa7891e20248b1ad939dca5feb4e2970b /tests
parentc584380c6901b1bcd9f8100fa1087b09d3cb023d (diff)
QString::isLower/isUpper: redo the implementation
Use QStringIterator rather than indexed loops. This fixes handling of non-BMP code points (which may be lower or uppercase, see the test). Change also the semantics of the functions, adopting Unicode Β§3.13 definitions: a string is lowercase/uppercase if it's equal to its own toLower/toUpper folding. As a side effect, empty strings are now correctly reported to be lowercase AND uppercase. [ChangeLog][Important Behavior Changes] The semantics of QString::isLower() and QString::isUpper() have been changed to match the Unicode specification. Now lowercase (resp. uppercase) strings are allowed to contain any character; a string is considered lowercase (resp. uppercase) if it's equal to its own toLower() (resp. toUpper()) folding. Previously, a non-letter character would make the string not lowercase nor uppercase, and the mere presence of an uppercase (resp. lowercase) letter would make isLower() (resp. isUpper()) return false, even if the letter wouldn't change under case folding. As a consequence, now empty strings are lowercase and uppercase. [ChangeLog][QtCore][QString] Fixed a number of bugs of QString::isLower() and QString::isUpper(). Empty strings are now correctly reported to be lowercase (resp. uppercase), and strings containing code points outside the BMP are now correctly handled. Note that the behavior of these functions has also been changed. Change-Id: Iba1398279a072399a9f21295fe75f6e414f3f813 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/corelib/text/qstring/tst_qstring.cpp119
1 files changed, 79 insertions, 40 deletions
diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp
index 2108e99f20..7ea93a87d6 100644
--- a/tests/auto/corelib/text/qstring/tst_qstring.cpp
+++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp
@@ -459,8 +459,8 @@ private slots:
void trimmed();
void toUpper();
void toLower();
- void isUpper();
- void isLower();
+ void isLower_isUpper_data();
+ void isLower_isUpper();
void toCaseFolded();
void rightJustified();
void leftJustified();
@@ -2311,44 +2311,83 @@ void tst_QString::toLower()
#endif // icu
}
-void tst_QString::isUpper()
-{
- QVERIFY(!QString().isUpper());
- QVERIFY(!QString("").isUpper());
- QVERIFY(QString("TEXT").isUpper());
- QVERIFY(!QString("text").isUpper());
- QVERIFY(!QString("Text").isUpper());
- QVERIFY(!QString("tExt").isUpper());
- QVERIFY(!QString("teXt").isUpper());
- QVERIFY(!QString("texT").isUpper());
- QVERIFY(!QString("TExt").isUpper());
- QVERIFY(!QString("teXT").isUpper());
- QVERIFY(!QString("tEXt").isUpper());
- QVERIFY(!QString("tExT").isUpper());
- QVERIFY(!QString("@ABYZ[").isUpper());
- QVERIFY(!QString("@abyz[").isUpper());
- QVERIFY(!QString("`ABYZ{").isUpper());
- QVERIFY(!QString("`abyz{").isUpper());
-}
-
-void tst_QString::isLower()
-{
- QVERIFY(!QString().isLower());
- QVERIFY(!QString("").isLower());
- QVERIFY(QString("text").isLower());
- QVERIFY(!QString("Text").isLower());
- QVERIFY(!QString("tExt").isLower());
- QVERIFY(!QString("teXt").isLower());
- QVERIFY(!QString("texT").isLower());
- QVERIFY(!QString("TExt").isLower());
- QVERIFY(!QString("teXT").isLower());
- QVERIFY(!QString("tEXt").isLower());
- QVERIFY(!QString("tExT").isLower());
- QVERIFY(!QString("TEXT").isLower());
- QVERIFY(!QString("@ABYZ[").isLower());
- QVERIFY(!QString("@abyz[").isLower());
- QVERIFY(!QString("`ABYZ{").isLower());
- QVERIFY(!QString("`abyz{").isLower());
+void tst_QString::isLower_isUpper_data()
+{
+ QTest::addColumn<QString>("string");
+ QTest::addColumn<bool>("isLower");
+ QTest::addColumn<bool>("isUpper");
+
+ int row = 0;
+ QTest::addRow("lower-and-upper-%02d", row++) << QString() << true << true;
+ QTest::addRow("lower-and-upper-%02d", row++) << QString("") << true << true;
+ QTest::addRow("lower-and-upper-%02d", row++) << QString(" ") << true << true;
+ QTest::addRow("lower-and-upper-%02d", row++) << QString("123") << true << true;
+ QTest::addRow("lower-and-upper-%02d", row++) << QString("@123$#") << true << true;
+ QTest::addRow("lower-and-upper-%02d", row++) << QString("π„žπ„΄π†β™«") << true << true; // Unicode Block 'Musical Symbols'
+ // not foldable
+ QTest::addRow("lower-and-upper-%02d", row++) << QString("πšŠπš‹πšŒπšπšŽ") << true << true; // MATHEMATICAL MONOSPACE SMALL A, ... E
+ QTest::addRow("lower-and-upper-%02d", row++) << QString("𝙖,𝙗,π™˜,𝙙,π™š") << true << true; // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A, ... E
+ QTest::addRow("lower-and-upper-%02d", row++) << QString("π—”π—•π—–π——π—˜") << true << true; // MATHEMATICAL SANS-SERIF BOLD CAPITAL A, ... E
+ QTest::addRow("lower-and-upper-%02d", row++) << QString("𝐀,𝐁,𝐂,𝐃,𝐄") << true << true; // MATHEMATICAL BOLD CAPITAL A, ... E
+
+ row = 0;
+ QTest::addRow("only-lower-%02d", row++) << QString("text") << true << false;
+ QTest::addRow("only-lower-%02d", row++) << QString("Γ aa") << true << false;
+ QTest::addRow("only-lower-%02d", row++) << QString("øæß") << true << false;
+ QTest::addRow("only-lower-%02d", row++) << QString("text ") << true << false;
+ QTest::addRow("only-lower-%02d", row++) << QString(" text") << true << false;
+ QTest::addRow("only-lower-%02d", row++) << QString("hello, world!") << true << false;
+ QTest::addRow("only-lower-%02d", row++) << QString("123@abyz[") << true << false;
+ QTest::addRow("only-lower-%02d", row++) << QString("`abyz{") << true << false;
+ QTest::addRow("only-lower-%02d", row++) << QString("a𝙖a|b𝙗b|cπ™˜c|d𝙙d|eπ™še") << true << false; // MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A, ... E
+ QTest::addRow("only-lower-%02d", row++) << QString("𐐨") << true << false; // DESERET SMALL LETTER LONG I
+ // uppercase letters, not foldable
+ QTest::addRow("only-lower-%02d", row++) << QString("text𝗔text") << true << false; // MATHEMATICAL SANS-SERIF BOLD CAPITAL A
+
+ row = 0;
+ QTest::addRow("only-upper-%02d", row++) << QString("TEXT") << false << true;
+ QTest::addRow("only-upper-%02d", row++) << QString("Γ€AA") << false << true;
+ QTest::addRow("only-upper-%02d", row++) << QString("Γ˜Γ†αΊž") << false << true;
+ QTest::addRow("only-upper-%02d", row++) << QString("TEXT ") << false << true;
+ QTest::addRow("only-upper-%02d", row++) << QString(" TEXT") << false << true;
+ QTest::addRow("only-upper-%02d", row++) << QString("HELLO, WORLD!") << false << true;
+ QTest::addRow("only-upper-%02d", row++) << QString("123@ABYZ[") << false << true;
+ QTest::addRow("only-upper-%02d", row++) << QString("`ABYZ{") << false << true;
+ QTest::addRow("only-upper-%02d", row++) << QString("A𝐀A|B𝐁B|C𝐂C|D𝐃D|E𝐄E") << false << true; // MATHEMATICAL BOLD CAPITAL A, ... E
+ QTest::addRow("only-upper-%02d", row++) << QString("𐐀") << false << true; // DESERET CAPITAL LETTER LONG I
+ // lowercase letters, not foldable
+ QTest::addRow("only-upper-%02d", row++) << QString("TEXT𝚊TEXT") << false << true; // MATHEMATICAL MONOSPACE SMALL A
+
+ row = 0;
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("Text") << false << false;
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("tExt") << false << false;
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("teXt") << false << false;
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("texT") << false << false;
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("TExt") << false << false;
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("teXT") << false << false;
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("tEXt") << false << false;
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("tExT") << false << false;
+ // not foldable
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("TEXT𝚊text") << false << false; // MATHEMATICAL MONOSPACE SMALL A
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("text𝗔TEXT") << false << false; // MATHEMATICAL SANS-SERIF BOLD CAPITAL A
+ // titlecase, foldable
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("abcLjdef") << false << false; // LATIN CAPITAL LETTER L WITH SMALL LETTER J
+ QTest::addRow("not-lower-nor-upper-%02d", row++) << QString("ABCLjDEF") << false << false; // LATIN CAPITAL LETTER L WITH SMALL LETTER J
+}
+
+void tst_QString::isLower_isUpper()
+{
+ QFETCH(QString, string);
+ QFETCH(bool, isLower);
+ QFETCH(bool, isUpper);
+
+ QCOMPARE(string.isLower(), isLower);
+ QCOMPARE(string.toLower() == string, isLower);
+ QVERIFY(string.toLower().isLower());
+
+ QCOMPARE(string.isUpper(), isUpper);
+ QCOMPARE(string.toUpper() == string, isUpper);
+ QVERIFY(string.toUpper().isUpper());
}
void tst_QString::toCaseFolded()