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, Bart Garst
6 */
7
8 #include "boost/date_time/gregorian/gregorian.hpp"
9 #include "../testfrmwk.hpp"
10 #include <iostream>
11
12
test_month_decrement_iterator(const boost::gregorian::date * Answers,int array_len)13 void test_month_decrement_iterator(const boost::gregorian::date *Answers, int array_len){
14 using namespace boost::gregorian;
15 typedef boost::date_time::month_functor<date> mfg;
16
17 boost::date_time::date_itr<mfg, date> ditr(Answers[array_len-1]);
18 int i = array_len-1;
19 std::cout << "month iter decrement test..." << std::endl;
20 try {
21 for (; ditr > Answers[0] - date_duration(1); --ditr) {
22 check("month iterator: " + to_iso_string(*ditr), Answers[i] == *ditr);
23 i--;
24 }
25 check("month iterator iteration count", i == -1);
26 }
27 catch(std::exception& e)
28 {
29 check("month iterator: exception failure", false);
30 std::cout << e.what() << std::endl;
31 }
32 }
33
test_base_iterator(boost::gregorian::date end,boost::gregorian::date_iterator & di,std::string & data)34 void test_base_iterator(boost::gregorian::date end,
35 boost::gregorian::date_iterator& di,
36 std::string& data)
37 {
38 using namespace boost::gregorian;
39 for (; di < end; ++di) {
40 data += to_iso_string(*di) + " ";
41 }
42 }
43
44 int
main()45 main()
46 {
47 using namespace boost::gregorian;
48
49 day_iterator di(date(2002,Jan,1));
50 std::string data;
51 test_base_iterator(date(2002,Jan,3),di,data);
52 month_iterator di2(date(2002,Jan,3));
53 test_base_iterator(date(2002,Mar,1),di2,data);
54 std::string result("20020101 20020102 20020103 20020203 ");
55 check("base iterator", data == result);
56 std::cout << data << std::endl;
57
58
59 typedef boost::date_time::day_functor<date> dfg;
60
61 {
62 const date DayAnswers[] = {date(2000,Jan,20),date(2000,Jan,22),date(2000,Jan,24)};
63 boost::date_time::date_itr<dfg,date> ditr(date(2000,Jan,20),2);
64 int i=0;
65 for (; ditr < date(2000,Jan,25); ++ditr) {
66 //std::cout << *ditr << " ";
67 check("day iterator -- 2 days", DayAnswers[i] == *ditr);
68 i++;
69 }
70 check("day iterator -- 2 days", i == 3); // check the number of iterations
71 // decrement
72 i = 2;
73 --ditr;
74 for (; ditr > date(2000,Jan,19); --ditr) {
75 //std::cout << *ditr << " ";
76 check("day iterator decrement -- 2 days", DayAnswers[i] == *ditr);
77 i--;
78 }
79 check("day iterator decrement -- 2 days", i == -1); // check the number of iterations
80 }
81
82 typedef boost::date_time::week_functor<date> wfg;
83 {
84 const date WeekAnswers[] = {date(2000,Jan,20),date(2000,Jan,27),date(2000,Feb,3)};
85 boost::date_time::date_itr<wfg, date> ditr(date(2000,Jan,20));
86 int i=0;
87 for (; ditr < date(2000,Feb,6); ++ditr) {
88 //std::cout << *ditr << " ";
89 check("week iterator", WeekAnswers[i] == *ditr);
90 i++;
91 }
92 check("week iterator", i == 3);
93 // decrement
94 i=2;
95 --ditr;
96 for (; ditr > date(2000,Jan,19); --ditr) {
97 //std::cout << *ditr << " ";
98 check("week iterator", WeekAnswers[i] == *ditr);
99 i--;
100 }
101 check("week iterator", i == -1);
102 }
103
104 {
105 const date WeekAnswers[] = {date(2000,Jan,20),date(2000,Feb,3)};
106 boost::date_time::date_itr<wfg, date> ditr(date(2000,Jan,20),2);
107 int i=0;
108 for (; ditr < date(2000,Feb,6); ++ditr) {
109 //std::cout << *ditr << " ";
110 check("week iterator", WeekAnswers[i] == *ditr);
111 i++;
112 }
113 check("week iterator", i == 2);
114 // decrement
115 i=1;
116 --ditr;
117 for (; ditr > date(2000,Jan,19); --ditr) {
118 //std::cout << *ditr << " ";
119 check("week iterator", WeekAnswers[i] == *ditr);
120 i--;
121 }
122 check("week iterator", i == -1);
123 }
124
125 {
126 const date WeekAnswers[] = {date(2000,Jan,20),date(2000,Feb,3), date(2000,Feb,17)};
127 boost::date_time::date_itr<wfg, date> ditr(date(2000,Jan,20),2);
128 int i=0;
129 for (; ditr < date(2000,Feb,20); ++ditr) {
130 //std::cout << *ditr << " ";
131 check("week iterator -- 2 weeks", WeekAnswers[i] == *ditr);
132 i++;
133 }
134 check("week iterator -- 2 weeks", i == 3);
135 // decrement
136 i=2;
137 --ditr;
138 for (; ditr > date(2000,Jan,19); --ditr) {
139 //std::cout << *ditr << " ";
140 check("week iterator -- 2 weeks", WeekAnswers[i] == *ditr);
141 i--;
142 }
143 check("week iterator -- 2 weeks", i == -1);
144 }
145
146 typedef boost::date_time::month_functor<date> mfg;
147 {
148 const date MonthAnswers[] = {
149 date(2000,Jan,1),date(2000,Feb,1),date(2000,Mar,1),date(2000,Apr,1),
150 date(2000,May,1),date(2000,Jun,1),date(2000,Jul,1),date(2000,Aug,1),
151 date(2000,Sep,1),date(2000,Oct,1),date(2000,Nov,1),date(2000,Dec,1),
152 date(2001,Jan,1)
153 };
154 test_month_decrement_iterator(MonthAnswers, 13);
155
156 boost::date_time::date_itr<mfg, date> ditr(date(2000,Jan,1));
157 int i = 0;
158 try {
159 for (; ditr < date(2001,Jan,2); ++ditr) {
160 check("month iterator: " + to_iso_string(*ditr), MonthAnswers[i] == *ditr);
161 i++;
162 }
163 check("month iterator iteration count", i == 13);
164 }
165 catch(std::exception& e)
166 {
167 check("month iterator: exception failure", false);
168 std::cout << e.what() << std::endl;
169 }
170 }
171
172 {
173 const date MonthAnswers[] = {
174 date(2000,Jan,31),date(2000,Feb,29),date(2000,Mar,31),date(2000,Apr,30),
175 date(2000,May,31),date(2000,Jun,30),date(2000,Jul,31),date(2000,Aug,31),
176 date(2000,Sep,30),date(2000,Oct,31),date(2000,Nov,30),date(2000,Dec,31),
177 date(2001,Jan,31)
178 };
179 test_month_decrement_iterator(MonthAnswers, 13);
180
181 boost::date_time::date_itr<mfg, date> ditr(date(2000,Jan,31));
182 int i = 0;
183 try {
184 for (; ditr < date(2001,Feb,1); ++ditr) {
185 // std::cout << *ditr << " ";
186 check("last day of month iterator: " + to_iso_string(*ditr),
187 MonthAnswers[i] == *ditr);
188 //check("last day of month iterator", MonthAnswers[i] == *ditr);
189 i++;
190 }
191 check("last day of month iterator", i == 13);
192 }
193 catch(std::exception& e)
194 {
195 check("last day of month iterator: exception failure", false);
196 std::cout << e.what() << std::endl;
197 }
198 }
199
200 {
201 const date MonthAnswers[] = {
202 date(2000,Feb,29),date(2000,Mar,31),date(2000,Apr,30),
203 date(2000,May,31),date(2000,Jun,30),date(2000,Jul,31),date(2000,Aug,31),
204 date(2000,Sep,30),date(2000,Oct,31),date(2000,Nov,30),date(2000,Dec,31),
205 date(2001,Jan,31),date(2001,Feb,28)
206 };
207 test_month_decrement_iterator(MonthAnswers, 13);
208
209 boost::date_time::date_itr<mfg, date> ditr(date(2000,Feb,29));
210 int i = 0;
211 try {
212 for (; ditr < date(2001,Mar,1); ++ditr) {
213 // std::cout << *ditr << " ";
214 check("last day of month iterator2: " + to_iso_string(*ditr),
215 MonthAnswers[i] == *ditr);
216 //check("last day of month iterator", MonthAnswers[i] == *ditr);
217 i++;
218 }
219 check("last day of month iterator2", i == 13);
220 }
221 catch(std::exception& e)
222 {
223 check("last day of month iterator: exception failure", false);
224 std::cout << e.what() << std::endl;
225 }
226 }
227
228 { // running a span of 5 years to verify snap to end doesn't occur at next leap year
229 const date MonthAnswers[] = {
230 date(2000,Feb,28),date(2000,Mar,28),date(2000,Apr,28),date(2000,May,28),
231 date(2000,Jun,28),date(2000,Jul,28),date(2000,Aug,28),date(2000,Sep,28),
232 date(2000,Oct,28),date(2000,Nov,28),date(2000,Dec,28),date(2001,Jan,28),
233 date(2001,Feb,28),date(2001,Mar,28),date(2001,Apr,28),date(2001,May,28),
234 date(2001,Jun,28),date(2001,Jul,28),date(2001,Aug,28),date(2001,Sep,28),
235 date(2001,Oct,28),date(2001,Nov,28),date(2001,Dec,28),date(2002,Jan,28),
236 date(2002,Feb,28),date(2002,Mar,28),date(2002,Apr,28),date(2002,May,28),
237 date(2002,Jun,28),date(2002,Jul,28),date(2002,Aug,28),date(2002,Sep,28),
238 date(2002,Oct,28),date(2002,Nov,28),date(2002,Dec,28),date(2003,Jan,28),
239 date(2003,Feb,28),date(2003,Mar,28),date(2003,Apr,28),date(2003,May,28),
240 date(2003,Jun,28),date(2003,Jul,28),date(2003,Aug,28),date(2003,Sep,28),
241 date(2003,Oct,28),date(2003,Nov,28),date(2003,Dec,28),date(2004,Jan,28),
242 date(2004,Feb,28),date(2004,Mar,28),date(2004,Apr,28),date(2004,May,28),
243 date(2004,Jun,28),date(2004,Jul,28),date(2004,Aug,28),date(2004,Sep,28),
244 date(2004,Oct,28),date(2004,Nov,28),date(2004,Dec,28),date(2005,Jan,28),
245 };
246 test_month_decrement_iterator(MonthAnswers, 60);
247
248 boost::date_time::date_itr<mfg, date> ditr(date(2000,Feb,28));
249 int i = 0;
250 try {
251 for (; ditr < date(2005,Feb,1); ++ditr) {
252 // std::cout << *ditr << " ";
253 check("last day of month iterator3: " + to_iso_string(*ditr),
254 MonthAnswers[i] == *ditr);
255 //check("last day of month iterator", MonthAnswers[i] == *ditr);
256 i++;
257 }
258 check("last day of month iterator3", i == 60);
259 }
260 catch(std::exception& e)
261 {
262 check("last day of month iterator: exception failure", false);
263 std::cout << e.what() << std::endl;
264 }
265 }
266
267 typedef boost::date_time::year_functor<date> yfg;
268 {
269 const date YearAnswers[] = {
270 date(2000,Jan,1),date(2001,Jan,1),date(2002,Jan,1),date(2003,Jan,1),
271 date(2004,Jan,1),date(2005,Jan,1),date(2006,Jan,1),date(2007,Jan,1),
272 date(2008,Jan,1),date(2009,Jan,1),date(2010,Jan,1)
273 };
274
275 boost::date_time::date_itr<yfg, date> d3(date(2000,Jan,1));
276 int i = 0;
277 for (; d3 < date(2010,Jan,2); ++d3) {
278 //std::cout << *d3 << " ";
279 check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
280 i++;
281 }
282 std::cout << "Decrementing...." << std::endl;
283 i = 10;
284 --d3;
285 for (; d3 > date(1999,Dec,31); --d3) {
286 //std::cout << *d3 << " ";
287 check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
288 i--;
289 }
290 }
291 { // WON'T snap top end of month
292 const date YearAnswers[] = {
293 date(2000,Feb,28),date(2001,Feb,28),date(2002,Feb,28),date(2003,Feb,28),
294 date(2004,Feb,28),date(2005,Feb,28),date(2006,Feb,28),date(2007,Feb,28),
295 date(2008,Feb,28),date(2009,Feb,28),date(2010,Feb,28)
296 };
297
298 boost::date_time::date_itr<yfg, date> d3(date(2000,Feb,28));
299 int i = 0;
300 for (; d3 < date(2010,Mar,1); ++d3) {
301 //std::cout << *d3 << " ";
302 check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
303 i++;
304 }
305 std::cout << "Decrementing...." << std::endl;
306 i = 10;
307 --d3;
308 for (; d3 > date(2000,Feb,27); --d3) {
309 //std::cout << *d3 << " ";
310 check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
311 i--;
312 }
313 }
314 {// WILL snap top end of month
315 const date YearAnswers[] = {
316 date(2000,Feb,29),date(2001,Feb,28),date(2002,Feb,28),date(2003,Feb,28),
317 date(2004,Feb,29),date(2005,Feb,28),date(2006,Feb,28),date(2007,Feb,28),
318 date(2008,Feb,29),date(2009,Feb,28),date(2010,Feb,28)
319 };
320
321 boost::date_time::date_itr<yfg, date> d3(date(2000,Feb,29));
322 int i = 0;
323 for (; d3 < date(2010,Mar,1); ++d3) {
324 //std::cout << *d3 << " ";
325 check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
326 i++;
327 }
328 std::cout << "Decrementing...." << std::endl;
329 i = 10;
330 --d3;
331 for (; d3 > date(2000,Feb,27); --d3) {
332 //std::cout << *d3 << " ";
333 check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
334 i--;
335 }
336 }
337
338 {
339 std::cout << "Increment by 2 years...." << std::endl;
340 const date YearAnswers[] = {
341 date(2000,Jan,1),date(2002,Jan,1),
342 date(2004,Jan,1),date(2006,Jan,1),
343 date(2008,Jan,1),date(2010,Jan,1)
344 };
345
346 boost::date_time::date_itr<yfg, date> d3(date(2000,Jan,1),2);
347 int i = 0;
348 for (; d3 < date(2010,Jan,2); ++d3) {
349 //std::cout << *d3 << " ";
350 check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
351 i++;
352 }
353 // decrement
354 std::cout << "Decrementing...." << std::endl;
355 i = 5;
356 --d3;
357 for (; d3 > date(1999,Dec,31); --d3) {
358 //std::cout << *d3 << " ";
359 check("year iterator: " + to_iso_string(*d3), YearAnswers[i] == *d3);
360 i--;
361 }
362 }
363
364
365 return printTestStats();
366 }
367
368