]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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("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 |