• 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, 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