testgregorian_calendar.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. /* Copyright (c) 2002,2003 CrystalClear Software, Inc.
  2. * Use, modification and distribution is subject to the
  3. * Boost Software License, Version 1.0. (See accompanying
  4. * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  5. * Author: Jeff Garland
  6. */
  7. #include "boost/date_time/gregorian_calendar.hpp"
  8. #include "boost/date_time/year_month_day.hpp"
  9. #include "testfrmwk.hpp"
  10. #include <iostream>
  11. int
  12. main()
  13. {
  14. typedef boost::date_time::year_month_day_base<unsigned long,
  15. unsigned short,
  16. unsigned short > simple_ymd_type;
  17. typedef boost::date_time::gregorian_calendar_base<simple_ymd_type, unsigned long>
  18. gregorian_calendar;
  19. // using namespace boost::gregorian;
  20. check("Day of week 2000-09-24 == 0 (Sun)",
  21. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,24))==0);
  22. check("Day of week 2000-09-25 == 1 (Mon)",
  23. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,25))==1);
  24. check("Day of week 2000-09-26 == 2 (Tue)",
  25. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,26))==2);
  26. check("Day of week 2000-09-27 == 3 (Wed)",
  27. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,27))==3);
  28. check("Day of week 2000-09-28 == 4 (Thu)",
  29. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,28))==4);
  30. check("Day of week 2000-09-29 == 5 (Fri)",
  31. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,29))==5);
  32. check("Day of week 2000-09-30 == 6 (Sat)",
  33. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2000,9,30))==6);
  34. //see calendar FAQ 2.2 for reference
  35. check("Day of week 1953-08-02 == 0 (Sun)",
  36. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,2))==0);
  37. check("Day of week 1953-08-03 == 1 (Mon)",
  38. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,3))==1);
  39. check("Day of week 1953-08-04 == 2 (Tue)",
  40. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,4))==2);
  41. check("Day of week 1953-08-05 == 3 (Wed)",
  42. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,5))==3);
  43. check("Day of week 1953-08-06 == 4 (Thu)",
  44. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,6))==4);
  45. check("Day of week 1953-08-07 == 5 (Fri)",
  46. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,7))==5);
  47. check("Day of week 1953-08-08 == 6 (Sat)",
  48. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1953,8,8))==6);
  49. check("Day of week 2001-08-31 == 5 (Fri)",
  50. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2001,8,31))==5);
  51. //Checked against Caledrical Calc M. Edition p 396 and www site
  52. check("Day of week 1400-01-01 == 3 (Wed)",
  53. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1400,1,1))==3);
  54. check("Day of week 1436-02-03 == 3 (Wed)",
  55. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1436,2,3))==3);
  56. check("Day of week 1492-04-9 == 6 (Sat)",
  57. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1492,4,9))==6);
  58. check("Day of week 1560-03-5 == 6 (Sat)",
  59. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1560,3,5))==6);
  60. check("Day of week 1716-07-24 == 5 (Fri)",
  61. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1716,7,24))==5);
  62. check("Day of week 1768-06-19 == 0 (Sun)",
  63. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1768,6,19))==0);
  64. check("Day of week 1839-03-27 == 3 (Wed)",
  65. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1839,3,27))==3);
  66. check("Day of week 1819-08-02 == 1 (Mon)",
  67. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1819,8,2))==1);
  68. check("Day of week 1903-04-19 == 0 (Sun)",
  69. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1903,4,19))==0);
  70. check("Day of week 1929-08-25 == 0 (Sun)",
  71. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(1929,8,25))==0);
  72. check("Day of week 2038-11-10 == 3 (Wed)",
  73. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2038,11,10))==3);
  74. check("Day of week 2094-07-18 == 0 (Sun)",
  75. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(2094,7,18))==0);
  76. //verified against website applet
  77. check("Day of week 3002-07-10 == 6 (Sat)",
  78. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(3002,7,10))==6);
  79. //verified against website applet
  80. check("Day of week 4002-07-10 == 3 (Wed)",
  81. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(4002,7,10))==3);
  82. //verified against website applet
  83. check("Day of week 5002-07-10 == 6 (Sat)",
  84. gregorian_calendar::day_of_week(gregorian_calendar::ymd_type(5002,7,10))==6);
  85. check("1404 is a leap year", gregorian_calendar::is_leap_year(1404));
  86. check("2000 is a leap year", gregorian_calendar::is_leap_year(2000));
  87. check("2004 is a leap year", gregorian_calendar::is_leap_year(2004));
  88. check("2400 is a leap year", gregorian_calendar::is_leap_year(2400));
  89. check("4000 is a leap year", gregorian_calendar::is_leap_year(4000));
  90. check("1400 is NOT a leap year", !gregorian_calendar::is_leap_year(1400));
  91. check("1900 is NOT a leap year", !gregorian_calendar::is_leap_year(1900));
  92. check("2100 is NOT a leap year", !gregorian_calendar::is_leap_year(2100));
  93. check("1999 is NOT a leap year", !gregorian_calendar::is_leap_year(1999));
  94. check("5000 is NOT a leap year", !gregorian_calendar::is_leap_year(5000));
  95. int weeknum1 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2004,10,18));
  96. check("ToWeekNumber 2004-10-18 is week 43", weeknum1 == 43);
  97. int weeknum2 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2002,1,1));
  98. check("ToWeekNumber 2002-1-1 is week 1", weeknum2 == 1);
  99. int weeknum3 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2000,12,31));
  100. check("ToWeekNumber 2000-12-31 is week 52", weeknum3 == 52);
  101. //check for week when week==0.
  102. int weeknum4 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2000,1,1));
  103. check("ToWeekNumber 2000-1-1 is week 52", weeknum4 == 52);
  104. //check for week when week==53 and day==6.
  105. int weeknum5 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1998,12,31));
  106. check("ToWeekNumber 1998-12-31 is week 53", weeknum5 == 53);
  107. //check for week when week==53 day==5 and the year is a leap year.
  108. int weeknum6 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1992,12,31));
  109. check("ToWeekNumber 1992-12-31 is week 53", weeknum6 == 53);
  110. //check for week when week==53 1993-Jan-1
  111. int weeknum7 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,1));
  112. check("ToWeekNumber 1993-1-1 is week 53", weeknum7 == 53);
  113. //check for week when week==53 1993-Jan-2
  114. int weeknum8 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,2));
  115. check("ToWeekNumber 1993-Jan-2 is week 53", weeknum8 == 53);
  116. //check for week when week==53 1993-Jan-3
  117. int weeknum9 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,3));
  118. check("ToWeekNumber 1993-Jan-3 is week 53", weeknum9 == 53);
  119. //check for week when week==1 1993-Jan-4
  120. int weeknum10 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1993,1,4));
  121. check("ToWeekNumber 1993-Jan-4 is week 1", weeknum10 == 1);
  122. //check for week when week=53 and day != 6 and != 5.
  123. int weeknum11 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2001,12,31));
  124. check("ToWeekNumber 2001-12-31 is week 1", weeknum11 == 1);
  125. //test the boundaries of week_number
  126. int weeknum12 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(1400,1,1));
  127. check("ToWeekNumber 1400-1-1 is week 1", weeknum12 == 1);
  128. int weeknum13 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(9999,12,31));
  129. check("ToWeekNumber 9999-12-31 is week 52", weeknum13 == 52);
  130. int weeknum14 = gregorian_calendar::week_number(gregorian_calendar::ymd_type(2003,12,29));
  131. check("ToWeekNumber 2003-12-29 is week 1", weeknum14 == 1);
  132. unsigned long jday1 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,1,1));
  133. unsigned long jday2 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2001,1,1));
  134. // unsigned short year, month, day;
  135. // //2451545 is 2000-1-1
  136. check("ToDayNumber 2000-1-1 is day 2451545", jday1 == 2451545);
  137. check("ToDayNumber 2001-1-1 is day 2451911", jday2 == 2451911);
  138. gregorian_calendar::ymd_type ymd = gregorian_calendar::from_day_number(jday1);
  139. check("from_day_number test 2000-1-1", (ymd.year==2000)&&
  140. (ymd.month==1) &&
  141. (ymd.day==1) );
  142. unsigned long julianday1 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(2000,12,31));
  143. check("ToJulianDayNumber 2000-12-31 is day 2451910", julianday1 == 2451910);
  144. gregorian_calendar::ymd_type ymd1 = gregorian_calendar::from_julian_day_number(julianday1);
  145. std::cout << ymd1.year << "-" << ymd1.month << "-" << ymd1.day << std::endl;
  146. check("from_julian_day_number test 2000-12-31", (ymd1.year==2000) &&
  147. (ymd1.month==12) &&
  148. (ymd1.day==31) );
  149. unsigned long julianday2 = gregorian_calendar::modjulian_day_number(gregorian_calendar::ymd_type(2000,12,31));
  150. std::cout << julianday2 << std::endl;
  151. check("TomodJulianDayNumber 2000-12-31 is day 51909", julianday2 == 51909);
  152. gregorian_calendar::ymd_type ymd2 = gregorian_calendar::from_modjulian_day_number(julianday2);
  153. check("from_modjulian_day_number test 2000-12-31", (ymd2.year==2000) &&
  154. (ymd2.month==12) &&
  155. (ymd2.day==31) );
  156. unsigned long julianday3 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1400,1,1));
  157. check("ToJulianDayNumber 1400-1-1 is day 2232400", julianday3 == 2232400);
  158. gregorian_calendar::ymd_type ymd3 = gregorian_calendar::from_julian_day_number(julianday3);
  159. check("from_julian_day_number test 1400-1-1", (ymd3.year==1400) &&
  160. (ymd3.month==1) &&
  161. (ymd3.day==1) );
  162. long mjd3 = gregorian_calendar::modjulian_day_number(gregorian_calendar::ymd_type(1400,1,1));
  163. std::cout << "mjd3: " << mjd3 << std::endl;
  164. check("mod julian day 1400-1-1 is day -167601", mjd3 == -167601);
  165. gregorian_calendar::ymd_type mjd_ymd3 = gregorian_calendar::from_modjulian_day_number(mjd3);
  166. check("from_julian_day_number test 1400-1-1", (mjd_ymd3.year==1400) &&
  167. (mjd_ymd3.month==1) &&
  168. (mjd_ymd3.day==1) );
  169. unsigned long julianday4 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1900,2,28));
  170. check("ToJulianDayNumber 1900-2-28 is day 2415079", julianday4 == 2415079);
  171. gregorian_calendar::ymd_type ymd4 = gregorian_calendar::from_julian_day_number(julianday4);
  172. check("from_julian_day_number test 1900-2-28", (ymd4.year==1900) &&
  173. (ymd4.month==2) &&
  174. (ymd4.day==28) );
  175. unsigned long julianday5 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1436,2,3));
  176. check("ToJulianDayNumber 1436-2-3 is day 2245581", julianday5 == 2245581);
  177. gregorian_calendar::ymd_type ymd5 = gregorian_calendar::from_julian_day_number(julianday5);
  178. check("from_julian_day_number test 1436-2-3", (ymd5.year==1436) &&
  179. (ymd5.month==2) &&
  180. (ymd5.day==3) );
  181. unsigned long julianday6 = gregorian_calendar::julian_day_number(gregorian_calendar::ymd_type(1996,2,25));
  182. check("ToJulianDayNumber 1996-2-25 is day 2450139", julianday6 == 2450139);
  183. gregorian_calendar::ymd_type ymd6 = gregorian_calendar::from_julian_day_number(julianday6);
  184. check("from_julian_day_number test 1996-2-25", (ymd6.year==1996) &&
  185. (ymd6.month==2) &&
  186. (ymd6.day==25) );
  187. long mjd6 = gregorian_calendar::modjulian_day_number(gregorian_calendar::ymd_type(1996,2,25));
  188. check("ToJulianDayNumber 1996-2-25 is day 50138", mjd6 == 50138);
  189. gregorian_calendar::ymd_type mjd_ymd6 = gregorian_calendar::from_modjulian_day_number(mjd6);
  190. check("from_julian_day_number test 1996-2-25", (mjd_ymd6.year==1996) &&
  191. (mjd_ymd6.month==2) &&
  192. (mjd_ymd6.day==25) );
  193. unsigned long jday3 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(1999,1,1));
  194. check("366 days between 2000-1-1 and 2001-1-1", (jday2-jday1) == 366);
  195. check("731 days between 1999-1-1 and 2001-1-1 ",(jday2-jday3) == 731);
  196. unsigned long jday4 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,2,28));
  197. unsigned long jday5 = gregorian_calendar::day_number(gregorian_calendar::ymd_type(2000,3,1));
  198. check("2 days between 2000-2-28 and 2000-3-1 ",(jday5-jday4) == 2);
  199. check("31 days in month Jan 2000", gregorian_calendar::end_of_month_day(2000,1) == 31);
  200. check("29 days in month Feb 2000", gregorian_calendar::end_of_month_day(2000,2) == 29);
  201. check("28 days in month Feb 1999", gregorian_calendar::end_of_month_day(1999,2) == 28);
  202. check("28 days in month Feb 2001", gregorian_calendar::end_of_month_day(2001,2) == 28);
  203. check("31 days in month Mar 2000", gregorian_calendar::end_of_month_day(2000,3) == 31);
  204. check("30 days in month Apr 2000", gregorian_calendar::end_of_month_day(2000,4) == 30);
  205. check("31 days in month May 2000", gregorian_calendar::end_of_month_day(2000,5) == 31);
  206. check("30 days in month Jun 2000", gregorian_calendar::end_of_month_day(2000,6) == 30);
  207. check("31 days in month Jul 2000", gregorian_calendar::end_of_month_day(2000,7) == 31);
  208. check("31 days in month Aug 2000", gregorian_calendar::end_of_month_day(2000,8) == 31);
  209. check("30 days in month Sep 2000", gregorian_calendar::end_of_month_day(2000,9) == 30);
  210. check("31 days in month Oct 2000", gregorian_calendar::end_of_month_day(2000,10) == 31);
  211. check("30 days in month Nov 2000", gregorian_calendar::end_of_month_day(2000,11) == 30);
  212. check("31 days in month Dec 2000", gregorian_calendar::end_of_month_day(2000,12) == 31);
  213. std::cout << gregorian_calendar::epoch().year << std::endl;
  214. return printTestStats();
  215. }