**** Merged from MCS ****
[mono-project.git] / mcs / class / corlib / Test / System.Globalization / CalendarTest.cs
blob1b0ca5a332c7f96c7cd435b1a35a1cb6eb8c1e65
1 // CalendarTest.cs
2 //
3 // (C) 2002 Ulrich Kunitz
4 //
6 using NUnit.Framework;
7 using System;
8 using System.Globalization;
9 using System.IO;
11 namespace MonoTests.System.Globalization
14 sealed class Date {
15 private int _day, _month, _year, _era;
17 public int Day {
18 get {
19 return _day;
21 set {
22 if (value < 1 || value > 31)
23 throw new ArgumentOutOfRangeException(
24 "Day",
25 "Day must be between 1 and 31.");
26 _day = value;
30 public int Month {
31 get {
32 return _month;
34 set {
35 if (value < 1 || value > 13)
36 throw new ArgumentOutOfRangeException(
37 "Month",
38 "Month must be between 1 and 13.");
39 _month = value;
43 public int Year {
44 get {
45 return _year;
47 set {
48 _year = value;
52 public int Era {
53 get {
54 return _era;
56 set {
57 if (value < 1 || value > 10)
58 throw new ArgumentOutOfRangeException(
59 "Era",
60 "Era must be between 1 and 10.");
61 _era = value;
65 public Date(int day, int month, int year, int era) {
66 Day = day;
67 Month = month;
68 Year = year;
69 Era = era;
71 public Date(int day, int month, int year) : this(day,month,year,1) {}
72 public Date() : this(1,1,1,1) {}
74 public DateTime ToDateTime(Calendar cal) {
75 return cal.ToDateTime(Year,Month,Day,0,0,0,0,Era);
78 public void FromDateTime(Calendar cal, DateTime time) {
79 Date dmy = new Date();
80 dmy.Day = cal.GetDayOfMonth(time);
81 dmy.Month = cal.GetMonth(time);
82 dmy.Year = cal.GetYear(time);
83 dmy.Era = cal.GetEra(time);
84 Day = dmy.Day;
85 Month = dmy.Month;
86 Year = dmy.Year;
87 Era = dmy.Era;
90 public override string ToString() {
91 StringWriter sw = new StringWriter();
92 sw.Write("{0}.{1}.{2}", Day, Month, Year);
93 if (Era != 1) {
94 sw.Write(" era {0}", Era);
96 return sw.ToString();
99 public override bool Equals(Object b) {
100 if (b == null || GetType() != b.GetType())
101 return false;
102 return Equals(this, (Date)b);
105 public static bool Equals(Date a, Date b) {
106 if (a == b)
107 return true;
108 if (a.Year != b.Year)
109 return false;
110 if (a.Month != b.Month)
111 return false;
112 if (a.Day != b.Day)
113 return false;
114 if (a.Era != b.Era)
115 return false;
116 return true;
119 public override int GetHashCode() {
120 return ToString().GetHashCode();
122 } // class Date
124 public class CalendarTest : TestCase {
125 private Calendar[] acal;
126 private GregorianCalendar gcal;
127 private JulianCalendar jucal;
128 private HijriCalendar hical;
129 private HebrewCalendar hecal;
130 private JapaneseCalendar jacal;
131 private TaiwanCalendar tacal;
132 private KoreanCalendar kcal;
133 private ThaiBuddhistCalendar tbcal;
135 protected override void SetUp() {
136 gcal = new GregorianCalendar();
137 jucal = new JulianCalendar();
138 hical = new HijriCalendar();
139 hecal = new HebrewCalendar();
140 jacal = new JapaneseCalendar();
141 tacal = new TaiwanCalendar();
142 kcal = new KoreanCalendar();
143 tbcal = new ThaiBuddhistCalendar();
144 acal = new Calendar[] {
145 gcal, jucal, hical, hecal, jacal,
146 tacal, kcal, tbcal};
149 private void RowCheck(params Date[] adate) {
150 if (adate.Length != acal.Length)
151 throw new ArgumentException(
152 "Number of Date arguments doesn't match " +
153 "length of calendar array.");
155 DateTime timeG = adate[0].ToDateTime(gcal);
156 for (int i = 0; i < acal.Length; i++) {
157 Date date = adate[i];
158 if (date == null)
159 continue;
160 Calendar cal = acal[i];
162 DateTime time = date.ToDateTime(cal);
163 StringWriter sw = new StringWriter();
164 sw.Write("Calendar {0} computes wrong DateTime.",
165 cal);
166 AssertEquals(sw.ToString(), timeG, time);
168 sw = new StringWriter();
169 Date ndate = new Date();
170 ndate.FromDateTime(cal, time);
171 sw.Write("Calendar {0} computes wrong date", cal);
172 AssertEquals(sw.ToString(), date, ndate);
176 // We are testing the implementation against the reference dates in
177 // Calendrical Calcualation. Please note that the CLR uses another
178 // epoch for the HijriCalendar, which might be the perfect thing
179 // to do.
180 public void TestCCTable() {
181 // Gr Ju Hi He Ja Ta Ko TB
182 RowCheck(new Date(24,9,70,1),
183 new Date(26,9,70,1),
184 null,
185 null,
186 null,
187 null,
188 new Date(24,9,2403,1),
189 new Date(24,9,613,1));
190 RowCheck(new Date(2,10,135,1),
191 new Date(3,10,135,1),
192 null,
193 null,
194 null,
195 null,
196 new Date(2,10,2468,1),
197 new Date(2,10,678,1));
198 RowCheck(new Date(8,1,470,1),
199 new Date(7,1,470,1),
200 null,
201 null,
202 null,
203 null,
204 new Date(8,1,2803,1),
205 new Date(8,1,1013,1));
206 RowCheck(new Date(20,5,576,1),
207 new Date(18,5,576,1),
208 null,
209 null,
210 null,
211 null,
212 new Date(20,5,2909,1),
213 new Date(20,5,1119,1));
214 RowCheck(new Date(10,11,694,1),
215 new Date(7,11,694,1),
216 new Date(14,7,75,1),
217 null,
218 null,
219 null,
220 new Date(10,11,3027,1),
221 new Date(10,11,1237,1));
222 RowCheck(new Date(25,4,1013,1),
223 new Date(19,4,1013,1),
224 new Date(6,10,403,1),
225 null,
226 null,
227 null,
228 new Date(25,4,3346,1),
229 new Date(25,4,1556,1));
230 RowCheck(new Date(24,5,1096,1),
231 new Date(18,5,1096,1),
232 new Date(23,5,489,1),
233 null,
234 null,
235 null,
236 new Date(24,5,3429,1),
237 new Date(24,5,1639,1));
238 RowCheck(new Date(23,3,1190,1),
239 new Date(16,3,1190,1),
240 new Date(8,2,586,1),
241 null,
242 null,
243 null,
244 new Date(23,3,3523,1),
245 new Date(23,3,1733,1));
246 RowCheck(new Date(10,3,1240,1),
247 new Date(3,3,1240,1),
248 new Date(8,8,637,1),
249 null,
250 null,
251 null,
252 new Date(10,3,3573,1),
253 new Date(10,3,1783,1));
254 RowCheck(new Date(2,4,1288,1),
255 new Date(26,3,1288,1),
256 new Date(21,2,687,1),
257 null,
258 null,
259 null,
260 new Date(2,4,3621,1),
261 new Date(2,4,1831,1));
262 RowCheck(new Date(27,4,1298,1),
263 new Date(20,4,1298,1),
264 new Date(8,7,697,1),
265 null,
266 null,
267 null,
268 new Date(27,4,3631,1),
269 new Date(27,4,1841,1));
270 RowCheck(new Date(12,6,1391,1),
271 new Date(4,6,1391,1),
272 new Date(2,7,793,1),
273 null,
274 null,
275 null,
276 new Date(12,6,3724,1),
277 new Date(12,6,1934,1));
278 RowCheck(new Date(3,2,1436,1),
279 new Date(25,1,1436,1),
280 new Date(7,7,839,1),
281 null,
282 null,
283 null,
284 new Date(3,2,3769,1),
285 new Date(3,2,1979,1));
286 RowCheck(new Date(9,4,1492,1),
287 new Date(31,3,1492,1),
288 new Date(2,6,897,1),
289 null,
290 null,
291 null,
292 new Date(9,4,3825,1),
293 new Date(9,4,2035,1));
294 RowCheck(new Date(19,9,1553,1),
295 new Date(9,9,1553,1),
296 new Date(1,10,960,1),
297 null,
298 null,
299 null,
300 new Date(19,9,3886,1),
301 new Date(19,9,2096,1));
302 RowCheck(new Date(5,3,1560,1),
303 new Date(24,2,1560,1),
304 new Date(28,5,967,1),
305 null,
306 null,
307 null,
308 new Date(5,3,3893,1),
309 new Date(5,3,2103,1));
310 RowCheck(new Date(10,6,1648,1),
311 new Date(31,5,1648,1),
312 new Date(19,5,1058,1),
313 new Date(20,9,5408,1),
314 null,
315 null,
316 new Date(10,6,3981,1),
317 new Date(10,6,2191,1));
318 RowCheck(new Date(30,6,1680,1),
319 new Date(20,6,1680,1),
320 new Date(3,6,1091,1),
321 new Date(3,11,5440,1),
322 null,
323 null,
324 new Date(30,6,4013,1),
325 new Date(30,6,2223,1));
326 RowCheck(new Date(24,7,1716,1),
327 new Date(13,7,1716,1),
328 new Date(5,8,1128,1),
329 new Date(5,11,5476,1),
330 null,
331 null,
332 new Date(24,7,4049,1),
333 new Date(24,7,2259,1));
334 RowCheck(new Date(19,6,1768,1),
335 new Date(8,6,1768,1),
336 new Date(4,2,1182,1),
337 new Date(4,10,5528,1),
338 null,
339 null,
340 new Date(19,6,4101,1),
341 new Date(19,6,2311,1));
342 RowCheck(new Date(2,8,1819,1),
343 new Date(21,7,1819,1),
344 new Date(11,10,1234,1),
345 new Date(11,11,5579,1),
346 null,
347 null,
348 new Date(2,8,4152,1),
349 new Date(2,8,2362,1));
350 RowCheck(new Date(27,3,1839,1),
351 new Date(15,3,1839,1),
352 new Date(12,1,1255,1),
353 new Date(12,7,5599,1),
354 null,
355 null,
356 new Date(27,3,4172,1),
357 new Date(27,3,2382,1));
358 RowCheck(new Date(19,4,1903,1),
359 new Date(6,4,1903,1),
360 new Date(22,1,1321,1),
361 new Date(22,7,5663,1),
362 new Date(19,4,36,1),
363 null,
364 new Date(19,4,4236,1),
365 new Date(19,4,2446,1));
366 RowCheck(new Date(25,8,1929,1),
367 new Date(12,8,1929,1),
368 new Date(20,3,1348,1),
369 new Date(19,12,5689,1),
370 new Date(25,8,4,3),
371 new Date(25,8,18,1),
372 new Date(25,8,4262,1),
373 new Date(25,8,2472,1));
374 RowCheck(new Date(29,9,1941,1),
375 new Date(16,9,1941,1),
376 new Date(9,9,1360,1),
377 new Date(8,1,5702,1),
378 new Date(29,9,16,3),
379 new Date(29,9,30,1),
380 new Date(29,9,4274,1),
381 new Date(29,9,2484,1));
382 RowCheck(new Date(19,4,1943,1),
383 new Date(6,4,1943,1),
384 new Date(14,4,1362,1),
385 new Date(14,8,5703,1),
386 new Date(19,4,18,3),
387 new Date(19,4,32,1),
388 new Date(19,4,4276,1),
389 new Date(19,4,2486,1));
390 RowCheck(new Date(7,10,1943,1),
391 new Date(24,9,1943,1),
392 new Date(8,10,1362,1),
393 new Date(8,1,5704,1),
394 new Date(7,10,18,3),
395 new Date(7,10,32,1),
396 new Date(7,10,4276,1),
397 new Date(7,10,2486,1));
398 RowCheck(new Date(17,3,1992,1),
399 new Date(4,3,1992,1),
400 new Date(14,9,1412,1),
401 new Date(12,7,5752,1),
402 new Date(17,3,4,4),
403 new Date(17,3,81,1),
404 new Date(17,3,4325,1),
405 new Date(17,3,2535,1));
406 RowCheck(new Date(25,5,1996,1),
407 new Date(12,5,1996,1),
408 new Date(8,1,1417,1),
409 new Date(7,9,5756,1),
410 new Date(25,5,8,4),
411 new Date(25,5,85,1),
412 new Date(25,5,4329,1),
413 new Date(25,5,2539,1));
414 RowCheck(new Date(10,11,2038,1),
415 new Date(28,10,2038,1),
416 new Date(13,10,1460,1),
417 new Date(12,2,5799,1),
418 new Date(10,11,50,4),
419 new Date(10,11,127,1),
420 new Date(10,11,4371,1),
421 new Date(10,11,2581,1));
422 RowCheck(new Date(18,7,2094,1),
423 new Date(5,7,2094,1),
424 new Date(6,3,1518,1),
425 new Date(5,11,5854,1),
426 new Date(18,7,106,4),
427 new Date(18,7,183,1),
428 new Date(18,7,4427,1),
429 new Date(18,7,2637,1));
432 public void TestCalendarType() {
433 GregorianCalendar gc = new GregorianCalendar(
434 GregorianCalendarTypes.Arabic);
435 AssertEquals("A01 Gregorian ctor " +
436 "with GregorianCalendarTypes parameter",
437 GregorianCalendarTypes.Arabic,
438 gc.CalendarType);
439 gc.CalendarType = GregorianCalendarTypes.MiddleEastFrench;
440 AssertEquals("A02 GregorianCalendar.CalendarType",
441 GregorianCalendarTypes.MiddleEastFrench,
442 gc.CalendarType);
445 public void TestStandardEras() {
446 AssertEquals("B01 ADEra", 1, GregorianCalendar.ADEra);
447 AssertEquals("B02 HebrewEra", 1, HebrewCalendar.HebrewEra);
448 AssertEquals("B03 HjriEra", 1, HijriCalendar.HijriEra);
449 AssertEquals("B04 JulianEra", 1, JulianCalendar.JulianEra);
450 AssertEquals("B05 KoreanEra", 1, KoreanCalendar.KoreanEra);
451 AssertEquals("B06 ThaiBuddhistEra", 1,
452 ThaiBuddhistCalendar.ThaiBuddhistEra);
455 public void TestCurrentEra() {
456 AssertEquals("C01 GregorianCalendar.CurrentEra",
457 0, GregorianCalendar.CurrentEra);
458 AssertEquals("C02 HebrewCalendar.CurrentEra",
459 0, HebrewCalendar.CurrentEra);
460 AssertEquals("C03 HijriCalendar.CurrentEra",
461 0, HijriCalendar.CurrentEra);
462 AssertEquals("C04 JapaneseCalendar.CurrentEra",
463 0, JapaneseCalendar.CurrentEra);
464 AssertEquals("C05 JulianCalendar.CurrentEra",
465 0, JulianCalendar.CurrentEra);
466 AssertEquals("C06 KoreanCalendar.CurrentEra",
467 0, KoreanCalendar.CurrentEra);
468 AssertEquals("C07 TaiwanCalendar.CurrentEra",
469 0, TaiwanCalendar.CurrentEra);
470 AssertEquals("C08 ThaiBuddhistCalendar.CurrentEra",
472 ThaiBuddhistCalendar.CurrentEra);
475 public void TestErasProperty() {
476 foreach (Calendar cal in acal) {
477 int check = 1;
478 if (cal is JapaneseCalendar)
479 check = 4;
480 AssertEquals(String.Format("D01 {0}.Eras.Length", cal),
481 check, cal.Eras.Length);
482 cal.Eras[0] = 29;
483 Assert(String.Format("D02 {0}.Eras readonly", cal),
484 cal.Eras[0] != 29);
488 public void TestTwoDigitYearMax() {
489 AssertEquals("E01 TwoDigitYearMax GregorianCalendar",
490 2029, gcal.TwoDigitYearMax);
491 AssertEquals("E02 TwoDigitYearMax HebrewCalendar",
492 5790, hecal.TwoDigitYearMax);
493 AssertEquals("E03 TwoDigitYearMax HijriCalendar",
494 1451, hical.TwoDigitYearMax);
495 AssertEquals("E04 TwoDigitYearMax JapaneseCalendar",
496 99, jacal.TwoDigitYearMax);
497 AssertEquals("E05 TwoDigitYearMax JulianCalendar",
498 2029, jucal.TwoDigitYearMax);
499 AssertEquals("E06 TwoDigitYearMax KoreanCalendar",
500 4362, kcal.TwoDigitYearMax);
501 AssertEquals("E07 TwoDigitYearMax TaiwanCalendar",
502 99, tacal.TwoDigitYearMax);
503 AssertEquals("E08 TwoDigitYearMax ThaiBuddhistCalendar",
504 2572, tbcal.TwoDigitYearMax);
505 foreach (Calendar cal in acal) {
506 bool exception = false;
507 try {
508 cal.TwoDigitYearMax = 99;
510 catch (ArgumentOutOfRangeException) {
511 exception = true;
513 Assert(String.Format("E09 {0}.TwoDigitYearMax 99 " +
514 " out of range exception", cal),
515 exception);
517 exception = false;
518 int m = 10000;
519 try {
520 m = cal.GetYear(DateTime.MaxValue)+1;
521 cal.TwoDigitYearMax = m;
523 catch (ArgumentException) {
524 exception = true;
526 Assert(String.Format("E10 {0}.TwoDigitYearMax out " +
527 " of range exception value {1}",
528 cal, m),
529 exception);
533 /* UK TODO: breaks with current DateTime implementation.
534 * I've a newer one that works, but that requires to much changes.
535 * for now.
536 public void TestToFourDigitYear() {
537 foreach (Calendar cal in acal) {
538 bool working = true;
539 int mod = 2000;
540 if (cal is HebrewCalendar)
541 mod = 5500;
542 if (cal is KoreanCalendar)
543 mod = 3000;
544 if (cal is JapaneseCalendar)
545 working = false;
546 if (cal is TaiwanCalendar)
547 working = false;
548 cal.TwoDigitYearMax = mod + 229;
549 AssertEquals(
550 String.Format("F01 {0}.TwoDigitYearMax", cal),
551 mod+229 , cal.TwoDigitYearMax);
552 AssertEquals(
553 String.Format("F02 {0}.ToFourDigitYear(29)",
554 cal),
555 working ? mod+229 : 29,
556 cal.ToFourDigitYear(29));
557 AssertEquals(
558 String.Format("F03 {0}.ToFourDigitYear(30)",
559 cal),
560 working ? mod+130 : 30,
561 cal.ToFourDigitYear(30));
562 AssertEquals(
563 String.Format("F04 {0}.ToFourDigitYear({1})",
564 cal, mod),
565 mod, cal.ToFourDigitYear(mod));
566 bool exception = false;
567 try {
568 cal.ToFourDigitYear(-1);
570 catch (ArgumentOutOfRangeException) {
571 exception = true;
573 Assert(String.Format(
574 "F05 {0}.ToFourDigitYear(-1) exception",
575 cal), exception);
576 exception = false;
577 try {
578 cal.ToFourDigitYear(15000);
580 catch (ArgumentOutOfRangeException) {
581 exception = true;
583 Assert(String.Format(
584 "F05 {0}.ToFourDigitYear(15000) exception",
585 cal), exception);
590 // TODO: more tests :-)
591 } // class CalendarTest
593 } // namespace MonoTests.System.Globalization