File indexing completed on 2024-04-14 04:36:17

0001 /*
0002     SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "testhelpers.h"
0008 
0009 #include <KPublicTransport/Journey>
0010 #include <KPublicTransport/HafasMgateParser>
0011 #include <KPublicTransport/Stopover>
0012 
0013 #include <QFile>
0014 #include <QJsonArray>
0015 #include <QJsonDocument>
0016 #include <QJsonObject>
0017 #include <QJsonValue>
0018 #include <QTest>
0019 #include <QTimeZone>
0020 
0021 #define s(x) QStringLiteral(x)
0022 
0023 using namespace KPublicTransport;
0024 
0025 class HafasMgateParserTest : public QObject
0026 {
0027     Q_OBJECT
0028 private Q_SLOTS:
0029     void initTestCase()
0030     {
0031         qputenv("TZ", "UTC");
0032         qRegisterMetaType<Disruption::Effect>();
0033     }
0034 
0035     void testParseGeneralError_data()
0036     {
0037         QTest::addColumn<QString>("input");
0038         QTest::newRow("version") << s(SOURCE_DIR "/data/hafas/error-invalid-version.json");
0039         QTest::newRow("parse-clientId") << s(SOURCE_DIR "/data/hafas/error-parse-clientId.json");
0040         QTest::newRow("parse-stbFilterEquiv") << s(SOURCE_DIR "/data/hafas/error-parse-stbFilterEquiv.json");
0041         QTest::newRow("parse-empty") << s(SOURCE_DIR "/data/hafas/error-parse-empty.json");
0042     }
0043 
0044     void testParseGeneralError()
0045     {
0046         QFETCH(QString, input);
0047 
0048         {
0049             HafasMgateParser p;
0050             p.parseLocations(Test::readFile(input));
0051             QCOMPARE(p.error(), Reply::UnknownError);
0052             QVERIFY(!p.errorMessage().isEmpty());
0053         }
0054 
0055         {
0056             HafasMgateParser p;
0057             p.parseDepartures(Test::readFile(input));
0058             QCOMPARE(p.error(), Reply::UnknownError);
0059             QVERIFY(!p.errorMessage().isEmpty());
0060         }
0061 
0062         {
0063             HafasMgateParser p;
0064             p.parseJourneys(Test::readFile(input));
0065             QCOMPARE(p.error(), Reply::UnknownError);
0066             QVERIFY(!p.errorMessage().isEmpty());
0067         }
0068     }
0069 
0070     void testParseDepartureError()
0071     {
0072         HafasMgateParser p;
0073         const auto res = p.parseDepartures(Test::readFile(s(SOURCE_DIR "/data/hafas/stationboard-error-response.json")));
0074         QVERIFY(res.empty());
0075         QCOMPARE(p.error(), Reply::NotFoundError);
0076         QVERIFY(!p.errorMessage().isEmpty());
0077     }
0078 
0079     void parseDateTime_data()
0080     {
0081         QTest::addColumn<QString>("date");
0082         QTest::addColumn<QString>("time");
0083         QTest::addColumn<QJsonValue>("tzOffset");
0084         QTest::addColumn<QDateTime>("dt");
0085 
0086         QTest::newRow("empty") << QString() << QString() << QJsonValue() << QDateTime();
0087         QTest::newRow("same day") << s("20190105") << s("142100") << QJsonValue() << QDateTime({2019, 1, 5}, {14, 21});
0088         QTest::newRow("next day") << s("20190105") << s("01142100") << QJsonValue() << QDateTime({2019, 1, 6}, {14, 21});
0089         QTest::newRow("same day offset") << s("20190105") << s("142100") << QJsonValue(120) << QDateTime({2019, 1, 5}, {14, 21}, QTimeZone::fromSecondsAheadOfUtc(7200));
0090         QTest::newRow("next day offset") << s("20190105") << s("01142100") << QJsonValue(-120) << QDateTime({2019, 1, 6}, {14, 21}, QTimeZone::fromSecondsAheadOfUtc(-7200));
0091     }
0092 
0093     void parseDateTime()
0094     {
0095         QFETCH(QString, date);
0096         QFETCH(QString, time);
0097         QFETCH(QJsonValue, tzOffset);
0098         QFETCH(QDateTime, dt);
0099         QCOMPARE(HafasMgateParser::parseDateTime(date, QJsonValue(time), tzOffset), dt);
0100     }
0101 
0102     void testParseDepartures_data()
0103     {
0104         QTest::addColumn<QString>("inFileName");
0105         QTest::addColumn<QString>("refFileName");
0106 
0107         QTest::newRow("de-nw-avv-canceled-departures")
0108             << s(SOURCE_DIR "/data/hafas/canceled-departures.in.json")
0109             << s(SOURCE_DIR "/data/hafas/canceled-departures.out.json");
0110     }
0111 
0112     void testParseDepartures()
0113     {
0114         QFETCH(QString, inFileName);
0115         QFETCH(QString, refFileName);
0116 
0117         HafasMgateParser p;
0118         p.setLocationIdentifierTypes(QStringLiteral("unit-test"));
0119         const auto res = p.parseDepartures(Test::readFile(inFileName));
0120         const auto jsonRes = Stopover::toJson(res);
0121 
0122         const auto ref = QJsonDocument::fromJson(Test::readFile(refFileName)).array();
0123 
0124         if (jsonRes != ref) {
0125             qDebug().noquote() << QJsonDocument(jsonRes).toJson();
0126         }
0127         QVERIFY(!jsonRes.empty());
0128         QCOMPARE(jsonRes, ref);
0129     }
0130 
0131     void testParseJourneys_data()
0132     {
0133         QTest::addColumn<QString>("inFileName");
0134         QTest::addColumn<QString>("refFileName");
0135 
0136         QTest::newRow("de-db-canceled-with-path")
0137             << s(SOURCE_DIR "/data/hafas/canceled-journey-with-path.in.json")
0138             << s(SOURCE_DIR "/data/hafas/canceled-journey-with-path.out.json");
0139         QTest::newRow("de-bvg-alternative-load-messages")
0140             << s(SOURCE_DIR "/data/hafas/journey-bvg-load-messages.in.json")
0141             << s(SOURCE_DIR "/data/hafas/journey-bvg-load-messages.out.json");
0142         QTest::newRow("de-vsn-alternative-platform-data")
0143             << s(SOURCE_DIR "/data/hafas/journey-vsn-alternative-platform-data.in.json")
0144             << s(SOURCE_DIR "/data/hafas/journey-vsn-alternative-platform-data.out.json");
0145     }
0146 
0147     void testParseJourneys()
0148     {
0149         QFETCH(QString, inFileName);
0150         QFETCH(QString, refFileName);
0151 
0152         HafasMgateParser p;
0153         p.setLocationIdentifierTypes(QStringLiteral("unit-test"));
0154         const auto res = p.parseJourneys(Test::readFile(inFileName));
0155         const auto jsonRes = Journey::toJson(res);
0156 
0157         const auto ref = QJsonDocument::fromJson(Test::readFile(refFileName)).array();
0158 
0159         QVERIFY(!jsonRes.empty());
0160         QVERIFY(Test::compareJson(refFileName, jsonRes, ref));
0161     }
0162 };
0163 
0164 QTEST_GUILESS_MAIN(HafasMgateParserTest)
0165 
0166 #include "hafasmgateparsertest.moc"