File indexing completed on 2024-04-14 03:51:18

0001 /*
0002     This file is part of the KContacts framework.
0003     SPDX-FileCopyrightText: 2007 Tobias Koenig <tokoe@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "addresstest.h"
0009 #include "addresseelist.h"
0010 #include "kcontacts/address.h"
0011 #include "vcardtool_p.h"
0012 #include <KConfig>
0013 #include <KConfigGroup>
0014 #include <QStandardPaths>
0015 #include <QTest>
0016 
0017 QTEST_MAIN(AddressTest)
0018 void initLocale()
0019 {
0020     qputenv("LANG", "it_CH");
0021     QLocale::setDefault(QLocale(QLocale::Italian, QLocale::Switzerland));
0022 }
0023 
0024 Q_CONSTRUCTOR_FUNCTION(initLocale)
0025 
0026 void AddressTest::initTestCase()
0027 {
0028 }
0029 
0030 void AddressTest::emptyTest()
0031 {
0032     KContacts::Address address;
0033 
0034     QVERIFY(address.isEmpty());
0035 }
0036 
0037 void AddressTest::storeTest()
0038 {
0039     KContacts::Address address;
0040 
0041     address.setId(QStringLiteral("My Id"));
0042     address.setType(KContacts::Address::Home);
0043     address.setPostOfficeBox(QStringLiteral("1234"));
0044     address.setExtended(QStringLiteral("My Extended Label"));
0045     address.setStreet(QStringLiteral("My Street"));
0046     address.setLocality(QStringLiteral("My Locality"));
0047     address.setRegion(QStringLiteral("My Region"));
0048     address.setPostalCode(QStringLiteral("My PostalCode"));
0049     address.setCountry(QStringLiteral("My Country"));
0050     address.setLabel(QStringLiteral("My Label"));
0051 
0052     QCOMPARE(address.id(), QStringLiteral("My Id"));
0053     QCOMPARE(address.type(), KContacts::Address::Home);
0054     QCOMPARE(address.postOfficeBox(), QStringLiteral("1234"));
0055     QCOMPARE(address.extended(), QStringLiteral("My Extended Label"));
0056     QCOMPARE(address.street(), QStringLiteral("My Street"));
0057     QCOMPARE(address.locality(), QStringLiteral("My Locality"));
0058     QCOMPARE(address.region(), QStringLiteral("My Region"));
0059     QCOMPARE(address.postalCode(), QStringLiteral("My PostalCode"));
0060     QCOMPARE(address.country(), QStringLiteral("My Country"));
0061     QCOMPARE(address.label(), QStringLiteral("My Label"));
0062     QVERIFY(!address.geo().isValid());
0063 }
0064 
0065 void AddressTest::equalsTest()
0066 {
0067     KContacts::Address address1;
0068     KContacts::Address address2;
0069 
0070     address1.setId(QStringLiteral("My Id"));
0071     address1.setType(KContacts::Address::Home);
0072     address1.setPostOfficeBox(QStringLiteral("1234"));
0073     address1.setExtended(QStringLiteral("My Extended Label"));
0074     address1.setStreet(QStringLiteral("My Street"));
0075     address1.setLocality(QStringLiteral("My Locality"));
0076     address1.setRegion(QStringLiteral("My Region"));
0077     address1.setPostalCode(QStringLiteral("My Postalcode"));
0078     address1.setCountry(QStringLiteral("My country"));
0079     address1.setLabel(QStringLiteral("My Label"));
0080 
0081     address2.setId(QStringLiteral("My Id"));
0082     address2.setType(KContacts::Address::Home);
0083     address2.setPostOfficeBox(QStringLiteral("1234"));
0084     address2.setExtended(QStringLiteral("My Extended Label"));
0085     address2.setStreet(QStringLiteral("My Street"));
0086     address2.setLocality(QStringLiteral("My Locality"));
0087     address2.setRegion(QStringLiteral("My Region"));
0088     address2.setPostalCode(QStringLiteral("My Postalcode"));
0089     address2.setCountry(QStringLiteral("My country"));
0090     address2.setLabel(QStringLiteral("My Label"));
0091 
0092     QVERIFY(address1 == address2);
0093 }
0094 
0095 void AddressTest::differsTest()
0096 {
0097     KContacts::Address address1(KContacts::Address::Home);
0098     KContacts::Address address2(KContacts::Address::Work);
0099 
0100     QVERIFY(address1 != address2);
0101 }
0102 
0103 void AddressTest::assignmentTest()
0104 {
0105     KContacts::Address address1;
0106     KContacts::Address address2;
0107 
0108     address1.setId(QStringLiteral("My Id"));
0109     address1.setType(KContacts::Address::Home);
0110     address1.setPostOfficeBox(QStringLiteral("1234"));
0111     address1.setExtended(QStringLiteral("My Extended Label"));
0112     address1.setStreet(QStringLiteral("My Street"));
0113     address1.setLocality(QStringLiteral("My Locality"));
0114     address1.setRegion(QStringLiteral("My Region"));
0115     address1.setPostalCode(QStringLiteral("My Postalcode"));
0116     address1.setCountry(QStringLiteral("My country"));
0117     address1.setLabel(QStringLiteral("My Label"));
0118 
0119     address2 = address1;
0120 
0121     QVERIFY(address1 == address2);
0122 }
0123 
0124 void AddressTest::serializeTest()
0125 {
0126     KContacts::Address address1;
0127     KContacts::Address address2;
0128 
0129     address1.setType(KContacts::Address::Work);
0130     address1.setPostOfficeBox(QStringLiteral("1234"));
0131     address1.setExtended(QStringLiteral("My Extended Label"));
0132     address1.setStreet(QStringLiteral("My Street"));
0133     address1.setLocality(QStringLiteral("My Locality"));
0134     address1.setRegion(QStringLiteral("My Region"));
0135     address1.setPostalCode(QStringLiteral("My Postalcode"));
0136     address1.setCountry(QStringLiteral("My country"));
0137     address1.setLabel(QStringLiteral("My Label"));
0138 
0139     QByteArray data;
0140     QDataStream s(&data, QIODevice::WriteOnly);
0141     s << address1;
0142 
0143     QDataStream t(&data, QIODevice::ReadOnly);
0144     t >> address2;
0145 
0146     QVERIFY(address1 == address2);
0147 }
0148 
0149 void AddressTest::formatTest()
0150 {
0151     {
0152         KContacts::Address address;
0153         address.setStreet(QStringLiteral("Lummerlandstr. 1"));
0154         address.setPostalCode(QStringLiteral("12345"));
0155         address.setLocality(QStringLiteral("Lummerstadt"));
0156         address.setCountry(QStringLiteral("Germany"));
0157 
0158         const QString result(
0159             QStringLiteral("Jim Knopf\nLummerlandstr. 1\n"
0160                            "12345 Lummerstadt\n\nGERMANIA"));
0161 
0162         QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Jim Knopf")), result);
0163     }
0164 
0165     {
0166         KContacts::Address address;
0167         address.setStreet(QStringLiteral("457 Foobar Ave"));
0168         address.setPostalCode(QStringLiteral("1A2B3C"));
0169         address.setLocality(QStringLiteral("Nervousbreaktown"));
0170         address.setRegion(QStringLiteral("DC"));
0171         address.setCountry(QStringLiteral("United States of America"));
0172 
0173         const QString result(
0174             QStringLiteral("Huck Finn\n457 Foobar Ave\nNERVOUSBREAKTOWN,"
0175                            " DC 1A2B3C\n\nSTATI UNITI"));
0176         QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Huck Finn")), result);
0177     }
0178 
0179     {
0180         KContacts::Address address;
0181         address.setStreet(QStringLiteral("Lummerlandstr. 1"));
0182         address.setPostalCode(QStringLiteral("12345"));
0183         address.setLocality(QStringLiteral("Lummerstadt"));
0184         address.setCountry(QStringLiteral("Deutschland"));
0185 
0186         const QString result(
0187             QStringLiteral("Jim Knopf\nLummerlandstr. 1\n"
0188                            "12345 Lummerstadt\n\nGERMANIA"));
0189 
0190         QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Jim Knopf")), result);
0191     }
0192 
0193     {
0194         KContacts::Address address;
0195         address.setStreet(QStringLiteral("Lummerlandstr. 1"));
0196         address.setPostalCode(QStringLiteral("12345"));
0197         address.setLocality(QStringLiteral("Lummerstadt"));
0198         address.setCountry(QString());
0199 
0200         const QString result(QStringLiteral("Jim Knopf\nLummerlandstr. 1\n12345 Lummerstadt"));
0201 
0202         QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Jim Knopf")), result);
0203     }
0204 
0205     {
0206         KContacts::Address address;
0207         address.setStreet(QStringLiteral("Haus Randa"));
0208         address.setPostalCode(QStringLiteral("1234"));
0209         address.setLocality(QStringLiteral("Randa"));
0210         address.setPostOfficeBox(QStringLiteral("5678"));
0211         address.setCountry(QStringLiteral("Schweiz"));
0212 
0213         // we want the Italian variant of the Swiss format for it_CH
0214         const QString result(QStringLiteral("Dr. Konqui\nCasella postale 5678\nHaus Randa\n1234 Randa\n\nSVIZZERA"));
0215 
0216         QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Dr. Konqui")), result);
0217     }
0218 
0219     {
0220         KContacts::Address address;
0221         address.setStreet(QStringLiteral("Haus Randa"));
0222         address.setPostalCode(QStringLiteral("1234"));
0223         address.setLocality(QStringLiteral("Randa"));
0224         address.setPostOfficeBox(QStringLiteral("5678"));
0225         address.setCountry(QStringLiteral("CH"));
0226 
0227         // we want the Italian variant of the Swiss format for it_CH
0228         const QString result(QStringLiteral("Dr. Konqui\nCasella postale 5678\nHaus Randa\n1234 Randa\n\nSVIZZERA"));
0229         QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Dr. Konqui")), result);
0230     }
0231 
0232     {
0233         KContacts::Address address;
0234         address.setCountry(QStringLiteral("CH"));
0235         QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QString()), QLatin1String("SVIZZERA"));
0236     }
0237 
0238     {
0239         // business format for postal style
0240         KContacts::Address address;
0241         address.setCountry(QStringLiteral("AT"));
0242         address.setLocality(QStringLiteral("Berlin"));
0243         address.setPostalCode(QStringLiteral("10969"));
0244         address.setStreet(QStringLiteral("Prinzenstraße 85 F"));
0245         const auto result = QString::fromUtf8("KDE e.V.\nz.Hd. Dr. Konqi\nPrinzenstraße 85 F\n10969 Berlin\n\nAUSTRIA");
0246         QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal, QStringLiteral("Dr. Konqi"), QStringLiteral("KDE e.V.")), result);
0247     }
0248 
0249     {
0250         // local vs latin script formats
0251         KContacts::Address address;
0252         address.setCountry(QStringLiteral("JP"));
0253         address.setRegion(QStringLiteral("Tokyo"));
0254         address.setLocality(QStringLiteral("Minato-ku"));
0255         address.setPostalCode(QStringLiteral("106-0047"));
0256         address.setStreet(QStringLiteral("4-6-28 Minami-Azabu"));
0257         auto result = QString::fromUtf8("4-6-28 Minami-Azabu, Minato-ku\nTOKYO 106-0047\n\nGIAPPONE");
0258         QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal), result);
0259 
0260         address.setRegion(QStringLiteral("東京"));
0261         address.setLocality(QStringLiteral("都港区"));
0262         address.setPostalCode(QStringLiteral("106-0047"));
0263         address.setStreet(QStringLiteral("南麻布 4-6-28"));
0264         result = QString::fromUtf8("〒106-0047\n東京都港区南麻布 4-6-28\n\nGIAPPONE");
0265         QCOMPARE(address.formatted(KContacts::AddressFormatStyle::Postal), result);
0266     }
0267 }
0268 
0269 void AddressTest::shouldExportVcard3()
0270 {
0271     KContacts::Address address;
0272 
0273     address.setId(QStringLiteral("My Id"));
0274     address.setType(KContacts::Address::Home);
0275     address.setPostOfficeBox(QStringLiteral("1234"));
0276     address.setExtended(QStringLiteral("My Extended Label"));
0277     address.setStreet(QStringLiteral("My Street"));
0278     address.setLocality(QStringLiteral("My Locality"));
0279     address.setRegion(QStringLiteral("My Region"));
0280     address.setPostalCode(QStringLiteral("My Postalcode"));
0281     address.setCountry(QStringLiteral("My country"));
0282     address.setLabel(QStringLiteral("My Label"));
0283 
0284     KContacts::AddresseeList lst;
0285     KContacts::Addressee addr;
0286     addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
0287     addr.setUid(QStringLiteral("testuid"));
0288     addr.insertAddress(address);
0289     lst << addr;
0290 
0291     KContacts::VCardTool vcard;
0292     const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
0293     QByteArray expected(
0294         "BEGIN:VCARD\r\n"
0295         "VERSION:3.0\r\n"
0296         "ADR;TYPE=home:1234;My Extended Label;My Street;My Locality;My Region;My Pos\r\n"
0297         " talcode;My country\r\n"
0298         "EMAIL:foo@kde.org\r\n"
0299         "LABEL;TYPE=home:My Label\r\n"
0300         "N:;;;;\r\n"
0301         "UID:testuid\r\n"
0302         "END:VCARD\r\n\r\n");
0303     QCOMPARE(ba, expected);
0304 }
0305 
0306 void AddressTest::shouldParseAddressVCard3()
0307 {
0308     QByteArray vcarddata(
0309         "BEGIN:VCARD\n"
0310         "VERSION:3.0\n"
0311         "N:LastName;FirstName;;;\n"
0312         "ADR;TYPE=home:1234;My Extended Label;My Street;My Locality;My Region;My Pos\r\n"
0313         " talcode;My country\r\n"
0314         "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n"
0315         "LABEL;TYPE=home:My Label\r\n"
0316         "REV:2015-03-14T09:24:45+00:00\n"
0317         "FN:FirstName LastName\n"
0318         "END:VCARD\n");
0319 
0320     KContacts::VCardTool vcard;
0321     const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
0322     QCOMPARE(lst.count(), 1);
0323     QCOMPARE(lst.at(0).addresses().count(), 1);
0324     KContacts::Address address = lst.at(0).addresses().at(0);
0325     QCOMPARE(address.type(), KContacts::Address::Home);
0326     QCOMPARE(address.postOfficeBox(), QStringLiteral("1234"));
0327     QCOMPARE(address.extended(), QStringLiteral("My Extended Label"));
0328     QCOMPARE(address.region(), QStringLiteral("My Region"));
0329     QCOMPARE(address.street(), QStringLiteral("My Street"));
0330     QCOMPARE(address.country(), QStringLiteral("My country"));
0331     QCOMPARE(address.postalCode(), QStringLiteral("My Postalcode"));
0332     QCOMPARE(address.label(), QStringLiteral("My Label"));
0333 }
0334 
0335 void AddressTest::shouldParseAddressVCard4()
0336 {
0337     QByteArray vcarddata(
0338         "BEGIN:VCARD\r\n"
0339         "VERSION:4.0\r\n"
0340         "ADR;LABEL=\"My Label\";TYPE=home:1234;My Extended Label;My Street;My Locality\r\n"
0341         " ;My Region;My Postalcode;My country\r\nEMAIL:foo@kde.org\r\n"
0342         "N:;;;;\r\n"
0343         "UID:testuid\r\n"
0344         "END:VCARD\r\n\r\n");
0345     KContacts::VCardTool vcard;
0346     const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
0347     QCOMPARE(lst.count(), 1);
0348     QCOMPARE(lst.at(0).addresses().count(), 1);
0349     KContacts::Address address = lst.at(0).addresses().at(0);
0350     QCOMPARE(address.type(), KContacts::Address::Home);
0351     QCOMPARE(address.postOfficeBox(), QStringLiteral("1234"));
0352     QCOMPARE(address.extended(), QStringLiteral("My Extended Label"));
0353     QCOMPARE(address.region(), QStringLiteral("My Region"));
0354     QCOMPARE(address.street(), QStringLiteral("My Street"));
0355     QCOMPARE(address.country(), QStringLiteral("My country"));
0356     QCOMPARE(address.postalCode(), QStringLiteral("My Postalcode"));
0357     QCOMPARE(address.label(), QStringLiteral("My Label"));
0358 }
0359 
0360 void AddressTest::shouldParseAddressVCard4WithGeoPosition()
0361 {
0362     QByteArray vcarddata(
0363         "BEGIN:VCARD\r\n"
0364         "VERSION:4.0\r\n"
0365         "ADR;GEO=\"geo:22.500000,45.099998\";LABEL=\"My Label\";TYPE=home:1234;My Extend\r\n"
0366         " ed Label;My Street;My Locality;My Region;My Postalcode;My country\r\n"
0367         "EMAIL:foo@kde.org\r\n"
0368         "N:;;;;\r\n"
0369         "UID:testuid\r\n"
0370         "END:VCARD\r\n\r\n");
0371     KContacts::VCardTool vcard;
0372     const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
0373     QCOMPARE(lst.count(), 1);
0374     QCOMPARE(lst.at(0).addresses().count(), 1);
0375     KContacts::Address address = lst.at(0).addresses().at(0);
0376     QCOMPARE(address.type(), KContacts::Address::Home);
0377     QCOMPARE(address.postOfficeBox(), QStringLiteral("1234"));
0378     QCOMPARE(address.extended(), QStringLiteral("My Extended Label"));
0379     QCOMPARE(address.region(), QStringLiteral("My Region"));
0380     QCOMPARE(address.street(), QStringLiteral("My Street"));
0381     QCOMPARE(address.country(), QStringLiteral("My country"));
0382     QCOMPARE(address.postalCode(), QStringLiteral("My Postalcode"));
0383     QCOMPARE(address.label(), QStringLiteral("My Label"));
0384     KContacts::Geo geo = address.geo();
0385     QVERIFY(geo.isValid());
0386     QCOMPARE(geo.latitude(), 22.5f);
0387     QCOMPARE(geo.longitude(), 45.1f);
0388 }
0389 
0390 void AddressTest::shouldExportVCard4WithGeoPosition()
0391 {
0392     KContacts::Address address;
0393 
0394     address.setId(QStringLiteral("My Id"));
0395     address.setType(KContacts::Address::Home);
0396     address.setPostOfficeBox(QStringLiteral("1234"));
0397     address.setExtended(QStringLiteral("My Extended Label"));
0398     address.setStreet(QStringLiteral("My Street"));
0399     address.setLocality(QStringLiteral("My Locality"));
0400     address.setRegion(QStringLiteral("My Region"));
0401     address.setPostalCode(QStringLiteral("My Postalcode"));
0402     address.setCountry(QStringLiteral("My country"));
0403     address.setLabel(QStringLiteral("My Label"));
0404 
0405     KContacts::Geo geo;
0406 
0407     geo.setLatitude(22.5f);
0408     geo.setLongitude(45.1f);
0409     address.setGeo(geo);
0410 
0411     KContacts::AddresseeList lst;
0412     KContacts::Addressee addr;
0413     addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
0414     addr.setUid(QStringLiteral("testuid"));
0415     addr.insertAddress(address);
0416     lst << addr;
0417 
0418     KContacts::VCardTool vcard;
0419     const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
0420     QByteArray expected(
0421         "BEGIN:VCARD\r\n"
0422         "VERSION:4.0\r\n"
0423         "ADR;GEO=\"geo:22.500000,45.099998\";LABEL=\"My Label\";TYPE=home:1234;My Extend\r\n"
0424         " ed Label;My Street;My Locality;My Region;My Postalcode;My country\r\n"
0425         "EMAIL:foo@kde.org\r\n"
0426         "N:;;;;\r\n"
0427         "UID:testuid\r\n"
0428         "END:VCARD\r\n\r\n");
0429     QCOMPARE(ba, expected);
0430 }
0431 
0432 void AddressTest::shouldExportVcard4()
0433 {
0434     KContacts::Address address;
0435 
0436     address.setId(QStringLiteral("My Id"));
0437     address.setType(KContacts::Address::Home);
0438     address.setPostOfficeBox(QStringLiteral("1234"));
0439     address.setExtended(QStringLiteral("My Extended Label"));
0440     address.setStreet(QStringLiteral("My Street"));
0441     address.setLocality(QStringLiteral("My Locality"));
0442     address.setRegion(QStringLiteral("My Region"));
0443     address.setPostalCode(QStringLiteral("My Postalcode"));
0444     address.setCountry(QStringLiteral("My country"));
0445     address.setLabel(QStringLiteral("My Label"));
0446 
0447     KContacts::AddresseeList lst;
0448     KContacts::Addressee addr;
0449     addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
0450     addr.setUid(QStringLiteral("testuid"));
0451     addr.insertAddress(address);
0452     lst << addr;
0453 
0454     KContacts::VCardTool vcard;
0455     const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
0456     QByteArray expected(
0457         "BEGIN:VCARD\r\n"
0458         "VERSION:4.0\r\n"
0459         "ADR;LABEL=\"My Label\";TYPE=home:1234;My Extended Label;My Street;My Locality\r\n"
0460         " ;My Region;My Postalcode;My country\r\nEMAIL:foo@kde.org\r\n"
0461         "N:;;;;\r\n"
0462         "UID:testuid\r\n"
0463         "END:VCARD\r\n\r\n");
0464     QCOMPARE(ba, expected);
0465 }
0466 
0467 void AddressTest::testGeoUri()
0468 {
0469     KContacts::Address addr;
0470     addr.setCountry(QStringLiteral("DE"));
0471     addr.setRegion(QStringLiteral("BE"));
0472     addr.setLocality(QStringLiteral("Berlin"));
0473     addr.setPostalCode(QStringLiteral("10969"));
0474     addr.setStreet(QStringLiteral("Prinzenstraße 85 F"));
0475     addr.setExtended(QStringLiteral("East wing"));
0476 
0477     QCOMPARE(addr.geoUri(), QUrl(QStringLiteral("geo:0,0?q=Prinzenstraße 85 F,10969 Berlin,DE")));
0478 
0479     addr.setGeo({52.503, 13.41});
0480     QCOMPARE(addr.geoUri(), QUrl(QStringLiteral("geo:52.503,13.41")));
0481 }
0482 
0483 #include "moc_addresstest.cpp"