File indexing completed on 2024-05-12 05:17:30

0001 /*
0002     SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "extractorvalidator.h"
0008 
0009 #include <KItinerary/JsonLdDocument>
0010 #include <KItinerary/Reservation>
0011 
0012 #include <QDebug>
0013 #include <QFile>
0014 #include <QJsonArray>
0015 #include <QJsonDocument>
0016 #include <QTest>
0017 
0018 using namespace KItinerary;
0019 
0020 class ExtractorValidatorTest : public QObject
0021 {
0022     Q_OBJECT
0023 private:
0024     QByteArray readFile(const char *fn) const
0025     {
0026         QFile f(QString::fromUtf8(fn));
0027         f.open(QFile::ReadOnly);
0028         return f.readAll();
0029     }
0030 private Q_SLOTS:
0031     void testValidate()
0032     {
0033         ExtractorValidator v;
0034 
0035         auto input = JsonLdDocument::fromJson(QJsonDocument::fromJson(readFile(SOURCE_DIR "/mergedata/cancellation.lhs.json")).array());
0036         QCOMPARE(input.size(), 1);
0037         QVERIFY(v.isValidElement(input.at(0)));
0038 
0039         input = JsonLdDocument::fromJson(QJsonDocument::fromJson(readFile(SOURCE_DIR "/mergedata/cancellation.rhs.json")).array());
0040         QCOMPARE(input.size(), 1);
0041         QVERIFY(!v.isValidElement(input.at(0)));
0042         v.setAcceptOnlyCompleteElements(false);
0043         QVERIFY(v.isValidElement(input.at(0)));
0044 
0045         v.setAcceptOnlyCompleteElements(true);
0046         v.setAcceptedTypes<FlightReservation, TrainReservation>();
0047         input = JsonLdDocument::fromJson(QJsonDocument::fromJson(readFile(SOURCE_DIR "/mergedata/cancellation.lhs.json")).array());
0048         QCOMPARE(input.size(), 1);
0049         QVERIFY(v.isValidElement(input.at(0)));
0050         v.setAcceptedTypes<LodgingReservation, TrainReservation>();
0051         QVERIFY(!v.isValidElement(input.at(0)));
0052         v.setAcceptedTypes();
0053         QVERIFY(v.isValidElement(input.at(0)));
0054     }
0055 
0056     void testFilter_data()
0057     {
0058         QTest::addColumn<QString>("preFile");
0059         QTest::addColumn<QString>("postFile");
0060 
0061         QDir dir(QStringLiteral(SOURCE_DIR "/validationdata"));
0062         const auto lst = dir.entryList(QStringList(QStringLiteral("*.pre.json")), QDir::Files | QDir::Readable | QDir::NoSymLinks);
0063         for (const auto &file : lst) {
0064             const QString refFile = dir.path() + QLatin1Char('/') + file.left(file.size() - 8) + QStringLiteral("post.json");
0065             if (!QFile::exists(refFile)) {
0066                 qDebug() << "reference file" << refFile << "does not exist, skipping test file" << file;
0067                 continue;
0068             }
0069             QTest::newRow(file.toLatin1().constData()) << QString(dir.path() + QLatin1Char('/') +  file) << refFile;
0070         }
0071     }
0072 
0073     void testFilter()
0074     {
0075         QFETCH(QString, preFile);
0076         QFETCH(QString, postFile);
0077 
0078         QFile f(preFile);
0079         QVERIFY(f.open(QFile::ReadOnly));
0080         const auto inArray = QJsonDocument::fromJson(f.readAll()).array();
0081         QVERIFY(!inArray.isEmpty());
0082         auto preData = JsonLdDocument::fromJson(inArray);
0083         QCOMPARE(inArray.size(), preData.size());
0084 
0085         ExtractorValidator validator;
0086         preData.erase(std::remove_if(preData.begin(), preData.end(), [&validator](const auto &elem) {
0087             return !validator.isValidElement(elem);
0088         }), preData.end());
0089         const auto outArray = JsonLdDocument::toJson(preData);
0090 
0091         QFile ref(postFile);
0092         QVERIFY(ref.open(QFile::ReadOnly));
0093         const auto refArray = QJsonDocument::fromJson(ref.readAll()).array();
0094 
0095         if (outArray != refArray) {
0096             qDebug().noquote() << QJsonDocument(outArray).toJson();
0097         }
0098         QCOMPARE(refArray.size(), outArray.size());
0099         QCOMPARE(outArray, refArray);
0100     }
0101 };
0102 
0103 QTEST_GUILESS_MAIN(ExtractorValidatorTest)
0104 
0105 #include "extractorvalidatortest.moc"