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"