File indexing completed on 2024-04-21 14:49:22

0001 /***************************************************************************
0002     File                 : AsciiFilterTest.cpp
0003     Project              : LabPlot
0004     Description          : Tests for the ascii filter
0005     --------------------------------------------------------------------
0006     Copyright            : (C) 2017 Alexander Semke (alexander.semke@web.de)
0007  ***************************************************************************/
0008 
0009 /***************************************************************************
0010  *                                                                         *
0011  *  This program is free software; you can redistribute it and/or modify   *
0012  *  it under the terms of the GNU General Public License as published by   *
0013  *  the Free Software Foundation; either version 2 of the License, or      *
0014  *  (at your option) any later version.                                    *
0015  *                                                                         *
0016  *  This program is distributed in the hope that it will be useful,        *
0017  *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
0018  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
0019  *  GNU General Public License for more details.                           *
0020  *                                                                         *
0021  *   You should have received a copy of the GNU General Public License     *
0022  *   along with this program; if not, write to the Free Software           *
0023  *   Foundation, Inc., 51 Franklin Street, Fifth Floor,                    *
0024  *   Boston, MA  02110-1301  USA                                           *
0025  *                                                                         *
0026  ***************************************************************************/
0027 
0028 #include "AsciiFilterTest.h"
0029 #include "backend/datasources/filters/AsciiFilter.h"
0030 #include "backend/spreadsheet/Spreadsheet.h"
0031 
0032 void AsciiFilterTest::initTestCase() {
0033     // needed in order to have the signals triggered by SignallingUndoCommand, see LabPlot.cpp
0034     //TODO: redesign/remove this
0035     qRegisterMetaType<const AbstractAspect*>("const AbstractAspect*");
0036     qRegisterMetaType<const AbstractColumn*>("const AbstractColumn*");
0037 }
0038 
0039 //##############################################################################
0040 //#################  handling of empty and sparse files ########################
0041 //##############################################################################
0042 void AsciiFilterTest::testEmptyFileAppend() {
0043     Spreadsheet spreadsheet("test", false);
0044     AsciiFilter filter;
0045 
0046     const int rowCount = spreadsheet.rowCount();
0047     const int colCount = spreadsheet.columnCount();
0048     const QString& fileName = QFINDTESTDATA(QLatin1String("data/empty_file.txt"));
0049     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Append;
0050 
0051     filter.readDataFromFile(fileName, &spreadsheet, mode);
0052 
0053     QCOMPARE(spreadsheet.rowCount(), rowCount);
0054     QCOMPARE(spreadsheet.columnCount(), colCount);
0055 }
0056 
0057 void AsciiFilterTest::testEmptyFilePrepend() {
0058     Spreadsheet spreadsheet("test", false);
0059     AsciiFilter filter;
0060 
0061     const int rowCount = spreadsheet.rowCount();
0062     const int colCount = spreadsheet.columnCount();
0063     const QString& fileName = QFINDTESTDATA(QLatin1String("data/empty_file.txt"));
0064     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Prepend;
0065 
0066     filter.readDataFromFile(fileName, &spreadsheet, mode);
0067 
0068     QCOMPARE(spreadsheet.rowCount(), rowCount);
0069     QCOMPARE(spreadsheet.columnCount(), colCount);
0070 }
0071 
0072 void AsciiFilterTest::testEmptyFileReplace() {
0073     Spreadsheet spreadsheet("test", false);
0074     AsciiFilter filter;
0075 
0076     const int rowCount = spreadsheet.rowCount();
0077     const int colCount = spreadsheet.columnCount();
0078     const QString& fileName = QFINDTESTDATA(QLatin1String("data/empty_file.txt"));
0079     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0080     filter.readDataFromFile(fileName, &spreadsheet, mode);
0081 
0082     QCOMPARE(spreadsheet.rowCount(), rowCount);
0083     QCOMPARE(spreadsheet.columnCount(), colCount);
0084 }
0085 
0086 void AsciiFilterTest::testEmptyLines01() {
0087     Spreadsheet spreadsheet("test", false);
0088     AsciiFilter filter;
0089     const QString& fileName = QFINDTESTDATA(QLatin1String("data/empty_lines_01.txt"));
0090 
0091     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0092     filter.setSeparatingCharacter("auto");
0093     filter.setHeaderEnabled(true);
0094     filter.readDataFromFile(fileName, &spreadsheet, mode);
0095 
0096     QCOMPARE(spreadsheet.rowCount(), 3);
0097     QCOMPARE(spreadsheet.columnCount(), 3);
0098 
0099     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("x"));
0100     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("y"));
0101     QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("values"));
0102 
0103     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0104     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Integer);
0105     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Integer);
0106 
0107     QCOMPARE(spreadsheet.column(0)->integerAt(0), 1);
0108     QCOMPARE(spreadsheet.column(0)->integerAt(1), 2);
0109     QCOMPARE(spreadsheet.column(0)->integerAt(2), 3);
0110     QCOMPARE(spreadsheet.column(1)->integerAt(0), 2);
0111     QCOMPARE(spreadsheet.column(1)->integerAt(1), 4);
0112     QCOMPARE(spreadsheet.column(1)->integerAt(2), 9);
0113     QCOMPARE(spreadsheet.column(2)->integerAt(0), 10);
0114     QCOMPARE(spreadsheet.column(2)->integerAt(1), 40);
0115     QCOMPARE(spreadsheet.column(2)->integerAt(2), 90);
0116 }
0117 
0118 void AsciiFilterTest::testSparseFile01() {
0119     Spreadsheet spreadsheet("test", false);
0120     AsciiFilter filter;
0121     const QString& fileName = QFINDTESTDATA(QLatin1String("data/sparse_file_01.txt"));
0122 
0123     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0124     filter.setSeparatingCharacter(",");
0125     filter.setHeaderEnabled(true);
0126     filter.setSimplifyWhitespacesEnabled(true);
0127     filter.readDataFromFile(fileName, &spreadsheet, mode);
0128 
0129     QCOMPARE(spreadsheet.rowCount(), 3);
0130     QCOMPARE(spreadsheet.columnCount(), 3);
0131 
0132     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("N"));
0133     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("Col1"));
0134     QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("Col2"));
0135 
0136     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0137     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Integer);
0138     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Integer);
0139 
0140     QCOMPARE(spreadsheet.column(0)->integerAt(0), 1);
0141     QCOMPARE(spreadsheet.column(0)->integerAt(1), 2);
0142     QCOMPARE(spreadsheet.column(0)->integerAt(2), 3);
0143 
0144     QCOMPARE(spreadsheet.column(1)->integerAt(0), 1);
0145     QCOMPARE(spreadsheet.column(1)->integerAt(1), 0);
0146     QCOMPARE(spreadsheet.column(1)->integerAt(2), 1);
0147 
0148     QCOMPARE(spreadsheet.column(2)->integerAt(0), 2);
0149     QCOMPARE(spreadsheet.column(2)->integerAt(1), 2);
0150     QCOMPARE(spreadsheet.column(2)->integerAt(2), 0);
0151 }
0152 
0153 void AsciiFilterTest::testSparseFile02() {
0154     Spreadsheet spreadsheet("test", false);
0155     AsciiFilter filter;
0156     const QString& fileName = QFINDTESTDATA(QLatin1String("data/sparse_file_02.txt"));
0157 
0158     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0159     filter.setSeparatingCharacter(",");
0160     filter.setNaNValueToZero(false);
0161     filter.setSimplifyWhitespacesEnabled(true);
0162     filter.setSkipEmptyParts(false);
0163     filter.setHeaderEnabled(true);
0164     filter.readDataFromFile(fileName, &spreadsheet, mode);
0165 
0166     QCOMPARE(spreadsheet.rowCount(), 3);
0167     QCOMPARE(spreadsheet.columnCount(), 3);
0168 
0169     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("N"));
0170     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("Col1"));
0171     QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("Col2"));
0172 
0173     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0174     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0175     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0176 
0177     QCOMPARE(spreadsheet.column(0)->integerAt(0), 1);
0178     QCOMPARE(spreadsheet.column(0)->integerAt(1), 2);
0179     QCOMPARE(spreadsheet.column(0)->integerAt(2), 3);
0180 
0181     QCOMPARE(spreadsheet.column(1)->valueAt(0), 1.);
0182     QCOMPARE((bool)std::isnan(spreadsheet.column(1)->valueAt(1)), true);
0183     QCOMPARE(spreadsheet.column(1)->valueAt(2), 1.);
0184 
0185     QCOMPARE(spreadsheet.column(2)->valueAt(0), 2.);
0186     QCOMPARE(spreadsheet.column(2)->valueAt(1), 2.);
0187     QCOMPARE((bool)std::isnan(spreadsheet.column(2)->valueAt(2)), true);
0188 }
0189 
0190 void AsciiFilterTest::testSparseFile03() {
0191     Spreadsheet spreadsheet("test", false);
0192     AsciiFilter filter;
0193     const QString& fileName = QFINDTESTDATA(QLatin1String("data/sparse_file_03.txt"));
0194 
0195     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0196     filter.setSeparatingCharacter(",");
0197     filter.setNaNValueToZero(true);
0198     filter.setSimplifyWhitespacesEnabled(true);
0199     filter.setSkipEmptyParts(false);
0200     filter.setHeaderEnabled(true);
0201     filter.readDataFromFile(fileName, &spreadsheet, mode);
0202 
0203     QCOMPARE(spreadsheet.rowCount(), 4);
0204     QCOMPARE(spreadsheet.columnCount(), 3);
0205 
0206     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("N"));
0207     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("Col1"));
0208     QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("Col2"));
0209 
0210     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0211     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0212     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0213 
0214     QCOMPARE(spreadsheet.column(0)->integerAt(0), 1);
0215     QCOMPARE(spreadsheet.column(0)->integerAt(1), 2);
0216     QCOMPARE(spreadsheet.column(0)->integerAt(2), 3);
0217     QCOMPARE(spreadsheet.column(0)->integerAt(3), 0);
0218 
0219     QCOMPARE(spreadsheet.column(1)->valueAt(0), 1.);
0220     QCOMPARE(spreadsheet.column(1)->valueAt(1), 0.);
0221     QCOMPARE(spreadsheet.column(1)->valueAt(2), 1.);
0222     QCOMPARE(spreadsheet.column(1)->valueAt(3), 0.);
0223 
0224     QCOMPARE(spreadsheet.column(2)->valueAt(0), 2.);
0225     QCOMPARE(spreadsheet.column(2)->valueAt(1), 2.);
0226     QCOMPARE(spreadsheet.column(2)->valueAt(2), 0.);
0227     QCOMPARE(spreadsheet.column(2)->valueAt(3), 3.);
0228 }
0229 
0230 //##############################################################################
0231 //################################  header handling ############################
0232 //##############################################################################
0233 void AsciiFilterTest::testHeader01() {
0234     Spreadsheet spreadsheet("test", false);
0235     AsciiFilter filter;
0236     const QString& fileName = QFINDTESTDATA(QLatin1String("data/separator_semicolon.txt"));
0237 
0238     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0239     filter.setSeparatingCharacter(";");
0240     filter.setHeaderEnabled(false);
0241     filter.setVectorNames(QString());
0242     filter.readDataFromFile(fileName, &spreadsheet, mode);
0243 
0244     QCOMPARE(spreadsheet.rowCount(), 3);
0245     QCOMPARE(spreadsheet.columnCount(), 2);
0246 }
0247 
0248 void AsciiFilterTest::testHeader02() {
0249     Spreadsheet spreadsheet("test", false);
0250     AsciiFilter filter;
0251     const QString& fileName = QFINDTESTDATA(QLatin1String("data/separator_semicolon.txt"));
0252 
0253     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0254     filter.setSeparatingCharacter(";");
0255     filter.setHeaderEnabled(true);
0256     filter.setVectorNames(QString());
0257     filter.readDataFromFile(fileName, &spreadsheet, mode);
0258 
0259     QCOMPARE(spreadsheet.rowCount(), 2);//out of 3 rows one row is used for the column names (header)
0260     QCOMPARE(spreadsheet.columnCount(), 2);
0261     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("1"));
0262 
0263     //TODO: we start with the names "1" and "2" in the spreadsheet and try to rename them to "1" and "1" (names coming from the file)
0264     //-> the second column with the name "2" will be renamed to "3" because of the current logic in AbstractAspect::uniqueNameFor().
0265     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("3"));
0266 }
0267 
0268 void AsciiFilterTest::testHeader03() {
0269     Spreadsheet spreadsheet("test", false);
0270     AsciiFilter filter;
0271     const QString& fileName = QFINDTESTDATA(QLatin1String("data/separator_semicolon.txt"));
0272 
0273     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0274     filter.setSeparatingCharacter(";");
0275     filter.setHeaderEnabled(false);
0276     filter.setVectorNames("x");
0277     filter.readDataFromFile(fileName, &spreadsheet, mode);
0278 
0279     QCOMPARE(spreadsheet.rowCount(), 3);
0280     QCOMPARE(spreadsheet.columnCount(), 1); //one column name was specified, we import only one column
0281     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("x"));
0282 }
0283 
0284 void AsciiFilterTest::testHeader04() {
0285     Spreadsheet spreadsheet("test", false);
0286     AsciiFilter filter;
0287     const QString& fileName = QFINDTESTDATA(QLatin1String("data/separator_semicolon.txt"));
0288 
0289     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0290     filter.setSeparatingCharacter(";");
0291     filter.setHeaderEnabled(false);
0292     filter.setVectorNames("x");
0293     filter.readDataFromFile(fileName, &spreadsheet, mode);
0294 
0295     QCOMPARE(spreadsheet.rowCount(), 3);
0296     QCOMPARE(spreadsheet.columnCount(), 1); //one column name was specified -> we import only one column
0297     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("x"));
0298 }
0299 
0300 void AsciiFilterTest::testHeader05() {
0301     Spreadsheet spreadsheet("test", false);
0302     AsciiFilter filter;
0303     const QString& fileName = QFINDTESTDATA(QLatin1String("data/separator_semicolon.txt"));
0304 
0305     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0306     filter.setSeparatingCharacter(";");
0307     filter.setHeaderEnabled(false);
0308     filter.setVectorNames("x y");
0309     filter.readDataFromFile(fileName, &spreadsheet, mode);
0310 
0311     QCOMPARE(spreadsheet.rowCount(), 3);
0312     QCOMPARE(spreadsheet.columnCount(), 2); //two names were specified -> we import two columns
0313     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("x"));
0314     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("y"));
0315 }
0316 
0317 void AsciiFilterTest::testHeader06() {
0318     Spreadsheet spreadsheet("test", false);
0319     AsciiFilter filter;
0320     const QString& fileName = QFINDTESTDATA(QLatin1String("data/separator_semicolon.txt"));
0321 
0322     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0323     filter.setSeparatingCharacter(";");
0324     filter.setHeaderEnabled(false);
0325     filter.setVectorNames("x y z");
0326     filter.readDataFromFile(fileName, &spreadsheet, mode);
0327 
0328     QCOMPARE(spreadsheet.rowCount(), 3);
0329     QCOMPARE(spreadsheet.columnCount(), 2); //three names were specified, but there're only two columns in the file -> we import only two columns
0330     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("x"));
0331     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("y"));
0332 }
0333 
0334 /*!
0335  * test with a file containing the header in the second line
0336  * with a subsequent comment line without any comment character.
0337  * this line shouldn't disturb the detection of numeric column modes.
0338  */
0339 void AsciiFilterTest::testHeader07() {
0340     Spreadsheet spreadsheet("test", false);
0341     AsciiFilter filter;
0342     const QString& fileName = QFINDTESTDATA(QLatin1String("data/comment_header_comment.txt"));
0343 
0344     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0345     filter.setSeparatingCharacter("TAB");
0346     filter.setStartRow(2);
0347     filter.setHeaderEnabled(true);
0348     filter.setDateTimeFormat(QLatin1String("yyyy-MM-dd hh:mm:ss.zzz"));
0349     filter.readDataFromFile(fileName, &spreadsheet, mode);
0350 
0351     //spreadsheet size
0352     QCOMPARE(spreadsheet.columnCount(), 3);
0353     QCOMPARE(spreadsheet.rowCount(), 4);
0354 
0355     //column names
0356     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("counter"));
0357     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("t[min]"));
0358     QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("#1ch1"));
0359 
0360     //data types
0361     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0362     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0363     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0364 
0365     //values
0366     QCOMPARE(spreadsheet.column(0)->integerAt(0), 0);
0367     QCOMPARE((bool)std::isnan(spreadsheet.column(1)->valueAt(0)), true);
0368     QCOMPARE((bool)std::isnan(spreadsheet.column(2)->valueAt(0)), true);
0369 
0370     QCOMPARE(spreadsheet.column(0)->integerAt(1), 1);
0371     QCOMPARE(spreadsheet.column(1)->valueAt(1), 0.0513);
0372     QCOMPARE(spreadsheet.column(2)->valueAt(1), 0.3448);
0373 
0374     QCOMPARE(spreadsheet.column(0)->integerAt(2), 2);
0375     QCOMPARE(spreadsheet.column(1)->valueAt(2), 0.1005);
0376     QCOMPARE(spreadsheet.column(2)->valueAt(2), 0.3418);
0377 
0378     QCOMPARE(spreadsheet.column(0)->integerAt(3), 3);
0379     QCOMPARE(spreadsheet.column(1)->valueAt(3), 0.1516);
0380     QCOMPARE(spreadsheet.column(2)->valueAt(3), 0.3433);
0381 }
0382 
0383 /*!
0384  * the header contains spaces in the column names, values are tab separated.
0385  * when using "auto" for the separator characters, the tab character has to
0386  * be properly recognized and used.
0387  */
0388 void AsciiFilterTest::testHeader08() {
0389     Spreadsheet spreadsheet("test", false);
0390     AsciiFilter filter;
0391     const QString& fileName = QFINDTESTDATA(QLatin1String("data/separator_tab_with_header_with_spaces.txt"));
0392 
0393     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0394     filter.setSeparatingCharacter("auto");
0395     filter.setHeaderEnabled(true);
0396     filter.readDataFromFile(fileName, &spreadsheet, mode);
0397 
0398     //spreadsheet size
0399     QCOMPARE(spreadsheet.columnCount(), 2);
0400     QCOMPARE(spreadsheet.rowCount(), 2);
0401 
0402     //column names
0403     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("first column"));
0404     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("second column"));
0405 
0406     //data types
0407     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0408     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Integer);
0409 
0410     //values
0411     QCOMPARE(spreadsheet.column(0)->integerAt(0), 1);
0412     QCOMPARE(spreadsheet.column(1)->integerAt(0), 2);
0413 
0414     QCOMPARE(spreadsheet.column(0)->integerAt(1), 3);
0415     QCOMPARE(spreadsheet.column(1)->integerAt(1), 4);
0416 }
0417 
0418 //##############################################################################
0419 //#####################  handling of different read ranges #####################
0420 //##############################################################################
0421 void AsciiFilterTest::testColumnRange00() {
0422     Spreadsheet spreadsheet("test", false);
0423     AsciiFilter filter;
0424     const QString& fileName = QFINDTESTDATA(QLatin1String("data/numeric_data.txt"));
0425 
0426     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0427     filter.setSeparatingCharacter("auto");
0428     filter.setHeaderEnabled(false);
0429     filter.readDataFromFile(fileName, &spreadsheet, mode);
0430 
0431     //no ranges specified, all rows and columns have to be read
0432     QCOMPARE(spreadsheet.rowCount(), 5);
0433     QCOMPARE(spreadsheet.columnCount(), 3);
0434 
0435     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0436     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0437     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0438 
0439     //check the values for the first line
0440     QCOMPARE(spreadsheet.column(0)->valueAt(0), 1.716299);
0441     QCOMPARE(spreadsheet.column(1)->valueAt(0), -0.485527);
0442     QCOMPARE(spreadsheet.column(2)->valueAt(0), -0.288690);
0443 }
0444 
0445 void AsciiFilterTest::testColumnRange01() {
0446     Spreadsheet spreadsheet("test", false);
0447     AsciiFilter filter;
0448     const QString& fileName = QFINDTESTDATA(QLatin1String("data/numeric_data.txt"));
0449 
0450     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0451     filter.setSeparatingCharacter("auto");
0452     filter.setHeaderEnabled(false);
0453     filter.setCreateIndexEnabled(true);
0454     filter.readDataFromFile(fileName, &spreadsheet, mode);
0455 
0456     //no ranges specified, all rows and columns have to be read plus the additional column for the index
0457     QCOMPARE(spreadsheet.rowCount(), 5);
0458     QCOMPARE(spreadsheet.columnCount(), 4);
0459 
0460     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0461     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0462     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0463     QCOMPARE(spreadsheet.column(3)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0464 
0465     //check the values for the first line
0466     QCOMPARE(spreadsheet.column(0)->integerAt(0), 1);
0467     QCOMPARE(spreadsheet.column(1)->valueAt(0), 1.716299);
0468     QCOMPARE(spreadsheet.column(2)->valueAt(0), -0.485527);
0469     QCOMPARE(spreadsheet.column(3)->valueAt(0), -0.288690);
0470 }
0471 
0472 void AsciiFilterTest::testColumnRange02() {
0473     Spreadsheet spreadsheet("test", false);
0474     AsciiFilter filter;
0475     const QString& fileName = QFINDTESTDATA(QLatin1String("data/numeric_data.txt"));
0476 
0477     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0478     filter.setSeparatingCharacter("auto");
0479     filter.setHeaderEnabled(false);
0480     filter.setStartColumn(2);
0481     filter.setEndColumn(3);
0482     filter.readDataFromFile(fileName, &spreadsheet, mode);
0483 
0484     //read all rows and the last two columns only
0485     QCOMPARE(spreadsheet.rowCount(), 5);
0486     QCOMPARE(spreadsheet.columnCount(), 2);
0487 
0488     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0489     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0490 
0491     //check the values for the first line
0492     QCOMPARE(spreadsheet.column(0)->valueAt(0), -0.485527);
0493     QCOMPARE(spreadsheet.column(1)->valueAt(0), -0.288690);
0494 }
0495 
0496 void AsciiFilterTest::testColumnRange03() {
0497     Spreadsheet spreadsheet("test", false);
0498     AsciiFilter filter;
0499     const QString& fileName = QFINDTESTDATA(QLatin1String("data/numeric_data.txt"));
0500 
0501     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0502     filter.setSeparatingCharacter("auto");
0503     filter.setHeaderEnabled(false);
0504     filter.setCreateIndexEnabled(true);
0505     filter.setStartColumn(2);
0506     filter.setEndColumn(3);
0507     filter.readDataFromFile(fileName, &spreadsheet, mode);
0508 
0509     //read all rows and the last two columns only plus the additional column for the index
0510     QCOMPARE(spreadsheet.rowCount(), 5);
0511     QCOMPARE(spreadsheet.columnCount(), 3);
0512 
0513     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0514     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0515     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0516 
0517     //check the values for the first line
0518     QCOMPARE(spreadsheet.column(0)->integerAt(0), 1);
0519     QCOMPARE(spreadsheet.column(1)->valueAt(0), -0.485527);
0520     QCOMPARE(spreadsheet.column(2)->valueAt(0), -0.288690);
0521 }
0522 
0523 void AsciiFilterTest::testColumnRange04() {
0524     Spreadsheet spreadsheet("test", false);
0525     AsciiFilter filter;
0526     const QString& fileName = QFINDTESTDATA(QLatin1String("data/numeric_data.txt"));
0527 
0528     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0529     filter.setSeparatingCharacter("auto");
0530     filter.setHeaderEnabled(false);
0531     filter.setStartColumn(3);
0532     filter.setEndColumn(3);
0533     filter.readDataFromFile(fileName, &spreadsheet, mode);
0534 
0535     //read all rows and the last column only
0536     QCOMPARE(spreadsheet.rowCount(), 5);
0537     QCOMPARE(spreadsheet.columnCount(), 1);
0538 
0539     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0540 
0541     //check the values for the first line
0542     QCOMPARE(spreadsheet.column(0)->valueAt(0), -0.288690);
0543 }
0544 
0545 void AsciiFilterTest::testColumnRange05() {
0546     Spreadsheet spreadsheet("test", false);
0547     AsciiFilter filter;
0548     const QString& fileName = QFINDTESTDATA(QLatin1String("data/numeric_data.txt"));
0549 
0550     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0551     filter.setSeparatingCharacter("auto");
0552     filter.setHeaderEnabled(false);
0553     filter.setStartColumn(3);
0554     filter.setEndColumn(2);
0555     filter.readDataFromFile(fileName, &spreadsheet, mode);
0556 
0557     //wrong column range specified (start>end), nothing to read,
0558     //empty spreadsheet because of the replace mode
0559     QCOMPARE(spreadsheet.rowCount(), 0);
0560     QCOMPARE(spreadsheet.columnCount(), 0);
0561 }
0562 
0563 void AsciiFilterTest::testColumnRange06() {
0564     Spreadsheet spreadsheet("test", false);
0565     AsciiFilter filter;
0566     const QString& fileName = QFINDTESTDATA(QLatin1String("data/numeric_data.txt"));
0567 
0568     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0569     filter.setSeparatingCharacter("auto");
0570     filter.setHeaderEnabled(false);
0571     filter.setCreateIndexEnabled(true);
0572     filter.setStartColumn(3);
0573     filter.setEndColumn(2);
0574     filter.readDataFromFile(fileName, &spreadsheet, mode);
0575 
0576     //wrong column range specified (start>end), only the index column is created
0577     QCOMPARE(spreadsheet.rowCount(), 5);
0578     QCOMPARE(spreadsheet.columnCount(), 1);
0579 
0580     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0581     QCOMPARE(spreadsheet.column(0)->integerAt(0), 1);
0582 }
0583 
0584 void AsciiFilterTest::testRowRange00() {
0585     Spreadsheet spreadsheet("test", false);
0586     AsciiFilter filter;
0587     const QString& fileName = QFINDTESTDATA(QLatin1String("data/numeric_data.txt"));
0588 
0589     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0590     filter.setSeparatingCharacter("auto");
0591     filter.setHeaderEnabled(false);
0592     filter.setStartRow(3);
0593     filter.setEndRow(5);
0594     filter.readDataFromFile(fileName, &spreadsheet, mode);
0595 
0596     //three rows to read
0597     QCOMPARE(spreadsheet.rowCount(), 3);
0598     QCOMPARE(spreadsheet.columnCount(), 3);
0599 
0600     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0601     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0602     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0603 
0604     //check the values for the first and for the last lines
0605     QCOMPARE(spreadsheet.column(0)->valueAt(0), 1.711721);
0606     QCOMPARE(spreadsheet.column(1)->valueAt(0), -0.485527);
0607     QCOMPARE(spreadsheet.column(2)->valueAt(0), -0.293267);
0608 
0609     QCOMPARE(spreadsheet.column(0)->valueAt(2), 1.716299);
0610     QCOMPARE(spreadsheet.column(1)->valueAt(2), -0.494682);
0611     QCOMPARE(spreadsheet.column(2)->valueAt(2), -0.284112);
0612 }
0613 
0614 void AsciiFilterTest::testRowRange01() {
0615     Spreadsheet spreadsheet("test", false);
0616     AsciiFilter filter;
0617     const QString& fileName = QFINDTESTDATA(QLatin1String("data/numeric_data.txt"));
0618 
0619     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0620     filter.setSeparatingCharacter("auto");
0621     filter.setHeaderEnabled(false);
0622     filter.setStartRow(3);
0623     filter.setEndRow(10);
0624     filter.readDataFromFile(fileName, &spreadsheet, mode);
0625 
0626     //end row larger than the number of available rows, three rows to read
0627     QCOMPARE(spreadsheet.rowCount(), 3);
0628     QCOMPARE(spreadsheet.columnCount(), 3);
0629 
0630     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0631     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0632     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0633 
0634     //check the values for the first and for the last lines
0635     QCOMPARE(spreadsheet.column(0)->valueAt(0), 1.711721);
0636     QCOMPARE(spreadsheet.column(1)->valueAt(0), -0.485527);
0637     QCOMPARE(spreadsheet.column(2)->valueAt(0), -0.293267);
0638 
0639     QCOMPARE(spreadsheet.column(0)->valueAt(2), 1.716299);
0640     QCOMPARE(spreadsheet.column(1)->valueAt(2), -0.494682);
0641     QCOMPARE(spreadsheet.column(2)->valueAt(2), -0.284112);
0642 }
0643 
0644 void AsciiFilterTest::testRowRange02() {
0645     Spreadsheet spreadsheet("test", false);
0646     AsciiFilter filter;
0647     const QString& fileName = QFINDTESTDATA(QLatin1String("data/numeric_data.txt"));
0648 
0649     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0650     filter.setSeparatingCharacter("auto");
0651     filter.setHeaderEnabled(false);
0652     filter.setStartRow(3);
0653     filter.setEndRow(1);
0654     filter.readDataFromFile(fileName, &spreadsheet, mode);
0655 
0656     //start bigger than end, no rows to read
0657     //wrong row range specified (start>end), nothing to read,
0658     //spreadsheet is not touched, default number of rows and columns
0659     //TODO: this is inconsistent with the handling for columns, see testColumnRange05()
0660     QCOMPARE(spreadsheet.rowCount(), 100);
0661     QCOMPARE(spreadsheet.columnCount(), 2);
0662 }
0663 
0664 void AsciiFilterTest::testRowColumnRange00() {
0665     Spreadsheet spreadsheet("test", false);
0666     AsciiFilter filter;
0667     const QString& fileName = QFINDTESTDATA(QLatin1String("data/numeric_data.txt"));
0668 
0669     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0670     filter.setSeparatingCharacter("auto");
0671     filter.setHeaderEnabled(false);
0672     filter.setStartRow(3);
0673     filter.setEndRow(5);
0674     filter.setStartColumn(2);
0675     filter.setEndColumn(3);
0676     filter.readDataFromFile(fileName, &spreadsheet, mode);
0677 
0678     //three rows and two columns to read
0679     QCOMPARE(spreadsheet.rowCount(), 3);
0680     QCOMPARE(spreadsheet.columnCount(), 2);
0681 
0682     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0683     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0684 
0685     //check the values for the first and for the last lines
0686     QCOMPARE(spreadsheet.column(0)->valueAt(0), -0.485527);
0687     QCOMPARE(spreadsheet.column(1)->valueAt(0), -0.293267);
0688 
0689     QCOMPARE(spreadsheet.column(0)->valueAt(2), -0.494682);
0690     QCOMPARE(spreadsheet.column(1)->valueAt(2), -0.284112);
0691 }
0692 
0693 //##############################################################################
0694 //#####################  handling of different separators ######################
0695 //##############################################################################
0696 
0697 
0698 //##############################################################################
0699 //#####################################  quoted strings ########################
0700 //##############################################################################
0701 void AsciiFilterTest::testQuotedStrings00() {
0702     Spreadsheet spreadsheet("test", false);
0703     AsciiFilter filter;
0704     const QString& fileName = QFINDTESTDATA(QLatin1String("data/quoted_strings.txt"));
0705 
0706     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0707     filter.setSeparatingCharacter(",");
0708     filter.setHeaderEnabled(false);
0709     filter.setRemoveQuotesEnabled(true);
0710     filter.readDataFromFile(fileName, &spreadsheet, mode);
0711 
0712     //three rows and two columns to read
0713     QCOMPARE(spreadsheet.rowCount(), 3);
0714     QCOMPARE(spreadsheet.columnCount(), 4);
0715 
0716     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Text);
0717     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Integer);
0718     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Integer);
0719     QCOMPARE(spreadsheet.column(3)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0720 
0721     QCOMPARE(spreadsheet.column(0)->textAt(0), QLatin1String("a"));
0722     QCOMPARE(spreadsheet.column(1)->integerAt(0), 1000);
0723     QCOMPARE(spreadsheet.column(2)->integerAt(0), 201811);
0724     QCOMPARE(spreadsheet.column(3)->valueAt(0), 1.1);
0725 
0726     QCOMPARE(spreadsheet.column(0)->textAt(1), QLatin1String("ab"));
0727     QCOMPARE(spreadsheet.column(1)->integerAt(1), 2000);
0728     QCOMPARE(spreadsheet.column(2)->integerAt(1), 201812);
0729     QCOMPARE(spreadsheet.column(3)->valueAt(1), 1.2);
0730 
0731     QCOMPARE(spreadsheet.column(0)->textAt(2), QLatin1String("abc"));
0732     QCOMPARE(spreadsheet.column(1)->integerAt(2), 3000);
0733     QCOMPARE(spreadsheet.column(2)->integerAt(2), 201901);
0734     QCOMPARE(spreadsheet.column(3)->valueAt(2), 1.3);
0735 }
0736 
0737 void AsciiFilterTest::testQuotedStrings01() {
0738     Spreadsheet spreadsheet("test", false);
0739     AsciiFilter filter;
0740     const QString& fileName = QFINDTESTDATA(QLatin1String("data/quoted_strings_with_header.txt"));
0741 
0742     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0743     filter.setSeparatingCharacter(",");
0744     filter.setHeaderEnabled(true);
0745     filter.setSimplifyWhitespacesEnabled(true);
0746     filter.setRemoveQuotesEnabled(true);
0747     filter.readDataFromFile(fileName, &spreadsheet, mode);
0748 
0749     //three rows and two columns to read
0750     QCOMPARE(spreadsheet.rowCount(), 3);
0751     QCOMPARE(spreadsheet.columnCount(), 4);
0752 
0753     //column names
0754     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("col1"));
0755     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("col2"));
0756     QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("col3"));
0757     QCOMPARE(spreadsheet.column(3)->name(), QLatin1String("col4"));
0758 
0759     //data types
0760     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Text);
0761     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Integer);
0762     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Integer);
0763     QCOMPARE(spreadsheet.column(3)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0764 
0765     //values
0766     QCOMPARE(spreadsheet.column(0)->textAt(0), QLatin1String("a"));
0767     QCOMPARE(spreadsheet.column(1)->integerAt(0), 1000);
0768     QCOMPARE(spreadsheet.column(2)->integerAt(0), 201811);
0769     QCOMPARE(spreadsheet.column(3)->valueAt(0), 1.1);
0770 
0771     QCOMPARE(spreadsheet.column(0)->textAt(1), QLatin1String("ab"));
0772     QCOMPARE(spreadsheet.column(1)->integerAt(1), 2000);
0773     QCOMPARE(spreadsheet.column(2)->integerAt(1), 201812);
0774     QCOMPARE(spreadsheet.column(3)->valueAt(1), 1.2);
0775 
0776     QCOMPARE(spreadsheet.column(0)->textAt(2), QLatin1String("abc"));
0777     QCOMPARE(spreadsheet.column(1)->integerAt(2), 3000);
0778     QCOMPARE(spreadsheet.column(2)->integerAt(2), 201901);
0779     QCOMPARE(spreadsheet.column(3)->valueAt(2), 1.3);
0780 }
0781 
0782 void AsciiFilterTest::testQuotedStrings02() {
0783     Spreadsheet spreadsheet("test", false);
0784     AsciiFilter filter;
0785     const QString& fileName = QFINDTESTDATA(QLatin1String("data/quoted_strings_one_line.txt"));
0786 
0787     QCOMPARE(QFile::exists(fileName), true);
0788 
0789     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0790     filter.setSeparatingCharacter(",");
0791     filter.setHeaderEnabled(false);
0792     filter.setRemoveQuotesEnabled(true);
0793     filter.readDataFromFile(fileName, &spreadsheet, mode);
0794 
0795     //three rows and two columns to read
0796 //  QCOMPARE(spreadsheet.rowCount(), 1);
0797 //  QCOMPARE(spreadsheet.columnCount(), 4);
0798 
0799     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Text);
0800     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Integer);
0801     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Integer);
0802     QCOMPARE(spreadsheet.column(3)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0803 
0804     QCOMPARE(spreadsheet.column(0)->textAt(0), QLatin1String("a"));
0805     QCOMPARE(spreadsheet.column(1)->integerAt(0), 1000);
0806     QCOMPARE(spreadsheet.column(2)->integerAt(0), 201811);
0807     QCOMPARE(spreadsheet.column(3)->valueAt(0), 1.1);
0808 }
0809 
0810 void AsciiFilterTest::testQuotedStrings03() {
0811     Spreadsheet spreadsheet("test", false);
0812     AsciiFilter filter;
0813     const QString& fileName = QFINDTESTDATA(QLatin1String("data/quoted_strings_one_line_with_header.txt"));
0814 
0815     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0816     filter.setSeparatingCharacter(",");
0817     filter.setHeaderEnabled(true);
0818     filter.setSimplifyWhitespacesEnabled(true);
0819     filter.setRemoveQuotesEnabled(true);
0820     filter.readDataFromFile(fileName, &spreadsheet, mode);
0821 
0822     //three rows and two columns to read
0823 //  QCOMPARE(spreadsheet.rowCount(), 1);
0824 //  QCOMPARE(spreadsheet.columnCount(), 4);
0825 
0826     //column names
0827     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("col1"));
0828     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("col2"));
0829     QCOMPARE(spreadsheet.column(2)->name(), QLatin1String("col3"));
0830     QCOMPARE(spreadsheet.column(3)->name(), QLatin1String("col4"));
0831 
0832     //data types
0833     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Text);
0834     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Integer);
0835     QCOMPARE(spreadsheet.column(2)->columnMode(), AbstractColumn::ColumnMode::Integer);
0836     QCOMPARE(spreadsheet.column(3)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0837 
0838     //values
0839     QCOMPARE(spreadsheet.column(0)->textAt(0), QLatin1String("a"));
0840     QCOMPARE(spreadsheet.column(1)->integerAt(0), 1000);
0841     QCOMPARE(spreadsheet.column(2)->integerAt(0), 201811);
0842     QCOMPARE(spreadsheet.column(3)->valueAt(0), 1.1);
0843 }
0844 
0845 
0846 //##############################################################################
0847 //###############################  skip comments ###############################
0848 //##############################################################################
0849 void AsciiFilterTest::testComments00() {
0850     Spreadsheet spreadsheet("test", false);
0851     AsciiFilter filter;
0852     const QString& fileName = QFINDTESTDATA(QLatin1String("data/multi_line_comment.txt"));
0853 
0854     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0855     filter.setSeparatingCharacter(",");
0856     filter.readDataFromFile(fileName, &spreadsheet, mode);
0857 
0858     QCOMPARE(spreadsheet.columnCount(), 2);
0859 
0860     //data types
0861     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0862     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0863 
0864     //values
0865     QCOMPARE(spreadsheet.column(0)->integerAt(0), 1);
0866     QCOMPARE(spreadsheet.column(1)->valueAt(0), 1.1);
0867 
0868     QCOMPARE(spreadsheet.column(0)->integerAt(1), 2);
0869     QCOMPARE(spreadsheet.column(1)->valueAt(1), 2.2);
0870 }
0871 
0872 void AsciiFilterTest::testComments01() {
0873     Spreadsheet spreadsheet("test", false);
0874     AsciiFilter filter;
0875     const QString& fileName = QFINDTESTDATA(QLatin1String("data/multi_line_comment_with_empty_lines.txt"));
0876 
0877     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0878     filter.setSeparatingCharacter(",");
0879     filter.readDataFromFile(fileName, &spreadsheet, mode);
0880 
0881     QCOMPARE(spreadsheet.columnCount(), 2);
0882 
0883     //data types
0884     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0885     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0886 
0887     //values
0888     QCOMPARE(spreadsheet.column(0)->integerAt(0), 1);
0889     QCOMPARE(spreadsheet.column(1)->valueAt(0), 1.1);
0890 
0891     QCOMPARE(spreadsheet.column(0)->integerAt(1), 2);
0892     QCOMPARE(spreadsheet.column(1)->valueAt(1), 2.2);
0893 }
0894 
0895 /*!
0896  * test with an empty comment character
0897  */
0898 void AsciiFilterTest::testComments02() {
0899     Spreadsheet spreadsheet("test", false);
0900     AsciiFilter filter;
0901     const QString& fileName = QFINDTESTDATA(QLatin1String("data/separator_semicolon_with_header.txt"));
0902 
0903     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0904     filter.setCommentCharacter("");
0905     filter.setSeparatingCharacter(";");
0906     filter.setHeaderEnabled(true);
0907     filter.readDataFromFile(fileName, &spreadsheet, mode);
0908 
0909     //spreadsheet size
0910     QCOMPARE(spreadsheet.columnCount(), 2);
0911     QCOMPARE(spreadsheet.rowCount(), 3);
0912 
0913     //column names
0914     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("c1"));
0915     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("c2"));
0916 
0917     //data types
0918     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::Integer);
0919     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Integer);
0920 
0921     //values
0922     QCOMPARE(spreadsheet.column(0)->integerAt(0), 1);
0923     QCOMPARE(spreadsheet.column(1)->integerAt(0), 1);
0924 
0925     QCOMPARE(spreadsheet.column(0)->integerAt(1), 2);
0926     QCOMPARE(spreadsheet.column(1)->integerAt(1), 2);
0927 
0928     QCOMPARE(spreadsheet.column(0)->integerAt(2), 3);
0929     QCOMPARE(spreadsheet.column(1)->integerAt(2), 3);
0930 }
0931 
0932 
0933 //##############################################################################
0934 //#########################  handling of datetime data #########################
0935 //##############################################################################
0936 /*!
0937  * read data containing only two characters for the year - 'yy'. The default year in
0938  * QDateTime is 1900 . When reading such two-characters DateTime values we want
0939  * to have the current centure after the import.
0940  */
0941 void AsciiFilterTest::testDateTime00() {
0942     Spreadsheet spreadsheet("test", false);
0943     AsciiFilter filter;
0944     const QString& fileName = QFINDTESTDATA(QLatin1String("data/datetime_01.csv"));
0945 
0946     AbstractFileFilter::ImportMode mode = AbstractFileFilter::ImportMode::Replace;
0947     filter.setSeparatingCharacter(",");
0948     filter.setHeaderEnabled(true);
0949     filter.setDateTimeFormat(QLatin1String("dd/MM/yy hh:mm:ss"));
0950     filter.readDataFromFile(fileName, &spreadsheet, mode);
0951 
0952     //spreadsheet size
0953     QCOMPARE(spreadsheet.columnCount(), 2);
0954     QCOMPARE(spreadsheet.rowCount(), 2);
0955 
0956     //column names
0957     QCOMPARE(spreadsheet.column(0)->name(), QLatin1String("Date"));
0958     QCOMPARE(spreadsheet.column(1)->name(), QLatin1String("Water Pressure"));
0959 
0960     //data types
0961     QCOMPARE(spreadsheet.column(0)->columnMode(), AbstractColumn::ColumnMode::DateTime);
0962     QCOMPARE(spreadsheet.column(1)->columnMode(), AbstractColumn::ColumnMode::Numeric);
0963 
0964     //values
0965     QDateTime value = QDateTime::fromString(QLatin1String("01/01/2019 00:00:00"), QLatin1String("dd/MM/yyyy hh:mm:ss"));
0966     QCOMPARE(spreadsheet.column(0)->dateTimeAt(0), value);
0967     QCOMPARE(spreadsheet.column(1)->valueAt(0), 14.7982);
0968 
0969     value = QDateTime::fromString(QLatin1String("01/01/2019 00:00:00"), QLatin1String("dd/MM/yyyy hh:mm:ss"));
0970     QCOMPARE(spreadsheet.column(0)->dateTimeAt(0), value);
0971     QCOMPARE(spreadsheet.column(1)->valueAt(1), 14.8026);
0972 }
0973 
0974 QTEST_MAIN(AsciiFilterTest)