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)