/* This file is part of the KDE project SPDX-FileCopyrightText: 2004 David Faure SPDX-FileCopyrightText: 2009 Thomas McGuire SPDX-License-Identifier: LGPL-2.0-only */ // krazy:excludeall=contractions #include "kemailaddresstest.h" #include "../src/kemailaddress.h" #include #include #include QTEST_MAIN(KEmailAddressTest) using namespace KEmailAddress; Q_DECLARE_METATYPE(EmailParseResult) void KEmailAddressTest::testGetNameAndEmail() { QFETCH(QString, input); QFETCH(QString, expName); QFETCH(QString, expEmail); QFETCH(bool, expRetVal); QString name; QString email; bool retVal = extractEmailAddressAndName(input, email, name); QCOMPARE(retVal, expRetVal); QCOMPARE(name, expName); QCOMPARE(email, expEmail); } void KEmailAddressTest::testGetNameAndEmail_data() { QTest::addColumn("input"); QTest::addColumn("expName"); QTest::addColumn("expEmail"); QTest::addColumn("expRetVal"); QTest::newRow("Empty input") << QString() << QString() << QString() << false; QTest::newRow("Email only") << "faure@kde.org" << QString() << "faure@kde.org" << false; QTest::newRow("Normal case") << "David Faure " << "David Faure" << "faure@kde.org" << true; QTest::newRow("Double-quotes 1") << "\"Faure, David\" " << "Faure, David" << "faure@kde.org" << true; QTest::newRow("Double-quotes 2") << " \"David Faure\"" << "David Faure" << "faure@kde.org" << true; QTest::newRow("Parenthesis 1") << "faure@kde.org (David Faure)" << "David Faure" << "faure@kde.org" << true; QTest::newRow("Parenthesis 2") << "(David Faure) faure@kde.org" << "David Faure" << "faure@kde.org" << true; QTest::newRow("Parenthesis 3") << "My Name (me) " << "My Name (me)" << "me@home.net" << true; // #93513 // As per https://intevation.de/roundup/kolab/issue858 QTest::newRow("Nested parenthesis") << "faure@kde.org (David (The Man) Faure)" << "David (The Man) Faure" << "faure@kde.org" << true; QTest::newRow("Double-quotes inside parenthesis 1") << "faure@kde.org (David \"Crazy\" Faure)" << "David \"Crazy\" Faure" << "faure@kde.org" << true; QTest::newRow("Double-quotes inside parenthesis 2") << "(David \"Crazy\" Faure) faure@kde.org" << "David \"Crazy\" Faure" << "faure@kde.org" << true; QTest::newRow("Parenthesis inside double-quotes 1") << "\"Faure (David)\" " << "Faure (David)" << "faure@kde.org" << true; QTest::newRow("Parenthesis inside double-quotes 2") << " \"Faure (David)\"" << "Faure (David)" << "faure@kde.org" << true; QTest::newRow("Space in email") << "David Faure < faure@kde.org >" << "David Faure" << "faure@kde.org" << true; QTest::newRow("'@' in name 1") << "faure@kde.org (a@b)" << "a@b" << "faure@kde.org" << true; QTest::newRow("'@' in name 2") << "\"a@b\" " << "a@b" << "faure@kde.org" << true; // While typing, when there's no '@' yet QTest::newRow("while typing 1") << "foo" << "foo" << QString() << false; QTest::newRow("while typing 2") << "foo <" << "foo" << QString() << false; QTest::newRow("while typing 3") << "foo , KHZ " << "Faure, David" << "faure@kde.org" << true; QTest::newRow("domain literals") << "Matt Douhan " << "Matt Douhan" << "matt@[123.123.123.123]" << true; QTest::newRow("@ inside the comment") << "\"Matt@Douhan\" " << "Matt@Douhan" << "matt@fruitsalad.org" << true; QTest::newRow("No '@'") << "foo " << "foo" << "distlist" << true; QTest::newRow("Backslash in display name") << "\"Lastname\\, Firstname\"" " " << "Lastname, Firstname" << "firstname@lastname.com" << true; QTest::newRow("# in domain") << "Matt Douhan " << "Matt Douhan" << "dm3tt@db0zdf.#rpl.deu.eu" << true; } void KEmailAddressTest::testIsValidEmailAddress() { QFETCH(QString, input); QFETCH(EmailParseResult, expErrorCode); QCOMPARE(isValidAddress(input), expErrorCode); } void KEmailAddressTest::testIsValidEmailAddress_data() { QTest::addColumn("input"); QTest::addColumn("expErrorCode"); // Too many @'s QTest::newRow("1") << "matt@@fruitsalad.org" << TooManyAts; // Too few @'s QTest::newRow("2") << "mattfruitsalad.org" << TooFewAts; // An empty string QTest::newRow("3") << QString() << AddressEmpty; // email address starting with a @ QTest::newRow("4") << "@mattfruitsalad.org" << MissingLocalPart; // make sure that starting @ and an additional @ in the same email address don't conflict // trap the starting @ first and break QTest::newRow("5") << "@matt@fruitsalad.org" << MissingLocalPart; // email address ending with a @ QTest::newRow("6") << "mattfruitsalad.org@" << MissingDomainPart; // make sure that ending with@ and an additional @ in the email address don't conflict QTest::newRow("7") << "matt@fruitsalad.org@" << MissingDomainPart; // unbalanced Parens QTest::newRow("8") << "mattjongel)@fruitsalad.org" << UnbalancedParens; // unbalanced Parens the other way around QTest::newRow("9") << "mattjongel(@fruitsalad.org" << UnbalancedParens; // Correct parens just to make sure it works QTest::newRow("10") << "matt(jongel)@fruitsalad.org" << AddressOk; // Check that anglebrackets are closed QTest::newRow("11") << "matt douhanmatt@fruitsalad.org" << UnopenedAngleAddr; // Check that angle brackets are closed the other way around, and anglebrackets in domainpart // instead of local part QTest::newRow("13") << "matt douhan matt@" << AddressOk; // a full email address with comments angle brackets and the works should be valid too QTest::newRow("15") << "Matt (jongel) Douhan " << AddressOk; // Double quotes QTest::newRow("16") << "\"Matt Douhan\" " << AddressOk; // Double quotes inside parens QTest::newRow("17") << "Matt (\"jongel\") Douhan " << AddressOk; // DOuble quotes not closed QTest::newRow("18") << "Matt \"jongel Douhan " << UnbalancedQuote; // Parens inside double quotes QTest::newRow("19") << "Matt \"(jongel)\" Douhan " << AddressOk; // Space in email QTest::newRow("20") << "Matt Douhan < matt@fruitsalad.org >" << AddressOk; // @ is allowed inisde doublequotes QTest::newRow("21") << "\"matt@jongel\" " << AddressOk; // anglebrackets inside dbl quotes QTest::newRow("22") << "\"matt\" " << AddressOk; // a , inside a double quoted string is OK, how do I know this? well Ingo says so // and it makes sense since it is also a separator of email addresses QTest::newRow("23") << "\"Douhan, Matt\" " << AddressOk; // Domains literals also need to work QTest::newRow("24") << "Matt Douhan " << AddressOk; // Typo in domain literal address QTest::newRow("25") << "Matt Douhan " << UnexpectedComma; // Some more insane tests but still valid so they must work QTest::newRow("26") << "Matt Douhan <\"m@att\"@jongel.com>" << AddressOk; // BUG 99657 QTest::newRow("27") << "matt@jongel.fibbel.com" << AddressOk; // BUG 98720 QTest::newRow("28") << "mailto:@mydomain" << DisallowedChar; // correct error msg when a comma is inside <> QTest::newRow("29") << "Matt Douhan " << UnexpectedComma; // several commentlevels QTest::newRow("30") << "Matt Douhan (hey(jongel)fibbel) " << AddressOk; // several comment levels and one (the outer) being unbalanced QTest::newRow("31") << "Matt Douhan (hey(jongel)fibbel " << UnbalancedParens; // several comment levels and one (the inner) being unbalanced QTest::newRow("32") << "Matt Douhan (hey(jongelfibbel) " << UnbalancedParens; // an error inside a double quote is no error QTest::newRow("33") << "Matt Douhan \"(jongel\" " << AddressOk; // inside a quoted string double quotes are only allowed in pairs as per rfc2822 QTest::newRow("34") << "Matt Douhan \"jongel\"fibbel\" " << UnbalancedQuote; // a questionmark is valid in an atom QTest::newRow("35") << "Matt? " << AddressOk; // weird but OK QTest::newRow("36") << "\"testing, \\\"testing\" " << AddressOk; // escape a quote to many to see if it makes it invalid QTest::newRow("37") << "\"testing, \\\"testing\\\" " << UnbalancedQuote; // escape a parens and thus make a comma appear QTest::newRow("38") << "Matt (jongel, fibbel\\) " << UnbalancedParens; // several errors inside doublequotes QTest::newRow("39") << "Matt \"(jongel,\\\" < fibbel\\)\" " << AddressOk; // BUG 105705 QTest::newRow("40") << "matt-@fruitsalad.org" << AddressOk; // underscore at the end of local part QTest::newRow("41") << "matt_@fruitsalad.org" << AddressOk; // how about ( comment ) in the domain part QTest::newRow("42") << "matt_@(this is a cool host)fruitsalad.org" << AddressOk; // To quote rfc2822 the test below is aesthetically displeasing, but perfectly legal. QTest::newRow("43") << "Pete(A wonderful \\) chap) " << AddressOk; // quoted pair or not quoted pair QTest::newRow("44") << "\"jongel '\\\" fibbel\" " << AddressOk; QTest::newRow("45") << "\"jongel '\" fibbel\" " << UnbalancedQuote; // full atext support according to rfc2822 QTest::newRow("46") << "!matt@fruitsalad.org" << AddressOk; QTest::newRow("47") << "#matt@fruitsalad.org" << AddressOk; QTest::newRow("48") << "$matt@fruitsalad.org" << AddressOk; QTest::newRow("49") << "%matt@fruitsalad.org" << AddressOk; QTest::newRow("50") << "&matt@fruitsalad.org" << AddressOk; QTest::newRow("51") << "'matt@fruitsalad.org" << AddressOk; QTest::newRow("52") << "*matt@fruitsalad.org" << AddressOk; QTest::newRow("53") << "+matt@fruitsalad.org" << AddressOk; QTest::newRow("54") << "/matt@fruitsalad.org" << AddressOk; QTest::newRow("55") << "=matt@fruitsalad.org" << AddressOk; QTest::newRow("56") << "?matt@fruitsalad.org" << AddressOk; QTest::newRow("57") << "^matt@fruitsalad.org" << AddressOk; QTest::newRow("58") << "_matt@fruitsalad.org" << AddressOk; QTest::newRow("59") << "-matt@fruitsalad.org" << AddressOk; QTest::newRow("60") << "`matt@fruitsalad.org" << AddressOk; QTest::newRow("61") << "{matt@fruitsalad.org" << AddressOk; QTest::newRow("62") << "|matt@fruitsalad.org" << AddressOk; QTest::newRow("63") << "}matt@fruitsalad.org" << AddressOk; QTest::newRow("64") << "~matt@fruitsalad.org" << AddressOk; QTest::newRow("65") << "matt%matt@fruitsalad.org" << AddressOk; // bug 105405 QTest::newRow("66") << "[foobar] " << InvalidDisplayName; QTest::newRow("67") << "matt \"[foobar]\" Douhan " << AddressOk; QTest::newRow("68") << "Matt Douhan " << TooFewAts; QTest::newRow("# in domain") << "dm3tt@db0zdf.#rpl.deu.eu" << AddressOk; QTest::newRow("dot at the end") << "msadmin@guug.de." << AddressOk; QTest::newRow("dot at the end with brackets") << "Martin Schulte " << AddressOk; // TODO this should be a valid email address, but the checking for missing dots broke it. // QTest::newRow( "valid email address without dots" ) << "user@localhost" << AddressOk; } void KEmailAddressTest::testIsValidAddressList() { QFETCH(QString, list); QFETCH(EmailParseResult, expErrorCode); QString badAddress; QCOMPARE(isValidAddressList(list, badAddress), expErrorCode); } void KEmailAddressTest::testIsValidAddressList_data() { QTest::addColumn("list"); QTest::addColumn("expErrorCode"); // bug 139477 QTest::newRow("1") << "martin.schulte@guug.de, msadmin@guug.de," " msnewsletter@guug.de" << AddressOk; QTest::newRow("2") << "martin.schulte@guug.de; msadmin@guug.de;" " msnewsletter@guug.de" << AddressOk; QTest::newRow("3") << "martin.schulte@guug.de, msadmin@guug.de.," " msnewsletter@guug.de" << AddressOk; QTest::newRow("4") << "Martin Schulte ," " MS Admin , MS News " << AddressOk; QTest::newRow("5") << "Martin Schulte ;" " MS Admin ; MS News " << AddressOk; QTest::newRow("6") << "Martin Schulte ," " MS Admin , MS News " << AddressOk; } void KEmailAddressTest::testIsValidSimpleEmailAddress() { QFETCH(QString, input); QFETCH(bool, expResult); QCOMPARE(isValidSimpleAddress(input), expResult); } void KEmailAddressTest::testIsValidSimpleEmailAddress_data() { QTest::addColumn("input"); QTest::addColumn("expResult"); // checks for "pure" email addresses in the form of xxx@yyy.tld QTest::newRow("") << "matt@fruitsalad.org" << true; QTest::newRow("") << QStringLiteral("test@täst.invalid") << true; // non-ASCII char as first char of IDN QTest::newRow("") << QStringLiteral("i_want@øl.invalid") << true; QTest::newRow("") << "matt@[123.123.123.123]" << true; QTest::newRow("") << "matt@[3.3.3.3]" << true; QTest::newRow("") << "matt@[4.4.4.4]" << true; QTest::newRow("") << "matt@[192.168.254.254]" << true; QTest::newRow("") << "\"matt\"@fruitsalad.org" << true; QTest::newRow("") << "-matt@fruitsalad.org" << true; QTest::newRow("") << "\"-matt\"@fruitsalad.org" << true; QTest::newRow("") << "matt@jongel.fibbel.com" << true; QTest::newRow("") << "Matt Douhan " << false; // BUG 105705 QTest::newRow("") << "matt-@fibbel.com" << true; QTest::newRow("") << "matt@fibbel-is-a-geek.com" << true; QTest::newRow("") << "matt_@fibbel.com" << true; // Check the defined chars for atext according to rfc2822 QTest::newRow("") << "!matt@fruitsalad.org" << true; QTest::newRow("") << "#matt@fruitsalad.org" << true; QTest::newRow("") << "$matt@fruitsalad.org" << true; QTest::newRow("") << "%matt@fruitsalad.org" << true; QTest::newRow("") << "&matt@fruitsalad.org" << true; QTest::newRow("") << "'matt@fruitsalad.org" << true; QTest::newRow("") << "*matt@fruitsalad.org" << true; QTest::newRow("") << "+matt@fruitsalad.org" << true; QTest::newRow("") << "/matt@fruitsalad.org" << true; QTest::newRow("") << "=matt@fruitsalad.org" << true; QTest::newRow("") << "?matt@fruitsalad.org" << true; QTest::newRow("") << "^matt@fruitsalad.org" << true; QTest::newRow("") << "_matt@fruitsalad.org" << true; QTest::newRow("") << "-matt@fruitsalad.org" << true; QTest::newRow("") << "`matt@fruitsalad.org" << true; QTest::newRow("") << "{matt@fruitsalad.org" << true; QTest::newRow("") << "|matt@fruitsalad.org" << true; QTest::newRow("") << "}matt@fruitsalad.org" << true; QTest::newRow("") << "~matt@fruitsalad.org" << true; // BUG 108476 QTest::newRow("") << "foo+matt@fruitsalad.org" << true; QTest::newRow("") << "bar=matt@fruitsalad.org" << true; QTest::newRow("") << "jongel-matt@fruitsalad.org" << true; QTest::newRow("") << "matt-@fruitsalad.org" << true; // check if the pure email address is wrong QTest::newRow("") << "mattfruitsalad.org" << false; QTest::newRow("") << "matt@[123.123.123.123" << false; QTest::newRow("") << "matt@123.123.123.123]" << false; QTest::newRow("") << "matt@[.123.123.123]" << false; QTest::newRow("") << "matt@[123.123.123]" << false; QTest::newRow("") << "\"matt@fruitsalad.org" << false; QTest::newRow("") << "matt\"@fruitsalad.org" << false; QTest::newRow("") << QString() << false; // BUG 203881 QTest::newRow("") << "2advance@my-site.com" << true; // and here some insane but still valid cases QTest::newRow("") << "\"m@tt\"@fruitsalad.org" << true; QTest::newRow("") << "matt\"@@\"fruitsalad.org" << false; QTest::newRow("# in domain") << "dm3tt@db0zdf.#rpl.deu.eu" << true; // add tests for missing local/domain parts QTest::newRow("") << "@mattfruitsalad.org" << false; QTest::newRow("") << "matt@" << false; QTest::newRow("") << "@" << false; } void KEmailAddressTest::testGetEmailAddress() { QFETCH(QString, input); QFETCH(QString, expResult); QCOMPARE(extractEmailAddress(input), expResult); } void KEmailAddressTest::testGetEmailAddress_data() { QTest::addColumn("input"); QTest::addColumn("expResult"); QTest::newRow("1") << "matt@fruitsalad.org" << "matt@fruitsalad.org"; QTest::newRow("2") << "Matt Douhan " << "matt@fruitsalad.org"; QTest::newRow("3") << "\"Matt Douhan \" " << "matt@fruitsalad.org"; QTest::newRow("4") << "\"Matt \" " << "matt@fruitsalad.org"; QTest::newRow("5") << "Matt Douhan (jongel) " << "matt@fruitsalad.org"; QTest::newRow("7") << "\"Douhan, Matt\" " << "matt@fruitsalad.org"; QTest::newRow("8") << "\"Matt Douhan (m@tt)\" " << "matt@fruitsalad.org"; QTest::newRow("9") << "\"Matt Douhan\" (matt " << QString(); QTest::newRow("10") << "Matt Douhan " << "matt@[123.123.123.123]"; QTest::newRow("11") << "dm3tt@db0zdf.#rpl.deu.eu" << "dm3tt@db0zdf.#rpl.deu.eu"; } void KEmailAddressTest::testCheckSplitEmailAddrList() { QFETCH(QString, input); QFETCH(QStringList, expResult); QCOMPARE(splitAddressList(input), expResult); } void KEmailAddressTest::testCheckSplitEmailAddrList_data() { QTest::addColumn("input"); QTest::addColumn("expResult"); QTest::newRow("") << "kloecker@kde.org (Kloecker, Ingo)" << (QStringList() << QStringLiteral("kloecker@kde.org (Kloecker, Ingo)")); QTest::newRow("") << "Matt Douhan , Foo Bar " << (QStringList() << QStringLiteral("Matt Douhan ") << QStringLiteral("Foo Bar ")); QTest::newRow("") << "\"Matt, Douhan\" , Foo Bar " << (QStringList() << QStringLiteral("\"Matt, Douhan\" ") << QStringLiteral("Foo Bar ")); QTest::newRow("") << "\"Lastname\\, Firstname\" " << (QStringList() << QStringLiteral("\"Lastname\\, Firstname\" ")); QTest::newRow("") << "First Collective Last " // Uses non-ASCII spacing << (QStringList() << QStringLiteral("First Collective Last ")); QTest::newRow("") << "Foo Bar , First Collective Last " // Uses non-ASCII spacing << (QStringList() << QStringLiteral("Foo Bar ") << QStringLiteral("First Collective Last ")); QTest::newRow("") << "Foo Bar , \" First Collective Last \" " // Uses multiple and quoted surrounding spaces << (QStringList() << QStringLiteral("Foo Bar ") << QStringLiteral("\" First Collective Last \" ")); } void KEmailAddressTest::testNormalizeAddressesAndEncodeIDNs() { QFETCH(QString, input); QFETCH(QString, expResult); QCOMPARE(normalizeAddressesAndEncodeIdn(input), expResult); } void KEmailAddressTest::testNormalizeAddressesAndEncodeIDNs_data() { QTest::addColumn("input"); QTest::addColumn("expResult"); QTest::newRow("") << "matt@fruitsalad.org" << "matt@fruitsalad.org"; QTest::newRow("") << "Matt Douhan " << "Matt Douhan "; QTest::newRow("") << "Matt Douhan (jongel) " << "Matt Douhan (jongel) "; QTest::newRow("") << "Matt Douhan (jongel,fibbel) " << "Matt Douhan (jongel,fibbel) "; QTest::newRow("") << "matt@fruitsalad.org (jongel,fibbel)" << "\"jongel,fibbel\" "; QTest::newRow("") << "matt@fruitsalad.org (\"jongel,fibbel\")" << "\"jongel,fibbel\" "; #if QT_VERSION >= 0x060300 // Test using IDNA-2008 domain name, before Qt 6.3 this incorrectly encodes // the email address to matt@strasse.de (IDNA-2003) instead QTest::newRow("") << "Matt Douhan " << "Matt Douhan "; #endif QTest::newRow("") << "First Collective Last " // Uses non-ASCII spacing << "First Collective Last "; QTest::newRow("") << "Foo Bar , First Collective Last " // Uses non-ASCII spacing << "Foo Bar , First Collective Last "; QTest::newRow("") << "Foo Bar , \" First Collective Last \" " // Uses multiple and quoted surrounding spaces << "Foo Bar , \" First Collective Last \" "; } void KEmailAddressTest::testNormalizeAddressesAndDecodeIDNs() { QFETCH(QString, input); QFETCH(QString, expResult); QCOMPARE(normalizeAddressesAndDecodeIdn(input), expResult); } void KEmailAddressTest::testNormalizeAddressesAndDecodeIDNs_data() { QTest::addColumn("input"); QTest::addColumn("expResult"); QTest::newRow("") << "=?us-ascii?Q?Surname=2C=20Name?= " << "\"Surname, Name\" "; QTest::newRow("") << "=?iso-8859-1?B?5Hf8b2xmLPZBbmRyZWFz?= " << QStringLiteral("\"äwüolf,öAndreas\" "); QTest::newRow("") << QStringLiteral("\"Andreas Straß\" ") << QStringLiteral("\"Andreas Straß\" "); QTest::newRow("") << QStringLiteral("\"András\" \"Manţia\" ") << QStringLiteral("\"András\" \"Manţia\" "); } void KEmailAddressTest::testQuoteIfNecessary() { QFETCH(QString, input); QFETCH(QString, expResult); QBENCHMARK { QCOMPARE(quoteNameIfNecessary(input), expResult); } } void KEmailAddressTest::testQuoteIfNecessary_data() { QTest::addColumn("input"); QTest::addColumn("expResult"); QTest::newRow("") << "Matt Douhan" << "Matt Douhan"; QTest::newRow("") << "Douhan, Matt" << "\"Douhan, Matt\""; QTest::newRow("") << "Matt \"jongel\" Douhan" << "\"Matt \\\"jongel\\\" Douhan\""; QTest::newRow("") << "Matt \\\"jongel\\\" Douhan" << "\"Matt \\\"jongel\\\" Douhan\""; QTest::newRow("") << "trailing '\\\\' should never occur \\" << "\"trailing '\\\\' should never occur \\\""; QTest::newRow("") << "\"don't quote again\"" << "\"don't quote again\""; QTest::newRow("") << "\"leading double quote" << "\"\\\"leading double quote\""; QTest::newRow("") << "trailing double quote\"" << "\"trailing double quote\\\"\""; #if 0 BEFORE: static QRegularExpression RESULT : KEmailAddressTest::testQuoteIfNecessary(): 0.015 msecs per iteration (total: 64, iterations: 4096) 0.019 msecs per iteration (total: 80, iterations: 4096) 0.019 msecs per iteration (total: 81, iterations: 4096) 0.0244 msecs per iteration (total: 100, iterations: 4096) 0.0079 msecs per iteration (total: 65, iterations: 8192) 0.020 msecs per iteration (total: 82, iterations: 4096) 0.020 msecs per iteration (total: 82, iterations: 4096) AFTER: RESULT : KEmailAddressTest::testQuoteIfNecessary(): 0.0097 msecs per iteration (total: 80, iterations: 8192) 0.010 msecs per iteration (total: 82, iterations: 8192) 0.015 msecs per iteration (total: 63, iterations: 4096) 0.0076 msecs per iteration (total: 63, iterations: 8192) 0.0098 msecs per iteration (total: 81, iterations: 8192) 0.010 msecs per iteration (total: 87, iterations: 8192) #endif } void KEmailAddressTest::testMailtoUrls() { QFETCH(QString, input); const QUrl url = encodeMailtoUrl(input); qDebug() << url; QCOMPARE(url.scheme().toLatin1().data(), "mailto"); QCOMPARE(decodeMailtoUrl(url), input); qDebug() << decodeMailtoUrl(url); } void KEmailAddressTest::testMailtoUrls_data() { QTest::addColumn("input"); QTest::newRow("") << "tokoe@domain.com"; QTest::newRow("") << QStringLiteral("\"Tobias König\" "); QTest::newRow("") << QStringLiteral("\"Alberto Simões\"