void tst_QMailAddress::groupMembers()
{
    QFETCH( QString, input );
    QFETCH( QString, input_name );
    QFETCH( QString, input_address );

    QMailAddress addr;
    if ( !input.isEmpty() )
        addr = QMailAddress( input );
    else
        addr = QMailAddress( input_name, input_address );

    QTEST( addr.name(), "name" );
    QTEST( addr.address(), "address" );
    QTEST( addr.toString(), "to_string" );
    QTEST( addr.isGroup(), "is_group" );

    QStringList names, addresses;
    foreach (const QMailAddress& member, addr.groupMembers()) {
        names.append(member.name());
        addresses.append(member.address());
    }

    QTEST( names, "member_names" );
    QTEST( addresses, "member_addresses" );
}
void tst_QMailAddress::toStringList_data()
{
    QTest::addColumn<QList<QMailAddress> >("address_list");
    QTest::addColumn<QStringList>("string_list");

    QTest::newRow("Empty")
        << QList<QMailAddress>()
        << QStringList();

    QTest::newRow("Single plain address")
        << ( QList<QMailAddress>() 
                << QMailAddress("*****@*****.**") )
        << ( QStringList() 
                << "*****@*****.**" );

    QTest::newRow("Single named address")
        << ( QList<QMailAddress>() 
                << QMailAddress("\"Wizard, Of Oz\" <*****@*****.**>") )
        << ( QStringList() 
                << "\"Wizard, Of Oz\" <*****@*****.**>" );

    QTest::newRow("Single group address")
        << ( QList<QMailAddress>() 
                << QMailAddress("Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;") )
        << ( QStringList() 
                << "Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;" );

    QTest::newRow("Multiple named addressses")
        << ( QList<QMailAddress>() 
                << QMailAddress("\"Wizard, Of Oz\" <*****@*****.**>")
                << QMailAddress("Rincewind <*****@*****.**>") )
        << ( QStringList() 
                << "\"Wizard, Of Oz\" <*****@*****.**>"
                << "Rincewind <*****@*****.**>" );

    QTest::newRow("Multiple group addresses")
        << ( QList<QMailAddress>() 
                << QMailAddress("Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;")
                << QMailAddress("Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;") )
        << ( QStringList() 
                << "Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;"
                << "Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;" );

    QTest::newRow("Multiple mixed addresses")
        << ( QList<QMailAddress>() 
                << QMailAddress("Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;")
                << QMailAddress("Dorothy <*****@*****.**>")
                << QMailAddress("Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;") )
        << ( QStringList() 
                << "Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;"
                << "Dorothy <*****@*****.**>"
                << "Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;" );
}
Exemple #3
0
QMessageAccountId addAccount(const Parameters &params)
{
    qWarning() << "ADDDDD";
    QString name(params["name"]);
    QString fromAddress(params["fromAddress"]);

    if (!name.isEmpty()) {
        QMailAccount account;
        account.setName(name);
        account.setStatus(QMailAccount::Enabled, true);
        account.setStatus(QMailAccount::CanTransmit, true);
        account.setMessageType(QMailMessage::Email);

        if (!fromAddress.isEmpty()) {
            account.setFromAddress(QMailAddress(QString(), fromAddress));
        }

        // Ensure that we initialise to the current version for file storage
        const QString key("qmfstoragemanager");

        QMailAccountConfiguration config;
        config.addServiceConfiguration(key);
        QMailAccountConfiguration::ServiceConfiguration &svcCfg(config.serviceConfiguration(key));
        svcCfg.setValue("servicetype", "storage");
        svcCfg.setValue("version", "101");

        if (!QMailStore::instance()->addAccount(&account, &config)) {
            qWarning() << "Unable to addAccount:" << name;
        } else {
            return QmfHelpers::convert(account.id());
        }
    }

    return QMessageAccountId();
}
void tst_QMailAddress::isEmailAddress()
{
    QFETCH( QString, address );

    QMailAddress addr = QMailAddress(QString(), address);
    QTEST(addr.isEmailAddress(), "emailAddress");
}
void tst_QMailAddress::isPhoneNumber()
{
    QFETCH( QString, address );

    QMailAddress addr = QMailAddress(QString(), address);
    QTEST(addr.isPhoneNumber(), "phoneNumber");
}
void EmailPropertySetter::setReplyTo(const QString& s) 
{ 
    target.setReplyTo(QMailAddress(s)); 
}
void EmailPropertySetter::setFrom(const QString& s) 
{ 
    target.setFrom(QMailAddress(s)); 
}
void tst_QMailMessagePart::testSerialization()
{
    QByteArray data;
    QByteArray type;

    type = "text/plain; charset=us-ascii";
    data = "P1: This is a plain text part.";
    QMailMessagePart p1;
    p1.setBody(QMailMessageBody::fromData(data, QMailMessageContentType(type), QMailMessageBody::SevenBit, QMailMessageBody::RequiresEncoding));
    p1.setContentID("P1");
    p1.setContentLocation("After the header");
    p1.setContentDescription("The first part");
    QCOMPARE( p1.contentType().toString().toLower(), QByteArray("Content-Type: text/plain; charset=us-ascii").toLower() );
    QCOMPARE( p1.transferEncoding(), QMailMessageBody::SevenBit );

    type = "text/html; charset=UTF-8";
    data = "<html>P2: This is a HTML part</html>";
    QMailMessageContentType ct(type);
    ct.setName("P2");
    QMailMessageContentDisposition cd(QMailMessageContentDisposition::Inline);
    cd.setFilename("p2.html");
    QMailMessagePart p2;
    p2.setBody(QMailMessageBody::fromData(data, ct, QMailMessageBody::EightBit, QMailMessageBody::RequiresEncoding));
    p2.setContentDisposition(cd);
    QCOMPARE( p2.contentType().toString().toLower(), QByteArray("Content-Type: text/html; charset=UTF-8; name=P2").toLower() );
    QCOMPARE( p2.transferEncoding(), QMailMessageBody::EightBit );

    QMailMessage m;
    m.setTo(QMailAddress("*****@*****.**"));
    m.setFrom(QMailAddress("*****@*****.**"));
    m.setDate(QMailTimeStamp("Fri, 22 Jun 2007 11:34:47 +1000"));

    m.setMultipartType(QMailMessagePartContainer::MultipartAlternative);
    m.appendPart(p1);
    m.appendPart(p2);
    QCOMPARE( m.contentType().toString().toLower(), QByteArray("Content-Type: multipart/alternative").toLower() );
    QCOMPARE( m.transferEncoding(), QMailMessageBody::NoEncoding );

    const QByteArray expected(
"To: [email protected]" CRLF
"From: [email protected]" CRLF
"Date: Fri, 22 Jun 2007 11:34:47 +1000" CRLF
"Content-Type: multipart/alternative; boundary=\"" BOUNDARY "\"" CRLF
"MIME-Version: 1.0" CRLF
CRLF
"This is a multipart message in Mime 1.0 format" CRLF
CRLF
"--" BOUNDARY CRLF
"Content-Type: text/plain; charset=us-ascii" CRLF
"Content-Transfer-Encoding: 7bit" CRLF
"Content-ID: <P1>" CRLF
"Content-Location: After the header" CRLF
"Content-Description: The first part" CRLF
CRLF
"P1: This is a plain text part." CRLF
"--" BOUNDARY CRLF
"Content-Type: text/html; charset=utf-8; name=P2" CRLF
"Content-Transfer-Encoding: 8bit" CRLF
"Content-Disposition: inline; filename=p2.html" CRLF
CRLF
"<html>P2: This is a HTML part</html>" CRLF
"--" BOUNDARY "--" CRLF
);

    QByteArray serialized = m.toRfc2822();
    QCOMPARE( serialized, expected );

    QMailMessage m2 = QMailMessage::fromRfc2822(serialized);
    QByteArray repeat = m.toRfc2822();
    QCOMPARE( serialized, repeat );
}
void tst_QMailMessagePart::setHeaderField()
{
    QString addr1("*****@*****.**");
    QString addr2("*****@*****.**");
    QString ownHdr("hello");

    QMailMessage m;
    m.setHeaderField("To", addr2);
    QCOMPARE(m.headerFieldText("to"), addr2);
    QCOMPARE(m.headerField("to").content(), addr2.toLatin1());

    // Ensure overwrite
    m.setHeaderField("To", addr1);
    m.setHeaderField("X-My-Own-Header", ownHdr);
    QCOMPARE(m.headerFieldText("to"), addr1);
    QCOMPARE(m.headerField("to").content(), addr1.toLatin1());
    QCOMPARE(m.headerFieldText("X-My-Own-Header"), ownHdr);
    QCOMPARE(m.headerField("X-My-Own-Header").content(), ownHdr.toLatin1());
    QCOMPARE(m.to(), (QList<QMailAddress>() << QMailAddress(addr1)));

    QCOMPARE(m.recipients(), (QList<QMailAddress>() << QMailAddress(addr1)));
    QMailMessageMetaData mtdata = *static_cast<QMailMessageMetaData*>(&m);
    QCOMPARE(mtdata.recipients(), (QList<QMailAddress>() << QMailAddress(addr1)));
    m.setHeaderField("Cc", addr2);
    QCOMPARE(m.recipients(), (QList<QMailAddress>() << QMailAddress(addr1) << QMailAddress(addr2)));
    mtdata = *static_cast<QMailMessageMetaData*>(&m);
    QCOMPARE(mtdata.recipients(), (QList<QMailAddress>() << QMailAddress(addr1) << QMailAddress(addr2)));
    QCOMPARE(m.cc(), (QList<QMailAddress>()  << QMailAddress(addr2)));
    QString addr3("*****@*****.**");
    m.setHeaderField("Bcc", addr3);
    QCOMPARE(m.recipients(), (QList<QMailAddress>() << QMailAddress(addr1) << QMailAddress(addr2) << QMailAddress(addr3)));
    mtdata = *static_cast<QMailMessageMetaData*>(&m);
    QCOMPARE(mtdata.recipients(), (QList<QMailAddress>() << QMailAddress(addr1) << QMailAddress(addr2) << QMailAddress(addr3)));
    QCOMPARE(m.bcc(), (QList<QMailAddress>()  << QMailAddress(addr3)));

    QString rfc822 = m.toRfc2822();

    QMailMessage m2 = QMailMessage::fromRfc2822(rfc822.toLatin1());
    QCOMPARE(m2.headerFieldText("to"), addr1);
    QCOMPARE(m2.headerField("to").content(), addr1.toLatin1());
    QCOMPARE(m2.headerFieldText("X-My-Own-Header"), ownHdr);
    QCOMPARE(m2.headerField("X-My-Own-Header").content(), ownHdr.toLatin1());
    QCOMPARE(m2.to(), (QList<QMailAddress>() << QMailAddress(addr1)));

    m2.setTo(QList<QMailAddress>() << QMailAddress(addr2));
    QCOMPARE(m2.headerFieldText("to"), addr2);
    QCOMPARE(m2.headerField("to").content(), addr2.toLatin1());
    QCOMPARE(m2.to(), (QList<QMailAddress>() << QMailAddress(addr2)));
}
bool AccountInfo::accountIsValid()
{
    m_account->setName (m_displayName);

    m_account->setStatus (QMailAccount::PreferredSender, true);

    //% "IMAP"
    if (m_inServerType.compare(qtTrId("xx_imap"), Qt::CaseInsensitive) == 0)
    {
        if (!m_config->services().contains(imapServiceKey))
            m_config->addServiceConfiguration(imapServiceKey);

        EmailServiceConfiguration imapConfig (m_config, imapServiceKey);
        imapConfig.setVersion(100);
        imapConfig.setType(QMailServiceConfiguration::Source);

        imapConfig.setValue ("username", m_inUsername);
        imapConfig.setValue ("password", imapConfig.encode(m_inPassword));
        imapConfig.setValue ("server", m_inServerAddress);
        imapConfig.setIntValue ("port",  (m_inPort == -1 ? 143 : m_inPort));

        QMailTransport::EncryptType encrypType = QMailTransport::Encrypt_NONE;
        //% "SSL"
        if (QString::compare(m_inSecurity, qtTrId("xx_ssl"), Qt::CaseInsensitive) == 0)
           encrypType = QMailTransport::Encrypt_SSL;
        //% "TLS"
        else if (QString::compare(m_inSecurity, qtTrId("xx_tls"), Qt::CaseInsensitive) == 0)
           encrypType = QMailTransport::Encrypt_TLS;

        imapConfig.setIntValue ("encryption", encrypType);
          
        int interval = EmailSettingsPage::instance()->frequency();
        imapConfig.setIntValue("checkInterval", interval);

        // Todo:  the following options will be handled by email settings.
        //        For now, just set them to a good known default value.
        imapConfig.setIntValue("autoDownload", true);
        imapConfig.setValue("textSubtype", "plain");
        imapConfig.setIntValue("pushEnabled", true);
        imapConfig.setIntValue("maxSize", 30);
        imapConfig.setIntValue("canDelete", true);
        imapConfig.setIntValue("intervalCheckRoamingEnabled", true);

        imapConfig.setValue("pushFolders", "INBOX");
        m_account->setStatus(QMailAccount::CanCreateFolders, true);
        m_account->setStatus(QMailAccount::CanRetrieve, true);
    } 
    //% "POP"
    else if (m_inServerType.compare(qtTrId("xx_pop"), Qt::CaseInsensitive) == 0)
    {
        if (!m_config->services().contains(popServiceKey))
            m_config->addServiceConfiguration(popServiceKey);

        EmailServiceConfiguration popConfig (m_config, popServiceKey);

        popConfig.setVersion(100);
        popConfig.setType(QMailServiceConfiguration::Source);

        popConfig.setValue ("username", m_inUsername);
        popConfig.setValue ("password", popConfig.encode(m_inPassword));
        popConfig.setValue ("server", m_inServerAddress);
        popConfig.setIntValue ("port",  (m_inPort == -1 ? 143 : m_inPort));

        QMailTransport::EncryptType encrypType = QMailTransport::Encrypt_NONE;
        //% "SSL"
        if (QString::compare(m_inSecurity, qtTrId("xx_ssl"), Qt::CaseInsensitive) == 0)
           encrypType = QMailTransport::Encrypt_SSL;
        //% "TLS"
        else if (QString::compare(m_inSecurity, qtTrId("xx_tls"), Qt::CaseInsensitive) == 0)
           encrypType = QMailTransport::Encrypt_TLS;

        popConfig.setIntValue ("encryption", encrypType);

        int interval = EmailSettingsPage::instance()->frequency();
        popConfig.setIntValue("checkInterval", interval);

        // Todo:  the following options will be handled by email settings.
        //        For now, just set them to a good known default value.
        popConfig.setIntValue("autoDownload", true);
        popConfig.setValue("textSubtype", "plain");
        popConfig.setIntValue("pushEnabled", true);
        popConfig.setIntValue("maxSize", 30);
        popConfig.setIntValue("canDelete", true);
        popConfig.setIntValue("intervalCheckRoamingEnabled", true);

        m_account->setStatus(QMailAccount::CanRetrieve, true);

    }

    //% "SMTP"
    if (m_outServerType.compare(qtTrId("xx_smtp"), Qt::CaseInsensitive) == 0)
    {
        m_account->setFromAddress(QMailAddress(m_emailAddress));

        if (!m_config->services().contains(smtpServiceKey))
            m_config->addServiceConfiguration(smtpServiceKey);

        EmailServiceConfiguration smtpConfig (m_config, smtpServiceKey);

        smtpConfig.setVersion(100);
        smtpConfig.setType(QMailServiceConfiguration::Sink);

        smtpConfig.setValue("address", m_emailAddress);
        smtpConfig.setValue("server", m_outServerAddress);
        smtpConfig.setIntValue("port", (m_outPort == -1 ? 25 : m_outPort));

        smtpConfig.setIntValue("authentication", m_outAuthentication);

        if (m_outAuthentication != 0)
        {
            smtpConfig.setValue("smtpusername", m_outUsername);
            smtpConfig.setValue("smtppassword", smtpConfig.encode(m_outPassword));
        }

        QMailTransport::EncryptType encrypType = QMailTransport::Encrypt_NONE;
        //% "SSL"
        if (QString::compare(m_outSecurity, qtTrId("xx_ssl"), Qt::CaseInsensitive) == 0)
           encrypType = QMailTransport::Encrypt_SSL;
        //% "TLS"
        else if (QString::compare(m_outSecurity, qtTrId("xx_tls"), Qt::CaseInsensitive) == 0)
           encrypType = QMailTransport::Encrypt_TLS;
        smtpConfig.setIntValue("encryption", encrypType);

        m_account->setStatus(QMailAccount::PreferredSender, true);

        QString signature = EmailSettingsPage::instance()->signature();

        if (signature.size() > 0)
        {
            m_account->setStatus(QMailAccount::AppendSignature, true);
            m_account->setSignature(signature);
        }
        else
        {
            m_account->setStatus(QMailAccount::AppendSignature, false);
            m_account->setSignature("");
        }

        m_account->setStatus(QMailAccount::MessageSink, true);

        if (!smtpConfig.value("server").isEmpty() && !smtpConfig.value("address").isEmpty())
            m_account->setStatus(QMailAccount::CanTransmit, true);
    }

    if (!m_config->services().contains(storageServiceKey))
        m_config->addServiceConfiguration(storageServiceKey);

    QMailAccountConfiguration::ServiceConfiguration &svcCfg(m_config->serviceConfiguration(storageServiceKey));
    svcCfg.setValue("version", "101");
    svcCfg.setValue("servicetype", "storage");

    svcCfg.setValue("basePath", "");

    if (m_account->id().isValid())
    {   // We are dealing with an existing account just update the account.
        QMailStore::instance()->updateAccount(m_account, m_config);
    }
    else
    {
        QMailStore::instance()->addAccount(m_account, m_config);
    }
    QTimer::singleShot(10, this, SLOT(testAccountConfiguration()));
    return true;
}
void tst_QMailAddress::fromStringList1_data()
{
    QTest::addColumn<QString>("string_list");
    QTest::addColumn<QList<QMailAddress> >("address_list");

    QTest::newRow("Empty")
        << QString()
        << QList<QMailAddress>();

    QTest::newRow("Single plain address")
        << "*****@*****.**"
        << ( QList<QMailAddress>() 
                << QMailAddress("*****@*****.**") );

    QTest::newRow("Single named address")
        << "\"Wizard, Of Oz\" <*****@*****.**>"
        << ( QList<QMailAddress>() 
                << QMailAddress("\"Wizard, Of Oz\" <*****@*****.**>") );

    QTest::newRow("Single group address")
        << "Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;"
        << ( QList<QMailAddress>() 
                << QMailAddress("Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;") );

    QTest::newRow("Multiple plain addressses, comma-separated")
        << ( QStringList() 
                << "*****@*****.**"
                << "*****@*****.**" ).join(QString(','))
        << ( QList<QMailAddress>() 
                << QMailAddress("*****@*****.**")
                << QMailAddress("*****@*****.**") );

    QTest::newRow("Multiple plain addressses, semicolon-separated")
        << ( QStringList() 
                << "*****@*****.**"
                << "*****@*****.**" ).join(QString(';'))
        << ( QList<QMailAddress>() 
                << QMailAddress("*****@*****.**")
                << QMailAddress("*****@*****.**") );

    QTest::newRow("Multiple plain addressses, whitespace-separated")
        << ( QStringList() 
                << "*****@*****.**"
                << "*****@*****.**" ).join(QString(' '))
        << ( QList<QMailAddress>() 
                << QMailAddress("*****@*****.**")
                << QMailAddress("*****@*****.**") );

    QTest::newRow("Multiple named addressses, comma-separated")
        << ( QStringList() 
                << "\"Wizard, Of Oz\" <*****@*****.**>"
                << "Rincewind <*****@*****.**>" ).join(QString(','))
        << ( QList<QMailAddress>() 
                << QMailAddress("\"Wizard, Of Oz\" <*****@*****.**>")
                << QMailAddress("Rincewind <*****@*****.**>") );

    QTest::newRow("Multiple named addressses, semicolon-separated")
        << ( QStringList() 
                << "\"Wizard, Of Oz\" <*****@*****.**>"
                << "Rincewind <*****@*****.**>" ).join(QString(';'))
        << ( QList<QMailAddress>() 
                << QMailAddress("\"Wizard, Of Oz\" <*****@*****.**>")
                << QMailAddress("Rincewind <*****@*****.**>") );

    QTest::newRow("Multiple named addressses, whitespace-separated")
        << ( QStringList() 
                << "\"Wizard, Of Oz\" <*****@*****.**>"
                << "Rincewind <*****@*****.**>" ).join(QString(' '))
        << ( QList<QMailAddress>() 
                << QMailAddress("\"Wizard, Of Oz\" <*****@*****.**>")
                << QMailAddress("Rincewind <*****@*****.**>") );

    QTest::newRow("Multiple group addresses, comma-separated")
        << ( QStringList() 
                << "Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;"
                << "Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;" ).join(QString(','))
        << ( QList<QMailAddress>() 
                << QMailAddress("Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;")
                << QMailAddress("Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;") );

    QTest::newRow("Multiple group addresses, semicolon-separated")
        << ( QStringList() 
                << "Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;"
                << "Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;" ).join(QString(';'))
        << ( QList<QMailAddress>() 
                << QMailAddress("Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;")
                << QMailAddress("Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;") );

    QTest::newRow("Multiple group addresses, whitespace-separated")
        << ( QStringList() 
                << "Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;"
                << "Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;" ).join(QString(' '))
        << ( QList<QMailAddress>() 
                << QMailAddress("Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;")
                << QMailAddress("Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;") );

    QTest::newRow("Multiple mixed addresses, comma-separated")
        << ( QStringList() 
                << "Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;"
                << "*****@*****.**"
                << "Dorothy <*****@*****.**>"
                << "Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;" ).join(QString(','))
        << ( QList<QMailAddress>() 
                << QMailAddress("Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;")
                << QMailAddress("*****@*****.**")
                << QMailAddress("Dorothy <*****@*****.**>")
                << QMailAddress("Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;") );

    QTest::newRow("Multiple mixed addresses, semicolon-separated")
        << ( QStringList() 
                << "Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;"
                << "*****@*****.**"
                << "Dorothy <*****@*****.**>"
                << "Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;" ).join(QString(';'))
        << ( QList<QMailAddress>() 
                << QMailAddress("Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;")
                << QMailAddress("*****@*****.**")
                << QMailAddress("Dorothy <*****@*****.**>")
                << QMailAddress("Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;") );

    QTest::newRow("Multiple mixed addresses, whitespace-separated")
        << ( QStringList() 
                << "Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;"
                << "*****@*****.**"
                << "Dorothy <*****@*****.**>"
                << "Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;" ).join(QString(' '))
        << ( QList<QMailAddress>() 
                << QMailAddress("Wizard Group: \"Wizard, Of Oz\" <*****@*****.**>, Rincewind <*****@*****.**>;")
                << QMailAddress("*****@*****.**")
                << QMailAddress("Dorothy <*****@*****.**>")
                << QMailAddress("Witch Group: Wicked Witch (East) <*****@*****.**>, \"Wicked Witch, South\" <*****@*****.**>;") );
}