PageRenderTime 44ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/boost/libs/date_time/test/gregorian/testdate_iterator.cpp

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