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

0001 /***************************************************************************
0002     File                 : DatasetsUnitTest.cpp
0003     Project              : LabPlot
0004     Description          : Tests for Dataset related features
0005     --------------------------------------------------------------------
0006     Copyright            : (C) 2019 Kovacs Ferencz (kferike98@gmail.com)
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 "DatasetsUnitTest.h"
0029 
0030 #include "backend/datasources/filters/AsciiFilter.h"
0031 #include "backend/spreadsheet/Spreadsheet.h"
0032 #include "backend/datasources/DatasetHandler.h"
0033 #include "kdefrontend/DatasetModel.h"
0034 #include "kdefrontend/datasources/ImportDatasetWidget.h"
0035 #include "kdefrontend/datasources/DatasetMetadataManagerDialog.h"
0036 
0037 #include <QFile>
0038 #include <QTextStream>
0039 #include <QDebug>
0040 #include <QVector>
0041 #include <QTimer>
0042 #include <QEventLoop>
0043 #include <QTreeWidgetItem>
0044 #include <QStandardPaths>
0045 
0046 void DatasetsUnitTest::initTestCase() { 
0047     const QString currentDir = __FILE__;
0048     m_dataDir = currentDir.left(currentDir.lastIndexOf(QDir::separator())) + QDir::separator() + QLatin1String("data") + QDir::separator();
0049 
0050     const QString baseDir = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation).first();
0051     const QString containingDir = "labplot_data";
0052     m_jsonDir = baseDir + QDir::separator() + containingDir + QDir::separator();
0053 
0054     // needed in order to have the signals triggered by SignallingUndoCommand, see LabPlot.cpp
0055     //TODO: redesign/remove this
0056     qRegisterMetaType<const AbstractAspect*>("const AbstractAspect*");
0057     qRegisterMetaType<const AbstractColumn*>("const AbstractColumn*");
0058 
0059     removeFiles();
0060     copyFiles();
0061 }
0062 
0063 void DatasetsUnitTest::copyFiles() {
0064     const QString baseDir = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation).first();
0065 
0066     if(!QDir(baseDir).exists())
0067         QDir().mkdir(baseDir);
0068 
0069     if(!QDir(m_jsonDir).exists())
0070         QDir().mkdir(m_jsonDir);
0071 
0072     QFile::copy(m_dataDir + "Test.json", m_jsonDir + "Test.json");
0073     QFile::copy(m_dataDir + "DatasetCollections.json", m_jsonDir + "DatasetCollections.json");
0074 }
0075 
0076 //##############################################################################
0077 //#####################  Test processing metadata files  #######################
0078 //##############################################################################
0079 
0080 void DatasetsUnitTest::removeFiles() {
0081     const QString baseDir = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation).first();
0082     const QString containingDir = "labplot_data";
0083     const QString jsonDir = baseDir + QDir::separator() + containingDir + QDir::separator();
0084 
0085     QDir deleteDir(jsonDir);
0086     deleteDir.setNameFilters(QStringList() << "*.*");
0087     deleteDir.setFilter(QDir::Files);
0088 
0089     for(QString dirFile : deleteDir.entryList())    {
0090         deleteDir.remove(dirFile);
0091     }
0092 }
0093 
0094 void DatasetsUnitTest::testCategories() {
0095     copyFiles();
0096     ImportDatasetWidget* importWidget = new ImportDatasetWidget(nullptr);
0097     DatasetModel* model = new DatasetModel(importWidget->getDatasetsMap());
0098 
0099     QCOMPARE(model->categories("Test").size(), 3);
0100     QCOMPARE(model->categories("Test").contains("Test_Cat"), true);
0101     QCOMPARE(model->categories("Test").contains("Test_Cat_2"), true);
0102     QCOMPARE(model->categories("Test").contains("Test_Cat_3"), true);
0103 
0104     delete importWidget;
0105     delete  model;
0106 }
0107 
0108 void DatasetsUnitTest::testSubcategories() {
0109     ImportDatasetWidget* importWidget = new ImportDatasetWidget(nullptr);
0110     DatasetModel* model = new DatasetModel(importWidget->getDatasetsMap());
0111 
0112     QCOMPARE(model->subcategories("Test", "Test_Cat").size(), 4);
0113     QCOMPARE(model->subcategories("Test", "Test_Cat").contains("Test_Subcat"), true);
0114     QCOMPARE(model->subcategories("Test", "Test_Cat").contains("Test_Subcat2"), true);
0115     QCOMPARE(model->subcategories("Test", "Test_Cat").contains("Test_Subcat3"), true);
0116     QCOMPARE(model->subcategories("Test", "Test_Cat").contains("Test_Subcat4"), true);
0117 
0118     delete importWidget;
0119     delete  model;
0120 }
0121 
0122 void DatasetsUnitTest::testDatasets() {
0123     ImportDatasetWidget* importWidget = new ImportDatasetWidget(nullptr);
0124     DatasetModel* model = new DatasetModel(importWidget->getDatasetsMap());
0125 
0126     QCOMPARE(model->datasets("Test", "Test_Cat", "Test_Subcat").size(), 1);
0127     QCOMPARE(model->datasets("Test", "Test_Cat", "Test_Subcat").contains("test1"), true);
0128     QCOMPARE(model->allDatasetsList().toStringList().size(), 6);
0129 
0130     delete importWidget;
0131     delete  model;
0132 }
0133 
0134 //##############################################################################
0135 //###################  Test processing and downloading dataset  ################
0136 //##############################################################################
0137 
0138 void DatasetsUnitTest::testProcessDataset() {
0139     ImportDatasetWidget* importWidget = new ImportDatasetWidget(nullptr);
0140 
0141     Spreadsheet* spreadsheet = new Spreadsheet("test");
0142     DatasetHandler* datasetHandler = new DatasetHandler(spreadsheet);
0143     importWidget->setCollection("Test");
0144     importWidget->setCategory("Test_Cat");
0145     importWidget->setSubcategory("Test_Subcat");
0146     importWidget->setDataset("test1");
0147     importWidget->loadDatasetToProcess(datasetHandler);
0148 
0149     QTimer timer;
0150     timer.setSingleShot(true);
0151     QEventLoop loop;
0152     connect(datasetHandler,  &DatasetHandler::downloadCompleted, &loop, &QEventLoop::quit);
0153     connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
0154     timer.start(1500);
0155     loop.exec();
0156 
0157     bool datasetFound = false;
0158 
0159     if(timer.isActive()){
0160         timer.stop();
0161         datasetFound = true;
0162     }
0163     qDebug() << datasetFound;
0164 
0165     QCOMPARE(datasetFound, true);
0166     QCOMPARE(spreadsheet->rowCount(), 60);
0167     QCOMPARE(spreadsheet->columnCount(), 4);
0168 
0169     Column* firstColumn = spreadsheet->column(0);
0170     Column* secondColumn = spreadsheet->column(1);
0171     Column* thirdColumn = spreadsheet->column(2);
0172     Column* fourthColumn = spreadsheet->column(3);
0173 
0174     QCOMPARE(firstColumn->valueAt(0), 1);
0175     QCOMPARE(secondColumn->textAt(3),"4/86");
0176     QCOMPARE(thirdColumn->valueAt(0), -0.061134);
0177     QCOMPARE(fourthColumn->valueAt(0), 0.03016);
0178 
0179     delete importWidget;
0180     delete spreadsheet;
0181     delete datasetHandler;
0182 }
0183 
0184 //##############################################################################
0185 //###########  Test adding new datasets to the existing collection  ############
0186 //##############################################################################
0187 
0188 void DatasetsUnitTest::testNewCollection() {
0189     removeFiles();
0190     copyFiles();
0191 
0192     ImportDatasetWidget* importWidget = new ImportDatasetWidget(nullptr);
0193     DatasetMetadataManagerDialog* datasetDialog = new DatasetMetadataManagerDialog(nullptr, importWidget->getDatasetsMap());
0194 
0195     delete importWidget;
0196 
0197     datasetDialog->setCollection("Test2");
0198     datasetDialog->setCategory("Test_Cat");
0199     datasetDialog->setSubcategory("Test_Subcat");
0200     datasetDialog->setShortName("test_new");
0201     datasetDialog->setFullName("New test dataset");
0202     datasetDialog->setDescription("This is a new test dataset");
0203     datasetDialog->setURL("www.testdataset.com");
0204     datasetDialog->updateDocument(m_jsonDir);
0205 
0206     importWidget = new ImportDatasetWidget(nullptr);
0207     DatasetModel* model = new DatasetModel(importWidget->getDatasetsMap());
0208 
0209     QCOMPARE(model->collections().size(), 2);
0210     QCOMPARE(model->allDatasetsList().toStringList().size(), 7);
0211 }
0212 
0213 void DatasetsUnitTest::testNewCategory() {
0214     removeFiles();
0215     copyFiles();
0216 
0217     ImportDatasetWidget* importWidget = new ImportDatasetWidget(nullptr);
0218     DatasetMetadataManagerDialog* datasetDialog = new DatasetMetadataManagerDialog(nullptr, importWidget->getDatasetsMap());
0219 
0220     delete importWidget;
0221 
0222     datasetDialog->setCollection("Test");
0223     datasetDialog->setCategory("Test_Cat_4");
0224     datasetDialog->setSubcategory("Test_Subcat");
0225     datasetDialog->setShortName("test_new");
0226     datasetDialog->setFullName("New test dataset");
0227     datasetDialog->setDescription("This is a new test dataset");
0228     datasetDialog->setURL("www.testdataset.com");
0229     datasetDialog->updateDocument(m_jsonDir);
0230 
0231     importWidget = new ImportDatasetWidget(nullptr);
0232     DatasetModel* model = new DatasetModel(importWidget->getDatasetsMap());
0233 
0234     QCOMPARE(model->categories("Test").size(), 4);
0235     QCOMPARE(model->allDatasetsList().toStringList().size(), 7);
0236 }
0237 
0238 void DatasetsUnitTest::testNewSubcategory() {
0239     removeFiles();
0240     copyFiles();
0241 
0242     ImportDatasetWidget* importWidget = new ImportDatasetWidget(nullptr);
0243     DatasetMetadataManagerDialog* datasetDialog = new DatasetMetadataManagerDialog(nullptr, importWidget->getDatasetsMap());
0244 
0245     delete importWidget;
0246 
0247     datasetDialog->setCollection("Test");
0248     datasetDialog->setCategory("Test_Cat");
0249     datasetDialog->setSubcategory("Test_Subcat5");
0250     datasetDialog->setShortName("test_new");
0251     datasetDialog->setFullName("New test dataset");
0252     datasetDialog->setDescription("This is a new test dataset");
0253     datasetDialog->setURL("www.testdataset.com");
0254     datasetDialog->updateDocument(m_jsonDir);
0255 
0256     importWidget = new ImportDatasetWidget(nullptr);
0257     DatasetModel* model = new DatasetModel(importWidget->getDatasetsMap());
0258 
0259     QCOMPARE(model->subcategories("Test", "Test_Cat").size(), 5);
0260     QCOMPARE(model->allDatasetsList().toStringList().size(), 7);
0261 }
0262 
0263 void DatasetsUnitTest::testNewDataset() {
0264     removeFiles();
0265     copyFiles();
0266 
0267     ImportDatasetWidget* importWidget = new ImportDatasetWidget(nullptr);
0268     DatasetMetadataManagerDialog* datasetDialog = new DatasetMetadataManagerDialog(nullptr, importWidget->getDatasetsMap());
0269 
0270     delete importWidget;
0271 
0272     datasetDialog->setCollection("Test");
0273     datasetDialog->setCategory("Test_Cat");
0274     datasetDialog->setSubcategory("Test_Subcat");
0275     datasetDialog->setShortName("test_new");
0276     datasetDialog->setFullName("New test dataset");
0277     datasetDialog->setDescription("This is a new test dataset");
0278     datasetDialog->setURL("www.testdataset.com");
0279     datasetDialog->updateDocument(m_jsonDir);
0280 
0281     importWidget = new ImportDatasetWidget(nullptr);
0282     DatasetModel* model = new DatasetModel(importWidget->getDatasetsMap());
0283 
0284     QCOMPARE(model->datasets("Test", "Test_Cat", "Test_Subcat").size(), 2);
0285     QCOMPARE(model->allDatasetsList().toStringList().size(), 7);
0286 }
0287 
0288 QTEST_MAIN(DatasetsUnitTest)
0289 
0290