File indexing completed on 2024-05-12 05:13:46

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "testhelper.h"
0008 
0009 #include "statisticsmodel.h"
0010 #include "statisticstimerangemodel.h"
0011 #include "applicationcontroller.h"
0012 #include "reservationmanager.h"
0013 #include "tripgroupmanager.h"
0014 
0015 #include <QAbstractItemModelTester>
0016 #include <QUrl>
0017 #include <QtTest/qtest.h>
0018 #include <QSignalSpy>
0019 #include <QStandardPaths>
0020 
0021 void initLocale()
0022 {
0023     qputenv("LC_ALL", "en_US.utf-8");
0024     qputenv("LANG", "C");
0025 }
0026 
0027 Q_CONSTRUCTOR_FUNCTION(initLocale)
0028 
0029 class StatisticsTest : public QObject
0030 {
0031     Q_OBJECT
0032 private Q_SLOTS:
0033     void initTestCase()
0034     {
0035         qputenv("TZ", "UTC");
0036         qunsetenv("LANG");
0037         qunsetenv("LANGUAGE");
0038         qunsetenv("LC_CTYPE");
0039         QStandardPaths::setTestModeEnabled(true);
0040     }
0041 
0042     void testStats()
0043     {
0044         ReservationManager resMgr;
0045         Test::clearAll(&resMgr);
0046         TripGroupManager::clear();
0047         TripGroupManager tgMgr;
0048         tgMgr.setReservationManager(&resMgr);
0049         auto ctrl = Test::makeAppController();
0050         ctrl->setReservationManager(&resMgr);
0051 
0052         StatisticsModel stats;
0053         QSignalSpy changeSpy(&stats, &StatisticsModel::changed);
0054         stats.setReservationManager(&resMgr);
0055         stats.setTripGroupManager(&tgMgr);
0056 
0057         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/../tests/randa2017.json")));
0058         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/../tests/akademy2017.json")));
0059         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/../tests/akademy2018-program.json")));
0060         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/timeline/flight-cancelation.json"))); // canceled flight, should not change stats
0061 
0062         stats.setTimeRange({}, {});
0063         QVERIFY(!changeSpy.isEmpty());
0064         auto item = stats.totalCount();
0065         QCOMPARE(item.m_value, QLatin1StringView("2"));
0066         QCOMPARE(item.m_trend, StatisticsItem::TrendUnknown);
0067         QCOMPARE(item.m_hasData, true);
0068         item = stats.totalNights();
0069         QCOMPARE(item.m_value, QLatin1StringView("13"));
0070         QCOMPARE(item.m_trend, StatisticsItem::TrendUnknown);
0071         QCOMPARE(item.m_hasData, true);
0072         item = stats.totalDistance();
0073         QCOMPARE(item.m_value, QLatin1StringView("6,182 km"));
0074         QCOMPARE(item.m_trend, StatisticsItem::TrendUnknown);
0075         QCOMPARE(item.m_hasData, true);
0076         item = stats.totalCO2();
0077         QCOMPARE(item.m_value, QLatin1StringView("1,673 kg"));
0078         QCOMPARE(item.m_trend, StatisticsItem::TrendUnknown);
0079         QCOMPARE(item.m_hasData, true);
0080 
0081         item = stats.flightCount();
0082         QCOMPARE(item.m_value, QLatin1StringView("6"));
0083         QCOMPARE(item.m_trend, StatisticsItem::TrendUnknown);
0084         QCOMPARE(item.m_hasData, true);
0085         item = stats.flightDistance();
0086         QCOMPARE(item.m_value, QLatin1StringView("5,859 km"));
0087         QCOMPARE(item.m_trend, StatisticsItem::TrendUnknown);
0088         QCOMPARE(item.m_hasData, true);
0089         item = stats.flightCO2();
0090         QCOMPARE(item.m_value, QLatin1StringView("1,669 kg"));
0091         QCOMPARE(item.m_trend, StatisticsItem::TrendUnknown);
0092         QCOMPARE(item.m_hasData, true);
0093 
0094         item = stats.trainCount();
0095         QCOMPARE(item.m_value, QLatin1StringView("4"));
0096         QCOMPARE(item.m_trend, StatisticsItem::TrendUnknown);
0097         QCOMPARE(item.m_hasData, true);
0098         item = stats.trainDistance();
0099         QCOMPARE(item.m_value, QLatin1StringView("323 km"));
0100         QCOMPARE(item.m_trend, StatisticsItem::TrendUnknown);
0101         QCOMPARE(item.m_hasData, true);
0102         item = stats.trainCO2();
0103         QCOMPARE(item.m_value, QLatin1StringView("4.4 kg"));
0104         QCOMPARE(item.m_trend, StatisticsItem::TrendUnknown);
0105         QCOMPARE(item.m_hasData, true);
0106 
0107         item = stats.carCount();
0108         QCOMPARE(item.m_value, QLatin1StringView("0"));
0109         QCOMPARE(item.m_trend, StatisticsItem::TrendUnknown);
0110         QCOMPARE(item.m_hasData, false);
0111 
0112         changeSpy.clear();
0113         stats.setTimeRange({2017, 9, 1}, {2018, 1, 1});
0114         QVERIFY(!changeSpy.isEmpty());
0115         item = stats.totalCount();
0116         QCOMPARE(item.m_value, QLatin1StringView("1"));
0117         QCOMPARE(item.m_trend, StatisticsItem::TrendUnchanged);
0118         QCOMPARE(item.m_hasData, true);
0119         item = stats.totalNights();
0120         QCOMPARE(item.m_value, QLatin1StringView("5"));
0121         QCOMPARE(item.m_trend, StatisticsItem::TrendDown);
0122         QCOMPARE(item.m_hasData, true);
0123         item = stats.totalDistance();
0124         QCOMPARE(item.m_value, QLatin1StringView("1,642 km"));
0125         QCOMPARE(item.m_trend, StatisticsItem::TrendDown);
0126         QCOMPARE(item.m_hasData, true);
0127         item = stats.totalCO2();
0128         QCOMPARE(item.m_value, QLatin1StringView("380 kg"));
0129         QCOMPARE(item.m_trend, StatisticsItem::TrendDown);
0130         QCOMPARE(item.m_hasData, true);
0131 
0132         item = stats.flightCount();
0133         QCOMPARE(item.m_value, QLatin1StringView("2"));
0134         QCOMPARE(item.m_trend, StatisticsItem::TrendDown);
0135         QCOMPARE(item.m_hasData, true);
0136         item = stats.flightDistance();
0137         QCOMPARE(item.m_value, QLatin1StringView("1,319 km"));
0138         QCOMPARE(item.m_trend, StatisticsItem::TrendDown);
0139         QCOMPARE(item.m_hasData, true);
0140         item = stats.flightCO2();
0141         QCOMPARE(item.m_value, QLatin1StringView("376 kg"));
0142         QCOMPARE(item.m_trend, StatisticsItem::TrendDown);
0143         QCOMPARE(item.m_hasData, true);
0144 
0145         item = stats.trainCount();
0146         QCOMPARE(item.m_value, QLatin1StringView("4"));
0147         QCOMPARE(item.m_trend, StatisticsItem::TrendUp);
0148         QCOMPARE(item.m_hasData, true);
0149         item = stats.trainDistance();
0150         QCOMPARE(item.m_value, QLatin1StringView("323 km"));
0151         QCOMPARE(item.m_trend, StatisticsItem::TrendUp);
0152         QCOMPARE(item.m_hasData, true);
0153         item = stats.trainCO2();
0154         QCOMPARE(item.m_value, QLatin1StringView("4.4 kg"));
0155         QCOMPARE(item.m_trend, StatisticsItem::TrendUp);
0156         QCOMPARE(item.m_hasData, true);
0157 
0158         QCOMPARE(stats.boatCount().m_value, QLatin1StringView("0"));
0159         QCOMPARE(stats.boatCount().m_hasData, false);
0160         QCOMPARE(stats.boatDistance().m_hasData, false);
0161         QCOMPARE(stats.boatCO2().m_hasData, false);
0162     }
0163 
0164     void testTimeRangeModel()
0165     {
0166         ReservationManager resMgr;
0167         Test::clearAll(&resMgr);
0168         auto ctrl = Test::makeAppController();
0169         ctrl->setReservationManager(&resMgr);
0170 
0171         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/../tests/randa2017.json")));
0172         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/../tests/akademy2017.json")));
0173         ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/../tests/akademy2018-program.json")));
0174 
0175         StatisticsTimeRangeModel model;
0176         QAbstractItemModelTester tester(&model);
0177         QCOMPARE(model.rowCount(), 1);
0178 
0179         model.setReservationManager(&resMgr);
0180         QCOMPARE(model.rowCount(), 3);
0181         QCOMPARE(model.data(model.index(1, 0), Qt::DisplayRole).toString(), QLatin1StringView("2018"));
0182         QCOMPARE(model.data(model.index(2, 0), Qt::DisplayRole).toString(), QLatin1StringView("2017"));
0183 
0184         QCOMPARE(model.data(model.index(1, 0), StatisticsTimeRangeModel::BeginRole).toDate(), QDate(2018, 1, 1));
0185         QCOMPARE(model.data(model.index(1, 0), StatisticsTimeRangeModel::EndRole).toDate(), QDate(2018, 12, 31));
0186         QCOMPARE(model.data(model.index(2, 0), StatisticsTimeRangeModel::BeginRole).toDate(), QDate());
0187         QCOMPARE(model.data(model.index(2, 0), StatisticsTimeRangeModel::EndRole).toDate(), QDate(2017, 12, 31));
0188     }
0189 };
0190 
0191 QTEST_GUILESS_MAIN(StatisticsTest)
0192 
0193 #include "statisticstest.moc"