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 
32 using 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
47 public:
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 
86 private 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 
110 private:
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 
121 void TestInternationalization::initTestCase() { Q_INIT_RESOURCE(testresource); }
122 
123 void 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 
133 void 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 
176 void 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 
314 typedef QHash<QString, QVariant> Dict;
315 
316 void 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 
340 void 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 
760 void 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 
775 void 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 
979 void TestInternationalization::testFailure()
980 {
981  QFETCH(QString, input);
982 
983  auto t = m_engine->newTemplate(input, QString());
984  QVERIFY(t->error() != NoError);
985 }
986 
987 void 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 
1003 void 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 
1020 void 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 
1043 void 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 
1061 void 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 
1082 void 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 
1100 void 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 
1116 void 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 
1134 void 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 
1163 void 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 
1180 void 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 
1229 QTEST_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
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.