Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / tests / auto / declarative / qdeclarativelocale / tst_qdeclarativelocale.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the test suite of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 #include <qtest.h>
42 #include <QDebug>
43
44 #include <QtDeclarative/qdeclarativeengine.h>
45 #include <QtDeclarative/qdeclarativecomponent.h>
46 #include <QtCore/QDateTime>
47 #include <qcolor.h>
48 #include "../../shared/util.h"
49
50 class tst_qdeclarativelocale : public QDeclarativeDataTest
51 {
52     Q_OBJECT
53 public:
54     tst_qdeclarativelocale() { }
55
56 private slots:
57     void defaultLocale();
58
59     void properties_data();
60     void properties();
61     void currencySymbol_data();
62     void currencySymbol();
63     void monthName_data();
64     void monthName();
65     void standaloneMonthName_data();
66     void standaloneMonthName();
67     void dayName_data();
68     void dayName();
69     void standaloneDayName_data();
70     void standaloneDayName();
71     void weekDays_data();
72     void weekDays();
73     void dateFormat_data();
74     void dateFormat();
75     void dateTimeFormat_data();
76     void dateTimeFormat();
77     void timeFormat_data();
78     void timeFormat();
79
80     void dateToLocaleString_data();
81     void dateToLocaleString();
82     void dateToLocaleStringFormatted_data();
83     void dateToLocaleStringFormatted();
84     void dateToLocaleDateString_data();
85     void dateToLocaleDateString();
86     void dateToLocaleDateStringFormatted_data();
87     void dateToLocaleDateStringFormatted();
88     void dateToLocaleTimeString_data();
89     void dateToLocaleTimeString();
90     void dateToLocaleTimeStringFormatted_data();
91     void dateToLocaleTimeStringFormatted();
92     void dateFromLocaleString_data();
93     void dateFromLocaleString();
94     void dateFromLocaleDateString_data();
95     void dateFromLocaleDateString();
96     void dateFromLocaleTimeString_data();
97     void dateFromLocaleTimeString();
98
99     void numberToLocaleString_data();
100     void numberToLocaleString();
101     void numberToLocaleCurrencyString_data();
102     void numberToLocaleCurrencyString();
103     void numberFromLocaleString_data();
104     void numberFromLocaleString();
105     void numberConstToLocaleString();
106
107 private:
108     void addPropertyData(const QString &l);
109     QVariant getProperty(QObject *obj, const QString &locale, const QString &property);
110     void addCurrencySymbolData(const QString &locale);
111     void addStandardFormatData();
112     void addFormatNameData(const QString &locale);
113     void addDateTimeFormatData(const QString &l);
114     void addDateFormatData(const QString &l);
115     void addTimeFormatData(const QString &l);
116     QDeclarativeEngine engine;
117 };
118
119 void tst_qdeclarativelocale::defaultLocale()
120 {
121     QDeclarativeComponent c(&engine, testFileUrl("properties.qml"));
122
123     QObject *obj = c.create();
124     QVERIFY(obj);
125
126     QCOMPARE(obj->property("name").toString(), QLocale().name());
127 }
128
129 #define LOCALE_PROP(type,prop) { #prop, QVariant(type(qlocale.prop())) }
130
131 void tst_qdeclarativelocale::addPropertyData(const QString &l)
132 {
133     QLocale qlocale(l);
134
135     struct {
136         const char *name;
137         QVariant value;
138     }
139     values[] = {
140         LOCALE_PROP(QString,name),
141         LOCALE_PROP(QString,amText),
142         LOCALE_PROP(QString,pmText),
143         LOCALE_PROP(QString,nativeLanguageName),
144         LOCALE_PROP(QString,nativeCountryName),
145         LOCALE_PROP(QString,decimalPoint),
146         LOCALE_PROP(QString,groupSeparator),
147         LOCALE_PROP(QString,percent),
148         LOCALE_PROP(QString,zeroDigit),
149         LOCALE_PROP(QString,negativeSign),
150         LOCALE_PROP(QString,positiveSign),
151         LOCALE_PROP(QString,exponential),
152         LOCALE_PROP(int,firstDayOfWeek),
153         LOCALE_PROP(int,measurementSystem),
154         LOCALE_PROP(int,textDirection),
155         { 0, QVariant() }
156     };
157
158     int i = 0;
159     while (values[i].name) {
160         QByteArray n = l.toLatin1() + ':' + values[i].name;
161         QTest::newRow(n.constData()) << l << QByteArray(values[i].name) << values[i].value;
162         ++i;
163     }
164 }
165
166 void tst_qdeclarativelocale::properties_data()
167 {
168     QTest::addColumn<QString>("locale");
169     QTest::addColumn<QByteArray>("property");
170     QTest::addColumn<QVariant>("value");
171
172     addPropertyData("en_US");
173     addPropertyData("de_DE");
174     addPropertyData("ar_SA");
175     addPropertyData("hi_IN");
176     addPropertyData("zh_CN");
177     addPropertyData("th_TH");
178 }
179
180 void tst_qdeclarativelocale::properties()
181 {
182     QFETCH(QString, locale);
183     QFETCH(QByteArray, property);
184     QFETCH(QVariant, value);
185
186     QDeclarativeComponent c(&engine, testFileUrl("properties.qml"));
187
188     QObject *obj = c.create();
189     QVERIFY(obj);
190
191     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
192         Q_ARG(QVariant, QVariant(locale)));
193
194     QCOMPARE(obj->property(property), value);
195
196     delete obj;
197 }
198
199 void tst_qdeclarativelocale::addCurrencySymbolData(const QString &l)
200 {
201     QByteArray locale = l.toLatin1();
202     QTest::newRow(locale.constData()) << l << -1;
203     QByteArray t(locale);
204     t += " CurrencyIsoCode";
205     QTest::newRow(t.constData()) << l << (int)QLocale::CurrencyIsoCode;
206     t = locale + " CurrencySymbol";
207     QTest::newRow(t.constData()) << l << (int)QLocale::CurrencySymbol;
208     t = locale + " CurrencyDisplayName";
209     QTest::newRow(t.constData()) << l << (int)QLocale::CurrencyDisplayName;
210 }
211
212 void tst_qdeclarativelocale::currencySymbol_data()
213 {
214     QTest::addColumn<QString>("locale");
215     QTest::addColumn<int>("param");
216
217     addCurrencySymbolData("en_US");
218     addCurrencySymbolData("de_DE");
219     addCurrencySymbolData("ar_SA");
220     addCurrencySymbolData("hi_IN");
221     addCurrencySymbolData("zh_CN");
222     addCurrencySymbolData("th_TH");
223 }
224
225 void tst_qdeclarativelocale::currencySymbol()
226 {
227     QFETCH(QString, locale);
228     QFETCH(int, param);
229
230     QDeclarativeComponent c(&engine, testFileUrl("functions.qml"));
231
232     QObject *obj = c.create();
233     QVERIFY(obj);
234
235     QLocale l(locale);
236     QVariant val;
237     QLocale::CurrencySymbolFormat format = QLocale::CurrencySymbol;
238
239     if (param >= 0)
240         format = QLocale::CurrencySymbolFormat(param);
241
242     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
243         Q_ARG(QVariant, QVariant(locale)));
244
245     QMetaObject::invokeMethod(obj, "currencySymbol", Qt::DirectConnection,
246             Q_RETURN_ARG(QVariant, val),
247             Q_ARG(QVariant, QVariant(int(format))));
248
249     QCOMPARE(val.toString(), l.currencySymbol(format));
250
251     delete obj;
252 }
253
254 void tst_qdeclarativelocale::addFormatNameData(const QString &l)
255 {
256     QByteArray locale = l.toLatin1();
257     QTest::newRow(locale.constData()) << l << -1;
258     QByteArray t(locale);
259     t += " LongFormat";
260     QTest::newRow(t.constData()) << l << (int)QLocale::LongFormat;
261     t = locale + " ShortFormat";
262     QTest::newRow(t.constData()) << l << (int)QLocale::ShortFormat;
263     t = locale + " NarrowFormat";
264     QTest::newRow(t.constData()) << l << (int)QLocale::NarrowFormat;
265 }
266
267 void tst_qdeclarativelocale::addStandardFormatData()
268 {
269     QTest::addColumn<QString>("locale");
270     QTest::addColumn<int>("param");
271
272     addFormatNameData("en_US");
273     addFormatNameData("de_DE");
274     addFormatNameData("ar_SA");
275     addFormatNameData("hi_IN");
276     addFormatNameData("zh_CN");
277     addFormatNameData("th_TH");
278 }
279
280 void tst_qdeclarativelocale::monthName_data()
281 {
282     addStandardFormatData();
283 }
284
285 void tst_qdeclarativelocale::monthName()
286 {
287     QFETCH(QString, locale);
288     QFETCH(int, param);
289
290     QDeclarativeComponent c(&engine, testFileUrl("functions.qml"));
291
292     QObject *obj = c.create();
293     QVERIFY(obj);
294
295     QLocale l(locale);
296     QVariant val;
297     QLocale::FormatType format = QLocale::LongFormat;
298     if (param >= 0)
299         format = QLocale::FormatType(param);
300
301     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
302         Q_ARG(QVariant, QVariant(locale)));
303
304     for (int i = 0; i <= 11; ++i) {
305         QMetaObject::invokeMethod(obj, "monthName", Qt::DirectConnection,
306             Q_RETURN_ARG(QVariant, val),
307             Q_ARG(QVariant, QVariant(i)),
308             Q_ARG(QVariant, QVariant(int(format))));
309
310         // QLocale January == 1, JS Date January == 0
311         QCOMPARE(val.toString(), l.monthName(i+1, format));
312     }
313
314     delete obj;
315 }
316
317 void tst_qdeclarativelocale::standaloneMonthName_data()
318 {
319     addStandardFormatData();
320 }
321
322 void tst_qdeclarativelocale::standaloneMonthName()
323 {
324     QFETCH(QString, locale);
325     QFETCH(int, param);
326
327     QDeclarativeComponent c(&engine, testFileUrl("functions.qml"));
328
329     QObject *obj = c.create();
330     QVERIFY(obj);
331
332     QLocale l(locale);
333     QVariant val;
334     QLocale::FormatType format = QLocale::LongFormat;
335     if (param >= 0)
336         format = QLocale::FormatType(param);
337
338     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
339         Q_ARG(QVariant, QVariant(locale)));
340
341     for (int i = 0; i <= 11; ++i) {
342         QMetaObject::invokeMethod(obj, "standaloneMonthName", Qt::DirectConnection,
343             Q_RETURN_ARG(QVariant, val),
344             Q_ARG(QVariant, QVariant(i)),
345             Q_ARG(QVariant, QVariant(int(format))));
346
347         // QLocale January == 1, JS Date January == 0
348         QCOMPARE(val.toString(), l.standaloneMonthName(i+1, format));
349     }
350
351     delete obj;
352 }
353
354 void tst_qdeclarativelocale::dayName_data()
355 {
356     addStandardFormatData();
357 }
358
359 void tst_qdeclarativelocale::dayName()
360 {
361     QFETCH(QString, locale);
362     QFETCH(int, param);
363
364     QDeclarativeComponent c(&engine, testFileUrl("functions.qml"));
365
366     QObject *obj = c.create();
367     QVERIFY(obj);
368
369     QLocale l(locale);
370     QVariant val;
371     QLocale::FormatType format = QLocale::LongFormat;
372     if (param >= 0)
373         format = QLocale::FormatType(param);
374
375     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
376         Q_ARG(QVariant, QVariant(locale)));
377
378     for (int i = 1; i <= 7; ++i) {
379         QMetaObject::invokeMethod(obj, "dayName", Qt::DirectConnection,
380             Q_RETURN_ARG(QVariant, val),
381             Q_ARG(QVariant, QVariant(i)),
382             Q_ARG(QVariant, QVariant(int(format))));
383
384         QCOMPARE(val.toString(), l.dayName(i, format));
385     }
386
387     delete obj;
388 }
389
390 void tst_qdeclarativelocale::standaloneDayName_data()
391 {
392     addStandardFormatData();
393 }
394
395 void tst_qdeclarativelocale::standaloneDayName()
396 {
397     QFETCH(QString, locale);
398     QFETCH(int, param);
399
400     QDeclarativeComponent c(&engine, testFileUrl("functions.qml"));
401
402     QObject *obj = c.create();
403     QVERIFY(obj);
404
405     QLocale l(locale);
406     QVariant val;
407     QLocale::FormatType format = param < 0 ? QLocale::LongFormat : QLocale::FormatType(param);
408
409     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
410         Q_ARG(QVariant, QVariant(locale)));
411
412     for (int i = 1; i <= 7; ++i) {
413         QMetaObject::invokeMethod(obj, "standaloneDayName", Qt::DirectConnection,
414                 Q_RETURN_ARG(QVariant, val),
415                 Q_ARG(QVariant, QVariant(i)),
416                 Q_ARG(QVariant, QVariant(int(format))));
417
418         QCOMPARE(val.toString(), l.standaloneDayName(i, format));
419     }
420
421     delete obj;
422 }
423
424 void tst_qdeclarativelocale::weekDays_data()
425 {
426     QTest::addColumn<QString>("locale");
427
428     QTest::newRow("en_US") << "en_US";
429     QTest::newRow("de_DE") << "de_DE";
430     QTest::newRow("ar_SA") << "ar_SA";
431     QTest::newRow("hi_IN") << "hi_IN";
432     QTest::newRow("zh_CN") << "zh_CN";
433     QTest::newRow("th_TH") << "th_TH";
434 }
435
436 void tst_qdeclarativelocale::weekDays()
437 {
438     QFETCH(QString, locale);
439
440     QDeclarativeComponent c(&engine, testFileUrl("properties.qml"));
441
442     QObject *obj = c.create();
443     QVERIFY(obj);
444
445     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
446         Q_ARG(QVariant, QVariant(locale)));
447
448     QVariant val = obj->property("weekDays");
449     QVERIFY(val.type() == QVariant::List);
450
451     QList<QVariant> qmlDays = val.toList();
452     QList<Qt::DayOfWeek> days = QLocale(locale).weekdays();
453
454     QVERIFY(days.count() == qmlDays.count());
455
456     for (int i = 0; i < days.count(); ++i) {
457         int day = int(days.at(i));
458         if (day == 7) // JS Date days in range 0(Sunday) to 6(Saturday)
459             day = 0;
460         QCOMPARE(day, qmlDays.at(i).toInt());
461     }
462
463     delete obj;
464 }
465
466
467 void tst_qdeclarativelocale::dateTimeFormat_data()
468 {
469     addStandardFormatData();
470 }
471
472 void tst_qdeclarativelocale::dateTimeFormat()
473 {
474     QFETCH(QString, locale);
475     QFETCH(int, param);
476
477     QDeclarativeComponent c(&engine, testFileUrl("functions.qml"));
478
479     QObject *obj = c.create();
480     QVERIFY(obj);
481
482     QLocale l(locale);
483     QVariant val;
484
485     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
486         Q_ARG(QVariant, QVariant(locale)));
487
488     QLocale::FormatType format = param < 0 ? QLocale::LongFormat : QLocale::FormatType(param);
489     QMetaObject::invokeMethod(obj, "dateTimeFormat", Qt::DirectConnection,
490             Q_RETURN_ARG(QVariant, val),
491             Q_ARG(QVariant, QVariant(param)));
492
493     QCOMPARE(val.toString(), l.dateTimeFormat(format));
494 }
495
496 void tst_qdeclarativelocale::dateFormat_data()
497 {
498     addStandardFormatData();
499 }
500
501 void tst_qdeclarativelocale::dateFormat()
502 {
503     QFETCH(QString, locale);
504     QFETCH(int, param);
505
506     QDeclarativeComponent c(&engine, testFileUrl("functions.qml"));
507
508     QObject *obj = c.create();
509     QVERIFY(obj);
510
511     QLocale l(locale);
512     QVariant val;
513
514     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
515         Q_ARG(QVariant, QVariant(locale)));
516
517     QLocale::FormatType format = param < 0 ? QLocale::LongFormat : QLocale::FormatType(param);
518     QMetaObject::invokeMethod(obj, "dateFormat", Qt::DirectConnection,
519             Q_RETURN_ARG(QVariant, val),
520             Q_ARG(QVariant, QVariant(param)));
521
522     QCOMPARE(val.toString(), l.dateFormat(format));
523 }
524
525 void tst_qdeclarativelocale::timeFormat_data()
526 {
527     addStandardFormatData();
528 }
529
530 void tst_qdeclarativelocale::timeFormat()
531 {
532     QFETCH(QString, locale);
533     QFETCH(int, param);
534
535     QDeclarativeComponent c(&engine, testFileUrl("functions.qml"));
536
537     QObject *obj = c.create();
538     QVERIFY(obj);
539
540     QLocale l(locale);
541     QVariant val;
542
543     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
544         Q_ARG(QVariant, QVariant(locale)));
545
546     QLocale::FormatType format = param < 0 ? QLocale::LongFormat : QLocale::FormatType(param);
547     QMetaObject::invokeMethod(obj, "timeFormat", Qt::DirectConnection,
548             Q_RETURN_ARG(QVariant, val),
549             Q_ARG(QVariant, QVariant(param)));
550
551     QCOMPARE(val.toString(), l.timeFormat(format));
552 }
553
554 void tst_qdeclarativelocale::dateToLocaleString_data()
555 {
556     addStandardFormatData();
557 }
558
559 void tst_qdeclarativelocale::dateToLocaleString()
560 {
561     QFETCH(QString, locale);
562     QFETCH(int, param);
563
564     QDeclarativeComponent c(&engine, testFileUrl("date.qml"));
565
566     QObject *obj = c.create();
567     QVERIFY(obj);
568
569     QDateTime dt;
570     dt.setDate(QDate(2011, 10, 7)); // weirdly, JS Date month range is 0-11
571     dt.setTime(QTime(18, 53, 48, 345));
572
573     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
574         Q_ARG(QVariant, QVariant(locale)));
575
576     QLocale::FormatType format = param < 0 ? QLocale::LongFormat : QLocale::FormatType(param);
577
578     QVariant val;
579     QMetaObject::invokeMethod(obj, "toLocaleString", Qt::DirectConnection,
580         Q_RETURN_ARG(QVariant, val),
581         Q_ARG(QVariant, QVariant(param)));
582
583     QLocale l(locale);
584     QCOMPARE(val.toString(), l.toString(dt, format));
585 }
586
587 void tst_qdeclarativelocale::addDateTimeFormatData(const QString &l)
588 {
589     const char *formats[] = {
590         "hh:mm dd.MM.yyyy",
591         "h:m:sap ddd MMMM d yy",
592         "'The date and time is: 'H:mm:ss:zzz dd/MM/yy",
593         "MMM d yyyy HH:mm t",
594         0
595     };
596     QByteArray locale = l.toLatin1();
597     int i = 0;
598     while (formats[i]) {
599         QByteArray t(locale);
600         t += " ";
601         t += formats[i];
602         QTest::newRow(t.constData()) << l << QString(formats[i]);
603         ++i;
604     }
605 }
606
607 void tst_qdeclarativelocale::dateToLocaleStringFormatted_data()
608 {
609     QTest::addColumn<QString>("locale");
610     QTest::addColumn<QString>("format");
611
612     addDateTimeFormatData("en_US");
613     addDateTimeFormatData("de_DE");
614     addDateTimeFormatData("ar_SA");
615     addDateTimeFormatData("hi_IN");
616     addDateTimeFormatData("zh_CN");
617     addDateTimeFormatData("th_TH");
618 }
619
620 void tst_qdeclarativelocale::dateToLocaleStringFormatted()
621 {
622     QFETCH(QString, locale);
623     QFETCH(QString, format);
624
625     QDeclarativeComponent c(&engine, testFileUrl("date.qml"));
626
627     QObject *obj = c.create();
628     QVERIFY(obj);
629
630     QDateTime dt;
631     dt.setDate(QDate(2011, 10, 7)); // weirdly, JS Date month range is 0-11
632     dt.setTime(QTime(18, 53, 48, 345));
633
634     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
635         Q_ARG(QVariant, QVariant(locale)));
636
637     QVariant val;
638     QMetaObject::invokeMethod(obj, "toLocaleString", Qt::DirectConnection,
639         Q_RETURN_ARG(QVariant, val),
640         Q_ARG(QVariant, QVariant(format)));
641
642     QLocale l(locale);
643     QCOMPARE(val.toString(), l.toString(dt, format));
644 }
645
646 void tst_qdeclarativelocale::dateToLocaleDateString_data()
647 {
648     addStandardFormatData();
649 }
650
651 void tst_qdeclarativelocale::dateToLocaleDateString()
652 {
653     QFETCH(QString, locale);
654     QFETCH(int, param);
655
656     QDeclarativeComponent c(&engine, testFileUrl("date.qml"));
657
658     QObject *obj = c.create();
659     QVERIFY(obj);
660
661     QDateTime dt;
662     dt.setDate(QDate(2011, 10, 7)); // weirdly, JS Date month range is 0-11
663     dt.setTime(QTime(18, 53, 48, 345));
664
665     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
666         Q_ARG(QVariant, QVariant(locale)));
667
668     QLocale::FormatType format = param < 0 ? QLocale::LongFormat : QLocale::FormatType(param);
669
670     QVariant val;
671     QMetaObject::invokeMethod(obj, "toLocaleDateString", Qt::DirectConnection,
672         Q_RETURN_ARG(QVariant, val),
673         Q_ARG(QVariant, QVariant(param)));
674
675     QLocale l(locale);
676     QCOMPARE(val.toString(), l.toString(dt.date(), format));
677 }
678
679 void tst_qdeclarativelocale::addDateFormatData(const QString &l)
680 {
681     const char *formats[] = {
682         "dd.MM.yyyy",
683         "ddd MMMM d yy",
684         "'The date is: 'dd/MM/yy",
685         "MMM d yyyy",
686         0
687     };
688     QByteArray locale = l.toLatin1();
689     int i = 0;
690     while (formats[i]) {
691         QByteArray t(locale);
692         t += " ";
693         t += formats[i];
694         QTest::newRow(t.constData()) << l << QString(formats[i]);
695         ++i;
696     }
697 }
698
699 void tst_qdeclarativelocale::dateToLocaleDateStringFormatted_data()
700 {
701     QTest::addColumn<QString>("locale");
702     QTest::addColumn<QString>("format");
703
704     addDateFormatData("en_US");
705     addDateFormatData("de_DE");
706     addDateFormatData("ar_SA");
707     addDateFormatData("hi_IN");
708     addDateFormatData("zh_CN");
709     addDateFormatData("th_TH");
710 }
711
712 void tst_qdeclarativelocale::dateToLocaleDateStringFormatted()
713 {
714     QFETCH(QString, locale);
715     QFETCH(QString, format);
716
717     QDeclarativeComponent c(&engine, testFileUrl("date.qml"));
718
719     QObject *obj = c.create();
720     QVERIFY(obj);
721
722     QDateTime dt;
723     dt.setDate(QDate(2011, 10, 7)); // weirdly, JS Date month range is 0-11
724     dt.setTime(QTime(18, 53, 48, 345));
725
726     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
727         Q_ARG(QVariant, QVariant(locale)));
728
729     QVariant val;
730     QMetaObject::invokeMethod(obj, "toLocaleString", Qt::DirectConnection,
731         Q_RETURN_ARG(QVariant, val),
732         Q_ARG(QVariant, QVariant(format)));
733
734     QLocale l(locale);
735     QCOMPARE(val.toString(), l.toString(dt.date(), format));
736 }
737
738 void tst_qdeclarativelocale::dateToLocaleTimeString_data()
739 {
740     addStandardFormatData();
741 }
742
743 void tst_qdeclarativelocale::dateToLocaleTimeString()
744 {
745     QFETCH(QString, locale);
746     QFETCH(int, param);
747
748     QDeclarativeComponent c(&engine, testFileUrl("date.qml"));
749
750     QObject *obj = c.create();
751     QVERIFY(obj);
752
753     QDateTime dt;
754     dt.setDate(QDate(2011, 10, 7)); // weirdly, JS Date month range is 0-11
755     dt.setTime(QTime(18, 53, 48, 345));
756
757     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
758         Q_ARG(QVariant, QVariant(locale)));
759
760     QLocale::FormatType format = param < 0 ? QLocale::LongFormat : QLocale::FormatType(param);
761
762     QVariant val;
763     QMetaObject::invokeMethod(obj, "toLocaleTimeString", Qt::DirectConnection,
764         Q_RETURN_ARG(QVariant, val),
765         Q_ARG(QVariant, QVariant(param)));
766
767     QLocale l(locale);
768     QCOMPARE(val.toString(), l.toString(dt.time(), format));
769 }
770
771 void tst_qdeclarativelocale::addTimeFormatData(const QString &l)
772 {
773     const char *formats[] = {
774         "hh:mm",
775         "h:m:sap",
776         "'The time is: 'H:mm:ss:zzz",
777         "HH:mm t",
778         0
779     };
780     QByteArray locale = l.toLatin1();
781     int i = 0;
782     while (formats[i]) {
783         QByteArray t(locale);
784         t += " ";
785         t += formats[i];
786         QTest::newRow(t.constData()) << l << QString(formats[i]);
787         ++i;
788     }
789 }
790
791 void tst_qdeclarativelocale::dateToLocaleTimeStringFormatted_data()
792 {
793     QTest::addColumn<QString>("locale");
794     QTest::addColumn<QString>("format");
795
796     addTimeFormatData("en_US");
797     addTimeFormatData("de_DE");
798     addTimeFormatData("ar_SA");
799     addTimeFormatData("hi_IN");
800     addTimeFormatData("zh_CN");
801     addTimeFormatData("th_TH");
802 }
803
804 void tst_qdeclarativelocale::dateToLocaleTimeStringFormatted()
805 {
806     QFETCH(QString, locale);
807     QFETCH(QString, format);
808
809     QDeclarativeComponent c(&engine, testFileUrl("date.qml"));
810
811     QObject *obj = c.create();
812     QVERIFY(obj);
813
814     QDateTime dt;
815     dt.setDate(QDate(2011, 10, 7)); // weirdly, JS Date month range is 0-11
816     dt.setTime(QTime(18, 53, 48, 345));
817
818     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
819         Q_ARG(QVariant, QVariant(locale)));
820
821     QVariant val;
822     QMetaObject::invokeMethod(obj, "toLocaleString", Qt::DirectConnection,
823         Q_RETURN_ARG(QVariant, val),
824         Q_ARG(QVariant, QVariant(format)));
825
826     QLocale l(locale);
827     QCOMPARE(val.toString(), l.toString(dt.time(), format));
828 }
829
830 void tst_qdeclarativelocale::dateFromLocaleString_data()
831 {
832     QTest::addColumn<QString>("locale");
833     QTest::addColumn<QString>("format");
834
835     QTest::newRow("en_US 1") << "en_US" << "dddd, MMMM d, yyyy h:mm:ss AP";
836     QTest::newRow("en_US long") << "en_US" << QLocale("en_US").dateTimeFormat();
837     QTest::newRow("en_US short") << "en_US" << QLocale("en_US").dateTimeFormat(QLocale::ShortFormat);
838     QTest::newRow("de_DE long") << "de_DE" << QLocale("de_DE").dateTimeFormat();
839     QTest::newRow("de_DE short") << "de_DE" << QLocale("de_DE").dateTimeFormat(QLocale::ShortFormat);
840     QTest::newRow("ar_SA long") << "ar_SA" << QLocale("ar_SA").dateTimeFormat();
841     QTest::newRow("ar_SA short") << "ar_SA" << QLocale("ar_SA").dateTimeFormat(QLocale::ShortFormat);
842     QTest::newRow("zh_CN long") << "zh_CN" << QLocale("zh_CN").dateTimeFormat();
843     QTest::newRow("zh_CN short") << "zh_CN" << QLocale("zh_CN").dateTimeFormat(QLocale::ShortFormat);
844 }
845
846 void tst_qdeclarativelocale::dateFromLocaleString()
847 {
848     QFETCH(QString, locale);
849     QFETCH(QString, format);
850
851     QDeclarativeComponent c(&engine, testFileUrl("date.qml"));
852
853     QObject *obj = c.create();
854     QVERIFY(obj);
855
856     QDateTime dt;
857     dt.setDate(QDate(2011, 10, 7));
858     dt.setTime(QTime(18, 53, 48, 345));
859
860     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
861         Q_ARG(QVariant, QVariant(locale)));
862
863     QLocale l(locale);
864     QVariant val;
865     QMetaObject::invokeMethod(obj, "fromLocaleString", Qt::DirectConnection,
866         Q_RETURN_ARG(QVariant, val),
867         Q_ARG(QVariant, QVariant(l.toString(dt, format))),
868         Q_ARG(QVariant, QVariant(format)));
869
870     QDateTime pd = l.toDateTime(l.toString(dt, format), format);
871     QCOMPARE(val.toDateTime(), pd);
872 }
873
874 void tst_qdeclarativelocale::dateFromLocaleDateString_data()
875 {
876     QTest::addColumn<QString>("locale");
877     QTest::addColumn<QString>("format");
878
879     QTest::newRow("en_US 1") << "en_US" << "dddd, MMMM d, yyyy h:mm:ss AP";
880     QTest::newRow("en_US long") << "en_US" << QLocale("en_US").dateTimeFormat();
881     QTest::newRow("en_US short") << "en_US" << QLocale("en_US").dateTimeFormat(QLocale::ShortFormat);
882     QTest::newRow("de_DE long") << "de_DE" << QLocale("de_DE").dateTimeFormat();
883     QTest::newRow("de_DE short") << "de_DE" << QLocale("de_DE").dateTimeFormat(QLocale::ShortFormat);
884     QTest::newRow("ar_SA long") << "ar_SA" << QLocale("ar_SA").dateTimeFormat();
885     QTest::newRow("ar_SA short") << "ar_SA" << QLocale("ar_SA").dateTimeFormat(QLocale::ShortFormat);
886     QTest::newRow("zh_CN long") << "zh_CN" << QLocale("zh_CN").dateTimeFormat();
887     QTest::newRow("zh_CN short") << "zh_CN" << QLocale("zh_CN").dateTimeFormat(QLocale::ShortFormat);
888 }
889
890 void tst_qdeclarativelocale::dateFromLocaleDateString()
891 {
892     QFETCH(QString, locale);
893     QFETCH(QString, format);
894
895     QDeclarativeComponent c(&engine, testFileUrl("date.qml"));
896
897     QObject *obj = c.create();
898     QVERIFY(obj);
899
900     QDateTime dt;
901     dt.setDate(QDate(2011, 10, 7));
902     dt.setTime(QTime(18, 53, 48, 345));
903
904     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
905         Q_ARG(QVariant, QVariant(locale)));
906
907     QLocale l(locale);
908     QVariant val;
909     QMetaObject::invokeMethod(obj, "fromLocaleDateString", Qt::DirectConnection,
910         Q_RETURN_ARG(QVariant, val),
911         Q_ARG(QVariant, QVariant(l.toString(dt, format))),
912         Q_ARG(QVariant, QVariant(format)));
913
914     QDate pd = l.toDate(l.toString(dt, format), format);
915     QCOMPARE(val.toDate(), pd);
916 }
917
918 void tst_qdeclarativelocale::dateFromLocaleTimeString_data()
919 {
920     QTest::addColumn<QString>("locale");
921     QTest::addColumn<QString>("format");
922
923     QTest::newRow("en_US 1") << "en_US" << "dddd, MMMM d, yyyy h:mm:ss AP";
924     QTest::newRow("en_US long") << "en_US" << QLocale("en_US").dateTimeFormat();
925     QTest::newRow("en_US short") << "en_US" << QLocale("en_US").dateTimeFormat(QLocale::ShortFormat);
926     QTest::newRow("de_DE long") << "de_DE" << QLocale("de_DE").dateTimeFormat();
927     QTest::newRow("de_DE short") << "de_DE" << QLocale("de_DE").dateTimeFormat(QLocale::ShortFormat);
928     QTest::newRow("ar_SA long") << "ar_SA" << QLocale("ar_SA").dateTimeFormat();
929     QTest::newRow("ar_SA short") << "ar_SA" << QLocale("ar_SA").dateTimeFormat(QLocale::ShortFormat);
930     QTest::newRow("zh_CN long") << "zh_CN" << QLocale("zh_CN").dateTimeFormat();
931     QTest::newRow("zh_CN short") << "zh_CN" << QLocale("zh_CN").dateTimeFormat(QLocale::ShortFormat);
932 }
933
934 void tst_qdeclarativelocale::dateFromLocaleTimeString()
935 {
936     QFETCH(QString, locale);
937     QFETCH(QString, format);
938
939     QDeclarativeComponent c(&engine, testFileUrl("date.qml"));
940
941     QObject *obj = c.create();
942     QVERIFY(obj);
943
944     QDateTime dt;
945     dt.setDate(QDate(2011, 10, 7));
946     dt.setTime(QTime(18, 53, 48, 345));
947
948     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
949         Q_ARG(QVariant, QVariant(locale)));
950
951     QLocale l(locale);
952     QVariant val;
953     QMetaObject::invokeMethod(obj, "fromLocaleTimeString", Qt::DirectConnection,
954         Q_RETURN_ARG(QVariant, val),
955         Q_ARG(QVariant, QVariant(l.toString(dt, format))),
956         Q_ARG(QVariant, QVariant(format)));
957
958     QTime pd = l.toTime(l.toString(dt, format), format);
959     QCOMPARE(val.toTime(), pd);
960 }
961
962 void tst_qdeclarativelocale::numberToLocaleString_data()
963 {
964     QTest::addColumn<QString>("locale");
965     QTest::addColumn<char>("format");
966     QTest::addColumn<int>("prec");
967
968     QTest::newRow("en_US 1") << "en_US" << 'f' << 2;
969     QTest::newRow("en_US 2") << "en_US" << 'g' << 3;
970     QTest::newRow("en_US 3") << "en_US" << 'f' << 0;
971     QTest::newRow("en_US 4") << "en_US" << 'f' << -1;
972     QTest::newRow("de_DE 1") << "de_DE" << 'f' << 2;
973     QTest::newRow("de_DE 2") << "de_DE" << 'g' << 3;
974     QTest::newRow("ar_SA 1") << "ar_SA" << 'f' << 2;
975     QTest::newRow("ar_SA 2") << "ar_SA" << 'g' << 3;
976 }
977
978 void tst_qdeclarativelocale::numberToLocaleString()
979 {
980     QFETCH(QString, locale);
981     QFETCH(char, format);
982     QFETCH(int, prec);
983
984     QDeclarativeComponent c(&engine, testFileUrl("number.qml"));
985
986     QObject *obj = c.create();
987     QVERIFY(obj);
988
989     double number = 2344423.3289;
990
991     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
992         Q_ARG(QVariant, QVariant(locale)));
993
994     QLocale l(locale);
995     QVariant val;
996     QMetaObject::invokeMethod(obj, "toLocaleString", Qt::DirectConnection,
997         Q_RETURN_ARG(QVariant, val),
998         Q_ARG(QVariant, QVariant(number)),
999         Q_ARG(QVariant, QVariant(QString(format))),
1000         Q_ARG(QVariant, QVariant(prec)));
1001
1002     if (prec < 0) prec = 2;
1003     QCOMPARE(val.toString(), l.toString(number, format, prec));
1004 }
1005
1006 void tst_qdeclarativelocale::numberToLocaleCurrencyString_data()
1007 {
1008     QTest::addColumn<QString>("locale");
1009     QTest::addColumn<QString>("symbol");
1010
1011     QTest::newRow("en_US 1") << "en_US" << QString();
1012     QTest::newRow("en_US 2") << "en_US" << "USD";
1013     QTest::newRow("de_DE") << "de_DE" << QString();
1014     QTest::newRow("ar_SA") << "ar_SA" << QString();
1015     QTest::newRow("hi_IN") << "hi_IN" << QString();
1016     QTest::newRow("zh_CN") << "zh_CN" << QString();
1017     QTest::newRow("th_TH") << "th_TH" << QString();
1018 }
1019
1020 void tst_qdeclarativelocale::numberToLocaleCurrencyString()
1021 {
1022     QFETCH(QString, locale);
1023     QFETCH(QString, symbol);
1024
1025     QDeclarativeComponent c(&engine, testFileUrl("number.qml"));
1026
1027     QObject *obj = c.create();
1028     QVERIFY(obj);
1029
1030     double number = 2344423.3289;
1031
1032     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
1033         Q_ARG(QVariant, QVariant(locale)));
1034
1035     QLocale l(locale);
1036     QVariant val;
1037     QMetaObject::invokeMethod(obj, "toLocaleCurrencyString", Qt::DirectConnection,
1038         Q_RETURN_ARG(QVariant, val),
1039         Q_ARG(QVariant, QVariant(number)),
1040         Q_ARG(QVariant, QVariant(symbol)));
1041
1042     QCOMPARE(val.toString(), l.toCurrencyString(number, symbol));
1043 }
1044
1045 void tst_qdeclarativelocale::numberFromLocaleString_data()
1046 {
1047     QTest::addColumn<QString>("locale");
1048     QTest::addColumn<double>("number");
1049
1050     QTest::newRow("en_US 1") << "en_US" << 1234567.2345;
1051     QTest::newRow("en_US 2") << "en_US" << 0.234;
1052     QTest::newRow("en_US 3") << "en_US" << 234.0;
1053     QTest::newRow("de_DE") << "de_DE" << 1234567.2345;
1054     QTest::newRow("ar_SA") << "ar_SA" << 1234567.2345;
1055     QTest::newRow("hi_IN") << "hi_IN" << 1234567.2345;
1056     QTest::newRow("zh_CN") << "zh_CN" << 1234567.2345;
1057     QTest::newRow("th_TH") << "th_TH" << 1234567.2345;
1058 }
1059
1060 void tst_qdeclarativelocale::numberFromLocaleString()
1061 {
1062     QFETCH(QString, locale);
1063     QFETCH(double, number);
1064
1065     QDeclarativeComponent c(&engine, testFileUrl("number.qml"));
1066
1067     QObject *obj = c.create();
1068     QVERIFY(obj);
1069
1070     QLocale l(locale);
1071     QString strNumber = l.toString(number, 'f');
1072
1073     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
1074         Q_ARG(QVariant, QVariant(locale)));
1075
1076     QVariant val;
1077     QMetaObject::invokeMethod(obj, "fromLocaleString", Qt::DirectConnection,
1078         Q_RETURN_ARG(QVariant, val),
1079         Q_ARG(QVariant, QVariant(strNumber)));
1080
1081     QCOMPARE(val.toDouble(), l.toDouble(strNumber));
1082 }
1083
1084 void tst_qdeclarativelocale::numberConstToLocaleString()
1085 {
1086     QDeclarativeComponent c(&engine, testFileUrl("number.qml"));
1087
1088     QObject *obj = c.create();
1089     QVERIFY(obj);
1090
1091     QMetaObject::invokeMethod(obj, "setLocale", Qt::DirectConnection,
1092         Q_ARG(QVariant, QVariant("en_US")));
1093
1094     QLocale l("en_US");
1095     QCOMPARE(obj->property("const1").toString(), l.toString(1234.56, 'f', 2));
1096     QCOMPARE(obj->property("const2").toString(), l.toString(1234., 'f', 2));
1097 }
1098
1099 QTEST_MAIN(tst_qdeclarativelocale)
1100
1101 #include "tst_qdeclarativelocale.moc"