File indexing completed on 2024-07-21 03:35:18

0001 /*
0002     File                 : NotebookTest.cpp
0003     Project              : LabPlot
0004     Description          : Tests for the Notebook
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2021-2022 Alexander Semke <alexander.semke@web.de>
0007 
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 
0011 #include "NotebookTest.h"
0012 #include "backend/cantorWorksheet/VariableParser.h"
0013 #include "backend/core/AbstractColumn.h"
0014 
0015 #include <gsl/gsl_math.h>
0016 
0017 void NotebookTest::initTestCase() {
0018     qRegisterMetaType<const AbstractAspect*>("const AbstractAspect*");
0019     qRegisterMetaType<const AbstractColumn*>("const AbstractColumn*");
0020     QLocale::setDefault(QLocale(QLocale::C));
0021 }
0022 
0023 //**********************************************************
0024 //************************* Maxima *************************
0025 //**********************************************************
0026 
0027 /*!
0028     read an array of doubles
0029 */
0030 void NotebookTest::testParserMaxima01() {
0031     QString input = QStringLiteral("[1.0, 2.0]");
0032     VariableParser parser(QStringLiteral("maxima"), input);
0033 
0034     QCOMPARE(parser.isParsed(), true);
0035     QCOMPARE(parser.dataType(), AbstractColumn::ColumnMode::Double);
0036 
0037     const auto values = parser.doublePrecision();
0038     QCOMPARE(values.size(), 2);
0039     QCOMPARE(values.at(0), 1.0);
0040     QCOMPARE(values.at(1), 2.0);
0041 }
0042 
0043 /*!
0044     read an array of strings
0045 */
0046 void NotebookTest::testParserMaxima02() {
0047     QString input = QStringLiteral("[\"a\", \"b\"]");
0048     VariableParser parser(QStringLiteral("Maxima"), input);
0049 
0050     QCOMPARE(parser.isParsed(), true);
0051     QCOMPARE(parser.dataType(), AbstractColumn::ColumnMode::Text);
0052 
0053     const auto values = parser.text();
0054     QCOMPARE(values.size(), 2);
0055     //  QCOMPARE(values.at(0), QStringLiteral("a"));
0056     //  QCOMPARE(values.at(1), QStringLiteral("b"));
0057 }
0058 
0059 //**********************************************************
0060 //************************* Python *************************
0061 //**********************************************************
0062 /*!
0063     read a list of doubles
0064 */
0065 void NotebookTest::testParserPython01() {
0066     QString input = QStringLiteral("[1.0, 2.0]");
0067     VariableParser parser(QStringLiteral("python"), input);
0068 
0069     QCOMPARE(parser.isParsed(), true);
0070     QCOMPARE(parser.dataType(), AbstractColumn::ColumnMode::Double);
0071 
0072     const auto values = parser.doublePrecision();
0073     QCOMPARE(values.size(), 2);
0074     QCOMPARE(values.at(0), 1.0);
0075     QCOMPARE(values.at(1), 2.0);
0076 }
0077 
0078 /*!
0079     read a tuple of doubles
0080 */
0081 void NotebookTest::testParserPython02() {
0082     QString input = QStringLiteral("(1.0, 2.0)");
0083     VariableParser parser(QStringLiteral("python"), input);
0084 
0085     QCOMPARE(parser.isParsed(), true);
0086     QCOMPARE(parser.dataType(), AbstractColumn::ColumnMode::Double);
0087 
0088     const auto values = parser.doublePrecision();
0089     QCOMPARE(values.size(), 2);
0090     QCOMPARE(values.at(0), 1.0);
0091     QCOMPARE(values.at(1), 2.0);
0092 }
0093 
0094 /*!
0095     read a set of doubles
0096 */
0097 void NotebookTest::testParserPython03() {
0098     QString input = QStringLiteral("{1.0, 2.0}");
0099     VariableParser parser(QStringLiteral("python"), input);
0100 
0101     QCOMPARE(parser.isParsed(), true);
0102     QCOMPARE(parser.dataType(), AbstractColumn::ColumnMode::Double);
0103 
0104     const auto values = parser.doublePrecision();
0105     QCOMPARE(values.size(), 2);
0106     QCOMPARE(values.at(0), 1.0);
0107     QCOMPARE(values.at(1), 2.0);
0108 }
0109 
0110 // numpy data types
0111 
0112 // np.ones(2, dtype=np.int16)
0113 void NotebookTest::testParserPython04() {
0114     QString input = QStringLiteral("array([1, 1], dtype=int16)");
0115     VariableParser parser(QStringLiteral("python"), input);
0116 
0117     QCOMPARE(parser.isParsed(), true);
0118     QCOMPARE(parser.dataType(), AbstractColumn::ColumnMode::Integer);
0119 
0120     const auto values = parser.integers();
0121     QCOMPARE(values.size(), 2);
0122     QCOMPARE(values.at(0), 1);
0123     QCOMPARE(values.at(1), 1);
0124 }
0125 
0126 // np.ones((2,2), dtype=np.int16)
0127 void NotebookTest::testParserPython05() {
0128     QString input = QStringLiteral("array([[1, 1], [1, 1]], dtype=int16)");
0129     VariableParser parser(QStringLiteral("python"), input);
0130 
0131     QCOMPARE(parser.isParsed(), false);
0132 }
0133 
0134 void NotebookTest::testParserPython06() {
0135     // Testing datetime ms
0136     QString input = QStringLiteral("array(['2016-03-26T02:14:34.000', '2017-03-26T02:14:34.000', '2018-03-26T02:14:34.000'], dtype=datetime64[ms])");
0137     VariableParser parser(QStringLiteral("python"), input);
0138 
0139     QTEST_ASSERT(parser.dataType() == AbstractColumn::ColumnMode::DateTime);
0140     QCOMPARE(parser.isParsed(), true);
0141     auto res = parser.dateTime();
0142 
0143     QCOMPARE(res.length(), 3);
0144     QCOMPARE(res.at(0).isValid(), true);
0145     QCOMPARE(res.at(1).isValid(), true);
0146     QCOMPARE(res.at(2).isValid(), true);
0147     QTEST_ASSERT(res.at(0).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2016-03-26T02:14:34.000"));
0148     QTEST_ASSERT(res.at(1).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2017-03-26T02:14:34.000"));
0149     QTEST_ASSERT(res.at(2).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2018-03-26T02:14:34.000"));
0150 }
0151 
0152 void NotebookTest::testParserPython07() {
0153     // Testing datetime s
0154     QString input = QStringLiteral("array(['2016-03-26T02:14:34', '2017-03-26T02:14:34', '2018-03-26T02:14:34'], dtype=datetime64[s])");
0155     VariableParser parser(QStringLiteral("python"), input);
0156 
0157     QTEST_ASSERT(parser.dataType() == AbstractColumn::ColumnMode::DateTime);
0158     QCOMPARE(parser.isParsed(), true);
0159     auto res = parser.dateTime();
0160 
0161     QCOMPARE(res.length(), 3);
0162     QCOMPARE(res.at(0).isValid(), true);
0163     QCOMPARE(res.at(1).isValid(), true);
0164     QCOMPARE(res.at(2).isValid(), true);
0165     QTEST_ASSERT(res.at(0).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2016-03-26T02:14:34.000"));
0166     QTEST_ASSERT(res.at(1).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2017-03-26T02:14:34.000"));
0167     QTEST_ASSERT(res.at(2).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2018-03-26T02:14:34.000"));
0168 }
0169 
0170 void NotebookTest::testParserPython08() {
0171     // Testing minute datetime
0172     QString input = QStringLiteral("array(['2016-03-26T02:14', '2017-03-26T02:14', '2018-03-26T02:14'], dtype=datetime64[m])");
0173     VariableParser parser(QStringLiteral("python"), input);
0174 
0175     QTEST_ASSERT(parser.dataType() == AbstractColumn::ColumnMode::DateTime);
0176     QCOMPARE(parser.isParsed(), true);
0177     auto res = parser.dateTime();
0178 
0179     QCOMPARE(res.length(), 3);
0180     QCOMPARE(res.at(0).isValid(), true);
0181     QCOMPARE(res.at(1).isValid(), true);
0182     QCOMPARE(res.at(2).isValid(), true);
0183     QVERIFY2(res.at(0).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2016-03-26T02:14:00.000"),
0184              qPrintable(res.at(0).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz"))));
0185     QVERIFY2(res.at(1).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2017-03-26T02:14:00.000"),
0186              qPrintable(res.at(1).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz"))));
0187     QVERIFY2(res.at(2).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2018-03-26T02:14:00.000"),
0188              qPrintable(res.at(2).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz"))));
0189 }
0190 
0191 void NotebookTest::testParserPython09() {
0192     // Testing hour datetime
0193     QString input = QStringLiteral("array(['2016-03-26T02', '2017-03-26T02', '2018-03-26T02'], dtype=datetime64[h])");
0194     VariableParser parser(QStringLiteral("python"), input);
0195 
0196     QTEST_ASSERT(parser.dataType() == AbstractColumn::ColumnMode::DateTime);
0197     QCOMPARE(parser.isParsed(), true);
0198     auto res = parser.dateTime();
0199 
0200     QCOMPARE(res.length(), 3);
0201     QCOMPARE(res.at(0).isValid(), true);
0202     QCOMPARE(res.at(1).isValid(), true);
0203     QCOMPARE(res.at(2).isValid(), true);
0204     QVERIFY2(res.at(0).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2016-03-26T02:00:00.000"),
0205              qPrintable(res.at(0).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz"))));
0206     QVERIFY2(res.at(1).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2017-03-26T02:00:00.000"),
0207              qPrintable(res.at(1).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz"))));
0208     QVERIFY2(res.at(2).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2018-03-26T02:00:00.000"),
0209              qPrintable(res.at(2).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz"))));
0210 }
0211 
0212 void NotebookTest::testParserPython10() {
0213     // Testing datetime day
0214     QString input = QStringLiteral("array(['2016-03-26', '2017-03-26', '2018-03-26'], dtype=datetime64[D])");
0215     VariableParser parser(QStringLiteral("python"), input);
0216 
0217     QTEST_ASSERT(parser.dataType() == AbstractColumn::ColumnMode::DateTime);
0218     QCOMPARE(parser.isParsed(), true);
0219     auto res = parser.dateTime();
0220 
0221     QCOMPARE(res.length(), 3);
0222     QCOMPARE(res.at(0).isValid(), true);
0223     QCOMPARE(res.at(1).isValid(), true);
0224     QCOMPARE(res.at(2).isValid(), true);
0225     QTEST_ASSERT(res.at(0).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2016-03-26T00:00:00.000"));
0226     QTEST_ASSERT(res.at(1).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2017-03-26T00:00:00.000"));
0227     QTEST_ASSERT(res.at(2).toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz")) == QStringLiteral("2018-03-26T00:00:00.000"));
0228 }
0229 
0230 //**********************************************************
0231 //************************* Octave *************************
0232 //**********************************************************
0233 void NotebookTest::testParserOctaveRowVector() {
0234     QString input = QStringLiteral("1.0 2.0 3.0");
0235     VariableParser parser(QStringLiteral("octave"), input);
0236 
0237     QCOMPARE(parser.isParsed(), true);
0238     QCOMPARE(parser.dataType(), AbstractColumn::ColumnMode::Double);
0239 
0240     const auto values = parser.doublePrecision();
0241     QCOMPARE(values.size(), 3);
0242     QCOMPARE(values.at(0), 1.0);
0243     QCOMPARE(values.at(1), 2.0);
0244     QCOMPARE(values.at(2), 3.0);
0245 }
0246 
0247 void NotebookTest::testParserOctaveColumnVector() {
0248     QString input = QStringLiteral("1.0; 2.0; 3.0");
0249     VariableParser parser(QStringLiteral("octave"), input);
0250 
0251     QCOMPARE(parser.isParsed(), true);
0252     QCOMPARE(parser.dataType(), AbstractColumn::ColumnMode::Double);
0253 
0254     const auto values = parser.doublePrecision();
0255     QCOMPARE(values.size(), 3);
0256     QCOMPARE(values.at(0), 1.0);
0257     QCOMPARE(values.at(1), 2.0);
0258     QCOMPARE(values.at(2), 3.0);
0259 }
0260 
0261 QTEST_MAIN(NotebookTest)