Cutelee 6.1.0
testinternationalization.cpp
1/*
2 This file is part of the Cutelee template system.
3
4 Copyright (c) 2010 Stephen Kelly <steveire@gmail.com>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either version
9 2.1 of the Licence, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with this library. If not, see <http://www.gnu.org/licenses/>.
18
19*/
20
21#include "engine.h"
22#include "cutelee_paths.h"
23#include "nulllocalizer_p.h"
24#include "qtlocalizer.h"
25#include "util.h"
26
27#include "coverageobject.h"
28#include <QtCore/QScopedPointer>
29#include <QtCore/QTranslator>
30#include <QtTest/QTest>
31
32using namespace Cutelee;
33
34#if QT_VERSION < QT_VERSION_CHECK(5, 12, 0)
35#define FR_THOUSAND_SEPARATOR "\u00A0"
36#else
37#define FR_THOUSAND_SEPARATOR "\u202F"
38#endif
39
40#define INIT_LOCALIZER(localizer) \
41 localizer->setAppTranslatorPrefix(QStringLiteral("test_")); \
42 localizer->setAppTranslatorPath(QStringLiteral(":/"));
43
45{
46 Q_OBJECT
47public:
48 explicit TestInternationalization(QObject *parent = {})
49 : CoverageObject(parent), nullLocalizer(new NullLocalizer()),
50 deLocalizer(
51 new QtLocalizer(QLocale(QLocale::German, QLocale::Germany))),
52 frLocalizer(new QtLocalizer(QLocale(QLocale::French, QLocale::France))),
53 en_GBLocalizer(
54 new QtLocalizer(QLocale(QLocale::English, QLocale::UnitedKingdom))),
55 en_USLocalizer(
56 new QtLocalizer(QLocale(QLocale::English, QLocale::UnitedStates))),
57 m_engine(new Engine(this))
58 {
59 auto cLocale = QLocale::c();
60 cLocale.setNumberOptions(QLocale::OmitGroupSeparator);
61 cLocalizer.reset(new QtLocalizer(cLocale));
62 m_engine->setPluginPaths({QStringLiteral(CUTELEE_PLUGIN_PATH)});
63 INIT_LOCALIZER(cLocalizer)
64 INIT_LOCALIZER(deLocalizer)
65 INIT_LOCALIZER(frLocalizer)
66 INIT_LOCALIZER(en_GBLocalizer)
67 INIT_LOCALIZER(en_USLocalizer)
68 {
69 auto deTranslator = new QTranslator(this);
70 const auto result = deTranslator->load(QStringLiteral(":/test_de_DE"));
71 Q_UNUSED(result);
72 Q_ASSERT(result);
73 deLocalizer->installTranslator(deTranslator, QStringLiteral("de_DE"));
74 }
75
76 {
77 auto frTranslator = new QTranslator(this);
78 const auto result = frTranslator->load(QStringLiteral(":/test_fr_FR.qm"));
79 Q_UNUSED(result);
80 Q_ASSERT(result);
81 frLocalizer->installTranslator(frTranslator, QStringLiteral("fr_FR"));
82 }
83 m_engine->addDefaultLibrary(QStringLiteral("cutelee_i18ntags"));
84 }
85
86private Q_SLOTS:
87 void initTestCase();
88
89 void testContext();
90 void testStrings();
91 void testIntegers();
92 void testFloats();
93 void testDates();
94 void testTimes();
95 void testDateTimes();
96 void testLocalizedTemplate();
97 void testSafeContent();
98 void testFailure();
99
100 void testStrings_data();
101 void testIntegers_data();
102 void testFloats_data();
103 void testDates_data();
104 void testTimes_data();
105 void testDateTimes_data();
106 void testLocalizedTemplate_data();
107 void testSafeContent_data();
108 void testFailure_data();
109
110private:
111 std::shared_ptr<QtLocalizer> cLocalizer;
112 const std::shared_ptr<AbstractLocalizer> nullLocalizer;
113 const std::shared_ptr<QtLocalizer> deLocalizer;
114 const std::shared_ptr<QtLocalizer> frLocalizer;
115 const std::shared_ptr<QtLocalizer> en_GBLocalizer;
116 const std::shared_ptr<QtLocalizer> en_USLocalizer;
117
118 Cutelee::Engine *m_engine;
119};
120
121void TestInternationalization::initTestCase() { Q_INIT_RESOURCE(testresource); }
122
123void TestInternationalization::testContext()
124{
125 Context c;
126 QVERIFY(c.localizer());
127 c.setLocalizer(cLocalizer);
128 QVERIFY(c.localizer());
129 c.setLocalizer(std::shared_ptr<Cutelee::AbstractLocalizer>());
130 QVERIFY(c.localizer());
131}
132
133void TestInternationalization::testStrings()
134{
135 QFETCH(QString, input);
136 QFETCH(QString, null_output);
137 QFETCH(QString, de_output);
138 QFETCH(QString, fr_output);
139 QFETCH(QString, disambiguation);
140 QFETCH(QString, plural);
141 QFETCH(QVariantList, args);
142
143 if (!disambiguation.isEmpty()) {
144 if (!plural.isEmpty()) {
145 QCOMPARE(nullLocalizer->localizePluralContextString(input, plural,
146 disambiguation, args),
147 null_output);
148 QCOMPARE(deLocalizer->localizePluralContextString(input, plural,
149 disambiguation, args),
150 de_output);
151 QCOMPARE(frLocalizer->localizePluralContextString(input, plural,
152 disambiguation, args),
153 fr_output);
154 return;
155 }
156 QCOMPARE(nullLocalizer->localizeContextString(input, disambiguation, args),
157 null_output);
158 QCOMPARE(deLocalizer->localizeContextString(input, disambiguation, args),
159 de_output);
160 QCOMPARE(frLocalizer->localizeContextString(input, disambiguation, args),
161 fr_output);
162 return;
163 }
164 if (!plural.isEmpty()) {
165 QCOMPARE(nullLocalizer->localizePluralString(input, plural, args),
166 null_output);
167 QCOMPARE(deLocalizer->localizePluralString(input, plural, args), de_output);
168 QCOMPARE(frLocalizer->localizePluralString(input, plural, args), fr_output);
169 return;
170 }
171 QCOMPARE(nullLocalizer->localizeString(input, args), null_output);
172 QCOMPARE(deLocalizer->localizeString(input, args), de_output);
173 QCOMPARE(frLocalizer->localizeString(input, args), fr_output);
174}
175
176void TestInternationalization::testStrings_data()
177{
178 QTest::addColumn<QString>("input");
179 QTest::addColumn<QString>("null_output");
180 QTest::addColumn<QString>("de_output");
181 QTest::addColumn<QString>("fr_output");
182 QTest::addColumn<QString>("disambiguation");
183 QTest::addColumn<QString>("plural");
184 QTest::addColumn<QVariantList>("args");
185
186 // Translations here are not meant to be accurate, but are meant
187 // only to test for example that disambiguation and arg reordering works.
188
189 QTest::newRow("string-01")
190 << "Birthday"
191 << "Birthday"
192 << "Geburtstag"
193 << "Anniversaire" << QString() << QString() << QVariantList();
194
195 QTest::newRow("string-02") << "%n People"
196 << "1 People"
197 << "1 Person"
198 << "1 Personne" << QString()
199 << QStringLiteral("%n People") << QVariantList{1};
200
201 QTest::newRow("string-03") << "%n People"
202 << "2 People"
203 << "2 Personen"
204 << "2 Personnes" << QString()
205 << QStringLiteral("%n People") << QVariantList{2};
206
207 QTest::newRow("string-04")
208 << "Name"
209 << "Name"
210 << "Name eines Buches"
211 << "Nom d'un livre" << QStringLiteral("Name of a Book") << QString()
212 << QVariantList();
213
214 QTest::newRow("string-05")
215 << "Name"
216 << "Name"
217 << "Namen einer Person"
218 << "Nom d'une personne" << QStringLiteral("Name of a Person") << QString()
219 << QVariantList();
220
221 QTest::newRow("string-06")
222 << "%n People"
223 << "1 People"
224 << "1 Person angemeldet" << QString::fromUtf8("1 Personne connecté")
225 << QStringLiteral("%n people are logged in")
226 << QStringLiteral("%n People") << QVariantList{1};
227
228 QTest::newRow("string-07")
229 << "%n People"
230 << "2 People"
231 << "2 Personen angemeldet" << QString::fromUtf8("2 Personnes connecté")
232 << QStringLiteral("%n people are logged in")
233 << QStringLiteral("%n People") << QVariantList{2};
234
235 QTest::newRow("string-08")
236 << "%n file(s) copied to %1"
237 << "1 files copied to destinationFolder"
238 << "1 Datei in destinationFolder kopiert"
239 << QString::fromUtf8("1 fichier copié dans destinationFolder")
240 << QString() << QStringLiteral("%n files copied to %1")
241 << QVariantList{1, QStringLiteral("destinationFolder")};
242
243 QTest::newRow("string-09")
244 << "%n file(s) copied to %1"
245 << "2 files copied to destinationFolder"
246 << "2 Datein in destinationFolder kopiert"
247 << QString::fromUtf8("2 fichiers copiés dans destinationFolder")
248 << QString() << QStringLiteral("%n files copied to %1")
249 << QVariantList{2, QStringLiteral("destinationFolder")};
250
251 QTest::newRow("string-10")
252 << "%n to %1"
253 << "1 copied to destinationFolder"
254 << "1 Datei wird nach destinationFolder kopiert"
255 << QString::fromUtf8("1 fichier est copié sur destinationFolder")
256 << QStringLiteral("Files are being copied")
257 << QStringLiteral("%n copied to %1")
258 << QVariantList{1, QStringLiteral("destinationFolder")};
259
260 QTest::newRow("string-11")
261 << "%n to %1"
262 << "1 copied to destinationFolder"
263 << "1 Datei war nach destinationFolder kopiert"
264 << QString::fromUtf8("1 fichier a été copié à destinationFolder")
265 << QStringLiteral("Files have already been copied")
266 << QStringLiteral("%n copied to %1")
267 << QVariantList{1, QStringLiteral("destinationFolder")};
268
269 QTest::newRow("string-12")
270 << "%n to %1"
271 << "2 copied to destinationFolder"
272 << "2 Datein wird nach destinationFolder kopiert"
273 << QString::fromUtf8("2 fichiers sont copiés à destinationFolder")
274 << QStringLiteral("Files are being copied")
275 << QStringLiteral("%n copied to %1")
276 << QVariantList{2, QStringLiteral("destinationFolder")};
277
278 QTest::newRow("string-13")
279 << "%n to %1"
280 << "2 copied to destinationFolder"
281 << "2 Datein war nach destinationFolder kopiert"
282 << QString::fromUtf8("2 fichiers ont été copiés sur destinationFolder")
283 << QStringLiteral("Files have already been copied")
284 << QStringLiteral("%n copied to %1")
285 << QVariantList{2, QStringLiteral("destinationFolder")};
286
287 QTest::newRow("string-14")
288 << "from %1 to %2"
289 << "from sourceFolder to destinationFolder"
290 << "nach destinationFolder von sourceFolder"
291 << QString::fromUtf8("à partir de sourceFolder destinationFolder")
292 << QStringLiteral("Files are being copied from %1 to %2") << QString()
293 << QVariantList{QStringLiteral("sourceFolder"),
294 QStringLiteral("destinationFolder")};
295
296 QTest::newRow("string-15")
297 << "%1 messages at %2, fraction of total: %3. Rating : %4"
298 << "1000 messages at 2005-05-07, fraction of total: 0.6. Rating : 4.8"
299 << "1000 Nachrichten am 2005-05-07, ratio: 0.6. Bemessungen : 4.8"
300 << QStringLiteral("1000 messages au 2005-05-07, la fraction du total: "
301 "0.6. Note: 4.8")
302 << QString() << QString()
303 << QVariantList{1000, QDate(2005, 5, 7), 0.6, 4.8};
304
305#ifndef Q_CC_MSVC
306 QTest::newRow("string-16")
307 << "Snowman: ☃"
308 << "Snowman: ☃"
309 << "Schneemann: ☃" << QStringLiteral("bonhomme de neige: ☃") << QString()
310 << QString() << QVariantList();
311#endif
312}
313
314typedef QHash<QString, QVariant> Dict;
315
316void TestInternationalization::testLocalizedTemplate()
317{
318 QFETCH(QString, input);
319 QFETCH(QString, cFragment);
320 QFETCH(QString, en_USFragment);
321 QFETCH(QString, en_GBFragment);
322 QFETCH(QString, deFragment);
323 QFETCH(QString, frFragment);
324 QFETCH(Dict, dict);
325
326 auto t = m_engine->newTemplate(input, QString());
327 Context c(dict);
328 c.setLocalizer(cLocalizer);
329 QCOMPARE(t->render(&c), cFragment);
330 c.setLocalizer(en_USLocalizer);
331 QCOMPARE(t->render(&c), en_USFragment);
332 c.setLocalizer(en_GBLocalizer);
333 QCOMPARE(t->render(&c), en_GBFragment);
334 c.setLocalizer(deLocalizer);
335 QCOMPARE(t->render(&c), deFragment);
336 c.setLocalizer(frLocalizer);
337 QCOMPARE(t->render(&c), frFragment);
338}
339
340void TestInternationalization::testLocalizedTemplate_data()
341{
342 QTest::addColumn<QString>("input");
343 QTest::addColumn<QString>("cFragment");
344 QTest::addColumn<QString>("en_USFragment");
345 QTest::addColumn<QString>("en_GBFragment");
346 QTest::addColumn<QString>("deFragment");
347 QTest::addColumn<QString>("frFragment");
348 QTest::addColumn<Dict>("dict");
349
350 Dict dict;
351 dict.insert(QStringLiteral("date"), QDate(2005, 5, 7));
352 QTest::newRow("fragment-01")
353 << QStringLiteral("{% i18n '%1 messages at %2, fraction of total: %3. "
354 "Rating : %4' _(1000) _(date) _(0.6) _(4.8) %}")
355 << QStringLiteral("1000 messages at 7 May 2005, fraction of total: 0.60. "
356 "Rating : 4.80")
357 << QStringLiteral(
358 "1,000 messages at 5/7/05, fraction of total: 0.60. Rating : 4.80")
359 << QStringLiteral("1,000 messages at 07/05/2005, fraction of total: "
360 "0.60. Rating : 4.80")
361 << QStringLiteral(
362 "1.000 Nachrichten am 07.05.05, ratio: 0,60. Bemessungen : 4,80")
363 << QString::fromUtf8("1" FR_THOUSAND_SEPARATOR
364 "000 messages au 07/05/2005, la fraction du "
365 "total: 0,60. Note: 4,80")
366 << dict;
367
368 dict.insert(QStringLiteral("integer"), 1000);
369 dict.insert(QStringLiteral("smallFloat"), 0.6);
370 dict.insert(QStringLiteral("largeFloat"), 4.8);
371
372 QTest::newRow("fragment-02")
373 << QStringLiteral(
374 "{% i18n '%1 messages at %2, fraction of total: %3. Rating : %4' "
375 "_(integer) _(date) _(smallFloat) _(largeFloat) %}")
376 << QStringLiteral("1000 messages at 7 May 2005, fraction of total: 0.60. "
377 "Rating : 4.80")
378 << QStringLiteral(
379 "1,000 messages at 5/7/05, fraction of total: 0.60. Rating : 4.80")
380 << QStringLiteral("1,000 messages at 07/05/2005, fraction of total: "
381 "0.60. Rating : 4.80")
382 << QStringLiteral(
383 "1.000 Nachrichten am 07.05.05, ratio: 0,60. Bemessungen : 4,80")
384 << QString::fromUtf8("1" FR_THOUSAND_SEPARATOR
385 "000 messages au 07/05/2005, la fraction du "
386 "total: 0,60. Note: 4,80")
387 << dict;
388
389 dict.insert(QStringLiteral("time"), QTime(4, 5, 6));
390 dict.insert(QStringLiteral("dateTime"),
391 QDateTime(QDate(2005, 5, 7), QTime(4, 5, 6)));
392
393 QTest::newRow("fragment-03")
394 << QStringLiteral(
395 "{{ _(integer) }} -- {{ _(date) }} -- {{ _(smallFloat) }} -- {{ "
396 "_(largeFloat) }} -- {{ _(time) }} -- {{ _(dateTime) }}")
397 << QStringLiteral("1000 -- 7 May 2005 -- 0.60 -- 4.80 -- 04:05:06 -- 7 "
398 "May 2005 04:05:06")
399 << QStringLiteral(
400 "1,000 -- 5/7/05 -- 0.60 -- 4.80 -- 4:05 AM -- 5/7/05 4:05 AM")
401 << QStringLiteral(
402 "1,000 -- 07/05/2005 -- 0.60 -- 4.80 -- 04:05 -- 07/05/2005 04:05")
403 << QStringLiteral(
404 "1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 04:05")
405 << QString::fromUtf8("1" FR_THOUSAND_SEPARATOR
406 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
407 "07/05/2005 04:05")
408 << dict;
409
410 QTest::newRow("fragment-04")
411 << QString::fromLatin1(
412 "{{ _('Today') }} -- {{ _(integer) }} -- {{ _(date) }} -- {{ "
413 "_(smallFloat) }} -- {{ _(largeFloat) }} -- {{ _(time) }} -- {{ "
414 "_(dateTime) }}"
415 "{% with_locale 'de_DE' %}"
416 "{{ _('Today') }} -- {{ _(integer) }} -- {{ _(date) }} -- {{ "
417 "_(smallFloat) }} -- {{ _(largeFloat) }} -- {{ _(time) }} -- {{ "
418 "_(dateTime) }}"
419 "{% endwith_locale %}"
420 "{% with_locale 'fr_FR' %}"
421 "{{ _('Today') }} -- {{ _(integer) }} -- {{ _(date) }} -- {{ "
422 "_(smallFloat) }} -- {{ _(largeFloat) }} -- {{ _(time) }} -- {{ "
423 "_(dateTime) }}"
424 "{% endwith_locale %}")
425 << QString::fromUtf8(
426 "Today"
427 " -- 1000 -- 7 May 2005 -- 0.60 -- 4.80 -- 04:05:06 -- 7 May "
428 "2005 "
429 "04:05:06"
430 "Heute"
431 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
432 "04:05"
433 "Aujourd&#39;hui"
434 " -- 1" FR_THOUSAND_SEPARATOR
435 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
436 "07/05/2005 "
437 "04:05")
438 << QString::fromUtf8(
439 "Today"
440 " -- 1,000 -- 5/7/05 -- 0.60 -- 4.80 -- 4:05 AM -- 5/7/05 4:05 "
441 "AM"
442 "Heute"
443 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
444 "04:05"
445 "Aujourd&#39;hui"
446 " -- 1" FR_THOUSAND_SEPARATOR
447 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
448 "07/05/2005 "
449 "04:05")
450 << QString::fromUtf8(
451 "Today"
452 " -- 1,000 -- 07/05/2005 -- 0.60 -- 4.80 -- 04:05 -- 07/05/2005 "
453 "04:05"
454 "Heute"
455 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
456 "04:05"
457 "Aujourd&#39;hui"
458 " -- 1" FR_THOUSAND_SEPARATOR
459 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
460 "07/05/2005 "
461 "04:05")
462 << QString::fromUtf8(
463 "Heute"
464 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
465 "04:05"
466 "Heute"
467 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
468 "04:05"
469 "Aujourd&#39;hui"
470 " -- 1" FR_THOUSAND_SEPARATOR
471 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
472 "07/05/2005 "
473 "04:05")
474 << QString::fromUtf8(
475 "Aujourd&#39;hui"
476 " -- 1" FR_THOUSAND_SEPARATOR
477 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
478 "07/05/2005 "
479 "04:05"
480 "Heute"
481 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
482 "04:05"
483 "Aujourd&#39;hui"
484 " -- 1" FR_THOUSAND_SEPARATOR
485 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
486 "07/05/2005 "
487 "04:05")
488 << dict;
489
490 QTest::newRow("fragment-05")
491 << QString::fromLatin1(
492 "{{ _('Today') }} -- {{ _(integer) }} -- {{ _(date) }} -- {{ "
493 "_(smallFloat) }} -- {{ _(largeFloat) }} -- {{ _(time) }} -- {{ "
494 "_(dateTime) }}"
495 "{% with_locale 'de_DE' %}"
496 "{{ _('Today') }} -- {{ _(integer) }} -- {{ _(date) }} -- {{ "
497 "_(smallFloat) }} -- {{ _(largeFloat) }} -- {{ _(time) }} -- {{ "
498 "_(dateTime) }}"
499 "{% with_locale 'fr_FR' %}"
500 "{{ _('Today') }} -- {{ _(integer) }} -- {{ _(date) }} -- {{ "
501 "_(smallFloat) }} -- {{ _(largeFloat) }} -- {{ _(time) }} -- {{ "
502 "_(dateTime) }}"
503 "{% endwith_locale %}"
504 "{{ _('Today') }} -- {{ _(integer) }} -- {{ _(date) }} -- {{ "
505 "_(smallFloat) }} -- {{ _(largeFloat) }} -- {{ _(time) }} -- {{ "
506 "_(dateTime) }}"
507 "{% endwith_locale %}")
508 << QString::fromUtf8(
509 "Today"
510 " -- 1000 -- 7 May 2005 -- 0.60 -- 4.80 -- 04:05:06 -- 7 May "
511 "2005 "
512 "04:05:06"
513 "Heute"
514 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
515 "04:05"
516 "Aujourd&#39;hui"
517 " -- 1" FR_THOUSAND_SEPARATOR
518 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
519 "07/05/2005 "
520 "04:05"
521 "Heute"
522 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
523 "04:05")
524 << QString::fromUtf8(
525 "Today"
526 " -- 1,000 -- 5/7/05 -- 0.60 -- 4.80 -- 4:05 AM -- 5/7/05 4:05 "
527 "AM"
528 "Heute"
529 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
530 "04:05"
531 "Aujourd&#39;hui"
532 " -- 1" FR_THOUSAND_SEPARATOR
533 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
534 "07/05/2005 "
535 "04:05"
536 "Heute"
537 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
538 "04:05")
539 << QString::fromUtf8(
540 "Today"
541 " -- 1,000 -- 07/05/2005 -- 0.60 -- 4.80 -- 04:05 -- 07/05/2005 "
542 "04:05"
543 "Heute"
544 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
545 "04:05"
546 "Aujourd&#39;hui"
547 " -- 1" FR_THOUSAND_SEPARATOR
548 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
549 "07/05/2005 "
550 "04:05"
551 "Heute"
552 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
553 "04:05")
554 << QString::fromUtf8(
555 "Heute"
556 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
557 "04:05"
558 "Heute"
559 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
560 "04:05"
561 "Aujourd&#39;hui"
562 " -- 1" FR_THOUSAND_SEPARATOR
563 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
564 "07/05/2005 "
565 "04:05"
566 "Heute"
567 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
568 "04:05")
569 << QString::fromUtf8(
570 "Aujourd&#39;hui"
571 " -- 1" FR_THOUSAND_SEPARATOR
572 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
573 "07/05/2005 "
574 "04:05"
575 "Heute"
576 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
577 "04:05"
578 "Aujourd&#39;hui"
579 " -- 1" FR_THOUSAND_SEPARATOR
580 "000 -- 07/05/2005 -- 0,60 -- 4,80 -- 04:05 -- "
581 "07/05/2005 "
582 "04:05"
583 "Heute"
584 " -- 1.000 -- 07.05.05 -- 0,60 -- 4,80 -- 04:05 -- 07.05.05 "
585 "04:05")
586 << dict;
587
588 dict.insert(QStringLiteral("list"), QVariantList{1000});
589 QTest::newRow("fragment-06")
590 << QStringLiteral("{{ _(list.0) }}") << QStringLiteral("1000")
591 << QStringLiteral("1,000") << QStringLiteral("1,000")
592 << QStringLiteral("1.000")
593 << QString::fromUtf8("1" FR_THOUSAND_SEPARATOR "000") << dict;
594
595 dict.clear();
596 dict.insert(QStringLiteral("longlong"), (qlonglong)1000);
597 dict.insert(QStringLiteral("float"), (float)0.6);
598 dict.insert(QStringLiteral("double"), (float)4.8);
599 dict.insert(QStringLiteral("hash"), QVariantHash());
600
601 QTest::newRow("fragment-07")
602 << QStringLiteral(
603 "{{ _(longlong) }} {{ _(float) }} {{ _(double) }}{{ _(hash) }}")
604 << QStringLiteral("1000 0.60 4.80") << QStringLiteral("1,000 0.60 4.80")
605 << QStringLiteral("1,000 0.60 4.80") << QStringLiteral("1.000 0,60 4,80")
606 << QString::fromUtf8("1" FR_THOUSAND_SEPARATOR "000 0,60 4,80") << dict;
607
608 QTest::newRow("fragment-08")
609 << QStringLiteral("{{ 'this'|cut:_(\"i\") }}") << QStringLiteral("ths")
610 << QStringLiteral("ths") << QStringLiteral("ths") << QStringLiteral("ths")
611 << QStringLiteral("ths") << dict;
612
613 // Start testing l10n_filesizeformat
614 // If build against Qt 5.10 or newer, internally QLocale::formattedDataSize() will be used
615 // for values that fit into a qint64. QLocale also supports translating the unit name,
616 // that is the reason why test results differ for Qt version before and after 5.10
617
618 dict.clear();
619 dict.insert(QStringLiteral("fs_int_mib"), 1048576);
620
621 QTest::newRow("fragment-09")
622 << QStringLiteral("{% l10n_filesize fs_int_mib %}")
623 << QStringLiteral("1.05 MB") << QStringLiteral("1.05 MB")
624 << QStringLiteral("1.05 MB") << QStringLiteral("1,05 MB")
625#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
626 << QStringLiteral("1,05 Mo")
627#else
628 << QStringLiteral("1,05 MB")
629#endif
630 << dict;
631
632 QTest::newRow("fragment-10")
633 << QStringLiteral("{% l10n_filesize_var fs_int_mib size_var %}{{ size_var }}")
634 << QStringLiteral("1.05 MB") << QStringLiteral("1.05 MB")
635 << QStringLiteral("1.05 MB") << QStringLiteral("1,05 MB")
636#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
637 << QStringLiteral("1,05 Mo")
638#else
639 << QStringLiteral("1,05 MB")
640#endif
641 << dict;
642
643 QTest::newRow("fragment-11")
644 << QStringLiteral("{% l10n_filesize fs_int_mib 2 %}")
645 << QStringLiteral("1.00 MiB") << QStringLiteral("1.00 MiB")
646 << QStringLiteral("1.00 MiB") << QStringLiteral("1,00 MiB")
647#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
648 << QStringLiteral("1,00 Mio")
649#else
650 << QStringLiteral("1,00 MiB")
651#endif
652 << dict;
653
654 QTest::newRow("fragment-12")
655 << QStringLiteral("{% l10n_filesize_var fs_int_mib 2 size_var %}{{ size_var }}")
656 << QStringLiteral("1.00 MiB") << QStringLiteral("1.00 MiB")
657 << QStringLiteral("1.00 MiB") << QStringLiteral("1,00 MiB")
658#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
659 << QStringLiteral("1,00 Mio")
660#else
661 << QStringLiteral("1,00 MiB")
662#endif
663 << dict;
664
665 QTest::newRow("fragment-13")
666 << QStringLiteral("{% l10n_filesize fs_int_mib 10 3 %}")
667 << QStringLiteral("1.049 MB") << QStringLiteral("1.049 MB")
668 << QStringLiteral("1.049 MB") << QStringLiteral("1,049 MB")
669#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
670 << QStringLiteral("1,049 Mo")
671#else
672 << QStringLiteral("1,049 MB")
673#endif
674 << dict;
675
676 QTest::newRow("fragment-14")
677 << QStringLiteral("{% l10n_filesize_var fs_int_mib 10 3 size_var %}{{ size_var }}")
678 << QStringLiteral("1.049 MB") << QStringLiteral("1.049 MB")
679 << QStringLiteral("1.049 MB") << QStringLiteral("1,049 MB")
680#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
681 << QStringLiteral("1,049 Mo")
682#else
683 << QStringLiteral("1,049 MB")
684#endif
685 << dict;
686
687 QTest::newRow("fragment-15")
688 << QStringLiteral("{% l10n_filesize fs_int_mib 10 2 1024 %}")
689 << QStringLiteral("1.07 GB") << QStringLiteral("1.07 GB")
690 << QStringLiteral("1.07 GB") << QStringLiteral("1,07 GB")
691#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
692 << QStringLiteral("1,07 Go")
693#else
694 << QStringLiteral("1,07 GB")
695#endif
696 << dict;
697
698 QTest::newRow("fragment-16")
699 << QStringLiteral("{% l10n_filesize_var fs_int_mib 10 2 1024 size_var %}{{ size_var }}")
700 << QStringLiteral("1.07 GB") << QStringLiteral("1.07 GB")
701 << QStringLiteral("1.07 GB") << QStringLiteral("1,07 GB")
702#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
703 << QStringLiteral("1,07 Go")
704#else
705 << QStringLiteral("1,07 GB")
706#endif
707 << dict;
708
709 dict.clear();
710 dict.insert(QStringLiteral("fs_float_mib"), 1024.5);
711
712 QTest::newRow("fragment-17")
713 << QStringLiteral("{% l10n_filesize fs_float_mib 10 2 1024 %}")
714 << QStringLiteral("1.05 MB") << QStringLiteral("1.05 MB")
715 << QStringLiteral("1.05 MB") << QStringLiteral("1,05 MB")
716#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
717 << QStringLiteral("1,05 Mo")
718#else
719 << QStringLiteral("1,05 MB")
720#endif
721 << dict;
722
723 QTest::newRow("fragment-18")
724 << QStringLiteral("{% l10n_filesize_var fs_float_mib 10 2 1024 size_var %}{{ size_var }}")
725 << QStringLiteral("1.05 MB") << QStringLiteral("1.05 MB")
726 << QStringLiteral("1.05 MB") << QStringLiteral("1,05 MB")
727#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
728 << QStringLiteral("1,05 Mo")
729#else
730 << QStringLiteral("1,05 MB")
731#endif
732 << dict;
733
734 dict.clear();
735 dict.insert(QStringLiteral("fs_string_mib"), QStringLiteral("1024.5"));
736
737 QTest::newRow("fragment-19")
738 << QStringLiteral("{% l10n_filesize fs_string_mib 10 2 1024 %}")
739 << QStringLiteral("1.05 MB") << QStringLiteral("1.05 MB")
740 << QStringLiteral("1.05 MB") << QStringLiteral("1,05 MB")
741#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
742 << QStringLiteral("1,05 Mo")
743#else
744 << QStringLiteral("1,05 MB")
745#endif
746 << dict;
747
748 QTest::newRow("fragment-20")
749 << QStringLiteral("{% l10n_filesize_var fs_string_mib 10 2 1024 size_var %}{{ size_var }}")
750 << QStringLiteral("1.05 MB") << QStringLiteral("1.05 MB")
751 << QStringLiteral("1.05 MB") << QStringLiteral("1,05 MB")
752#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
753 << QStringLiteral("1,05 Mo")
754#else
755 << QStringLiteral("1,05 MB")
756#endif
757 << dict;
758}
759
760void TestInternationalization::testSafeContent()
761{
762 QFETCH(QString, input);
763 QFETCH(QString, cFragment);
764 QFETCH(QString, frFragment);
765 QFETCH(Dict, dict);
766
767 auto t = m_engine->newTemplate(input, QString());
768 Context c(dict);
769 c.setLocalizer(cLocalizer);
770 QCOMPARE(t->render(&c), cFragment);
771 c.setLocalizer(frLocalizer);
772 QCOMPARE(t->render(&c), frFragment);
773}
774
775void TestInternationalization::testSafeContent_data()
776{
777 QTest::addColumn<QString>("input");
778 QTest::addColumn<QString>("cFragment");
779 QTest::addColumn<QString>("frFragment");
780 QTest::addColumn<Dict>("dict");
781
782 Dict dict;
783 dict.insert(QStringLiteral("date"), QDate(2005, 5, 7));
784
785 QTest::newRow("safe-01") << QStringLiteral("{% i18n 'Today is %1' _(date) %}")
786 << QStringLiteral("Today is 7 May 2005")
787 << QStringLiteral("Aujourd&#39;hui est 07/05/2005")
788 << dict;
789
790 QTest::newRow("safe-02") << QStringLiteral(
791 "{% autoescape off %}{% i18n 'Today is %1' _(date) %}{% endautoescape %}")
792 << QStringLiteral("Today is 7 May 2005")
793 << QStringLiteral("Aujourd'hui est 07/05/2005")
794 << dict;
795
796 QTest::newRow("safe-03") << QStringLiteral(
797 "{% i18n_var 'Today is %1' _(date) as today_greeting %}-{{ "
798 "today_greeting }}-") << QStringLiteral("-Today is 7 May 2005-")
799 << QStringLiteral("-Aujourd&#39;hui est 07/05/2005-")
800 << dict;
801
802 QTest::newRow("safe-04") << QStringLiteral(
803 "{% autoescape off %}{% i18n_var 'Today is %1' _(date) as today_greeting "
804 "%}-{{ today_greeting }}-{% endautoescape %}")
805 << QStringLiteral("-Today is 7 May 2005-")
806 << QStringLiteral("-Aujourd'hui est 07/05/2005-")
807 << dict;
808
809 QTest::newRow("safe-05") << QStringLiteral(
810 "{% with 'Today' as rawText %}-{{ _(rawText) }}-{% endwith %}")
811 << QStringLiteral("-Today-")
812 << QStringLiteral("-Aujourd&#39;hui-") << dict;
813
814 QTest::newRow("safe-06") << QStringLiteral(
815 "{% autoescape off %}{% with 'Today' as rawText %}-{{ _(rawText) }}-{% "
816 "endwith %}{% endautoescape %}")
817 << QStringLiteral("-Today-")
818 << QStringLiteral("-Aujourd'hui-") << dict;
819
820 dict.insert(QStringLiteral("today_text"), QStringLiteral("Today"));
821
822 QTest::newRow("safe-07") << QStringLiteral("-{{ _(today_text) }}-")
823 << QStringLiteral("-Today-")
824 << QStringLiteral("-Aujourd&#39;hui-") << dict;
825
826 QTest::newRow("safe-08") << QStringLiteral(
827 "{% autoescape off %}-{{ _(today_text) }}-{% endautoescape %}")
828 << QStringLiteral("-Today-")
829 << QStringLiteral("-Aujourd'hui-") << dict;
830
831 dict.insert(QStringLiteral("today_and_tomorrow_text"),
832 markSafe(QStringLiteral("Today &amp; tomorrow")));
833
834 QTest::newRow("safe-09")
835 << QStringLiteral("-{{ _(today_and_tomorrow_text) }}-")
836 << QStringLiteral("-Today &amp;amp; tomorrow-")
837 << QStringLiteral("-Aujourd&#39;hui &amp;amp; demain-") << dict;
838
839 QTest::newRow("safe-10") << QStringLiteral(
840 "{% autoescape off %}-{{ _(today_and_tomorrow_text) }}-{% endautoescape "
841 "%}") << QStringLiteral("-Today &amp; tomorrow-")
842 << QStringLiteral("-Aujourd'hui &amp; demain-")
843 << dict;
844
845 QTest::newRow("safe-11") << QStringLiteral(
846 "{% i18nc 'The current day is' 'Today is' %}")
847 << QStringLiteral("Today is")
848 << QStringLiteral("Aujourd&#39;hui est") << dict;
849
850 QTest::newRow("safe-12") << QStringLiteral(
851 "{% autoescape off %}{% i18nc 'The current day is' 'Today is' %}{% "
852 "endautoescape %}") << QStringLiteral("Today is")
853 << QStringLiteral("Aujourd'hui est") << dict;
854
855 QTest::newRow("safe-13") << QStringLiteral(
856 "{% i18nc_var 'The current day is' 'Today is' as today_greeting %}-{{ "
857 "today_greeting }}-") << QStringLiteral("-Today is-")
858 << QStringLiteral("-Aujourd&#39;hui est-") << dict;
859
860 QTest::newRow("safe-14") << QStringLiteral(
861 "{% autoescape off %}{% i18nc_var 'The current day is' 'Today is' as "
862 "today_greeting %}-{{ today_greeting }}-{% endautoescape %}")
863 << QStringLiteral("-Today is-")
864 << QStringLiteral("-Aujourd'hui est-") << dict;
865
866 QTest::newRow("safe-15")
867 << QStringLiteral("{% i18np '%n people today' 1 %}")
868 << QStringLiteral("1 people today") // Not really testing English here.
869 << QStringLiteral("1 personne aujourd&#39;hui") << dict;
870
871 QTest::newRow("safe-16") << QStringLiteral("{% i18np '%n people today' 2 %}")
872 << QStringLiteral("2 people today")
873 << QStringLiteral("2 personnes aujourd&#39;hui")
874 << dict;
875
876 QTest::newRow("safe-17") << QStringLiteral(
877 "{% autoescape off %}{% i18np '%n people today' 1 %}{% endautoescape %}")
878 << QStringLiteral(
879 "1 people today") // Not really testing
880 // English here.
881 << QStringLiteral("1 personne aujourd'hui") << dict;
882
883 QTest::newRow("safe-18") << QStringLiteral(
884 "{% autoescape off %}{% i18np '%n people today' 2 %}{% endautoescape %}")
885 << QStringLiteral("2 people today")
886 << QStringLiteral("2 personnes aujourd'hui") << dict;
887
888 QTest::newRow("safe-19") << QStringLiteral(
889 "{% i18np_var '%n people today' 1 as num_people %}-{{ num_people }}-")
890 << QStringLiteral(
891 "-1 people today-") // Not really testing
892 // English here.
893 << QStringLiteral("-1 personne aujourd&#39;hui-")
894 << dict;
895
896 QTest::newRow("safe-20") << QStringLiteral(
897 "{% i18np_var '%n people today' 2 as num_people %}-{{ num_people }}-")
898 << QStringLiteral("-2 people today-")
899 << QStringLiteral("-2 personnes aujourd&#39;hui-")
900 << dict;
901
902 QTest::newRow("safe-21")
903 << QStringLiteral("{% autoescape off %}{% i18np_var '%n people today' 1 "
904 "as num_people %}-{{ num_people }}-{% endautoescape %}")
905 << QStringLiteral("-1 people today-") // Not really testing English here.
906 << QStringLiteral("-1 personne aujourd'hui-") << dict;
907
908 QTest::newRow("safe-22") << QStringLiteral(
909 "{% autoescape off %}{% i18np_var '%n people today' 2 as num_people "
910 "%}-{{ num_people }}-{% endautoescape %}")
911 << QStringLiteral("-2 people today-")
912 << QStringLiteral("-2 personnes aujourd'hui-")
913 << dict;
914
915 QTest::newRow("safe-23")
916 << QStringLiteral("{% i18ncp 'The number of people who have visited "
917 "today' '%n people visited today' 1 %}")
918 << QStringLiteral(
919 "1 people visited today") // Not really testing English here.
920 << QString::fromUtf8("1 personne a visité aujourd&#39;hui") << dict;
921
922 QTest::newRow("safe-24")
923 << QStringLiteral("{% i18ncp 'The number of people who have visited "
924 "today' '%n people visited today' 2 %}")
925 << QStringLiteral("2 people visited today")
926 << QString::fromUtf8("2 personnes a visité aujourd&#39;hui") << dict;
927
928 QTest::newRow("safe-25")
929 << QStringLiteral(
930 "{% autoescape off %}{% i18ncp 'The number of people who have "
931 "visited today' '%n people visited today' 1 %}{% endautoescape %}")
932 << QStringLiteral(
933 "1 people visited today") // Not really testing English here.
934 << QString::fromUtf8("1 personne a visité aujourd'hui") << dict;
935
936 QTest::newRow("safe-26") << QStringLiteral(
937 "{% autoescape off %}{% i18ncp 'The number of people who have visited "
938 "today' '%n people visited today' 2 %}{% endautoescape %}")
939 << QStringLiteral("2 people visited today")
940 << QString::fromUtf8(
941 "2 personnes a visité aujourd'hui")
942 << dict;
943
944 QTest::newRow("safe-27")
945 << QStringLiteral(
946 "{% i18ncp_var 'The number of people who have visited today' '%n "
947 "people visited today' 1 as num_people %}-{{ num_people }}-")
948 << QStringLiteral(
949 "-1 people visited today-") // Not really testing English here.
950 << QString::fromUtf8("-1 personne a visité aujourd&#39;hui-") << dict;
951
952 QTest::newRow("safe-28") << QStringLiteral(
953 "{% i18ncp_var 'The number of people who have visited today' '%n people "
954 "visited today' 2 as num_people %}-{{ num_people }}-")
955 << QStringLiteral("-2 people visited today-")
956 << QString::fromUtf8(
957 "-2 personnes a visité aujourd&#39;hui-")
958 << dict;
959
960 QTest::newRow("safe-29")
961 << QStringLiteral(
962 "{% autoescape off %}{% i18ncp_var 'The number of people who have "
963 "visited today' '%n people visited today' 1 as num_people %}-{{ "
964 "num_people }}-{% endautoescape %}")
965 << QStringLiteral(
966 "-1 people visited today-") // Not really testing English here.
967 << QString::fromUtf8("-1 personne a visité aujourd'hui-") << dict;
968
969 QTest::newRow("safe-30") << QStringLiteral(
970 "{% autoescape off %}{% i18ncp_var 'The number of people who have "
971 "visited today' '%n people visited today' 2 as num_people %}-{{ "
972 "num_people }}-{% endautoescape %}")
973 << QStringLiteral("-2 people visited today-")
974 << QString::fromUtf8(
975 "-2 personnes a visité aujourd'hui-")
976 << dict;
977}
978
979void TestInternationalization::testFailure()
980{
981 QFETCH(QString, input);
982
983 auto t = m_engine->newTemplate(input, QString());
984 QVERIFY(t->error() != NoError);
985}
986
987void TestInternationalization::testFailure_data()
988{
989 QTest::addColumn<QString>("input");
990
991 QTest::newRow("fail-01") << QStringLiteral(
992 "{% i18np_var '%n people visited today' as num_people %}");
993 QTest::newRow("fail-02") << QStringLiteral(
994 "{% i18ncp_var 'The number of people who have visited today' '%n people "
995 "visited today' as num_people %}");
996 QTest::newRow("fail-03") << QStringLiteral(
997 "{% i18np '%n people visited today' %}");
998 QTest::newRow("fail-04") << QStringLiteral(
999 "{% i18ncp 'The number of people who have visited today' '%n people "
1000 "visited today' %}");
1001}
1002
1003void TestInternationalization::testDates()
1004{
1005 QFETCH(QDate, date);
1006 QFETCH(QString, cDate);
1007 QFETCH(QString, en_USDate);
1008 QFETCH(QString, en_GBDate);
1009 QFETCH(QString, deDate);
1010 QFETCH(QString, frDate);
1011
1012 QCOMPARE(nullLocalizer->localizeDate(date), date.toString());
1013 QCOMPARE(cLocalizer->localizeDate(date), cDate);
1014 QCOMPARE(en_USLocalizer->localizeDate(date), en_USDate);
1015 QCOMPARE(en_GBLocalizer->localizeDate(date), en_GBDate);
1016 QCOMPARE(deLocalizer->localizeDate(date), deDate);
1017 QCOMPARE(frLocalizer->localizeDate(date), frDate);
1018}
1019
1020void TestInternationalization::testDates_data()
1021{
1022 QTest::addColumn<QDate>("date");
1023 QTest::addColumn<QString>("cDate");
1024 QTest::addColumn<QString>("en_USDate");
1025 QTest::addColumn<QString>("en_GBDate");
1026 QTest::addColumn<QString>("deDate");
1027 QTest::addColumn<QString>("frDate");
1028
1029 QTest::newRow("date-01") << QDate(2010, 5, 9) << QStringLiteral("9 May 2010")
1030 << QStringLiteral("5/9/10")
1031 << QStringLiteral("09/05/2010")
1032 << QStringLiteral("09.05.10")
1033 << QStringLiteral("09/05/2010");
1034
1035 QTest::newRow("date-02") << QDate(2010, 10, 11)
1036 << QStringLiteral("11 Oct 2010")
1037 << QStringLiteral("10/11/10")
1038 << QStringLiteral("11/10/2010")
1039 << QStringLiteral("11.10.10")
1040 << QStringLiteral("11/10/2010");
1041}
1042
1043void TestInternationalization::testIntegers()
1044{
1045 QFETCH(int, integer);
1046 QFETCH(QString, nullInteger);
1047 QFETCH(QString, cInteger);
1048 QFETCH(QString, en_USInteger);
1049 QFETCH(QString, en_GBInteger);
1050 QFETCH(QString, deInteger);
1051 QFETCH(QString, frInteger);
1052
1053 QCOMPARE(nullLocalizer->localizeNumber(integer), nullInteger);
1054 QCOMPARE(cLocalizer->localizeNumber(integer), cInteger);
1055 QCOMPARE(en_USLocalizer->localizeNumber(integer), en_USInteger);
1056 QCOMPARE(en_GBLocalizer->localizeNumber(integer), en_GBInteger);
1057 QCOMPARE(deLocalizer->localizeNumber(integer), deInteger);
1058 QCOMPARE(frLocalizer->localizeNumber(integer), frInteger);
1059}
1060
1061void TestInternationalization::testIntegers_data()
1062{
1063 QTest::addColumn<int>("integer");
1064 QTest::addColumn<QString>("nullInteger");
1065 QTest::addColumn<QString>("cInteger");
1066 QTest::addColumn<QString>("en_USInteger");
1067 QTest::addColumn<QString>("en_GBInteger");
1068 QTest::addColumn<QString>("deInteger");
1069 QTest::addColumn<QString>("frInteger");
1070
1071 QTest::newRow("integer-01")
1072 << 7 << QStringLiteral("7") << QStringLiteral("7") << QStringLiteral("7")
1073 << QStringLiteral("7") << QStringLiteral("7") << QStringLiteral("7");
1074
1075 QTest::newRow("integer-02")
1076 << 7000 << QStringLiteral("7000") << QStringLiteral("7000")
1077 << QStringLiteral("7,000") << QStringLiteral("7,000")
1078 << QStringLiteral("7.000")
1079 << QString::fromUtf8("7" FR_THOUSAND_SEPARATOR "000");
1080}
1081
1082void TestInternationalization::testFloats()
1083{
1084 QFETCH(qreal, floatingPoint);
1085 QFETCH(QString, nullFloatingPoint);
1086 QFETCH(QString, cFloatingPoint);
1087 QFETCH(QString, en_USFloatingPoint);
1088 QFETCH(QString, en_GBFloatingPoint);
1089 QFETCH(QString, deFloatingPoint);
1090 QFETCH(QString, frFloatingPoint);
1091
1092 QCOMPARE(nullLocalizer->localizeNumber(floatingPoint), nullFloatingPoint);
1093 QCOMPARE(cLocalizer->localizeNumber(floatingPoint), cFloatingPoint);
1094 QCOMPARE(en_USLocalizer->localizeNumber(floatingPoint), en_USFloatingPoint);
1095 QCOMPARE(en_GBLocalizer->localizeNumber(floatingPoint), en_GBFloatingPoint);
1096 QCOMPARE(deLocalizer->localizeNumber(floatingPoint), deFloatingPoint);
1097 QCOMPARE(frLocalizer->localizeNumber(floatingPoint), frFloatingPoint);
1098}
1099
1100void TestInternationalization::testFloats_data()
1101{
1102 QTest::addColumn<qreal>("floatingPoint");
1103 QTest::addColumn<QString>("nullFloatingPoint");
1104 QTest::addColumn<QString>("cFloatingPoint");
1105 QTest::addColumn<QString>("en_USFloatingPoint");
1106 QTest::addColumn<QString>("en_GBFloatingPoint");
1107 QTest::addColumn<QString>("deFloatingPoint");
1108 QTest::addColumn<QString>("frFloatingPoint");
1109
1110 QTest::newRow("float-01")
1111 << qreal(7.4) << QStringLiteral("7.4") << QStringLiteral("7.40")
1112 << QStringLiteral("7.40") << QStringLiteral("7.40")
1113 << QStringLiteral("7,40") << QStringLiteral("7,40");
1114}
1115
1116void TestInternationalization::testTimes()
1117{
1118 QFETCH(QTime, time);
1119 QFETCH(QString, nullTime);
1120 QFETCH(QString, cTime);
1121 QFETCH(QString, en_USTime);
1122 QFETCH(QString, en_GBTime);
1123 QFETCH(QString, deTime);
1124 QFETCH(QString, frTime);
1125
1126 QCOMPARE(nullLocalizer->localizeTime(time), nullTime);
1127 QCOMPARE(cLocalizer->localizeTime(time), cTime);
1128 QCOMPARE(en_USLocalizer->localizeTime(time), en_USTime);
1129 QCOMPARE(en_GBLocalizer->localizeTime(time), en_GBTime);
1130 QCOMPARE(deLocalizer->localizeTime(time), deTime);
1131 QCOMPARE(frLocalizer->localizeTime(time), frTime);
1132}
1133
1134void TestInternationalization::testTimes_data()
1135{
1136 QTest::addColumn<QTime>("time");
1137 QTest::addColumn<QString>("nullTime");
1138 QTest::addColumn<QString>("cTime");
1139 QTest::addColumn<QString>("en_USTime");
1140 QTest::addColumn<QString>("en_GBTime");
1141 QTest::addColumn<QString>("deTime");
1142 QTest::addColumn<QString>("frTime");
1143
1144 QTest::newRow("time-01") << QTime(5, 6, 7) << QStringLiteral("05:06:07")
1145 << QStringLiteral("05:06:07")
1146 << QStringLiteral("5:06 AM")
1147 << QStringLiteral("05:06") << QStringLiteral("05:06")
1148 << QStringLiteral("05:06");
1149
1150 QTest::newRow("time-02") << QTime(11, 12, 13) << QStringLiteral("11:12:13")
1151 << QStringLiteral("11:12:13")
1152 << QStringLiteral("11:12 AM")
1153 << QStringLiteral("11:12") << QStringLiteral("11:12")
1154 << QStringLiteral("11:12");
1155
1156 QTest::newRow("time-03") << QTime(15, 12, 13) << QStringLiteral("15:12:13")
1157 << QStringLiteral("15:12:13")
1158 << QStringLiteral("3:12 PM")
1159 << QStringLiteral("15:12") << QStringLiteral("15:12")
1160 << QStringLiteral("15:12");
1161}
1162
1163void TestInternationalization::testDateTimes()
1164{
1165 QFETCH(QDateTime, dateTime);
1166 QFETCH(QString, cDateTime);
1167 QFETCH(QString, en_USDateTime);
1168 QFETCH(QString, en_GBDateTime);
1169 QFETCH(QString, deDateTime);
1170 QFETCH(QString, frDateTime);
1171
1172 QCOMPARE(nullLocalizer->localizeDateTime(dateTime), dateTime.toString());
1173 QCOMPARE(cLocalizer->localizeDateTime(dateTime), cDateTime);
1174 QCOMPARE(en_USLocalizer->localizeDateTime(dateTime), en_USDateTime);
1175 QCOMPARE(en_GBLocalizer->localizeDateTime(dateTime), en_GBDateTime);
1176 QCOMPARE(deLocalizer->localizeDateTime(dateTime), deDateTime);
1177 QCOMPARE(frLocalizer->localizeDateTime(dateTime), frDateTime);
1178}
1179
1180void TestInternationalization::testDateTimes_data()
1181{
1182 QTest::addColumn<QDateTime>("dateTime");
1183 QTest::addColumn<QString>("cDateTime");
1184 QTest::addColumn<QString>("en_USDateTime");
1185 QTest::addColumn<QString>("en_GBDateTime");
1186 QTest::addColumn<QString>("deDateTime");
1187 QTest::addColumn<QString>("frDateTime");
1188
1189 QTest::newRow("datetime-01")
1190 << QDateTime(QDate(2005, 6, 7), QTime(5, 6, 7))
1191 << QStringLiteral("7 Jun 2005 05:06:07")
1192 << QStringLiteral("6/7/05 5:06 AM") << QStringLiteral("07/06/2005 05:06")
1193 << QStringLiteral("07.06.05 05:06") << QStringLiteral("07/06/2005 05:06");
1194
1195 QTest::newRow("datetime-02")
1196 << QDateTime(QDate(2005, 6, 7), QTime(11, 12, 13))
1197 << QStringLiteral("7 Jun 2005 11:12:13")
1198 << QStringLiteral("6/7/05 11:12 AM") << QStringLiteral("07/06/2005 11:12")
1199 << QStringLiteral("07.06.05 11:12") << QStringLiteral("07/06/2005 11:12");
1200
1201 QTest::newRow("datetime-03")
1202 << QDateTime(QDate(2005, 6, 7), QTime(15, 12, 13))
1203 << QStringLiteral("7 Jun 2005 15:12:13")
1204 << QStringLiteral("6/7/05 3:12 PM") << QStringLiteral("07/06/2005 15:12")
1205 << QStringLiteral("07.06.05 15:12") << QStringLiteral("07/06/2005 15:12");
1206
1207 QTest::newRow("datetime-04")
1208 << QDateTime(QDate(2005, 10, 11), QTime(5, 6, 7))
1209 << QStringLiteral("11 Oct 2005 05:06:07")
1210 << QStringLiteral("10/11/05 5:06 AM")
1211 << QStringLiteral("11/10/2005 05:06") << QStringLiteral("11.10.05 05:06")
1212 << QStringLiteral("11/10/2005 05:06");
1213
1214 QTest::newRow("datetime-05")
1215 << QDateTime(QDate(2005, 10, 11), QTime(11, 12, 13))
1216 << QStringLiteral("11 Oct 2005 11:12:13")
1217 << QStringLiteral("10/11/05 11:12 AM")
1218 << QStringLiteral("11/10/2005 11:12") << QStringLiteral("11.10.05 11:12")
1219 << QStringLiteral("11/10/2005 11:12");
1220
1221 QTest::newRow("datetime-06")
1222 << QDateTime(QDate(2005, 10, 11), QTime(15, 12, 13))
1223 << QStringLiteral("11 Oct 2005 15:12:13")
1224 << QStringLiteral("10/11/05 3:12 PM")
1225 << QStringLiteral("11/10/2005 15:12") << QStringLiteral("11.10.05 15:12")
1226 << QStringLiteral("11/10/2005 15:12");
1227}
1228
1229QTEST_MAIN(TestInternationalization)
1230#include "testinternationalization.moc"
The Context class holds the context to render a Template with.
Definition context.h:119
std::shared_ptr< AbstractLocalizer > localizer() const
Definition context.cpp:230
void setLocalizer(std::shared_ptr< AbstractLocalizer > localizer)
Definition context.cpp:220
Cutelee::Engine is the main entry point for creating Cutelee Templates.
Definition engine.h:121
void setPluginPaths(const QStringList &dirs)
Definition engine.cpp:87
Template newTemplate(const QString &content, const QString &name) const
Definition engine.cpp:391
void addDefaultLibrary(const QString &libName)
Definition engine.cpp:120
Provides internationalization based on QLocale and QTranslator.
Definition qtlocalizer.h:56
The Cutelee namespace holds all public Cutelee API.
Definition Mainpage.dox:8
Cutelee::SafeString markSafe(const Cutelee::SafeString &input)
Definition util.cpp:90
Utility functions used throughout Cutelee.