File indexing completed on 2024-03-24 15:25:30

0001 /*
0002     This file is part of the KDE project
0003 
0004     SPDX-FileCopyrightText: 2004 David Faure <faure@kde.org>
0005     SPDX-FileCopyrightText: 2009 Thomas McGuire <mcguire@kde.org>
0006 
0007     SPDX-License-Identifier: LGPL-2.0-only
0008 */
0009 // krazy:excludeall=contractions
0010 
0011 #include "kemailaddresstest.h"
0012 
0013 #include "../src/kemailaddress.h"
0014 
0015 #include <QDebug>
0016 #include <QUrl>
0017 
0018 #include <QTest>
0019 
0020 QTEST_MAIN(KEmailAddressTest)
0021 
0022 using namespace KEmailAddress;
0023 
0024 Q_DECLARE_METATYPE(EmailParseResult)
0025 
0026 void KEmailAddressTest::testGetNameAndEmail()
0027 {
0028     QFETCH(QString, input);
0029     QFETCH(QString, expName);
0030     QFETCH(QString, expEmail);
0031     QFETCH(bool, expRetVal);
0032 
0033     QString name;
0034     QString email;
0035     bool retVal = extractEmailAddressAndName(input, email, name);
0036     QCOMPARE(retVal, expRetVal);
0037     QCOMPARE(name, expName);
0038     QCOMPARE(email, expEmail);
0039 }
0040 
0041 void KEmailAddressTest::testGetNameAndEmail_data()
0042 {
0043     QTest::addColumn<QString>("input");
0044     QTest::addColumn<QString>("expName");
0045     QTest::addColumn<QString>("expEmail");
0046     QTest::addColumn<bool>("expRetVal");
0047 
0048     QTest::newRow("Empty input") << QString() << QString() << QString() << false;
0049     QTest::newRow("Email only") << "faure@kde.org" << QString() << "faure@kde.org" << false;
0050     QTest::newRow("Normal case") << "David Faure <faure@kde.org>"
0051                                  << "David Faure"
0052                                  << "faure@kde.org" << true;
0053     QTest::newRow("Double-quotes 1") << "\"Faure, David\" <faure@kde.org>"
0054                                      << "Faure, David"
0055                                      << "faure@kde.org" << true;
0056     QTest::newRow("Double-quotes 2") << "<faure@kde.org> \"David Faure\""
0057                                      << "David Faure"
0058                                      << "faure@kde.org" << true;
0059     QTest::newRow("Parenthesis 1") << "faure@kde.org (David Faure)"
0060                                    << "David Faure"
0061                                    << "faure@kde.org" << true;
0062     QTest::newRow("Parenthesis 2") << "(David Faure) faure@kde.org"
0063                                    << "David Faure"
0064                                    << "faure@kde.org" << true;
0065     QTest::newRow("Parenthesis 3") << "My Name (me) <me@home.net>"
0066                                    << "My Name (me)"
0067                                    << "me@home.net" << true; // #93513
0068 
0069     // As per https://intevation.de/roundup/kolab/issue858
0070     QTest::newRow("Nested parenthesis") << "faure@kde.org (David (The Man) Faure)"
0071                                         << "David (The Man) Faure"
0072                                         << "faure@kde.org" << true;
0073     QTest::newRow("Double-quotes inside parenthesis 1") << "faure@kde.org (David \"Crazy\" Faure)"
0074                                                         << "David \"Crazy\" Faure"
0075                                                         << "faure@kde.org" << true;
0076     QTest::newRow("Double-quotes inside parenthesis 2") << "(David \"Crazy\" Faure) faure@kde.org"
0077                                                         << "David \"Crazy\" Faure"
0078                                                         << "faure@kde.org" << true;
0079     QTest::newRow("Parenthesis inside double-quotes 1") << "\"Faure (David)\" <faure@kde.org>"
0080                                                         << "Faure (David)"
0081                                                         << "faure@kde.org" << true;
0082     QTest::newRow("Parenthesis inside double-quotes 2") << "<faure@kde.org> \"Faure (David)\""
0083                                                         << "Faure (David)"
0084                                                         << "faure@kde.org" << true;
0085     QTest::newRow("Space in email") << "David Faure < faure@kde.org >"
0086                                     << "David Faure"
0087                                     << "faure@kde.org" << true;
0088     QTest::newRow("'@' in name 1") << "faure@kde.org (a@b)"
0089                                    << "a@b"
0090                                    << "faure@kde.org" << true;
0091     QTest::newRow("'@' in name 2") << "\"a@b\" <faure@kde.org>"
0092                                    << "a@b"
0093                                    << "faure@kde.org" << true;
0094 
0095     // While typing, when there's no '@' yet
0096     QTest::newRow("while typing 1") << "foo"
0097                                     << "foo" << QString() << false;
0098     QTest::newRow("while typing 2") << "foo <"
0099                                     << "foo" << QString() << false;
0100     QTest::newRow("while typing 3") << "foo <b"
0101                                     << "foo"
0102                                     << "b" << true;
0103 
0104     // If multiple emails are there, only return the first one
0105     QTest::newRow("multiple emails") << "\"Faure, David\" <faure@kde.org>, KHZ <khz@khz.khz>"
0106                                      << "Faure, David"
0107                                      << "faure@kde.org" << true;
0108 
0109     QTest::newRow("domain literals") << "Matt Douhan <matt@[123.123.123.123]>"
0110                                      << "Matt Douhan"
0111                                      << "matt@[123.123.123.123]" << true;
0112     QTest::newRow("@ inside the comment") << "\"Matt@Douhan\" <matt@fruitsalad.org>"
0113                                           << "Matt@Douhan"
0114                                           << "matt@fruitsalad.org" << true;
0115     QTest::newRow("No '@'") << "foo <distlist>"
0116                             << "foo"
0117                             << "distlist" << true;
0118     QTest::newRow("Backslash in display name") << "\"Lastname\\, Firstname\""
0119                                                   " <firstname@lastname.com>"
0120                                                << "Lastname, Firstname"
0121                                                << "firstname@lastname.com" << true;
0122     QTest::newRow("# in domain") << "Matt Douhan <dm3tt@db0zdf.#rpl.deu.eu>"
0123                                  << "Matt Douhan"
0124                                  << "dm3tt@db0zdf.#rpl.deu.eu" << true;
0125 }
0126 
0127 void KEmailAddressTest::testIsValidEmailAddress()
0128 {
0129     QFETCH(QString, input);
0130     QFETCH(EmailParseResult, expErrorCode);
0131 
0132     QCOMPARE(isValidAddress(input), expErrorCode);
0133 }
0134 
0135 void KEmailAddressTest::testIsValidEmailAddress_data()
0136 {
0137     QTest::addColumn<QString>("input");
0138     QTest::addColumn<EmailParseResult>("expErrorCode");
0139 
0140     // Too many @'s
0141     QTest::newRow("1") << "matt@@fruitsalad.org" << TooManyAts;
0142 
0143     // Too few @'s
0144     QTest::newRow("2") << "mattfruitsalad.org" << TooFewAts;
0145 
0146     // An empty string
0147     QTest::newRow("3") << QString() << AddressEmpty;
0148 
0149     // email address starting with a @
0150     QTest::newRow("4") << "@mattfruitsalad.org" << MissingLocalPart;
0151 
0152     // make sure that starting @ and an additional @ in the same email address don't conflict
0153     // trap the starting @ first and break
0154     QTest::newRow("5") << "@matt@fruitsalad.org" << MissingLocalPart;
0155 
0156     // email address ending with a @
0157     QTest::newRow("6") << "mattfruitsalad.org@" << MissingDomainPart;
0158 
0159     // make sure that ending with@ and an additional @ in the email address don't conflict
0160     QTest::newRow("7") << "matt@fruitsalad.org@" << MissingDomainPart;
0161 
0162     // unbalanced Parens
0163     QTest::newRow("8") << "mattjongel)@fruitsalad.org" << UnbalancedParens;
0164 
0165     // unbalanced Parens the other way around
0166     QTest::newRow("9") << "mattjongel(@fruitsalad.org" << UnbalancedParens;
0167 
0168     // Correct parens just to make sure it works
0169     QTest::newRow("10") << "matt(jongel)@fruitsalad.org" << AddressOk;
0170 
0171     // Check that anglebrackets are closed
0172     QTest::newRow("11") << "matt douhan<matt@fruitsalad.org" << UnclosedAngleAddr;
0173 
0174     // Check that angle brackets are closed the other way around
0175     QTest::newRow("12") << "matt douhan>matt@fruitsalad.org" << UnopenedAngleAddr;
0176 
0177     // Check that angle brackets are closed the other way around, and anglebrackets in domainpart
0178     // instead of local part
0179     QTest::newRow("13") << "matt douhan matt@<fruitsalad.org" << UnclosedAngleAddr;
0180 
0181     // check that a properly formatted anglebrackets situation is OK
0182     QTest::newRow("14") << "matt douhan<matt@fruitsalad.org>" << AddressOk;
0183 
0184     // a full email address with comments angle brackets and the works should be valid too
0185     QTest::newRow("15") << "Matt (jongel) Douhan <matt@fruitsalad.org>" << AddressOk;
0186 
0187     // Double quotes
0188     QTest::newRow("16") << "\"Matt Douhan\" <matt@fruitsalad.org>" << AddressOk;
0189 
0190     // Double quotes inside parens
0191     QTest::newRow("17") << "Matt (\"jongel\") Douhan <matt@fruitsalad.org>" << AddressOk;
0192 
0193     // DOuble quotes not closed
0194     QTest::newRow("18") << "Matt \"jongel Douhan <matt@fruitsalad.org>" << UnbalancedQuote;
0195 
0196     // Parens inside double quotes
0197     QTest::newRow("19") << "Matt \"(jongel)\" Douhan <matt@fruitsalad.org>" << AddressOk;
0198 
0199     // Space in email
0200     QTest::newRow("20") << "Matt Douhan < matt@fruitsalad.org >" << AddressOk;
0201 
0202     // @ is allowed inisde doublequotes
0203     QTest::newRow("21") << "\"matt@jongel\" <matt@fruitsalad.org>" << AddressOk;
0204 
0205     // anglebrackets inside dbl quotes
0206     QTest::newRow("22") << "\"matt<blah blah>\" <matt@fruitsalad.org>" << AddressOk;
0207 
0208     // a , inside a double quoted string is OK, how do I know this? well Ingo says so
0209     // and it makes sense since it is also a separator of email addresses
0210     QTest::newRow("23") << "\"Douhan, Matt\" <matt@fruitsalad.org>" << AddressOk;
0211 
0212     // Domains literals also need to work
0213     QTest::newRow("24") << "Matt Douhan <matt@[123.123.123.123]>" << AddressOk;
0214 
0215     // Typo in domain literal address
0216     QTest::newRow("25") << "Matt Douhan <matt@[123.123.123,123]>" << UnexpectedComma;
0217 
0218     // Some more insane tests but still valid so they must work
0219     QTest::newRow("26") << "Matt Douhan <\"m@att\"@jongel.com>" << AddressOk;
0220 
0221     // BUG 99657
0222     QTest::newRow("27") << "matt@jongel.fibbel.com" << AddressOk;
0223 
0224     // BUG 98720
0225     QTest::newRow("28") << "mailto:@mydomain" << DisallowedChar;
0226 
0227     // correct error msg when a comma is inside <>
0228     QTest::newRow("29") << "Matt Douhan <matt@fruitsalad,org>" << UnexpectedComma;
0229 
0230     // several commentlevels
0231     QTest::newRow("30") << "Matt Douhan (hey(jongel)fibbel) <matt@fruitsalad.org>" << AddressOk;
0232 
0233     // several comment levels and one (the outer) being unbalanced
0234     QTest::newRow("31") << "Matt Douhan (hey(jongel)fibbel <matt@fruitsalad.org>" << UnbalancedParens;
0235 
0236     // several comment levels and one (the inner) being unbalanced
0237     QTest::newRow("32") << "Matt Douhan (hey(jongelfibbel) <matt@fruitsalad.org>" << UnbalancedParens;
0238 
0239     // an error inside a double quote is no error
0240     QTest::newRow("33") << "Matt Douhan \"(jongel\" <matt@fruitsalad.org>" << AddressOk;
0241 
0242     // inside a quoted string double quotes are only allowed in pairs as per rfc2822
0243     QTest::newRow("34") << "Matt Douhan \"jongel\"fibbel\" <matt@fruitsalad.org>" << UnbalancedQuote;
0244 
0245     // a questionmark is valid in an atom
0246     QTest::newRow("35") << "Matt? <matt@fruitsalad.org>" << AddressOk;
0247 
0248     // weird but OK
0249     QTest::newRow("36") << "\"testing, \\\"testing\" <matt@fruitsalad.org>" << AddressOk;
0250 
0251     // escape a quote to many to see if it makes it invalid
0252     QTest::newRow("37") << "\"testing, \\\"testing\\\" <matt@fruitsalad.org>" << UnbalancedQuote;
0253 
0254     // escape a parens and thus make a comma appear
0255     QTest::newRow("38") << "Matt (jongel, fibbel\\) <matt@fruitsalad.org>" << UnbalancedParens;
0256 
0257     // several errors inside doublequotes
0258     QTest::newRow("39") << "Matt \"(jongel,\\\" < fibbel\\)\" <matt@fruitsalad.org>" << AddressOk;
0259 
0260     // BUG 105705
0261     QTest::newRow("40") << "matt-@fruitsalad.org" << AddressOk;
0262 
0263     // underscore at the end of local part
0264     QTest::newRow("41") << "matt_@fruitsalad.org" << AddressOk;
0265 
0266     // how about ( comment ) in the domain part
0267     QTest::newRow("42") << "matt_@(this is a cool host)fruitsalad.org" << AddressOk;
0268 
0269     // To quote rfc2822 the test below is aesthetically displeasing, but perfectly legal.
0270     QTest::newRow("43") << "Pete(A wonderful \\) chap) <pete(his account)@silly.test(his host)>" << AddressOk;
0271 
0272     // quoted pair or not quoted pair
0273     QTest::newRow("44") << "\"jongel '\\\" fibbel\" <matt@fruitsalad.org>" << AddressOk;
0274     QTest::newRow("45") << "\"jongel '\" fibbel\" <matt@fruitsalad.org>" << UnbalancedQuote;
0275 
0276     // full atext support according to rfc2822
0277     QTest::newRow("46") << "!matt@fruitsalad.org" << AddressOk;
0278     QTest::newRow("47") << "#matt@fruitsalad.org" << AddressOk;
0279     QTest::newRow("48") << "$matt@fruitsalad.org" << AddressOk;
0280     QTest::newRow("49") << "%matt@fruitsalad.org" << AddressOk;
0281     QTest::newRow("50") << "&matt@fruitsalad.org" << AddressOk;
0282     QTest::newRow("51") << "'matt@fruitsalad.org" << AddressOk;
0283     QTest::newRow("52") << "*matt@fruitsalad.org" << AddressOk;
0284     QTest::newRow("53") << "+matt@fruitsalad.org" << AddressOk;
0285     QTest::newRow("54") << "/matt@fruitsalad.org" << AddressOk;
0286     QTest::newRow("55") << "=matt@fruitsalad.org" << AddressOk;
0287     QTest::newRow("56") << "?matt@fruitsalad.org" << AddressOk;
0288     QTest::newRow("57") << "^matt@fruitsalad.org" << AddressOk;
0289     QTest::newRow("58") << "_matt@fruitsalad.org" << AddressOk;
0290     QTest::newRow("59") << "-matt@fruitsalad.org" << AddressOk;
0291     QTest::newRow("60") << "`matt@fruitsalad.org" << AddressOk;
0292     QTest::newRow("61") << "{matt@fruitsalad.org" << AddressOk;
0293     QTest::newRow("62") << "|matt@fruitsalad.org" << AddressOk;
0294     QTest::newRow("63") << "}matt@fruitsalad.org" << AddressOk;
0295     QTest::newRow("64") << "~matt@fruitsalad.org" << AddressOk;
0296     QTest::newRow("65") << "matt%matt@fruitsalad.org" << AddressOk;
0297 
0298     // bug 105405
0299     QTest::newRow("66") << "[foobar] <matt@fruitsalad.org>" << InvalidDisplayName;
0300     QTest::newRow("67") << "matt \"[foobar]\" Douhan <matt@fruitsalad.org>" << AddressOk;
0301 
0302     QTest::newRow("68") << "Matt Douhan <matt\"@@\"fruitsalad.org>" << TooFewAts;
0303 
0304     QTest::newRow("# in domain") << "dm3tt@db0zdf.#rpl.deu.eu" << AddressOk;
0305     QTest::newRow("dot at the end") << "msadmin@guug.de." << AddressOk;
0306     QTest::newRow("dot at the end with brackets") << "Martin Schulte <martin.schulte@guug.de.>" << AddressOk;
0307 
0308     // TODO this should be a valid email address, but the checking for missing dots broke it.
0309     // QTest::newRow( "valid email address without dots" ) << "user@localhost" << AddressOk;
0310 }
0311 
0312 void KEmailAddressTest::testIsValidAddressList()
0313 {
0314     QFETCH(QString, list);
0315     QFETCH(EmailParseResult, expErrorCode);
0316 
0317     QString badAddress;
0318     QCOMPARE(isValidAddressList(list, badAddress), expErrorCode);
0319 }
0320 
0321 void KEmailAddressTest::testIsValidAddressList_data()
0322 {
0323     QTest::addColumn<QString>("list");
0324     QTest::addColumn<EmailParseResult>("expErrorCode");
0325 
0326     // bug  139477
0327     QTest::newRow("1") << "martin.schulte@guug.de, msadmin@guug.de,"
0328                           " msnewsletter@guug.de"
0329                        << AddressOk;
0330     QTest::newRow("2") << "martin.schulte@guug.de; msadmin@guug.de;"
0331                           " msnewsletter@guug.de"
0332                        << AddressOk;
0333     QTest::newRow("3") << "martin.schulte@guug.de, msadmin@guug.de.,"
0334                           " msnewsletter@guug.de"
0335                        << AddressOk;
0336     QTest::newRow("4") << "Martin Schulte <martin.schulte@guug.de>,"
0337                           " MS Admin <msadmin@guug.de>, MS News <msnewsletter@guug.de>"
0338                        << AddressOk;
0339     QTest::newRow("5") << "Martin Schulte <martin.schulte@guug.de>;"
0340                           " MS Admin <msadmin@guug.de>; MS News <msnewsletter@guug.de>"
0341                        << AddressOk;
0342     QTest::newRow("6") << "Martin Schulte <martin.schulte@guug.de.>,"
0343                           " MS Admin <msadmin@guug.de>, MS News <msnewsletter@guug.de>"
0344                        << AddressOk;
0345 }
0346 
0347 void KEmailAddressTest::testIsValidSimpleEmailAddress()
0348 {
0349     QFETCH(QString, input);
0350     QFETCH(bool, expResult);
0351 
0352     QCOMPARE(isValidSimpleAddress(input), expResult);
0353 }
0354 
0355 void KEmailAddressTest::testIsValidSimpleEmailAddress_data()
0356 {
0357     QTest::addColumn<QString>("input");
0358     QTest::addColumn<bool>("expResult");
0359 
0360     // checks for "pure" email addresses in the form of xxx@yyy.tld
0361     QTest::newRow("") << "matt@fruitsalad.org" << true;
0362     QTest::newRow("") << QStringLiteral("test@täst.invalid") << true;
0363     // non-ASCII char as first char of IDN
0364     QTest::newRow("") << QStringLiteral("i_want@øl.invalid") << true;
0365     QTest::newRow("") << "matt@[123.123.123.123]" << true;
0366     QTest::newRow("") << "matt@[3.3.3.3]" << true;
0367     QTest::newRow("") << "matt@[4.4.4.4]" << true;
0368     QTest::newRow("") << "matt@[192.168.254.254]" << true;
0369     QTest::newRow("") << "\"matt\"@fruitsalad.org" << true;
0370     QTest::newRow("") << "-matt@fruitsalad.org" << true;
0371     QTest::newRow("") << "\"-matt\"@fruitsalad.org" << true;
0372     QTest::newRow("") << "matt@jongel.fibbel.com" << true;
0373     QTest::newRow("") << "Matt Douhan <matt@fruitsalad.org>" << false;
0374     // BUG 105705
0375     QTest::newRow("") << "matt-@fibbel.com" << true;
0376     QTest::newRow("") << "matt@fibbel-is-a-geek.com" << true;
0377     QTest::newRow("") << "matt_@fibbel.com" << true;
0378     // Check the defined chars for atext according to rfc2822
0379     QTest::newRow("") << "!matt@fruitsalad.org" << true;
0380     QTest::newRow("") << "#matt@fruitsalad.org" << true;
0381     QTest::newRow("") << "$matt@fruitsalad.org" << true;
0382     QTest::newRow("") << "%matt@fruitsalad.org" << true;
0383     QTest::newRow("") << "&matt@fruitsalad.org" << true;
0384     QTest::newRow("") << "'matt@fruitsalad.org" << true;
0385     QTest::newRow("") << "*matt@fruitsalad.org" << true;
0386     QTest::newRow("") << "+matt@fruitsalad.org" << true;
0387     QTest::newRow("") << "/matt@fruitsalad.org" << true;
0388     QTest::newRow("") << "=matt@fruitsalad.org" << true;
0389     QTest::newRow("") << "?matt@fruitsalad.org" << true;
0390     QTest::newRow("") << "^matt@fruitsalad.org" << true;
0391     QTest::newRow("") << "_matt@fruitsalad.org" << true;
0392     QTest::newRow("") << "-matt@fruitsalad.org" << true;
0393     QTest::newRow("") << "`matt@fruitsalad.org" << true;
0394     QTest::newRow("") << "{matt@fruitsalad.org" << true;
0395     QTest::newRow("") << "|matt@fruitsalad.org" << true;
0396     QTest::newRow("") << "}matt@fruitsalad.org" << true;
0397     QTest::newRow("") << "~matt@fruitsalad.org" << true;
0398     // BUG 108476
0399     QTest::newRow("") << "foo+matt@fruitsalad.org" << true;
0400     QTest::newRow("") << "bar=matt@fruitsalad.org" << true;
0401     QTest::newRow("") << "jongel-matt@fruitsalad.org" << true;
0402     QTest::newRow("") << "matt-@fruitsalad.org" << true;
0403 
0404     // check if the pure email address is wrong
0405     QTest::newRow("") << "mattfruitsalad.org" << false;
0406     QTest::newRow("") << "matt@[123.123.123.123" << false;
0407     QTest::newRow("") << "matt@123.123.123.123]" << false;
0408     QTest::newRow("") << "matt@[.123.123.123]" << false;
0409     QTest::newRow("") << "matt@[123.123.123]" << false;
0410     QTest::newRow("") << "\"matt@fruitsalad.org" << false;
0411     QTest::newRow("") << "matt\"@fruitsalad.org" << false;
0412     QTest::newRow("") << QString() << false;
0413 
0414     // BUG 203881
0415     QTest::newRow("") << "2advance@my-site.com" << true;
0416 
0417     // and here some insane but still valid cases
0418     QTest::newRow("") << "\"m@tt\"@fruitsalad.org" << true;
0419 
0420     QTest::newRow("") << "matt\"@@\"fruitsalad.org" << false;
0421     QTest::newRow("# in domain") << "dm3tt@db0zdf.#rpl.deu.eu" << true;
0422 
0423     // add tests for missing local/domain parts
0424     QTest::newRow("") << "@mattfruitsalad.org" << false;
0425     QTest::newRow("") << "matt@" << false;
0426     QTest::newRow("") << "@" << false;
0427 }
0428 
0429 void KEmailAddressTest::testGetEmailAddress()
0430 {
0431     QFETCH(QString, input);
0432     QFETCH(QString, expResult);
0433 
0434     QCOMPARE(extractEmailAddress(input), expResult);
0435 }
0436 
0437 void KEmailAddressTest::testGetEmailAddress_data()
0438 {
0439     QTest::addColumn<QString>("input");
0440     QTest::addColumn<QString>("expResult");
0441 
0442     QTest::newRow("1") << "matt@fruitsalad.org"
0443                        << "matt@fruitsalad.org";
0444     QTest::newRow("2") << "Matt Douhan <matt@fruitsalad.org>"
0445                        << "matt@fruitsalad.org";
0446     QTest::newRow("3") << "\"Matt Douhan <blah blah>\" <matt@fruitsalad.org>"
0447                        << "matt@fruitsalad.org";
0448     QTest::newRow("4") << "\"Matt <blah blah>\" <matt@fruitsalad.org>"
0449                        << "matt@fruitsalad.org";
0450     QTest::newRow("5") << "Matt Douhan (jongel) <matt@fruitsalad.org" << QString();
0451     QTest::newRow("6") << "Matt Douhan (m@tt) <matt@fruitsalad.org>"
0452                        << "matt@fruitsalad.org";
0453     QTest::newRow("7") << "\"Douhan, Matt\" <matt@fruitsalad.org>"
0454                        << "matt@fruitsalad.org";
0455     QTest::newRow("8") << "\"Matt Douhan (m@tt)\" <matt@fruitsalad.org>"
0456                        << "matt@fruitsalad.org";
0457     QTest::newRow("9") << "\"Matt Douhan\" (matt <matt@fruitsalad.org>" << QString();
0458     QTest::newRow("10") << "Matt Douhan <matt@[123.123.123.123]>"
0459                         << "matt@[123.123.123.123]";
0460     QTest::newRow("11") << "dm3tt@db0zdf.#rpl.deu.eu"
0461                         << "dm3tt@db0zdf.#rpl.deu.eu";
0462 }
0463 
0464 void KEmailAddressTest::testCheckSplitEmailAddrList()
0465 {
0466     QFETCH(QString, input);
0467     QFETCH(QStringList, expResult);
0468 
0469     QCOMPARE(splitAddressList(input), expResult);
0470 }
0471 
0472 void KEmailAddressTest::testCheckSplitEmailAddrList_data()
0473 {
0474     QTest::addColumn<QString>("input");
0475     QTest::addColumn<QStringList>("expResult");
0476 
0477     QTest::newRow("") << "kloecker@kde.org (Kloecker, Ingo)" << (QStringList() << QStringLiteral("kloecker@kde.org (Kloecker, Ingo)"));
0478     QTest::newRow("") << "Matt Douhan <matt@fruitsalad.org>, Foo Bar <foo@bar.com>"
0479                       << (QStringList() << QStringLiteral("Matt Douhan <matt@fruitsalad.org>") << QStringLiteral("Foo Bar <foo@bar.com>"));
0480     QTest::newRow("") << "\"Matt, Douhan\" <matt@fruitsalad.org>, Foo Bar <foo@bar.com>"
0481                       << (QStringList() << QStringLiteral("\"Matt, Douhan\" <matt@fruitsalad.org>") << QStringLiteral("Foo Bar <foo@bar.com>"));
0482     QTest::newRow("") << "\"Lastname\\, Firstname\" <firstname.lastname@example.com>"
0483                       << (QStringList() << QStringLiteral("\"Lastname\\, Firstname\" <firstname.lastname@example.com>"));
0484     QTest::newRow("") << "First Collective Last <collectivename.lastname@example.com>" // Uses non-ASCII spacing
0485                       << (QStringList() << QStringLiteral("First Collective Last <collectivename.lastname@example.com>"));
0486     QTest::newRow("") << "Foo Bar <foo@bar.com>, First Collective Last <collectivename.lastname@example.com>" // Uses non-ASCII spacing
0487                       << (QStringList() << QStringLiteral("Foo Bar <foo@bar.com>")
0488                                         << QStringLiteral("First Collective Last <collectivename.lastname@example.com>"));
0489     QTest::newRow("")
0490         << "Foo  Bar <foo@bar.com>,  \"   First  Collective Last  \"  <collectivename.lastname@example.com>" // Uses multiple and quoted surrounding spaces
0491         << (QStringList() << QStringLiteral("Foo  Bar <foo@bar.com>")
0492                           << QStringLiteral("\"   First  Collective Last  \"  <collectivename.lastname@example.com>"));
0493 }
0494 
0495 void KEmailAddressTest::testNormalizeAddressesAndEncodeIDNs()
0496 {
0497     QFETCH(QString, input);
0498     QFETCH(QString, expResult);
0499 
0500     QCOMPARE(normalizeAddressesAndEncodeIdn(input), expResult);
0501 }
0502 
0503 void KEmailAddressTest::testNormalizeAddressesAndEncodeIDNs_data()
0504 {
0505     QTest::addColumn<QString>("input");
0506     QTest::addColumn<QString>("expResult");
0507 
0508     QTest::newRow("") << "matt@fruitsalad.org"
0509                       << "matt@fruitsalad.org";
0510     QTest::newRow("") << "Matt Douhan <matt@fruitsalad.org>"
0511                       << "Matt Douhan <matt@fruitsalad.org>";
0512     QTest::newRow("") << "Matt Douhan (jongel) <matt@fruitsalad.org>"
0513                       << "Matt Douhan (jongel) <matt@fruitsalad.org>";
0514     QTest::newRow("") << "Matt Douhan (jongel,fibbel) <matt@fruitsalad.org>"
0515                       << "Matt Douhan (jongel,fibbel) <matt@fruitsalad.org>";
0516     QTest::newRow("") << "matt@fruitsalad.org (jongel,fibbel)"
0517                       << "\"jongel,fibbel\" <matt@fruitsalad.org>";
0518     QTest::newRow("") << "matt@fruitsalad.org (\"jongel,fibbel\")"
0519                       << "\"jongel,fibbel\" <matt@fruitsalad.org>";
0520 
0521     QTest::newRow("") << "First Collective Last <collectivename.lastname@example.com>" // Uses non-ASCII spacing
0522                       << "First Collective Last <collectivename.lastname@example.com>";
0523     QTest::newRow("") << "Foo Bar <foo@bar.com> , First Collective Last <collectivename.lastname@example.com>" // Uses non-ASCII spacing
0524                       << "Foo Bar <foo@bar.com>, First Collective Last <collectivename.lastname@example.com>";
0525     QTest::newRow("")
0526         << "Foo  Bar  <foo@bar.com>,  \"   First  Collective Last  \"  <collectivename.lastname@example.com>" // Uses multiple and quoted surrounding spaces
0527         << "Foo  Bar <foo@bar.com>, \"   First  Collective Last  \" <collectivename.lastname@example.com>";
0528 }
0529 
0530 void KEmailAddressTest::testNormalizeAddressesAndDecodeIDNs()
0531 {
0532     QFETCH(QString, input);
0533     QFETCH(QString, expResult);
0534 
0535     QCOMPARE(normalizeAddressesAndDecodeIdn(input), expResult);
0536 }
0537 
0538 void KEmailAddressTest::testNormalizeAddressesAndDecodeIDNs_data()
0539 {
0540     QTest::addColumn<QString>("input");
0541     QTest::addColumn<QString>("expResult");
0542 
0543     QTest::newRow("") << "=?us-ascii?Q?Surname=2C=20Name?= <nobody@example.org>"
0544                       << "\"Surname, Name\" <nobody@example.org>";
0545 
0546     QTest::newRow("") << "=?iso-8859-1?B?5Hf8b2xmLPZBbmRyZWFz?= <nobody@example.org>" << QStringLiteral("\"äwüolf,öAndreas\" <nobody@example.org>");
0547 
0548     QTest::newRow("") << QStringLiteral("\"Andreas Straß\" <nobody@example.org>") << QStringLiteral("\"Andreas Straß\" <nobody@example.org>");
0549 
0550     QTest::newRow("") << QStringLiteral("\"András\" \"Manţia\" <amantia@kde.org>") << QStringLiteral("\"András\" \"Manţia\" <amantia@kde.org>");
0551 }
0552 
0553 void KEmailAddressTest::testQuoteIfNecessary()
0554 {
0555     QFETCH(QString, input);
0556     QFETCH(QString, expResult);
0557     QBENCHMARK {
0558         QCOMPARE(quoteNameIfNecessary(input), expResult);
0559     }
0560 }
0561 
0562 void KEmailAddressTest::testQuoteIfNecessary_data()
0563 {
0564     QTest::addColumn<QString>("input");
0565     QTest::addColumn<QString>("expResult");
0566 
0567     QTest::newRow("") << "Matt Douhan"
0568                       << "Matt Douhan";
0569     QTest::newRow("") << "Douhan, Matt"
0570                       << "\"Douhan, Matt\"";
0571     QTest::newRow("") << "Matt \"jongel\" Douhan"
0572                       << "\"Matt \\\"jongel\\\" Douhan\"";
0573     QTest::newRow("") << "Matt \\\"jongel\\\" Douhan"
0574                       << "\"Matt \\\"jongel\\\" Douhan\"";
0575     QTest::newRow("") << "trailing '\\\\' should never occur \\"
0576                       << "\"trailing '\\\\' should never occur \\\"";
0577     QTest::newRow("") << "\"don't quote again\""
0578                       << "\"don't quote again\"";
0579     QTest::newRow("") << "\"leading double quote"
0580                       << "\"\\\"leading double quote\"";
0581     QTest::newRow("") << "trailing double quote\""
0582                       << "\"trailing double quote\\\"\"";
0583 #if 0
0584     BEFORE: static QRegularExpression
0585       RESULT : KEmailAddressTest::testQuoteIfNecessary():
0586       0.015 msecs per iteration (total: 64, iterations: 4096)
0587       0.019 msecs per iteration (total: 80, iterations: 4096)
0588       0.019 msecs per iteration (total: 81, iterations: 4096)
0589       0.0244 msecs per iteration (total: 100, iterations: 4096)
0590       0.0079 msecs per iteration (total: 65, iterations: 8192)
0591       0.020 msecs per iteration (total: 82, iterations: 4096)
0592       0.020 msecs per iteration (total: 82, iterations: 4096)
0593 
0594       AFTER:
0595       RESULT : KEmailAddressTest::testQuoteIfNecessary():
0596       0.0097 msecs per iteration (total: 80, iterations: 8192)
0597       0.010 msecs per iteration (total: 82, iterations: 8192)
0598       0.015 msecs per iteration (total: 63, iterations: 4096)
0599       0.0076 msecs per iteration (total: 63, iterations: 8192)
0600       0.0098 msecs per iteration (total: 81, iterations: 8192)
0601       0.010 msecs per iteration (total: 87, iterations: 8192)
0602 #endif
0603 }
0604 
0605 void KEmailAddressTest::testMailtoUrls()
0606 {
0607     QFETCH(QString, input);
0608     const QUrl url = encodeMailtoUrl(input);
0609     qDebug() << url;
0610     QCOMPARE(url.scheme().toLatin1().data(), "mailto");
0611     QCOMPARE(decodeMailtoUrl(url), input);
0612     qDebug() << decodeMailtoUrl(url);
0613 }
0614 
0615 void KEmailAddressTest::testMailtoUrls_data()
0616 {
0617     QTest::addColumn<QString>("input");
0618 
0619     QTest::newRow("") << "tokoe@domain.com";
0620     QTest::newRow("") << QStringLiteral("\"Tobias König\" <tokoe@domain.com>");
0621     QTest::newRow("") << QStringLiteral("\"Alberto Simões\" <alberto@example.com");
0622     QTest::newRow("") << QStringLiteral("Alberto Simões <alberto@example.com");
0623 }
0624 
0625 #include "moc_kemailaddresstest.cpp"