File indexing completed on 2024-04-28 15:59:44

0001 /*
0002     SPDX-FileCopyrightText: 2024 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #include "testhelpers.h"
0007 #include "backends/motisparser.cpp"
0008 
0009 #include <KPublicTransport/Journey>
0010 #include <KPublicTransport/Location>
0011 #include <KPublicTransport/Stopover>
0012 
0013 #include <QFile>
0014 #include <QJsonArray>
0015 #include <QJsonObject>
0016 #include <QJsonDocument>
0017 #include <QJsonValue>
0018 #include <QTest>
0019 
0020 using namespace Qt::Literals::StringLiterals;
0021 using namespace KPublicTransport;
0022 
0023 class MotisParserTest : public QObject
0024 {
0025     Q_OBJECT
0026 private Q_SLOTS:
0027     void initTestCase()
0028     {
0029         qputenv("TZ", "UTC");
0030     }
0031 
0032     void testParseLocation_data()
0033     {
0034         QTest::addColumn<QString>("inFileName");
0035         QTest::addColumn<QString>("outFileName");
0036 
0037         QTest::newRow("name-search")
0038             << QStringLiteral(SOURCE_DIR "/data/motis/location-name-search.in.json")
0039             << QStringLiteral(SOURCE_DIR "/data/motis/location-name-search.out.json");
0040         QTest::newRow("geo-lookup")
0041             << QStringLiteral(SOURCE_DIR "/data/motis/location-geo-search.in.json")
0042             << QStringLiteral(SOURCE_DIR "/data/motis/location-geo-search.out.json");
0043     }
0044 
0045     void testParseLocation()
0046     {
0047         QFETCH(QString, inFileName);
0048         QFETCH(QString, outFileName);
0049 
0050         MotisParser p(u"motis"_s);
0051         const auto result = p.parseStations(Test::readFile(inFileName));
0052         QVERIFY(!result.empty());
0053         QVERIFY(!p.hasError());
0054         const auto resultJson = Location::toJson(result);
0055         const auto resultRef = QJsonDocument::fromJson(Test::readFile(outFileName)).array();
0056         QVERIFY(!resultJson.isEmpty());
0057         QVERIFY(Test::compareJson(outFileName, resultJson, resultRef));
0058     }
0059 
0060     void testParseStopovers_data()
0061     {
0062         QTest::addColumn<QString>("inFileName");
0063         QTest::addColumn<QString>("outFileName");
0064 
0065         QTest::newRow("stopover-non-terminal")
0066             << QStringLiteral(SOURCE_DIR "/data/motis/stopovers-non-terminal.in.json")
0067             << QStringLiteral(SOURCE_DIR "/data/motis/stopovers-non-terminal.out.json");
0068         QTest::newRow("stopover-terminal")
0069             << QStringLiteral(SOURCE_DIR "/data/motis/stopovers-terminal.in.json")
0070             << QStringLiteral(SOURCE_DIR "/data/motis/stopovers-terminal.out.json");
0071     }
0072 
0073     void testParseStopovers()
0074     {
0075         QFETCH(QString, inFileName);
0076         QFETCH(QString, outFileName);
0077 
0078         MotisParser p(u"motis"_s);
0079         const auto result = p.parseEvents(Test::readFile(inFileName));
0080         QVERIFY(!result.empty());
0081         QVERIFY(!p.hasError());
0082         const auto resultJson = Stopover::toJson(result);
0083         const auto resultRef = QJsonDocument::fromJson(Test::readFile(outFileName)).array();
0084         QVERIFY(!resultJson.isEmpty());
0085         QVERIFY(Test::compareJson(outFileName, resultJson, resultRef));
0086     }
0087 
0088     void testParseJourneys_data()
0089     {
0090         QTest::addColumn<QString>("inFileName");
0091         QTest::addColumn<QString>("outFileName");
0092 
0093         QTest::newRow("ch-transport-only")
0094             << QStringLiteral(SOURCE_DIR "/data/motis/journey-ch-transport-only.in.json")
0095             << QStringLiteral(SOURCE_DIR "/data/motis/journey-ch-transport-only.out.json");
0096     }
0097 
0098     void testParseJourneys()
0099     {
0100         QFETCH(QString, inFileName);
0101         QFETCH(QString, outFileName);
0102 
0103         MotisParser p(u"motis"_s);
0104         const auto result = p.parseConnections(Test::readFile(inFileName));
0105         QVERIFY(!result.empty());
0106         QVERIFY(!p.hasError());
0107         const auto resultJson = Journey::toJson(result);
0108         const auto resultRef = QJsonDocument::fromJson(Test::readFile(outFileName)).array();
0109         QVERIFY(!resultJson.isEmpty());
0110         QVERIFY(Test::compareJson(outFileName, resultJson, resultRef));
0111     }
0112 
0113     void testParseError()
0114     {
0115         {
0116             MotisParser p(u"motis"_s);
0117             const auto result = p.parseStations(Test::readFile(QStringLiteral(SOURCE_DIR "/data/motis/error.in.json")));
0118             QVERIFY(result.empty());
0119             QVERIFY(p.hasError());
0120             QCOMPARE(p.errorMessage(), "access: timestamp not in schedule"_L1);
0121         }
0122         {
0123             MotisParser p(u"motis"_s);
0124             const auto result = p.parseConnections(Test::readFile(QStringLiteral(SOURCE_DIR "/data/motis/error.in.json")));
0125             QVERIFY(result.empty());
0126             QVERIFY(p.hasError());
0127             QCOMPARE(p.errorMessage(), "access: timestamp not in schedule"_L1);
0128         }
0129     }
0130 };
0131 
0132 QTEST_GUILESS_MAIN(MotisParserTest)
0133 
0134 #include "motisparsertest.moc"