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
13int
14main()
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

source code of boost/libs/date_time/test/testgregorian_calendar.cpp