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