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)