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"