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