1 /* 2 SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org> 3 4 SPDX-License-Identifier: LGPL-2.0-or-later 5 */ 6 7 #include <extractorvalidator.h> 8 9 #include <KItinerary/JsonLdDocument> 10 #include <KItinerary/Reservation> 11 12 #include <QDebug> 13 #include <QFile> 14 #include <QJsonArray> 15 #include <QJsonDocument> 16 #include <QTest> 17 18 using namespace KItinerary; 19 20 class ExtractorValidatorTest : public QObject 21 { 22 Q_OBJECT 23 private: readFile(const char * fn) const24 QByteArray readFile(const char *fn) const 25 { 26 QFile f(QString::fromUtf8(fn)); 27 f.open(QFile::ReadOnly); 28 return f.readAll(); 29 } 30 private Q_SLOTS: testValidate()31 void testValidate() 32 { 33 ExtractorValidator v; 34 35 auto input = JsonLdDocument::fromJson(QJsonDocument::fromJson(readFile(SOURCE_DIR "/mergedata/cancellation.lhs.json")).array()); 36 QCOMPARE(input.size(), 1); 37 QVERIFY(v.isValidElement(input.at(0))); 38 39 input = JsonLdDocument::fromJson(QJsonDocument::fromJson(readFile(SOURCE_DIR "/mergedata/cancellation.rhs.json")).array()); 40 QCOMPARE(input.size(), 1); 41 QVERIFY(!v.isValidElement(input.at(0))); 42 v.setAcceptOnlyCompleteElements(false); 43 QVERIFY(v.isValidElement(input.at(0))); 44 45 v.setAcceptOnlyCompleteElements(true); 46 v.setAcceptedTypes<FlightReservation, TrainReservation>(); 47 input = JsonLdDocument::fromJson(QJsonDocument::fromJson(readFile(SOURCE_DIR "/mergedata/cancellation.lhs.json")).array()); 48 QCOMPARE(input.size(), 1); 49 QVERIFY(v.isValidElement(input.at(0))); 50 v.setAcceptedTypes<LodgingReservation, TrainReservation>(); 51 QVERIFY(!v.isValidElement(input.at(0))); 52 v.setAcceptedTypes(); 53 QVERIFY(v.isValidElement(input.at(0))); 54 } 55 testFilter_data()56 void testFilter_data() 57 { 58 QTest::addColumn<QString>("preFile"); 59 QTest::addColumn<QString>("postFile"); 60 61 QDir dir(QStringLiteral(SOURCE_DIR "/validationdata")); 62 const auto lst = dir.entryList(QStringList(QStringLiteral("*.pre.json")), QDir::Files | QDir::Readable | QDir::NoSymLinks); 63 for (const auto &file : lst) { 64 const QString refFile = dir.path() + QLatin1Char('/') + file.left(file.size() - 8) + QStringLiteral("post.json"); 65 if (!QFile::exists(refFile)) { 66 qDebug() << "reference file" << refFile << "does not exist, skipping test file" << file; 67 continue; 68 } 69 QTest::newRow(file.toLatin1().constData()) << QString(dir.path() + QLatin1Char('/') + file) << refFile; 70 } 71 } 72 testFilter()73 void testFilter() 74 { 75 QFETCH(QString, preFile); 76 QFETCH(QString, postFile); 77 78 QFile f(preFile); 79 QVERIFY(f.open(QFile::ReadOnly)); 80 const auto inArray = QJsonDocument::fromJson(f.readAll()).array(); 81 QVERIFY(!inArray.isEmpty()); 82 auto preData = JsonLdDocument::fromJson(inArray); 83 QCOMPARE(inArray.size(), preData.size()); 84 85 ExtractorValidator validator; 86 preData.erase(std::remove_if(preData.begin(), preData.end(), [&validator](const auto &elem) { 87 return !validator.isValidElement(elem); 88 }), preData.end()); 89 const auto outArray = JsonLdDocument::toJson(preData); 90 91 QFile ref(postFile); 92 QVERIFY(ref.open(QFile::ReadOnly)); 93 const auto refArray = QJsonDocument::fromJson(ref.readAll()).array(); 94 95 if (outArray != refArray) { 96 qDebug().noquote() << QJsonDocument(outArray).toJson(); 97 } 98 QCOMPARE(refArray.size(), outArray.size()); 99 QCOMPARE(outArray, refArray); 100 } 101 }; 102 103 QTEST_GUILESS_MAIN(ExtractorValidatorTest) 104 105 #include "extractorvalidatortest.moc" 106