File indexing completed on 2024-04-21 14:49:23
0001 /*************************************************************************** 0002 File : JsonFilterTest.cpp 0003 Project : LabPlot 0004 Description : Tests for the JSON I/O-filter. 0005 -------------------------------------------------------------------- 0006 -------------------------------------------------------------------- 0007 Copyright : (C) 2018 Andrey Cygankov (craftplace.ms@gmail.com) 0008 0009 ***************************************************************************/ 0010 0011 /*************************************************************************** 0012 * * 0013 * This program is free software; you can redistribute it and/or modify * 0014 * it under the terms of the GNU General Public License as published by * 0015 * the Free Software Foundation; either version 2 of the License, or * 0016 * (at your option) any later version. * 0017 * * 0018 * This program is distributed in the hope that it will be useful, * 0019 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0020 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0021 * GNU General Public License for more details. * 0022 * * 0023 * You should have received a copy of the GNU General Public License * 0024 * along with this program; if not, write to the Free Software * 0025 * Foundation, Inc., 51 Franklin Street, Fifth Floor, * 0026 * Boston, MA 02110-1301 USA * 0027 * * 0028 ***************************************************************************/ 0029 0030 #include "JsonFilterTest.h" 0031 #include "backend/datasources/filters/JsonFilter.h" 0032 #include "backend/spreadsheet/Spreadsheet.h" 0033 0034 #include <KLocalizedString> 0035 0036 void JsonFilterTest::initTestCase() { 0037 // needed in order to have the signals triggered by SignallingUndoCommand, see LabPlot.cpp 0038 //TODO: redesign/remove this 0039 qRegisterMetaType<const AbstractAspect*>("const AbstractAspect*"); 0040 qRegisterMetaType<const AbstractColumn*>("const AbstractColumn*"); 0041 } 0042 0043 void JsonFilterTest::testArrayImport() { 0044 Spreadsheet spreadsheet("test", false); 0045 JsonFilter filter; 0046 0047 const QString& fileName = QFINDTESTDATA(QLatin1String("data/array.json")); 0048 AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace; 0049 filter.setCreateIndexEnabled(true); 0050 filter.setDataRowType(QJsonValue::Array); 0051 filter.setDateTimeFormat(QLatin1String("yyyy-MM-dd")); 0052 filter.readDataFromFile(fileName, &spreadsheet, mode); 0053 0054 QCOMPARE(spreadsheet.columnCount(), 3); 0055 QCOMPARE(spreadsheet.rowCount(), 3); 0056 QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer); 0057 QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::DateTime); 0058 QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0059 0060 QCOMPARE(spreadsheet.column(0)->plotDesignation(), AbstractColumn::PlotDesignation::X); 0061 QCOMPARE(spreadsheet.column(1)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0062 QCOMPARE(spreadsheet.column(2)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0063 0064 QCOMPARE(spreadsheet.column(0)->name(), i18n("index")); 0065 QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("Column 1")); //TODO is translatable in JsonFilter 0066 QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("Column 2")); 0067 0068 QCOMPARE(spreadsheet.column(0)->integerAt(0), 1); 0069 QCOMPARE(spreadsheet.column(0)->integerAt(1), 2); 0070 QCOMPARE(spreadsheet.column(0)->integerAt(2), 3); 0071 0072 QDateTime value = QDateTime::fromString(QLatin1String("2018-06-01"), QLatin1String("yyyy-MM-dd")); 0073 QCOMPARE(spreadsheet.column(1)->dateTimeAt(0), value); 0074 value = QDateTime::fromString(QLatin1String("2018-06-02"), QLatin1String("yyyy-MM-dd")); 0075 QCOMPARE(spreadsheet.column(1)->dateTimeAt(1), value); 0076 value = QDateTime::fromString(QLatin1String("2018-06-03"), QLatin1String("yyyy-MM-dd")); 0077 QCOMPARE(spreadsheet.column(1)->dateTimeAt(2), value); 0078 0079 QCOMPARE(spreadsheet.column(2)->valueAt(0), 0.01); 0080 QCOMPARE(spreadsheet.column(2)->valueAt(1), 0.02); 0081 QCOMPARE(spreadsheet.column(2)->valueAt(2), 0.03); 0082 } 0083 0084 /*! 0085 * import objects with an additional column for the index 0086 */ 0087 void JsonFilterTest::testObjectImport01() { 0088 Spreadsheet spreadsheet("test", false); 0089 JsonFilter filter; 0090 0091 const QString& fileName = QFINDTESTDATA(QLatin1String("data/object.json")); 0092 AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace; 0093 filter.setCreateIndexEnabled(true); 0094 filter.setDataRowType(QJsonValue::Object); 0095 filter.readDataFromFile(fileName, &spreadsheet, mode); 0096 0097 QCOMPARE(spreadsheet.columnCount(), 5); 0098 QCOMPARE(spreadsheet.rowCount(), 3); 0099 QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer); 0100 QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0101 QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0102 QCOMPARE(spreadsheet.column(3)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0103 QCOMPARE(spreadsheet.column(4)->columnMode(), AbstractColumn::ColumnMode::Text); 0104 0105 QCOMPARE(spreadsheet.column(0)->plotDesignation(), AbstractColumn::PlotDesignation::X); 0106 QCOMPARE(spreadsheet.column(1)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0107 QCOMPARE(spreadsheet.column(2)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0108 QCOMPARE(spreadsheet.column(3)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0109 QCOMPARE(spreadsheet.column(4)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0110 0111 QCOMPARE(spreadsheet.column(0)->name(), i18n("index")); 0112 QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("1")); 0113 QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("2")); 0114 QCOMPARE(spreadsheet.column(3)->name(), QLatin1String("3")); 0115 QCOMPARE(spreadsheet.column(4)->name(), QLatin1String("4")); 0116 0117 QCOMPARE(spreadsheet.column(0)->integerAt(0), 1); 0118 QCOMPARE(spreadsheet.column(0)->integerAt(1), 2); 0119 QCOMPARE(spreadsheet.column(0)->integerAt(2), 3); 0120 0121 QCOMPARE(spreadsheet.column(1)->valueAt(0), 1.234); 0122 QCOMPARE(spreadsheet.column(1)->valueAt(1), 111.); 0123 QCOMPARE(spreadsheet.column(1)->valueAt(2), 0.001); 0124 0125 QCOMPARE(spreadsheet.column(2)->valueAt(0), 2.345); 0126 QCOMPARE(spreadsheet.column(2)->valueAt(1), 222.); 0127 QCOMPARE(spreadsheet.column(2)->valueAt(2), 0.002); 0128 0129 QCOMPARE(spreadsheet.column(3)->valueAt(0), 3.456); 0130 QCOMPARE(spreadsheet.column(3)->valueAt(1), 333.); 0131 QCOMPARE(spreadsheet.column(3)->valueAt(2), 0.003); 0132 0133 QCOMPARE(spreadsheet.column(4)->textAt(0), QString("field1")); 0134 QCOMPARE(spreadsheet.column(4)->textAt(1), QString("field2")); 0135 QCOMPARE(spreadsheet.column(4)->textAt(2), QString("field3")); 0136 } 0137 0138 /*! 0139 * import objects with an additional column for the object names 0140 */ 0141 void JsonFilterTest::testObjectImport02() { 0142 Spreadsheet spreadsheet("test", false); 0143 JsonFilter filter; 0144 0145 const QString& fileName = QFINDTESTDATA(QLatin1String("data/object.json")); 0146 AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace; 0147 filter.setDataRowType(QJsonValue::Object); 0148 filter.setImportObjectNames(true); 0149 filter.readDataFromFile(fileName, &spreadsheet, mode); 0150 0151 QCOMPARE(spreadsheet.columnCount(), 5); 0152 QCOMPARE(spreadsheet.rowCount(), 3); 0153 QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Text); 0154 QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0155 QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0156 QCOMPARE(spreadsheet.column(3)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0157 QCOMPARE(spreadsheet.column(4)->columnMode(), AbstractColumn::ColumnMode::Text); 0158 0159 QCOMPARE(spreadsheet.column(0)->plotDesignation(), AbstractColumn::PlotDesignation::X); 0160 QCOMPARE(spreadsheet.column(1)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0161 QCOMPARE(spreadsheet.column(2)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0162 QCOMPARE(spreadsheet.column(3)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0163 QCOMPARE(spreadsheet.column(4)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0164 0165 QCOMPARE(spreadsheet.column(0)->name(), i18n("name")); 0166 QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("1")); 0167 QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("2")); 0168 QCOMPARE(spreadsheet.column(3)->name(), QLatin1String("3")); 0169 QCOMPARE(spreadsheet.column(4)->name(), QLatin1String("4")); 0170 0171 QCOMPARE(spreadsheet.column(0)->textAt(0), QString("field1")); 0172 QCOMPARE(spreadsheet.column(0)->textAt(1), QString("field2")); 0173 QCOMPARE(spreadsheet.column(0)->textAt(2), QString("field3")); 0174 0175 QCOMPARE(spreadsheet.column(1)->valueAt(0), 1.234); 0176 QCOMPARE(spreadsheet.column(1)->valueAt(1), 111.); 0177 QCOMPARE(spreadsheet.column(1)->valueAt(2), 0.001); 0178 0179 QCOMPARE(spreadsheet.column(2)->valueAt(0), 2.345); 0180 QCOMPARE(spreadsheet.column(2)->valueAt(1), 222.); 0181 QCOMPARE(spreadsheet.column(2)->valueAt(2), 0.002); 0182 0183 QCOMPARE(spreadsheet.column(3)->valueAt(0), 3.456); 0184 QCOMPARE(spreadsheet.column(3)->valueAt(1), 333.); 0185 QCOMPARE(spreadsheet.column(3)->valueAt(2), 0.003); 0186 0187 QCOMPARE(spreadsheet.column(4)->textAt(0), QString("field1")); 0188 QCOMPARE(spreadsheet.column(4)->textAt(1), QString("field2")); 0189 QCOMPARE(spreadsheet.column(4)->textAt(2), QString("field3")); 0190 } 0191 0192 /*! 0193 * import objects with an additional column for the object names 0194 * with custom start and end columns 0195 */ 0196 void JsonFilterTest::testObjectImport03() { 0197 Spreadsheet spreadsheet("test", false); 0198 JsonFilter filter; 0199 0200 const QString& fileName = QFINDTESTDATA(QLatin1String("data/object.json")); 0201 AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace; 0202 filter.setDataRowType(QJsonValue::Object); 0203 filter.setImportObjectNames(true); 0204 filter.setStartColumn(2); 0205 filter.setEndColumn(3); 0206 filter.readDataFromFile(fileName, &spreadsheet, mode); 0207 0208 QCOMPARE(spreadsheet.columnCount(), 3); 0209 QCOMPARE(spreadsheet.rowCount(), 3); 0210 QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Text); 0211 QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0212 QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0213 0214 QCOMPARE(spreadsheet.column(0)->plotDesignation(), AbstractColumn::PlotDesignation::X); 0215 QCOMPARE(spreadsheet.column(1)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0216 QCOMPARE(spreadsheet.column(2)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0217 0218 QCOMPARE(spreadsheet.column(0)->name(), i18n("name")); 0219 QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("2")); 0220 QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("3")); 0221 0222 QCOMPARE(spreadsheet.column(0)->textAt(0), QString("field1")); 0223 QCOMPARE(spreadsheet.column(0)->textAt(1), QString("field2")); 0224 QCOMPARE(spreadsheet.column(0)->textAt(2), QString("field3")); 0225 0226 QCOMPARE(spreadsheet.column(1)->valueAt(0), 2.345); 0227 QCOMPARE(spreadsheet.column(1)->valueAt(1), 222.); 0228 QCOMPARE(spreadsheet.column(1)->valueAt(2), 0.002); 0229 0230 QCOMPARE(spreadsheet.column(2)->valueAt(0), 3.456); 0231 QCOMPARE(spreadsheet.column(2)->valueAt(1), 333.); 0232 QCOMPARE(spreadsheet.column(2)->valueAt(2), 0.003); 0233 } 0234 0235 /*! 0236 * import objects with an additional datetime column for the object names 0237 */ 0238 void JsonFilterTest::testObjectImport04() { 0239 Spreadsheet spreadsheet("test", false); 0240 JsonFilter filter; 0241 0242 const QString& fileName = QFINDTESTDATA(QLatin1String("data/intraday.json")); 0243 AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace; 0244 QVector<int> rows{0, 1}; 0245 filter.setModelRows(rows); 0246 filter.setDataRowType(QJsonValue::Object); 0247 filter.setImportObjectNames(true); 0248 0249 QString dateTimeFormat("yyyy-MM-dd hh:mm:ss"); 0250 filter.setDateTimeFormat(dateTimeFormat); 0251 filter.setStartRow(1); 0252 filter.setEndRow(2); 0253 filter.readDataFromFile(fileName, &spreadsheet, mode); 0254 0255 QCOMPARE(spreadsheet.columnCount(), 6); 0256 QCOMPARE(spreadsheet.rowCount(), 2); 0257 QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::DateTime); 0258 QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0259 QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0260 QCOMPARE(spreadsheet.column(3)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0261 QCOMPARE(spreadsheet.column(4)->columnMode(), AbstractColumn::ColumnMode::Numeric); 0262 QCOMPARE(spreadsheet.column(5)->columnMode(), AbstractColumn::ColumnMode::Integer); 0263 0264 QCOMPARE(spreadsheet.column(0)->plotDesignation(), AbstractColumn::PlotDesignation::X); 0265 QCOMPARE(spreadsheet.column(1)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0266 QCOMPARE(spreadsheet.column(2)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0267 QCOMPARE(spreadsheet.column(3)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0268 QCOMPARE(spreadsheet.column(4)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0269 QCOMPARE(spreadsheet.column(5)->plotDesignation(), AbstractColumn::PlotDesignation::Y); 0270 0271 QCOMPARE(spreadsheet.column(0)->name(), i18n("timestamp")); 0272 QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("1. open")); 0273 QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("2. high")); 0274 QCOMPARE(spreadsheet.column(3)->name(), QLatin1String("3. low")); 0275 QCOMPARE(spreadsheet.column(4)->name(), QLatin1String("4. close")); 0276 QCOMPARE(spreadsheet.column(5)->name(), QLatin1String("5. volume")); 0277 0278 //TODO: the values are sorted with respect to the names of the objects, i.e. to the timestamp. Why? 0279 QCOMPARE(spreadsheet.column(0)->dateTimeAt(0).toString(dateTimeFormat), QString("2018-06-14 15:56:00")); 0280 QCOMPARE(spreadsheet.column(0)->dateTimeAt(1).toString(dateTimeFormat), QString("2018-06-14 15:57:00")); 0281 0282 QCOMPARE(spreadsheet.column(1)->valueAt(0), 101.2700); 0283 QCOMPARE(spreadsheet.column(1)->valueAt(1), 101.2700); 0284 0285 QCOMPARE(spreadsheet.column(2)->valueAt(0), 101.2800); 0286 QCOMPARE(spreadsheet.column(2)->valueAt(1), 101.3350); 0287 0288 QCOMPARE(spreadsheet.column(3)->valueAt(0), 101.2600); 0289 QCOMPARE(spreadsheet.column(3)->valueAt(1), 101.2550); 0290 0291 QCOMPARE(spreadsheet.column(4)->valueAt(0), 101.2600); 0292 QCOMPARE(spreadsheet.column(4)->valueAt(1), 101.3300); 0293 0294 QCOMPARE(spreadsheet.column(5)->integerAt(0), 27960); 0295 QCOMPARE(spreadsheet.column(5)->integerAt(1), 127830); 0296 } 0297 0298 QTEST_MAIN(JsonFilterTest)