CalendarTest.cs 14 KB

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