void tst_QVersitDocument::testRemoveProperty() { // Remove an empty property. QCOMPARE(mVersitDocument->properties().count(), 0); QVersitProperty property; mVersitDocument->addProperty(property); mVersitDocument->removeProperty(property); QCOMPARE(mVersitDocument->properties().count(), 0); // A full property. property.setName(QLatin1String("TEL")); property.setGroups(QStringList(QLatin1String("HOME"))); QMultiHash<QString, QString> params; params.insert(QLatin1String("TYPE"), QLatin1String("HOME")); property.setParameters(params); property.setValue(QLatin1String("123")); mVersitDocument->addProperty(property); QCOMPARE(mVersitDocument->properties().count(), 1); QVersitProperty property2; property2.setName(QLatin1String("TEL")); // Remove with a partial property fails. mVersitDocument->removeProperty(property2); QCOMPARE(mVersitDocument->properties().count(), 1); property2.setGroups(QStringList(QLatin1String("HOME"))); property2.setParameters(params); property2.setValue(QLatin1String("123")); // Remove with a fully specified property succeeds. mVersitDocument->removeProperty(property2); QCOMPARE(mVersitDocument->properties().count(), 0); }
void tst_QVCard21Writer::testEncodeGroupsAndName() { QVersitProperty property; QByteArray result; QBuffer buffer(&result); mWriter->setDevice(&buffer); buffer.open(QIODevice::WriteOnly); // No groups property.setName(QString::fromLatin1("name")); QByteArray expected("NAME"); mWriter->encodeGroupsAndName(property); QCOMPARE(result, expected); // One group mWriter->writeCrlf(); // so it doesn't start folding buffer.close(); result.clear(); buffer.open(QIODevice::WriteOnly); property.setGroups(QStringList(QString::fromLatin1("group"))); expected = "group.NAME"; mWriter->encodeGroupsAndName(property); QCOMPARE(result, expected); // Two groups mWriter->writeCrlf(); // so it doesn't start folding buffer.close(); result.clear(); buffer.open(QIODevice::WriteOnly); QStringList groups(QString::fromLatin1("group1")); groups.append(QString::fromLatin1("group2")); property.setGroups(groups); expected = "group1.group2.NAME"; mWriter->encodeGroupsAndName(property); QCOMPARE(result, expected); }
void tst_QVCard30Writer::testEncodeVersitProperty_data() { QTest::addColumn<QVersitProperty>("property"); QTest::addColumn<QByteArray>("expectedResult"); QVersitProperty property; QByteArray expectedResult; // No parameters expectedResult = "FN:John Citizen\r\n"; property.setName(QString::fromAscii("FN")); property.setValue(QString::fromAscii("John Citizen")); QTest::newRow("No parameters") << property << expectedResult; // With parameter(s) expectedResult = "TEL;TYPE=HOME:123\r\n"; property.setName(QString::fromAscii("TEL")); property.setValue(QString::fromAscii("123")); property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME")); QTest::newRow("With parameters, plain value") << property << expectedResult; // normal FN property is backslash escaped property.clear(); property.setName(QLatin1String("FN")); property.setValue(QLatin1String(";,:\\")); // semicolons, commas and backslashes are escaped (not colons, as per RFC2426) expectedResult = "FN:\\;\\,:\\\\\r\n"; QTest::newRow("FN property") << property << expectedResult; // Structured N property.setName(QLatin1String("N")); property.setValue(QStringList() << QLatin1String("La;st") // needs to be backslash escaped << QLatin1String("Fi,rst") << QLatin1String("Mi:ddle") << QLatin1String("Pr\\efix") // needs to be QP encoded << QLatin1String("Suffix")); property.setValueType(QVersitProperty::CompoundType); expectedResult = "N:La\\;st;Fi\\,rst;Mi:ddle;Pr\\\\efix;Suffix\r\n"; QTest::newRow("N property") << property << expectedResult; // Structured CATEGORIES property.setName(QLatin1String("CATEGORIES")); property.setValue(QStringList() << QLatin1String("re;d") << QLatin1String("gr,een") << QLatin1String("bl:ue") << QLatin1String("ye\\llow")); property.setValueType(QVersitProperty::ListType); expectedResult = "CATEGORIES:re\\;d,gr\\,een,bl:ue,ye\\\\llow\r\n"; QTest::newRow("CATEGORIES property") << property << expectedResult; // Convert X-NICKNAME to NICKNAME expectedResult = "NICKNAME:Jack\r\n"; property.setParameters(QMultiHash<QString,QString>()); property.setName(QString::fromAscii("X-NICKNAME")); property.setValue(QString::fromAscii("Jack")); QTest::newRow("NICKNAME property") << property << expectedResult; // Convert X-IMPP to IMPP; expectedResult = "IMPP:msn:msn-address\r\n"; property.setParameters(QMultiHash<QString,QString>()); property.setName(QString::fromAscii("X-IMPP")); property.setValue(QString::fromAscii("msn:msn-address")); QTest::newRow("IMPP property") << property << expectedResult; // AGENT property expectedResult = "AGENT:BEGIN:VCARD\\nVERSION:3.0\\nFN:Secret Agent\\nEND:VCARD\\n\r\n"; property.setName(QString::fromAscii("AGENT")); property.setValue(QString()); QVersitDocument document(QVersitDocument::VCard30Type); document.setComponentType(QLatin1String("VCARD")); QVersitProperty embeddedProperty; embeddedProperty.setName(QString(QString::fromAscii("FN"))); embeddedProperty.setValue(QString::fromAscii("Secret Agent")); document.addProperty(embeddedProperty); property.setValue(QVariant::fromValue(document)); QTest::newRow("AGENT property") << property << expectedResult; // Value is base64 encoded. QByteArray value("value"); expectedResult = "Springfield.HOUSE.PHOTO;ENCODING=b:" + value.toBase64() + "\r\n"; QStringList groups(QString::fromAscii("Springfield")); groups.append(QString::fromAscii("HOUSE")); property.setGroups(groups); property.setParameters(QMultiHash<QString,QString>()); property.setName(QString::fromAscii("PHOTO")); property.setValue(value); QTest::newRow("base64 encoded") << property << expectedResult; // Characters other than ASCII: expectedResult = "ORG:" + KATAKANA_NOKIA.toUtf8() + "\r\n"; property = QVersitProperty(); property.setName(QLatin1String("ORG")); property.setValue(KATAKANA_NOKIA); QTest::newRow("non-ASCII") << property << expectedResult; // No CHARSET and QUOTED-PRINTABLE parameters expectedResult = "EMAIL:john@" + KATAKANA_NOKIA.toUtf8() + ".com\r\n"; property = QVersitProperty(); property.setName(QLatin1String("EMAIL")); property.setValue(QString::fromAscii("john@%1.com").arg(KATAKANA_NOKIA)); QTest::newRow("special chars") << property << expectedResult; }
void tst_QVCard21Writer::testEncodeVersitProperty_data() { QTest::addColumn<QVersitProperty>("property"); QTest::addColumn<QByteArray>("expectedResult"); QTest::addColumn<QByteArray>("codec"); QVersitProperty property; QByteArray expectedResult; QByteArray codec("ISO-8859_1"); // normal case property.setName(QString::fromLatin1("FN")); property.setValue(QString::fromLatin1("John Citizen")); property.setValueType(QVersitProperty::PlainType); expectedResult = "FN:John Citizen\r\n"; QTest::newRow("No parameters") << property << expectedResult << codec; // Structured N - escaping should happen for semicolons, not for commas property.setName(QStringLiteral("N")); property.setValue(QStringList() << QStringLiteral("La;st") // needs to be backslash escaped << QStringLiteral("Fi,rst") << QStringLiteral("Mi:ddle") << QStringLiteral("Pr\\efix") // needs to be QP encoded << QStringLiteral("Suffix")); property.setValueType(QVersitProperty::CompoundType); expectedResult = "N;ENCODING=QUOTED-PRINTABLE:La\\;st;Fi,rst;Mi:ddle;Pr=5Cefix;Suffix\r\n"; QTest::newRow("N property") << property << expectedResult << codec; // Structured N - there was a bug where if two fields had to be escaped, // two ENCODING parameters were added property.setName(QStringLiteral("N")); property.setValue(QStringList() << QStringLiteral("La\\st") << QStringLiteral("Fi\\rst") << QString() << QString() << QString()); property.setValueType(QVersitProperty::CompoundType); expectedResult = "N;ENCODING=QUOTED-PRINTABLE:La=5Cst;Fi=5Crst;;;\r\n"; QTest::newRow("N property, double-encoded") << property << expectedResult << codec; // Structured N - one field needs to be encoded in UTF-8 while the other doesn't // correct behaviour is to encode the whole thing in UTF-8 property.setName(QStringLiteral("N")); property.setValue(QStringList() << QString::fromUtf8("\xE2\x82\xAC") // euro sign << QString::fromLatin1("\xA3") // pound sign (upper Latin-1) << QString() << QString() << QString()); property.setValueType(QVersitProperty::CompoundType); expectedResult = "N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E2=82=AC;=C2=A3;;;\r\n"; QTest::newRow("N property, double-encoded") << property << expectedResult << codec; // Structured CATEGORIES - escaping should happen for commas, not semicolons property.setName(QStringLiteral("CATEGORIES")); property.setValue(QStringList() << QStringLiteral("re;d") << QStringLiteral("gr,een") << QStringLiteral("bl:ue")); property.setValueType(QVersitProperty::ListType); expectedResult = "CATEGORIES:re;d,gr\\,een,bl:ue\r\n"; QTest::newRow("CATEGORIES property") << property << expectedResult << codec; // With parameter(s). No special characters in the value. // -> No need to Quoted-Printable encode the value. expectedResult = "TEL;HOME:123\r\n"; property.setName(QString::fromLatin1("TEL")); property.setValue(QString::fromLatin1("123")); property.insertParameter(QString::fromLatin1("TYPE"),QString::fromLatin1("HOME")); QTest::newRow("With parameters, plain value") << property << expectedResult << codec; expectedResult = "EMAIL;HOME;ENCODING=QUOTED-PRINTABLE:john.citizen=40example.com\r\n"; property.setName(QString::fromLatin1("EMAIL")); property.setValue(QString::fromLatin1("*****@*****.**")); QTest::newRow("With parameters, special value") << property << expectedResult << codec; // AGENT property with parameter expectedResult = "AGENT;X-PARAMETER=VALUE:\r\n\ BEGIN:VCARD\r\n\ VERSION:2.1\r\n\ FN:Secret Agent\r\n\ END:VCARD\r\n\ \r\n"; property.setParameters(QMultiHash<QString,QString>()); property.setName(QString::fromLatin1("AGENT")); property.setValue(QString()); property.insertParameter(QString::fromLatin1("X-PARAMETER"),QString::fromLatin1("VALUE")); QVersitDocument document(QVersitDocument::VCard21Type); document.setComponentType(QStringLiteral("VCARD")); QVersitProperty embeddedProperty; embeddedProperty.setName(QString(QString::fromLatin1("FN"))); embeddedProperty.setValue(QString::fromLatin1("Secret Agent")); document.addProperty(embeddedProperty); property.setValue(QVariant::fromValue(document)); QTest::newRow("AGENT property") << property << expectedResult << codec; // Value is base64 encoded. // Check that the extra folding and the line break are added QByteArray value("value"); expectedResult = "Springfield.HOUSE.PHOTO;ENCODING=BASE64:\r\n " + value.toBase64() + "\r\n\r\n"; QStringList groups(QString::fromLatin1("Springfield")); groups.append(QString::fromLatin1("HOUSE")); property.setGroups(groups); property.setParameters(QMultiHash<QString,QString>()); property.setName(QString::fromLatin1("PHOTO")); property.setValue(value); QTest::newRow("base64 encoded") << property << expectedResult << codec; // Characters other than ASCII: // Note: KATAKANA_NOKIA is defined as: QString::fromUtf8("\xe3\x83\x8e\xe3\x82\xad\xe3\x82\xa2") // The expected behaviour is to convert to UTF8, then encode with quoted-printable. // Because the result overflows one line, it should be split onto two lines using a // quoted-printable soft line break (EQUALS-CR-LF). (Note: Versit soft line breaks // (CR-LF-SPACE) are not supported by the native Symbian vCard importers). expectedResult = "ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E3=83=8E=E3=82=AD=E3=82=A2=E3=\r\n" "=83=8E=E3=82=AD=E3=82=A2\r\n"; property = QVersitProperty(); property.setName(QStringLiteral("ORG")); property.setValue(KATAKANA_NOKIA + KATAKANA_NOKIA); QTest::newRow("non-ASCII 1") << property << expectedResult << codec; expectedResult = "ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:a=E3=83=8E=E3=82=AD=E3=82=A2=E3=\r\n" "=83=8E=E3=82=AD=E3=82=A2\r\n"; property = QVersitProperty(); property.setName(QStringLiteral("ORG")); property.setValue("a" + KATAKANA_NOKIA + KATAKANA_NOKIA); QTest::newRow("non-ASCII 2") << property << expectedResult << codec; expectedResult = "ORG;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:aa=E3=83=8E=E3=82=AD=E3=82=A2=\r\n" "=E3=83=8E=E3=82=AD=E3=82=A2\r\n"; property = QVersitProperty(); property.setName(QStringLiteral("ORG")); property.setValue("aa" + KATAKANA_NOKIA + KATAKANA_NOKIA); QTest::newRow("non-ASCII 3") << property << expectedResult << codec; // In Shift-JIS codec. QTextCodec* jisCodec = QTextCodec::codecForName("Shift-JIS"); expectedResult = jisCodec->fromUnicode( QStringLiteral("ORG:") + KATAKANA_NOKIA + QStringLiteral("\r\n")); property = QVersitProperty(); property.setName(QStringLiteral("ORG")); property.setValue(KATAKANA_NOKIA); QTest::newRow("JIS codec") << property << expectedResult << QByteArray("Shift-JIS"); }