File indexing completed on 2024-04-21 04:41:06

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "testhelpers.h"
0008 
0009 #include "backends/efacompactparser.h"
0010 #include "backends/efaxmlparser.h"
0011 
0012 #include <KPublicTransport/Journey>
0013 #include <KPublicTransport/Location>
0014 #include <KPublicTransport/Stopover>
0015 
0016 #include <QFile>
0017 #include <QJsonArray>
0018 #include <QJsonDocument>
0019 #include <QJsonValue>
0020 #include <QTest>
0021 #include <QTimeZone>
0022 
0023 #define s(x) QStringLiteral(x)
0024 
0025 using namespace KPublicTransport;
0026 
0027 class EfaParserTest : public QObject
0028 {
0029     Q_OBJECT
0030 private:
0031     QByteArray readFile(const QString &fn)
0032     {
0033         QFile f(fn);
0034         f.open(QFile::ReadOnly);
0035         return f.readAll();
0036     }
0037 
0038 private Q_SLOTS:
0039     void initTestCase()
0040     {
0041         qputenv("TZ", "UTC");
0042         qRegisterMetaType<Disruption::Effect>();
0043     }
0044 
0045     void testParseLocation_data()
0046     {
0047         QTest::addColumn<QString>("inFileName");
0048         QTest::addColumn<QString>("refFileName");
0049 
0050         QTest::newRow("vgn-by-coord")
0051             << s(SOURCE_DIR "/data/efa/stopfinder-response-full-vgn-by-coord.xml")
0052             << s(SOURCE_DIR "/data/efa/stopfinder-response-full-vgn-by-coord.json");
0053         QTest::newRow("chicago-by-name")
0054             << s(SOURCE_DIR "/data/efa/stopfinder-response-full-chicago-by-name.xml")
0055             << s(SOURCE_DIR "/data/efa/stopfinder-response-full-chicago-by-name.json");
0056         QTest::newRow("tfi-alternate-format")
0057             << s(SOURCE_DIR "/data/efa/stopfinder-response-full-alternate-tfi-by-name.xml")
0058             << s(SOURCE_DIR "/data/efa/stopfinder-response-full-alternate-tfi-by-name.json");
0059         QTest::newRow("mvv-alternate-format")
0060             << s(SOURCE_DIR "/data/efa/stopfinder-response-full-alternate-mvv-by-name.xml")
0061             << s(SOURCE_DIR "/data/efa/stopfinder-response-full-alternate-mvv-by-name.json");
0062         QTest::newRow("bwegt-by-name")
0063             << s(SOURCE_DIR "/data/efa/stopfinder-response-full-bwegt-by-name.xml")
0064             << s(SOURCE_DIR "/data/efa/stopfinder-response-full-bwegt-by-name.json");
0065     }
0066 
0067     void testParseLocation()
0068     {
0069         QFETCH(QString, inFileName);
0070         QFETCH(QString, refFileName);
0071 
0072         KPublicTransport::EfaXmlParser parser;
0073         parser.setLocationIdentifierType(s("testid"));
0074 
0075         const auto res = parser.parseStopFinderResponse(readFile(inFileName));
0076         const auto jsonRes = Location::toJson(res);
0077 
0078         const auto ref = QJsonDocument::fromJson(readFile(refFileName)).array();
0079 
0080         if (jsonRes != ref) {
0081             qDebug().noquote() << QJsonDocument(jsonRes).toJson();
0082         }
0083         QCOMPARE(jsonRes, ref);
0084     }
0085 
0086     void testParseCompactLocation_data()
0087     {
0088         QTest::addColumn<QString>("inFileName");
0089         QTest::addColumn<QString>("refFileName");
0090 
0091         QTest::newRow("by-by-name")
0092             << s(SOURCE_DIR "/data/efa/stopfinder-response-compact-by-by-name.xml")
0093             << s(SOURCE_DIR "/data/efa/stopfinder-response-compact-by-by-name.json");
0094     }
0095 
0096     void testParseCompactLocation()
0097     {
0098         QFETCH(QString, inFileName);
0099         QFETCH(QString, refFileName);
0100 
0101         KPublicTransport::EfaCompactParser parser;
0102         parser.setLocationIdentifierType(s("testid"));
0103 
0104         const auto res = parser.parseStopFinderResponse(readFile(inFileName));
0105         const auto jsonRes = Location::toJson(res);
0106 
0107         const auto ref = QJsonDocument::fromJson(readFile(refFileName)).array();
0108 
0109         if (jsonRes != ref) {
0110             qDebug().noquote() << QJsonDocument(jsonRes).toJson();
0111         }
0112         QCOMPARE(jsonRes, ref);
0113     }
0114 
0115     void testParseDepartures_data()
0116     {
0117         QTest::addColumn<QString>("inFileName");
0118         QTest::addColumn<QString>("refFileName");
0119 
0120         QTest::newRow("vgn-departures")
0121             << s(SOURCE_DIR "/data/efa/dm-response-full-vgn-departures.xml")
0122             << s(SOURCE_DIR "/data/efa/dm-response-full-vgn-departures.json");
0123     }
0124 
0125     void testParseDepartures()
0126     {
0127         QFETCH(QString, inFileName);
0128         QFETCH(QString, refFileName);
0129 
0130         KPublicTransport::EfaXmlParser parser;
0131         parser.setLocationIdentifierType(s("testid"));
0132 
0133         const auto res = parser.parseDmResponse(readFile(inFileName));
0134         const auto jsonRes = Stopover::toJson(res);
0135 
0136         const auto ref = QJsonDocument::fromJson(readFile(refFileName)).array();
0137 
0138         if (jsonRes != ref) {
0139             qDebug().noquote() << QJsonDocument(jsonRes).toJson();
0140         }
0141         QVERIFY(!jsonRes.empty());
0142         QCOMPARE(jsonRes, ref);
0143 
0144         QVERIFY(!parser.requestContext().isEmpty());
0145         QCOMPARE(parser.requestContext().sessionId, QLatin1String("123456789"));
0146         QCOMPARE(parser.requestContext().requestId, QLatin1String("0"));
0147     }
0148 
0149     void testParseCompactDepartures_data()
0150     {
0151         QTest::addColumn<QString>("inFileName");
0152         QTest::addColumn<QString>("refFileName");
0153 
0154         QTest::newRow("by-departures")
0155             << s(SOURCE_DIR "/data/efa/dm-response-compact-by-departures.xml")
0156             << s(SOURCE_DIR "/data/efa/dm-response-compact-by-departures.json");
0157     }
0158 
0159     void testParseCompactDepartures()
0160     {
0161         QFETCH(QString, inFileName);
0162         QFETCH(QString, refFileName);
0163 
0164         KPublicTransport::EfaCompactParser parser;
0165         parser.setLocationIdentifierType(s("testid"));
0166 
0167         const auto res = parser.parseDmResponse(readFile(inFileName));
0168         const auto jsonRes = Stopover::toJson(res);
0169 
0170         const auto ref = QJsonDocument::fromJson(readFile(refFileName)).array();
0171 
0172         if (jsonRes != ref) {
0173             qDebug().noquote() << QJsonDocument(jsonRes).toJson();
0174         }
0175         QVERIFY(!jsonRes.empty());
0176         QCOMPARE(jsonRes, ref);
0177 
0178         QVERIFY(!parser.requestContext().isEmpty());
0179         QCOMPARE(parser.requestContext().sessionId, QLatin1String("123456789"));
0180         QCOMPARE(parser.requestContext().requestId, QLatin1String("0"));
0181     }
0182 
0183     void testParseTrips_data()
0184     {
0185         QTest::addColumn<QString>("inFileName");
0186         QTest::addColumn<QString>("refFileName");
0187 
0188         QTest::newRow("vgn-trip")
0189             << s(SOURCE_DIR "/data/efa/trip-response-full-vgn.xml")
0190             << s(SOURCE_DIR "/data/efa/trip-response-full-vgn.json");
0191         QTest::newRow("vgn-trip-indoor-path")
0192             << s(SOURCE_DIR "/data/efa/trip-response-full-indoor-path-vgn.xml")
0193             << s(SOURCE_DIR "/data/efa/trip-response-full-indoor-path-vgn.json");
0194         QTest::newRow("vrt-trip-alternative-notes")
0195             << s(SOURCE_DIR "/data/efa/trip-response-full-vrt.xml")
0196             << s(SOURCE_DIR "/data/efa/trip-response-full-vrt.json");
0197     }
0198 
0199     void testParseTrips()
0200     {
0201         QFETCH(QString, inFileName);
0202         QFETCH(QString, refFileName);
0203 
0204         KPublicTransport::EfaXmlParser parser;
0205         parser.setLocationIdentifierType(s("testid"));
0206 
0207         const auto res = parser.parseTripResponse(readFile(inFileName));
0208         const auto jsonRes = Journey::toJson(res);
0209 
0210         const auto ref = QJsonDocument::fromJson(readFile(refFileName)).array();
0211 
0212         QVERIFY(!jsonRes.empty());
0213         QVERIFY(Test::compareJson(refFileName, jsonRes, ref));
0214 
0215         QVERIFY(!parser.requestContext().isEmpty());
0216         QCOMPARE(parser.requestContext().sessionId, QLatin1String("123456789"));
0217         QCOMPARE(parser.requestContext().requestId, QLatin1String("0"));
0218     }
0219 
0220     void testParseCompactTrips_data()
0221     {
0222         QTest::addColumn<QString>("inFileName");
0223         QTest::addColumn<QString>("refFileName");
0224 
0225         QTest::newRow("by-trip")
0226             << s(SOURCE_DIR "/data/efa/trip-response-compact-by.xml")
0227             << s(SOURCE_DIR "/data/efa/trip-response-compact-by.json");
0228     }
0229 
0230     void testParseCompactTrips()
0231     {
0232         QFETCH(QString, inFileName);
0233         QFETCH(QString, refFileName);
0234 
0235         KPublicTransport::EfaCompactParser parser;
0236         parser.setLocationIdentifierType(s("testid"));
0237 
0238         const auto res = parser.parseTripResponse(readFile(inFileName));
0239         const auto jsonRes = Journey::toJson(res);
0240 
0241         const auto ref = QJsonDocument::fromJson(readFile(refFileName)).array();
0242 
0243         QVERIFY(!jsonRes.empty());
0244         QVERIFY(Test::compareJson(refFileName, jsonRes, ref));
0245 
0246         QVERIFY(!parser.requestContext().isEmpty());
0247         QCOMPARE(parser.requestContext().sessionId, QLatin1String("123456789"));
0248         QCOMPARE(parser.requestContext().requestId, QLatin1String("0"));
0249     }
0250 
0251 };
0252 
0253 QTEST_GUILESS_MAIN(EfaParserTest)
0254 
0255 #include "efaparsertest.moc"