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

0001 /*
0002     This file is part of the KContacts framework.
0003     SPDX-FileCopyrightText: 2012 Kevin Krammer <krammer@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "addressee.h"
0009 
0010 #include "converter/vcardconverter.h"
0011 
0012 #include <QDebug>
0013 #include <QDir>
0014 #include <QObject>
0015 #include <QTest>
0016 
0017 using namespace KContacts;
0018 
0019 class RoundtripTest : public QObject
0020 {
0021     Q_OBJECT
0022 
0023 private:
0024     QDir mInputDir;
0025     QDir mOutput2_1Dir;
0026     QDir mOutput3_0Dir;
0027     QDir mOutput4_0Dir;
0028 
0029     QStringList mInputFiles;
0030 
0031 private Q_SLOTS:
0032     void initTestCase();
0033     void testVCardRoundtrip_data();
0034     void testVCardRoundtrip();
0035 };
0036 
0037 // check the validity of our test data set
0038 void RoundtripTest::initTestCase()
0039 {
0040     // check that all resource prefixes exist
0041 
0042     mInputDir = QDir(QStringLiteral(":/input"));
0043     QVERIFY(mInputDir.exists());
0044     QVERIFY(mInputDir.cd(QStringLiteral("data")));
0045 
0046     mOutput2_1Dir = QDir(QStringLiteral(":/output2.1"));
0047     QVERIFY(mOutput2_1Dir.exists());
0048     QVERIFY(mOutput2_1Dir.cd(QStringLiteral("data")));
0049 
0050     mOutput3_0Dir = QDir(QStringLiteral(":/output3.0"));
0051     QVERIFY(mOutput3_0Dir.exists());
0052     QVERIFY(mOutput3_0Dir.cd(QStringLiteral("data")));
0053 
0054     mOutput4_0Dir = QDir(QStringLiteral(":/output4.0"));
0055     QVERIFY(mOutput4_0Dir.exists());
0056     QVERIFY(mOutput4_0Dir.cd(QStringLiteral("data")));
0057 
0058     // check that there are input files
0059 
0060     mInputFiles = mInputDir.entryList();
0061 
0062     QVERIFY(!mInputFiles.isEmpty());
0063 }
0064 
0065 void RoundtripTest::testVCardRoundtrip_data()
0066 {
0067     QTest::addColumn<QString>("inputFile");
0068     QTest::addColumn<QString>("output2_1File");
0069     QTest::addColumn<QString>("output3_0File");
0070     QTest::addColumn<QString>("output4_0File");
0071 
0072     QString outFile21Pattern = QLatin1String("%1.2_1ref");
0073     QString outFile4Pattern = QLatin1String("v4_0.%1.ref");
0074     QString outFilePattern = QLatin1String("%1.ref");
0075     for (const QString &inputFile : std::as_const(mInputFiles)) {
0076         const QString outFile = outFilePattern.arg(inputFile);
0077         const QString outFileV2_1 = outFile21Pattern.arg(inputFile);
0078         const QString outFileV4 = outFile4Pattern.arg(inputFile);
0079         QTest::newRow(QFile::encodeName(inputFile).constData())
0080             << inputFile << (mOutput2_1Dir.exists(outFileV2_1) ? outFileV2_1 : QString()) << (mOutput3_0Dir.exists(outFile) ? outFile : QString())
0081             << (mOutput4_0Dir.exists(outFileV4) ? outFileV4 : QString());
0082     }
0083 }
0084 
0085 static void compareBuffers(const char *version, const QByteArray &outputData, const QByteArray &outputRefData)
0086 {
0087     if (outputData != outputRefData) {
0088         qDebug() << " outputData " << outputData;
0089         qDebug() << " outputRefData " << outputRefData;
0090     }
0091     const QList<QByteArray> outputLines = outputData.split('\n');
0092     const QList<QByteArray> outputRefLines = outputRefData.split('\n');
0093     for (int i = 0; i < qMin(outputLines.count(), outputRefLines.count()); ++i) {
0094         const QByteArray &actual = outputLines.at(i);
0095         const QByteArray &expect = outputRefLines.at(i);
0096         if (actual != expect) {
0097             qCritical() << "Mismatch in" << version << "output line" << (i + 1);
0098             QCOMPARE(actual, expect);
0099             QCOMPARE(actual.size(), expect.size());
0100         }
0101     }
0102     QCOMPARE(outputLines.count(), outputRefLines.count());
0103     QCOMPARE(outputData.size(), outputRefData.size());
0104 }
0105 
0106 void RoundtripTest::testVCardRoundtrip()
0107 {
0108     QFETCH(QString, inputFile);
0109     QFETCH(QString, output2_1File);
0110     QFETCH(QString, output3_0File);
0111     QFETCH(QString, output4_0File);
0112 
0113     QVERIFY2(!output2_1File.isEmpty() || !output3_0File.isEmpty() || !output4_0File.isEmpty(), "No reference output file for either format version");
0114 
0115     QFile input(QFileInfo(mInputDir, inputFile).absoluteFilePath());
0116     QVERIFY(input.open(QIODevice::ReadOnly));
0117 
0118     const QByteArray inputData = input.readAll();
0119     QVERIFY(!inputData.isEmpty());
0120 
0121     VCardConverter converter;
0122     const Addressee::List list = converter.parseVCards(inputData);
0123     QVERIFY(!list.isEmpty());
0124 
0125     if (!output2_1File.isEmpty()) {
0126         const QByteArray outputData = converter.createVCards(list, VCardConverter::v2_1);
0127 
0128         QFile outputFile(QFileInfo(mOutput2_1Dir, output2_1File).absoluteFilePath());
0129         QVERIFY(outputFile.open(QIODevice::ReadOnly));
0130 
0131         const QByteArray outputRefData = outputFile.readAll();
0132         compareBuffers("v2.1", outputData, outputRefData);
0133     }
0134 
0135     if (!output3_0File.isEmpty()) {
0136         const QByteArray outputData = converter.createVCards(list, VCardConverter::v3_0);
0137 
0138         QFile outputFile(QFileInfo(mOutput3_0Dir, output3_0File).absoluteFilePath());
0139         QVERIFY(outputFile.open(QIODevice::ReadOnly));
0140 
0141         const QByteArray outputRefData = outputFile.readAll();
0142         compareBuffers("v3.0", outputData, outputRefData);
0143     }
0144 #if 0
0145     if (!output4_0File.isEmpty()) {
0146         const QByteArray outputData = converter.createVCards(list, VCardConverter::v4_0);
0147 
0148         QFile outputFile(QFileInfo(mOutput4_0Dir, output4_0File).absoluteFilePath());
0149         QVERIFY(outputFile.open(QIODevice::ReadOnly));
0150 
0151         const QByteArray outputRefData = outputFile.readAll();
0152         compareBuffers("v4.0", outputData, outputRefData);
0153     }
0154 #endif
0155 }
0156 
0157 QTEST_MAIN(RoundtripTest)
0158 
0159 #include "testroundtrip.moc"