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