File indexing completed on 2024-09-08 06:35:21
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)