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)