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

0001 /*
0002     SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include <KItinerary/JsonLdDocument>
0008 #include <KItinerary/Rct2Ticket>
0009 #include <KItinerary/Uic9183Block>
0010 #include <KItinerary/Uic9183TicketLayout>
0011 
0012 #include <QDebug>
0013 #include <QFile>
0014 #include <QJsonArray>
0015 #include <QJsonDocument>
0016 #include <QObject>
0017 #include <QProcess>
0018 #include <QTest>
0019 
0020 using namespace KItinerary;
0021 
0022 class Rct2ParserTest : public QObject
0023 {
0024     Q_OBJECT
0025 private Q_SLOTS:
0026     void testParserValid_data()
0027     {
0028         QTest::addColumn<QString>("inFile");
0029         QTest::addColumn<QString>("refFile");
0030 
0031         QDir dir(QStringLiteral(SOURCE_DIR "/rct2/valid"));
0032         const auto lst = dir.entryList(QStringList(QStringLiteral("*.rct2")), QDir::Files | QDir::Readable | QDir::NoSymLinks);
0033         for (const auto &file : lst) {
0034             const QString refFile = dir.path() + QLatin1Char('/') + file.left(file.size() - 5) + QStringLiteral(".json");
0035             if (!QFile::exists(refFile)) {
0036                 qDebug() << "reference file" << refFile << "does not exist, skipping test file" << file;
0037                 continue;
0038             }
0039             QTest::newRow(file.toUtf8().constData()) << QString(dir.path() + QLatin1Char('/') +  file) << refFile;
0040         }
0041     }
0042 
0043     void testParserValid()
0044     {
0045         QFETCH(QString, inFile);
0046         QFETCH(QString, refFile);
0047 
0048         QFile f(inFile);
0049         QVERIFY(f.open(QFile::ReadOnly));
0050 
0051         const auto data = f.readAll();
0052         Uic9183TicketLayout layout(Uic9183Block(data, 0));
0053         Rct2Ticket rct2(layout);
0054         rct2.setContextDate({{2018, 12, 19}, {18, 35}});
0055         QVERIFY(layout.isValid());
0056         QCOMPARE(layout.type(), QLatin1StringView("RCT2"));
0057         QVERIFY(rct2.isValid());
0058 
0059         QFile ref(refFile);
0060         QVERIFY(ref.open(QFile::ReadOnly));
0061         const auto refArray = QJsonDocument::fromJson(ref.readAll()).array();
0062         QVERIFY(!refArray.isEmpty());
0063 
0064         const auto resJson = JsonLdDocument::toJson(
0065             QList<QVariant>({QVariant::fromValue(rct2)}));
0066         if (refArray != resJson) {
0067             qWarning().noquote() << QJsonDocument(resJson).toJson();
0068             QFile failFile(refFile + QLatin1StringView(".fail"));
0069             QVERIFY(failFile.open(QFile::WriteOnly));
0070             failFile.write(QJsonDocument(resJson).toJson());
0071             failFile.close();
0072 
0073             QProcess proc;
0074             proc.setProcessChannelMode(QProcess::ForwardedChannels);
0075             proc.start(QStringLiteral("diff"), {QStringLiteral("-u"), refFile, failFile.fileName()});
0076             QVERIFY(proc.waitForFinished());
0077         }
0078         QCOMPARE(resJson, refArray);
0079     }
0080 };
0081 
0082 QTEST_APPLESS_MAIN(Rct2ParserTest)
0083 
0084 #include "rct2parsertest.moc"