1 /*
2     Copyright 2005 Brad Hards <bradh@kde.org>
3     Copyright 2007, 2009, 2010, 2011 John Layt <john@layt.net>
4 
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Library General Public
7     License as published by the Free Software Foundation; either
8     version 2 of the License, or (at your option) any later version.
9 
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13     Library General Public License for more details.
14 
15     You should have received a copy of the GNU Library General Public License
16     along with this library; see the file COPYING.LIB.  If not, write to
17     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18     Boston, MA 02110-1301, USA.
19 */
20 
21 #include "kcalendartest.h"
22 
23 #include <locale.h>
24 
25 #include <QString>
26 
27 #include <QTest>
28 #include "kcalendarsystem.h"
29 #include "klocalizeddate.h"
30 #include "klocalizedstring.h"
31 #include "kconfiggroup.h"
32 
QTEST_MAIN(KCalendarTest)33 QTEST_MAIN(KCalendarTest)
34 
35 void KCalendarTest::testTypes()
36 {
37     const KCalendarSystem *calendar;
38 
39     calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
40     QCOMPARE(calendar->calendarType(), QString("gregorian"));
41     QCOMPARE(calendar->calendarSystem(), KLocale::GregorianCalendar);
42     delete calendar;
43     calendar = KCalendarSystem::create(KLocale::CopticCalendar);
44     QCOMPARE(calendar->calendarType(), QString("coptic"));
45     QCOMPARE(calendar->calendarSystem(), KLocale::CopticCalendar);
46     delete calendar;
47     calendar = KCalendarSystem::create(KLocale::EthiopianCalendar);
48     QCOMPARE(calendar->calendarType(), QString("ethiopian"));
49     QCOMPARE(calendar->calendarSystem(), KLocale::EthiopianCalendar);
50     delete calendar;
51     calendar = KCalendarSystem::create(KLocale::HebrewCalendar);
52     QCOMPARE(calendar->calendarType(), QString("hebrew"));
53     QCOMPARE(calendar->calendarSystem(), KLocale::HebrewCalendar);
54     delete calendar;
55     calendar = KCalendarSystem::create(KLocale::IslamicCivilCalendar);
56     QCOMPARE(calendar->calendarType(), QString("hijri"));
57     QCOMPARE(calendar->calendarSystem(), KLocale::IslamicCivilCalendar);
58     delete calendar;
59     calendar = KCalendarSystem::create(KLocale::IndianNationalCalendar);
60     QCOMPARE(calendar->calendarType(), QString("indian-national"));
61     QCOMPARE(calendar->calendarSystem(), KLocale::IndianNationalCalendar);
62     delete calendar;
63     calendar = KCalendarSystem::create(KLocale::JalaliCalendar);
64     QCOMPARE(calendar->calendarType(), QString("jalali"));
65     QCOMPARE(calendar->calendarSystem(), KLocale::JalaliCalendar);
66     delete calendar;
67     calendar = KCalendarSystem::create(KLocale::JapaneseCalendar);
68     QCOMPARE(calendar->calendarType(), QString("japanese"));
69     QCOMPARE(calendar->calendarSystem(), KLocale::JapaneseCalendar);
70     delete calendar;
71     calendar = KCalendarSystem::create(KLocale::JulianCalendar);
72     QCOMPARE(calendar->calendarType(), QString("julian"));
73     QCOMPARE(calendar->calendarSystem(), KLocale::JulianCalendar);
74     delete calendar;
75     calendar = KCalendarSystem::create(KLocale::MinguoCalendar);
76     QCOMPARE(calendar->calendarType(), QString("minguo"));
77     QCOMPARE(calendar->calendarSystem(), KLocale::MinguoCalendar);
78     delete calendar;
79     calendar = KCalendarSystem::create(KLocale::ThaiCalendar);
80     QCOMPARE(calendar->calendarType(), QString("thai"));
81     QCOMPARE(calendar->calendarSystem(), KLocale::ThaiCalendar);
82     delete calendar;
83     calendar = KCalendarSystem::create(KLocale::QDateCalendar);
84     QCOMPARE(calendar->calendarType(), QString("gregorian"));
85     QCOMPARE(calendar->calendarSystem(), KLocale::GregorianCalendar);
86     delete calendar;
87 
88     QList<KLocale::CalendarSystem> list = KCalendarSystem::calendarSystemsList();
89     QCOMPARE(list.count(), 11);
90     QVERIFY(list.contains(KLocale::GregorianCalendar));
91     QVERIFY(list.contains(KLocale::CopticCalendar));
92     QVERIFY(list.contains(KLocale::EthiopianCalendar));
93     QVERIFY(list.contains(KLocale::HebrewCalendar));
94     QVERIFY(list.contains(KLocale::IslamicCivilCalendar));
95     QVERIFY(list.contains(KLocale::IndianNationalCalendar));
96     QVERIFY(list.contains(KLocale::JalaliCalendar));
97     QVERIFY(list.contains(KLocale::JapaneseCalendar));
98     QVERIFY(list.contains(KLocale::JulianCalendar));
99     QVERIFY(list.contains(KLocale::MinguoCalendar));
100     QVERIFY(list.contains(KLocale::ThaiCalendar));
101     QVERIFY(list.contains(KLocale::QDateCalendar));
102 
103     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::GregorianCalendar),      QString("Gregorian"));
104     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::CopticCalendar),         QString("Coptic"));
105     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::EthiopianCalendar),      QString("Ethiopian"));
106     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::HebrewCalendar),         QString("Hebrew"));
107     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::IslamicCivilCalendar),   QString("Islamic / Hijri (Civil)"));
108     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::IndianNationalCalendar), QString("Indian National"));
109     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::JalaliCalendar),         QString("Jalali"));
110     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::JapaneseCalendar),       QString("Japanese"));
111     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::JulianCalendar),         QString("Julian"));
112     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::MinguoCalendar),         QString("Taiwanese"));
113     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::ThaiCalendar),           QString("Thai"));
114     QCOMPARE(KCalendarSystem::calendarLabel(KLocale::QDateCalendar),          QString("Gregorian"));
115 
116 }
117 
testFormatDate()118 void KCalendarTest::testFormatDate()
119 {
120     KConfigGroup lcg(KSharedConfig::openConfig(), QString("Locale"));
121     KConfigGroup cg = lcg.group(QString("KCalendarSystem %1").arg("gregorian"));
122     cg.deleteGroup();
123 
124     KLocale *locale = new KLocale(*KLocale::global());
125     locale->setDateFormatShort("%y-%m-%d");
126     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar, locale);
127 
128     //Test default settings
129     QDate testDate(2005, 10, 20);
130     QCOMPARE(calendar->formatDate(testDate, "%Y"), QString("2005"));
131     QCOMPARE(calendar->formatDate(testDate, "%C"), QString("20"));
132     QCOMPARE(calendar->formatDate(testDate, "%y"), QString("05"));
133     QCOMPARE(calendar->formatDate(testDate, "%m"), QString("10"));
134     QCOMPARE(calendar->formatDate(testDate, "%n"), QString("10"));
135     QCOMPARE(calendar->formatDate(testDate, "%d"), QString("20"));
136     QCOMPARE(calendar->formatDate(testDate, "%e"), QString("20"));
137     QCOMPARE(calendar->formatDate(testDate, "%B"), QString("October"));
138     QCOMPARE(calendar->formatDate(testDate, "%b"), QString("Oct"));
139     QCOMPARE(calendar->formatDate(testDate, "%h"), QString("Oct"));
140     QCOMPARE(calendar->formatDate(testDate, "%A"), QString("Thursday"));
141     QCOMPARE(calendar->formatDate(testDate, "%a"), QString("Thu"));
142     QCOMPARE(calendar->formatDate(testDate, "%j"), QString("293"));
143     QCOMPARE(calendar->formatDate(testDate, "%V"), QString("42"));
144     QCOMPARE(calendar->formatDate(testDate, "%G"), QString("2005"));
145     QCOMPARE(calendar->formatDate(testDate, "%g"), QString("05"));
146     QCOMPARE(calendar->formatDate(testDate, "%u"), QString("4"));
147     QCOMPARE(calendar->formatDate(testDate, "%D"), QString("10/20/05"));
148     QCOMPARE(calendar->formatDate(testDate, "%F"), QString("2005-10-20"));
149     QCOMPARE(calendar->formatDate(testDate, "%x"), QString("05-10-20"));
150     QCOMPARE(calendar->formatDate(testDate, "%%"), QString("%"));
151     QCOMPARE(calendar->formatDate(testDate, "%t"), QString("\t"));
152 
153     QCOMPARE(calendar->formatDate(testDate, "-%Y-%C-%y-%m-%n-%d-%e-%B-%b-%h-%A-%a-%j-%V-%G-%g-%u:%D:%F:%x:%%-%t-"),
154              QString("-2005-20-05-10-10-20-20-October-Oct-Oct-Thursday-Thu-293-42-2005-05-4:10/20/05:2005-10-20:05-10-20:%-\t-"));
155 
156     //Test the minimum widths are respected
157     QCOMPARE(calendar->formatDate(testDate, "%1Y"),  QString("2005"));
158     QCOMPARE(calendar->formatDate(testDate, "%1C"),  QString("20"));
159     QCOMPARE(calendar->formatDate(testDate, "%1y"),  QString("05"));
160     QCOMPARE(calendar->formatDate(testDate, "%1m"),  QString("10"));
161     QCOMPARE(calendar->formatDate(testDate, "%1n"),  QString("10"));
162     QCOMPARE(calendar->formatDate(testDate, "%1d"),  QString("20"));
163     QCOMPARE(calendar->formatDate(testDate, "%1e"),  QString("20"));
164     QCOMPARE(calendar->formatDate(testDate, "%01B"), QString("October"));
165     QCOMPARE(calendar->formatDate(testDate, "%01b"), QString("Oct"));
166     QCOMPARE(calendar->formatDate(testDate, "%01h"), QString("Oct"));
167     QCOMPARE(calendar->formatDate(testDate, "%01A"), QString("Thursday"));
168     QCOMPARE(calendar->formatDate(testDate, "%01a"), QString("Thu"));
169     QCOMPARE(calendar->formatDate(testDate, "%1j"),  QString("293"));
170     QCOMPARE(calendar->formatDate(testDate, "%1V"),  QString("42"));
171     QCOMPARE(calendar->formatDate(testDate, "%1G"),  QString("2005"));
172     QCOMPARE(calendar->formatDate(testDate, "%1g"),  QString("05"));
173     QCOMPARE(calendar->formatDate(testDate, "%1u"),  QString("4"));
174     QCOMPARE(calendar->formatDate(testDate, "%1D"),  QString("10/20/05"));
175     QCOMPARE(calendar->formatDate(testDate, "%1F"),  QString("2005-10-20"));
176     QCOMPARE(calendar->formatDate(testDate, "%1x"),  QString("05-10-20"));
177     QCOMPARE(calendar->formatDate(testDate, "%1%"),  QString("%"));
178     QCOMPARE(calendar->formatDate(testDate, "%1t"),  QString("\t"));
179 
180     testDate.setDate(2005, 1, 2);
181 
182     //Test various padding options with minimum width
183     QCOMPARE(calendar->formatDate(testDate, "%"),     QString(""));
184     QCOMPARE(calendar->formatDate(testDate, "%m"),    QString("01"));
185     QCOMPARE(calendar->formatDate(testDate, "%n"),    QString("1"));
186     QCOMPARE(calendar->formatDate(testDate, "%d"),    QString("02"));
187     QCOMPARE(calendar->formatDate(testDate, "%e"),    QString("2"));
188     QCOMPARE(calendar->formatDate(testDate, "%j"),    QString("002"));
189     QCOMPARE(calendar->formatDate(testDate, "%_m"),   QString(" 1"));
190     QCOMPARE(calendar->formatDate(testDate, "%_n"),   QString("1"));
191     QCOMPARE(calendar->formatDate(testDate, "%_d"),   QString(" 2"));
192     QCOMPARE(calendar->formatDate(testDate, "%_e"),   QString("2"));
193     QCOMPARE(calendar->formatDate(testDate, "%_j"),   QString("  2"));
194     QCOMPARE(calendar->formatDate(testDate, "%-m"),   QString("1"));
195     QCOMPARE(calendar->formatDate(testDate, "%-n"),   QString("1"));
196     QCOMPARE(calendar->formatDate(testDate, "%-d"),   QString("2"));
197     QCOMPARE(calendar->formatDate(testDate, "%-e"),   QString("2"));
198     QCOMPARE(calendar->formatDate(testDate, "%-j"),   QString("2"));
199     QCOMPARE(calendar->formatDate(testDate, "%0m"),   QString("01"));
200     QCOMPARE(calendar->formatDate(testDate, "%0n"),   QString("1"));
201     QCOMPARE(calendar->formatDate(testDate, "%0d"),   QString("02"));
202     QCOMPARE(calendar->formatDate(testDate, "%0e"),   QString("2"));
203     QCOMPARE(calendar->formatDate(testDate, "%0j"),   QString("002"));
204     QCOMPARE(calendar->formatDate(testDate, "%-_j"),  QString("  2"));
205     QCOMPARE(calendar->formatDate(testDate, "%_-j"),  QString("2"));
206     QCOMPARE(calendar->formatDate(testDate, "%-_0j"), QString("002"));
207 
208     //Test various padding options with width override
209     QCOMPARE(calendar->formatDate(testDate, "%1m"),   QString("01"));
210     QCOMPARE(calendar->formatDate(testDate, "%-05m"), QString("00001"));
211     QCOMPARE(calendar->formatDate(testDate, "%10m"),  QString("0000000001"));
212     QCOMPARE(calendar->formatDate(testDate, "%15m"),  QString("000000000000001"));
213     QCOMPARE(calendar->formatDate(testDate, "%-5m"),  QString("1"));
214     QCOMPARE(calendar->formatDate(testDate, "%_5m"),  QString("    1"));
215     QCOMPARE(calendar->formatDate(testDate, "%_15m"), QString("              1"));
216     QCOMPARE(calendar->formatDate(testDate, "%1B"),   QString("January"));
217     QCOMPARE(calendar->formatDate(testDate, "%15B"),  QString("        January"));
218     QCOMPARE(calendar->formatDate(testDate, "%-15B"), QString("January"));
219     QCOMPARE(calendar->formatDate(testDate, "%_15B"), QString("        January"));
220     QCOMPARE(calendar->formatDate(testDate, "%015B"), QString("00000000January"));
221 
222     //Test week number in previous year
223     QCOMPARE(calendar->formatDate(testDate, "%V"), QString("53"));
224     QCOMPARE(calendar->formatDate(testDate, "%G"), QString("2004"));
225     QCOMPARE(calendar->formatDate(testDate, "%g"), QString("04"));
226 
227     //test case overrides
228     QCOMPARE(calendar->formatDate(testDate, "%B"),  QString("January"));
229     QCOMPARE(calendar->formatDate(testDate, "%^B"), QString("JANUARY"));
230     QCOMPARE(calendar->formatDate(testDate, "%#B"), QString("JANUARY"));
231     QCOMPARE(calendar->formatDate(testDate, "%m"),  QString("01"));
232     QCOMPARE(calendar->formatDate(testDate, "%^m"), QString("01"));
233     QCOMPARE(calendar->formatDate(testDate, "%#m"), QString("01"));
234 
235     //Test various year options
236 
237     testDate.setDate(789, 1, 1);
238     QCOMPARE(calendar->formatDate(testDate, "%Y"),  QString("0789"));
239     QCOMPARE(calendar->formatDate(testDate, "%C"),  QString("07"));
240     QCOMPARE(calendar->formatDate(testDate, "%y"),  QString("89"));
241     QCOMPARE(calendar->formatDate(testDate, "%-Y"), QString("789"));
242     QCOMPARE(calendar->formatDate(testDate, "%-C"), QString("7"));
243     QCOMPARE(calendar->formatDate(testDate, "%-y"), QString("89"));
244     QCOMPARE(calendar->formatDate(testDate, "%_Y"), QString(" 789"));
245     QCOMPARE(calendar->formatDate(testDate, "%_C"), QString(" 7"));
246     QCOMPARE(calendar->formatDate(testDate, "%_y"), QString("89"));
247     QCOMPARE(calendar->formatDate(testDate, "%0Y"), QString("0789"));
248     QCOMPARE(calendar->formatDate(testDate, "%0C"), QString("07"));
249     QCOMPARE(calendar->formatDate(testDate, "%0y"), QString("89"));
250     QCOMPARE(calendar->formatDate(testDate, "%EC"), QString("AD"));
251     QCOMPARE(calendar->formatDate(testDate, "%Ey"), QString("789"));
252     QCOMPARE(calendar->formatDate(testDate, "%EY"), QString("789 AD"));
253 
254     testDate.setDate(709, 1, 1);
255     QCOMPARE(calendar->formatDate(testDate, "%Y"),  QString("0709"));
256     QCOMPARE(calendar->formatDate(testDate, "%C"),  QString("07"));
257     QCOMPARE(calendar->formatDate(testDate, "%y"),  QString("09"));
258     QCOMPARE(calendar->formatDate(testDate, "%-Y"), QString("709"));
259     QCOMPARE(calendar->formatDate(testDate, "%-C"), QString("7"));
260     QCOMPARE(calendar->formatDate(testDate, "%-y"), QString("9"));
261     QCOMPARE(calendar->formatDate(testDate, "%_Y"), QString(" 709"));
262     QCOMPARE(calendar->formatDate(testDate, "%_C"), QString(" 7"));
263     QCOMPARE(calendar->formatDate(testDate, "%_y"), QString(" 9"));
264     QCOMPARE(calendar->formatDate(testDate, "%0Y"), QString("0709"));
265     QCOMPARE(calendar->formatDate(testDate, "%0C"), QString("07"));
266     QCOMPARE(calendar->formatDate(testDate, "%0y"), QString("09"));
267     QCOMPARE(calendar->formatDate(testDate, "%EC"), QString("AD"));
268     QCOMPARE(calendar->formatDate(testDate, "%Ey"), QString("709"));
269     QCOMPARE(calendar->formatDate(testDate, "%EY"), QString("709 AD"));
270 
271     testDate.setDate(89, 1, 1);
272     QCOMPARE(calendar->formatDate(testDate, "%Y"),  QString("0089"));
273     QCOMPARE(calendar->formatDate(testDate, "%C"),  QString("00"));
274     QCOMPARE(calendar->formatDate(testDate, "%y"),  QString("89"));
275     QCOMPARE(calendar->formatDate(testDate, "%-Y"), QString("89"));
276     QCOMPARE(calendar->formatDate(testDate, "%-C"), QString("0"));
277     QCOMPARE(calendar->formatDate(testDate, "%-y"), QString("89"));
278     QCOMPARE(calendar->formatDate(testDate, "%_Y"), QString("  89"));
279     QCOMPARE(calendar->formatDate(testDate, "%_C"), QString(" 0"));
280     QCOMPARE(calendar->formatDate(testDate, "%_y"), QString("89"));
281     QCOMPARE(calendar->formatDate(testDate, "%0Y"), QString("0089"));
282     QCOMPARE(calendar->formatDate(testDate, "%0C"), QString("00"));
283     QCOMPARE(calendar->formatDate(testDate, "%0y"), QString("89"));
284     QCOMPARE(calendar->formatDate(testDate, "%EC"), QString("AD"));
285     QCOMPARE(calendar->formatDate(testDate, "%Ey"), QString("89"));
286     QCOMPARE(calendar->formatDate(testDate, "%EY"), QString("89 AD"));
287 
288     testDate.setDate(9, 1, 1);
289     QCOMPARE(calendar->formatDate(testDate, "%Y"),  QString("0009"));
290     QCOMPARE(calendar->formatDate(testDate, "%C"),  QString("00"));
291     QCOMPARE(calendar->formatDate(testDate, "%y"),  QString("09"));
292     QCOMPARE(calendar->formatDate(testDate, "%-Y"), QString("9"));
293     QCOMPARE(calendar->formatDate(testDate, "%-C"), QString("0"));
294     QCOMPARE(calendar->formatDate(testDate, "%-y"), QString("9"));
295     QCOMPARE(calendar->formatDate(testDate, "%_Y"), QString("   9"));
296     QCOMPARE(calendar->formatDate(testDate, "%_C"), QString(" 0"));
297     QCOMPARE(calendar->formatDate(testDate, "%_y"), QString(" 9"));
298     QCOMPARE(calendar->formatDate(testDate, "%0Y"), QString("0009"));
299     QCOMPARE(calendar->formatDate(testDate, "%0C"), QString("00"));
300     QCOMPARE(calendar->formatDate(testDate, "%0y"), QString("09"));
301     QCOMPARE(calendar->formatDate(testDate, "%EC"), QString("AD"));
302     QCOMPARE(calendar->formatDate(testDate, "%Ey"), QString("9"));
303     QCOMPARE(calendar->formatDate(testDate, "%EY"), QString("9 AD"));
304 
305     testDate.setDate(-9, 1, 1);
306     QCOMPARE(calendar->formatDate(testDate, "%Y"),  QString("-0009"));
307     QCOMPARE(calendar->formatDate(testDate, "%C"),  QString("-00"));
308     QCOMPARE(calendar->formatDate(testDate, "%y"),  QString("-09"));
309     QCOMPARE(calendar->formatDate(testDate, "%-Y"), QString("-9"));
310     QCOMPARE(calendar->formatDate(testDate, "%-C"), QString("-0"));
311     QCOMPARE(calendar->formatDate(testDate, "%-y"), QString("-9"));
312     QCOMPARE(calendar->formatDate(testDate, "%_Y"), QString("  -9"));
313     QCOMPARE(calendar->formatDate(testDate, "%_C"), QString("-0"));
314     QCOMPARE(calendar->formatDate(testDate, "%_y"), QString("-9"));
315     QCOMPARE(calendar->formatDate(testDate, "%0Y"), QString("-0009"));
316     QCOMPARE(calendar->formatDate(testDate, "%0C"), QString("-00"));
317     QCOMPARE(calendar->formatDate(testDate, "%0y"), QString("-09"));
318     QCOMPARE(calendar->formatDate(testDate, "%EC"), QString("BC"));
319     QCOMPARE(calendar->formatDate(testDate, "%Ey"), QString("9"));
320     QCOMPARE(calendar->formatDate(testDate, "%EY"), QString("9 BC"));
321 
322     testDate.setDate(-89, 1, 1);
323     QCOMPARE(calendar->formatDate(testDate, "%Y"),  QString("-0089"));
324     QCOMPARE(calendar->formatDate(testDate, "%C"),  QString("-00"));
325     QCOMPARE(calendar->formatDate(testDate, "%y"),  QString("-89"));
326     QCOMPARE(calendar->formatDate(testDate, "%-Y"), QString("-89"));
327     QCOMPARE(calendar->formatDate(testDate, "%-C"), QString("-0"));
328     QCOMPARE(calendar->formatDate(testDate, "%-y"), QString("-89"));
329     QCOMPARE(calendar->formatDate(testDate, "%_Y"), QString(" -89"));
330     QCOMPARE(calendar->formatDate(testDate, "%_C"), QString("-0"));
331     QCOMPARE(calendar->formatDate(testDate, "%_y"), QString("-89"));
332     QCOMPARE(calendar->formatDate(testDate, "%0Y"), QString("-0089"));
333     QCOMPARE(calendar->formatDate(testDate, "%0C"), QString("-00"));
334     QCOMPARE(calendar->formatDate(testDate, "%0y"), QString("-89"));
335     QCOMPARE(calendar->formatDate(testDate, "%EC"), QString("BC"));
336     QCOMPARE(calendar->formatDate(testDate, "%Ey"), QString("89"));
337     QCOMPARE(calendar->formatDate(testDate, "%EY"), QString("89 BC"));
338 
339     testDate.setDate(-789, 1, 1);
340     QCOMPARE(calendar->formatDate(testDate, "%Y"),  QString("-0789"));
341     QCOMPARE(calendar->formatDate(testDate, "%C"),  QString("-07"));
342     QCOMPARE(calendar->formatDate(testDate, "%y"),  QString("-89"));
343     QCOMPARE(calendar->formatDate(testDate, "%-Y"), QString("-789"));
344     QCOMPARE(calendar->formatDate(testDate, "%-C"), QString("-7"));
345     QCOMPARE(calendar->formatDate(testDate, "%-y"), QString("-89"));
346     QCOMPARE(calendar->formatDate(testDate, "%_Y"), QString("-789"));
347     QCOMPARE(calendar->formatDate(testDate, "%_C"), QString("-7"));
348     QCOMPARE(calendar->formatDate(testDate, "%_y"), QString("-89"));
349     QCOMPARE(calendar->formatDate(testDate, "%0Y"), QString("-0789"));
350     QCOMPARE(calendar->formatDate(testDate, "%0C"), QString("-07"));
351     QCOMPARE(calendar->formatDate(testDate, "%0y"), QString("-89"));
352     QCOMPARE(calendar->formatDate(testDate, "%EC"), QString("BC"));
353     QCOMPARE(calendar->formatDate(testDate, "%Ey"), QString("789"));
354     QCOMPARE(calendar->formatDate(testDate, "%EY"), QString("789 BC"));
355 
356     testDate.setDate(-709, 1, 1);
357     QCOMPARE(calendar->formatDate(testDate, "%Y"),  QString("-0709"));
358     QCOMPARE(calendar->formatDate(testDate, "%C"),  QString("-07"));
359     QCOMPARE(calendar->formatDate(testDate, "%y"),  QString("-09"));
360     QCOMPARE(calendar->formatDate(testDate, "%-Y"), QString("-709"));
361     QCOMPARE(calendar->formatDate(testDate, "%-C"), QString("-7"));
362     QCOMPARE(calendar->formatDate(testDate, "%-y"), QString("-9"));
363     QCOMPARE(calendar->formatDate(testDate, "%_Y"), QString("-709"));
364     QCOMPARE(calendar->formatDate(testDate, "%_C"), QString("-7"));
365     QCOMPARE(calendar->formatDate(testDate, "%_y"), QString("-9"));
366     QCOMPARE(calendar->formatDate(testDate, "%0Y"), QString("-0709"));
367     QCOMPARE(calendar->formatDate(testDate, "%0C"), QString("-07"));
368     QCOMPARE(calendar->formatDate(testDate, "%0y"), QString("-09"));
369     QCOMPARE(calendar->formatDate(testDate, "%EC"), QString("BC"));
370     QCOMPARE(calendar->formatDate(testDate, "%Ey"), QString("709"));
371     QCOMPARE(calendar->formatDate(testDate, "%EY"), QString("709 BC"));
372 
373     testDate.setDate(-1789, 1, 1);
374     QCOMPARE(calendar->formatDate(testDate, "%Y"),  QString("-1789"));
375     QCOMPARE(calendar->formatDate(testDate, "%C"),  QString("-17"));
376     QCOMPARE(calendar->formatDate(testDate, "%y"),  QString("-89"));
377     QCOMPARE(calendar->formatDate(testDate, "%-Y"), QString("-1789"));
378     QCOMPARE(calendar->formatDate(testDate, "%-C"), QString("-17"));
379     QCOMPARE(calendar->formatDate(testDate, "%-y"), QString("-89"));
380     QCOMPARE(calendar->formatDate(testDate, "%_Y"), QString("-1789"));
381     QCOMPARE(calendar->formatDate(testDate, "%_C"), QString("-17"));
382     QCOMPARE(calendar->formatDate(testDate, "%_y"), QString("-89"));
383     QCOMPARE(calendar->formatDate(testDate, "%0Y"), QString("-1789"));
384     QCOMPARE(calendar->formatDate(testDate, "%0C"), QString("-17"));
385     QCOMPARE(calendar->formatDate(testDate, "%0y"), QString("-89"));
386     QCOMPARE(calendar->formatDate(testDate, "%EC"), QString("BC"));
387     QCOMPARE(calendar->formatDate(testDate, "%Ey"), QString("1789"));
388     QCOMPARE(calendar->formatDate(testDate, "%EY"), QString("1789 BC"));
389 
390     testDate.setDate(-1709, 1, 1);
391     QCOMPARE(calendar->formatDate(testDate, "%Y"),  QString("-1709"));
392     QCOMPARE(calendar->formatDate(testDate, "%C"),  QString("-17"));
393     QCOMPARE(calendar->formatDate(testDate, "%y"),  QString("-09"));
394     QCOMPARE(calendar->formatDate(testDate, "%-Y"), QString("-1709"));
395     QCOMPARE(calendar->formatDate(testDate, "%-C"), QString("-17"));
396     QCOMPARE(calendar->formatDate(testDate, "%-y"), QString("-9"));
397     QCOMPARE(calendar->formatDate(testDate, "%_Y"), QString("-1709"));
398     QCOMPARE(calendar->formatDate(testDate, "%_C"), QString("-17"));
399     QCOMPARE(calendar->formatDate(testDate, "%_y"), QString("-9"));
400     QCOMPARE(calendar->formatDate(testDate, "%0Y"), QString("-1709"));
401     QCOMPARE(calendar->formatDate(testDate, "%0C"), QString("-17"));
402     QCOMPARE(calendar->formatDate(testDate, "%0y"), QString("-09"));
403     QCOMPARE(calendar->formatDate(testDate, "%EC"), QString("BC"));
404     QCOMPARE(calendar->formatDate(testDate, "%Ey"), QString("1709"));
405     QCOMPARE(calendar->formatDate(testDate, "%EY"), QString("1709 BC"));
406 
407     // Test POSIX format
408     testDate.setDate(2010, 1, 2);
409     QCOMPARE(calendar->formatDate(testDate, "%Y-%n-%d", KLocale::KdeFormat),   QString("2010-1-02"));
410     QCOMPARE(calendar->formatDate(testDate, "%Y-%n-%d", KLocale::PosixFormat), QString("2010-\n-02"));
411     QCOMPARE(calendar->formatDate(testDate, "%e", KLocale::KdeFormat),   QString("2"));
412     QCOMPARE(calendar->formatDate(testDate, "%e", KLocale::PosixFormat), QString(" 2"));
413 
414     delete calendar;
415     delete locale;
416 }
417 
testFormatUnicode()418 void KCalendarTest::testFormatUnicode()
419 {
420     KLocale *locale = new KLocale(*KLocale::global());
421     locale->setDateFormatShort("%y-%m-%d");
422     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar, locale);
423 
424     QDate testDate(2005, 10, 20);
425     compareFormatUnicode(calendar, testDate, "yyyy");
426     compareFormatUnicode(calendar, testDate, "yy");
427     compareFormatUnicode(calendar, testDate, "MMMM");
428     compareFormatUnicode(calendar, testDate, "MMM");
429     compareFormatUnicode(calendar, testDate, "MM");
430     compareFormatUnicode(calendar, testDate, "M");
431     compareFormatUnicode(calendar, testDate, "dddd");
432     compareFormatUnicode(calendar, testDate, "ddd");
433     compareFormatUnicode(calendar, testDate, "dd");
434     compareFormatUnicode(calendar, testDate, "d");
435     compareFormatUnicode(calendar, testDate, "yyyy-MM-dd");
436 
437     testDate.setDate(-2005, 10, 20);
438     compareFormatUnicode(calendar, testDate, "yyyy");
439     compareFormatUnicode(calendar, testDate, "yy");
440     compareFormatUnicode(calendar, testDate, "MMMM");
441     compareFormatUnicode(calendar, testDate, "MMM");
442     compareFormatUnicode(calendar, testDate, "MM");
443     compareFormatUnicode(calendar, testDate, "M");
444     compareFormatUnicode(calendar, testDate, "dddd");
445     compareFormatUnicode(calendar, testDate, "ddd");
446     compareFormatUnicode(calendar, testDate, "dd");
447     compareFormatUnicode(calendar, testDate, "d");
448     compareFormatUnicode(calendar, testDate, "yyyy-MM-dd");
449 }
450 
compareFormatUnicode(const KCalendarSystem * calendar,const QDate & testDate,const QString & testFormat)451 void KCalendarTest::compareFormatUnicode(const KCalendarSystem *calendar, const QDate &testDate, const QString &testFormat)
452 {
453     QCOMPARE(calendar->formatDate(testDate, testFormat, KLocale::UnicodeFormat), testDate.toString(testFormat));
454 }
455 
testReadDate()456 void KCalendarTest::testReadDate()
457 {
458     KLocale *locale = new KLocale(*KLocale::global());
459     locale->setDateFormatShort("%y-%m-%d");
460     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar, locale);
461     int currentYear = QDate::currentDate().year();
462 
463     //Test default settings
464     QDate testDate(2005, 10, 20);
465 
466     //Test Month and Day
467     QCOMPARE(calendar->readDate("2005-01-01",  "%Y-%m-%d"), QDate(2005, 1, 1));
468     QCOMPARE(calendar->readDate("-2005-01-01", "%Y-%m-%d"), QDate(-2005, 1, 1));
469     QCOMPARE(calendar->readDate("05-01-01",    "%y-%m-%d"), QDate(2005, 1, 1));
470     QCOMPARE(calendar->readDate("01-01",       "%m-%d"),    QDate(currentYear, 1, 1));
471 
472     //Test Era and Year In Era
473     QCOMPARE(calendar->readDate("1 1 2005 AD", "%d %m %Ey %EC"), QDate(2005, 1, 1));
474     QCOMPARE(calendar->readDate("1 1 2005 Anno Domini", "%d %m %Ey %EC"), QDate(2005, 1, 1));
475     QCOMPARE(calendar->readDate("1 1 2005 BC", "%d %m %Ey %EC"), QDate(-2005, 1, 1));
476     QCOMPARE(calendar->readDate("1 1 2005 Before Christ", "%d %m %Ey %EC"), QDate(-2005, 1, 1));
477     QCOMPARE(calendar->readDate("1 1 2005 AD", "%d %m %EY"), QDate(2005, 1, 1));
478     QCOMPARE(calendar->readDate("1 1 2005 Anno Domini", "%d %m %EY"), QDate(2005, 1, 1));
479     QCOMPARE(calendar->readDate("1 1 2005 BC", "%d %m %EY"), QDate(-2005, 1, 1));
480     QCOMPARE(calendar->readDate("1 1 2005 Before Christ", "%d %m %EY"), QDate(-2005, 1, 1));
481     QCOMPARE(calendar->readDate("1 2005 AD January", "%d %Ey %EC %B"), QDate(2005, 1, 1));
482     QCOMPARE(calendar->readDate("1 2005 AD January", "%d %EY %B"), QDate(2005, 1, 1));
483     QCOMPARE(calendar->readDate("2005 AD January 1", "%Ey %EC %B %d"), QDate(2005, 1, 1));
484     QCOMPARE(calendar->readDate("2005 AD January 1", "%EY %B %d"), QDate(2005, 1, 1));
485 
486     //Test Day-of-Year
487     QCOMPARE(calendar->readDate("2005-001", "%Y-%j"), QDate(2005, 1, 1));
488     QCOMPARE(calendar->readDate("2005-1",   "%Y-%j"), QDate(2005, 1, 1));
489     QCOMPARE(calendar->readDate("001",      "%j"),    QDate(currentYear, 1, 1));
490     QCOMPARE(calendar->readDate("2005-365", "%Y-%j"), QDate(2005, 12, 31));
491     QCOMPARE(calendar->readDate("2000-366", "%Y-%j"), QDate(2000, 12, 31));
492 
493     QCOMPARE(calendar->readDate("2005-000", "%Y-%j"), QDate());
494     QCOMPARE(calendar->readDate("2005-366", "%Y-%j"), QDate());
495     QCOMPARE(calendar->readDate("2000-367", "%Y-%j"), QDate());
496 
497     //Test Weekday and Month names
498     QCOMPARE(calendar->readDate("Monday 2004-01-05", "%A %Y-%m-%d"), QDate(2004,  1,  5));
499     QCOMPARE(calendar->readDate("Mon 2004-01-05",    "%A %Y-%m-%d"), QDate(2004,  1,  5));
500     QCOMPARE(calendar->readDate("Monday 2004-01-05", "%a %Y-%m-%d"), QDate(2004,  1,  5));
501     QCOMPARE(calendar->readDate("Mon 2004-01-05",    "%a %Y-%m-%d"), QDate(2004,  1,  5));
502 
503     QCOMPARE(calendar->readDate("Sunday 2004-01-11", "%A %Y-%m-%d"), QDate(2004,  1, 11));
504     QCOMPARE(calendar->readDate("Sun 2004-01-11",    "%A %Y-%m-%d"), QDate(2004,  1, 11));
505     QCOMPARE(calendar->readDate("Sunday 2004-01-11", "%a %Y-%m-%d"), QDate(2004,  1, 11));
506     QCOMPARE(calendar->readDate("Sun 2004-01-11",    "%a %Y-%m-%d"), QDate(2004,  1, 11));
507 
508     QCOMPARE(calendar->readDate("2004 January 01",  "%Y %B %d"), QDate(2004,  1,  1));
509     QCOMPARE(calendar->readDate("2004 Jan 01",      "%Y %B %d"), QDate(2004,  1,  1));
510     QCOMPARE(calendar->readDate("2004 January 01",  "%Y %b %d"), QDate(2004,  1,  1));
511     QCOMPARE(calendar->readDate("2004 Jan 01",      "%Y %b %d"), QDate(2004,  1,  1));
512 
513     QCOMPARE(calendar->readDate("2004 December 01", "%Y %B %d"), QDate(2004, 12,  1));
514     QCOMPARE(calendar->readDate("2004 Dec 01",      "%Y %B %d"), QDate(2004, 12,  1));
515     QCOMPARE(calendar->readDate("2004 December 01", "%Y %b %d"), QDate(2004, 12,  1));
516     QCOMPARE(calendar->readDate("2004 Dec 01",      "%Y %b %d"), QDate(2004, 12,  1));
517 
518     QCOMPARE(calendar->readDate("Wednesday 2004 December 01", "%A %Y %B %d"), QDate(2004, 12,  1));
519     QCOMPARE(calendar->readDate("Wed 2004 Dec 01",            "%A %Y %B %d"), QDate(2004, 12,  1));
520     QCOMPARE(calendar->readDate("Wednesday 2004 December 01", "%a %Y %b %d"), QDate(2004, 12,  1));
521     QCOMPARE(calendar->readDate("Wed 2004 Dec 01",            "%a %Y %b %d"), QDate(2004, 12,  1));
522 
523     //Test ISO Week and Day-of-Week
524     QCOMPARE(calendar->readDate("2004-W01-1", "%Y-W%V-%u"), QDate(2003, 12, 29));
525     QCOMPARE(calendar->readDate("2004-W01-2", "%Y-W%V-%u"), QDate(2003, 12, 30));
526     QCOMPARE(calendar->readDate("2004-W01-3", "%Y-W%V-%u"), QDate(2003, 12, 31));
527     QCOMPARE(calendar->readDate("2004-W01-4", "%Y-W%V-%u"), QDate(2004, 1, 1));
528     QCOMPARE(calendar->readDate("2004-W01-5", "%Y-W%V-%u"), QDate(2004, 1, 2));
529     QCOMPARE(calendar->readDate("2004-W01-6", "%Y-W%V-%u"), QDate(2004, 1, 3));
530     QCOMPARE(calendar->readDate("2004-W01-7", "%Y-W%V-%u"), QDate(2004, 1, 4));
531 
532     QCOMPARE(calendar->readDate("2004-W24-1", "%Y-W%V-%u"), QDate(2004, 6, 7));
533     QCOMPARE(calendar->readDate("2004-W24-2", "%Y-W%V-%u"), QDate(2004, 6, 8));
534     QCOMPARE(calendar->readDate("2004-W24-3", "%Y-W%V-%u"), QDate(2004, 6, 9));
535     QCOMPARE(calendar->readDate("2004-W24-4", "%Y-W%V-%u"), QDate(2004, 6, 10));
536     QCOMPARE(calendar->readDate("2004-W24-5", "%Y-W%V-%u"), QDate(2004, 6, 11));
537     QCOMPARE(calendar->readDate("2004-W24-6", "%Y-W%V-%u"), QDate(2004, 6, 12));
538     QCOMPARE(calendar->readDate("2004-W24-7", "%Y-W%V-%u"), QDate(2004, 6, 13));
539 
540     QCOMPARE(calendar->readDate("2004-W53-1", "%Y-W%V-%u"), QDate(2004, 12, 27));
541     QCOMPARE(calendar->readDate("2004-W53-2", "%Y-W%V-%u"), QDate(2004, 12, 28));
542     QCOMPARE(calendar->readDate("2004-W53-3", "%Y-W%V-%u"), QDate(2004, 12, 29));
543     QCOMPARE(calendar->readDate("2004-W53-4", "%Y-W%V-%u"), QDate(2004, 12, 30));
544     QCOMPARE(calendar->readDate("2004-W53-5", "%Y-W%V-%u"), QDate(2004, 12, 31));
545     QCOMPARE(calendar->readDate("2004-W53-6", "%Y-W%V-%u"), QDate(2005, 1, 1));
546     QCOMPARE(calendar->readDate("2004-W53-7", "%Y-W%V-%u"), QDate(2005, 1, 2));
547 
548     calendar->setDateIsoWeek(testDate, currentYear, 46, 5);
549     QCOMPARE(calendar->readDate("W46-5", "W%V-%u"), testDate);
550 
551     QCOMPARE(calendar->readDate("2004-W00-1", "%Y-W%V-%u"),   QDate());
552     QCOMPARE(calendar->readDate("2004-W01-0", "%Y-W%V-%u"),   QDate());
553     QCOMPARE(calendar->readDate("2004-W01-8", "%Y-W%V-%u"),   QDate());
554     QCOMPARE(calendar->readDate("2004-W54-1", "%Y-W%V-%u"),   QDate());
555     QCOMPARE(calendar->readDate("2004-W53-01", "%Y-W%V-%u"),  QDate());
556     QCOMPARE(calendar->readDate("2004-W053-01", "%Y-W%V-%u"), QDate());
557 
558     //Test all 3 options, should go with most accurate
559     QCOMPARE(calendar->readDate("2004-01-01-365-W52-1", "%Y-%m-%d-%j-W%V-%u"), QDate(2004, 1, 1));
560     QCOMPARE(calendar->readDate("2004-001-W52-1",       "%Y-%j-W%V-%u"),       QDate(2004, 1, 1));
561 
562     //Test spaces and literals
563     QCOMPARE(calendar->readDate("2004- 1-1",    "%Y-%m-%d"), QDate(2004, 1, 1));
564     QCOMPARE(calendar->readDate("2004-1-1",     "%Y-%m-%e"), QDate(2004, 1, 1));
565     QCOMPARE(calendar->readDate("2004 01 01",   "%Y %m %d"), QDate(2004, 1, 1));
566     QCOMPARE(calendar->readDate("2004  01  01", "%Y %m %d"), QDate(2004, 1, 1));
567     QCOMPARE(calendar->readDate("2004W01-1",   "%YW%m-%d"),  QDate(2004, 1, 1));
568     QCOMPARE(calendar->readDate("2004w01-1",   "%YW%m-%d"),  QDate(2004, 1, 1));
569     QCOMPARE(calendar->readDate("2004W01-1",   "%Yw%m-%d"),  QDate(2004, 1, 1));
570 
571     //Test enums and non-strict version of readDate()
572     locale->setDateFormat("%d/%m/%Y");
573     locale->setDateFormatShort("%Y/%m/%d");
574     QCOMPARE(calendar->readDate("01/02/2004"),  QDate(2004, 2, 1));        //KLocale::NormalFormat
575     QCOMPARE(calendar->readDate("01/02/-2004"), QDate(-2004, 2, 1));       //KLocale::NormalFormat
576     QCOMPARE(calendar->readDate("2004/02/01"),  QDate(2004, 2, 1));        //KLocale::ShortFormat
577     QCOMPARE(calendar->readDate("-2004/02/01"), QDate(-2004, 2, 1));       //KLocale::ShortFormat
578     QCOMPARE(calendar->readDate("2004-02-01"),  QDate(2004, 2, 1));        //KLocale::IsoFormat
579     QCOMPARE(calendar->readDate("-2004-02-01"), QDate(-2004, 2, 1));       //KLocale::IsoFormat
580     QCOMPARE(calendar->readDate("2004-W02-1"),  QDate(2004, 1, 5));        //KLocale::IsoWeekFormat
581     QCOMPARE(calendar->readDate("2004-001"),    QDate(2004, 1, 1));        //KLocale::IsoOrdinalFormat
582     QCOMPARE(calendar->readDate("-2004-001"),   QDate(-2004, 1, 1));       //KLocale::IsoOrdinalFormat
583 
584     //Test enums and strict version of readDate()
585     QCOMPARE(calendar->readDate("01/02/2004",   KLocale::NormalFormat),     QDate(2004, 2, 1));
586     QCOMPARE(calendar->readDate("01/02/-2004",  KLocale::NormalFormat),     QDate(-2004, 2, 1));
587     QCOMPARE(calendar->readDate("2004/02/01",   KLocale::ShortFormat),      QDate(2004, 2, 1));
588     QCOMPARE(calendar->readDate("-2004/02/01",  KLocale::ShortFormat),      QDate(-2004, 2, 1));
589     QCOMPARE(calendar->readDate("2004-02-01",   KLocale::IsoFormat),        QDate(2004, 2, 1));
590     QCOMPARE(calendar->readDate("-2004-02-01",  KLocale::IsoFormat),        QDate(-2004, 2, 1));
591     QCOMPARE(calendar->readDate("2004-W02-1",   KLocale::IsoWeekFormat),    QDate(2004, 1, 5));
592     QCOMPARE(calendar->readDate("2004-001",     KLocale::IsoOrdinalFormat), QDate(2004, 1, 1));
593     QCOMPARE(calendar->readDate("-2004-001",    KLocale::IsoOrdinalFormat), QDate(-2004, 1, 1));
594 
595     //Test ISO standard date form with no spaces
596     locale->setDateFormatShort("%Y%m%d");
597     QCOMPARE(calendar->readDate("20040201"),  QDate(2004, 2, 1));
598     QCOMPARE(calendar->readDate("-20040201"), QDate(-2004, 2, 1));
599 
600     // Test POSIX format
601     testDate.setDate(2010, 1, 2);
602     QCOMPARE(calendar->readDate("2010-1-2", "%Y-%n-%d", nullptr, KLocale::KdeFormat),       QDate(2010, 1, 2));
603     QCOMPARE(calendar->readDate("2010-\n-2",  "%Y-%n-%d", nullptr, KLocale::PosixFormat),   QDate());
604     QCOMPARE(calendar->readDate("2010-1\n-2", "%Y-%n\n-%d", nullptr, KLocale::KdeFormat),   QDate(2010, 1, 2));
605     QCOMPARE(calendar->readDate("2010-1\n-2", "%Y-%m%n-%d", nullptr, KLocale::PosixFormat), QDate(2010, 1, 2));
606     QCOMPARE(calendar->readDate("2010-1-2", "%Y-%m-%e", nullptr, KLocale::KdeFormat),       QDate(2010, 1, 2));
607     QCOMPARE(calendar->readDate("2010-1-2", "%Y-%m-%e", nullptr, KLocale::PosixFormat),     QDate(2010, 1, 2));
608 
609     delete calendar;
610     delete locale;
611 }
612 
testStringForms()613 void KCalendarTest::testStringForms()
614 {
615     testStrings(KLocale::ArabicDigits);
616     testStrings(KLocale::ArabicIndicDigits);
617 }
618 
testStrings(KLocale::DigitSet testDigitSet)619 void KCalendarTest::testStrings(KLocale::DigitSet testDigitSet)
620 {
621     KLocale *locale = new KLocale(*KLocale::global());
622     locale->setDigitSet(testDigitSet);
623     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar, locale);
624 
625     //Test default settings
626     QDate testDate(2005, 1, 3);
627 
628     //Test Year String
629     QCOMPARE(calendar->yearString(testDate), locale->convertDigits("2005", locale->dateTimeDigitSet()));
630     QCOMPARE(calendar->yearString(testDate, KCalendarSystem::LongFormat), locale->convertDigits("2005", locale->dateTimeDigitSet()));
631     QCOMPARE(calendar->yearString(testDate, KCalendarSystem::ShortFormat), locale->convertDigits("05", locale->dateTimeDigitSet()));
632 
633     //Test Month String
634     QCOMPARE(calendar->monthString(testDate), locale->convertDigits("01", locale->dateTimeDigitSet()));
635     QCOMPARE(calendar->monthString(testDate, KCalendarSystem::LongFormat), locale->convertDigits("01", locale->dateTimeDigitSet()));
636     QCOMPARE(calendar->monthString(testDate, KCalendarSystem::ShortFormat), locale->convertDigits("1", locale->dateTimeDigitSet()));
637 
638     //Test Day String
639     QCOMPARE(calendar->dayString(testDate), locale->convertDigits("03", locale->dateTimeDigitSet()));
640     QCOMPARE(calendar->dayString(testDate, KCalendarSystem::LongFormat), locale->convertDigits("03", locale->dateTimeDigitSet()));
641     QCOMPARE(calendar->dayString(testDate, KCalendarSystem::ShortFormat), locale->convertDigits("3", locale->dateTimeDigitSet()));
642 
643     //Test Day of Year String
644     QCOMPARE(calendar->dayOfYearString(testDate), locale->convertDigits("003", locale->dateTimeDigitSet()));
645     QCOMPARE(calendar->dayOfYearString(testDate, KCalendarSystem::LongFormat), locale->convertDigits("003", locale->dateTimeDigitSet()));
646     QCOMPARE(calendar->dayOfYearString(testDate, KCalendarSystem::ShortFormat), locale->convertDigits("3", locale->dateTimeDigitSet()));
647 
648     //Test Day of Week String
649     QCOMPARE(calendar->dayOfWeekString(testDate), locale->convertDigits("1", locale->dateTimeDigitSet()));
650 
651     //Test Week Number String
652     QCOMPARE(calendar->weekNumberString(testDate), locale->convertDigits("01", locale->dateTimeDigitSet()));
653     QCOMPARE(calendar->weekNumberString(testDate, KCalendarSystem::LongFormat), locale->convertDigits("01", locale->dateTimeDigitSet()));
654     QCOMPARE(calendar->weekNumberString(testDate, KCalendarSystem::ShortFormat), locale->convertDigits("1", locale->dateTimeDigitSet()));
655 
656     //Test Months In Year String
657     QCOMPARE(calendar->monthsInYearString(testDate), locale->convertDigits("12", locale->dateTimeDigitSet()));
658     QCOMPARE(calendar->monthsInYearString(testDate, KCalendarSystem::LongFormat), locale->convertDigits("12", locale->dateTimeDigitSet()));
659     QCOMPARE(calendar->monthsInYearString(testDate, KCalendarSystem::ShortFormat), locale->convertDigits("12", locale->dateTimeDigitSet()));
660 
661     //Test Weeks In Year String
662     QCOMPARE(calendar->weeksInYearString(testDate), locale->convertDigits("52", locale->dateTimeDigitSet()));
663     QCOMPARE(calendar->weeksInYearString(testDate, KCalendarSystem::LongFormat), locale->convertDigits("52", locale->dateTimeDigitSet()));
664     QCOMPARE(calendar->weeksInYearString(testDate, KCalendarSystem::ShortFormat), locale->convertDigits("52", locale->dateTimeDigitSet()));
665 
666     //Test Days In Year String
667     QCOMPARE(calendar->daysInYearString(testDate), locale->convertDigits("365", locale->dateTimeDigitSet()));
668     QCOMPARE(calendar->daysInYearString(testDate, KCalendarSystem::LongFormat), locale->convertDigits("365", locale->dateTimeDigitSet()));
669     QCOMPARE(calendar->daysInYearString(testDate, KCalendarSystem::ShortFormat), locale->convertDigits("365", locale->dateTimeDigitSet()));
670 
671     //Test Days In Month String
672     QCOMPARE(calendar->daysInMonthString(testDate), locale->convertDigits("31", locale->dateTimeDigitSet()));
673     QCOMPARE(calendar->daysInMonthString(testDate, KCalendarSystem::LongFormat), locale->convertDigits("31", locale->dateTimeDigitSet()));
674     QCOMPARE(calendar->daysInMonthString(testDate, KCalendarSystem::ShortFormat), locale->convertDigits("31", locale->dateTimeDigitSet()));
675 
676     //Test Days In Week String
677     QCOMPARE(calendar->daysInWeekString(testDate), locale->convertDigits("7", locale->dateTimeDigitSet()));
678 
679     //Test Year In Era String
680     testDate.setDate(5, 1, 1);
681     QCOMPARE(calendar->yearInEraString(testDate), locale->convertDigits("5", locale->dateTimeDigitSet()));
682     QCOMPARE(calendar->yearInEraString(testDate, KCalendarSystem::LongFormat), locale->convertDigits("0005", locale->dateTimeDigitSet()));
683     QCOMPARE(calendar->yearInEraString(testDate, KCalendarSystem::ShortFormat), locale->convertDigits("5", locale->dateTimeDigitSet()));
684 
685     delete calendar;
686     delete locale;
687 }
688 
testIsoWeekDate()689 void KCalendarTest::testIsoWeekDate()
690 {
691     KLocale *locale = new KLocale(*KLocale::global());
692     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar, locale);
693 
694     int earliestValidYear = calendar->year(calendar->earliestValidDate());
695     int latestValidYear = calendar->year(calendar->latestValidDate());
696 
697     QCOMPARE(calendar->isValidIsoWeekDate(earliestValidYear - 1, 1, 1), false);
698     QCOMPARE(calendar->isValidIsoWeekDate(earliestValidYear,     1, 1), false);     //In prev year
699     QCOMPARE(calendar->isValidIsoWeekDate(earliestValidYear,     1, 2), true);
700     QCOMPARE(calendar->isValidIsoWeekDate(-1,                    1, 1), true);
701     QCOMPARE(calendar->isValidIsoWeekDate(0,                     1, 1), false);
702     QCOMPARE(calendar->isValidIsoWeekDate(1,                     1, 1), true);
703     QCOMPARE(calendar->isValidIsoWeekDate(latestValidYear,      52, 5), true);
704     QCOMPARE(calendar->isValidIsoWeekDate(latestValidYear,      52, 6), false);     //In following year
705     QCOMPARE(calendar->isValidIsoWeekDate(latestValidYear,      52, 7), false);     //In following year
706     QCOMPARE(calendar->isValidIsoWeekDate(latestValidYear + 1,   1, 1), false);
707 
708     QCOMPARE(calendar->isValidIsoWeekDate(2004,  0, 1), false);
709     QCOMPARE(calendar->isValidIsoWeekDate(2004,  1, 1), true);
710     QCOMPARE(calendar->isValidIsoWeekDate(2004, 53, 1), true);
711     QCOMPARE(calendar->isValidIsoWeekDate(2000, 54, 1), false);
712 
713     QCOMPARE(calendar->isValidIsoWeekDate(2004, 1, 0), false);
714     QCOMPARE(calendar->isValidIsoWeekDate(2004, 1, 1), true);
715     QCOMPARE(calendar->isValidIsoWeekDate(2004, 1, 7), true);
716     QCOMPARE(calendar->isValidIsoWeekDate(2004, 1, 8), false);
717 
718     QCOMPARE(setIsoWeekDate(calendar, earliestValidYear - 1, 1, 1), QDate());
719     QCOMPARE(setIsoWeekDate(calendar, earliestValidYear,     1, 1), QDate());     //In prev year
720     QCOMPARE(setIsoWeekDate(calendar, earliestValidYear,     1, 2), QDate(-9999,  1,  1));
721     QCOMPARE(setIsoWeekDate(calendar, -1,                    1, 1), QDate(-1, 1, 3));
722     QCOMPARE(setIsoWeekDate(calendar, 0,                     1, 1), QDate());
723     QCOMPARE(setIsoWeekDate(calendar, 1,                     1, 1), QDate(1,  1,  1));
724     QCOMPARE(setIsoWeekDate(calendar, latestValidYear,      52, 5), QDate(9999, 12, 31));
725     QCOMPARE(setIsoWeekDate(calendar, latestValidYear,      52, 6), QDate());     //In next year
726     QCOMPARE(setIsoWeekDate(calendar, latestValidYear,      52, 7), QDate());     //In next year
727     QCOMPARE(setIsoWeekDate(calendar, latestValidYear + 1,   1, 1), QDate());
728 
729     QCOMPARE(setIsoWeekDate(calendar, 2004,  0, 1), QDate());
730     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 1), QDate(2003, 12, 29));
731     QCOMPARE(setIsoWeekDate(calendar, 2004, 53, 1), QDate(2004, 12, 27));
732     QCOMPARE(setIsoWeekDate(calendar, 2000, 54, 1), QDate());
733 
734     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 0), QDate());
735     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 1), QDate(2003, 12, 29));
736     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 7), QDate(2004,  1,  4));
737     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 8), QDate());
738 
739     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 1), QDate(2003, 12, 29));
740     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 2), QDate(2003, 12, 30));
741     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 3), QDate(2003, 12, 31));
742     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 4), QDate(2004,  1,  1));
743     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 5), QDate(2004,  1,  2));
744     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 6), QDate(2004,  1,  3));
745     QCOMPARE(setIsoWeekDate(calendar, 2004,  1, 7), QDate(2004,  1,  4));
746 
747     QCOMPARE(setIsoWeekDate(calendar, 2004, 24, 1), QDate(2004, 6,  7));
748     QCOMPARE(setIsoWeekDate(calendar, 2004, 24, 2), QDate(2004, 6,  8));
749     QCOMPARE(setIsoWeekDate(calendar, 2004, 24, 3), QDate(2004, 6,  9));
750     QCOMPARE(setIsoWeekDate(calendar, 2004, 24, 4), QDate(2004, 6, 10));
751     QCOMPARE(setIsoWeekDate(calendar, 2004, 24, 5), QDate(2004, 6, 11));
752     QCOMPARE(setIsoWeekDate(calendar, 2004, 24, 6), QDate(2004, 6, 12));
753     QCOMPARE(setIsoWeekDate(calendar, 2004, 24, 7), QDate(2004, 6, 13));
754 
755     QCOMPARE(setIsoWeekDate(calendar, 2004, 53, 1), QDate(2004, 12, 27));
756     QCOMPARE(setIsoWeekDate(calendar, 2004, 53, 2), QDate(2004, 12, 28));
757     QCOMPARE(setIsoWeekDate(calendar, 2004, 53, 3), QDate(2004, 12, 29));
758     QCOMPARE(setIsoWeekDate(calendar, 2004, 53, 4), QDate(2004, 12, 30));
759     QCOMPARE(setIsoWeekDate(calendar, 2004, 53, 5), QDate(2004, 12, 31));
760     QCOMPARE(setIsoWeekDate(calendar, 2004, 53, 6), QDate(2005,  1,  1));
761     QCOMPARE(setIsoWeekDate(calendar, 2004, 53, 7), QDate(2005,  1,  2));
762 
763     delete calendar;
764     delete locale;
765 }
766 
testHebrewStrings()767 void KCalendarTest::testHebrewStrings()
768 {
769     /*
770         Ref table for numbers to Hebrew chars
771 
772         Value     1       2       3        4        5       6         7        8      9
773 
774         x 1    Alef א  Bet  ב  Gimel ג  Dalet ד  He   ה  Vav  ו    Zayen ז  Het  ח  Tet  ט
775                0x05D0  0x05D1  0x05D2   0x05D3   0x05D4  0x05D5    0x05D6   0x05D7  0x05D8
776 
777         x 10   Yod  י  Kaf  כ  Lamed ל  Mem  מ   Nun  נ  Samekh ס  Ayin ע   Pe   פ  Tzadi צ
778                0x05D9  0x05DB  0x05DC   0x05DE   0x05E0  0x05E1    0x05E2   0x05E4  0x05E6
779 
780         x 100  Qof  ק  Resh ר  Shin ש   Tav  ת
781                0x05E7  0x05E8  0x05E9   0x05EA
782 
783         Note special cases 15 = 9 + 6 טו and 16 = 9 + 7 טז
784     */
785 
786     QString oldLocale = setlocale(LC_ALL, "he.utf8");
787     KLocale *locale = new KLocale(*KLocale::global());
788     locale->setLanguage(QStringList() << "he");
789     locale->setDateFormat("%d %B %Y");
790     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::HebrewCalendar, locale);
791     if (locale->language() == "he") {
792         QDate testDate;
793         QString yearString, monthString, dayString, testString, resultString;
794         calendar->setDate(testDate, 5765, 1, 1);
795         // Have to use unicode values, for some reason directly using the chars doesn't work?
796         yearString.append(QChar(0x05EA)).append(QChar(0x05E9)).append(QChar(0x05E1)).append(QChar('\"')).append(QChar(0x05D4));
797         monthString = QString::fromUtf8("תשרי");
798         dayString.append(QChar(0x05D0)).append(QChar('\''));
799         testString = yearString + ' ' + monthString + ' ' + dayString;
800         QCOMPARE(calendar->readDate(calendar->formatDate(testDate, KLocale::LongDate), KLocale::NormalFormat), testDate);
801         QCOMPARE(calendar->formatDate(testDate, "%Y"), yearString);
802         // Skip month name for now as won't translate for some reason, confirmed works visually in GUI
803         //QCOMPARE( calendar->formatDate( testDate, "%B" ), monthString );
804         QCOMPARE(calendar->formatDate(testDate, "%d"), dayString);
805         //QCOMPARE( calendar->formatDate( testDate,  locale->dateFormat() ), testString );
806         //QCOMPARE( calendar->readDate( testString ), testDate );
807         for (int yy = 5400; yy <= 6400; ++yy) {
808             calendar->setDate(testDate, yy, 1, 1);
809             QCOMPARE(calendar->readDate(calendar->formatDate(testDate, KLocale::LongDate), KLocale::NormalFormat), testDate);
810         }
811     } else {
812         qDebug() << "Cannot set Hebrew language, please install and re-test!";
813     }
814     setlocale(LC_ALL, oldLocale.toLatin1());
815 }
816 
setIsoWeekDate(const KCalendarSystem * calendar,int year,int isoWeek,int dayOfWeek)817 QDate KCalendarTest::setIsoWeekDate(const KCalendarSystem *calendar, int year, int isoWeek, int dayOfWeek)
818 {
819     QDate resultDate;
820     calendar->setDateIsoWeek(resultDate, year, isoWeek, dayOfWeek);
821     return resultDate;
822 }
823 
testDayOfYearDate()824 void KCalendarTest::testDayOfYearDate()
825 {
826     KLocale *locale = new KLocale(*KLocale::global());
827     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar, locale);
828 
829     int earliestValidYear = calendar->year(calendar->earliestValidDate());
830     int latestValidYear = calendar->year(calendar->latestValidDate());
831 
832     QCOMPARE(calendar->isValid(earliestValidYear - 1, 1), false);
833     QCOMPARE(calendar->isValid(earliestValidYear,     1), true);
834     QCOMPARE(calendar->isValid(-1,                    1), true);
835     QCOMPARE(calendar->isValid(0,                     1), false);
836     QCOMPARE(calendar->isValid(1,                     1), true);
837     QCOMPARE(calendar->isValid(latestValidYear,       1), true);
838     QCOMPARE(calendar->isValid(latestValidYear + 1,   1), false);
839 
840     QCOMPARE(calendar->isValid(2005,   0), false);
841     QCOMPARE(calendar->isValid(2005,   1), true);
842     QCOMPARE(calendar->isValid(2005, 365), true);
843     QCOMPARE(calendar->isValid(2005, 366), false);
844     QCOMPARE(calendar->isValid(2000, 366), true);
845     QCOMPARE(calendar->isValid(2000, 367), false);
846 
847     QCOMPARE(setDayOfYearDate(calendar, earliestValidYear - 1, 1), QDate());
848     QCOMPARE(setDayOfYearDate(calendar, earliestValidYear,     1), QDate(earliestValidYear, 1, 1));
849     QCOMPARE(setDayOfYearDate(calendar, -1,                    1), QDate(-1,                1, 1));
850     QCOMPARE(setDayOfYearDate(calendar, 0,                     1), QDate());
851     QCOMPARE(setDayOfYearDate(calendar, 1,                     1), QDate(1,                 1, 1));
852     QCOMPARE(setDayOfYearDate(calendar, latestValidYear,       1), QDate(latestValidYear,   1, 1));
853     QCOMPARE(setDayOfYearDate(calendar, latestValidYear + 1,   1), QDate());
854 
855     QCOMPARE(setDayOfYearDate(calendar, 2005,   0), QDate());
856     QCOMPARE(setDayOfYearDate(calendar, 2005,   1), QDate(2005,  1,  1));
857     QCOMPARE(setDayOfYearDate(calendar, 2005, 365), QDate(2005, 12, 31));
858     QCOMPARE(setDayOfYearDate(calendar, 2005, 366), QDate());
859     QCOMPARE(setDayOfYearDate(calendar, 2000, 366), QDate(2000, 12, 31));
860     QCOMPARE(setDayOfYearDate(calendar, 2000, 367), QDate());
861 
862     delete calendar;
863     delete locale;
864 }
865 
setDayOfYearDate(const KCalendarSystem * calendar,int year,int dayOfYear)866 QDate KCalendarTest::setDayOfYearDate(const KCalendarSystem *calendar, int year, int dayOfYear)
867 {
868     QDate resultDate;
869     calendar->setDate(resultDate, year, dayOfYear);
870     return resultDate;
871 }
872 
testDateDifference()873 void KCalendarTest::testDateDifference()
874 {
875     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
876     QDate testDate1, testDate2;
877 
878     // Date Difference
879 
880     compareDateDifference(calendar, QDate(2010, 6,  1), QDate(2010, 6,  1),  0,  0,  0);
881     compareDateDifference(calendar, QDate(2010, 6, 10), QDate(2010, 6, 20),  0,  0, 10);
882     compareDateDifference(calendar, QDate(2010, 6,  1), QDate(2010, 7,  1),  0,  1,  0);
883     compareDateDifference(calendar, QDate(2010, 6, 10), QDate(2010, 7, 20),  0,  1, 10);
884     compareDateDifference(calendar, QDate(2010, 6, 20), QDate(2010, 7, 10),  0,  0, 20);
885     compareDateDifference(calendar, QDate(2010, 6, 30), QDate(2010, 7, 31),  0,  1,  1);
886     compareDateDifference(calendar, QDate(2010, 8, 31), QDate(2010, 9, 30),  0,  1,  0);
887     compareDateDifference(calendar, QDate(2010, 7,  1), QDate(2011, 6,  1),  0, 11,  0);
888     compareDateDifference(calendar, QDate(2010, 7, 10), QDate(2011, 6, 20),  0, 11, 10);
889     compareDateDifference(calendar, QDate(2010, 7, 20), QDate(2011, 6, 10),  0, 10, 21);
890     compareDateDifference(calendar, QDate(2010, 7, 31), QDate(2011, 6, 30),  0, 11,  0);
891     compareDateDifference(calendar, QDate(2010, 8, 30), QDate(2011, 7, 31),  0, 11,  1);
892     compareDateDifference(calendar, QDate(2010, 6, 10), QDate(2011, 6, 10),  1,  0,  0);
893     compareDateDifference(calendar, QDate(2010, 6, 10), QDate(2011, 6, 20),  1,  0, 10);
894     compareDateDifference(calendar, QDate(2010, 6, 10), QDate(2011, 7, 10),  1,  1,  0);
895     compareDateDifference(calendar, QDate(2010, 6, 10), QDate(2011, 7, 20),  1,  1, 10);
896     compareDateDifference(calendar, QDate(2010, 6, 20), QDate(2011, 8, 10),  1,  1, 21);
897     compareDateDifference(calendar, QDate(2010, 6, 30), QDate(2011, 7, 31),  1,  1,  1);
898     compareDateDifference(calendar, QDate(2010, 8, 31), QDate(2011, 9, 30),  1,  1,  0);
899     compareDateDifference(calendar, QDate(2010, 7, 31), QDate(2012, 6, 30),  1, 11,  0);
900     compareDateDifference(calendar, QDate(2010, 8, 30), QDate(2012, 7, 31),  1, 11,  1);
901     compareDateDifference(calendar, QDate(2000, 2, 29), QDate(2001, 2, 28),  1,  0,  0);
902     compareDateDifference(calendar, QDate(2000, 2, 29), QDate(2001, 3,  1),  1,  0,  1);
903     compareDateDifference(calendar, QDate(2000, 2, 29), QDate(2001, 4,  1),  1,  1,  3);
904     calendar->setDate(testDate1, -1, 1, 1);
905     calendar->setDate(testDate2,  1, 1, 1);
906     compareDateDifference(calendar, testDate1, testDate2,  1,  0,  0);
907 
908     // Years Difference
909 
910     compareYearDifference(calendar, QDate(2010, 1,  1), QDate(2010,  1,  1), 0);
911     compareYearDifference(calendar, QDate(2010, 1,  1), QDate(2010, 12, 31), 0);
912     compareYearDifference(calendar, QDate(2010, 6,  1), QDate(2010,  7,  1), 0);
913     compareYearDifference(calendar, QDate(2010, 6,  1), QDate(2011,  5,  1), 0);
914     compareYearDifference(calendar, QDate(2010, 6,  1), QDate(2011,  7,  1), 1);
915     compareYearDifference(calendar, QDate(2010, 6, 20), QDate(2012,  6, 20), 2);
916     compareYearDifference(calendar, QDate(2010, 6, 20), QDate(2012,  6, 30), 2);
917     compareYearDifference(calendar, QDate(2010, 6, 20), QDate(2012,  6, 10), 1);
918     compareYearDifference(calendar, QDate(2000, 2, 29), QDate(2001,  2, 28), 1);
919     calendar->setDate(testDate1, -1, 12, 31);
920     calendar->setDate(testDate2,  1,  1,  1);
921     compareYearDifference(calendar, testDate1, testDate2, 0);
922     calendar->setDate(testDate1, -1,  1,  1);
923     compareYearDifference(calendar, testDate1, testDate2, 1);
924 
925     // Months Difference
926 
927     compareMonthDifference(calendar, QDate(2010, 1,  1), QDate(2010,  1,  1), 0);
928     compareMonthDifference(calendar, QDate(2010, 1,  1), QDate(2010,  2,  1), 1);
929     compareMonthDifference(calendar, QDate(2010, 1, 10), QDate(2010,  2,  1), 0);
930     compareMonthDifference(calendar, QDate(2010, 1, 10), QDate(2010,  2, 20), 1);
931     compareMonthDifference(calendar, QDate(2010, 1,  1), QDate(2011,  1,  1), 12);
932     compareMonthDifference(calendar, QDate(2010, 1,  1), QDate(2011,  2,  1), 13);
933     compareMonthDifference(calendar, QDate(2010, 1, 10), QDate(2011,  2,  1), 12);
934     compareMonthDifference(calendar, QDate(2010, 1, 10), QDate(2011,  2, 20), 13);
935     compareMonthDifference(calendar, QDate(2000, 2, 29), QDate(2001,  2, 27), 11);
936     compareMonthDifference(calendar, QDate(2000, 2, 29), QDate(2001,  2, 28), 12);
937     compareMonthDifference(calendar, QDate(2000, 2, 27), QDate(2001,  2, 28), 12);
938     compareMonthDifference(calendar, QDate(2000, 2, 29), QDate(2001,  3,  1), 12);
939     calendar->setDate(testDate1, -1, 12, 31);
940     calendar->setDate(testDate2,  1,  1,  1);
941     compareMonthDifference(calendar, testDate1, testDate2, 0);
942     calendar->setDate(testDate1, -1, 12,  1);
943     compareMonthDifference(calendar, testDate1, testDate2, 1);
944 
945     // Days Difference
946 
947     // Directly uses QDate::toJulianDay() so only basic testing needed
948     testDate1.setDate(2010, 1, 1);
949     testDate2.setDate(2010, 1, 2);
950     QCOMPARE(calendar->daysDifference(testDate1, testDate2), 1);
951     QCOMPARE(calendar->daysDifference(testDate2, testDate1), -1);
952 
953     // Test for crossing Julian/Gregorian switch!!!
954 }
955 
compareDateDifference(const KCalendarSystem * calendar,const QDate & lowDate,const QDate & highDate,int yearsDiff,int monthsDiff,int daysDiff)956 void KCalendarTest::compareDateDifference(const KCalendarSystem *calendar,
957         const QDate &lowDate, const QDate &highDate,
958         int yearsDiff, int monthsDiff, int daysDiff)
959 {
960     int y, m, d, s;
961     if (highDate >= lowDate) {
962         calendar->dateDifference(lowDate, highDate, &y, &m, &d, &s);
963         QCOMPARE(y, yearsDiff);
964         QCOMPARE(m, monthsDiff);
965         QCOMPARE(d, daysDiff);
966         QCOMPARE(s, 1);
967     }
968     if (highDate > lowDate) {
969         calendar->dateDifference(highDate, lowDate, &y, &m, &d, &s);
970         QCOMPARE(y, yearsDiff);
971         QCOMPARE(m, monthsDiff);
972         QCOMPARE(d, daysDiff);
973         QCOMPARE(s, -1);
974     }
975 }
976 
compareYearDifference(const KCalendarSystem * calendar,const QDate & lowDate,const QDate & highDate,int yearsDiff)977 void KCalendarTest::compareYearDifference(const KCalendarSystem *calendar,
978         const QDate &lowDate, const QDate &highDate,
979         int yearsDiff)
980 {
981     if (highDate >= lowDate) {
982         QCOMPARE(calendar->yearsDifference(lowDate, highDate), yearsDiff);
983     }
984     if (highDate > lowDate) {
985         QCOMPARE(calendar->yearsDifference(highDate, lowDate), -yearsDiff);
986     }
987 }
988 
compareMonthDifference(const KCalendarSystem * calendar,const QDate & lowDate,const QDate & highDate,int monthsDiff)989 void KCalendarTest::compareMonthDifference(const KCalendarSystem *calendar,
990         const QDate &lowDate, const QDate &highDate,
991         int monthsDiff)
992 {
993     if (highDate >= lowDate) {
994         QCOMPARE(calendar->monthsDifference(lowDate, highDate), monthsDiff);
995     }
996     if (highDate > lowDate) {
997         QCOMPARE(calendar->monthsDifference(highDate, lowDate), -monthsDiff);
998     }
999 }
1000 
testFirstLast()1001 void KCalendarTest::testFirstLast()
1002 {
1003     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
1004     QDate testDate = QDate(2010, 6, 15);
1005 
1006     QCOMPARE(calendar->firstDayOfYear(testDate),  QDate(2010,  1, 1));
1007     QCOMPARE(calendar->lastDayOfYear(testDate),   QDate(2010, 12, 31));
1008     QCOMPARE(calendar->firstDayOfYear(2010),      QDate(2010,  1,  1));
1009     QCOMPARE(calendar->lastDayOfYear(2010),       QDate(2010, 12, 31));
1010     QCOMPARE(calendar->firstDayOfMonth(testDate), QDate(2010,  6,  1));
1011     QCOMPARE(calendar->lastDayOfMonth(testDate),  QDate(2010,  6, 30));
1012     QCOMPARE(calendar->firstDayOfMonth(2010, 6),  QDate(2010,  6,  1));
1013     QCOMPARE(calendar->lastDayOfMonth(2010, 6),   QDate(2010,  6, 30));
1014 }
1015 
testEra()1016 void KCalendarTest::testEra()
1017 {
1018     KConfigGroup lcg(KSharedConfig::openConfig(), QString("Locale"));
1019     KConfigGroup cg = lcg.group(QString("KCalendarSystem %1").arg("gregorian"));
1020     cg.deleteGroup();
1021 
1022     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
1023 
1024     int earliestValidYear = calendar->year(calendar->earliestValidDate());
1025     int latestValidYear = calendar->year(calendar->latestValidDate());
1026 
1027     QDate testDate;
1028     calendar->setDate(testDate, 2005, 1, 1);
1029     QCOMPARE(calendar->yearInEra(testDate), 2005);
1030     QCOMPARE(calendar->eraName(testDate), QString("AD"));
1031     QCOMPARE(calendar->eraName(testDate, KCalendarSystem::ShortFormat), QString("AD"));
1032     QCOMPARE(calendar->eraName(testDate, KCalendarSystem::LongFormat), QString("Anno Domini"));
1033     calendar->setDate(testDate, -5, 1, 1);
1034     QCOMPARE(calendar->yearInEra(testDate), 5);
1035     QCOMPARE(calendar->eraName(testDate), QString("BC"));
1036     QCOMPARE(calendar->eraName(testDate, KCalendarSystem::ShortFormat), QString("BC"));
1037     QCOMPARE(calendar->eraName(testDate, KCalendarSystem::LongFormat), QString("Before Christ"));
1038 
1039     QCOMPARE(calendar->isValid("BC",            qAbs(earliestValidYear - 1), 1, 1), false);
1040     QCOMPARE(calendar->isValid("BC",            qAbs(earliestValidYear),     1, 1), true);
1041     QCOMPARE(calendar->isValid("Before Christ", qAbs(earliestValidYear),     1, 1), true);
1042     QCOMPARE(calendar->isValid("BC",            -1,                            1, 1), true);
1043     QCOMPARE(calendar->isValid("Before Christ", -1,                            1, 1), true);
1044     QCOMPARE(calendar->isValid("BC", 0,                                        1, 1), false);
1045     QCOMPARE(calendar->isValid("AD", 1,                                        1, 1), true);
1046     QCOMPARE(calendar->isValid("Anno Domini",   1,                             1, 1), true);
1047     QCOMPARE(calendar->isValid("AD",            latestValidYear,               1, 1), true);
1048     QCOMPARE(calendar->isValid("Anno Domini",   latestValidYear,               1, 1), true);
1049     QCOMPARE(calendar->isValid("AD",            latestValidYear + 1,           1, 1), false);
1050 
1051     QCOMPARE(calendar->isValid("AD", 2005,  0,  1), false);
1052     QCOMPARE(calendar->isValid("AD", 2005, 13,  1), false);
1053     QCOMPARE(calendar->isValid("AD", 2005,  1,  0), false);
1054     QCOMPARE(calendar->isValid("AD", 2005,  1, 32), false);
1055     QCOMPARE(calendar->isValid("AD", 2005,  1,  1), true);
1056     QCOMPARE(calendar->isValid("AD", 2005,  1, 31), true);
1057     QCOMPARE(calendar->isValid("AD", 2005, 12,  1), true);
1058     QCOMPARE(calendar->isValid("AD", 2005, 12, 31), true);
1059 
1060     QCOMPARE(setEraDate(calendar, "BC",            qAbs(earliestValidYear - 1), 1, 1), QDate());
1061     QCOMPARE(setEraDate(calendar, "BC",            qAbs(earliestValidYear),     1, 1), QDate(earliestValidYear, 1, 1));
1062     QCOMPARE(setEraDate(calendar, "Before Christ", qAbs(earliestValidYear),     1, 1), QDate(earliestValidYear, 1, 1));
1063     QCOMPARE(setEraDate(calendar, "BC",            1,                             1, 1), QDate(-1,                1, 1));
1064     QCOMPARE(setEraDate(calendar, "Before Christ", 1,                             1, 1), QDate(-1,                1, 1));
1065     QCOMPARE(setEraDate(calendar, "BC",            0,                             1, 1), QDate());
1066     QCOMPARE(setEraDate(calendar, "AD",            1,                             1, 1), QDate(1,                 1, 1));
1067     QCOMPARE(setEraDate(calendar, "Anno Domini",   1,                             1, 1), QDate(1,                 1, 1));
1068     QCOMPARE(setEraDate(calendar, "AD",            latestValidYear,               1, 1), QDate(latestValidYear,   1, 1));
1069     QCOMPARE(setEraDate(calendar, "Anno Domini",   latestValidYear,               1, 1), QDate(latestValidYear,   1, 1));
1070     QCOMPARE(setEraDate(calendar, "AD",            latestValidYear + 1,           1, 1), QDate());
1071 
1072     QCOMPARE(setEraDate(calendar, "AD", 2005,  0,  1), QDate());
1073     QCOMPARE(setEraDate(calendar, "AD", 2005, 13,  1), QDate());
1074     QCOMPARE(setEraDate(calendar, "AD", 2005,  1,  0), QDate());
1075     QCOMPARE(setEraDate(calendar, "AD", 2005,  1, 32), QDate());
1076     QCOMPARE(setEraDate(calendar, "AD", 2005,  1,  1), QDate(2005,  1,  1));
1077     QCOMPARE(setEraDate(calendar, "AD", 2005,  1, 31), QDate(2005,  1, 31));
1078     QCOMPARE(setEraDate(calendar, "AD", 2005, 12,  1), QDate(2005, 12,  1));
1079     QCOMPARE(setEraDate(calendar, "AD", 2005, 12, 31), QDate(2005, 12, 31));
1080 
1081     delete calendar;
1082     cg.writeEntry("Era1", QString::fromUtf8("-:1:-0001-01-01::Test Era 1:TE1:£%Ey£%EC£"));
1083     cg.writeEntry("Era2", QString::fromUtf8("+:1:0001-01-01::Test Era 2:TE2:^%Ey^%EC^"));
1084     calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
1085     testEraDate(calendar, QDate(2010,  1,  1), 2010, "2010", "2010", "TE2", "Test Era 2");
1086     testEraDate(calendar, QDate(-5,  1,  1),    5, "5",    "0005", "TE1", "Test Era 1");
1087     QCOMPARE(calendar->formatDate(QDate(2010, 1, 1), "%EY"), QString::fromUtf8("^2010^TE2^"));
1088     QCOMPARE(calendar->formatDate(QDate(-5, 1, 1), "%EY"), QString::fromUtf8("£5£TE1£"));
1089 
1090     cg.deleteGroup();
1091     cg.markAsClean();
1092     lcg.markAsClean();
1093     delete calendar;
1094 }
1095 
setEraDate(const KCalendarSystem * calendar,const QString & era,int yearInEra,int month,int day)1096 QDate KCalendarTest::setEraDate(const KCalendarSystem *calendar, const QString &era, int yearInEra, int month, int day)
1097 {
1098     QDate resultDate;
1099     calendar->setDate(resultDate, era, yearInEra, month, day);
1100     return resultDate;
1101 }
1102 
testGregorianCalendar()1103 void KCalendarTest::testGregorianCalendar()
1104 {
1105     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
1106     QDate testDate(2005, 9, 10);
1107 
1108     QCOMPARE(calendar->dayOfYear(testDate), 253);
1109 
1110     QVERIFY(calendar->setDate(testDate, 2000, 3, 1));
1111     QCOMPARE(calendar->year(testDate), 2000);
1112     QCOMPARE(calendar->month(testDate), 3);
1113     QCOMPARE(calendar->day(testDate), 1);
1114     QCOMPARE(calendar->daysInYear(testDate), 366);
1115 
1116     QDate newDate = calendar->addYears(testDate, 4);
1117     QCOMPARE(newDate.year(), 2004);
1118     QCOMPARE(calendar->daysInYear(newDate), 366);
1119 
1120     newDate = calendar->addMonths(testDate, -4);
1121     QCOMPARE(newDate.year(), 1999);
1122     QCOMPARE(newDate.month(), 11);
1123     QCOMPARE(newDate.day(), 1);
1124 
1125     newDate = calendar->addDays(newDate, 20);
1126     QCOMPARE(newDate.year(), 1999);
1127     QCOMPARE(newDate.month(), 11);
1128     QCOMPARE(newDate.day(), 21);
1129 
1130     delete calendar;
1131 }
1132 
testHebrew()1133 void KCalendarTest::testHebrew()
1134 {
1135     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::HebrewCalendar);
1136     QDate testDate(2005, 9, 10);   // 5756-13-06
1137     QCOMPARE(calendar->dayOfYear(testDate), 360);
1138 
1139     QVERIFY(calendar->setDate(testDate, 5760, 12, 24));
1140     QCOMPARE(calendar->year(testDate), 5760);
1141     QCOMPARE(calendar->month(testDate), 12);
1142     QCOMPARE(calendar->day(testDate), 24);
1143     QCOMPARE(calendar->daysInYear(testDate), 385);
1144 
1145     testDate = calendar->addYears(testDate, 4);
1146     QCOMPARE(calendar->year(testDate), 5764);
1147     QCOMPARE(calendar->month(testDate), 12);
1148     QCOMPARE(calendar->day(testDate), 24);
1149     QCOMPARE(calendar->daysInYear(testDate), 355);
1150 
1151     testDate = calendar->addMonths(testDate, -4);
1152     QCOMPARE(calendar->year(testDate), 5764);
1153     QCOMPARE(calendar->month(testDate), 8);
1154     QCOMPARE(calendar->day(testDate), 24);
1155     QCOMPARE(calendar->daysInYear(testDate), 355);
1156 
1157     testDate = calendar->addDays(testDate, 20);
1158     QCOMPARE(calendar->year(testDate), 5764);
1159     QCOMPARE(calendar->month(testDate), 9);
1160     QCOMPARE(calendar->day(testDate), 15);
1161     QCOMPARE(calendar->daysInYear(testDate), 355);
1162 
1163     delete calendar;
1164 }
1165 
testIslamicCivil()1166 void KCalendarTest::testIslamicCivil()
1167 {
1168     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::IslamicCivilCalendar);
1169 
1170     QDate testDate(2008, 12, 29);   //1430-01-01, jd 2454830, not leap
1171     QCOMPARE(calendar->year(testDate), 1430);
1172     QCOMPARE(calendar->month(testDate), 1);
1173     QCOMPARE(calendar->day(testDate), 1);
1174     QCOMPARE(calendar->isLeapYear(testDate), false);
1175     QCOMPARE(calendar->daysInYear(testDate), 354);
1176     QCOMPARE(calendar->daysInMonth(testDate), 30);
1177     QCOMPARE(calendar->dayOfYear(testDate), 1);
1178 
1179     testDate.setDate(2009, 12, 17);   //1430-12-29, jd 2455183, not leap
1180     QCOMPARE(calendar->year(testDate), 1430);
1181     QCOMPARE(calendar->month(testDate), 12);
1182     QCOMPARE(calendar->day(testDate), 29);
1183     QCOMPARE(calendar->isLeapYear(testDate), false);
1184     QCOMPARE(calendar->daysInYear(testDate), 354);
1185     QCOMPARE(calendar->daysInMonth(testDate), 29);
1186     QCOMPARE(calendar->dayOfYear(testDate), 354);
1187 
1188     testDate.setDate(2009, 12, 18);   //1431-01-01, jd 2455184, leap
1189     QCOMPARE(calendar->year(testDate), 1431);
1190     QCOMPARE(calendar->month(testDate), 1);
1191     QCOMPARE(calendar->day(testDate), 1);
1192     QCOMPARE(calendar->isLeapYear(testDate), true);
1193     QCOMPARE(calendar->daysInYear(testDate), 355);
1194     QCOMPARE(calendar->daysInMonth(testDate), 30);
1195     QCOMPARE(calendar->dayOfYear(testDate), 1);
1196 
1197     testDate.setDate(2010, 12, 7);   //1431-12-30, jd 2455538, leap
1198     QCOMPARE(calendar->year(testDate), 1431);
1199     QCOMPARE(calendar->month(testDate), 12);
1200     QCOMPARE(calendar->day(testDate), 30);
1201     QCOMPARE(calendar->isLeapYear(testDate), true);
1202     QCOMPARE(calendar->daysInYear(testDate), 355);
1203     QCOMPARE(calendar->daysInMonth(testDate), 30);
1204     QCOMPARE(calendar->dayOfYear(testDate), 355);
1205 
1206     testDate.setDate(2005, 9, 10);   //1426-08-06
1207     QCOMPARE(calendar->year(testDate), 1426);
1208     QCOMPARE(calendar->month(testDate), 8);
1209     QCOMPARE(calendar->day(testDate), 6);
1210     QCOMPARE(calendar->daysInYear(testDate), 355);
1211     QCOMPARE(calendar->daysInMonth(testDate), 29);
1212     QCOMPARE(calendar->weeksInYear(testDate.year()), 50);
1213     QCOMPARE(calendar->weekNumber(testDate), 31);
1214     QCOMPARE(calendar->dayOfYear(testDate), 213);
1215 
1216     QVERIFY(calendar->setDate(testDate, 2000, 3, 1));
1217     QCOMPARE(calendar->year(testDate), 2000);
1218     QCOMPARE(calendar->month(testDate), 3);
1219     QCOMPARE(calendar->day(testDate), 1);
1220 
1221     QDate newDate = calendar->addYears(testDate, 4);
1222     QCOMPARE(newDate.year(), 2566);
1223     QCOMPARE(calendar->daysInYear(newDate), 355);
1224 
1225     newDate = calendar->addMonths(testDate, -4);
1226     QCOMPARE(newDate.year(), 2561);
1227     QCOMPARE(newDate.month(), 11);
1228     QCOMPARE(newDate.day(), 10);
1229 
1230     newDate = calendar->addDays(newDate, 20);
1231     QCOMPARE(newDate.year(), 2561);
1232     QCOMPARE(newDate.month(), 11);
1233     QCOMPARE(newDate.day(), 30);
1234 
1235     delete calendar;
1236 }
1237 
testIndianNational()1238 void KCalendarTest::testIndianNational()
1239 {
1240     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::IndianNationalCalendar);
1241     QDate testDate(2005, 9, 10);
1242 
1243     calendar->setDate(testDate, 2000, 1, 1);
1244     calendar->setDate(testDate, 2000, 1, 10);
1245     calendar->setDate(testDate, 2000, 2, 10);
1246     calendar->setDate(testDate, 2000, 5, 20);
1247     calendar->setDate(testDate, 2000, 7, 1);
1248     calendar->setDate(testDate, 2000, 7, 10);
1249     calendar->setDate(testDate, 2000, 9, 10);
1250     calendar->setDate(testDate, 2000, 12, 20);
1251 
1252     QCOMPARE(calendar->isLeapYear(2009), false);
1253     QCOMPARE(calendar->isLeapYear(testDate), false);
1254 
1255     QVERIFY(calendar->setDate(testDate, 2000, 3, 1));
1256     QCOMPARE(calendar->year(testDate), 2000);
1257     QCOMPARE(calendar->month(testDate), 3);
1258     QCOMPARE(calendar->day(testDate), 1);
1259 
1260     // Test some key dates
1261     testYmd(calendar,    0,  1,  1, 1749630);
1262     testYmd(calendar,    0, 12, 30, 1749994);
1263     testYmd(calendar, 1922,  1,  1, QDate(2000,  3, 21).toJulianDay());
1264     testYmd(calendar, 1922, 12, 30, QDate(2001,  3, 21).toJulianDay());
1265     testYmd(calendar, 1932,  1,  1, QDate(2010,  3, 22).toJulianDay());
1266     testYmd(calendar, 1932, 12, 30, QDate(2011,  3, 21).toJulianDay());
1267 
1268     testRoundTrip(calendar);
1269 
1270     delete calendar;
1271 }
1272 
testGregorianCalendarBasic()1273 void KCalendarTest::testGregorianCalendarBasic()
1274 {
1275     KConfigGroup lcg(KSharedConfig::openConfig(), QString("Locale"));
1276     KConfigGroup cg = lcg.group(QString("KCalendarSystem %1").arg("gregorian"));
1277     cg.deleteGroup();
1278 
1279     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
1280 
1281     testCalendarSystemType(calendar, KLocale::GregorianCalendar, "gregorian", "Gregorian");
1282 
1283     QCOMPARE(calendar->epoch(), QDate::fromJulianDay(1721426));
1284     QCOMPARE(calendar->epoch(), QDate(1, 1, 1));
1285     QCOMPARE(calendar->earliestValidDate(), QDate(-9999, 1, 1));
1286     QCOMPARE(calendar->latestValidDate(), QDate(9999, 12, 31));
1287 
1288     testValid(calendar, 0, 10000, 13, 32, QDate(-10000, 1, 1));
1289 
1290     QCOMPARE(calendar->isLeapYear(2007), false);
1291     QCOMPARE(calendar->isLeapYear(2008), true);
1292     QCOMPARE(calendar->isLeapYear(1900), false);
1293     QCOMPARE(calendar->isLeapYear(2000), true);
1294     QCOMPARE(calendar->isLeapYear(QDate(2007, 1, 1)), false);
1295     QCOMPARE(calendar->isLeapYear(QDate(2008, 1, 1)), true);
1296 
1297     QCOMPARE(calendar->daysInWeek(QDate(2007, 1, 1)), 7);
1298 
1299     QCOMPARE(calendar->monthsInYear(2007),                12);
1300     QCOMPARE(calendar->monthsInYear(QDate(2007, 1, 1)), 12);
1301 
1302     testYear(calendar, QDate(2007, 7, 9), 2007, QString("07"), QString("2007"));
1303     testMonth(calendar, QDate(2007, 7, 9),    7, QString("7"),  QString("07"));
1304     testDay(calendar, QDate(2007, 7, 9),    9, QString("9"),  QString("09"));
1305 
1306     testEraDate(calendar, QDate(2005, 1, 1), 2005, "2005", "2005", "AD", "Anno Domini");
1307     testEraDate(calendar, QDate(-5, 1, 1),    5, "5",    "0005", "BC", "Before Christ");
1308 
1309     testWeekDayName(calendar, 6, QDate(2007, 7, 28), "S", "Sat", "Saturday");
1310     testMonthName(calendar, 12, 2007, QDate(2007, 12, 20), "D", "Dec", "December", "of Dec", "of December");
1311 
1312     QCOMPARE(calendar->monthsInYear(QDate(2007, 1, 1)), 12);
1313 
1314     QCOMPARE(calendar->isProleptic(), true);
1315     QCOMPARE(calendar->isLunar(), false);
1316     QCOMPARE(calendar->isLunisolar(), false);
1317     QCOMPARE(calendar->isSolar(), true);
1318 
1319     testRoundTrip(calendar);
1320 
1321     delete calendar;
1322 }
1323 
testGregorianCalendarYmd()1324 void KCalendarTest::testGregorianCalendarYmd()
1325 {
1326     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
1327     testYmd(calendar, 2007, 1, 1, QDate(2007, 1, 1).toJulianDay());
1328     delete calendar;
1329 }
1330 
testGregorianCalendarSpecialCases()1331 void KCalendarTest::testGregorianCalendarSpecialCases()
1332 {
1333     KConfigGroup lcg(KSharedConfig::openConfig(), QString("Locale"));
1334     KConfigGroup cg = lcg.group(QString("KCalendarSystem %1").arg("gregorian"));
1335     cg.deleteGroup();
1336 
1337     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
1338 
1339     testEraDate(calendar, QDate(2010,  1,  1), 2010, "2010", "2010", "AD", "Anno Domini");
1340     testEraDate(calendar, QDate(-5,  1,  1),    5, "5",    "0005", "BC", "Before Christ");
1341 
1342     delete calendar;
1343     cg.writeEntry("UseCommonEra", false, KConfigGroup::Global);
1344     calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
1345     testEraDate(calendar, QDate(2010,  1,  1), 2010, "2010", "2010", "AD", "Anno Domini");
1346     testEraDate(calendar, QDate(-5,  1,  1),    5, "5",    "0005", "BC", "Before Christ");
1347 
1348     delete calendar;
1349     cg.writeEntry("UseCommonEra", true, KConfigGroup::Global);
1350     calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
1351     testEraDate(calendar, QDate(2010,  1,  1), 2010, "2010", "2010", "CE", "Common Era");
1352     testEraDate(calendar, QDate(-5,  1,  1),    5, "5",    "0005", "BCE", "Before Common Era");
1353 
1354     cg.deleteGroup();
1355     cg.markAsClean();
1356     delete calendar;
1357 }
1358 
testHebrewBasic()1359 void KCalendarTest::testHebrewBasic()
1360 {
1361     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::HebrewCalendar);
1362     QDate testDate;
1363 
1364     testCalendarSystemType(calendar, KLocale::HebrewCalendar, "hebrew", "Hebrew");
1365 
1366     testEpoch(calendar,                1,  1,  1,  347998);
1367     testEarliestValidDate(calendar, 5344,  1,  1, 2299498);
1368     testLatestValidDate(calendar, 8119, 13, 29, 3313431);
1369 
1370     testDate = QDate::fromJulianDay(2450340);   //5756-12-29 Not Leap
1371     QCOMPARE(calendar->isLeapYear(5756), false);
1372     QCOMPARE(calendar->isLeapYear(testDate), false);
1373     QCOMPARE(calendar->monthsInYear(testDate), 12);
1374     QCOMPARE(calendar->month(testDate), 12);
1375     QCOMPARE(calendar->monthName(testDate), QString("Elul"));
1376 
1377     testDate = QDate::fromJulianDay(2450723);   //5757-13-29 Leap
1378     QCOMPARE(calendar->isLeapYear(5757), true);
1379     QCOMPARE(calendar->isLeapYear(testDate), true);
1380     QCOMPARE(calendar->monthsInYear(testDate), 13);
1381     QCOMPARE(calendar->month(testDate), 13);
1382     QCOMPARE(calendar->monthName(testDate), QString("Elul"));
1383 
1384     // 5707-01-01 Thursday
1385     testDate = QDate::fromJulianDay(2432090);
1386 
1387     QCOMPARE(calendar->daysInWeek(testDate), 7);
1388 
1389     testYear(calendar, testDate, 5707, "07", "5707");
1390     testMonth(calendar, testDate,    1,  "1",   "01");
1391     testDay(calendar, testDate,    1,  "1",   "01");
1392 
1393     testEraDate(calendar, testDate, 5707, "5707", "5707", "AM", "Anno Mundi");
1394 
1395     testWeekDayName(calendar, 4, testDate, "T", "Thu", "Thursday");
1396     testMonthName(calendar, 1, 5707, testDate, "T", "Tis", "Tishrey", "of Tis", "of Tishrey");
1397 
1398     QCOMPARE(calendar->isProleptic(), false);
1399     QCOMPARE(calendar->isLunar(), false);
1400     QCOMPARE(calendar->isLunisolar(), true);
1401     QCOMPARE(calendar->isSolar(), false);
1402 
1403     testRoundTrip(calendar);
1404 
1405     delete calendar;
1406 }
1407 
testHebrewYmd()1408 void KCalendarTest::testHebrewYmd()
1409 {
1410 //    const KCalendarSystem *calendar = KCalendarSystem::create( KLocale::HebrewCalendar );
1411 //    testYmd( calendar, 2007, 1, 1, QDate( 2007, 1, 1 ).toJulianDay() );
1412 //    delete calendar;
1413 }
1414 
testHebrewCompare()1415 void KCalendarTest::testHebrewCompare()
1416 {
1417     /*
1418         const KCalendarSystemHebrew *calendar = new KCalendarSystemHebrew();
1419         QDate setOldDate, setNewDate;
1420 
1421         for ( QDate testDate( 1900, 1, 1 ); testDate.year() == 2100; testDate.addDays(1) ) {
1422             QCOMPARE( calendar->year(  testDate ), calendar->oldyear(  testDate ) );
1423             QCOMPARE( calendar->month( testDate ), calendar->oldmonth( testDate ) );
1424             QCOMPARE( calendar->day(   testDate ), calendar->oldday(   testDate ) );
1425 
1426             calendar->setDate(setOldDate, calendar->oldyear( testDate ), calendar->oldmonth( testDate ), calendar->oldday( testDate ) );
1427             calendar->setDate(setNewDate, calendar->oldyear( testDate ), calendar->oldmonth( testDate ), calendar->oldday( testDate ) );
1428             QCOMPARE( setNewDate.toJulianDay(), setOldDate.toJulianDay() );
1429         }
1430 
1431         delete calendar;
1432     */
1433 }
1434 
1435 // Test Islamic Civil Calendar System
1436 
testIslamicCivilBasic()1437 void KCalendarTest::testIslamicCivilBasic()
1438 {
1439     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::IslamicCivilCalendar);
1440     QDate testDate;
1441 
1442     testCalendarSystemType(calendar, KLocale::IslamicCivilCalendar, "hijri", "Islamic / Hijri (Civil)");
1443 
1444     QCOMPARE(calendar->epoch(), QDate::fromJulianDay(1948440));
1445     QCOMPARE(calendar->earliestValidDate(), QDate::fromJulianDay(1948440));
1446     QCOMPARE(calendar->latestValidDate(), QDate(10323, 10, 21));
1447 
1448     testValid(calendar, 0, 10000, 13, 31, QDate(1, 1, 1));
1449 
1450     QCOMPARE(calendar->isLeapYear(1427), false);
1451     QCOMPARE(calendar->isLeapYear(1428), true);
1452     QCOMPARE(calendar->isLeapYear(QDate(2007, 1, 1)), false);
1453     QCOMPARE(calendar->isLeapYear(QDate(2008, 1, 1)), true);
1454 
1455     // 1426-08-06 Saturday
1456     testDate = QDate(2005, 9, 10);
1457 
1458     QCOMPARE(calendar->daysInWeek(testDate), 7);
1459 
1460     QCOMPARE(calendar->monthsInYear(1426),     12);
1461     QCOMPARE(calendar->monthsInYear(testDate), 12);
1462 
1463     testYear(calendar, testDate, 1426, "26", "1426");
1464     testMonth(calendar, testDate,    8, "8",  "08");
1465     testDay(calendar, testDate,    6, "6",  "06");
1466 
1467     testEraDate(calendar, testDate, 1426, "1426", "1426", "AH", "Anno Hegirae");
1468 
1469     testWeekDayName(calendar, 6, testDate, "S", "Sab", "Yaum al-Sabt");
1470     testMonthName(calendar, 12, 1428, QDate(2007, 12, 20), "H", "Hij", "Thu al-Hijjah", "of Hij", "of Thu al-Hijjah");
1471 
1472     QCOMPARE(calendar->monthsInYear(testDate), 12);
1473 
1474     QCOMPARE(calendar->isProleptic(), false);
1475     QCOMPARE(calendar->isLunar(), true);
1476     QCOMPARE(calendar->isLunisolar(), false);
1477     QCOMPARE(calendar->isSolar(), false);
1478 
1479     testRoundTrip(calendar);
1480 
1481     delete calendar;
1482 }
1483 
testIslamicCivilYmd()1484 void KCalendarTest::testIslamicCivilYmd()
1485 {
1486     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::IslamicCivilCalendar);
1487     testYmd(calendar, 1426, 8, 6, QDate(2005, 9, 10).toJulianDay());
1488     delete calendar;
1489 }
1490 
1491 // Jalali Calendar System
1492 
testJalaliBasic()1493 void KCalendarTest::testJalaliBasic()
1494 {
1495     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::JalaliCalendar);
1496     QDate testDate;
1497 
1498     testCalendarSystemType(calendar, KLocale::JalaliCalendar, "jalali", "Jalali");
1499 
1500     //Birashk argorithm only good between AP 1244-01-01 to 1530-12-29 (AD 1865 to 2152)
1501     QCOMPARE(calendar->epoch(), QDate::fromJulianDay(1948321));
1502     QCOMPARE(calendar->earliestValidDate(), QDate(1865, 03, 21));
1503     QCOMPARE(calendar->latestValidDate(), QDate(2152, 03, 19));
1504     QCOMPARE(calendar->isValid(1243, 12, 29), false);
1505     QCOMPARE(calendar->isValid(1531, 1, 1), false);
1506 
1507     QCOMPARE(calendar->isLeapYear(1386), false);
1508     QCOMPARE(calendar->isLeapYear(1387), true);
1509     QCOMPARE(calendar->isLeapYear(QDate(2008, 1, 1)), false);
1510     QCOMPARE(calendar->isLeapYear(QDate(2009, 1, 1)), true);
1511 
1512     testDate = QDate(2005, 8, 31);   // 1384-06-09 Wednesday
1513 
1514     QCOMPARE(calendar->daysInWeek(testDate),    7);
1515     QCOMPARE(calendar->monthsInYear(1384),     12);
1516     QCOMPARE(calendar->monthsInYear(testDate), 12);
1517 
1518     testYear(calendar, testDate, 1384, "84", "1384");
1519     testMonth(calendar, testDate,    6, "6",  "06");
1520     testDay(calendar, testDate,    9, "9",  "09");
1521 
1522     testEraDate(calendar, testDate, 1384, "1384", "1384", "AP", "Anno Persico");
1523 
1524     testWeekDayName(calendar, 3, testDate, "4", "4sh", "Chahar shanbe");
1525     testMonthName(calendar, 6, 1384, testDate, "S", "Sha", "Shahrivar", "of Sha", "of Shahrivar");
1526 
1527     QCOMPARE(calendar->monthsInYear(testDate), 12);
1528 
1529     QCOMPARE(calendar->isProleptic(), false);
1530     QCOMPARE(calendar->isLunar(), false);
1531     QCOMPARE(calendar->isLunisolar(), false);
1532     QCOMPARE(calendar->isSolar(), true);
1533 
1534     testRoundTrip(calendar);
1535 
1536     //Special cases using Birashk argorithm
1537     QCOMPARE(calendar->isLeapYear(1403), true);
1538     QCOMPARE(calendar->isLeapYear(1404), false);
1539     QCOMPARE(calendar->isLeapYear(1436), true);
1540     QCOMPARE(calendar->isLeapYear(1437), false);
1541 
1542     delete calendar;
1543 }
1544 
testJalaliYmd()1545 void KCalendarTest::testJalaliYmd()
1546 {
1547     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::JalaliCalendar);
1548     testYmd(calendar, 1384, 6, 9, QDate(2005, 8, 31).toJulianDay());
1549     delete calendar;
1550 }
1551 
testJapanese()1552 void KCalendarTest::testJapanese()
1553 {
1554     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::JapaneseCalendar);
1555     QDate testDate(2005, 9, 10);
1556 
1557     QCOMPARE(calendar->dayOfYear(testDate), 253);
1558 
1559     QVERIFY(calendar->setDate(testDate, 2000, 3, 1));
1560     QCOMPARE(calendar->year(testDate), 2000);
1561     QCOMPARE(calendar->month(testDate), 3);
1562     QCOMPARE(calendar->day(testDate), 1);
1563     QCOMPARE(calendar->daysInYear(testDate), 366);
1564 
1565     QDate newDate = calendar->addYears(testDate, 4);
1566     QCOMPARE(newDate.year(), 2004);
1567     QCOMPARE(calendar->daysInYear(newDate), 366);
1568 
1569     newDate = calendar->addMonths(testDate, -4);
1570     QCOMPARE(newDate.year(), 1999);
1571     QCOMPARE(newDate.month(), 11);
1572     QCOMPARE(newDate.day(), 1);
1573 
1574     newDate = calendar->addDays(newDate, 20);
1575     QCOMPARE(newDate.year(), 1999);
1576     QCOMPARE(newDate.month(), 11);
1577     QCOMPARE(newDate.day(), 21);
1578 
1579     delete calendar;
1580 }
1581 
testJapaneseBasic()1582 void KCalendarTest::testJapaneseBasic()
1583 {
1584     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::JapaneseCalendar);
1585     QDate testDate;
1586 
1587     testCalendarSystemType(calendar, KLocale::JapaneseCalendar, "japanese", "Japanese");
1588 
1589     QCOMPARE(calendar->epoch(), QDate::fromJulianDay(1721426));
1590     QCOMPARE(calendar->earliestValidDate(), QDate::fromJulianDay(1721426));
1591     QCOMPARE(calendar->latestValidDate(), QDate(9999, 12, 31));
1592 
1593     testValid(calendar, 0, 10000, 13, 32, QDate(-5000, 1, 1));
1594 
1595     QCOMPARE(calendar->isLeapYear(2007), false);
1596     QCOMPARE(calendar->isLeapYear(2008), true);
1597     QCOMPARE(calendar->isLeapYear(1900), false);
1598     QCOMPARE(calendar->isLeapYear(2000), true);
1599     QCOMPARE(calendar->isLeapYear(QDate(2007, 1, 1)), false);
1600     QCOMPARE(calendar->isLeapYear(QDate(2008, 1, 1)), true);
1601 
1602     QCOMPARE(calendar->daysInWeek(QDate(2007, 1, 1)), 7);
1603     QCOMPARE(calendar->monthsInYear(QDate(2007, 1, 1)), 12);
1604 
1605     testDate = QDate(2007, 7, 9);   // 2007-07-09
1606     testYear(calendar, testDate, 2007, "07", "2007");
1607     testMonth(calendar, testDate,    7, "7",  "07");
1608     testDay(calendar, testDate,    9, "9",  "09");
1609 
1610     testEraDate(calendar, testDate,   19, "19", "0019", "Heisei", "Heisei");
1611 
1612     testWeekDayName(calendar, 6, QDate(2007, 7, 28), "S", "Sat", "Saturday");
1613     testMonthName(calendar, 12, 2007, QDate(2007, 12, 20), "D", "Dec", "December", "of Dec", "of December");
1614 
1615     QCOMPARE(calendar->monthsInYear(QDate(2007, 1, 1)), 12);
1616 
1617     QCOMPARE(calendar->isProleptic(), false);
1618     QCOMPARE(calendar->isLunar(), false);
1619     QCOMPARE(calendar->isLunisolar(), false);
1620     QCOMPARE(calendar->isSolar(), true);
1621 
1622     testRoundTrip(calendar);
1623 
1624     delete calendar;
1625 }
1626 
testJapaneseYmd()1627 void KCalendarTest::testJapaneseYmd()
1628 {
1629     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::JapaneseCalendar);
1630     testYmd(calendar, 2007, 1, 1, QDate(2007, 1, 1).toJulianDay());
1631     delete calendar;
1632 }
1633 
testJapaneseSpecialCases()1634 void KCalendarTest::testJapaneseSpecialCases()
1635 {
1636     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::JapaneseCalendar);
1637 
1638     // Test Japanese Eras
1639     // Heisei > 1        1990-01-01 onwards
1640     // Heisei 1 (Gannen) 1989-01-08 to 1989-12-31
1641     // Shōwa > 1         1927-01-01 to 1989-01-07
1642     // Shōwa 1 (Gannen)  1926-12-25 to 1926-12-31
1643     // Taishō > 1        1913-01-01 to 1926-12-24
1644     // Taishō 1 (Gannen) 1912-07-30 to 1912-12-31
1645     // Meiji > 1         1869-01-01 to 1912-07-29
1646     // Meiji 1 (Gannen)  1868-09-08 to 1868-12-31
1647     // Gregorian         0001-01-01 to 1868-09-07
1648 
1649     testEraDate(calendar, QDate(1990,  1,  1),    2,    "2", "0002", "Heisei", "Heisei");
1650     testEraDate(calendar, QDate(1989,  1,  8),    1,    "1", "0001", "Heisei", "Heisei");
1651     //testEraDate( calendar, QDate( 1989,  1,  7 ),   64,   "64", "0064", "Shōwa",  "Shōwa" );
1652     //testEraDate( calendar, QDate( 1927,  1,  1 ),    2,    "2", "0002", "Shōwa",  "Shōwa" );
1653     //testEraDate( calendar, QDate( 1926, 12, 25 ),    1,    "1", "0001", "Shōwa",  "Shōwa" );
1654     //testEraDate( calendar, QDate( 1926, 12, 24 ),   15,   "15", "0015", "Taishō", "Taishō" );
1655     //testEraDate( calendar, QDate( 1913,  1,  1 ),    2,    "2", "0002", "Taishō", "Taishō" );
1656     //testEraDate( calendar, QDate( 1912,  7, 30 ),    1,    "1", "0001", "Taishō", "Taishō" );
1657     testEraDate(calendar, QDate(1912,  7, 29),   45,   "45", "0045", "Meiji",  "Meiji");
1658     testEraDate(calendar, QDate(1869,  1,  1),    2,    "2", "0002", "Meiji",  "Meiji");
1659     testEraDate(calendar, QDate(1868,  9,  8),    1,    "1", "0001", "Meiji",  "Meiji");
1660     testEraDate(calendar, QDate(1868,  9,  7), 1868, "1868", "1868", "AD",     "Anno Domini");
1661 
1662     // Should always be able to read Gannen as year 1
1663     QCOMPARE(calendar->readDate("1 2 Heisei 1", "%e %n %EC %Ey"), QDate(1989, 2, 1));
1664     QCOMPARE(calendar->readDate("1 2 Heisei 1", "%e %n %EY"), QDate(1989, 2, 1));
1665     QCOMPARE(calendar->readDate("1 2 Heisei Gannen", "%e %n %EC %Ey"), QDate(1989, 2, 1));
1666     QCOMPARE(calendar->readDate("1 2 Heisei Gannen", "%e %n %EY"), QDate(1989, 2, 1));
1667 
1668     // Should only format Gannen if defined in %EY format, never for %Ey
1669     QCOMPARE(calendar->formatDate(QDate(1989, 2, 1), "%e %n %EC %Ey"), QString("1 2 Heisei 1"));
1670     QCOMPARE(calendar->formatDate(QDate(1989, 2, 1), "%e %n %EY"),     QString("1 2 Heisei Gannen"));
1671     QCOMPARE(calendar->formatDate(QDate(1990, 2, 1), "%e %n %EC %Ey"), QString("1 2 Heisei 2"));
1672     QCOMPARE(calendar->formatDate(QDate(1990, 2, 1), "%e %n %EY"),     QString("1 2 Heisei 2"));
1673 
1674     delete calendar;
1675 }
1676 
testMinguoBasic()1677 void KCalendarTest::testMinguoBasic()
1678 {
1679     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::MinguoCalendar);
1680 
1681     testCalendarSystemType(calendar, KLocale::MinguoCalendar, "minguo", "Taiwanese");
1682 
1683     QCOMPARE(calendar->epoch(), QDate(1912, 1, 1));
1684     QCOMPARE(calendar->earliestValidDate(), QDate(1912, 1, 1));
1685     QCOMPARE(calendar->latestValidDate(), QDate(11910, 12, 31));
1686 
1687     testValid(calendar, -1, 10000, 13, 32, QDate());
1688 
1689     QCOMPARE(calendar->isLeapYear(2007 - 1911), false);
1690     QCOMPARE(calendar->isLeapYear(2008 - 1911), true);
1691     QCOMPARE(calendar->isLeapYear(1900 - 1911), false);
1692     QCOMPARE(calendar->isLeapYear(2000 - 1911), true);
1693     QCOMPARE(calendar->isLeapYear(QDate(2007, 1, 1)), false);
1694     QCOMPARE(calendar->isLeapYear(QDate(2008, 1, 1)), true);
1695 
1696     QCOMPARE(calendar->daysInWeek(QDate(2007, 1, 1)), 7);
1697 
1698     QCOMPARE(calendar->monthsInYear(2007 - 1911),         12);
1699     QCOMPARE(calendar->monthsInYear(QDate(2007, 1, 1)), 12);
1700 
1701     testYear(calendar, QDate(2007, 7, 9), 2007 - 1911, QString("96"), QString("0096"));
1702     testMonth(calendar, QDate(2007, 7, 9),    7, QString("7"),  QString("07"));
1703     testDay(calendar, QDate(2007, 7, 9),    9, QString("9"),  QString("09"));
1704 
1705     testEraDate(calendar, QDate(2007, 1, 1), 2007 - 1911, "96", "0096", "ROC", "Republic of China Era");
1706 
1707     testWeekDayName(calendar, 6, QDate(2007, 7, 28), "S", "Sat", "Saturday");
1708     testMonthName(calendar, 12, 2007 - 1911, QDate(2007, 12, 20), "D", "Dec", "December", "of Dec", "of December");
1709 
1710     QCOMPARE(calendar->monthsInYear(QDate(2007, 1, 1)), 12);
1711 
1712     QCOMPARE(calendar->isProleptic(), false);
1713     QCOMPARE(calendar->isLunar(), false);
1714     QCOMPARE(calendar->isLunisolar(), false);
1715     QCOMPARE(calendar->isSolar(), true);
1716 
1717     testRoundTrip(calendar);
1718 
1719     delete calendar;
1720 }
1721 
testThaiBasic()1722 void KCalendarTest::testThaiBasic()
1723 {
1724     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::ThaiCalendar);
1725 
1726     testCalendarSystemType(calendar, KLocale::ThaiCalendar, "thai", "Thai");
1727 
1728     QCOMPARE(calendar->epoch(), QDate::fromJulianDay(1522734));
1729     QCOMPARE(calendar->earliestValidDate(), QDate::fromJulianDay(1522734));
1730     QCOMPARE(calendar->latestValidDate(), QDate(9456, 12, 31));
1731 
1732     testValid(calendar, -1, 10000, 13, 32, QDate());
1733 
1734     QCOMPARE(calendar->isLeapYear(2007 + 543), false);
1735     QCOMPARE(calendar->isLeapYear(2008 + 543), true);
1736     QCOMPARE(calendar->isLeapYear(1900 + 543), false);
1737     QCOMPARE(calendar->isLeapYear(2000 + 543), true);
1738     QCOMPARE(calendar->isLeapYear(QDate(2007, 1, 1)), false);
1739     QCOMPARE(calendar->isLeapYear(QDate(2008, 1, 1)), true);
1740 
1741     QCOMPARE(calendar->daysInWeek(QDate(2007, 1, 1)), 7);
1742 
1743     QCOMPARE(calendar->monthsInYear(2007 + 543),          12);
1744     QCOMPARE(calendar->monthsInYear(QDate(2007, 1, 1)), 12);
1745 
1746     testYear(calendar, QDate(2007, 7, 9), 2007 + 543, QString("50"), QString("2550"));
1747     testMonth(calendar, QDate(2007, 7, 9),    7, QString("7"),  QString("07"));
1748     testDay(calendar, QDate(2007, 7, 9),    9, QString("9"),  QString("09"));
1749 
1750     testEraDate(calendar, QDate(2007, 1, 1), 2007 + 543, "2550", "2550", "BE", "Buddhist Era");
1751 
1752     testWeekDayName(calendar, 6, QDate(2007, 7, 28), "S", "Sat", "Saturday");
1753     testMonthName(calendar, 12, 2007 + 543, QDate(2007, 12, 20), "D", "Dec", "December", "of Dec", "of December");
1754 
1755     QCOMPARE(calendar->monthsInYear(QDate(2007, 1, 1)), 12);
1756 
1757     QCOMPARE(calendar->isProleptic(), false);
1758     QCOMPARE(calendar->isLunar(), false);
1759     QCOMPARE(calendar->isLunisolar(), false);
1760     QCOMPARE(calendar->isSolar(), true);
1761 
1762     testRoundTrip(calendar);
1763 
1764     delete calendar;
1765 }
1766 
1767 // generic test functions, call from calendar system specific ones
testCalendarSystemType(const KCalendarSystem * calendar,KLocale::CalendarSystem system,const QString & type,const QString & label)1768 void KCalendarTest::testCalendarSystemType(const KCalendarSystem *calendar,
1769         KLocale::CalendarSystem system,
1770         const QString &type, const QString &label)
1771 {
1772     QCOMPARE(calendar->calendarType(),               type);
1773     QCOMPARE(calendar->calendarSystem(),             system);
1774     QCOMPARE(calendar->calendarLabel(),              label);
1775     QCOMPARE(KCalendarSystem::calendarLabel(system), label);
1776 }
1777 
1778 // Simply tests valid ranges of ymd values, testYmd covers all other dates
testValid(const KCalendarSystem * calendar,int lowInvalidYear,int highInvalidYear,int highInvalidMonth,int highInvalidDay,const QDate & invalidDate)1779 void KCalendarTest::testValid(const KCalendarSystem *calendar, int lowInvalidYear, int highInvalidYear,
1780                               int highInvalidMonth, int highInvalidDay, const QDate &invalidDate)
1781 {
1782     // min/max year
1783     QCOMPARE(calendar->isValid(lowInvalidYear, 1, 1), false);
1784     QCOMPARE(calendar->isValid(highInvalidYear, 1, 1), false);
1785 
1786     // min/max month
1787     QCOMPARE(calendar->isValid(1, 0, 1), false);
1788     QCOMPARE(calendar->isValid(1, highInvalidMonth, 1), false);
1789 
1790     // min/max day
1791     QCOMPARE(calendar->isValid(1, 1, 0), false);
1792     QCOMPARE(calendar->isValid(1, 1, highInvalidDay), false);
1793 
1794     QCOMPARE(calendar->isValid(1, 1,  1), true);
1795 
1796     QCOMPARE(calendar->isValid(invalidDate), false);
1797     QCOMPARE(calendar->isValid(QDate(2000, 1, 1)), true);
1798 }
1799 
testEpoch(const KCalendarSystem * calendar,int y,int m,int d,int jd)1800 void KCalendarTest::testEpoch(const KCalendarSystem *calendar, int y, int m, int d, int jd)
1801 {
1802     QCOMPARE(calendar->epoch(), QDate::fromJulianDay(jd));
1803     if (calendar->epoch() >= calendar->earliestValidDate()) {
1804         testYmd(calendar, y, m, d, jd);
1805     }
1806 }
1807 
testEarliestValidDate(const KCalendarSystem * calendar,int y,int m,int d,int jd)1808 void KCalendarTest::testEarliestValidDate(const KCalendarSystem *calendar, int y, int m, int d, int jd)
1809 {
1810     QCOMPARE(calendar->earliestValidDate(), QDate::fromJulianDay(jd));
1811     testYmd(calendar, y, m, d, jd);
1812 }
1813 
testLatestValidDate(const KCalendarSystem * calendar,int y,int m,int d,int jd)1814 void KCalendarTest::testLatestValidDate(const KCalendarSystem *calendar, int y, int m, int d, int jd)
1815 {
1816     QCOMPARE(calendar->latestValidDate(), QDate::fromJulianDay(jd));
1817     testYmd(calendar, y, m, d, jd);
1818 }
1819 
testYmd(const KCalendarSystem * calendar,int y,int m,int d,int jd)1820 void KCalendarTest::testYmd(const KCalendarSystem *calendar, int y, int m, int d, int jd)
1821 {
1822     QDate testDate1 = QDate::fromJulianDay(jd);
1823     QCOMPARE(calendar->year(testDate1), y);
1824     QCOMPARE(calendar->month(testDate1), m);
1825     QCOMPARE(calendar->day(testDate1), d);
1826 
1827     QDate testDate2;
1828     QVERIFY(calendar->setDate(testDate2, y, m, d));
1829     QCOMPARE(testDate1, testDate2);
1830 }
1831 
testYear(const KCalendarSystem * calendar,const QDate & date,int year,const QString & shortString,const QString & longString)1832 void KCalendarTest::testYear(const KCalendarSystem *calendar, const QDate &date,
1833                              int year, const QString &shortString, const QString &longString)
1834 {
1835     QCOMPARE(calendar->year(date), year);
1836     QCOMPARE(calendar->yearString(date, KCalendarSystem::ShortFormat), shortString);
1837     QCOMPARE(calendar->yearString(date, KCalendarSystem::LongFormat), longString);
1838     int i;
1839     QCOMPARE(calendar->yearStringToInteger(longString, i), year);
1840     QCOMPARE(i, longString.length());
1841 }
1842 
testMonth(const KCalendarSystem * calendar,const QDate & date,int month,const QString & shortString,const QString & longString)1843 void KCalendarTest::testMonth(const KCalendarSystem *calendar, const QDate &date,
1844                               int month, const QString &shortString, const QString &longString)
1845 {
1846     QCOMPARE(calendar->month(date), month);
1847     QCOMPARE(calendar->monthString(date, KCalendarSystem::ShortFormat), shortString);
1848     QCOMPARE(calendar->monthString(date, KCalendarSystem::LongFormat), longString);
1849     int i;
1850     QCOMPARE(calendar->monthStringToInteger(longString, i), month);
1851     QCOMPARE(i, longString.length());
1852 }
1853 
testDay(const KCalendarSystem * calendar,const QDate & date,int day,const QString & shortString,const QString & longString)1854 void KCalendarTest::testDay(const KCalendarSystem *calendar, const QDate &date,
1855                             int day, const QString &shortString, const QString &longString)
1856 {
1857     QCOMPARE(calendar->day(date), day);
1858     QCOMPARE(calendar->dayString(date, KCalendarSystem::ShortFormat), shortString);
1859     QCOMPARE(calendar->dayString(date, KCalendarSystem::LongFormat), longString);
1860     int i;
1861     QCOMPARE(calendar->dayStringToInteger(longString, i), day);
1862     QCOMPARE(i, longString.length());
1863 }
1864 
testEraDate(const KCalendarSystem * calendar,const QDate & date,int yearInEra,const QString & shortYearInEraString,const QString & longYearInEraString,const QString & shortEraName,const QString & longEraName)1865 void KCalendarTest::testEraDate(const KCalendarSystem *calendar, const QDate &date,
1866                                 int yearInEra, const QString &shortYearInEraString, const QString &longYearInEraString,
1867                                 const QString &shortEraName, const QString &longEraName)
1868 {
1869     QCOMPARE(calendar->yearInEra(date),                                     yearInEra);
1870     QCOMPARE(calendar->yearInEraString(date),                               shortYearInEraString);
1871     QCOMPARE(calendar->yearInEraString(date, KCalendarSystem::ShortFormat), shortYearInEraString);
1872     QCOMPARE(calendar->yearInEraString(date, KCalendarSystem::LongFormat),  longYearInEraString);
1873     QCOMPARE(calendar->eraName(date),                                       shortEraName);
1874     QCOMPARE(calendar->eraName(date, KCalendarSystem::ShortFormat),         shortEraName);
1875     QCOMPARE(calendar->eraName(date, KCalendarSystem::LongFormat),          longEraName);
1876 }
1877 
1878 // Pass in the week day number, the equivalent QDate, and the short and long day names
1879 //  e.g. testWeekDayName( cal, 6, QDate(y,m,d), QString("Monday"), QString("Mon") )
1880 
testWeekDayName(const KCalendarSystem * calendar,int weekDay,const QDate & date,const QString & narrowName,const QString & shortName,const QString & longName)1881 void KCalendarTest::testWeekDayName(const KCalendarSystem *calendar, int weekDay, const QDate &date,
1882                                     const QString &narrowName, const QString &shortName, const QString &longName)
1883 {
1884     QCOMPARE(calendar->weekDayName(weekDay, KCalendarSystem::ShortDayName), shortName);
1885     QCOMPARE(calendar->weekDayName(weekDay, KCalendarSystem::LongDayName), longName);
1886     QCOMPARE(calendar->weekDayName(weekDay), longName);
1887 
1888     // Test week day < min
1889     QCOMPARE(calendar->weekDayName(0, KCalendarSystem::ShortDayName), QString());
1890     QCOMPARE(calendar->weekDayName(0, KCalendarSystem::LongDayName), QString());
1891 
1892     // Test week day > max
1893     QCOMPARE(calendar->weekDayName(calendar->daysInWeek(date) + 1, KCalendarSystem::ShortDayName), QString());
1894     QCOMPARE(calendar->weekDayName(calendar->daysInWeek(date) + 1, KCalendarSystem::LongDayName), QString());
1895 
1896     // QDate parameter tests, so always in valid range
1897     QCOMPARE(calendar->weekDayName(date, KCalendarSystem::ShortDayName), shortName);
1898     QCOMPARE(calendar->weekDayName(date, KCalendarSystem::LongDayName), longName);
1899     QCOMPARE(calendar->weekDayName(date), longName);
1900 
1901     // Test format date componant
1902     QCOMPARE(calendar->formatDate(date, KLocale::DayOfWeekName, KLocale::NarrowName), narrowName);
1903     QCOMPARE(calendar->formatDate(date, KLocale::DayOfWeekName, KLocale::ShortName), shortName);
1904     QCOMPARE(calendar->formatDate(date, KLocale::DayOfWeekName, KLocale::LongName), longName);
1905 }
1906 
testMonthName(const KCalendarSystem * calendar,int month,int year,const QDate & date,const QString & narrowName,const QString & shortName,const QString & longName,const QString & shortNamePossessive,const QString & longNamePossessive)1907 void KCalendarTest::testMonthName(const KCalendarSystem *calendar, int month, int year, const QDate &date,
1908                                   const QString &narrowName, const QString &shortName, const QString &longName,
1909                                   const QString &shortNamePossessive, const QString &longNamePossessive)
1910 {
1911     QCOMPARE(calendar->monthName(month, year, KCalendarSystem::ShortName), shortName);
1912     QCOMPARE(calendar->monthName(month, year, KCalendarSystem::LongName), longName);
1913     QCOMPARE(calendar->monthName(month, year, KCalendarSystem::ShortNamePossessive),
1914              shortNamePossessive);
1915     QCOMPARE(calendar->monthName(month, year, KCalendarSystem::LongNamePossessive),
1916              longNamePossessive);
1917     QCOMPARE(calendar->monthName(month, year), longName);
1918 
1919     // Test month < min
1920     QCOMPARE(calendar->monthName(0, year, KCalendarSystem::ShortName), QString());
1921     QCOMPARE(calendar->monthName(0, year, KCalendarSystem::LongName),  QString());
1922     QCOMPARE(calendar->monthName(0, year, KCalendarSystem::ShortName), QString());
1923     QCOMPARE(calendar->monthName(0, year, KCalendarSystem::LongName),  QString());
1924 
1925     // Test month > max
1926     QCOMPARE(calendar->monthName(calendar->monthsInYear(date) + 1, year,
1927                                  KCalendarSystem::ShortName), QString());
1928     QCOMPARE(calendar->monthName(calendar->monthsInYear(date) + 1, year,
1929                                  KCalendarSystem::LongName), QString());
1930     QCOMPARE(calendar->monthName(calendar->monthsInYear(date) + 1, year,
1931                                  KCalendarSystem::ShortName), QString());
1932     QCOMPARE(calendar->monthName(calendar->monthsInYear(date) + 1, year,
1933                                  KCalendarSystem::LongName), QString());
1934 
1935     // QDate parameter tests, so always in valid range
1936     QCOMPARE(calendar->monthName(date, KCalendarSystem::ShortName), shortName);
1937     QCOMPARE(calendar->monthName(date, KCalendarSystem::LongName), longName);
1938     QCOMPARE(calendar->monthName(date, KCalendarSystem::ShortNamePossessive),
1939              shortNamePossessive);
1940     QCOMPARE(calendar->monthName(date, KCalendarSystem::LongNamePossessive),
1941              longNamePossessive);
1942     QCOMPARE(calendar->monthName(date), longName);
1943 
1944     // Test format date componant
1945     QCOMPARE(calendar->formatDate(date, KLocale::MonthName, KLocale::NarrowName), narrowName);
1946     QCOMPARE(calendar->formatDate(date, KLocale::MonthName, KLocale::ShortName), shortName);
1947     QCOMPARE(calendar->formatDate(date, KLocale::MonthName, KLocale::LongName), longName);
1948 }
1949 
testRoundTrip(const KCalendarSystem * calendar,bool testFullRange)1950 void KCalendarTest::testRoundTrip(const KCalendarSystem *calendar, bool testFullRange)
1951 {
1952     qDebug() << "Testing round trip of dates for Calendar System " << calendar->calendarLabel();
1953     qDebug() << "This may take some time, or you may have created an infinite loop.";
1954     qDebug() << "Uncomment the loop debug message to see each date comparison.";
1955 
1956     int testYear, testMonth, testDay;
1957     QDate testDate;
1958     // Limit to a short interesting date range for regular testing
1959     // Later add an Env var to choose full test whenever the formulas are changed.
1960     QDate loopDate, terminateDate;
1961     if (testFullRange) {
1962         loopDate = calendar->earliestValidDate();
1963         terminateDate = calendar->latestValidDate();
1964     } else {
1965         loopDate = qMax(QDate(1990, 1, 1), calendar->earliestValidDate());
1966         terminateDate = qMin(QDate(2020, 1, 1), calendar->latestValidDate());
1967     }
1968     QByteArray msg;
1969     while (loopDate <= terminateDate) {
1970         testYear = calendar->year(loopDate);
1971         testMonth = calendar->month(loopDate);
1972         testDay = calendar->day(loopDate);
1973         calendar->setDate(testDate, testYear, testMonth, testDay);
1974         // Uncomment this to see each comparison printed
1975         // or
1976         // Uncomment the QEXPECT_FAIL statements to check all dates regardless of occasional failures
1977         QByteArray msg = QByteArray::number(loopDate.toJulianDay()) + " = " +
1978                          QByteArray::number(testYear) + '-' +
1979                          QByteArray::number(testMonth) + '-' +
1980                          QByteArray::number(testDay) + " = " +
1981                          QByteArray::number(testDate.toJulianDay());
1982         /*
1983         // qDebug() << msg;
1984         */
1985         if (testMonth <= 0 || testDay <= 0) {   // year <= 0 is OK
1986             msg.prepend("Round Trip : JD to Date failed : ");
1987             QEXPECT_FAIL("", msg.data(), Continue);
1988         } else if (testDate.toJulianDay() == 0) {
1989             msg.prepend("Round Trip : Date to JD failed : ");
1990             QEXPECT_FAIL("", msg.data(), Continue);
1991         } else if (loopDate != testDate) {
1992             msg.prepend("Round Trip : JD's differ       : ");
1993             QEXPECT_FAIL("", msg.data(), Continue);
1994         }
1995         QCOMPARE(loopDate.toJulianDay(), testDate.toJulianDay());
1996         loopDate = loopDate.addDays(1);
1997     }
1998 }
1999 
testGregorianAddYears()2000 void KCalendarTest::testGregorianAddYears()
2001 {
2002     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
2003 
2004     QDate testDate;
2005 
2006     calendar->setDate(testDate, 2000,  1,  1);
2007     QCOMPARE(calendar->addYears(testDate, -1),  testDate.addYears(-1));
2008     QCOMPARE(calendar->addYears(testDate,  1),  testDate.addYears(1));
2009 
2010     calendar->setDate(testDate, 2000,  2, 29);
2011     QCOMPARE(calendar->addYears(testDate,  1),  testDate.addYears(1));
2012 
2013     calendar->setDate(testDate, -2000,  1,  1);
2014     QCOMPARE(calendar->addYears(testDate, -1),  testDate.addYears(-1));
2015     QCOMPARE(calendar->addYears(testDate,  1),  testDate.addYears(1));
2016 
2017     delete calendar;
2018 }
2019 
testGregorianAddMonths()2020 void KCalendarTest::testGregorianAddMonths()
2021 {
2022     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
2023 
2024     QDate testDate;
2025 
2026     calendar->setDate(testDate, 2000,  1,  1);
2027     QCOMPARE(calendar->addMonths(testDate, -1),  testDate.addMonths(-1));
2028     QCOMPARE(calendar->addMonths(testDate,  1),  testDate.addMonths(1));
2029 
2030     calendar->setDate(testDate, 2000,  3,  1);
2031     QCOMPARE(calendar->addMonths(testDate, -1),  testDate.addMonths(-1));
2032     QCOMPARE(calendar->addMonths(testDate,  1),  testDate.addMonths(1));
2033 
2034     calendar->setDate(testDate, 2000, 12,  1);
2035     QCOMPARE(calendar->addMonths(testDate, -1),  testDate.addMonths(-1));
2036     QCOMPARE(calendar->addMonths(testDate,  1),  testDate.addMonths(1));
2037 
2038     calendar->setDate(testDate, 2000,  1,  1);
2039     QCOMPARE(calendar->addMonths(testDate, -30),  testDate.addMonths(-30));
2040     QCOMPARE(calendar->addMonths(testDate,  30),  testDate.addMonths(30));
2041 
2042     calendar->setDate(testDate, -2000,  1,  1);
2043     QCOMPARE(calendar->addMonths(testDate, -1),  testDate.addMonths(-1));
2044     QCOMPARE(calendar->addMonths(testDate,  1),  testDate.addMonths(1));
2045 
2046     calendar->setDate(testDate, -2000,  3,  1);
2047     QCOMPARE(calendar->addMonths(testDate, -1),  testDate.addMonths(-1));
2048     QCOMPARE(calendar->addMonths(testDate,  1),  testDate.addMonths(1));
2049 
2050     calendar->setDate(testDate, -2000, 12,  1);
2051     QCOMPARE(calendar->addMonths(testDate, -1),  testDate.addMonths(-1));
2052     QCOMPARE(calendar->addMonths(testDate,  1),  testDate.addMonths(1));
2053 
2054     calendar->setDate(testDate, -2000,  1,  1);
2055     QCOMPARE(calendar->addMonths(testDate, -30),  testDate.addMonths(-30));
2056     QCOMPARE(calendar->addMonths(testDate,  30),  testDate.addMonths(30));
2057 
2058     delete calendar;
2059 }
2060 
testGregorianAddDays()2061 void KCalendarTest::testGregorianAddDays()
2062 {
2063     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
2064 
2065     QDate testDate;
2066 
2067     calendar->setDate(testDate, 2000,  1,  1);
2068     QCOMPARE(calendar->addDays(testDate, -1),  testDate.addDays(-1));
2069     QCOMPARE(calendar->addDays(testDate,  1),  testDate.addDays(1));
2070 
2071     calendar->setDate(testDate, -2000,  1,  1);
2072     QCOMPARE(calendar->addDays(testDate, -1),  testDate.addDays(-1));
2073     QCOMPARE(calendar->addDays(testDate,  1),  testDate.addDays(1));
2074 
2075     delete calendar;
2076 }
2077 
testGregorianDaysInYear()2078 void KCalendarTest::testGregorianDaysInYear()
2079 {
2080     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
2081 
2082     QDate testDate;
2083 
2084     calendar->setDate(testDate, 1900, 1, 1);
2085     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2086     calendar->setDate(testDate, 1999, 1, 1);
2087     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2088     calendar->setDate(testDate, 2000, 1, 1);
2089     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2090     calendar->setDate(testDate, 2001, 1, 1);
2091     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2092     calendar->setDate(testDate, 2002, 1, 1);
2093     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2094     calendar->setDate(testDate, 2003, 1, 1);
2095     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2096     calendar->setDate(testDate, 2004, 1, 1);
2097     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2098     calendar->setDate(testDate, 2005, 1, 1);
2099     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2100 
2101     calendar->setDate(testDate, -4700, 1, 1);
2102 #if QT_VERSION < 0x040601
2103     QEXPECT_FAIL("", "Returns 365 instead of 366", Continue); // Fix submitted to Qt
2104 #endif
2105     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2106     calendar->setDate(testDate, -4000, 1, 1);
2107 #if QT_VERSION < 0x040601
2108     QEXPECT_FAIL("", "Returns 365 instead of 366", Continue); // Fix submitted to Qt
2109 #endif
2110     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2111 
2112     calendar->setDate(testDate, 1, 1, 1);
2113     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2114 
2115     calendar->setDate(testDate, 9996, 1, 1);
2116     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2117     calendar->setDate(testDate, 9999, 1, 1);
2118     QCOMPARE(calendar->daysInYear(testDate),  testDate.daysInYear());
2119 
2120     delete calendar;
2121 }
2122 
testGregorianDaysInMonth()2123 void KCalendarTest::testGregorianDaysInMonth()
2124 {
2125     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
2126 
2127     QDate testDate;
2128 
2129     // Test all months
2130     calendar->setDate(testDate, 2000,  1, 1);
2131     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2132     calendar->setDate(testDate, 2000,  2, 1);
2133     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2134     calendar->setDate(testDate, 2000,  3, 1);
2135     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2136     calendar->setDate(testDate, 2000,  4, 1);
2137     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2138     calendar->setDate(testDate, 2000,  5, 1);
2139     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2140     calendar->setDate(testDate, 2000,  6, 1);
2141     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2142     calendar->setDate(testDate, 2000,  7, 1);
2143     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2144     calendar->setDate(testDate, 2000,  8, 1);
2145     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2146     calendar->setDate(testDate, 2000,  9, 1);
2147     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2148     calendar->setDate(testDate, 2000, 10, 1);
2149     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2150     calendar->setDate(testDate, 2000, 11, 1);
2151     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2152     calendar->setDate(testDate, 2000, 12, 1);
2153     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2154 
2155     // Test Feb in leap and normal years
2156     calendar->setDate(testDate, 2000, 2, 1);
2157     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2158     calendar->setDate(testDate, 2001, 2, 1);
2159     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2160 
2161     // Test max date
2162     calendar->setDate(testDate, 9999, 12, 1);
2163     QCOMPARE(calendar->daysInMonth(testDate), testDate.daysInMonth());
2164 
2165     delete calendar;
2166 }
2167 
testGregorianDayOfYear()2168 void KCalendarTest::testGregorianDayOfYear()
2169 {
2170     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
2171 
2172     QDate testDate;
2173 
2174     calendar->setDate(testDate, 2000,  1,  1);
2175     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2176     calendar->setDate(testDate, 2000,  2, 29);
2177     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2178     calendar->setDate(testDate, 2000,  6,  1);
2179     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2180     calendar->setDate(testDate, 2000, 12,  1);
2181     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2182     calendar->setDate(testDate, 2000, 12, 31);
2183     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2184 
2185     calendar->setDate(testDate, -2000,  1,  1);
2186     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2187     calendar->setDate(testDate, -2000,  2, 28);
2188     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2189     calendar->setDate(testDate, -2000,  6,  1);
2190     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2191     calendar->setDate(testDate, -2000, 12,  1);
2192     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2193     calendar->setDate(testDate, -2000, 12, 31);
2194     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2195 
2196     calendar->setDate(testDate, -4712,  1,  2);
2197     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2198     calendar->setDate(testDate, -4712,  2, 28);
2199     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2200     calendar->setDate(testDate, -4712,  6,  1);
2201     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2202     calendar->setDate(testDate, -4712, 12,  1);
2203     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2204     calendar->setDate(testDate, -4712, 12, 31);
2205     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2206 
2207     calendar->setDate(testDate, 9999,  1,  1);
2208     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2209     //QDate::dayOfYear doesn't check if invalid!!!
2210     //calendar->setDate( testDate, 9999,  2, 29 );
2211     //QCOMPARE( calendar->dayOfYear( testDate ), testDate.dayOfYear() );
2212     calendar->setDate(testDate, 9999,  6,  1);
2213     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2214     calendar->setDate(testDate, 9999, 12,  1);
2215     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2216     calendar->setDate(testDate, 9999, 12, 31);
2217     QCOMPARE(calendar->dayOfYear(testDate), testDate.dayOfYear());
2218 
2219     delete calendar;
2220 }
2221 
testGregorianDayOfWeek()2222 void KCalendarTest::testGregorianDayOfWeek()
2223 {
2224     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
2225 
2226     QDate testDate;
2227 
2228     calendar->setDate(testDate, 2000,  1,  1);
2229     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2230     calendar->setDate(testDate, 2000,  1,  2);
2231     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2232     calendar->setDate(testDate, 2000,  1,  3);
2233     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2234     calendar->setDate(testDate, 2000,  1,  4);
2235     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2236     calendar->setDate(testDate, 2000,  1,  5);
2237     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2238     calendar->setDate(testDate, 2000,  1,  6);
2239     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2240     calendar->setDate(testDate, 2000,  1,  7);
2241     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2242 
2243     calendar->setDate(testDate, -4712,  1,  2);
2244     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2245     calendar->setDate(testDate, -4712,  1,  3);
2246     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2247     calendar->setDate(testDate, -4712,  1,  4);
2248     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2249     calendar->setDate(testDate, -4712,  1,  5);
2250     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2251     calendar->setDate(testDate, -4712,  1,  6);
2252     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2253     calendar->setDate(testDate, -4712,  1,  7);
2254     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2255     calendar->setDate(testDate, -4712,  1,  8);
2256     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2257 
2258     calendar->setDate(testDate, 9999,  1,  1);
2259     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2260     calendar->setDate(testDate, 9999,  1,  2);
2261     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2262     calendar->setDate(testDate, 9999,  1,  3);
2263     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2264     calendar->setDate(testDate, 9999,  1,  4);
2265     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2266     calendar->setDate(testDate, 9999,  1,  5);
2267     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2268     calendar->setDate(testDate, 9999,  1,  6);
2269     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2270     calendar->setDate(testDate, 9999,  1,  7);
2271     QCOMPARE(calendar->dayOfWeek(testDate), testDate.dayOfWeek());
2272 
2273     delete calendar;
2274 }
2275 
2276 // Don't really need this as Gregorian currently uses QDate directly
testGregorianIsLeapYear()2277 void KCalendarTest::testGregorianIsLeapYear()
2278 {
2279     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar);
2280 
2281     QDate testDate;
2282 
2283     calendar->setDate(testDate, 2000,  1,  1);
2284     QCOMPARE(calendar->isLeapYear(2000),     testDate.isLeapYear(2000));
2285     QCOMPARE(calendar->isLeapYear(testDate), testDate.isLeapYear(2000));
2286     calendar->setDate(testDate, 2001,  1,  1);
2287     QCOMPARE(calendar->isLeapYear(2001),     testDate.isLeapYear(2001));
2288     QCOMPARE(calendar->isLeapYear(testDate), testDate.isLeapYear(2001));
2289     calendar->setDate(testDate, 2004,  1,  1);
2290     QCOMPARE(calendar->isLeapYear(2004),     testDate.isLeapYear(2004));
2291     QCOMPARE(calendar->isLeapYear(testDate), testDate.isLeapYear(2004));
2292 
2293     calendar->setDate(testDate, 1900,  1,  1);
2294     QCOMPARE(calendar->isLeapYear(1900),     testDate.isLeapYear(1900));
2295     QCOMPARE(calendar->isLeapYear(testDate), testDate.isLeapYear(1900));
2296     calendar->setDate(testDate, 1901,  1,  1);
2297     QCOMPARE(calendar->isLeapYear(1901),     testDate.isLeapYear(1901));
2298     QCOMPARE(calendar->isLeapYear(testDate), testDate.isLeapYear(1901));
2299     calendar->setDate(testDate, 1904,  1,  1);
2300     QCOMPARE(calendar->isLeapYear(1904),     testDate.isLeapYear(1904));
2301     QCOMPARE(calendar->isLeapYear(testDate), testDate.isLeapYear(1904));
2302 
2303     calendar->setDate(testDate, -2000,  1,  1);
2304     QCOMPARE(calendar->isLeapYear(-2000),    testDate.isLeapYear(-2000));
2305     QCOMPARE(calendar->isLeapYear(testDate), testDate.isLeapYear(-2000));
2306     calendar->setDate(testDate, -2001,  1,  1);
2307     QCOMPARE(calendar->isLeapYear(-2001),    testDate.isLeapYear(-2001));
2308     QCOMPARE(calendar->isLeapYear(testDate), testDate.isLeapYear(-2001));
2309     calendar->setDate(testDate, -2004,  1,  1);
2310     QCOMPARE(calendar->isLeapYear(-2004),    testDate.isLeapYear(-2004));
2311     QCOMPARE(calendar->isLeapYear(testDate), testDate.isLeapYear(-2004));
2312 
2313     delete calendar;
2314 }
2315 
testKLocalizedDate()2316 void KCalendarTest::testKLocalizedDate()
2317 {
2318     KLocale::global()->setDateFormatShort("%y-%m-%d");
2319     const KCalendarSystem *calendar = KLocale::global()->calendar();
2320 
2321     // Set up a bunch of KLocalizedDates and QDates that should be equal
2322     QDate testQDate(2010, 1, 1);
2323     KLocalizedDate testKLocalizedDate(testQDate);
2324 
2325     // Test KLocalizedDate output calls not in KCalendarSystem
2326     QCOMPARE(KLocalizedDate().isNull(),        true);
2327     QCOMPARE(KLocalizedDate().isValid(),       false);
2328     QCOMPARE(testKLocalizedDate.isNull(),      testQDate.isNull());
2329     QCOMPARE(testKLocalizedDate.date(),        testQDate);
2330     QCOMPARE((qint64)testKLocalizedDate.toJulianDay(), (qint64)testQDate.toJulianDay());
2331     testKLocalizedDate.setDate(QDate(2010, 6, 1));
2332     testQDate.setDate(2010, 6, 1);
2333     QCOMPARE(testKLocalizedDate.date(),        testQDate);
2334 
2335     // Test static KLocalizedDate methods
2336     QCOMPARE(KLocalizedDate::currentDate().date(),           QDate::currentDate());
2337     QCOMPARE(KLocalizedDate::fromDate(testQDate).date(),   testQDate);
2338     QCOMPARE(KLocalizedDate::fromJulianDay(100000).date(), QDate::fromJulianDay(100000));
2339 
2340     // Compare KLocalizedDate output to KCalendarSystem output calls
2341     QCOMPARE(testKLocalizedDate.isValid(),                     calendar->isValid(testQDate));
2342     QCOMPARE(testKLocalizedDate.year(),                        calendar->year(testQDate));
2343     QCOMPARE(testKLocalizedDate.month(),                       calendar->month(testQDate));
2344     QCOMPARE(testKLocalizedDate.day(),                         calendar->day(testQDate));
2345     QCOMPARE(testKLocalizedDate.eraName(),                     calendar->eraName(testQDate));
2346     QCOMPARE(testKLocalizedDate.eraYear(),                     calendar->eraYear(testQDate));
2347     QCOMPARE(testKLocalizedDate.yearInEra(),                   calendar->yearInEra(testQDate));
2348     QCOMPARE(testKLocalizedDate.addYears(5).date(),          calendar->addYears(testQDate, 5));
2349     QCOMPARE(testKLocalizedDate.addMonths(5).date(),         calendar->addMonths(testQDate, 5));
2350     QCOMPARE(testKLocalizedDate.addDays(5).date(),           calendar->addDays(testQDate, 5));
2351     QCOMPARE(testKLocalizedDate.monthsInYear(),                calendar->monthsInYear(testQDate));
2352     QCOMPARE(testKLocalizedDate.weeksInYear(),                 calendar->weeksInYear(testQDate));
2353     QCOMPARE(testKLocalizedDate.daysInYear(),                  calendar->daysInYear(testQDate));
2354     QCOMPARE(testKLocalizedDate.daysInMonth(),                 calendar->daysInMonth(testQDate));
2355     QCOMPARE(testKLocalizedDate.daysInWeek(),                  calendar->daysInWeek(testQDate));
2356     QCOMPARE(testKLocalizedDate.dayOfYear(),                   calendar->dayOfYear(testQDate));
2357     QCOMPARE(testKLocalizedDate.dayOfWeek(),                   calendar->dayOfWeek(testQDate));
2358     QCOMPARE(testKLocalizedDate.week(),                        calendar->week(testQDate));
2359     QCOMPARE(testKLocalizedDate.isLeapYear(),                  calendar->isLeapYear(testQDate));
2360     QCOMPARE(testKLocalizedDate.firstDayOfYear().date(),       calendar->firstDayOfYear(testQDate));
2361     QCOMPARE(testKLocalizedDate.lastDayOfYear().date(),        calendar->lastDayOfYear(testQDate));
2362     QCOMPARE(testKLocalizedDate.firstDayOfMonth().date(),      calendar->firstDayOfMonth(testQDate));
2363     QCOMPARE(testKLocalizedDate.lastDayOfMonth().date(),       calendar->lastDayOfMonth(testQDate));
2364 
2365     QCOMPARE(testKLocalizedDate.week(KLocale::IsoWeekNumber),        calendar->week(testQDate, KLocale::IsoWeekNumber));
2366     QCOMPARE(testKLocalizedDate.weeksInYear(KLocale::IsoWeekNumber), calendar->weeksInYear(testQDate, KLocale::IsoWeekNumber));
2367 
2368     // Compare KLocalizedDate setDate to KCalendarSystem setDate
2369     testKLocalizedDate.setDate(2010, 3, 1);
2370     calendar->setDate(testQDate, 2010, 3, 1);
2371     QCOMPARE(testKLocalizedDate.date(), testQDate);
2372     testKLocalizedDate.setDate(2010, 100);
2373     calendar->setDate(testQDate, 2010, 100);
2374     QCOMPARE(testKLocalizedDate.date(), testQDate);
2375     testKLocalizedDate.setDate("AD", 2010, 9, 1);
2376     calendar->setDate(testQDate, "AD", 2010, 9, 1);
2377     QCOMPARE(testKLocalizedDate.date(), testQDate);
2378     testKLocalizedDate.setDate(KLocale::IsoWeekNumber, 2010, 15, 1);
2379     calendar->setDateIsoWeek(testQDate, 2010, 15, 1);
2380     QCOMPARE(testKLocalizedDate.date(), testQDate);
2381     testKLocalizedDate.setCurrentDate();
2382     testQDate = QDate::currentDate();
2383     QCOMPARE(testKLocalizedDate.date(), testQDate);
2384 
2385     // Compare KLocalizedDate getDate to KCalendarSystem getDate
2386     int ky, km, kd, qy, qm, qd;
2387     testKLocalizedDate.getDate(&ky, &km, &kd);
2388     calendar->getDate(testQDate, &qy, &qm, &qd);
2389     QCOMPARE(ky, qy);
2390     QCOMPARE(km, qm);
2391     QCOMPARE(kd, qd);
2392 
2393     // Compare KLocalizedDate format/read to KCalendarSystem format
2394     QCOMPARE(testKLocalizedDate.formatDate(),           calendar->formatDate(testQDate));
2395     QCOMPARE(testKLocalizedDate.formatDate("%d-%m-%y"), calendar->formatDate(testQDate, "%d-%m-%y"));
2396     QCOMPARE(testKLocalizedDate.formatDate(KLocale::Year),              calendar->yearString(testQDate));
2397     QCOMPARE(testKLocalizedDate.formatDate(KLocale::YearName),          calendar->yearString(testQDate));
2398     QCOMPARE(testKLocalizedDate.formatDate(KLocale::Month),             calendar->monthString(testQDate, KCalendarSystem::ShortFormat));
2399     QCOMPARE(testKLocalizedDate.formatDate(KLocale::MonthName),         calendar->monthName(testQDate));
2400     QCOMPARE(testKLocalizedDate.formatDate(KLocale::Day),               calendar->dayString(testQDate, KCalendarSystem::ShortFormat));
2401     QCOMPARE(testKLocalizedDate.formatDate(KLocale::DayName),           calendar->dayString(testQDate, KCalendarSystem::ShortFormat));
2402     QCOMPARE(testKLocalizedDate.formatDate(KLocale::JulianDay),         QString::number(testQDate.toJulianDay()));
2403     QCOMPARE(testKLocalizedDate.formatDate(KLocale::EraName),           calendar->eraName(testQDate));
2404     QCOMPARE(testKLocalizedDate.formatDate(KLocale::EraYear),           calendar->eraYear(testQDate));
2405     QCOMPARE(testKLocalizedDate.formatDate(KLocale::YearInEra),         calendar->yearInEraString(testQDate));
2406     QCOMPARE(testKLocalizedDate.formatDate(KLocale::DayOfYear),         calendar->dayOfYearString(testQDate, KCalendarSystem::ShortFormat));
2407     QCOMPARE(testKLocalizedDate.formatDate(KLocale::DayOfYearName),     calendar->dayOfYearString(testQDate, KCalendarSystem::ShortFormat));
2408     QCOMPARE(testKLocalizedDate.formatDate(KLocale::DayOfWeek),         calendar->dayOfWeekString(testQDate));
2409     QCOMPARE(testKLocalizedDate.formatDate(KLocale::DayOfWeekName),     calendar->weekDayName(testQDate));
2410     QCOMPARE(testKLocalizedDate.formatDate(KLocale::Week),              calendar->weekNumberString(testQDate, KCalendarSystem::ShortFormat));
2411     int weekYear;
2412     QDate weekDate;
2413     calendar->weekNumber(testQDate, &weekYear);
2414     calendar->setDate(weekDate, weekYear, 1, 1);
2415     QCOMPARE(testKLocalizedDate.formatDate(KLocale::WeekYear),          calendar->yearString(weekDate));
2416     QCOMPARE(testKLocalizedDate.formatDate(KLocale::MonthsInYear),      calendar->monthsInYearString(testQDate));
2417     QCOMPARE(testKLocalizedDate.formatDate(KLocale::WeeksInYear),       calendar->weeksInYearString(testQDate));
2418     QCOMPARE(testKLocalizedDate.formatDate(KLocale::DaysInYear),        calendar->daysInYearString(testQDate));
2419     QCOMPARE(testKLocalizedDate.formatDate(KLocale::DaysInMonth),       calendar->daysInMonthString(testQDate));
2420     QCOMPARE(testKLocalizedDate.formatDate(KLocale::DaysInWeek),        calendar->daysInWeekString(testQDate));
2421 
2422     // Compare KLocalizedDate format/read to KCalendarSystem read
2423     QCOMPARE(testKLocalizedDate.readDate("2010-01-01").date(),                        calendar->readDate("2010-01-01"));
2424     QCOMPARE(testKLocalizedDate.readDate("2010-01-01", KLocale::NormalFormat).date(), calendar->readDate("2010-01-01", KLocale::NormalFormat));
2425     QCOMPARE(testKLocalizedDate.readDate("2010-01-01", "%y-%m-%d").date(),            calendar->readDate("2010-01-01", "%y-%m-%d"));
2426 
2427     // Test new addOn methods
2428     testKLocalizedDate.addYearsTo(5);
2429     testQDate = calendar->addYears(testQDate, 5);
2430     QCOMPARE(testKLocalizedDate.date(), testQDate);
2431     testKLocalizedDate.addMonthsTo(5);
2432     testQDate = calendar->addMonths(testQDate, 5);
2433     QCOMPARE(testKLocalizedDate.date(), testQDate);
2434     testKLocalizedDate.addDaysTo(5);
2435     testQDate = calendar->addDays(testQDate, 5);
2436     QCOMPARE(testKLocalizedDate.date(), testQDate);
2437 
2438     // Set up some dates for comparisons
2439     QDate lowQDate(2000, 1, 1);
2440     KLocalizedDate lowKLocalizedDate(lowQDate);
2441     QDate highQDate(2010, 1, 1);
2442     KLocalizedDate highKLocalizedDate(highQDate);
2443 
2444     // Compare the difference methods
2445     int kdy, kdm, kdd, kdir, qdy, qdm, qdd, qdir;
2446     lowKLocalizedDate.dateDifference(highKLocalizedDate, &kdy, &kdm, &kdd, &kdir);
2447     calendar->dateDifference(lowKLocalizedDate.date(), highKLocalizedDate.date(), &qdy, &qdm, &qdd, &qdir);
2448     QCOMPARE(kdy, qdy);
2449     QCOMPARE(kdm, qdm);
2450     QCOMPARE(kdd, qdd);
2451     QCOMPARE(kdir, qdir);
2452     lowKLocalizedDate.dateDifference(highQDate, &kdy, &kdm, &kdd, &kdir);
2453     calendar->dateDifference(lowKLocalizedDate.date(), highQDate, &qdy, &qdm, &qdd, &qdir);
2454     QCOMPARE(kdy, qdy);
2455     QCOMPARE(kdm, qdm);
2456     QCOMPARE(kdd, qdd);
2457     QCOMPARE(kdir, qdir);
2458     QCOMPARE(lowKLocalizedDate.yearsDifference(highKLocalizedDate),  calendar->yearsDifference(lowQDate, highQDate));
2459     QCOMPARE(lowKLocalizedDate.yearsDifference(highQDate),  calendar->yearsDifference(lowQDate, highQDate));
2460     QCOMPARE(lowKLocalizedDate.monthsDifference(highKLocalizedDate), calendar->monthsDifference(lowQDate, highQDate));
2461     QCOMPARE(lowKLocalizedDate.monthsDifference(highQDate), calendar->monthsDifference(lowQDate, highQDate));
2462     QCOMPARE(lowKLocalizedDate.daysDifference(highKLocalizedDate),   calendar->daysDifference(lowQDate, highQDate));
2463     QCOMPARE(lowKLocalizedDate.daysDifference(highQDate),   calendar->daysDifference(lowQDate, highQDate));
2464 
2465     // Test new operators
2466     QCOMPARE(lowKLocalizedDate == lowKLocalizedDate,   true);
2467     QCOMPARE(lowKLocalizedDate == highKLocalizedDate,  false);
2468     QCOMPARE(lowKLocalizedDate == lowQDate,   true);
2469     QCOMPARE(lowKLocalizedDate == highQDate,  false);
2470     QCOMPARE(lowKLocalizedDate != lowKLocalizedDate,   false);
2471     QCOMPARE(lowKLocalizedDate != highKLocalizedDate,  true);
2472     QCOMPARE(lowKLocalizedDate != lowQDate,   false);
2473     QCOMPARE(lowKLocalizedDate != highQDate,  true);
2474     QCOMPARE(highKLocalizedDate < lowKLocalizedDate,   false);
2475     QCOMPARE(lowKLocalizedDate  < highKLocalizedDate,  true);
2476     QCOMPARE(highKLocalizedDate < lowQDate,   false);
2477     QCOMPARE(lowKLocalizedDate  < highQDate,  true);
2478     QCOMPARE(highKLocalizedDate <= lowKLocalizedDate,  false);
2479     QCOMPARE(lowKLocalizedDate  <= lowKLocalizedDate,  true);
2480     QCOMPARE(lowKLocalizedDate  <= highKLocalizedDate, true);
2481     QCOMPARE(highKLocalizedDate <= lowQDate,  false);
2482     QCOMPARE(lowKLocalizedDate  <= lowQDate,  true);
2483     QCOMPARE(lowKLocalizedDate  <= highQDate, true);
2484     QCOMPARE(highKLocalizedDate > lowKLocalizedDate,   true);
2485     QCOMPARE(lowKLocalizedDate  > highKLocalizedDate,  false);
2486     QCOMPARE(highKLocalizedDate > lowQDate,   true);
2487     QCOMPARE(lowKLocalizedDate  > highQDate,  false);
2488     QCOMPARE(highKLocalizedDate >= lowKLocalizedDate,  true);
2489     QCOMPARE(lowKLocalizedDate  >= lowKLocalizedDate,  true);
2490     QCOMPARE(lowKLocalizedDate  >= highKLocalizedDate, false);
2491     QCOMPARE(highKLocalizedDate >= lowQDate,  true);
2492     QCOMPARE(lowKLocalizedDate  >= lowQDate,  true);
2493     QCOMPARE(lowKLocalizedDate  >= highQDate, false);
2494 
2495     // Test changing Calendar System
2496     KCalendarSystem *hijri = KCalendarSystem::create(KLocale::IslamicCivilCalendar);
2497     testKLocalizedDate.setCalendarSystem(KLocale::IslamicCivilCalendar);
2498     QCOMPARE(testKLocalizedDate.year(), hijri->year(testQDate));
2499 
2500     // Test copy of calendar object
2501     if (true) {
2502         KLocalizedDate test2 = testKLocalizedDate;
2503         test2.day();
2504     }
2505     testKLocalizedDate.day();
2506 
2507     KLocalizedDate newOne = testKLocalizedDate.currentDate();
2508     qDebug() << newOne;
2509     newOne = KLocalizedDate::currentDate();
2510     qDebug() << newOne;
2511 
2512     KLocalizedDate calendarDate(testQDate, calendar);
2513     QCOMPARE(calendarDate.date(), testQDate);
2514     QCOMPARE(calendarDate.day(), calendar->day(testQDate));
2515 
2516     KCalendarSystem *hijriCalendar =  KCalendarSystem::create(KLocale::IslamicCivilCalendar);
2517     KLocalizedDate hijriDate(testQDate, hijriCalendar);
2518     QCOMPARE(hijriDate.date(), testQDate);
2519     QCOMPARE(hijriDate.day(), hijriCalendar->day(testQDate));
2520     delete hijriCalendar;
2521 }
2522 
testWeekNumberSystem()2523 void KCalendarTest::testWeekNumberSystem()
2524 {
2525     KLocale *locale = new KLocale(*KLocale::global());
2526     const KCalendarSystem *calendar = KCalendarSystem::create(KLocale::GregorianCalendar, locale);
2527     int weekYear = 0;
2528 
2529     // Test the 7 days the year can start on:
2530     // Monday    == 2018
2531     // Tuesday   == 2013
2532     // Wednesday == 2014
2533     // Thursday  == 2015
2534     // Friday    == 2016
2535     // Saturday  == 2011
2536     // Sunday    == 2012
2537 
2538     // ISO Week
2539     // Monday    == 2018 == Week 1 2018
2540     // Tuesday   == 2013 == Week 1 2013
2541     // Wednesday == 2014 == Week 1 2014
2542     // Thursday  == 2015 == Week 1 2015
2543     // Friday    == 2016 == Week 53 2015
2544     // Saturday  == 2011 == Week 52 2010
2545     // Sunday    == 2012 == Week 52 2011
2546 
2547     locale->setWeekStartDay(1);
2548     locale->setWeekNumberSystem(KLocale::IsoWeekNumber);
2549 
2550     QCOMPARE(calendar->week(QDate(2018, 1, 1), &weekYear), 1);
2551     QCOMPARE(weekYear, 2018);
2552     QCOMPARE(calendar->week(QDate(2013, 1, 1), &weekYear), 1);
2553     QCOMPARE(weekYear, 2013);
2554     QCOMPARE(calendar->week(QDate(2014, 1, 1), &weekYear), 1);
2555     QCOMPARE(weekYear, 2014);
2556     QCOMPARE(calendar->week(QDate(2015, 1, 1), &weekYear), 1);
2557     QCOMPARE(weekYear, 2015);
2558     QCOMPARE(calendar->week(QDate(2016, 1, 1), &weekYear), 53);
2559     QCOMPARE(weekYear, 2015);
2560     QCOMPARE(calendar->week(QDate(2011, 1, 1), &weekYear), 52);
2561     QCOMPARE(weekYear, 2010);
2562     QCOMPARE(calendar->week(QDate(2012, 1, 1), &weekYear), 52);
2563     QCOMPARE(weekYear, 2011);
2564 
2565     QCOMPARE(calendar->week(QDate(2014, 12, 31), &weekYear), 1);
2566     QCOMPARE(weekYear, 2015);
2567     QCOMPARE(calendar->week(QDate(2015, 12, 31), &weekYear), 53);
2568     QCOMPARE(weekYear, 2015);
2569 
2570     QCOMPARE(calendar->weeksInYear(2010), 52);
2571     QCOMPARE(calendar->weeksInYear(2015), 53);
2572 
2573     // First Full Week starting Sunday, aka US Week
2574     locale->setWeekStartDay(7);
2575     locale->setWeekNumberSystem(KLocale::FirstFullWeek);
2576 
2577     // Mon = Jan 1 2018 = Week 52 2017, Sun = Jan 7 = Week 1
2578     QCOMPARE(calendar->week(QDate(2018, 1, 1), &weekYear), 53);        //First Day
2579     QCOMPARE(weekYear, 2017);
2580     QCOMPARE(calendar->week(QDate(2018, 1, 6), &weekYear), 53);        //First Saturday
2581     QCOMPARE(weekYear, 2017);
2582     QCOMPARE(calendar->week(QDate(2018, 1, 7), &weekYear), 1);         //First Sunday
2583     QCOMPARE(weekYear, 2018);
2584     QCOMPARE(calendar->week(QDate(2018, 1, 13), &weekYear), 1);        //Second Saturday
2585     QCOMPARE(weekYear, 2018);
2586     QCOMPARE(calendar->week(QDate(2018, 1, 14), &weekYear), 2);        //Second Sunday
2587     QCOMPARE(weekYear, 2018);
2588     QCOMPARE(calendar->week(QDate(2018, 12, 31), &weekYear), 52);       //Last Day
2589     QCOMPARE(weekYear, 2018);
2590 
2591     // Tue = Jan 1 2013 = Week 52 2012, Sun = Jan 6 = Week 1
2592     QCOMPARE(calendar->week(QDate(2013, 1, 1), &weekYear), 53);        //First Day
2593     QCOMPARE(weekYear, 2012);
2594     QCOMPARE(calendar->week(QDate(2013, 1, 5), &weekYear), 53);        //First Saturday
2595     QCOMPARE(weekYear, 2012);
2596     QCOMPARE(calendar->week(QDate(2013, 1, 6), &weekYear), 1);         //First Sunday
2597     QCOMPARE(weekYear, 2013);
2598     QCOMPARE(calendar->week(QDate(2013, 1, 12), &weekYear), 1);        //Second Saturday
2599     QCOMPARE(weekYear, 2013);
2600     QCOMPARE(calendar->week(QDate(2013, 1, 13), &weekYear), 2);        //Second Sunday
2601     QCOMPARE(weekYear, 2013);
2602     QCOMPARE(calendar->week(QDate(2013, 12, 31), &weekYear), 52);       //Last Day
2603     QCOMPARE(weekYear, 2013);
2604 
2605     // Wed = Jan 1 2014 = Week 52 2013, Sun = Jan 5 = Week 1
2606     QCOMPARE(calendar->week(QDate(2014, 1, 1), &weekYear), 52);        //First Day
2607     QCOMPARE(weekYear, 2013);
2608     QCOMPARE(calendar->week(QDate(2014, 1, 4), &weekYear), 52);        //First Saturday
2609     QCOMPARE(weekYear, 2013);
2610     QCOMPARE(calendar->week(QDate(2014, 1, 5), &weekYear), 1);         //First Sunday
2611     QCOMPARE(weekYear, 2014);
2612     QCOMPARE(calendar->week(QDate(2014, 1, 11), &weekYear), 1);        //Second Saturday
2613     QCOMPARE(weekYear, 2014);
2614     QCOMPARE(calendar->week(QDate(2014, 1, 12), &weekYear), 2);        //Second Sunday
2615     QCOMPARE(weekYear, 2014);
2616     QCOMPARE(calendar->week(QDate(2014, 12, 31), &weekYear), 52);       //Last Day
2617     QCOMPARE(weekYear, 2014);
2618 
2619     // Thu = Jan 1 2015 = Week 52 2014, Sun = Jan 4 = Week 1
2620     QCOMPARE(calendar->week(QDate(2015, 1, 1), &weekYear), 52);        //First Day
2621     QCOMPARE(weekYear, 2014);
2622     QCOMPARE(calendar->week(QDate(2015, 1, 3), &weekYear), 52);        //First Saturday
2623     QCOMPARE(weekYear, 2014);
2624     QCOMPARE(calendar->week(QDate(2015, 1, 4), &weekYear), 1);         //First Sunday
2625     QCOMPARE(weekYear, 2015);
2626     QCOMPARE(calendar->week(QDate(2015, 1, 10), &weekYear), 1);        //Second Saturday
2627     QCOMPARE(weekYear, 2015);
2628     QCOMPARE(calendar->week(QDate(2015, 1, 11), &weekYear), 2);        //Second Sunday
2629     QCOMPARE(weekYear, 2015);
2630     QCOMPARE(calendar->week(QDate(2015, 12, 31), &weekYear), 52);       //Last Day
2631     QCOMPARE(weekYear, 2015);
2632 
2633     // Fri = Jan 1 2016 = Week 52 2015, Sun = Jan 3 = Week 1
2634     QCOMPARE(calendar->week(QDate(2016, 1, 1), &weekYear), 52);        //First Day
2635     QCOMPARE(weekYear, 2015);
2636     QCOMPARE(calendar->week(QDate(2016, 1, 2), &weekYear), 52);        //First Saturday
2637     QCOMPARE(weekYear, 2015);
2638     QCOMPARE(calendar->week(QDate(2016, 1, 3), &weekYear), 1);         //First Sunday
2639     QCOMPARE(weekYear, 2016);
2640     QCOMPARE(calendar->week(QDate(2016, 1, 9), &weekYear), 1);         //Second Saturday
2641     QCOMPARE(weekYear, 2016);
2642     QCOMPARE(calendar->week(QDate(2016, 1, 10), &weekYear), 2);        //Second Sunday
2643     QCOMPARE(weekYear, 2016);
2644     QCOMPARE(calendar->week(QDate(2016, 12, 31), &weekYear), 52);       //Last Day
2645     QCOMPARE(weekYear, 2016);
2646 
2647     // Sat = Jan 1 2011 = Week 52 2010, Sun = Jan 2 = Week 1
2648     QCOMPARE(calendar->week(QDate(2011, 1, 1), &weekYear), 52);        //First Day, First Saturday
2649     QCOMPARE(weekYear, 2010);
2650     QCOMPARE(calendar->week(QDate(2011, 1, 2), &weekYear), 1);         //First Sunday
2651     QCOMPARE(weekYear, 2011);
2652     QCOMPARE(calendar->week(QDate(2011, 1, 8), &weekYear), 1);         //Second Saturday
2653     QCOMPARE(weekYear, 2011);
2654     QCOMPARE(calendar->week(QDate(2011, 1, 9), &weekYear), 2);         //Second Sunday
2655     QCOMPARE(weekYear, 2011);
2656     QCOMPARE(calendar->week(QDate(2011, 12, 31), &weekYear), 52);       //Last Day
2657     QCOMPARE(weekYear, 2011);
2658 
2659     // Sun = Jan 1 2012 = Week 1 2012, Sun = Jan 1 = Week 1
2660     QCOMPARE(calendar->week(QDate(2012, 1, 1), &weekYear), 1);         //First Day, First Sunday
2661     QCOMPARE(weekYear, 2012);
2662     QCOMPARE(calendar->week(QDate(2012, 1, 7), &weekYear), 1);         //First Saturday
2663     QCOMPARE(weekYear, 2012);
2664     QCOMPARE(calendar->week(QDate(2012, 1, 8), &weekYear), 2);         //Second Sunday
2665     QCOMPARE(weekYear, 2012);
2666     QCOMPARE(calendar->week(QDate(2012, 12, 31), &weekYear), 53);       //Last Day
2667     QCOMPARE(weekYear, 2012);
2668 
2669     // First Full Week starting Monday
2670     locale->setWeekStartDay(1);
2671     locale->setWeekNumberSystem(KLocale::FirstFullWeek);
2672 
2673     // Mon = Jan 1 2018 = Week 52 2017, Mon = Jan 1 = Week 1
2674     QCOMPARE(calendar->week(QDate(2018, 1, 1), &weekYear), 1);          //First Day, First Monday
2675     QCOMPARE(weekYear, 2018);
2676     QCOMPARE(calendar->week(QDate(2018, 1, 7), &weekYear), 1);          //First Sunday
2677     QCOMPARE(weekYear, 2018);
2678     QCOMPARE(calendar->week(QDate(2018, 1, 8), &weekYear), 2);          //Second Monday
2679     QCOMPARE(weekYear, 2018);
2680     QCOMPARE(calendar->week(QDate(2018, 12, 31), &weekYear), 53);       //Last Day
2681     QCOMPARE(weekYear, 2018);
2682 
2683     // Tue = Jan 1 2013 = Week 52 2012, Mon = Jan 7 = Week 1
2684     QCOMPARE(calendar->week(QDate(2013, 1, 1), &weekYear), 53);         //First Day
2685     QCOMPARE(weekYear, 2012);
2686     QCOMPARE(calendar->week(QDate(2013, 1, 6), &weekYear), 53);         //First Sunday
2687     QCOMPARE(weekYear, 2012);
2688     QCOMPARE(calendar->week(QDate(2013, 1, 7), &weekYear), 1);          //First Monday
2689     QCOMPARE(weekYear, 2013);
2690     QCOMPARE(calendar->week(QDate(2013, 1, 13), &weekYear), 1);         //Second Saturday
2691     QCOMPARE(weekYear, 2013);
2692     QCOMPARE(calendar->week(QDate(2013, 1, 14), &weekYear), 2);         //Second Monday
2693     QCOMPARE(weekYear, 2013);
2694     QCOMPARE(calendar->week(QDate(2013, 12, 31), &weekYear), 52);       //Last Day
2695     QCOMPARE(weekYear, 2013);
2696 
2697     // Wed = Jan 1 2014 = Week 52 2013, Mon = Jan 6 = Week 1
2698     QCOMPARE(calendar->week(QDate(2014, 1, 1), &weekYear), 52);         //First Day
2699     QCOMPARE(weekYear, 2013);
2700     QCOMPARE(calendar->week(QDate(2014, 1, 5), &weekYear), 52);         //First Sunday
2701     QCOMPARE(weekYear, 2013);
2702     QCOMPARE(calendar->week(QDate(2014, 1, 6), &weekYear), 1);          //First Monday
2703     QCOMPARE(weekYear, 2014);
2704     QCOMPARE(calendar->week(QDate(2014, 1, 12), &weekYear), 1);         //Second Saturday
2705     QCOMPARE(weekYear, 2014);
2706     QCOMPARE(calendar->week(QDate(2014, 1, 13), &weekYear), 2);         //Second Monday
2707     QCOMPARE(weekYear, 2014);
2708     QCOMPARE(calendar->week(QDate(2014, 12, 31), &weekYear), 52);       //Last Day
2709     QCOMPARE(weekYear, 2014);
2710 
2711     // Thu = Jan 1 2015 = Week 52 2014, Mon = Jan 5 = Week 1
2712     QCOMPARE(calendar->week(QDate(2015, 1, 1), &weekYear), 52);         //First Day
2713     QCOMPARE(weekYear, 2014);
2714     QCOMPARE(calendar->week(QDate(2015, 1, 4), &weekYear), 52);         //First Sunday
2715     QCOMPARE(weekYear, 2014);
2716     QCOMPARE(calendar->week(QDate(2015, 1, 5), &weekYear), 1);          //First Monday
2717     QCOMPARE(weekYear, 2015);
2718     QCOMPARE(calendar->week(QDate(2015, 1, 11), &weekYear), 1);         //Second Saturday
2719     QCOMPARE(weekYear, 2015);
2720     QCOMPARE(calendar->week(QDate(2015, 1, 12), &weekYear), 2);         //Second Monday
2721     QCOMPARE(weekYear, 2015);
2722     QCOMPARE(calendar->week(QDate(2015, 12, 31), &weekYear), 52);       //Last Day
2723     QCOMPARE(weekYear, 2015);
2724 
2725     // Fri = Jan 1 2016 = Week 52 2015, Mon = Jan 4 = Week 1
2726     QCOMPARE(calendar->week(QDate(2016, 1, 1), &weekYear), 52);         //First Day
2727     QCOMPARE(weekYear, 2015);
2728     QCOMPARE(calendar->week(QDate(2016, 1, 3), &weekYear), 52);         //First Sunday
2729     QCOMPARE(weekYear, 2015);
2730     QCOMPARE(calendar->week(QDate(2016, 1, 4), &weekYear), 1);          //First Monday
2731     QCOMPARE(weekYear, 2016);
2732     QCOMPARE(calendar->week(QDate(2016, 1, 10), &weekYear), 1);         //Second Saturday
2733     QCOMPARE(weekYear, 2016);
2734     QCOMPARE(calendar->week(QDate(2016, 1, 11), &weekYear), 2);         //Second Monday
2735     QCOMPARE(weekYear, 2016);
2736     QCOMPARE(calendar->week(QDate(2016, 12, 31), &weekYear), 52);       //Last Day
2737     QCOMPARE(weekYear, 2016);
2738 
2739     // Sat = Jan 1 2011 = Week 52 2010, Mon = Jan 3 = Week 1
2740     QCOMPARE(calendar->week(QDate(2011, 1, 1), &weekYear), 52);        //First Day
2741     QCOMPARE(weekYear, 2010);
2742     QCOMPARE(calendar->week(QDate(2011, 1, 2), &weekYear), 52);        //First Sunday
2743     QCOMPARE(weekYear, 2010);
2744     QCOMPARE(calendar->week(QDate(2011, 1, 3), &weekYear), 1);         //First Monday
2745     QCOMPARE(weekYear, 2011);
2746     QCOMPARE(calendar->week(QDate(2011, 1, 9), &weekYear), 1);         //Second Sunday
2747     QCOMPARE(weekYear, 2011);
2748     QCOMPARE(calendar->week(QDate(2011, 1, 10), &weekYear), 2);        //Second Monday
2749     QCOMPARE(weekYear, 2011);
2750     QCOMPARE(calendar->week(QDate(2011, 12, 31), &weekYear), 52);       //Last Day
2751     QCOMPARE(weekYear, 2011);
2752 
2753     // Sun = Jan 1 2012 = Week 52 2011, Mon = Jan 2 = Week 1
2754     QCOMPARE(calendar->week(QDate(2012, 1, 1), &weekYear), 52);         //First Day, First Sunday
2755     QCOMPARE(weekYear, 2011);
2756     QCOMPARE(calendar->week(QDate(2012, 1, 2), &weekYear), 1);          //First Monday
2757     QCOMPARE(weekYear, 2012);
2758     QCOMPARE(calendar->week(QDate(2012, 1, 8), &weekYear), 1);          //Second Sunday
2759     QCOMPARE(weekYear, 2012);
2760     QCOMPARE(calendar->week(QDate(2012, 1, 9), &weekYear), 2);          //Second Monday
2761     QCOMPARE(weekYear, 2012);
2762     QCOMPARE(calendar->week(QDate(2012, 12, 31), &weekYear), 53);       //Last Day
2763     QCOMPARE(weekYear, 2012);
2764 
2765     // First Partial Week, second week starting Sunday
2766     locale->setWeekStartDay(7);
2767     locale->setWeekNumberSystem(KLocale::FirstPartialWeek);
2768 
2769     // Mon = Jan 1 2018 = Week 1, Sun = Jan 7 = Week 2
2770     QCOMPARE(calendar->week(QDate(2018, 1, 1), &weekYear), 1);         //First Day
2771     QCOMPARE(weekYear, 2018);
2772     QCOMPARE(calendar->week(QDate(2018, 1, 6), &weekYear), 1);         //First Saturday
2773     QCOMPARE(weekYear, 2018);
2774     QCOMPARE(calendar->week(QDate(2018, 1, 7), &weekYear), 2);         //First Sunday
2775     QCOMPARE(weekYear, 2018);
2776     QCOMPARE(calendar->week(QDate(2018, 1, 13), &weekYear), 2);        //Second Saturday
2777     QCOMPARE(weekYear, 2018);
2778     QCOMPARE(calendar->week(QDate(2018, 1, 14), &weekYear), 3);        //Second Sunday
2779     QCOMPARE(weekYear, 2018);
2780     QCOMPARE(calendar->week(QDate(2018, 12, 31), &weekYear), 53);       //Last Day
2781     QCOMPARE(weekYear, 2018);
2782 
2783     // Tue = Jan 1 2013 = Week 1, Sun = Jan 6 = Week 2
2784     QCOMPARE(calendar->week(QDate(2013, 1, 1), &weekYear), 1);        //First Day
2785     QCOMPARE(weekYear, 2013);
2786     QCOMPARE(calendar->week(QDate(2013, 1, 5), &weekYear), 1);        //First Saturday
2787     QCOMPARE(weekYear, 2013);
2788     QCOMPARE(calendar->week(QDate(2013, 1, 6), &weekYear), 2);         //First Sunday
2789     QCOMPARE(weekYear, 2013);
2790     QCOMPARE(calendar->week(QDate(2013, 1, 12), &weekYear), 2);        //Second Saturday
2791     QCOMPARE(weekYear, 2013);
2792     QCOMPARE(calendar->week(QDate(2013, 1, 13), &weekYear), 3);        //Second Sunday
2793     QCOMPARE(weekYear, 2013);
2794     QCOMPARE(calendar->week(QDate(2013, 12, 31), &weekYear), 53);       //Last Day
2795     QCOMPARE(weekYear, 2013);
2796 
2797     // Wed = Jan 1 2014 = Week 1, Sun = Jan 5 = Week 2
2798     QCOMPARE(calendar->week(QDate(2014, 1, 1), &weekYear), 1);        //First Day
2799     QCOMPARE(weekYear, 2014);
2800     QCOMPARE(calendar->week(QDate(2014, 1, 4), &weekYear), 1);        //First Saturday
2801     QCOMPARE(weekYear, 2014);
2802     QCOMPARE(calendar->week(QDate(2014, 1, 5), &weekYear), 2);         //First Sunday
2803     QCOMPARE(weekYear, 2014);
2804     QCOMPARE(calendar->week(QDate(2014, 1, 11), &weekYear), 2);        //Second Saturday
2805     QCOMPARE(weekYear, 2014);
2806     QCOMPARE(calendar->week(QDate(2014, 1, 12), &weekYear), 3);        //Second Sunday
2807     QCOMPARE(weekYear, 2014);
2808     QCOMPARE(calendar->week(QDate(2014, 12, 31), &weekYear), 53);       //Last Day
2809     QCOMPARE(weekYear, 2014);
2810 
2811     // Thu = Jan 1 2015 = Week 1, Sun = Jan 4 = Week 2
2812     QCOMPARE(calendar->week(QDate(2015, 1, 1), &weekYear), 1);        //First Day
2813     QCOMPARE(weekYear, 2015);
2814     QCOMPARE(calendar->week(QDate(2015, 1, 3), &weekYear), 1);        //First Saturday
2815     QCOMPARE(weekYear, 2015);
2816     QCOMPARE(calendar->week(QDate(2015, 1, 4), &weekYear), 2);         //First Sunday
2817     QCOMPARE(weekYear, 2015);
2818     QCOMPARE(calendar->week(QDate(2015, 1, 10), &weekYear), 2);        //Second Saturday
2819     QCOMPARE(weekYear, 2015);
2820     QCOMPARE(calendar->week(QDate(2015, 1, 11), &weekYear), 3);        //Second Sunday
2821     QCOMPARE(weekYear, 2015);
2822     QCOMPARE(calendar->week(QDate(2015, 12, 31), &weekYear), 53);       //Last Day
2823     QCOMPARE(weekYear, 2015);
2824 
2825     // Fri = Jan 1 2016 = Week 1, Sun = Jan 3 = Week 2
2826     QCOMPARE(calendar->week(QDate(2016, 1, 1), &weekYear), 1);        //First Day
2827     QCOMPARE(weekYear, 2016);
2828     QCOMPARE(calendar->week(QDate(2016, 1, 2), &weekYear), 1);        //First Saturday
2829     QCOMPARE(weekYear, 2016);
2830     QCOMPARE(calendar->week(QDate(2016, 1, 3), &weekYear), 2);         //First Sunday
2831     QCOMPARE(weekYear, 2016);
2832     QCOMPARE(calendar->week(QDate(2016, 1, 9), &weekYear), 2);         //Second Saturday
2833     QCOMPARE(weekYear, 2016);
2834     QCOMPARE(calendar->week(QDate(2016, 1, 10), &weekYear), 3);        //Second Sunday
2835     QCOMPARE(weekYear, 2016);
2836     QCOMPARE(calendar->week(QDate(2016, 12, 31), &weekYear), 53);       //Last Day
2837     QCOMPARE(weekYear, 2016);
2838 
2839     // Sat = Jan 1 2011 = Week 1, Sun = Jan 2 = Week 2
2840     QCOMPARE(calendar->week(QDate(2011, 1, 1), &weekYear), 1);        //First Day, First Saturday
2841     QCOMPARE(weekYear, 2011);
2842     QCOMPARE(calendar->week(QDate(2011, 1, 2), &weekYear), 2);         //First Sunday
2843     QCOMPARE(weekYear, 2011);
2844     QCOMPARE(calendar->week(QDate(2011, 1, 8), &weekYear), 2);         //Second Saturday
2845     QCOMPARE(weekYear, 2011);
2846     QCOMPARE(calendar->week(QDate(2011, 1, 9), &weekYear), 3);         //Second Sunday
2847     QCOMPARE(weekYear, 2011);
2848     QCOMPARE(calendar->week(QDate(2011, 12, 31), &weekYear), 53);       //Last Day
2849     QCOMPARE(weekYear, 2011);
2850 
2851     // Sun = Jan 1 2012 = Week 1, Sun = Jan 1 = Week 1
2852     QCOMPARE(calendar->week(QDate(2012, 1, 1), &weekYear), 1);         //First Day, First Sunday
2853     QCOMPARE(weekYear, 2012);
2854     QCOMPARE(calendar->week(QDate(2012, 1, 7), &weekYear), 1);         //First Saturday
2855     QCOMPARE(weekYear, 2012);
2856     QCOMPARE(calendar->week(QDate(2012, 1, 8), &weekYear), 2);         //Second Sunday
2857     QCOMPARE(weekYear, 2012);
2858     QCOMPARE(calendar->week(QDate(2012, 12, 31), &weekYear), 53);       //Last Day
2859     QCOMPARE(weekYear, 2012);
2860 
2861     // First Partial Week starting Monday
2862     locale->setWeekStartDay(1);
2863     locale->setWeekNumberSystem(KLocale::FirstPartialWeek);
2864 
2865     // Mon = Jan 1 2018 = Week 1, Mon = Jan 1 = Week 2
2866     QCOMPARE(calendar->week(QDate(2018, 1, 1), &weekYear), 1);          //First Day, First Monday
2867     QCOMPARE(weekYear, 2018);
2868     QCOMPARE(calendar->week(QDate(2018, 1, 7), &weekYear), 1);          //First Sunday
2869     QCOMPARE(weekYear, 2018);
2870     QCOMPARE(calendar->week(QDate(2018, 1, 8), &weekYear), 2);          //Second Monday
2871     QCOMPARE(weekYear, 2018);
2872     QCOMPARE(calendar->week(QDate(2018, 12, 31), &weekYear), 53);       //Last Day
2873     QCOMPARE(weekYear, 2018);
2874 
2875     // Tue = Jan 1 2013 = Week 1, Mon = Jan 7 = Week 2
2876     QCOMPARE(calendar->week(QDate(2013, 1, 1), &weekYear), 1);          //First Day
2877     QCOMPARE(weekYear, 2013);
2878     QCOMPARE(calendar->week(QDate(2013, 1, 6), &weekYear), 1);          //First Sunday
2879     QCOMPARE(weekYear, 2013);
2880     QCOMPARE(calendar->week(QDate(2013, 1, 7), &weekYear), 2);          //First Monday
2881     QCOMPARE(weekYear, 2013);
2882     QCOMPARE(calendar->week(QDate(2013, 1, 13), &weekYear), 2);         //Second Saturday
2883     QCOMPARE(weekYear, 2013);
2884     QCOMPARE(calendar->week(QDate(2013, 1, 14), &weekYear), 3);         //Second Monday
2885     QCOMPARE(weekYear, 2013);
2886     QCOMPARE(calendar->week(QDate(2013, 12, 31), &weekYear), 53);       //Last Day
2887     QCOMPARE(weekYear, 2013);
2888 
2889     // Wed = Jan 1 2014 = Week 1, Mon = Jan 6 = Week 2
2890     QCOMPARE(calendar->week(QDate(2014, 1, 1), &weekYear), 1);          //First Day
2891     QCOMPARE(weekYear, 2014);
2892     QCOMPARE(calendar->week(QDate(2014, 1, 5), &weekYear), 1);          //First Sunday
2893     QCOMPARE(weekYear, 2014);
2894     QCOMPARE(calendar->week(QDate(2014, 1, 6), &weekYear), 2);          //First Monday
2895     QCOMPARE(weekYear, 2014);
2896     QCOMPARE(calendar->week(QDate(2014, 1, 12), &weekYear), 2);         //Second Saturday
2897     QCOMPARE(weekYear, 2014);
2898     QCOMPARE(calendar->week(QDate(2014, 1, 13), &weekYear), 3);         //Second Monday
2899     QCOMPARE(weekYear, 2014);
2900     QCOMPARE(calendar->week(QDate(2014, 12, 31), &weekYear), 53);       //Last Day
2901     QCOMPARE(weekYear, 2014);
2902 
2903     // Thu = Jan 1 2015 = Week 1, Mon = Jan 5 = Week 2
2904     QCOMPARE(calendar->week(QDate(2015, 1, 1), &weekYear), 1);          //First Day
2905     QCOMPARE(weekYear, 2015);
2906     QCOMPARE(calendar->week(QDate(2015, 1, 4), &weekYear), 1);          //First Sunday
2907     QCOMPARE(weekYear, 2015);
2908     QCOMPARE(calendar->week(QDate(2015, 1, 5), &weekYear), 2);          //First Monday
2909     QCOMPARE(weekYear, 2015);
2910     QCOMPARE(calendar->week(QDate(2015, 1, 11), &weekYear), 2);         //Second Saturday
2911     QCOMPARE(weekYear, 2015);
2912     QCOMPARE(calendar->week(QDate(2015, 1, 12), &weekYear), 3);         //Second Monday
2913     QCOMPARE(weekYear, 2015);
2914     QCOMPARE(calendar->week(QDate(2015, 12, 31), &weekYear), 53);       //Last Day
2915     QCOMPARE(weekYear, 2015);
2916 
2917     // Fri = Jan 1 2016 = Week 1, Mon = Jan 4 = Week 2
2918     QCOMPARE(calendar->week(QDate(2016, 1, 1), &weekYear), 1);          //First Day
2919     QCOMPARE(weekYear, 2016);
2920     QCOMPARE(calendar->week(QDate(2016, 1, 3), &weekYear), 1);          //First Sunday
2921     QCOMPARE(weekYear, 2016);
2922     QCOMPARE(calendar->week(QDate(2016, 1, 4), &weekYear), 2);          //First Monday
2923     QCOMPARE(weekYear, 2016);
2924     QCOMPARE(calendar->week(QDate(2016, 1, 10), &weekYear), 2);         //Second Saturday
2925     QCOMPARE(weekYear, 2016);
2926     QCOMPARE(calendar->week(QDate(2016, 1, 11), &weekYear), 3);         //Second Monday
2927     QCOMPARE(weekYear, 2016);
2928     QCOMPARE(calendar->week(QDate(2016, 12, 31), &weekYear), 53);       //Last Day
2929     QCOMPARE(weekYear, 2016);
2930 
2931     // Sat = Jan 1 2011 = Week 1, Mon = Jan 3 = Week 2
2932     QCOMPARE(calendar->week(QDate(2011, 1, 1), &weekYear), 1);         //First Day
2933     QCOMPARE(weekYear, 2011);
2934     QCOMPARE(calendar->week(QDate(2011, 1, 2), &weekYear), 1);         //First Sunday
2935     QCOMPARE(weekYear, 2011);
2936     QCOMPARE(calendar->week(QDate(2011, 1, 3), &weekYear), 2);         //First Monday
2937     QCOMPARE(weekYear, 2011);
2938     QCOMPARE(calendar->week(QDate(2011, 1, 9), &weekYear), 2);         //Second Sunday
2939     QCOMPARE(weekYear, 2011);
2940     QCOMPARE(calendar->week(QDate(2011, 1, 10), &weekYear), 3);        //Second Monday
2941     QCOMPARE(weekYear, 2011);
2942     QCOMPARE(calendar->week(QDate(2011, 12, 31), &weekYear), 53);       //Last Day
2943     QCOMPARE(weekYear, 2011);
2944 
2945     // Sun = Jan 1 2012 = Week 1, Mon = Jan 2 = Week 2
2946     QCOMPARE(calendar->week(QDate(2012, 1, 1), &weekYear), 1);         //First Day, First Sunday
2947     QCOMPARE(weekYear, 2012);
2948     QCOMPARE(calendar->week(QDate(2012, 1, 2), &weekYear), 2);          //First Monday
2949     QCOMPARE(weekYear, 2012);
2950     QCOMPARE(calendar->week(QDate(2012, 1, 8), &weekYear), 2);          //Second Sunday
2951     QCOMPARE(weekYear, 2012);
2952     QCOMPARE(calendar->week(QDate(2012, 1, 9), &weekYear), 3);          //Second Monday
2953     QCOMPARE(weekYear, 2012);
2954     QCOMPARE(calendar->week(QDate(2012, 12, 31), &weekYear), 54);       //Last Day
2955     QCOMPARE(weekYear, 2012);
2956 
2957     // Simple weeks starting Jan 1
2958     locale->setWeekStartDay(1);
2959     locale->setWeekNumberSystem(KLocale::SimpleWeek);
2960 
2961     // Mon = Jan 1 2018
2962     QCOMPARE(calendar->week(QDate(2018, 1, 1), &weekYear), 1);         //First Day, Monday
2963     QCOMPARE(weekYear, 2018);
2964     QCOMPARE(calendar->week(QDate(2018, 1, 7), &weekYear), 1);
2965     QCOMPARE(weekYear, 2018);
2966     QCOMPARE(calendar->week(QDate(2018, 1, 8), &weekYear), 2);         //Second Week
2967     QCOMPARE(weekYear, 2018);
2968     QCOMPARE(calendar->week(QDate(2018, 1, 14), &weekYear), 2);
2969     QCOMPARE(weekYear, 2018);
2970     QCOMPARE(calendar->week(QDate(2018, 1, 15), &weekYear), 3);        //Third Week
2971     QCOMPARE(weekYear, 2018);
2972 
2973     // Tue = Jan 1 2013
2974     QCOMPARE(calendar->week(QDate(2013, 1, 1), &weekYear), 1);         //First Day, Tuesday
2975     QCOMPARE(weekYear, 2013);
2976     QCOMPARE(calendar->week(QDate(2013, 1, 7), &weekYear), 1);
2977     QCOMPARE(weekYear, 2013);
2978     QCOMPARE(calendar->week(QDate(2013, 1, 8), &weekYear), 2);         //Second Week
2979     QCOMPARE(weekYear, 2013);
2980     QCOMPARE(calendar->week(QDate(2013, 1, 14), &weekYear), 2);
2981     QCOMPARE(weekYear, 2013);
2982     QCOMPARE(calendar->week(QDate(2013, 1, 15), &weekYear), 3);        //Third Week
2983     QCOMPARE(weekYear, 2013);
2984 
2985     // Wed = Jan 1 2014
2986     QCOMPARE(calendar->week(QDate(2014, 1, 1), &weekYear), 1);         //First Day, Wednesday
2987     QCOMPARE(weekYear, 2014);
2988     QCOMPARE(calendar->week(QDate(2014, 1, 7), &weekYear), 1);
2989     QCOMPARE(weekYear, 2014);
2990     QCOMPARE(calendar->week(QDate(2014, 1, 8), &weekYear), 2);         //Second Week
2991     QCOMPARE(weekYear, 2014);
2992     QCOMPARE(calendar->week(QDate(2014, 1, 14), &weekYear), 2);
2993     QCOMPARE(weekYear, 2014);
2994     QCOMPARE(calendar->week(QDate(2014, 1, 15), &weekYear), 3);        //Third Week
2995     QCOMPARE(weekYear, 2014);
2996 
2997     // Thu = Jan 1 2015
2998     QCOMPARE(calendar->week(QDate(2015, 1, 1), &weekYear), 1);         //First Day, Thursday
2999     QCOMPARE(weekYear, 2015);
3000     QCOMPARE(calendar->week(QDate(2015, 1, 7), &weekYear), 1);
3001     QCOMPARE(weekYear, 2015);
3002     QCOMPARE(calendar->week(QDate(2015, 1, 8), &weekYear), 2);         //Second Week
3003     QCOMPARE(weekYear, 2015);
3004     QCOMPARE(calendar->week(QDate(2015, 1, 14), &weekYear), 2);
3005     QCOMPARE(weekYear, 2015);
3006     QCOMPARE(calendar->week(QDate(2015, 1, 15), &weekYear), 3);        //Third Week
3007     QCOMPARE(weekYear, 2015);
3008 
3009     // Fri = Jan 1 2016
3010     QCOMPARE(calendar->week(QDate(2016, 1, 1), &weekYear), 1);         //First Day, Monday
3011     QCOMPARE(weekYear, 2016);
3012     QCOMPARE(calendar->week(QDate(2016, 1, 7), &weekYear), 1);
3013     QCOMPARE(weekYear, 2016);
3014     QCOMPARE(calendar->week(QDate(2016, 1, 8), &weekYear), 2);         //Second Week
3015     QCOMPARE(weekYear, 2016);
3016     QCOMPARE(calendar->week(QDate(2016, 1, 14), &weekYear), 2);
3017     QCOMPARE(weekYear, 2016);
3018     QCOMPARE(calendar->week(QDate(2016, 1, 15), &weekYear), 3);        //Third Week
3019     QCOMPARE(weekYear, 2016);
3020 
3021     // Sat = Jan 1 2011
3022     QCOMPARE(calendar->week(QDate(2011, 1, 1), &weekYear), 1);         //First Day, Monday
3023     QCOMPARE(weekYear, 2011);
3024     QCOMPARE(calendar->week(QDate(2011, 1, 7), &weekYear), 1);
3025     QCOMPARE(weekYear, 2011);
3026     QCOMPARE(calendar->week(QDate(2011, 1, 8), &weekYear), 2);         //Second Week
3027     QCOMPARE(weekYear, 2011);
3028     QCOMPARE(calendar->week(QDate(2011, 1, 14), &weekYear), 2);
3029     QCOMPARE(weekYear, 2011);
3030     QCOMPARE(calendar->week(QDate(2011, 1, 15), &weekYear), 3);        //Third Week
3031     QCOMPARE(weekYear, 2011);
3032 
3033     // Sun = Jan 1 2012
3034     QCOMPARE(calendar->week(QDate(2012, 1, 1), &weekYear), 1);         //First Day, Monday
3035     QCOMPARE(weekYear, 2012);
3036     QCOMPARE(calendar->week(QDate(2012, 1, 7), &weekYear), 1);
3037     QCOMPARE(weekYear, 2012);
3038     QCOMPARE(calendar->week(QDate(2012, 1, 8), &weekYear), 2);         //Second Week
3039     QCOMPARE(weekYear, 2012);
3040     QCOMPARE(calendar->week(QDate(2012, 1, 14), &weekYear), 2);
3041     QCOMPARE(weekYear, 2012);
3042     QCOMPARE(calendar->week(QDate(2012, 1, 15), &weekYear), 3);        //Third Week
3043     QCOMPARE(weekYear, 2012);
3044 
3045     delete calendar;
3046     delete locale;
3047 }
3048