File indexing completed on 2024-05-19 16:08:47

0001 /* This file is part of the KDE project
0002    Copyright 2007 Stefan Nikolaus <stefan.nikolaus@kdemail.net>
0003    Copyright 2004 Ariya Hidayat <ariya@kde.org>
0004 
0005    This library is free software; you can redistribute it and/or
0006    modify it under the terms of the GNU Library General Public
0007    License as published by the Free Software Foundation; only
0008    version 2 of the License.
0009 
0010    This library is distributed in the hope that it will be useful,
0011    but WITHOUT ANY WARRANTY; without even the implied warranty of
0012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0013    Library General Public License for more details.
0014 
0015    You should have received a copy of the GNU Library General Public License
0016    along with this library; see the file COPYING.LIB.  If not, write to
0017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0018    Boston, MA 02110-1301, USA.
0019 */
0020 #include "TestValue.h"
0021 
0022 #include "TestKspreadCommon.h"
0023 
0024 #include "CalculationSettings.h"
0025 
0026 
0027 void TestValue::testEmpty()
0028 {
0029     Value* v1;
0030 
0031     // empty value
0032     v1 = new Value();
0033     QCOMPARE(v1->type(), Value::Empty);
0034     delete v1;
0035 }
0036 
0037 void TestValue::testBoolean()
0038 {
0039     Value* v1;
0040 
0041     // boolean value (true)
0042     v1 = new Value(true);
0043     QCOMPARE(v1->type(), Value::Boolean);
0044     QCOMPARE(v1->asBoolean(), true);
0045     *v1 = Value(1);   // dummy
0046     *v1 = Value(true);
0047     QCOMPARE(v1->type(), Value::Boolean);
0048     QCOMPARE(v1->asBoolean(), true);
0049     delete v1;
0050 
0051     // boolean value (false)
0052     v1 = new Value(false);
0053     QCOMPARE(v1->type(), Value::Boolean);
0054     QCOMPARE(v1->asBoolean(), false);
0055     *v1 = Value(4);   // dummy
0056     *v1 = Value(false);
0057     QCOMPARE(v1->type(), Value::Boolean);
0058     QCOMPARE(v1->asBoolean(), false);
0059     delete v1;
0060 }
0061 
0062 void TestValue::testInteger()
0063 {
0064     Value* v1;
0065 
0066     // integer value
0067     v1 = new Value(1977);
0068     QCOMPARE(v1->type(), Value::Integer);
0069     QCOMPARE(v1->asInteger(), (qint64)1977);
0070     *v1 = Value(false);   // dummy
0071     *v1 = Value(14);
0072     QCOMPARE(v1->type(), Value::Integer);
0073     QCOMPARE(v1->isInteger(), true);
0074     QCOMPARE(v1->isFloat(), false);
0075     QCOMPARE(v1->isString(), false);
0076     QCOMPARE(v1->isNumber(), true);
0077     QCOMPARE(v1->asInteger(), (qint64)14);
0078     delete v1;
0079 }
0080 
0081 void TestValue::testFloat()
0082 {
0083     Value* v1;
0084 
0085     // floating-point value
0086     v1 = new Value(M_PI);
0087     QCOMPARE(v1->type(), Value::Float);
0088     QCOMPARE(numToDouble(v1->asFloat()), (long double) M_PI);
0089     *v1 = Value(false);   // dummy
0090     *v1 = Value(14.03l);
0091     QCOMPARE(v1->type(), Value::Float);
0092     QCOMPARE(v1->isInteger(), false);
0093     QCOMPARE(v1->isFloat(), true);
0094     QCOMPARE(v1->isString(), false);
0095     QCOMPARE(v1->isNumber(), true);
0096     QCOMPARE(numToDouble(v1->asFloat()), 14.03l);
0097     delete v1;
0098 }
0099 
0100 void TestValue::testString()
0101 {
0102     Value* v1;
0103     Value* v2;
0104 
0105     // string value
0106     v1 = new Value(QString("Ailinon"));
0107     QCOMPARE(v1->type(), Value::String);
0108     QCOMPARE(v1->asString(), QString("Ailinon"));
0109     *v1 = Value(7);   // dummy
0110     *v1 = Value(QString("spreadsheet"));
0111     QCOMPARE(v1->type(), Value::String);
0112     QCOMPARE(v1->isInteger(), false);
0113     QCOMPARE(v1->isFloat(), false);
0114     QCOMPARE(v1->isString(), true);
0115     QCOMPARE(v1->isNumber(), false);
0116     QCOMPARE(v1->asString(), QString("spreadsheet"));
0117     delete v1;
0118 
0119     // equality
0120     v1 = new Value(Value::String);
0121     v2 = new Value(Value::String);
0122     QCOMPARE(*v1, *v2);
0123     *v1 = Value(QString("spreadsheet"));
0124     *v2 = Value(QString("spreadsheet"));
0125     QCOMPARE(*v1, *v2);
0126     delete v1;
0127     delete v2;
0128 }
0129 
0130 void TestValue::testDate()
0131 {
0132     Value* v1;
0133 
0134     // check all (valid) dates from 1900 to 2050
0135     // note: bail on first error immediately
0136     CalculationSettings calculationSettings;
0137     QDate refDate(1899, 12, 31);
0138     v1 = new Value();
0139     bool date_error = 0;
0140     for (unsigned y = 1900; !date_error && y < 2050; ++y)
0141         for (unsigned m = 1; !date_error && m <= 12; ++m)
0142             for (unsigned d = 1; !date_error && d <= 31; ++d) {
0143                 QDate dv1 = QDate(y, m, d);
0144                 if (!dv1.isValid()) continue;
0145                 long double serialNo = -dv1.daysTo(refDate) + 1.0;
0146                 *v1 = Value(Value(dv1, &calculationSettings));
0147                 QCOMPARE(numToDouble(v1->asFloat()), serialNo);
0148                 date_error = v1->asFloat() != serialNo;
0149             }
0150     delete v1;
0151 }
0152 
0153 void TestValue::testTime()
0154 {
0155     CalculationSettings calculationSettings;
0156     Value* v1;
0157 
0158     // time value
0159     v1 = new Value();
0160     *v1 = Value(Value(QTime(0, 0, 0)));
0161     QCOMPARE(v1->type(), Value::Float);
0162     for (unsigned h = 0; h < 24; ++h)
0163         for (unsigned m = 0; m < 60; ++m)
0164             for (unsigned s = 0; s < 60; ++s) {
0165                 QTime t1 = QTime(h, m, s);
0166                 *v1 = Value(Value(t1));
0167                 QTime t2 = v1->asTime();
0168                 QCOMPARE(t1.hour(), t2.hour());
0169                 QCOMPARE(t1.minute(), t2.minute());
0170                 QCOMPARE(t1.second(), t2.second());
0171                 QCOMPARE(t1.msec(), t2.msec());
0172             }
0173     delete v1;
0174 
0175     // time value (msec)
0176     v1 = new Value();
0177     *v1 = Value(Value(QTime(0, 0, 0)));
0178     QCOMPARE(v1->type(), Value::Float);
0179     for (unsigned ms = 0; ms < 1000; ++ms) {
0180         QTime t1 = QTime(1, 14, 2, ms);
0181         *v1 = Value(Value(t1));
0182         QTime t2 = v1->asTime();
0183         QCOMPARE(t1.hour(), t2.hour());
0184         QCOMPARE(t1.minute(), t2.minute());
0185         QCOMPARE(t1.second(), t2.second());
0186         QCOMPARE(t1.msec(), t2.msec());
0187     }
0188     delete v1;
0189 }
0190 
0191 void TestValue::testError()
0192 {
0193     Value* v1;
0194     Value* v2;
0195 
0196     // TODO error values
0197 
0198     // TODO compare values
0199     // TODO add, sub, mul, div values
0200     // TODO pow
0201 
0202     // equality
0203     v1 = new Value(Value::Error);
0204     v2 = new Value(Value::Error);
0205     QCOMPARE(*v1, *v2);
0206     *v1 = Value(Value::errorVALUE());
0207     *v2 = Value(Value::errorVALUE());
0208     QCOMPARE(*v1, *v2);
0209     delete v1;
0210     delete v2;
0211 }
0212 
0213 void TestValue::testArray()
0214 {
0215     Value* v1;
0216     Value* v2;
0217 
0218     // array
0219     v1 = new Value(Value::Array);
0220     QCOMPARE(v1->type(), Value::Array);
0221     QCOMPARE(v1->columns(), (unsigned)1);
0222     QCOMPARE(v1->rows(), (unsigned)1);
0223     delete v1;
0224 
0225     // check empty value in array
0226     v1 = new Value(Value::Array);
0227     QCOMPARE(v1->type(), Value::Array);
0228     v2 = new Value(v1->element(0, 0));
0229     QCOMPARE(v2->type(), Value::Empty);
0230     delete v1;
0231 
0232     // fill simple 1x1 array
0233     v1 = new Value(Value::Array);
0234     QCOMPARE(v1->type(), Value::Array);
0235     v2 = new Value(14.3l);
0236     v1->setElement(0, 0, *v2);
0237     delete v2;
0238     v2 = new Value(v1->element(0, 0));
0239     QCOMPARE(v2->type(), Value::Float);
0240     QCOMPARE(numToDouble(v2->asFloat()), 14.3l);
0241     delete v2;
0242     delete v1;
0243 
0244     // stress test, array of 1000x1000
0245     v1 = new Value(Value::Array);
0246     QCOMPARE(v1->type(), Value::Array);
0247     for (unsigned r = 0; r < 1000; ++r)
0248         for (unsigned c = 0; c < 1000; ++c) {
0249             int index = 1000 * r + c;
0250             v1->setElement(c, r, Value(index));
0251         }
0252     int array_error = 0;
0253     for (unsigned c = 0; !array_error && c < 1000; ++c)
0254         for (unsigned r = 0; !array_error && r < 1000; ++r) {
0255             int index = 1000 * r + c;
0256             v2 = new Value(v1->element(c, r));
0257             if (v2->type() != Value::Integer) ++array_error;
0258             if (v2->asInteger() != index) ++array_error;
0259             delete v2;
0260         }
0261     QCOMPARE(array_error, (int)0);
0262     delete v1;
0263 
0264     // assignment of array value
0265     v1 = new Value(Value::Array);
0266     QCOMPARE(v1->type(), Value::Array);
0267     v1->setElement(1, 1, Value(44.3l));
0268     v1->setElement(0, 1, Value(34.3l));
0269     v1->setElement(1, 0, Value(24.3l));
0270     v1->setElement(0, 0, Value(14.3l));
0271     v2 = new Value(*v1);   // v2 is now also an array
0272     delete v1;
0273     v1 = new Value(v2->element(0, 0));
0274     QCOMPARE(v1->type(), Value::Float);
0275     QCOMPARE(numToDouble(v1->asFloat()), 14.3l);
0276     delete v1;
0277     delete v2;
0278 
0279     // equality
0280     v1 = new Value(Value::Array);
0281     v2 = new Value(Value::Array);
0282     QCOMPARE(*v1, *v2);
0283     v1->setElement(0, 0, Value(1));
0284     v1->setElement(0, 1, Value(2));
0285     v2->setElement(0, 0, Value(1));
0286     v2->setElement(0, 1, Value(2));
0287     QCOMPARE(*v1, *v2);
0288     delete v1;
0289     delete v2;
0290 }
0291 
0292 void TestValue::testCopy()
0293 {
0294     Value* v1;
0295     Value* v2;
0296 
0297     // copy value
0298     v1 = new Value();
0299     *v1 = Value(14.3l);
0300     v2 = new Value(*v1);
0301     QCOMPARE(v1->type(), Value::Float);
0302     QCOMPARE(v2->type(), Value::Float);
0303     QCOMPARE(numToDouble(v1->asFloat()), 14.3l);
0304     QCOMPARE(numToDouble(v2->asFloat()), 14.3l);
0305     delete v1;
0306     delete v2;
0307 }
0308 
0309 void TestValue::testAssignment()
0310 {
0311     Value* v1;
0312     Value* v2;
0313 
0314     // value assignment
0315     v1 = new Value(14.3l);
0316     v2 = new Value(true);
0317     *v2 = *v1;
0318     QCOMPARE(v1->type(), Value::Float);
0319     QCOMPARE(v2->type(), Value::Float);
0320     QCOMPARE(numToDouble(v1->asFloat()), 14.3l);
0321     QCOMPARE(numToDouble(v2->asFloat()), 14.3l);
0322     delete v1;
0323     delete v2;
0324 
0325     // test copying/detaching of string values (QString*)
0326     v1 = new Value("Hello");
0327     v2 = new Value(true);
0328     *v2 = *v1;
0329     QCOMPARE(v1->type(), Value::String);
0330     QCOMPARE(v2->type(), Value::String);
0331     QCOMPARE(v1->asString(), QString("Hello"));
0332     QCOMPARE(v2->asString(), QString("Hello"));
0333     *v2 = Value(QString("World"));
0334     QCOMPARE(v1->asString(), QString("Hello"));
0335     QCOMPARE(v2->asString(), QString("World"));
0336     delete v1;
0337     delete v2;
0338 
0339     // test copying/detaching of arrays (ValueArray*)
0340     v1 = new Value(Value::Array);
0341     v1->setElement(0, 0, Value(1));
0342     v1->setElement(0, 1, Value(2));
0343     v2 = new Value(true);
0344     *v2 = *v1;
0345     QCOMPARE(v1->type(), Value::Array);
0346     QCOMPARE(v2->type(), Value::Array);
0347     QCOMPARE(v1->element(0, 0), Value(1));
0348     QCOMPARE(v1->element(0, 1), Value(2));
0349     QCOMPARE(v2->element(0, 0), Value(1));
0350     QCOMPARE(v2->element(0, 1), Value(2));
0351     v2->setElement(0, 0, Value(3));
0352     QCOMPARE(v1->element(0, 0), Value(1));
0353     QCOMPARE(v1->element(0, 1), Value(2));
0354     QCOMPARE(v2->element(0, 0), Value(3));
0355     QCOMPARE(v2->element(0, 1), Value(2));
0356     delete v1;
0357     delete v2;
0358 }
0359 
0360 QTEST_MAIN(TestValue)