File indexing completed on 2024-05-12 16:36:01
0001 /* This file is part of the KDE project 0002 Copyright 2015 Marijn Kruisselbrink <mkruisselbrink@kde.org> 0003 0004 This library is free software; you can redistribute it and/or 0005 modify it under the terms of the GNU Library General Public 0006 License as published by the Free Software Foundation; only 0007 version 2 of the License. 0008 0009 This library is distributed in the hope that it will be useful, 0010 but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0012 Library General Public License for more details. 0013 0014 You should have received a copy of the GNU Library General Public License 0015 along with this library; see the file COPYING.LIB. If not, write to 0016 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0017 Boston, MA 02110-1301, USA. 0018 */ 0019 #include "TestValueParser.h" 0020 0021 #include <ValueParser.h> 0022 0023 #include <CalculationSettings.h> 0024 #include <Value.h> 0025 0026 #include <klocale.h> 0027 0028 #include <QTest> 0029 0030 #include <locale.h> 0031 0032 using namespace Calligra::Sheets; 0033 0034 void TestValueParser::initTestCase() 0035 { 0036 m_calcsettings = new CalculationSettings(); 0037 m_parser = new ValueParser(m_calcsettings); 0038 0039 QStandardPaths::setTestModeEnabled(true); 0040 0041 // If run with 'C' locale translations will fail 0042 // Setting it to 'C.UTF-8' fixes this 0043 // HACK: (Since I don't really know why) 0044 char *l = setlocale(LC_MESSAGES, 0); 0045 if (l && strcmp(l, "C") == 0) { 0046 setlocale(LC_MESSAGES, "C.UTF-8"); 0047 qDebug()<<"Set locale:"<<l<<"->"<<setlocale(LC_MESSAGES, 0); 0048 } 0049 0050 // Some tests need translations of certain words. 0051 // These are available in .mo file in the data directory. 0052 // Install these xx translations into test path for some arbitrary language. 0053 // We use the 'nl'. 0054 QString locale = "nl"; 0055 QString dataPath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); 0056 QString localePath = dataPath + "/locale/" + locale + "/LC_MESSAGES"; 0057 QVERIFY(QDir(localePath).mkpath(".")); 0058 m_translationsFile = localePath + "/calligrasheets.mo"; 0059 if (QFile::exists(m_translationsFile)) { 0060 QFile::remove(m_translationsFile); 0061 } 0062 // NOTE: sheets.mo -> calligrasheets.mo. Maybe rename sheets.mo 0063 QVERIFY(QFile::copy(QFINDTESTDATA("data/sheets.mo"), m_translationsFile)); 0064 0065 // check that translation ok, else lot of tests will fail later 0066 *m_calcsettings->locale() = KLocale(locale, locale); 0067 QCOMPARE(m_calcsettings->locale()->country(), locale); 0068 QString s = ki18n("true").toString(QStringList()<<"nl"); 0069 QVERIFY2(s == QString("xxtruexx"), "Translation failed, check that you have the correct .mo file in the data directory and that it installs correctly"); 0070 } 0071 0072 void TestValueParser::cleanupTestCase() 0073 { 0074 QStandardPaths::setTestModeEnabled(false); 0075 QFile::remove(m_translationsFile); 0076 0077 delete m_parser; 0078 delete m_calcsettings; 0079 } 0080 0081 void TestValueParser::testTryParseBool_data(bool addCol) 0082 { 0083 if (addCol) { 0084 QTest::addColumn<QString>("locale"); 0085 QTest::addColumn<QString>("str"); 0086 QTest::addColumn<bool>("expectedOk"); 0087 QTest::addColumn<Value>("expected"); 0088 } 0089 0090 QTest::newRow("en true") << "C" << "true" << true << Value(true); 0091 QTest::newRow("en false") << "C" << "false" << true << Value(false); 0092 QTest::newRow("en foobar") << "C" << "foobar" << false << Value(); 0093 QTest::newRow("en TruE") << "C" << "TruE" << true << Value(true); 0094 QTest::newRow("en fAlSe") << "C" << "fAlSe" << true << Value(false); 0095 QTest::newRow("en xxtruexx") << "C" << "xxtruexx" << false << Value(); 0096 QTest::newRow("xx true") << "nl" << "true" << true << Value(true); 0097 QTest::newRow("xx false") << "nl" << "false" << true << Value(false); 0098 QTest::newRow("xx foobar") << "nl" << "foobar" << false << Value(); 0099 QTest::newRow("xx TruE") << "nl" << "TruE" << true << Value(true); 0100 QTest::newRow("xx fAlSe") << "nl" << "fAlSe" << true << Value(false); 0101 QTest::newRow("xx xxtruexx") << "nl" << "xxtruexx" << true << Value(true); 0102 QTest::newRow("xx xxtRuexx") << "nl" << "xxtRuexx" << true << Value(true); 0103 QTest::newRow("xx xxfalSexx") << "nl" << "xxfalSexx" << true << Value(false); 0104 } 0105 0106 void TestValueParser::testTryParseBool() 0107 { 0108 QFETCH(QString, locale); 0109 QFETCH(QString, str); 0110 QFETCH(bool, expectedOk); 0111 QFETCH(Value, expected); 0112 0113 *m_calcsettings->locale() = KLocale(locale, locale); 0114 QCOMPARE(m_calcsettings->locale()->country(), locale); 0115 0116 bool ok; 0117 Value result = m_parser->tryParseBool(str, &ok); 0118 QCOMPARE(ok, expectedOk); 0119 QCOMPARE(result, expected); 0120 } 0121 0122 void TestValueParser::testTryParseNumber_data(bool addCol) 0123 { 0124 if (addCol) { 0125 QTest::addColumn<QString>("locale"); 0126 QTest::addColumn<QString>("str"); 0127 QTest::addColumn<bool>("expectedOk"); 0128 QTest::addColumn<Value>("expected"); 0129 } 0130 0131 QTest::newRow("123") << "C" << "123" << true << Value(123); 0132 QTest::newRow("-456") << "C" << "-456" << true << Value(-456); 0133 QTest::newRow("+5") << "C" << "+5" << true << Value(5); 0134 QTest::newRow("1525%") << "C" << "1525%" << true << Value(15.25); 0135 QTest::newRow("5+3i") << "C" << "5+3i" << true << Value(complex<Number>(5, 3)); 0136 QTest::newRow("2.4 + 3j") << "C" << "2.4 + 3j" 0137 << true << Value(complex<Number>(2.4, 3)); 0138 QTest::newRow("6 - 3i") << "C" << "6 - 3i" 0139 << true << Value(complex<Number>(6, -3)); 0140 QTest::newRow("2.4i") << "C" << "2.4i" << true << Value(complex<Number>(0, 2.4)); 0141 QTest::newRow("1,4") << "C" << "1,4" << false << Value(); 0142 QTest::newRow("1,400") << "C" << "1,400" << true << Value(1400); 0143 QTest::newRow("3 5/2") << "C" << "3 5/2" << true << Value(5.5); 0144 QTest::newRow("3e2") << "C" << "3e2" << true << Value(300.0); 0145 QTest::newRow("1234E-2") << "C" << "1234E-2" << true << Value(12.34); 0146 //QTest::newRow("string 12.34e+5 + 4.2e2i") << "C" << "12.34e+5 + 4.2e2i" 0147 // << true << complex<Number>(12.34e5, 4.2e2); 0148 //QTest::newRow("string 12.34e+5 + 4.2e+2i") << "C" << "12.34e+5 + 4.2e+2i" 0149 // << true << complex<Number>(12.34e5, 4.2e2); 0150 QTest::newRow("1,4 nl") << "nl" << "1,4" << true << Value(1.4); 0151 QTest::newRow("1,400 nl") << "nl" << "1,400" << true << Value(1.4); 0152 } 0153 0154 void TestValueParser::testTryParseNumber() 0155 { 0156 QFETCH(QString, locale); 0157 QFETCH(QString, str); 0158 QFETCH(bool, expectedOk); 0159 QFETCH(Value, expected); 0160 0161 *m_calcsettings->locale() = KLocale(locale, locale); 0162 QCOMPARE(m_calcsettings->locale()->country(), locale); 0163 0164 bool ok; 0165 Value result = m_parser->tryParseNumber(str, &ok); 0166 QCOMPARE(ok, expectedOk); 0167 QCOMPARE(result, expected); 0168 } 0169 0170 void TestValueParser::testTryParseDate_data(bool addCol) 0171 { 0172 if (addCol) { 0173 QTest::addColumn<QString>("locale"); 0174 QTest::addColumn<QString>("str"); 0175 QTest::addColumn<bool>("expectedOk"); 0176 QTest::addColumn<Value>("expected"); 0177 } 0178 0179 // TODO(mek): Return value for invalid dates seems wrong. 0180 QTest::newRow("ShortDate") << "C" << "2005-06-11" << true 0181 << Value(QDate(2005, 6, 11), m_calcsettings); 0182 QTest::newRow("ShortDate yy") << "C" << "05-06-11" << true 0183 << Value(QDate(5, 6, 11), m_calcsettings); 0184 QTest::newRow("ShortDate m < 1") << "C" << "2005-00-12" << false 0185 << Value(QDate(), m_calcsettings); 0186 QTest::newRow("ShortDate m > 12") << "C" << "2005-13-12" << false 0187 << Value(QDate(), m_calcsettings); 0188 QTest::newRow("ShortDate d < 1") << "C" << "2005-02-00" << false 0189 << Value(QDate(), m_calcsettings); 0190 QTest::newRow("ShortDate d > 31") << "C" << "2005-02-29" << false 0191 << Value(QDate(), m_calcsettings); 0192 QTest::newRow("ShortDate us") << "us" << "06/11/2005" << true 0193 << Value(QDate(2005, 6, 11), m_calcsettings); 0194 QTest::newRow("ShortDate yy us") << "us" << "6/11/05" << true 0195 << Value(QDate(2005, 6, 11), m_calcsettings); 0196 QTest::newRow("ShortDate us m < 1") << "us" << "0/11/05" << false 0197 << Value(QDate(), m_calcsettings); 0198 QTest::newRow("ShortDate us m > 12") << "us" << "13/11/05" << false 0199 << Value(QDate(), m_calcsettings); 0200 QTest::newRow("ShortDate us d < 1") << "us" << "2/0/05" << false 0201 << Value(QDate(), m_calcsettings); 0202 QTest::newRow("ShortDate us d > 31") << "us" << "2/29/05" << false 0203 << Value(QDate(), m_calcsettings); 0204 QTest::newRow("ShortDate nl") << "nl" << "11/06/2005" << true 0205 << Value(QDate(2005, 6, 11), m_calcsettings); 0206 QTest::newRow("ShortDate yy nl") << "nl" << "11/06/05" << true 0207 << Value(QDate(2005, 6, 11), m_calcsettings); 0208 QTest::newRow("ShortDate nl m < 1") << "nl" << "11/0/05" << false 0209 << Value(QDate(), m_calcsettings); 0210 QTest::newRow("ShortDate nl m > 12") << "nl" << "11/13/05" << false 0211 << Value(QDate(), m_calcsettings); 0212 QTest::newRow("ShortDate nl d < 1") << "nl" << "0/2/05" << false 0213 << Value(QDate(), m_calcsettings); 0214 QTest::newRow("ShortDate nl d > 31") << "nl" << "29/2/05" << false 0215 << Value(QDate(), m_calcsettings); 0216 0217 QTest::newRow("LongDate") << "C" << "Saturday 01 January 2000" << true 0218 << Value(QDate(2000, 1, 1), m_calcsettings); 0219 // TODO(mek): Should this really parse correctly? 0220 QTest::newRow("LongDate wrong weekday") << "C" << "Friday 01 January 2000" << true 0221 << Value(QDate(2000, 1, 1), m_calcsettings); 0222 QTest::newRow("LongDate lowercase") << "C" << "saturday 01 january 2000" << true 0223 << Value(QDate(2000, 1, 1), m_calcsettings); 0224 QTest::newRow("LongDate bad day 1") << "C" << "Saturday 0 January 2000" << false 0225 << Value(QDate(), m_calcsettings); 0226 QTest::newRow("LongDate bad day 2") << "C" << "Saturday 32 January 2000" << false 0227 << Value(QDate(), m_calcsettings); 0228 QTest::newRow("LongDate short month") << "C" << "Saturday 1 feb 2000" << true 0229 << Value(QDate(2000, 2, 1), m_calcsettings); 0230 QTest::newRow("LongDate bad month") << "C" << "Saturday 1 feburary 2000" << false 0231 << Value(QDate(), m_calcsettings); 0232 0233 QTest::newRow("IsoDate") << "C" << "2005-06-11" << true 0234 << Value(QDate(2005, 6, 11), m_calcsettings); 0235 QTest::newRow("IsoDate yy") << "C" << "05-06-11" << true 0236 << Value(QDate(5, 6, 11), m_calcsettings); 0237 QTest::newRow("IsoDate bad day 1") << "C" << "2005-06-0" << false 0238 << Value(QDate(), m_calcsettings); 0239 QTest::newRow("IsoDate bad day 2") << "C" << "2005-06-32" << false 0240 << Value(QDate(), m_calcsettings); 0241 QTest::newRow("IsoDate bad month 1") << "C" << "2005-0-06" << false 0242 << Value(QDate(), m_calcsettings); 0243 QTest::newRow("IsoDate bad month 2") << "C" << "2005-13-06" << false 0244 << Value(QDate(), m_calcsettings); 0245 QTest::newRow("IsoDate us") << "us" << "2005-06-11" << true 0246 << Value(QDate(2005, 6, 11), m_calcsettings); 0247 QTest::newRow("IsoDate yy us") << "us" << "05-06-11" << true 0248 << Value(QDate(5, 6, 11), m_calcsettings); 0249 QTest::newRow("IsoDate nl") << "nl" << "2005-06-11" << true 0250 << Value(QDate(2005, 6, 11), m_calcsettings); 0251 QTest::newRow("IsoDate yy nl") << "nl" << "05-06-11" << true 0252 << Value(QDate(5, 6, 11), m_calcsettings); 0253 0254 QTest::newRow("IsoWeekFormat1") << "C" << "2004-W53-7" << true 0255 << Value(QDate(2005, 1, 2), m_calcsettings); 0256 QTest::newRow("IsoWeekFormat2") << "C" << "2004-w53-7" << true 0257 << Value(QDate(2005, 1, 2), m_calcsettings); 0258 QTest::newRow("IsoWeekFormat3") << "C" << "2005-W3-4" << true 0259 << Value(QDate(2005, 1, 20), m_calcsettings); 0260 QTest::newRow("IsoWeekFormat4") << "C" << "2009-W01-1" << true 0261 << Value(QDate(2008, 12, 29), m_calcsettings); 0262 QTest::newRow("IsoWeekFormat error 1") << "C" << "2004-W54-7" << false 0263 << Value(QDate(), m_calcsettings); 0264 QTest::newRow("IsoWeekFormat error 2") << "C" << "2004-W50-0" << false 0265 << Value(QDate(), m_calcsettings); 0266 QTest::newRow("IsoWeekFormat error 3") << "C" << "2004-W50-8" << false 0267 << Value(QDate(), m_calcsettings); 0268 QTest::newRow("IsoWeekFormat error 4") << "C" << "2004-W0-1" << false 0269 << Value(QDate(), m_calcsettings); 0270 QTest::newRow("IsoWeekFormat error 5") << "C" << "2008-W53-1" << false 0271 << Value(QDate(), m_calcsettings); 0272 0273 QTest::newRow("IsoOrdinalFormat1") << "C" << "2004-1" << true 0274 << Value(QDate(2004, 1, 1), m_calcsettings); 0275 QTest::newRow("IsoOrdinalFormat2") << "C" << "2005-51" << true 0276 << Value(QDate(2005, 2, 20), m_calcsettings); 0277 QTest::newRow("IsoOrdinalFormat3") << "C" << "2006-151" << true 0278 << Value(QDate(2006, 5, 31), m_calcsettings); 0279 QTest::newRow("IsoOrdinalFormat4") << "C" << "2000-366" << true 0280 << Value(QDate(2000, 12, 31), m_calcsettings); 0281 QTest::newRow("IsoOrdinal error 1") << "C" << "2006-0" << false 0282 << Value(QDate(), m_calcsettings); 0283 QTest::newRow("IsoOrdinal error 2") << "C" << "2006-366" << false 0284 << Value(QDate(), m_calcsettings); 0285 QTest::newRow("IsoOrdinal error 3") << "C" << "2000-367" << false 0286 << Value(QDate(), m_calcsettings); 0287 0288 QTest::newRow("ShortDate-year us") << "us" << "12/30" << true 0289 << Value(QDate(QDate::currentDate().year(), 12, 30), m_calcsettings); 0290 QTest::newRow("ShortDate-year us bad month 1") << "us" << "0/06" << false 0291 << Value(QDate(), m_calcsettings); 0292 QTest::newRow("ShortDate-year us bad month 2") << "us" << "13/06" << false 0293 << Value(QDate(), m_calcsettings); 0294 QTest::newRow("ShortDate-year us bad day 1") << "us" << "11/0" << false 0295 << Value(QDate(), m_calcsettings); 0296 QTest::newRow("ShortDate-year us bad day 2") << "us" << "11/33" << false 0297 << Value(QDate(), m_calcsettings); 0298 QTest::newRow("ShortDate-year nl") << "nl" << "30/12" << true 0299 << Value(QDate(QDate::currentDate().year(), 12, 30), m_calcsettings); 0300 QTest::newRow("ShortDate-year nl bad month 1") << "nl" << "06/0" << false 0301 << Value(QDate(), m_calcsettings); 0302 QTest::newRow("ShortDate-year nl bad month 2") << "nl" << "06/13" << false 0303 << Value(QDate(), m_calcsettings); 0304 QTest::newRow("ShortDate-year nl bad day 1") << "nl" << "11/0" << false 0305 << Value(QDate(), m_calcsettings); 0306 QTest::newRow("ShortDate-year nl bad day 2") << "nl" << "11/33" << false 0307 << Value(QDate(), m_calcsettings); 0308 0309 QTest::newRow("ExcelCompat") << "us" <<"3/4/45" << true 0310 << Value(QDate(1945, 3, 4), m_calcsettings); 0311 0312 QTest::newRow("string invalid") << "C" << "not a date" << false 0313 << Value(QDate(), m_calcsettings); 0314 } 0315 0316 void TestValueParser::testTryParseDate() 0317 { 0318 QFETCH(QString, locale); 0319 QFETCH(QString, str); 0320 QFETCH(bool, expectedOk); 0321 QFETCH(Value, expected); 0322 0323 *m_calcsettings->locale() = KLocale(locale, locale); 0324 QCOMPARE(m_calcsettings->locale()->country(), locale); 0325 0326 bool ok; 0327 Value result = m_parser->tryParseDate(str, &ok); 0328 QCOMPARE(ok, expectedOk); 0329 QCOMPARE(result, expected); 0330 } 0331 0332 void TestValueParser::testTryParseTime_data(bool addCol) 0333 { 0334 if (addCol) { 0335 QTest::addColumn<QString>("locale"); 0336 QTest::addColumn<QString>("str"); 0337 QTest::addColumn<bool>("expectedOk"); 0338 QTest::addColumn<Value>("expected"); 0339 } 0340 0341 QTest::newRow("24hr with seconds") << "C" << "13:14:15" << true 0342 << Value(QTime(13, 14, 15)); 0343 QTest::newRow("24hr with seconds us") << "us" << "13:14:15" << false << Value(); 0344 QTest::newRow("24hr with seconds nl") << "nl" << "13:14:15" << true 0345 << Value(QTime(13, 14, 15)); 0346 QTest::newRow("24hr with bad seconds 1") << "C" << "13:14:-1" << false << Value(); 0347 QTest::newRow("24hr with bad seconds 2") << "C" << "13:14:60" << false << Value(); 0348 QTest::newRow("24hr with bad seconds 1 nl") << "nl" << "13:14:-1" << false << Value(); 0349 QTest::newRow("24hr with bad seconds 2 nl") << "nl" << "13:14:60" << false << Value(); 0350 QTest::newRow("24hr w/o seconds") << "C" << "13:14" << true 0351 << Value(QTime(13, 14)); 0352 QTest::newRow("24hr w/o seconds us") << "us" << "13:14" << false << Value(); 0353 QTest::newRow("24hr w/o seconds nl") << "nl" << "13:14" << true 0354 << Value(QTime(13, 14)); 0355 QTest::newRow("24hr with bad minutes 1") << "C" << "13:-1:4" << false << Value(); 0356 QTest::newRow("24hr with bad minutes 2") << "C" << "13:60:10" << false << Value(); 0357 QTest::newRow("24hr with bad minutes 1 nl") << "nl" << "13:-1:4" << false << Value(); 0358 QTest::newRow("24hr with bad minutes 2 nl") << "nl" << "13:60:10" << false << Value(); 0359 QTest::newRow("25hr") << "C" << "25:1:4" << true 0360 << Value(QTime(1, 1, 4)); 0361 QTest::newRow("25hr nl") << "nl" << "25:1:4" << true 0362 << Value(QTime(1, 1, 4)); 0363 QTest::newRow("0hr") << "C" << "0:14:15" << true 0364 << Value(QTime(0, 14, 15)); 0365 QTest::newRow("0hr us") << "us" << "0:14:15" << false << Value(); 0366 QTest::newRow("0hr nl") << "nl" << "0:14:15" << true 0367 << Value(QTime(0, 14, 15)); 0368 QTest::newRow("0hr am") << "C" << "0:14:15 AM" << true 0369 << Value(QTime(0, 14, 15)); 0370 QTest::newRow("0hr am us") << "us" << "0:14:15 AM" << false << Value(); 0371 QTest::newRow("0hr am nl") << "nl" << "0:14:15 xxAMxx" << true 0372 << Value(QTime(0, 14, 15)); 0373 QTest::newRow("0hr pm") << "C" << "0:14:15 pM" << true 0374 << Value(QTime(12, 14, 15)); 0375 QTest::newRow("0hr pm us") << "us" << "0:14:15 PM" << false << Value(); 0376 QTest::newRow("0hr pm nl") << "nl" << "0:14:15 xxPmxx" << true 0377 << Value(QTime(12, 14, 15)); 0378 QTest::newRow("12hr") << "C" << "10:14:15" << true 0379 << Value(QTime(10, 14, 15)); 0380 QTest::newRow("12hr us") << "us" << "10:14:15" << false << Value(); 0381 QTest::newRow("12hr nl") << "nl" << "10:14:15" << true 0382 << Value(QTime(10, 14, 15)); 0383 QTest::newRow("am with seconds") << "C" << "10:11:12 am" << true 0384 << Value(QTime(10, 11, 12)); 0385 QTest::newRow("am with seconds us") << "us" << "10:11:12 am" << true 0386 << Value(QTime(10, 11, 12)); 0387 QTest::newRow("am with seconds nl") << "nl" << "10:11:12 xxamxx" << true 0388 << Value(QTime(10, 11, 12)); 0389 QTest::newRow("am w/o seconds") << "C" << "10:11 am" << true 0390 << Value(QTime(10, 11)); 0391 QTest::newRow("am w/o seconds us") << "us" << "10:11 am" << true 0392 << Value(QTime(10, 11)); 0393 QTest::newRow("am w/o seconds nl") << "nl" << "10:11 xxamxx" << true 0394 << Value(QTime(10, 11)); 0395 QTest::newRow("pm with seconds") << "C" << "10:11:12 pm" << true 0396 << Value(QTime(22, 11, 12)); 0397 QTest::newRow("pm with seconds us") << "us" << "10:11:12 pm" << true 0398 << Value(QTime(22, 11, 12)); 0399 QTest::newRow("pm with seconds nl") << "nl" << "10:11:12 xxpmxx" << true 0400 << Value(QTime(22, 11, 12)); 0401 QTest::newRow("pm w/o seconds") << "C" << "10:11 pm" << true 0402 << Value(QTime(22, 11)); 0403 QTest::newRow("pm w/o seconds us") << "us" << "10:11 pm" << true 0404 << Value(QTime(22, 11)); 0405 QTest::newRow("pm w/o seconds nl") << "nl" << "10:11 xxpmxx" << true 0406 << Value(QTime(22, 11)); 0407 QTest::newRow("negative time") << "C" << "-1:30:10" << true 0408 << Value(QTime(22, 29, 50)); 0409 QTest::newRow("time with ms") << "C" << "2:3:4.5" << true 0410 << Value(QTime(2, 3, 4, 5)); 0411 QTest::newRow("time with ms 2") << "C" << "2:3:4.999" << true 0412 << Value(QTime(2, 3, 4, 999)); 0413 QTest::newRow("time with ms us") << "us" << "2:3:4.5 am" << true 0414 << Value(QTime(2, 3, 4, 5)); 0415 QTest::newRow("time with ms nl") << "nl" << "2:3:4,5" << true 0416 << Value(QTime(2, 3, 4, 5)); 0417 QTest::newRow("noon us") << "us" << "12:00pm" << true 0418 << Value(QTime(12, 0)); 0419 QTest::newRow("midnight us") << "us" << "12:00am" << true 0420 << Value(QTime(0, 0)); 0421 QTest::newRow("too low ms") << "C" << "2:3:4.-1" << false << Value(); 0422 QTest::newRow("too high ms") << "C" << "2:3:4:1000" << false << Value(); 0423 } 0424 0425 void TestValueParser::testTryParseTime() 0426 { 0427 QFETCH(QString, locale); 0428 QFETCH(QString, str); 0429 QFETCH(bool, expectedOk); 0430 QFETCH(Value, expected); 0431 0432 *m_calcsettings->locale() = KLocale(locale, locale); 0433 QCOMPARE(m_calcsettings->locale()->country(), locale); 0434 0435 bool ok; 0436 Value result = m_parser->tryParseTime(str, &ok); 0437 QCOMPARE(ok, expectedOk); 0438 // Negative times are a bit annoying. For now just compare the QTime representations. 0439 if (result.format() == Value::fmt_Time && expected.format() == Value::fmt_Time) 0440 QCOMPARE(result.asTime(), expected.asTime()); 0441 else 0442 QCOMPARE(result, expected); 0443 } 0444 0445 void TestValueParser::testParse_data() { 0446 QTest::addColumn<QString>("locale"); 0447 QTest::addColumn<QString>("str"); 0448 QTest::addColumn<bool>("expectedOk"); 0449 QTest::addColumn<Value>("expected"); 0450 0451 testTryParseBool_data(false); 0452 testTryParseNumber_data(false); 0453 testTryParseDate_data(false); 0454 testTryParseTime_data(false); 0455 0456 QTest::newRow("empty") << "C" << "" << true << Value(""); 0457 QTest::newRow("bool with quote") << "C" << "'true" << true << Value("'true"); 0458 QTest::newRow("int with quote") << "C" << "'123" << true << Value("'123"); 0459 } 0460 0461 void TestValueParser::testParse() { 0462 QFETCH(QString, locale); 0463 QFETCH(QString, str); 0464 QFETCH(bool, expectedOk); 0465 QFETCH(Value, expected); 0466 0467 *m_calcsettings->locale() = KLocale(locale, locale); 0468 QCOMPARE(m_calcsettings->locale()->country(), locale); 0469 0470 Value result = m_parser->parse(str); 0471 if (!expectedOk) 0472 expected = Value(str); 0473 // Negative times are a bit annoying. For now just compare the QTime representations. 0474 if (result.format() == Value::fmt_Time && expected.format() == Value::fmt_Time) 0475 QCOMPARE(result.asTime(), expected.asTime()); 0476 else 0477 QCOMPARE(result, expected); 0478 } 0479 0480 QTEST_MAIN(TestValueParser)