/* This file is part of the KDE libraries Copyright (c) 2005 Thomas Braxton Copyright (c) 2007 David Jarvie This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "klocaletest.h" #include "qtest_kde.h" #include "kdebug.h" #include "klocale.h" #include "klocale_p.h" #include "kglobal.h" #include "kconfiggroup.h" #include "kcalendarsystem.h" #include "kdayperiod_p.h" #include "kdatetime.h" #include "ksystemtimezone.h" #include #include #include "moc_klocaletest.cpp" void KLocaleTest::initTestCase() { KGlobal::locale()->setThousandsSeparator(QLatin1String(",")); } void KLocaleTest::languages() { QVERIFY(KGlobal::locale()->installedLanguages().contains("en_GB")); } void KLocaleTest::formatNumbers() { KLocale locale(*KGlobal::locale()); KGlobal::locale()->setDecimalPlaces(2); QCOMPARE(locale.formatNumber(70), QString("70.00")); QCOMPARE(locale.formatNumber(70, 0), QString("70")); QCOMPARE(locale.formatNumber(70.2), QString("70.20")); QCOMPARE(locale.formatNumber(70.24), QString("70.24")); QCOMPARE(locale.formatNumber(70.245), QString("70.25")); QCOMPARE(locale.formatNumber(1234567.89123456789,8), QString("1,234,567.89123457")); QCOMPARE(locale.formatNumber(1234567.89123456789, 0), QString("1,234,568")); // Test Grouping locale.d->setNumericDigitGrouping(QList()); QCOMPARE(locale.formatNumber(123456789, 0), QString("123456789")); QCOMPARE(locale.formatNumber(123456789.01), QString("123456789.01")); locale.d->setNumericDigitGrouping(QList() << 3 << 2); QCOMPARE(locale.formatNumber(123456789, 0), QString("12,34,56,789")); QCOMPARE(locale.formatNumber(123456789.01), QString("12,34,56,789.01")); locale.d->setNumericDigitGrouping(QList() << 3 << -1); QCOMPARE(locale.formatNumber(123456789, 0), QString("123456,789")); QCOMPARE(locale.formatNumber(123456789.01), QString("123456,789.01")); //Test it formats correctly with an empty and space separator. locale.d->setNumericDigitGrouping(QList() << 3); QCOMPARE(locale.formatNumber(123456789, 0), QString("123,456,789")); QCOMPARE(locale.formatNumber(123456789.01), QString("123,456,789.01")); locale.setThousandsSeparator(QString()); QCOMPARE(locale.formatNumber(123456789, 0), QString("123456789")); QCOMPARE(locale.formatNumber(123456789.01), QString("123456789.01")); locale.setThousandsSeparator(" "); QCOMPARE(locale.formatNumber(123456789, 0), QString("123 456 789")); QCOMPARE(locale.formatNumber(123456789.01), QString("123 456 789.01")); } void KLocaleTest::formatNumberStrings() { KLocale locale(*KGlobal::locale()); KGlobal::locale()->setDecimalPlaces(2); QCOMPARE(locale.formatNumber("70"), QString("70.00")); QCOMPARE(locale.formatNumber("70", true, 2), QString("70.00")); QCOMPARE(locale.formatNumber("70", true, 0), QString("70")); QCOMPARE(locale.formatNumber("0.2", true, 1), QString("0.2")); QCOMPARE(locale.formatNumber("70.9123", true, 0), QString("71")); QCOMPARE(locale.formatNumber("-70.2", true, 2), QString("-70.20")); QCOMPARE(locale.formatNumber("+70.24", true, 2), QString("70.24")); QCOMPARE(locale.formatNumber("70.245", true, 2), QString("70.25")); QCOMPARE(locale.formatNumber("99.996", true, 2), QString("100.00")); QCOMPARE(locale.formatNumber("12345678901234567.89123456789",false,0), QString("12,345,678,901,234,567.89123456789")); QCOMPARE(locale.formatNumber("99.9e96", true, 2), QString("99.90e96")); QCOMPARE(locale.formatNumber("99e", true, 1), QString("99.0")); QCOMPARE(locale.formatNumber("e2", true, 0), QString("0e2")); QCOMPARE(locale.formatNumber("1.", true, 1), QString("1.0")); QCOMPARE(locale.formatNumber("1.", true, 0), QString("1")); QCOMPARE(locale.formatNumber("1.", false, 1), QString("1.")); // no rounding -> 1. unchanged QCOMPARE(locale.formatNumber("1.", false, 0), QString("1.")); QCOMPARE(locale.formatNumber("abcd", true, 2), QString("0.00")); // invalid number // Test Grouping locale.d->setNumericDigitGrouping(QList()); QCOMPARE(locale.formatNumber("123456789", true, 0), QString("123456789")); QCOMPARE(locale.formatNumber("123456789.01"), QString("123456789.01")); locale.d->setNumericDigitGrouping(QList() << 3 << 2); QCOMPARE(locale.formatNumber("123456789", true, 0), QString("12,34,56,789")); QCOMPARE(locale.formatNumber("123456789.01"), QString("12,34,56,789.01")); locale.d->setNumericDigitGrouping(QList() << 3 << -1); QCOMPARE(locale.formatNumber("123456789", true, 0), QString("123456,789")); QCOMPARE(locale.formatNumber("123456789.01"), QString("123456,789.01")); //Test it formats correctly with an empty and space separator. locale.d->setNumericDigitGrouping(QList() << 3); QCOMPARE(locale.formatNumber("123456789", true, 0), QString("123,456,789")); QCOMPARE(locale.formatNumber("123456789.01"), QString("123,456,789.01")); locale.setThousandsSeparator(QString()); QCOMPARE(locale.formatNumber("123456789", true, 0), QString("123456789")); QCOMPARE(locale.formatNumber("123456789.01"), QString("123456789.01")); locale.setThousandsSeparator(" "); QCOMPARE(locale.formatNumber("123456789", true, 0), QString("123 456 789")); QCOMPARE(locale.formatNumber("123456789.01"), QString("123 456 789.01")); } void KLocaleTest::readNumber() { KLocale locale(*KGlobal::locale()); bool ok=false; locale.readNumber("12,1", &ok); QVERIFY(!ok); QCOMPARE(locale.readNumber("12,100", &ok), 12100.0); QVERIFY(ok); locale.readNumber("12,100000,00", &ok); QVERIFY(!ok); locale.readNumber("12,100000000", &ok); QVERIFY(!ok); locale.readNumber("12,,100,000", &ok); QVERIFY(!ok); locale.readNumber("12,1000,000", &ok); QVERIFY(!ok); locale.readNumber("12,0000000,000", &ok); QVERIFY(!ok); locale.readNumber("12,0000000", &ok); QVERIFY(!ok); QCOMPARE(locale.readNumber("12,146,131.12", &ok), 12146131.12); QVERIFY(ok); QCOMPARE(locale.readNumber("1.12345678912", &ok), 1.12345678912); QVERIFY(ok); // Test Grouping locale.d->setNumericDigitGrouping(QList()); QCOMPARE(locale.readNumber(QString("123456789"), &ok), 123456789.0); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("123456789.01"), &ok), 123456789.01); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("123,456,789"), &ok), 0.0); QVERIFY(!ok); QCOMPARE(locale.readNumber(QString("123,456,789.01"), &ok), 0.0); QVERIFY(!ok); locale.d->setNumericDigitGrouping(QList() << 3 << 2); QCOMPARE(locale.readNumber(QString("12,34,56,789"), &ok), 123456789.0); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("12,34,56,789.01"), &ok), 123456789.01); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("123,456,789"), &ok), 0.0); QVERIFY(!ok); QCOMPARE(locale.readNumber(QString("123,456,789.01"), &ok), 0.0); QVERIFY(!ok); QCOMPARE(locale.readNumber(QString("123456789"), &ok), 123456789.0); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("123456789.01"), &ok), 123456789.01); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("123456,789"), &ok), 0.0); QVERIFY(!ok); QCOMPARE(locale.readNumber(QString("123456,789.01"), &ok), 0.0); QVERIFY(!ok); //Test it parses correctly with an empty separator. locale.d->setNumericDigitGrouping(QList() << 3); locale.setThousandsSeparator(QString()); QCOMPARE(locale.readNumber(QString("123456789"), &ok), 123456789.0); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("123456789.01"), &ok), 123456789.01); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("123,456,789"), &ok), 0.0); QVERIFY(!ok); QCOMPARE(locale.readNumber(QString("123,456,789.01"), &ok), 0.0); QVERIFY(!ok); //Test it parses correctly with an space separator. locale.d->setNumericDigitGrouping(QList() << 3); locale.setThousandsSeparator(" "); QCOMPARE(locale.readNumber(QString("123 456 789"), &ok), 123456789.0); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("123 456 789.01"), &ok), 123456789.01); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("123456789"), &ok), 123456789.0); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("123456789.01"), &ok), 123456789.01); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("123456 789"), &ok), 0.0); QVERIFY(!ok); QCOMPARE(locale.readNumber(QString("123456 789.01"), &ok), 0.0); QVERIFY(!ok); QCOMPARE(locale.readNumber(QString("123,456,789"), &ok), 0.0); QVERIFY(!ok); QCOMPARE(locale.readNumber(QString("123,456,789.01"), &ok), 0.0); QVERIFY(!ok); // Test signs locale.setPositiveSign("@"); locale.setNegativeSign("&"); locale.setThousandsSeparator(","); locale.d->setNumericDigitGrouping(QList() << 3); QCOMPARE(locale.readNumber(QString("@123,456,789.12"), &ok), 123456789.12); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("&123,456,789.12"), &ok), -123456789.12); QVERIFY(ok); QCOMPARE(locale.readNumber(QString( "123,456,789.12"), &ok), 123456789.12); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("+123,456,789.12"), &ok), 0.0); QVERIFY(!ok); QCOMPARE(locale.readNumber(QString("-123,456,789.12"), &ok), 0.0); QVERIFY(!ok); locale.setNegativeSign(QString()); QCOMPARE(locale.readNumber(QString( "123,456,789.12"), &ok), -123456789.12); QVERIFY(ok); QCOMPARE(locale.readNumber(QString("-123,456,789.12"), &ok), 0.0); QVERIFY(!ok); } void KLocaleTest::formatDate() { KLocale locale(*KGlobal::locale()); QString small("yyyy-MM-dd"); QString full("dddd dd MMMM yyyy"); QDate date; // Ensure that user configuration isn't messing with us; // shouldn't happen though, since qtest_kde.h sets KDEHOME. QCOMPARE(locale.dateFormat(), QString("%A %d %B %Y")); date.setYMD(2002, 5, 3); QCOMPARE(locale.formatDate(date), date.toString(full)); QCOMPARE(locale.formatDate(date, KLocale::ShortDate), date.toString(small)); date = QDate::currentDate(); QCOMPARE(locale.formatDate(date), date.toString(full)); QCOMPARE(locale.formatDate(date, KLocale::ShortDate), date.toString(small)); QCOMPARE(locale.formatDate(date, KLocale::FancyLongDate), QString("Today")); QCOMPARE(locale.formatDate(date.addDays(-1), KLocale::FancyLongDate), QString("Yesterday")); QDate dat = date.addDays(-2); QCOMPARE(locale.formatDate(dat, KLocale::FancyLongDate), locale.calendar()->weekDayName(dat)); dat = date.addDays(-3); QCOMPARE(locale.formatDate(dat, KLocale::FancyLongDate), locale.calendar()->weekDayName(dat)); dat = date.addDays(-4); QCOMPARE(locale.formatDate(dat, KLocale::FancyLongDate), locale.calendar()->weekDayName(dat)); dat = date.addDays(-5); QCOMPARE(locale.formatDate(dat, KLocale::FancyLongDate), locale.calendar()->weekDayName(dat)); dat = date.addDays(-6); QCOMPARE(locale.formatDate(dat, KLocale::FancyLongDate), locale.calendar()->weekDayName(dat)); dat = date.addDays(-7); QCOMPARE(locale.formatDate(dat, KLocale::FancyLongDate), dat.toString(full)); dat = date.addDays(1); QCOMPARE(locale.formatDate(dat, KLocale::FancyLongDate), dat.toString(full)); } void KLocaleTest::readDate() { KLocale locale(*KGlobal::locale()); QString small("yyyy-MM-dd"); QString full("dddd dd MMMM yyyy"); bool ok=false; QDate date; date.setYMD( 2002, 5, 3 ); QCOMPARE(locale.readDate(date.toString(small)), date); QCOMPARE(locale.readDate(date.toString(full)), date); locale.readDate(date.toString(small), KLocale::NormalFormat, &ok); QVERIFY(!ok); locale.readDate(date.toString(full), KLocale::ShortFormat, &ok); QVERIFY(!ok); QString twoDigitYear("dd-MM-yy"); QCOMPARE(date.toString(twoDigitYear), QString("03-05-02")); QCOMPARE(locale.readDate("03-05-02", "%d-%m-%y"), date); date = QDate::currentDate(); QCOMPARE(locale.readDate(date.toString(small)), date); QCOMPARE(locale.readDate(date.toString(full)), date); locale.readDate(date.toString(small), KLocale::NormalFormat, &ok); QVERIFY(!ok); locale.readDate(date.toString(full), KLocale::ShortFormat, &ok); QVERIFY(!ok); locale.readDate("2005-02-31", &ok); QVERIFY(!ok); } void KLocaleTest::formatTime() { KLocale locale(*KGlobal::locale()); QTime time(0,22,33); locale.setTimeFormat("%H:%M %p"); QCOMPARE(locale.formatLocaleTime(time, KLocale::TimeWithoutSeconds), QString("00:22 AM")); QCOMPARE(locale.formatLocaleTime(time, KLocale::TimeWithoutSeconds | KLocale::TimeDuration), QString("00:22")); locale.setTimeFormat("%H:%M:%S %p"); QCOMPARE(locale.formatLocaleTime(time, KLocale::TimeDefault), QString("00:22:33 AM")); QCOMPARE(locale.formatLocaleTime(time, KLocale::TimeDuration), QString("00:22:33")); locale.setTimeFormat("%l : %M : %S %p"); // #164813 QCOMPARE(locale.formatLocaleTime(time, KLocale::TimeDefault), QString("12 : 22 : 33 AM")); QCOMPARE(locale.formatLocaleTime(time, KLocale::TimeWithoutSeconds), QString("12 : 22 AM")); } void KLocaleTest::formatDateTime() { KLocale locale(*KGlobal::locale()); QString small("yyyy-MM-dd hh:mm"); QString smallsecs("yyyy-MM-dd hh:mm:ss"); QString full("dddd dd MMMM yyyy hh:mm"); QString fullsecs("dddd dd MMMM yyyy hh:mm:ss"); QString tfmt(" hh:mm"); QDateTime qdt; // Ensure that user configuration isn't messing with us; // shouldn't happen though, since qtest_kde.h sets KDEHOME. QCOMPARE(locale.dateFormat(), QString("%A %d %B %Y")); qdt = QDateTime(QDate(2002, 5, 3), QTime(10, 20, 30)); QCOMPARE(locale.formatDateTime(qdt), qdt.toString(small)); QCOMPARE(locale.formatDateTime(qdt, KLocale::LongDate), qdt.toString(full)); qdt = QDateTime::currentDateTime(); QDate today = qdt.date(); QTime nowt = qdt.time(); QCOMPARE(locale.formatDateTime(qdt), qdt.toString(small)); QCOMPARE(locale.formatDateTime(qdt, KLocale::LongDate), qdt.toString(full)); QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), QString("Today" + qdt.time().toString(tfmt))); qdt = qdt.addSecs(3605); // more than 1 hour from now QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), qdt.toString(full)); qdt.setDate(today); qdt.setTime(QTime(0,0,0)); QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), QString("Today" + qdt.time().toString(tfmt))); qdt = qdt.addSecs(-1); QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), QString("Yesterday" + qdt.time().toString(tfmt))); qdt = qdt.addDays(2); // tomorrow qdt.setTime(nowt); QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), qdt.toString(full)); qdt = qdt.addDays(-2); // yesterday QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), QString("Yesterday" + qdt.time().toString(tfmt))); qdt = qdt.addDays(-1); QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), QString(locale.calendar()->weekDayName(qdt.date()) + qdt.time().toString(tfmt))); qdt = qdt.addDays(-1); QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), QString(locale.calendar()->weekDayName(qdt.date()) + qdt.time().toString(tfmt))); qdt = qdt.addDays(-1); QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), QString(locale.calendar()->weekDayName(qdt.date()) + qdt.time().toString(tfmt))); qdt = qdt.addDays(-1); QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), QString(locale.calendar()->weekDayName(qdt.date()) + qdt.time().toString(tfmt))); qdt = qdt.addDays(-1); QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), QString(locale.calendar()->weekDayName(qdt.date()) + qdt.time().toString(tfmt))); qdt = qdt.addDays(-1); QCOMPARE(locale.formatDateTime(qdt, KLocale::FancyLongDate), qdt.toString(full)); small = "%Y-%m-%d %H:%M"; smallsecs = "%Y-%m-%d %H:%M:%S"; full = "%A %d %B %Y %H:%M"; fullsecs = "%A %d %B %Y %H:%M:%S"; KDateTime kdt; const KTimeZone tz = KSystemTimeZones::zone("Pacific/Fiji"); if (!tz.isValid()) QSKIP( "Pacific/Fiji timezone not available", SkipAll ); kdt = KDateTime::currentDateTime(tz); today = kdt.date(); nowt = kdt.time(); QCOMPARE(locale.formatDateTime(kdt), kdt.toString(small)); // QCOMPARE(locale.formatDateTime(kdt, KLocale::ShortDate, KLocale::Seconds), kdt.toString(smallsecs)); QCOMPARE(locale.formatDateTime(kdt, KLocale::LongDate), kdt.toString(full)); // QCOMPARE(locale.formatDateTime(kdt, KLocale::LongDate, KLocale::Seconds), kdt.toString(fullsecs)); // QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), QString("Today") + kdt.time().toString(tfmt)); kdt = kdt.addSecs(3605); // more than 1 hour from now QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), kdt.toString(full)); kdt.setDate(today); kdt.setTime(QTime(0,0,0)); QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), QString("Today" + kdt.time().toString(tfmt))); kdt = kdt.addSecs(-1); QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), QString("Yesterday" + kdt.time().toString(tfmt))); kdt = kdt.addDays(2); // tomorrow kdt.setTime(nowt); QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), kdt.toString(full)); kdt = kdt.addDays(-2); // yesterday QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), QString("Yesterday" + kdt.time().toString(tfmt))); kdt = kdt.addDays(-1); QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), QString(locale.calendar()->weekDayName(kdt.date()) + kdt.time().toString(tfmt))); kdt = kdt.addDays(-1); QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), QString(locale.calendar()->weekDayName(kdt.date()) + kdt.time().toString(tfmt))); kdt = kdt.addDays(-1); QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), QString(locale.calendar()->weekDayName(kdt.date()) + kdt.time().toString(tfmt))); kdt = kdt.addDays(-1); QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), QString(locale.calendar()->weekDayName(kdt.date()) + kdt.time().toString(tfmt))); kdt = kdt.addDays(-1); QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), QString(locale.calendar()->weekDayName(kdt.date()) + kdt.time().toString(tfmt))); kdt = kdt.addDays(-1); QCOMPARE(locale.formatDateTime(kdt, KLocale::FancyLongDate), kdt.toString(full)); } void KLocaleTest::readTime() { KLocale locale(*KGlobal::locale()); bool ok = false; QCOMPARE(locale.readTime("11:22:33", &ok), QTime(11,22,33)); QVERIFY(ok); QCOMPARE(locale.readTime("11:22", &ok), QTime(11,22,0)); QVERIFY(ok); locale.readLocaleTime("11:22:33", &ok, KLocale::TimeWithoutSeconds); QVERIFY(!ok); QCOMPARE(locale.readLocaleTime("11:22", &ok, KLocale::TimeWithoutSeconds), QTime(11, 22, 0)); QVERIFY(ok); // strict processing of a time string with a missing space locale.setTimeFormat("%I:%M:%S %p"); QString timeString = QString("11:13:55%1").arg(locale.d->dayPeriodForTime(QTime(11,13,55)).periodName()); locale.readLocaleTime(timeString, &ok, KLocale::TimeDefault, KLocale::ProcessStrict); QVERIFY(!ok); // lax processing of the same time QCOMPARE(locale.readLocaleTime(timeString, &ok, KLocale::TimeDefault), QTime(11, 13, 55)); QVERIFY(ok); } void KLocaleTest::testDayPeriods() { KLocale locale(*KGlobal::locale()); locale.setTimeFormat("%I:%M:%S %p"); //Test default standard AM/PM Day Periods KDayPeriod testPeriod; QCOMPARE( testPeriod.isValid(), false ); testPeriod = locale.d->dayPeriodForTime( QTime( 03, 00, 00 ) ); QCOMPARE( testPeriod.isValid(), true ); QCOMPARE( testPeriod.periodName(KLocale::LongName), QString( "Ante Meridiem" ) ); QCOMPARE( testPeriod.periodName(KLocale::ShortName), QString( "AM" ) ); QCOMPARE( testPeriod.periodName(KLocale::NarrowName), QString( "A" ) ); QCOMPARE( testPeriod.periodStart(), QTime( 0, 0, 0 ) ); QCOMPARE( testPeriod.periodEnd(), QTime( 11, 59, 59, 999 ) ); QCOMPARE( testPeriod.hourInPeriod( QTime( 0, 0, 0 ) ), 12 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 1, 0, 0 ) ), 1 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 6, 0, 0 ) ), 6 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 11, 59, 59, 999) ), 11 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 12, 0, 0 ) ), -1 ); QCOMPARE( testPeriod.time( 12, 0, 0 ), QTime( 0, 0, 0 ) ); QCOMPARE( testPeriod.time( 1, 0, 0 ), QTime( 1, 0, 0 ) ); QCOMPARE( testPeriod.time( 6, 0, 0 ), QTime( 6, 0, 0 ) ); QCOMPARE( testPeriod.time( 11, 59, 59, 999 ), QTime( 11, 59, 59, 999 ) ); QCOMPARE( testPeriod.time( 13, 0, 0 ), QTime() ); testPeriod = locale.d->dayPeriodForTime( QTime( 13, 00, 00 ) ); QCOMPARE( testPeriod.isValid(), true ); QCOMPARE( testPeriod.periodName(KLocale::LongName), QString( "Post Meridiem" ) ); QCOMPARE( testPeriod.periodName(KLocale::ShortName), QString( "PM" ) ); QCOMPARE( testPeriod.periodName(KLocale::NarrowName), QString( "P" ) ); QCOMPARE( testPeriod.periodStart(), QTime( 12, 0, 0 ) ); QCOMPARE( testPeriod.periodEnd(), QTime( 23, 59, 59, 999 ) ); QCOMPARE( testPeriod.hourInPeriod( QTime( 11, 59, 59, 999) ), -1 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 12, 0, 0 ) ), 12 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 13, 0, 0 ) ), 1 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 18, 0, 0 ) ), 6 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 23, 59, 59, 999) ), 11 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 24, 0, 0 ) ), -1 ); QCOMPARE( testPeriod.time( 12, 0, 0 ), QTime( 12, 0, 0 ) ); QCOMPARE( testPeriod.time( 1, 0, 0 ), QTime( 13, 0, 0 ) ); QCOMPARE( testPeriod.time( 6, 0, 0 ), QTime( 18, 0, 0 ) ); QCOMPARE( testPeriod.time( 11, 59, 59, 999 ), QTime( 23, 59, 59, 999 ) ); QCOMPARE( testPeriod.time( 13, 0, 0 ), QTime() ); QCOMPARE( locale.dayPeriodText( QTime( 11, 12, 13 ) ), QString( "AM" ) ); QCOMPARE( locale.dayPeriodText( QTime( 23, 12, 13 ) ), QString( "PM" ) ); QCOMPARE( locale.formatLocaleTime( QTime( 11, 12, 13 ) ), QString( "11:12:13 AM" ) ); QCOMPARE( locale.formatLocaleTime( QTime( 23, 12, 13 ) ), QString( "11:12:13 PM" ) ); QCOMPARE( locale.readLocaleTime( QString( "11:12:13 AM" ) ), QTime( 11, 12, 13 ) ); QCOMPARE( locale.readLocaleTime( QString( "11:12:13 PM" ) ), QTime( 23, 12, 13 ) ); QCOMPARE( locale.readLocaleTime( QString( "11:12:13 am" ) ), QTime( 11, 12, 13 ) ); QCOMPARE( locale.readLocaleTime( QString( "11:12:13 pm" ) ), QTime( 23, 12, 13 ) ); // Test setting own periods // Test alternative periods, e.g. thirds of day with absolute hours in each period numbered 1..8 QList dayPeriods; dayPeriods.append( KDayPeriod( "p1", "Early Day", "Early", "E", QTime( 0, 0, 0 ), QTime( 7, 59, 59, 999 ), 1, 0 ) ); dayPeriods.append( KDayPeriod( "p2", "Middle Day", "Middle", "M", QTime( 8, 0, 0 ), QTime( 15, 59, 59, 999 ), 1, 0 ) ); dayPeriods.append( KDayPeriod( "p3", "Late Day", "Late", "L", QTime( 16, 0, 0 ), QTime( 23, 59, 59, 999 ), 1, 0 ) ); locale.d->setDayPeriods( dayPeriods ); testPeriod = locale.d->dayPeriodForTime( QTime( 0, 0, 0 ) ); QCOMPARE( testPeriod.periodName(KLocale::ShortName), QString( "Early" ) ); QCOMPARE( testPeriod.hourInPeriod( QTime( 0, 0, 0 ) ), 1 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 4, 0, 0 ) ), 5 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 7, 0, 0 ) ), 8 ); QCOMPARE( testPeriod.time( 0, 0, 0 ), QTime() ); QCOMPARE( testPeriod.time( 1, 0, 0 ), QTime( 0, 0, 0 ) ); QCOMPARE( testPeriod.time( 5, 0, 0 ), QTime( 4, 0, 0 ) ); QCOMPARE( testPeriod.time( 8, 0, 0 ), QTime( 7, 0, 0 ) ); QCOMPARE( testPeriod.time( 9, 0, 0 ), QTime() ); testPeriod = locale.d->dayPeriodForTime( QTime( 8, 0, 0 ) ); QCOMPARE( testPeriod.periodName(KLocale::ShortName), QString( "Middle" ) ); QCOMPARE( testPeriod.hourInPeriod( QTime( 8, 0, 0 ) ), 1 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 12, 0, 0 ) ), 5 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 15, 0, 0 ) ), 8 ); QCOMPARE( testPeriod.time( 0, 0, 0 ), QTime() ); QCOMPARE( testPeriod.time( 1, 0, 0 ), QTime( 8, 0, 0 ) ); QCOMPARE( testPeriod.time( 5, 0, 0 ), QTime( 12, 0, 0 ) ); QCOMPARE( testPeriod.time( 8, 0, 0 ), QTime( 15, 0, 0 ) ); QCOMPARE( testPeriod.time( 9, 0, 0 ), QTime() ); testPeriod = locale.d->dayPeriodForTime( QTime( 16, 0, 0 ) ); QCOMPARE( testPeriod.periodName(KLocale::ShortName), QString( "Late" ) ); QCOMPARE( testPeriod.hourInPeriod( QTime( 16, 0, 0 ) ), 1 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 20, 0, 0 ) ), 5 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 23, 0, 0 ) ), 8 ); QCOMPARE( testPeriod.time( 0, 0, 0 ), QTime() ); QCOMPARE( testPeriod.time( 1, 0, 0 ), QTime( 16, 0, 0 ) ); QCOMPARE( testPeriod.time( 5, 0, 0 ), QTime( 20, 0, 0 ) ); QCOMPARE( testPeriod.time( 8, 0, 0 ), QTime( 23, 0, 0 ) ); QCOMPARE( testPeriod.time( 9, 0, 0 ), QTime() ); QCOMPARE( locale.formatLocaleTime( QTime( 4, 0, 0 ) ), QString( "05:00:00 Early" ) ); QCOMPARE( locale.formatLocaleTime( QTime( 12, 0, 0 ) ), QString( "05:00:00 Middle" ) ); QCOMPARE( locale.formatLocaleTime( QTime( 20, 0, 0 ) ), QString( "05:00:00 Late" ) ); QCOMPARE( locale.readLocaleTime( QString( "05:00:00 Early" ) ), QTime( 4, 0, 0 ) ); QCOMPARE( locale.readLocaleTime( QString( "05:00:00 Middle" ) ), QTime( 12, 0, 0 ) ); QCOMPARE( locale.readLocaleTime( QString( "05:00:00 Late" ) ), QTime( 20, 0, 0 ) ); // Test more conventional alternative periods, e.g. informal periods of day with 12 hour clock dayPeriods.clear(); dayPeriods.append( KDayPeriod( "morning", "Morning", "in the morning", "M", QTime( 6, 0, 0 ), QTime( 11, 59, 59, 999 ), 6, 12 ) ); dayPeriods.append( KDayPeriod( "noon", "Noon", "noon", "O", QTime( 12, 0, 0 ), QTime( 12, 0, 59, 999 ), 12, 0 ) ); dayPeriods.append( KDayPeriod( "afternoon", "Afternoon", "in the afternoon", "A", QTime( 12, 1, 0 ), QTime( 17, 59, 59, 999 ), 0, 12 ) ); dayPeriods.append( KDayPeriod( "evening", "Evening", "in the evening", "E", QTime( 18, 0, 0 ), QTime( 21, 59, 59, 999 ), 6, 12 ) ); dayPeriods.append( KDayPeriod( "night", "Night", "at night", "N", QTime( 22, 0, 0 ), QTime( 5, 59, 59, 999 ), 10, 12 ) ); locale.d->setDayPeriods( dayPeriods ); testPeriod = locale.d->dayPeriodForTime( QTime( 8, 0, 0 ) ); QCOMPARE( testPeriod.periodName( KLocale::ShortName ), QString( "in the morning" ) ); QCOMPARE( testPeriod.hourInPeriod( QTime( 8, 0, 0 ) ), 8 ); QCOMPARE( testPeriod.time( 8, 0, 0 ), QTime( 8, 0, 0 ) ); testPeriod = locale.d->dayPeriodForTime( QTime( 12, 0, 0 ) ); QCOMPARE( testPeriod.periodName( KLocale::ShortName ), QString( "noon" ) ); QCOMPARE( testPeriod.hourInPeriod( QTime( 12, 0, 0 ) ), 12 ); QCOMPARE( testPeriod.time( 12, 0, 0 ), QTime( 12, 0, 0 ) ); testPeriod = locale.d->dayPeriodForTime( QTime( 12, 1, 0 ) ); QCOMPARE( testPeriod.periodName( KLocale::ShortName ), QString( "in the afternoon" ) ); QCOMPARE( testPeriod.hourInPeriod( QTime( 12, 1, 0 ) ), 12 ); QCOMPARE( testPeriod.time( 12, 1, 0 ), QTime( 12, 1, 0 ) ); testPeriod = locale.d->dayPeriodForTime( QTime( 23, 0, 0 ) ); QCOMPARE( testPeriod.periodName( KLocale::ShortName ), QString( "at night" ) ); QCOMPARE( testPeriod.hourInPeriod( QTime( 23, 0, 0 ) ), 11 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 0, 0, 0 ) ), 12 ); QCOMPARE( testPeriod.hourInPeriod( QTime( 1, 0, 0 ) ), 1 ); QCOMPARE( testPeriod.time( 11, 0, 0 ), QTime( 23, 0, 0 ) ); QCOMPARE( testPeriod.time( 12, 0, 0 ), QTime( 0, 0, 0 ) ); QCOMPARE( testPeriod.time( 1, 0, 0 ), QTime( 1, 0, 0 ) ); testPeriod = locale.d->dayPeriodForTime( QTime( 0, 0, 0 ) ); QCOMPARE( testPeriod.periodName( KLocale::ShortName ), QString( "at night" ) ); QCOMPARE( locale.readLocaleTime( QString( "8:00:00 in the morning" ) ), QTime( 8, 0, 0 ) ); QCOMPARE( locale.readLocaleTime( QString( "12:00:00 noon" ) ), QTime( 12, 0, 0 ) ); QCOMPARE( locale.readLocaleTime( QString( "5:00:00 in the afternoon" ) ), QTime( 17, 0, 0 ) ); QCOMPARE( locale.readLocaleTime( QString( "11:00:00 at night" ) ), QTime( 23, 0, 0 ) ); QCOMPARE( locale.readLocaleTime( QString( "1:00:00 at night" ) ), QTime( 1, 0, 0 ) ); locale.setTimeFormat("%l %p"); QCOMPARE( locale.formatLocaleTime( QTime( 8, 0, 0 ) ), QString( "8 in the morning" ) ); QCOMPARE( locale.formatLocaleTime( QTime( 12, 0, 0 ) ), QString( "12 noon" ) ); QCOMPARE( locale.formatLocaleTime( QTime( 17, 0, 0 ) ), QString( "5 in the afternoon" ) ); QCOMPARE( locale.formatLocaleTime( QTime( 23, 0, 0 ) ), QString( "11 at night" ) ); QCOMPARE( locale.formatLocaleTime( QTime( 1, 0, 0 ) ), QString( "1 at night" ) ); // Test load config KConfig *testConfig = new KConfig( QString(), KConfig::SimpleConfig ); KConfigGroup testGroup( testConfig, "Locale" ); testGroup.writeEntry( "DayPeriod1", QStringList() << "third1" << "First Third" << "T1" << "T" << QTime( 0, 0, 0 ).toString("HH:mm:ss.zzz") << QTime( 7, 59, 59, 999 ).toString("HH:mm:ss.zzz") << QString::number(0) << QString::number(12) ); testGroup.writeEntry( "DayPeriod2", QStringList() << "third2" << "Second Third" << "T2" << "S" << QTime( 8, 0, 0 ).toString("HH:mm:ss.zzz") << QTime( 15, 59, 59, 999 ).toString("HH:mm:ss.zzz") << QString::number(8) << QString::number(12) ); testGroup.writeEntry( "DayPeriod3", QStringList() << "third3" << "First Third" << "T3" << "R" << QTime( 16, 0, 0 ).toString("HH:mm:ss.zzz") << QTime( 23, 59, 59, 999 ).toString("HH:mm:ss.zzz") << QString::number(4) << QString::number(12) ); locale = KLocale("klocaletest", "en_us", "us", testConfig); QCOMPARE( locale.d->dayPeriodForTime( QTime( 1, 0, 0 ) ).periodName( KLocale::ShortName ), QString( "T1" ) ); QCOMPARE( locale.d->dayPeriodForTime( QTime( 11, 0, 0 ) ).periodName( KLocale::ShortName ), QString( "T2" ) ); QCOMPARE( locale.d->dayPeriodForTime( QTime( 21, 0, 0 ) ).periodName( KLocale::ShortName ), QString( "T3" ) ); delete testConfig; } void KLocaleTest::testCalendarSystemType() { KLocale locale(*KGlobal::locale()); locale.setCalendar("coptic"); QCOMPARE( locale.calendarSystem(), KLocale::CopticCalendar); QCOMPARE( locale.calendarType(), QString("coptic") ); locale.setCalendar("ethiopian"); QCOMPARE( locale.calendarSystem(), KLocale::EthiopianCalendar); QCOMPARE( locale.calendarType(), QString("ethiopian") ); locale.setCalendar("gregorian-proleptic"); QCOMPARE( locale.calendarSystem(), KLocale::GregorianCalendar); QCOMPARE( locale.calendarType(), QString("gregorian-proleptic") ); locale.setCalendar("hebrew"); QCOMPARE( locale.calendarSystem(), KLocale::HebrewCalendar); QCOMPARE( locale.calendarType(), QString("hebrew") ); locale.setCalendar("hijri"); QCOMPARE( locale.calendarSystem(), KLocale::IslamicCivilCalendar); QCOMPARE( locale.calendarType(), QString("hijri") ); locale.setCalendar("indian-national"); QCOMPARE( locale.calendarSystem(), KLocale::IndianNationalCalendar); QCOMPARE( locale.calendarType(), QString("indian-national") ); locale.setCalendar("jalali"); QCOMPARE( locale.calendarSystem(), KLocale::JalaliCalendar); QCOMPARE( locale.calendarType(), QString("jalali") ); locale.setCalendar("japanese"); QCOMPARE( locale.calendarSystem(), KLocale::JapaneseCalendar); QCOMPARE( locale.calendarType(), QString("japanese") ); locale.setCalendar("julian"); QCOMPARE( locale.calendarSystem(), KLocale::JulianCalendar); QCOMPARE( locale.calendarType(), QString("julian") ); locale.setCalendar("minguo"); QCOMPARE( locale.calendarSystem(), KLocale::MinguoCalendar); QCOMPARE( locale.calendarType(), QString("minguo") ); locale.setCalendar("thai"); QCOMPARE( locale.calendarSystem(), KLocale::ThaiCalendar); QCOMPARE( locale.calendarType(), QString("thai") ); locale.setCalendar("gregorian"); QCOMPARE( locale.calendarSystem(), KLocale::QDateCalendar); QCOMPARE( locale.calendarType(), QString("gregorian") ); locale.setCalendarSystem(KLocale::CopticCalendar); QCOMPARE( locale.calendarSystem(), KLocale::CopticCalendar); QCOMPARE( locale.calendarType(), QString("coptic") ); locale.setCalendarSystem(KLocale::EthiopianCalendar); QCOMPARE( locale.calendarSystem(), KLocale::EthiopianCalendar); QCOMPARE( locale.calendarType(), QString("ethiopian") ); locale.setCalendarSystem(KLocale::GregorianCalendar); QCOMPARE( locale.calendarSystem(), KLocale::GregorianCalendar); QCOMPARE( locale.calendarType(), QString("gregorian-proleptic") ); locale.setCalendarSystem(KLocale::HebrewCalendar); QCOMPARE( locale.calendarSystem(), KLocale::HebrewCalendar); QCOMPARE( locale.calendarType(), QString("hebrew") ); locale.setCalendarSystem(KLocale::IslamicCivilCalendar); QCOMPARE( locale.calendarSystem(), KLocale::IslamicCivilCalendar); QCOMPARE( locale.calendarType(), QString("hijri") ); locale.setCalendarSystem(KLocale::IndianNationalCalendar); QCOMPARE( locale.calendarSystem(), KLocale::IndianNationalCalendar); QCOMPARE( locale.calendarType(), QString("indian-national") ); locale.setCalendarSystem(KLocale::JalaliCalendar); QCOMPARE( locale.calendarSystem(), KLocale::JalaliCalendar); QCOMPARE( locale.calendarType(), QString("jalali") ); locale.setCalendarSystem(KLocale::JapaneseCalendar); QCOMPARE( locale.calendarSystem(), KLocale::JapaneseCalendar); QCOMPARE( locale.calendarType(), QString("japanese") ); locale.setCalendarSystem(KLocale::JulianCalendar); QCOMPARE( locale.calendarSystem(), KLocale::JulianCalendar); QCOMPARE( locale.calendarType(), QString("julian") ); locale.setCalendarSystem(KLocale::MinguoCalendar); QCOMPARE( locale.calendarSystem(), KLocale::MinguoCalendar); QCOMPARE( locale.calendarType(), QString("minguo") ); locale.setCalendarSystem(KLocale::ThaiCalendar); QCOMPARE( locale.calendarSystem(), KLocale::ThaiCalendar); QCOMPARE( locale.calendarType(), QString("thai") ); locale.setCalendarSystem(KLocale::QDateCalendar); QCOMPARE( locale.calendarSystem(), KLocale::QDateCalendar); QCOMPARE( locale.calendarType(), QString("gregorian") ); } void KLocaleTest::testCountryDivision() { KLocale locale(*KGlobal::locale()); QCOMPARE( locale.countryDivisionCode(), locale.country().toUpper() ); QVERIFY( locale.setCountryDivisionCode( "US-NY" ) ); QCOMPARE( locale.countryDivisionCode(), QString( "US-NY" ) ); } void KLocaleTest::prettyFormatDuration() { KLocale locale(*KGlobal::locale()); QCOMPARE(locale.prettyFormatDuration(1000), QString("1 second")); QCOMPARE(locale.prettyFormatDuration(5000), QString("5 seconds")); QCOMPARE(locale.prettyFormatDuration(60000), QString("1 minute")); QCOMPARE(locale.prettyFormatDuration(300000), QString("5 minutes")); QCOMPARE(locale.prettyFormatDuration(3600000), QString("1 hour")); QCOMPARE(locale.prettyFormatDuration(18000000), QString("5 hours")); QCOMPARE(locale.prettyFormatDuration(75000), QString("1 minute and 15 seconds")); // Problematic case #1 (there is a reference to this case on klocale.cpp) QCOMPARE(locale.prettyFormatDuration(119999), QString("2 minutes")); // This case is strictly 2 hours, 15 minutes and 59 seconds. However, since the range is // pretty high between hours and seconds, prettyFormatDuration always omits seconds when there // are hours in scene. QCOMPARE(locale.prettyFormatDuration(8159000), QString("2 hours and 15 minutes")); // This case is strictly 1 hour and 10 seconds. For the same reason, prettyFormatDuration // detects that 10 seconds is just garbage compared to 1 hour, and omits it on the result. QCOMPARE(locale.prettyFormatDuration(3610000), QString("1 hour")); } void KLocaleTest::formatByteSize() { KLocale locale(*KGlobal::locale()); QCOMPARE(locale.formatByteSize(0), QString("0 B")); QCOMPARE(locale.formatByteSize(50), QString("50 B")); QCOMPARE(locale.formatByteSize(500), QString("500 B")); QCOMPARE(locale.formatByteSize(5000), QString("4.9 KiB")); QCOMPARE(locale.formatByteSize(50000), QString("48.8 KiB")); QCOMPARE(locale.formatByteSize(500000), QString("488.3 KiB")); QCOMPARE(locale.formatByteSize(5000000), QString("4.8 MiB")); QCOMPARE(locale.formatByteSize(50000000), QString("47.7 MiB")); QCOMPARE(locale.formatByteSize(500000000), QString("476.8 MiB")); #if QT_POINTER_SIZE >= 8 QCOMPARE(locale.formatByteSize(5000000000), QString("4.7 GiB")); QCOMPARE(locale.formatByteSize(50000000000), QString("46.6 GiB")); QCOMPARE(locale.formatByteSize(500000000000), QString("465.7 GiB")); QCOMPARE(locale.formatByteSize(5000000000000), QString("4.5 TiB")); QCOMPARE(locale.formatByteSize(50000000000000), QString("45.5 TiB")); QCOMPARE(locale.formatByteSize(500000000000000), QString("454.7 TiB")); #endif } void KLocaleTest::weekDays() { KLocale locale(*KGlobal::locale()); //Test setting of weekStartDay locale.setWeekStartDay(3); QCOMPARE(locale.weekStartDay(), 3); locale.setWeekStartDay(0); QCOMPARE(locale.weekStartDay(), 3); locale.setWeekStartDay(8); QCOMPARE(locale.weekStartDay(), 3); //Test setting of workingWeekStartDay locale.setWorkingWeekStartDay(3); locale.setWorkingWeekEndDay(6); QCOMPARE(locale.workingWeekStartDay(), 3); locale.setWorkingWeekStartDay(0); QCOMPARE(locale.workingWeekStartDay(), 3); locale.setWorkingWeekStartDay(8); QCOMPARE(locale.workingWeekStartDay(), 3); //Test setting of workingWeekEndDay locale.setWorkingWeekStartDay(3); locale.setWorkingWeekEndDay(6); QCOMPARE(locale.workingWeekEndDay(), 6); locale.setWorkingWeekEndDay(0); QCOMPARE(locale.workingWeekEndDay(), 6); locale.setWorkingWeekEndDay(8); QCOMPARE(locale.workingWeekEndDay(), 6); //Test setting of weekStartDay locale.setWeekDayOfPray(3); QCOMPARE(locale.weekDayOfPray(), 3); locale.setWeekDayOfPray(-1); QCOMPARE(locale.weekDayOfPray(), 3); locale.setWeekDayOfPray(8); QCOMPARE(locale.weekDayOfPray(), 3); locale.setWeekDayOfPray(0); QCOMPARE(locale.weekDayOfPray(), 0); } void KLocaleTest::removeAcceleratorMarker() { KLocale locale(*KGlobal::locale()); // No accelerator marker. QCOMPARE(locale.removeAcceleratorMarker(QString()), QString()); QCOMPARE(locale.removeAcceleratorMarker("Foo bar"), QString("Foo bar")); // Run of the mill. QCOMPARE(locale.removeAcceleratorMarker("&Foo bar"), QString("Foo bar")); QCOMPARE(locale.removeAcceleratorMarker("Foo &bar"), QString("Foo bar")); QCOMPARE(locale.removeAcceleratorMarker("Foo b&ar"), QString("Foo bar")); // - presence of escaped ampersands QCOMPARE(locale.removeAcceleratorMarker("Foo && Bar"), QString("Foo & Bar")); QCOMPARE(locale.removeAcceleratorMarker("Foo && &Bar"), QString("Foo & Bar")); QCOMPARE(locale.removeAcceleratorMarker("&Foo && Bar"), QString("Foo & Bar")); // CJK-style markers. QCOMPARE(locale.removeAcceleratorMarker("Foo bar (&F)"), QString("Foo bar")); QCOMPARE(locale.removeAcceleratorMarker("(&F) Foo bar"), QString("Foo bar")); // - interpunction after/before parenthesis still qualifies CJK marker QCOMPARE(locale.removeAcceleratorMarker("Foo bar (&F):"), QString("Foo bar:")); QCOMPARE(locale.removeAcceleratorMarker("Foo bar (&F)..."), QString("Foo bar...")); QCOMPARE(locale.removeAcceleratorMarker("...(&F) foo bar"), QString("...foo bar")); // - alphanumerics around parenthesis disqualify CJK marker QCOMPARE(locale.removeAcceleratorMarker("Foo (&F) bar"), QString("Foo (F) bar")); // - something removed raw ampersands, leaving dangling reduced CJK markers. // Remove reduced markers only if CJK characters are found in the string. QCOMPARE(locale.removeAcceleratorMarker(QString::fromUtf8("Foo bar (F)")), QString::fromUtf8("Foo bar (F)")); QCOMPARE(locale.removeAcceleratorMarker(QString::fromUtf8("印刷(P)...")), QString::fromUtf8("印刷...")); // Shady cases, where ampersand is obviously not a marker // and should have been escaped, but it was not. QCOMPARE(locale.removeAcceleratorMarker("&"), QString("&")); QCOMPARE(locale.removeAcceleratorMarker("Foo bar &"), QString("Foo bar &")); QCOMPARE(locale.removeAcceleratorMarker("Foo & Bar"), QString("Foo & Bar")); } void KLocaleTest::formatByteSize2() { KLocale locale(*KGlobal::locale()); // IEC is also default locale.setBinaryUnitDialect(KLocale::IECBinaryDialect); QCOMPARE(locale.binaryUnitDialect(), KLocale::IECBinaryDialect); QCOMPARE(locale.formatByteSize(1024.0), QString("1.0 KiB")); QCOMPARE(locale.formatByteSize(1023.0), QString("1,023 B")); QCOMPARE(locale.formatByteSize(1163000.0), QString("1.1 MiB")); // 1.2 metric QCOMPARE(locale.formatByteSize(-1024.0), QString("-1.0 KiB")); QCOMPARE(locale.formatByteSize(-1023.0), QString("-1,023 B")); QCOMPARE(locale.formatByteSize(-1163000.0), QString("-1.1 MiB")); // 1.2 metric locale.setBinaryUnitDialect(KLocale::JEDECBinaryDialect); QCOMPARE(locale.binaryUnitDialect(), KLocale::JEDECBinaryDialect); QCOMPARE(locale.formatByteSize(1024.0), QString("1.0 KB")); QCOMPARE(locale.formatByteSize(1023.0), QString("1,023 B")); QCOMPARE(locale.formatByteSize(1163000.0), QString("1.1 MB")); QCOMPARE(locale.formatByteSize(-1024.0), QString("-1.0 KB")); QCOMPARE(locale.formatByteSize(-1023.0), QString("-1,023 B")); QCOMPARE(locale.formatByteSize(-1163000.0), QString("-1.1 MB")); locale.setBinaryUnitDialect(KLocale::MetricBinaryDialect); QCOMPARE(locale.binaryUnitDialect(), KLocale::MetricBinaryDialect); QCOMPARE(locale.formatByteSize(1024.0), QString("1.0 kB")); QCOMPARE(locale.formatByteSize(1023.0), QString("1.0 kB")); QCOMPARE(locale.formatByteSize(1163000.0), QString("1.2 MB")); QCOMPARE(locale.formatByteSize(-1024.0), QString("-1.0 kB")); QCOMPARE(locale.formatByteSize(-1023.0), QString("-1.0 kB")); QCOMPARE(locale.formatByteSize(-1163000.0), QString("-1.2 MB")); // Ensure specific dialects work, still on metric by default QCOMPARE(locale.formatByteSize(1024.0, 1, KLocale::JEDECBinaryDialect), QString("1.0 KB")); QCOMPARE(locale.formatByteSize(2097152.0, 1, KLocale::IECBinaryDialect), QString("2.0 MiB")); locale.setBinaryUnitDialect(KLocale::JEDECBinaryDialect); QCOMPARE(locale.binaryUnitDialect(), KLocale::JEDECBinaryDialect); QCOMPARE(locale.formatByteSize(2097152.0, 1, KLocale::MetricBinaryDialect), QString("2.1 MB")); // Ensure all units are represented (still in JEDEC mode) QCOMPARE(locale.formatByteSize(2.0e9, 1, KLocale::MetricBinaryDialect), QString("2.0 GB")); QCOMPARE(locale.formatByteSize(3.2e12, 1, KLocale::MetricBinaryDialect), QString("3.2 TB")); QCOMPARE(locale.formatByteSize(4.1e15, 1, KLocale::MetricBinaryDialect), QString("4.1 PB")); QCOMPARE(locale.formatByteSize(6.7e18, 2, KLocale::MetricBinaryDialect), QString("6.70 EB")); QCOMPARE(locale.formatByteSize(5.6e20, 2, KLocale::MetricBinaryDialect), QString("560.00 EB")); QCOMPARE(locale.formatByteSize(2.3e22, 2, KLocale::MetricBinaryDialect), QString("23.00 ZB")); QCOMPARE(locale.formatByteSize(1.0e27, 1, KLocale::MetricBinaryDialect), QString("1,000.0 YB")); // Spattering of specific units QCOMPARE(locale.formatByteSize(823000, 3, KLocale::IECBinaryDialect, KLocale::UnitMegaByte), QString("0.785 MiB")); QCOMPARE(locale.formatByteSize(1234034.0, 4, KLocale::JEDECBinaryDialect, KLocale::UnitByte), QString("1,234,034 B")); } QTEST_KDEMAIN_CORE(KLocaleTest)