1 /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 
3 /*
4  Copyright (C) 2003, 2004, 2008 StatPro Italia srl
5  Copyright (C) 2005 Ferdinando Ametrano
6  Copyright (C) 2006 Piter Dias
7  Copyright (C) 2008 Charles Chongseok Hyun
8  Copyright (C) 2015 Dmitri Nesteruk
9  Copyright (C) 2020 Piotr Siejda
10  Copyright (C) 2020 Leonardo Arcari
11  Copyright (C) 2020 Kline s.r.l.
12 
13  This file is part of QuantLib, a free-software/open-source library
14  for financial quantitative analysts and developers - http://quantlib.org/
15 
16  QuantLib is free software: you can redistribute it and/or modify it
17  under the terms of the QuantLib license.  You should have received a
18  copy of the license along with this program; if not, please email
19  <quantlib-dev@lists.sf.net>. The license is also available online at
20  <http://quantlib.org/license.shtml>.
21 
22  This program is distributed in the hope that it will be useful, but WITHOUT
23  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
24  FOR A PARTICULAR PURPOSE.  See the license for more details.
25 */
26 
27 #include "calendars.hpp"
28 #include "utilities.hpp"
29 #include <ql/errors.hpp>
30 #include <ql/time/calendar.hpp>
31 #include <ql/time/calendars/bespokecalendar.hpp>
32 #include <ql/time/calendars/brazil.hpp>
33 #include <ql/time/calendars/china.hpp>
34 #include <ql/time/calendars/germany.hpp>
35 #include <ql/time/calendars/italy.hpp>
36 #include <ql/time/calendars/japan.hpp>
37 #include <ql/time/calendars/jointcalendar.hpp>
38 #include <ql/time/calendars/russia.hpp>
39 #include <ql/time/calendars/southkorea.hpp>
40 #include <ql/time/calendars/target.hpp>
41 #include <ql/time/calendars/unitedkingdom.hpp>
42 #include <ql/time/calendars/unitedstates.hpp>
43 #include <fstream>
44 
45 using namespace QuantLib;
46 using namespace boost::unit_test_framework;
47 
testModifiedCalendars()48 void CalendarTest::testModifiedCalendars() {
49 
50     BOOST_TEST_MESSAGE("Testing calendar modification...");
51 
52     Calendar c1 = TARGET();
53     Calendar c2 = UnitedStates(UnitedStates::NYSE);
54     Date d1(1, May, 2004);    // holiday for both calendars
55     Date d2(26, April, 2004); // business day
56 
57     QL_REQUIRE(c1.isHoliday(d1), "wrong assumption---correct the test");
58     QL_REQUIRE(c1.isBusinessDay(d2), "wrong assumption---correct the test");
59 
60     QL_REQUIRE(c2.isHoliday(d1), "wrong assumption---correct the test");
61     QL_REQUIRE(c2.isBusinessDay(d2), "wrong assumption---correct the test");
62 
63     // modify the TARGET calendar
64     c1.removeHoliday(d1);
65     c1.addHoliday(d2);
66 
67     // test
68     std::set<Date> addedHolidays(c1.addedHolidays());
69     std::set<Date> removedHolidays(c1.removedHolidays());
70 
71     QL_REQUIRE(addedHolidays.find(d1) == addedHolidays.end(),
72                "did not expect to find date in addedHolidays");
73     QL_REQUIRE(addedHolidays.find(d2) != addedHolidays.end(),
74                "expected to find date in addedHolidays");
75     QL_REQUIRE(removedHolidays.find(d1) != removedHolidays.end(),
76                "expected to find date in removedHolidays");
77     QL_REQUIRE(removedHolidays.find(d2) == removedHolidays.end(),
78                "did not expect to find date in removedHolidays");
79 
80     if (c1.isHoliday(d1))
81         BOOST_FAIL(d1 << " still a holiday for original TARGET instance");
82     if (c1.isBusinessDay(d2))
83         BOOST_FAIL(d2 << " still a business day for original TARGET instance");
84 
85     // any instance of TARGET should be modified...
86     Calendar c3 = TARGET();
87     if (c3.isHoliday(d1))
88         BOOST_FAIL(d1 << " still a holiday for generic TARGET instance");
89     if (c3.isBusinessDay(d2))
90         BOOST_FAIL(d2 << " still a business day for generic TARGET instance");
91 
92     // ...but not other calendars
93     if (c2.isBusinessDay(d1))
94         BOOST_FAIL(d1 << " business day for New York");
95     if (c2.isHoliday(d2))
96         BOOST_FAIL(d2 << " holiday for New York");
97 
98     // restore original holiday set---test the other way around
99     c3.addHoliday(d1);
100     c3.removeHoliday(d2);
101 
102     if (c1.isBusinessDay(d1))
103         BOOST_FAIL(d1 << " still a business day");
104     if (c1.isHoliday(d2))
105         BOOST_FAIL(d2 << " still a holiday");
106 }
107 
108 
testJointCalendars()109 void CalendarTest::testJointCalendars() {
110 
111     BOOST_TEST_MESSAGE("Testing joint calendars...");
112 
113     Calendar c1 = TARGET(), c2 = UnitedKingdom(), c3 = UnitedStates(UnitedStates::NYSE),
114              c4 = Japan(), c5 = Germany();
115 
116     std::vector<Calendar> calendar_vect;
117     calendar_vect.reserve(5);
118     calendar_vect.push_back(c1);
119     calendar_vect.push_back(c2);
120     calendar_vect.push_back(c3);
121     calendar_vect.push_back(c4);
122     calendar_vect.push_back(c5);
123 
124     Calendar c12h = JointCalendar(c1, c2, JoinHolidays),
125              c12b = JointCalendar(c1, c2, JoinBusinessDays),
126              c123h = JointCalendar(c1, c2, c3, JoinHolidays),
127              c123b = JointCalendar(c1, c2, c3, JoinBusinessDays),
128              c1234h = JointCalendar(c1, c2, c3, c4, JoinHolidays),
129              c1234b = JointCalendar(c1, c2, c3, c4, JoinBusinessDays),
130              cvh = JointCalendar(calendar_vect, JoinHolidays);
131 
132     // test one year, starting today
133     Date firstDate = Date::todaysDate(), endDate = firstDate + 1 * Years;
134 
135     for (Date d = firstDate; d < endDate; d++) {
136 
137         bool b1 = c1.isBusinessDay(d), b2 = c2.isBusinessDay(d), b3 = c3.isBusinessDay(d),
138              b4 = c4.isBusinessDay(d), b5 = c5.isBusinessDay(d);
139 
140         if ((b1 && b2) != c12h.isBusinessDay(d))
141             BOOST_FAIL("At date " << d << ":\n"
142                                   << "    inconsistency between joint calendar " << c12h.name()
143                                   << " (joining holidays)\n"
144                                   << "    and its components");
145 
146         if ((b1 || b2) != c12b.isBusinessDay(d))
147             BOOST_FAIL("At date " << d << ":\n"
148                                   << "    inconsistency between joint calendar " << c12b.name()
149                                   << " (joining business days)\n"
150                                   << "    and its components");
151 
152         if ((b1 && b2 && b3) != c123h.isBusinessDay(d))
153             BOOST_FAIL("At date " << d << ":\n"
154                                   << "    inconsistency between joint calendar " << c123h.name()
155                                   << " (joining holidays)\n"
156                                   << "    and its components");
157 
158         if ((b1 || b2 || b3) != c123b.isBusinessDay(d))
159             BOOST_FAIL("At date " << d << ":\n"
160                                   << "    inconsistency between joint calendar " << c123b.name()
161                                   << " (joining business days)\n"
162                                   << "    and its components");
163 
164         if ((b1 && b2 && b3 && b4) != c1234h.isBusinessDay(d))
165             BOOST_FAIL("At date " << d << ":\n"
166                                   << "    inconsistency between joint calendar " << c1234h.name()
167                                   << " (joining holidays)\n"
168                                   << "    and its components");
169 
170         if ((b1 || b2 || b3 || b4) != c1234b.isBusinessDay(d))
171             BOOST_FAIL("At date " << d << ":\n"
172                                   << "    inconsistency between joint calendar " << c1234b.name()
173                                   << " (joining business days)\n"
174                                   << "    and its components");
175 
176         if ((b1 && b2 && b3 && b4 && b5) != cvh.isBusinessDay(d))
177             BOOST_FAIL("At date " << d << ":\n"
178                                   << "    inconsistency between joint calendar " << cvh.name()
179                                   << " (joining holidays)\n"
180                                   << "    and its components");
181     }
182 }
183 
testUSSettlement()184 void CalendarTest::testUSSettlement() {
185     BOOST_TEST_MESSAGE("Testing US settlement holiday list...");
186 
187     std::vector<Date> expectedHol;
188     expectedHol.push_back(Date(1, January, 2004));
189     expectedHol.push_back(Date(19, January, 2004));
190     expectedHol.push_back(Date(16, February, 2004));
191     expectedHol.push_back(Date(31, May, 2004));
192     expectedHol.push_back(Date(5, July, 2004));
193     expectedHol.push_back(Date(6, September, 2004));
194     expectedHol.push_back(Date(11, October, 2004));
195     expectedHol.push_back(Date(11, November, 2004));
196     expectedHol.push_back(Date(25, November, 2004));
197     expectedHol.push_back(Date(24, December, 2004));
198 
199     expectedHol.push_back(Date(31, December, 2004));
200     expectedHol.push_back(Date(17, January, 2005));
201     expectedHol.push_back(Date(21, February, 2005));
202     expectedHol.push_back(Date(30, May, 2005));
203     expectedHol.push_back(Date(4, July, 2005));
204     expectedHol.push_back(Date(5, September, 2005));
205     expectedHol.push_back(Date(10, October, 2005));
206     expectedHol.push_back(Date(11, November, 2005));
207     expectedHol.push_back(Date(24, November, 2005));
208     expectedHol.push_back(Date(26, December, 2005));
209 
210     Calendar c = UnitedStates(UnitedStates::Settlement);
211     std::vector<Date> hol = c.holidayList(Date(1, January, 2004), Date(31, December, 2005));
212     if (hol.size() != expectedHol.size())
213         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
214                                  << hol.size() << " calculated holidays");
215     for (Size i = 0; i < hol.size(); i++) {
216         if (hol[i] != expectedHol[i])
217             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
218                                                << hol[i]);
219     }
220 
221     // before Uniform Monday Holiday Act
222     expectedHol = std::vector<Date>();
223     expectedHol.push_back(Date(2, January, 1961));
224     expectedHol.push_back(Date(22, February, 1961));
225     expectedHol.push_back(Date(30, May, 1961));
226     expectedHol.push_back(Date(4, July, 1961));
227     expectedHol.push_back(Date(4, September, 1961));
228     expectedHol.push_back(Date(10, November, 1961));
229     expectedHol.push_back(Date(23, November, 1961));
230     expectedHol.push_back(Date(25, December, 1961));
231 
232     hol = c.holidayList(Date(1, January, 1961), Date(31, December, 1961));
233     if (hol.size() != expectedHol.size())
234         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
235                                  << hol.size() << " calculated holidays");
236     for (Size i = 0; i < hol.size(); i++) {
237         if (hol[i] != expectedHol[i])
238             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
239                                                << hol[i]);
240     }
241 }
242 
testUSGovernmentBondMarket()243 void CalendarTest::testUSGovernmentBondMarket() {
244     BOOST_TEST_MESSAGE("Testing US government bond market holiday list...");
245 
246     std::vector<Date> expectedHol;
247     expectedHol.push_back(Date(1, January, 2004));
248     expectedHol.push_back(Date(19, January, 2004));
249     expectedHol.push_back(Date(16, February, 2004));
250     expectedHol.push_back(Date(9, April, 2004));
251     expectedHol.push_back(Date(31, May, 2004));
252     expectedHol.push_back(Date(11, June, 2004)); // Reagan's funeral
253     expectedHol.push_back(Date(5, July, 2004));
254     expectedHol.push_back(Date(6, September, 2004));
255     expectedHol.push_back(Date(11, October, 2004));
256     expectedHol.push_back(Date(11, November, 2004));
257     expectedHol.push_back(Date(25, November, 2004));
258     expectedHol.push_back(Date(24, December, 2004));
259 
260     Calendar c = UnitedStates(UnitedStates::GovernmentBond);
261     std::vector<Date> hol = c.holidayList(Date(1, January, 2004), Date(31, December, 2004));
262 
263     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
264         if (hol[i] != expectedHol[i])
265             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
266                                                << hol[i]);
267     }
268     if (hol.size() != expectedHol.size())
269         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
270                                  << hol.size() << " calculated holidays");
271 }
272 
testUSNewYorkStockExchange()273 void CalendarTest::testUSNewYorkStockExchange() {
274     BOOST_TEST_MESSAGE("Testing New York Stock Exchange holiday list...");
275 
276     std::vector<Date> expectedHol;
277     expectedHol.push_back(Date(1, January, 2004));
278     expectedHol.push_back(Date(19, January, 2004));
279     expectedHol.push_back(Date(16, February, 2004));
280     expectedHol.push_back(Date(9, April, 2004));
281     expectedHol.push_back(Date(31, May, 2004));
282     expectedHol.push_back(Date(11, June, 2004));
283     expectedHol.push_back(Date(5, July, 2004));
284     expectedHol.push_back(Date(6, September, 2004));
285     expectedHol.push_back(Date(25, November, 2004));
286     expectedHol.push_back(Date(24, December, 2004));
287 
288     expectedHol.push_back(Date(17, January, 2005));
289     expectedHol.push_back(Date(21, February, 2005));
290     expectedHol.push_back(Date(25, March, 2005));
291     expectedHol.push_back(Date(30, May, 2005));
292     expectedHol.push_back(Date(4, July, 2005));
293     expectedHol.push_back(Date(5, September, 2005));
294     expectedHol.push_back(Date(24, November, 2005));
295     expectedHol.push_back(Date(26, December, 2005));
296 
297     expectedHol.push_back(Date(2, January, 2006));
298     expectedHol.push_back(Date(16, January, 2006));
299     expectedHol.push_back(Date(20, February, 2006));
300     expectedHol.push_back(Date(14, April, 2006));
301     expectedHol.push_back(Date(29, May, 2006));
302     expectedHol.push_back(Date(4, July, 2006));
303     expectedHol.push_back(Date(4, September, 2006));
304     expectedHol.push_back(Date(23, November, 2006));
305     expectedHol.push_back(Date(25, December, 2006));
306 
307     Calendar c = UnitedStates(UnitedStates::NYSE);
308     std::vector<Date> hol = c.holidayList(Date(1, January, 2004), Date(31, December, 2006));
309 
310     Size i;
311     for (i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
312         if (hol[i] != expectedHol[i])
313             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
314                                                << hol[i]);
315     }
316     if (hol.size() != expectedHol.size())
317         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
318                                  << hol.size() << " calculated holidays");
319 
320     std::vector<Date> histClose;
321     histClose.push_back(Date(30, October, 2012));   // Hurricane Sandy
322     histClose.push_back(Date(29, October, 2012));   // Hurricane Sandy
323     histClose.push_back(Date(11, June, 2004));      // Reagan's funeral
324     histClose.push_back(Date(14, September, 2001)); // September 11, 2001
325     histClose.push_back(Date(13, September, 2001)); // September 11, 2001
326     histClose.push_back(Date(12, September, 2001)); // September 11, 2001
327     histClose.push_back(Date(11, September, 2001)); // September 11, 2001
328     histClose.push_back(Date(27, April, 1994));     // Nixon's funeral.
329     histClose.push_back(Date(27, September, 1985)); // Hurricane Gloria
330     histClose.push_back(Date(14, July, 1977));      // 1977 Blackout
331     histClose.push_back(Date(25, January, 1973));   // Johnson's funeral.
332     histClose.push_back(Date(28, December, 1972));  // Truman's funeral
333     histClose.push_back(Date(21, July, 1969));      // Lunar exploration nat. day
334     histClose.push_back(Date(31, March, 1969));     // Eisenhower's funeral
335     histClose.push_back(Date(10, February, 1969));  // heavy snow
336     histClose.push_back(Date(5, July, 1968));       // Day after Independence Day
337     histClose.push_back(Date(9, April, 1968));      // Mourning for MLK
338     histClose.push_back(Date(24, December, 1965));  // Christmas Eve
339     histClose.push_back(Date(25, November, 1963));  // Kennedy's funeral
340     histClose.push_back(Date(29, May, 1961));       // Day before Decoration Day
341     histClose.push_back(Date(26, December, 1958));  // Day after Christmas
342     histClose.push_back(Date(24, December, 1956));  // Christmas Eve
343     histClose.push_back(Date(24, December, 1954));  // Christmas Eve
344     // June 12-Dec. 31, 1968
345     // Four day week (closed on Wednesdays) - Paperwork Crisis
346     histClose.push_back(Date(12, Jun, 1968));
347     histClose.push_back(Date(19, Jun, 1968));
348     histClose.push_back(Date(26, Jun, 1968));
349     histClose.push_back(Date(3, Jul, 1968));
350     histClose.push_back(Date(10, Jul, 1968));
351     histClose.push_back(Date(17, Jul, 1968));
352     histClose.push_back(Date(20, Nov, 1968));
353     histClose.push_back(Date(27, Nov, 1968));
354     histClose.push_back(Date(4, Dec, 1968));
355     histClose.push_back(Date(11, Dec, 1968));
356     histClose.push_back(Date(18, Dec, 1968));
357     // Presidential election days
358     histClose.push_back(Date(4, Nov, 1980));
359     histClose.push_back(Date(2, Nov, 1976));
360     histClose.push_back(Date(7, Nov, 1972));
361     histClose.push_back(Date(5, Nov, 1968));
362     histClose.push_back(Date(3, Nov, 1964));
363     for (i = 0; i < histClose.size(); i++) {
364         if (!c.isHoliday(histClose[i]))
365             BOOST_FAIL(histClose[i] << " should be holiday (historical close)");
366     }
367 }
368 
testTARGET()369 void CalendarTest::testTARGET() {
370     BOOST_TEST_MESSAGE("Testing TARGET holiday list...");
371 
372     std::vector<Date> expectedHol;
373     expectedHol.push_back(Date(1, January, 1999));
374     expectedHol.push_back(Date(31, December, 1999));
375 
376     expectedHol.push_back(Date(21, April, 2000));
377     expectedHol.push_back(Date(24, April, 2000));
378     expectedHol.push_back(Date(1, May, 2000));
379     expectedHol.push_back(Date(25, December, 2000));
380     expectedHol.push_back(Date(26, December, 2000));
381 
382     expectedHol.push_back(Date(1, January, 2001));
383     expectedHol.push_back(Date(13, April, 2001));
384     expectedHol.push_back(Date(16, April, 2001));
385     expectedHol.push_back(Date(1, May, 2001));
386     expectedHol.push_back(Date(25, December, 2001));
387     expectedHol.push_back(Date(26, December, 2001));
388     expectedHol.push_back(Date(31, December, 2001));
389 
390     expectedHol.push_back(Date(1, January, 2002));
391     expectedHol.push_back(Date(29, March, 2002));
392     expectedHol.push_back(Date(1, April, 2002));
393     expectedHol.push_back(Date(1, May, 2002));
394     expectedHol.push_back(Date(25, December, 2002));
395     expectedHol.push_back(Date(26, December, 2002));
396 
397     expectedHol.push_back(Date(1, January, 2003));
398     expectedHol.push_back(Date(18, April, 2003));
399     expectedHol.push_back(Date(21, April, 2003));
400     expectedHol.push_back(Date(1, May, 2003));
401     expectedHol.push_back(Date(25, December, 2003));
402     expectedHol.push_back(Date(26, December, 2003));
403 
404     expectedHol.push_back(Date(1, January, 2004));
405     expectedHol.push_back(Date(9, April, 2004));
406     expectedHol.push_back(Date(12, April, 2004));
407 
408     expectedHol.push_back(Date(25, March, 2005));
409     expectedHol.push_back(Date(28, March, 2005));
410     expectedHol.push_back(Date(26, December, 2005));
411 
412     expectedHol.push_back(Date(14, April, 2006));
413     expectedHol.push_back(Date(17, April, 2006));
414     expectedHol.push_back(Date(1, May, 2006));
415     expectedHol.push_back(Date(25, December, 2006));
416     expectedHol.push_back(Date(26, December, 2006));
417 
418     Calendar c = TARGET();
419     std::vector<Date> hol = c.holidayList(Date(1, January, 1999), Date(31, December, 2006));
420 
421     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
422         if (hol[i] != expectedHol[i])
423             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
424                                                << hol[i]);
425     }
426     if (hol.size() != expectedHol.size())
427         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
428                                  << hol.size() << " calculated holidays");
429 }
430 
testGermanyFrankfurt()431 void CalendarTest::testGermanyFrankfurt() {
432     BOOST_TEST_MESSAGE("Testing Frankfurt Stock Exchange holiday list...");
433 
434     std::vector<Date> expectedHol;
435 
436     expectedHol.push_back(Date(1, January, 2003));
437     expectedHol.push_back(Date(18, April, 2003));
438     expectedHol.push_back(Date(21, April, 2003));
439     expectedHol.push_back(Date(1, May, 2003));
440     expectedHol.push_back(Date(24, December, 2003));
441     expectedHol.push_back(Date(25, December, 2003));
442     expectedHol.push_back(Date(26, December, 2003));
443 
444     expectedHol.push_back(Date(1, January, 2004));
445     expectedHol.push_back(Date(9, April, 2004));
446     expectedHol.push_back(Date(12, April, 2004));
447     expectedHol.push_back(Date(24, December, 2004));
448 
449     Calendar c = Germany(Germany::FrankfurtStockExchange);
450     std::vector<Date> hol = c.holidayList(Date(1, January, 2003), Date(31, December, 2004));
451     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
452         if (hol[i] != expectedHol[i])
453             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
454                                                << hol[i]);
455     }
456     if (hol.size() != expectedHol.size())
457         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
458                                  << hol.size() << " calculated holidays");
459 }
460 
testGermanyEurex()461 void CalendarTest::testGermanyEurex() {
462     BOOST_TEST_MESSAGE("Testing Eurex holiday list...");
463 
464     std::vector<Date> expectedHol;
465 
466     expectedHol.push_back(Date(1, January, 2003));
467     expectedHol.push_back(Date(18, April, 2003));
468     expectedHol.push_back(Date(21, April, 2003));
469     expectedHol.push_back(Date(1, May, 2003));
470     expectedHol.push_back(Date(24, December, 2003));
471     expectedHol.push_back(Date(25, December, 2003));
472     expectedHol.push_back(Date(26, December, 2003));
473     expectedHol.push_back(Date(31, December,2003));
474 
475     expectedHol.push_back(Date(1, January, 2004));
476     expectedHol.push_back(Date(9, April, 2004));
477     expectedHol.push_back(Date(12, April, 2004));
478     expectedHol.push_back(Date(24, December, 2004));
479     expectedHol.push_back(Date(31,December,2004));
480 
481     Calendar c = Germany(Germany::Eurex);
482     std::vector<Date> hol = c.holidayList(Date(1, January, 2003), Date(31, December, 2004));
483     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
484         if (hol[i] != expectedHol[i])
485             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
486                                                << hol[i]);
487     }
488     if (hol.size() != expectedHol.size())
489         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
490                                  << hol.size() << " calculated holidays");
491 }
492 
testGermanyXetra()493 void CalendarTest::testGermanyXetra() {
494     BOOST_TEST_MESSAGE("Testing Xetra holiday list...");
495 
496     std::vector<Date> expectedHol;
497 
498     expectedHol.push_back(Date(1, January, 2003));
499     expectedHol.push_back(Date(18, April, 2003));
500     expectedHol.push_back(Date(21, April, 2003));
501     expectedHol.push_back(Date(1, May, 2003));
502     expectedHol.push_back(Date(24, December, 2003));
503     expectedHol.push_back(Date(25, December, 2003));
504     expectedHol.push_back(Date(26, December, 2003));
505 
506     expectedHol.push_back(Date(1, January, 2004));
507     expectedHol.push_back(Date(9, April, 2004));
508     expectedHol.push_back(Date(12, April, 2004));
509     expectedHol.push_back(Date(24, December, 2004));
510 
511     Calendar c = Germany(Germany::Xetra);
512     std::vector<Date> hol = c.holidayList(Date(1, January, 2003), Date(31, December, 2004));
513     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
514         if (hol[i] != expectedHol[i])
515             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
516                                                << hol[i]);
517     }
518     if (hol.size() != expectedHol.size())
519         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
520                                  << hol.size() << " calculated holidays");
521 }
522 
testUKSettlement()523 void CalendarTest::testUKSettlement() {
524     BOOST_TEST_MESSAGE("Testing UK settlement holiday list...");
525 
526     std::vector<Date> expectedHol;
527 
528     expectedHol.push_back(Date(1, January, 2004));
529     expectedHol.push_back(Date(9, April, 2004));
530     expectedHol.push_back(Date(12, April, 2004));
531     expectedHol.push_back(Date(3, May, 2004));
532     expectedHol.push_back(Date(31, May, 2004));
533     expectedHol.push_back(Date(30, August, 2004));
534     expectedHol.push_back(Date(27, December, 2004));
535     expectedHol.push_back(Date(28, December, 2004));
536 
537     expectedHol.push_back(Date(3, January, 2005));
538     expectedHol.push_back(Date(25, March, 2005));
539     expectedHol.push_back(Date(28, March, 2005));
540     expectedHol.push_back(Date(2, May, 2005));
541     expectedHol.push_back(Date(30, May, 2005));
542     expectedHol.push_back(Date(29, August, 2005));
543     expectedHol.push_back(Date(26, December, 2005));
544     expectedHol.push_back(Date(27, December, 2005));
545 
546     expectedHol.push_back(Date(2, January, 2006));
547     expectedHol.push_back(Date(14, April, 2006));
548     expectedHol.push_back(Date(17, April, 2006));
549     expectedHol.push_back(Date(1, May, 2006));
550     expectedHol.push_back(Date(29, May, 2006));
551     expectedHol.push_back(Date(28, August, 2006));
552     expectedHol.push_back(Date(25, December, 2006));
553     expectedHol.push_back(Date(26, December, 2006));
554 
555     expectedHol.push_back(Date(1, January, 2007));
556     expectedHol.push_back(Date(6, April, 2007));
557     expectedHol.push_back(Date(9, April, 2007));
558     expectedHol.push_back(Date(7, May, 2007));
559     expectedHol.push_back(Date(28, May, 2007));
560     expectedHol.push_back(Date(27, August, 2007));
561     expectedHol.push_back(Date(25, December, 2007));
562     expectedHol.push_back(Date(26, December, 2007));
563 
564     Calendar c = UnitedKingdom(UnitedKingdom::Settlement);
565     std::vector<Date> hol = c.holidayList(Date(1, January, 2004), Date(31, December, 2007));
566     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
567         if (hol[i] != expectedHol[i])
568             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
569                                                << hol[i]);
570     }
571     if (hol.size() != expectedHol.size())
572         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
573                                  << hol.size() << " calculated holidays");
574 }
575 
testUKExchange()576 void CalendarTest::testUKExchange() {
577     BOOST_TEST_MESSAGE("Testing London Stock Exchange holiday list...");
578 
579     std::vector<Date> expectedHol;
580 
581     expectedHol.push_back(Date(1, January, 2004));
582     expectedHol.push_back(Date(9, April, 2004));
583     expectedHol.push_back(Date(12, April, 2004));
584     expectedHol.push_back(Date(3, May, 2004));
585     expectedHol.push_back(Date(31, May, 2004));
586     expectedHol.push_back(Date(30, August, 2004));
587     expectedHol.push_back(Date(27, December, 2004));
588     expectedHol.push_back(Date(28, December, 2004));
589 
590     expectedHol.push_back(Date(3, January, 2005));
591     expectedHol.push_back(Date(25, March, 2005));
592     expectedHol.push_back(Date(28, March, 2005));
593     expectedHol.push_back(Date(2, May, 2005));
594     expectedHol.push_back(Date(30, May, 2005));
595     expectedHol.push_back(Date(29, August, 2005));
596     expectedHol.push_back(Date(26, December, 2005));
597     expectedHol.push_back(Date(27, December, 2005));
598 
599     expectedHol.push_back(Date(2, January, 2006));
600     expectedHol.push_back(Date(14, April, 2006));
601     expectedHol.push_back(Date(17, April, 2006));
602     expectedHol.push_back(Date(1, May, 2006));
603     expectedHol.push_back(Date(29, May, 2006));
604     expectedHol.push_back(Date(28, August, 2006));
605     expectedHol.push_back(Date(25, December, 2006));
606     expectedHol.push_back(Date(26, December, 2006));
607 
608     expectedHol.push_back(Date(1, January, 2007));
609     expectedHol.push_back(Date(6, April, 2007));
610     expectedHol.push_back(Date(9, April, 2007));
611     expectedHol.push_back(Date(7, May, 2007));
612     expectedHol.push_back(Date(28, May, 2007));
613     expectedHol.push_back(Date(27, August, 2007));
614     expectedHol.push_back(Date(25, December, 2007));
615     expectedHol.push_back(Date(26, December, 2007));
616 
617     Calendar c = UnitedKingdom(UnitedKingdom::Exchange);
618     std::vector<Date> hol = c.holidayList(Date(1, January, 2004), Date(31, December, 2007));
619     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
620         if (hol[i] != expectedHol[i])
621             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
622                                                << hol[i]);
623     }
624     if (hol.size() != expectedHol.size())
625         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
626                                  << hol.size() << " calculated holidays");
627 }
628 
testUKMetals()629 void CalendarTest::testUKMetals() {
630     BOOST_TEST_MESSAGE("Testing London Metals Exchange holiday list...");
631 
632     std::vector<Date> expectedHol;
633 
634     expectedHol.push_back(Date(1, January, 2004));
635     expectedHol.push_back(Date(9, April, 2004));
636     expectedHol.push_back(Date(12, April, 2004));
637     expectedHol.push_back(Date(3, May, 2004));
638     expectedHol.push_back(Date(31, May, 2004));
639     expectedHol.push_back(Date(30, August, 2004));
640     expectedHol.push_back(Date(27, December, 2004));
641     expectedHol.push_back(Date(28, December, 2004));
642 
643     expectedHol.push_back(Date(3, January, 2005));
644     expectedHol.push_back(Date(25, March, 2005));
645     expectedHol.push_back(Date(28, March, 2005));
646     expectedHol.push_back(Date(2, May, 2005));
647     expectedHol.push_back(Date(30, May, 2005));
648     expectedHol.push_back(Date(29, August, 2005));
649     expectedHol.push_back(Date(26, December, 2005));
650     expectedHol.push_back(Date(27, December, 2005));
651 
652     expectedHol.push_back(Date(2, January, 2006));
653     expectedHol.push_back(Date(14, April, 2006));
654     expectedHol.push_back(Date(17, April, 2006));
655     expectedHol.push_back(Date(1, May, 2006));
656     expectedHol.push_back(Date(29, May, 2006));
657     expectedHol.push_back(Date(28, August, 2006));
658     expectedHol.push_back(Date(25, December, 2006));
659     expectedHol.push_back(Date(26, December, 2006));
660 
661     expectedHol.push_back(Date(1, January, 2007));
662     expectedHol.push_back(Date(6, April, 2007));
663     expectedHol.push_back(Date(9, April, 2007));
664     expectedHol.push_back(Date(7, May, 2007));
665     expectedHol.push_back(Date(28, May, 2007));
666     expectedHol.push_back(Date(27, August, 2007));
667     expectedHol.push_back(Date(25, December, 2007));
668     expectedHol.push_back(Date(26, December, 2007));
669 
670     Calendar c = UnitedKingdom(UnitedKingdom::Metals);
671     std::vector<Date> hol = c.holidayList(Date(1, January, 2004), Date(31, December, 2007));
672     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
673         if (hol[i] != expectedHol[i])
674             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
675                                                << hol[i]);
676     }
677     if (hol.size() != expectedHol.size())
678         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
679                                  << hol.size() << " calculated holidays");
680 }
681 
testItalyExchange()682 void CalendarTest::testItalyExchange() {
683     BOOST_TEST_MESSAGE("Testing Milan Stock Exchange holiday list...");
684 
685     std::vector<Date> expectedHol;
686 
687     expectedHol.push_back(Date(1, January, 2002));
688     expectedHol.push_back(Date(29, March, 2002));
689     expectedHol.push_back(Date(1, April, 2002));
690     expectedHol.push_back(Date(1, May, 2002));
691     expectedHol.push_back(Date(15, August, 2002));
692     expectedHol.push_back(Date(24, December, 2002));
693     expectedHol.push_back(Date(25, December, 2002));
694     expectedHol.push_back(Date(26, December, 2002));
695     expectedHol.push_back(Date(31, December, 2002));
696 
697     expectedHol.push_back(Date(1, January, 2003));
698     expectedHol.push_back(Date(18, April, 2003));
699     expectedHol.push_back(Date(21, April, 2003));
700     expectedHol.push_back(Date(1, May, 2003));
701     expectedHol.push_back(Date(15, August, 2003));
702     expectedHol.push_back(Date(24, December, 2003));
703     expectedHol.push_back(Date(25, December, 2003));
704     expectedHol.push_back(Date(26, December, 2003));
705     expectedHol.push_back(Date(31, December, 2003));
706 
707     expectedHol.push_back(Date(1, January, 2004));
708     expectedHol.push_back(Date(9, April, 2004));
709     expectedHol.push_back(Date(12, April, 2004));
710     expectedHol.push_back(Date(24, December, 2004));
711     expectedHol.push_back(Date(31, December, 2004));
712 
713     Calendar c = Italy(Italy::Exchange);
714     std::vector<Date> hol = c.holidayList(Date(1, January, 2002), Date(31, December, 2004));
715     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
716         if (hol[i] != expectedHol[i])
717             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
718                                                << hol[i]);
719     }
720     if (hol.size() != expectedHol.size())
721         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
722                                  << hol.size() << " calculated holidays");
723 }
724 
testRussia()725 void CalendarTest::testRussia() {
726     BOOST_TEST_MESSAGE("Testing Russia holiday list...");
727 
728     std::vector<Date> expectedHol;
729 
730     // exhaustive holiday list for the year 2012
731     expectedHol.push_back(Date(1, January, 2012));
732     expectedHol.push_back(Date(2, January, 2012));
733     expectedHol.push_back(Date(7, January, 2012));
734     expectedHol.push_back(Date(8, January, 2012));
735     expectedHol.push_back(Date(14, January, 2012));
736     expectedHol.push_back(Date(15, January, 2012));
737     expectedHol.push_back(Date(21, January, 2012));
738     expectedHol.push_back(Date(22, January, 2012));
739     expectedHol.push_back(Date(28, January, 2012));
740     expectedHol.push_back(Date(29, January, 2012));
741     expectedHol.push_back(Date(4, February, 2012));
742     expectedHol.push_back(Date(5, February, 2012));
743     expectedHol.push_back(Date(11, February, 2012));
744     expectedHol.push_back(Date(12, February, 2012));
745     expectedHol.push_back(Date(18, February, 2012));
746     expectedHol.push_back(Date(19, February, 2012));
747     expectedHol.push_back(Date(23, February, 2012));
748     expectedHol.push_back(Date(25, February, 2012));
749     expectedHol.push_back(Date(26, February, 2012));
750     expectedHol.push_back(Date(3, March, 2012));
751     expectedHol.push_back(Date(4, March, 2012));
752     expectedHol.push_back(Date(8, March, 2012));
753     expectedHol.push_back(Date(9, March, 2012));
754     expectedHol.push_back(Date(10, March, 2012));
755     expectedHol.push_back(Date(17, March, 2012));
756     expectedHol.push_back(Date(18, March, 2012));
757     expectedHol.push_back(Date(24, March, 2012));
758     expectedHol.push_back(Date(25, March, 2012));
759     expectedHol.push_back(Date(31, March, 2012));
760     expectedHol.push_back(Date(1, April, 2012));
761     expectedHol.push_back(Date(7, April, 2012));
762     expectedHol.push_back(Date(8, April, 2012));
763     expectedHol.push_back(Date(14, April, 2012));
764     expectedHol.push_back(Date(15, April, 2012));
765     expectedHol.push_back(Date(21, April, 2012));
766     expectedHol.push_back(Date(22, April, 2012));
767     expectedHol.push_back(Date(29, April, 2012));
768     expectedHol.push_back(Date(30, April, 2012));
769     expectedHol.push_back(Date(1, May, 2012));
770     expectedHol.push_back(Date(6, May, 2012));
771     expectedHol.push_back(Date(9, May, 2012));
772     expectedHol.push_back(Date(13, May, 2012));
773     expectedHol.push_back(Date(19, May, 2012));
774     expectedHol.push_back(Date(20, May, 2012));
775     expectedHol.push_back(Date(26, May, 2012));
776     expectedHol.push_back(Date(27, May, 2012));
777     expectedHol.push_back(Date(2, June, 2012));
778     expectedHol.push_back(Date(3, June, 2012));
779     expectedHol.push_back(Date(10, June, 2012));
780     expectedHol.push_back(Date(11, June, 2012));
781     expectedHol.push_back(Date(12, June, 2012));
782     expectedHol.push_back(Date(16, June, 2012));
783     expectedHol.push_back(Date(17, June, 2012));
784     expectedHol.push_back(Date(23, June, 2012));
785     expectedHol.push_back(Date(24, June, 2012));
786     expectedHol.push_back(Date(30, June, 2012));
787     expectedHol.push_back(Date(1, July, 2012));
788     expectedHol.push_back(Date(7, July, 2012));
789     expectedHol.push_back(Date(8, July, 2012));
790     expectedHol.push_back(Date(14, July, 2012));
791     expectedHol.push_back(Date(15, July, 2012));
792     expectedHol.push_back(Date(21, July, 2012));
793     expectedHol.push_back(Date(22, July, 2012));
794     expectedHol.push_back(Date(28, July, 2012));
795     expectedHol.push_back(Date(29, July, 2012));
796     expectedHol.push_back(Date(4, August, 2012));
797     expectedHol.push_back(Date(5, August, 2012));
798     expectedHol.push_back(Date(11, August, 2012));
799     expectedHol.push_back(Date(12, August, 2012));
800     expectedHol.push_back(Date(18, August, 2012));
801     expectedHol.push_back(Date(19, August, 2012));
802     expectedHol.push_back(Date(25, August, 2012));
803     expectedHol.push_back(Date(26, August, 2012));
804     expectedHol.push_back(Date(1, September, 2012));
805     expectedHol.push_back(Date(2, September, 2012));
806     expectedHol.push_back(Date(8, September, 2012));
807     expectedHol.push_back(Date(9, September, 2012));
808     expectedHol.push_back(Date(15, September, 2012));
809     expectedHol.push_back(Date(16, September, 2012));
810     expectedHol.push_back(Date(22, September, 2012));
811     expectedHol.push_back(Date(23, September, 2012));
812     expectedHol.push_back(Date(29, September, 2012));
813     expectedHol.push_back(Date(30, September, 2012));
814     expectedHol.push_back(Date(6, October, 2012));
815     expectedHol.push_back(Date(7, October, 2012));
816     expectedHol.push_back(Date(13, October, 2012));
817     expectedHol.push_back(Date(14, October, 2012));
818     expectedHol.push_back(Date(20, October, 2012));
819     expectedHol.push_back(Date(21, October, 2012));
820     expectedHol.push_back(Date(27, October, 2012));
821     expectedHol.push_back(Date(28, October, 2012));
822     expectedHol.push_back(Date(3, November, 2012));
823     expectedHol.push_back(Date(4, November, 2012));
824     expectedHol.push_back(Date(5, November, 2012));
825     expectedHol.push_back(Date(10, November, 2012));
826     expectedHol.push_back(Date(11, November, 2012));
827     expectedHol.push_back(Date(17, November, 2012));
828     expectedHol.push_back(Date(18, November, 2012));
829     expectedHol.push_back(Date(24, November, 2012));
830     expectedHol.push_back(Date(25, November, 2012));
831     expectedHol.push_back(Date(1, December, 2012));
832     expectedHol.push_back(Date(2, December, 2012));
833     expectedHol.push_back(Date(8, December, 2012));
834     expectedHol.push_back(Date(9, December, 2012));
835     expectedHol.push_back(Date(15, December, 2012));
836     expectedHol.push_back(Date(16, December, 2012));
837     expectedHol.push_back(Date(22, December, 2012));
838     expectedHol.push_back(Date(23, December, 2012));
839     expectedHol.push_back(Date(29, December, 2012));
840     expectedHol.push_back(Date(30, December, 2012));
841     expectedHol.push_back(Date(31, December, 2012));
842 
843     // exhaustive holiday list for the year 2013
844     expectedHol.push_back(Date(1, January, 2013));
845     expectedHol.push_back(Date(2, January, 2013));
846     expectedHol.push_back(Date(3, January, 2013));
847     expectedHol.push_back(Date(4, January, 2013));
848     expectedHol.push_back(Date(5, January, 2013));
849     expectedHol.push_back(Date(6, January, 2013));
850     expectedHol.push_back(Date(7, January, 2013));
851     expectedHol.push_back(Date(12, January, 2013));
852     expectedHol.push_back(Date(13, January, 2013));
853     expectedHol.push_back(Date(19, January, 2013));
854     expectedHol.push_back(Date(20, January, 2013));
855     expectedHol.push_back(Date(26, January, 2013));
856     expectedHol.push_back(Date(27, January, 2013));
857     expectedHol.push_back(Date(2, February, 2013));
858     expectedHol.push_back(Date(3, February, 2013));
859     expectedHol.push_back(Date(9, February, 2013));
860     expectedHol.push_back(Date(10, February, 2013));
861     expectedHol.push_back(Date(16, February, 2013));
862     expectedHol.push_back(Date(17, February, 2013));
863     expectedHol.push_back(Date(23, February, 2013));
864     expectedHol.push_back(Date(24, February, 2013));
865     expectedHol.push_back(Date(2, March, 2013));
866     expectedHol.push_back(Date(3, March, 2013));
867     expectedHol.push_back(Date(8, March, 2013));
868     expectedHol.push_back(Date(9, March, 2013));
869     expectedHol.push_back(Date(10, March, 2013));
870     expectedHol.push_back(Date(16, March, 2013));
871     expectedHol.push_back(Date(17, March, 2013));
872     expectedHol.push_back(Date(23, March, 2013));
873     expectedHol.push_back(Date(24, March, 2013));
874     expectedHol.push_back(Date(30, March, 2013));
875     expectedHol.push_back(Date(31, March, 2013));
876     expectedHol.push_back(Date(6, April, 2013));
877     expectedHol.push_back(Date(7, April, 2013));
878     expectedHol.push_back(Date(13, April, 2013));
879     expectedHol.push_back(Date(14, April, 2013));
880     expectedHol.push_back(Date(20, April, 2013));
881     expectedHol.push_back(Date(21, April, 2013));
882     expectedHol.push_back(Date(27, April, 2013));
883     expectedHol.push_back(Date(28, April, 2013));
884     expectedHol.push_back(Date(1, May, 2013));
885     expectedHol.push_back(Date(4, May, 2013));
886     expectedHol.push_back(Date(5, May, 2013));
887     expectedHol.push_back(Date(9, May, 2013));
888     expectedHol.push_back(Date(11, May, 2013));
889     expectedHol.push_back(Date(12, May, 2013));
890     expectedHol.push_back(Date(18, May, 2013));
891     expectedHol.push_back(Date(19, May, 2013));
892     expectedHol.push_back(Date(25, May, 2013));
893     expectedHol.push_back(Date(26, May, 2013));
894     expectedHol.push_back(Date(1, June, 2013));
895     expectedHol.push_back(Date(2, June, 2013));
896     expectedHol.push_back(Date(8, June, 2013));
897     expectedHol.push_back(Date(9, June, 2013));
898     expectedHol.push_back(Date(12, June, 2013));
899     expectedHol.push_back(Date(15, June, 2013));
900     expectedHol.push_back(Date(16, June, 2013));
901     expectedHol.push_back(Date(22, June, 2013));
902     expectedHol.push_back(Date(23, June, 2013));
903     expectedHol.push_back(Date(29, June, 2013));
904     expectedHol.push_back(Date(30, June, 2013));
905     expectedHol.push_back(Date(6, July, 2013));
906     expectedHol.push_back(Date(7, July, 2013));
907     expectedHol.push_back(Date(13, July, 2013));
908     expectedHol.push_back(Date(14, July, 2013));
909     expectedHol.push_back(Date(20, July, 2013));
910     expectedHol.push_back(Date(21, July, 2013));
911     expectedHol.push_back(Date(27, July, 2013));
912     expectedHol.push_back(Date(28, July, 2013));
913     expectedHol.push_back(Date(3, August, 2013));
914     expectedHol.push_back(Date(4, August, 2013));
915     expectedHol.push_back(Date(10, August, 2013));
916     expectedHol.push_back(Date(11, August, 2013));
917     expectedHol.push_back(Date(17, August, 2013));
918     expectedHol.push_back(Date(18, August, 2013));
919     expectedHol.push_back(Date(24, August, 2013));
920     expectedHol.push_back(Date(25, August, 2013));
921     expectedHol.push_back(Date(31, August, 2013));
922     expectedHol.push_back(Date(1, September, 2013));
923     expectedHol.push_back(Date(7, September, 2013));
924     expectedHol.push_back(Date(8, September, 2013));
925     expectedHol.push_back(Date(14, September, 2013));
926     expectedHol.push_back(Date(15, September, 2013));
927     expectedHol.push_back(Date(21, September, 2013));
928     expectedHol.push_back(Date(22, September, 2013));
929     expectedHol.push_back(Date(28, September, 2013));
930     expectedHol.push_back(Date(29, September, 2013));
931     expectedHol.push_back(Date(5, October, 2013));
932     expectedHol.push_back(Date(6, October, 2013));
933     expectedHol.push_back(Date(12, October, 2013));
934     expectedHol.push_back(Date(13, October, 2013));
935     expectedHol.push_back(Date(19, October, 2013));
936     expectedHol.push_back(Date(20, October, 2013));
937     expectedHol.push_back(Date(26, October, 2013));
938     expectedHol.push_back(Date(27, October, 2013));
939     expectedHol.push_back(Date(2, November, 2013));
940     expectedHol.push_back(Date(3, November, 2013));
941     expectedHol.push_back(Date(4, November, 2013));
942     expectedHol.push_back(Date(9, November, 2013));
943     expectedHol.push_back(Date(10, November, 2013));
944     expectedHol.push_back(Date(16, November, 2013));
945     expectedHol.push_back(Date(17, November, 2013));
946     expectedHol.push_back(Date(23, November, 2013));
947     expectedHol.push_back(Date(24, November, 2013));
948     expectedHol.push_back(Date(30, November, 2013));
949     expectedHol.push_back(Date(1, December, 2013));
950     expectedHol.push_back(Date(7, December, 2013));
951     expectedHol.push_back(Date(8, December, 2013));
952     expectedHol.push_back(Date(14, December, 2013));
953     expectedHol.push_back(Date(15, December, 2013));
954     expectedHol.push_back(Date(21, December, 2013));
955     expectedHol.push_back(Date(22, December, 2013));
956     expectedHol.push_back(Date(28, December, 2013));
957     expectedHol.push_back(Date(29, December, 2013));
958     expectedHol.push_back(Date(31, December, 2013));
959 
960     // exhaustive holiday list for the year 2014
961     expectedHol.push_back(Date(1, January, 2014));
962     expectedHol.push_back(Date(2, January, 2014));
963     expectedHol.push_back(Date(3, January, 2014));
964     expectedHol.push_back(Date(4, January, 2014));
965     expectedHol.push_back(Date(5, January, 2014));
966     expectedHol.push_back(Date(7, January, 2014));
967     expectedHol.push_back(Date(11, January, 2014));
968     expectedHol.push_back(Date(12, January, 2014));
969     expectedHol.push_back(Date(18, January, 2014));
970     expectedHol.push_back(Date(19, January, 2014));
971     expectedHol.push_back(Date(25, January, 2014));
972     expectedHol.push_back(Date(26, January, 2014));
973     expectedHol.push_back(Date(1, February, 2014));
974     expectedHol.push_back(Date(2, February, 2014));
975     expectedHol.push_back(Date(8, February, 2014));
976     expectedHol.push_back(Date(9, February, 2014));
977     expectedHol.push_back(Date(15, February, 2014));
978     expectedHol.push_back(Date(16, February, 2014));
979     expectedHol.push_back(Date(22, February, 2014));
980     expectedHol.push_back(Date(23, February, 2014));
981     expectedHol.push_back(Date(1, March, 2014));
982     expectedHol.push_back(Date(2, March, 2014));
983     expectedHol.push_back(Date(8, March, 2014));
984     expectedHol.push_back(Date(9, March, 2014));
985     expectedHol.push_back(Date(10, March, 2014));
986     expectedHol.push_back(Date(15, March, 2014));
987     expectedHol.push_back(Date(16, March, 2014));
988     expectedHol.push_back(Date(22, March, 2014));
989     expectedHol.push_back(Date(23, March, 2014));
990     expectedHol.push_back(Date(29, March, 2014));
991     expectedHol.push_back(Date(30, March, 2014));
992     expectedHol.push_back(Date(5, April, 2014));
993     expectedHol.push_back(Date(6, April, 2014));
994     expectedHol.push_back(Date(12, April, 2014));
995     expectedHol.push_back(Date(13, April, 2014));
996     expectedHol.push_back(Date(19, April, 2014));
997     expectedHol.push_back(Date(20, April, 2014));
998     expectedHol.push_back(Date(26, April, 2014));
999     expectedHol.push_back(Date(27, April, 2014));
1000     expectedHol.push_back(Date(1, May, 2014));
1001     expectedHol.push_back(Date(3, May, 2014));
1002     expectedHol.push_back(Date(4, May, 2014));
1003     expectedHol.push_back(Date(9, May, 2014));
1004     expectedHol.push_back(Date(10, May, 2014));
1005     expectedHol.push_back(Date(11, May, 2014));
1006     expectedHol.push_back(Date(17, May, 2014));
1007     expectedHol.push_back(Date(18, May, 2014));
1008     expectedHol.push_back(Date(24, May, 2014));
1009     expectedHol.push_back(Date(25, May, 2014));
1010     expectedHol.push_back(Date(31, May, 2014));
1011     expectedHol.push_back(Date(1, June, 2014));
1012     expectedHol.push_back(Date(7, June, 2014));
1013     expectedHol.push_back(Date(8, June, 2014));
1014     expectedHol.push_back(Date(12, June, 2014));
1015     expectedHol.push_back(Date(14, June, 2014));
1016     expectedHol.push_back(Date(15, June, 2014));
1017     expectedHol.push_back(Date(21, June, 2014));
1018     expectedHol.push_back(Date(22, June, 2014));
1019     expectedHol.push_back(Date(28, June, 2014));
1020     expectedHol.push_back(Date(29, June, 2014));
1021     expectedHol.push_back(Date(5, July, 2014));
1022     expectedHol.push_back(Date(6, July, 2014));
1023     expectedHol.push_back(Date(12, July, 2014));
1024     expectedHol.push_back(Date(13, July, 2014));
1025     expectedHol.push_back(Date(19, July, 2014));
1026     expectedHol.push_back(Date(20, July, 2014));
1027     expectedHol.push_back(Date(26, July, 2014));
1028     expectedHol.push_back(Date(27, July, 2014));
1029     expectedHol.push_back(Date(2, August, 2014));
1030     expectedHol.push_back(Date(3, August, 2014));
1031     expectedHol.push_back(Date(9, August, 2014));
1032     expectedHol.push_back(Date(10, August, 2014));
1033     expectedHol.push_back(Date(16, August, 2014));
1034     expectedHol.push_back(Date(17, August, 2014));
1035     expectedHol.push_back(Date(23, August, 2014));
1036     expectedHol.push_back(Date(24, August, 2014));
1037     expectedHol.push_back(Date(30, August, 2014));
1038     expectedHol.push_back(Date(31, August, 2014));
1039     expectedHol.push_back(Date(6, September, 2014));
1040     expectedHol.push_back(Date(7, September, 2014));
1041     expectedHol.push_back(Date(13, September, 2014));
1042     expectedHol.push_back(Date(14, September, 2014));
1043     expectedHol.push_back(Date(20, September, 2014));
1044     expectedHol.push_back(Date(21, September, 2014));
1045     expectedHol.push_back(Date(27, September, 2014));
1046     expectedHol.push_back(Date(28, September, 2014));
1047     expectedHol.push_back(Date(4, October, 2014));
1048     expectedHol.push_back(Date(5, October, 2014));
1049     expectedHol.push_back(Date(11, October, 2014));
1050     expectedHol.push_back(Date(12, October, 2014));
1051     expectedHol.push_back(Date(18, October, 2014));
1052     expectedHol.push_back(Date(19, October, 2014));
1053     expectedHol.push_back(Date(25, October, 2014));
1054     expectedHol.push_back(Date(26, October, 2014));
1055     expectedHol.push_back(Date(1, November, 2014));
1056     expectedHol.push_back(Date(2, November, 2014));
1057     expectedHol.push_back(Date(4, November, 2014));
1058     expectedHol.push_back(Date(8, November, 2014));
1059     expectedHol.push_back(Date(9, November, 2014));
1060     expectedHol.push_back(Date(15, November, 2014));
1061     expectedHol.push_back(Date(16, November, 2014));
1062     expectedHol.push_back(Date(22, November, 2014));
1063     expectedHol.push_back(Date(23, November, 2014));
1064     expectedHol.push_back(Date(29, November, 2014));
1065     expectedHol.push_back(Date(30, November, 2014));
1066     expectedHol.push_back(Date(6, December, 2014));
1067     expectedHol.push_back(Date(7, December, 2014));
1068     expectedHol.push_back(Date(13, December, 2014));
1069     expectedHol.push_back(Date(14, December, 2014));
1070     expectedHol.push_back(Date(20, December, 2014));
1071     expectedHol.push_back(Date(21, December, 2014));
1072     expectedHol.push_back(Date(27, December, 2014));
1073     expectedHol.push_back(Date(28, December, 2014));
1074     expectedHol.push_back(Date(31, December, 2014));
1075 
1076     // exhaustive holiday list for the year 2015
1077     expectedHol.push_back(Date(1, January, 2015));
1078     expectedHol.push_back(Date(2, January, 2015));
1079     expectedHol.push_back(Date(3, January, 2015));
1080     expectedHol.push_back(Date(4, January, 2015));
1081     expectedHol.push_back(Date(7, January, 2015));
1082     expectedHol.push_back(Date(10, January, 2015));
1083     expectedHol.push_back(Date(11, January, 2015));
1084     expectedHol.push_back(Date(17, January, 2015));
1085     expectedHol.push_back(Date(18, January, 2015));
1086     expectedHol.push_back(Date(24, January, 2015));
1087     expectedHol.push_back(Date(25, January, 2015));
1088     expectedHol.push_back(Date(31, January, 2015));
1089     expectedHol.push_back(Date(1, February, 2015));
1090     expectedHol.push_back(Date(7, February, 2015));
1091     expectedHol.push_back(Date(8, February, 2015));
1092     expectedHol.push_back(Date(14, February, 2015));
1093     expectedHol.push_back(Date(15, February, 2015));
1094     expectedHol.push_back(Date(21, February, 2015));
1095     expectedHol.push_back(Date(22, February, 2015));
1096     expectedHol.push_back(Date(23, February, 2015));
1097     expectedHol.push_back(Date(28, February, 2015));
1098     expectedHol.push_back(Date(1, March, 2015));
1099     expectedHol.push_back(Date(7, March, 2015));
1100     expectedHol.push_back(Date(8, March, 2015));
1101     expectedHol.push_back(Date(9, March, 2015));
1102     expectedHol.push_back(Date(14, March, 2015));
1103     expectedHol.push_back(Date(15, March, 2015));
1104     expectedHol.push_back(Date(21, March, 2015));
1105     expectedHol.push_back(Date(22, March, 2015));
1106     expectedHol.push_back(Date(28, March, 2015));
1107     expectedHol.push_back(Date(29, March, 2015));
1108     expectedHol.push_back(Date(4, April, 2015));
1109     expectedHol.push_back(Date(5, April, 2015));
1110     expectedHol.push_back(Date(11, April, 2015));
1111     expectedHol.push_back(Date(12, April, 2015));
1112     expectedHol.push_back(Date(18, April, 2015));
1113     expectedHol.push_back(Date(19, April, 2015));
1114     expectedHol.push_back(Date(25, April, 2015));
1115     expectedHol.push_back(Date(26, April, 2015));
1116     expectedHol.push_back(Date(1, May, 2015));
1117     expectedHol.push_back(Date(2, May, 2015));
1118     expectedHol.push_back(Date(3, May, 2015));
1119     expectedHol.push_back(Date(9, May, 2015));
1120     expectedHol.push_back(Date(10, May, 2015));
1121     expectedHol.push_back(Date(11, May, 2015));
1122     expectedHol.push_back(Date(16, May, 2015));
1123     expectedHol.push_back(Date(17, May, 2015));
1124     expectedHol.push_back(Date(23, May, 2015));
1125     expectedHol.push_back(Date(24, May, 2015));
1126     expectedHol.push_back(Date(30, May, 2015));
1127     expectedHol.push_back(Date(31, May, 2015));
1128     expectedHol.push_back(Date(6, June, 2015));
1129     expectedHol.push_back(Date(7, June, 2015));
1130     expectedHol.push_back(Date(12, June, 2015));
1131     expectedHol.push_back(Date(13, June, 2015));
1132     expectedHol.push_back(Date(14, June, 2015));
1133     expectedHol.push_back(Date(20, June, 2015));
1134     expectedHol.push_back(Date(21, June, 2015));
1135     expectedHol.push_back(Date(27, June, 2015));
1136     expectedHol.push_back(Date(28, June, 2015));
1137     expectedHol.push_back(Date(4, July, 2015));
1138     expectedHol.push_back(Date(5, July, 2015));
1139     expectedHol.push_back(Date(11, July, 2015));
1140     expectedHol.push_back(Date(12, July, 2015));
1141     expectedHol.push_back(Date(18, July, 2015));
1142     expectedHol.push_back(Date(19, July, 2015));
1143     expectedHol.push_back(Date(25, July, 2015));
1144     expectedHol.push_back(Date(26, July, 2015));
1145     expectedHol.push_back(Date(1, August, 2015));
1146     expectedHol.push_back(Date(2, August, 2015));
1147     expectedHol.push_back(Date(8, August, 2015));
1148     expectedHol.push_back(Date(9, August, 2015));
1149     expectedHol.push_back(Date(15, August, 2015));
1150     expectedHol.push_back(Date(16, August, 2015));
1151     expectedHol.push_back(Date(22, August, 2015));
1152     expectedHol.push_back(Date(23, August, 2015));
1153     expectedHol.push_back(Date(29, August, 2015));
1154     expectedHol.push_back(Date(30, August, 2015));
1155     expectedHol.push_back(Date(5, September, 2015));
1156     expectedHol.push_back(Date(6, September, 2015));
1157     expectedHol.push_back(Date(12, September, 2015));
1158     expectedHol.push_back(Date(13, September, 2015));
1159     expectedHol.push_back(Date(19, September, 2015));
1160     expectedHol.push_back(Date(20, September, 2015));
1161     expectedHol.push_back(Date(26, September, 2015));
1162     expectedHol.push_back(Date(27, September, 2015));
1163     expectedHol.push_back(Date(3, October, 2015));
1164     expectedHol.push_back(Date(4, October, 2015));
1165     expectedHol.push_back(Date(10, October, 2015));
1166     expectedHol.push_back(Date(11, October, 2015));
1167     expectedHol.push_back(Date(17, October, 2015));
1168     expectedHol.push_back(Date(18, October, 2015));
1169     expectedHol.push_back(Date(24, October, 2015));
1170     expectedHol.push_back(Date(25, October, 2015));
1171     expectedHol.push_back(Date(31, October, 2015));
1172     expectedHol.push_back(Date(1, November, 2015));
1173     expectedHol.push_back(Date(4, November, 2015));
1174     expectedHol.push_back(Date(7, November, 2015));
1175     expectedHol.push_back(Date(8, November, 2015));
1176     expectedHol.push_back(Date(14, November, 2015));
1177     expectedHol.push_back(Date(15, November, 2015));
1178     expectedHol.push_back(Date(21, November, 2015));
1179     expectedHol.push_back(Date(22, November, 2015));
1180     expectedHol.push_back(Date(28, November, 2015));
1181     expectedHol.push_back(Date(29, November, 2015));
1182     expectedHol.push_back(Date(5, December, 2015));
1183     expectedHol.push_back(Date(6, December, 2015));
1184     expectedHol.push_back(Date(12, December, 2015));
1185     expectedHol.push_back(Date(13, December, 2015));
1186     expectedHol.push_back(Date(19, December, 2015));
1187     expectedHol.push_back(Date(20, December, 2015));
1188     expectedHol.push_back(Date(26, December, 2015));
1189     expectedHol.push_back(Date(27, December, 2015));
1190     expectedHol.push_back(Date(31, December, 2015));
1191 
1192     // exhaustive holiday list for the year 2016
1193     expectedHol.push_back(Date(1, January, 2016));
1194     expectedHol.push_back(Date(2, January, 2016));
1195     expectedHol.push_back(Date(3, January, 2016));
1196     expectedHol.push_back(Date(7, January, 2016));
1197     expectedHol.push_back(Date(8, January, 2016));
1198     expectedHol.push_back(Date(9, January, 2016));
1199     expectedHol.push_back(Date(10, January, 2016));
1200     expectedHol.push_back(Date(16, January, 2016));
1201     expectedHol.push_back(Date(17, January, 2016));
1202     expectedHol.push_back(Date(23, January, 2016));
1203     expectedHol.push_back(Date(24, January, 2016));
1204     expectedHol.push_back(Date(30, January, 2016));
1205     expectedHol.push_back(Date(31, January, 2016));
1206     expectedHol.push_back(Date(6, February, 2016));
1207     expectedHol.push_back(Date(7, February, 2016));
1208     expectedHol.push_back(Date(13, February, 2016));
1209     expectedHol.push_back(Date(14, February, 2016));
1210     expectedHol.push_back(Date(21, February, 2016));
1211     expectedHol.push_back(Date(23, February, 2016));
1212     expectedHol.push_back(Date(27, February, 2016));
1213     expectedHol.push_back(Date(28, February, 2016));
1214     expectedHol.push_back(Date(5, March, 2016));
1215     expectedHol.push_back(Date(6, March, 2016));
1216     expectedHol.push_back(Date(8, March, 2016));
1217     expectedHol.push_back(Date(12, March, 2016));
1218     expectedHol.push_back(Date(13, March, 2016));
1219     expectedHol.push_back(Date(19, March, 2016));
1220     expectedHol.push_back(Date(20, March, 2016));
1221     expectedHol.push_back(Date(26, March, 2016));
1222     expectedHol.push_back(Date(27, March, 2016));
1223     expectedHol.push_back(Date(2, April, 2016));
1224     expectedHol.push_back(Date(3, April, 2016));
1225     expectedHol.push_back(Date(9, April, 2016));
1226     expectedHol.push_back(Date(10, April, 2016));
1227     expectedHol.push_back(Date(16, April, 2016));
1228     expectedHol.push_back(Date(17, April, 2016));
1229     expectedHol.push_back(Date(23, April, 2016));
1230     expectedHol.push_back(Date(24, April, 2016));
1231     expectedHol.push_back(Date(30, April, 2016));
1232     expectedHol.push_back(Date(1, May, 2016));
1233     expectedHol.push_back(Date(2, May, 2016));
1234     expectedHol.push_back(Date(3, May, 2016));
1235     expectedHol.push_back(Date(7, May, 2016));
1236     expectedHol.push_back(Date(8, May, 2016));
1237     expectedHol.push_back(Date(9, May, 2016));
1238     expectedHol.push_back(Date(14, May, 2016));
1239     expectedHol.push_back(Date(15, May, 2016));
1240     expectedHol.push_back(Date(21, May, 2016));
1241     expectedHol.push_back(Date(22, May, 2016));
1242     expectedHol.push_back(Date(28, May, 2016));
1243     expectedHol.push_back(Date(29, May, 2016));
1244     expectedHol.push_back(Date(4, June, 2016));
1245     expectedHol.push_back(Date(5, June, 2016));
1246     expectedHol.push_back(Date(11, June, 2016));
1247     expectedHol.push_back(Date(12, June, 2016));
1248     expectedHol.push_back(Date(13, June, 2016));
1249     expectedHol.push_back(Date(18, June, 2016));
1250     expectedHol.push_back(Date(19, June, 2016));
1251     expectedHol.push_back(Date(25, June, 2016));
1252     expectedHol.push_back(Date(26, June, 2016));
1253     expectedHol.push_back(Date(2, July, 2016));
1254     expectedHol.push_back(Date(3, July, 2016));
1255     expectedHol.push_back(Date(9, July, 2016));
1256     expectedHol.push_back(Date(10, July, 2016));
1257     expectedHol.push_back(Date(16, July, 2016));
1258     expectedHol.push_back(Date(17, July, 2016));
1259     expectedHol.push_back(Date(23, July, 2016));
1260     expectedHol.push_back(Date(24, July, 2016));
1261     expectedHol.push_back(Date(30, July, 2016));
1262     expectedHol.push_back(Date(31, July, 2016));
1263     expectedHol.push_back(Date(6, August, 2016));
1264     expectedHol.push_back(Date(7, August, 2016));
1265     expectedHol.push_back(Date(13, August, 2016));
1266     expectedHol.push_back(Date(14, August, 2016));
1267     expectedHol.push_back(Date(20, August, 2016));
1268     expectedHol.push_back(Date(21, August, 2016));
1269     expectedHol.push_back(Date(27, August, 2016));
1270     expectedHol.push_back(Date(28, August, 2016));
1271     expectedHol.push_back(Date(3, September, 2016));
1272     expectedHol.push_back(Date(4, September, 2016));
1273     expectedHol.push_back(Date(10, September, 2016));
1274     expectedHol.push_back(Date(11, September, 2016));
1275     expectedHol.push_back(Date(17, September, 2016));
1276     expectedHol.push_back(Date(18, September, 2016));
1277     expectedHol.push_back(Date(24, September, 2016));
1278     expectedHol.push_back(Date(25, September, 2016));
1279     expectedHol.push_back(Date(1, October, 2016));
1280     expectedHol.push_back(Date(2, October, 2016));
1281     expectedHol.push_back(Date(8, October, 2016));
1282     expectedHol.push_back(Date(9, October, 2016));
1283     expectedHol.push_back(Date(15, October, 2016));
1284     expectedHol.push_back(Date(16, October, 2016));
1285     expectedHol.push_back(Date(22, October, 2016));
1286     expectedHol.push_back(Date(23, October, 2016));
1287     expectedHol.push_back(Date(29, October, 2016));
1288     expectedHol.push_back(Date(30, October, 2016));
1289     expectedHol.push_back(Date(4, November, 2016));
1290     expectedHol.push_back(Date(5, November, 2016));
1291     expectedHol.push_back(Date(6, November, 2016));
1292     expectedHol.push_back(Date(12, November, 2016));
1293     expectedHol.push_back(Date(13, November, 2016));
1294     expectedHol.push_back(Date(19, November, 2016));
1295     expectedHol.push_back(Date(20, November, 2016));
1296     expectedHol.push_back(Date(26, November, 2016));
1297     expectedHol.push_back(Date(27, November, 2016));
1298     expectedHol.push_back(Date(3, December, 2016));
1299     expectedHol.push_back(Date(4, December, 2016));
1300     expectedHol.push_back(Date(10, December, 2016));
1301     expectedHol.push_back(Date(11, December, 2016));
1302     expectedHol.push_back(Date(17, December, 2016));
1303     expectedHol.push_back(Date(18, December, 2016));
1304     expectedHol.push_back(Date(24, December, 2016));
1305     expectedHol.push_back(Date(25, December, 2016));
1306     expectedHol.push_back(Date(30, December, 2016));
1307     expectedHol.push_back(Date(31, December, 2016));
1308 
1309     Calendar c = Russia(Russia::MOEX);
1310 
1311 
1312     std::vector<Date> hol =
1313         c.holidayList(Date(1, January, 2012),
1314                       Date(31, December, 2016), // only dates for which calendars are available
1315                       true);                    // include week-ends since lists are exhaustive
1316     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
1317         if (hol[i] != expectedHol[i])
1318             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
1319                                                << hol[i]);
1320     }
1321     if (hol.size() != expectedHol.size())
1322         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
1323                                  << hol.size() << " calculated holidays");
1324 }
1325 
testBrazil()1326 void CalendarTest::testBrazil() {
1327     BOOST_TEST_MESSAGE("Testing Brazil holiday list...");
1328 
1329     std::vector<Date> expectedHol;
1330 
1331     // expectedHol.push_back(Date(1,January,2005)); // Saturday
1332     expectedHol.push_back(Date(7, February, 2005));
1333     expectedHol.push_back(Date(8, February, 2005));
1334     expectedHol.push_back(Date(25, March, 2005));
1335     expectedHol.push_back(Date(21, April, 2005));
1336     // expectedHol.push_back(Date(1,May,2005)); // Sunday
1337     expectedHol.push_back(Date(26, May, 2005));
1338     expectedHol.push_back(Date(7, September, 2005));
1339     expectedHol.push_back(Date(12, October, 2005));
1340     expectedHol.push_back(Date(2, November, 2005));
1341     expectedHol.push_back(Date(15, November, 2005));
1342     // expectedHol.push_back(Date(25,December,2005)); // Sunday
1343 
1344     // expectedHol.push_back(Date(1,January,2006)); // Sunday
1345     expectedHol.push_back(Date(27, February, 2006));
1346     expectedHol.push_back(Date(28, February, 2006));
1347     expectedHol.push_back(Date(14, April, 2006));
1348     expectedHol.push_back(Date(21, April, 2006));
1349     expectedHol.push_back(Date(1, May, 2006));
1350     expectedHol.push_back(Date(15, June, 2006));
1351     expectedHol.push_back(Date(7, September, 2006));
1352     expectedHol.push_back(Date(12, October, 2006));
1353     expectedHol.push_back(Date(2, November, 2006));
1354     expectedHol.push_back(Date(15, November, 2006));
1355     expectedHol.push_back(Date(25, December, 2006));
1356 
1357     Calendar c = Brazil();
1358     std::vector<Date> hol = c.holidayList(Date(1, January, 2005), Date(31, December, 2006));
1359     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
1360         if (hol[i] != expectedHol[i])
1361             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
1362                                                << hol[i]);
1363     }
1364     if (hol.size() != expectedHol.size())
1365         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
1366                                  << hol.size() << " calculated holidays");
1367 }
1368 
1369 
testSouthKoreanSettlement()1370 void CalendarTest::testSouthKoreanSettlement() {
1371     BOOST_TEST_MESSAGE("Testing South-Korean settlement holiday list...");
1372 
1373     std::vector<Date> expectedHol;
1374     expectedHol.push_back(Date(1, January, 2004));
1375     expectedHol.push_back(Date(21, January, 2004));
1376     expectedHol.push_back(Date(22, January, 2004));
1377     expectedHol.push_back(Date(23, January, 2004));
1378     expectedHol.push_back(Date(1, March, 2004));
1379     expectedHol.push_back(Date(5, April, 2004));
1380     expectedHol.push_back(Date(15, April, 2004)); // election day
1381     //    expectedHol.push_back(Date(1,May,2004)); // Saturday
1382     expectedHol.push_back(Date(5, May, 2004));
1383     expectedHol.push_back(Date(26, May, 2004));
1384     //    expectedHol.push_back(Date(6,June,2004)); // Sunday
1385     //    expectedHol.push_back(Date(17,July,2004)); // Saturday
1386     //    expectedHol.push_back(Date(15,August,2004)); // Sunday
1387     expectedHol.push_back(Date(27, September, 2004));
1388     expectedHol.push_back(Date(28, September, 2004));
1389     expectedHol.push_back(Date(29, September, 2004));
1390     //    expectedHol.push_back(Date(3,October,2004)); // Sunday
1391     //    expectedHol.push_back(Date(25,December,2004)); // Saturday
1392 
1393     //    expectedHol.push_back(Date(1,January,2005)); // Saturday
1394     expectedHol.push_back(Date(8, February, 2005));
1395     expectedHol.push_back(Date(9, February, 2005));
1396     expectedHol.push_back(Date(10, February, 2005));
1397     expectedHol.push_back(Date(1, March, 2005));
1398     expectedHol.push_back(Date(5, April, 2005));
1399     expectedHol.push_back(Date(5, May, 2005));
1400     //    expectedHol.push_back(Date(15,May,2005)); // Sunday
1401     expectedHol.push_back(Date(6, June, 2005));
1402     //    expectedHol.push_back(Date(17,July,2005)); // Sunday
1403     expectedHol.push_back(Date(15, August, 2005));
1404     //    expectedHol.push_back(Date(17,September,2005)); // Saturday
1405     //    expectedHol.push_back(Date(18,September,2005)); // Sunday
1406     expectedHol.push_back(Date(19, September, 2005));
1407     expectedHol.push_back(Date(3, October, 2005));
1408     //    expectedHol.push_back(Date(25,December,2005)); // Sunday
1409 
1410     //    expectedHol.push_back(Date(1,January,2006)); // Sunday
1411     //    expectedHol.push_back(Date(28,January,2006)); // Saturday
1412     //    expectedHol.push_back(Date(29,January,2006)); // Sunday
1413     expectedHol.push_back(Date(30, January, 2006));
1414     expectedHol.push_back(Date(1, March, 2006));
1415     expectedHol.push_back(Date(1, May, 2006));
1416     expectedHol.push_back(Date(5, May, 2006));
1417     expectedHol.push_back(Date(31, May, 2006)); // election
1418     expectedHol.push_back(Date(6, June, 2006));
1419     expectedHol.push_back(Date(17, July, 2006));
1420     expectedHol.push_back(Date(15, August, 2006));
1421     expectedHol.push_back(Date(3, October, 2006));
1422     expectedHol.push_back(Date(5, October, 2006));
1423     expectedHol.push_back(Date(6, October, 2006));
1424     //    expectedHol.push_back(Date(7,October,2006)); // Saturday
1425     expectedHol.push_back(Date(25, December, 2006));
1426 
1427     expectedHol.push_back(Date(1, January, 2007));
1428     //    expectedHol.push_back(Date(17,February,2007)); // Saturday
1429     //    expectedHol.push_back(Date(18,February,2007)); // Sunday
1430     expectedHol.push_back(Date(19, February, 2007));
1431     expectedHol.push_back(Date(1, March, 2007));
1432     expectedHol.push_back(Date(1, May, 2007));
1433     //    expectedHol.push_back(Date(5,May,2007)); // Saturday
1434     expectedHol.push_back(Date(24, May, 2007));
1435     expectedHol.push_back(Date(6, June, 2007));
1436     expectedHol.push_back(Date(17, July, 2007));
1437     expectedHol.push_back(Date(15, August, 2007));
1438     expectedHol.push_back(Date(24, September, 2007));
1439     expectedHol.push_back(Date(25, September, 2007));
1440     expectedHol.push_back(Date(26, September, 2007));
1441     expectedHol.push_back(Date(3, October, 2007));
1442     expectedHol.push_back(Date(19, December, 2007)); // election
1443     expectedHol.push_back(Date(25, December, 2007));
1444 
1445     Calendar c = SouthKorea(SouthKorea::Settlement);
1446     std::vector<Date> hol = c.holidayList(Date(1, January, 2004), Date(31, December, 2007));
1447     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
1448         if (hol[i] != expectedHol[i])
1449             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
1450                                                << hol[i]);
1451     }
1452     if (hol.size() != expectedHol.size())
1453         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
1454                                  << hol.size() << " calculated holidays");
1455 }
1456 
testKoreaStockExchange()1457 void CalendarTest::testKoreaStockExchange() {
1458     BOOST_TEST_MESSAGE("Testing Korea Stock Exchange holiday list...");
1459 
1460     std::vector<Date> expectedHol;
1461     expectedHol.push_back(Date(1, January, 2004));
1462     expectedHol.push_back(Date(21, January, 2004));
1463     expectedHol.push_back(Date(22, January, 2004));
1464     expectedHol.push_back(Date(23, January, 2004));
1465     expectedHol.push_back(Date(1, March, 2004));
1466     expectedHol.push_back(Date(5, April, 2004));
1467     expectedHol.push_back(Date(15, April, 2004)); // election day
1468     //    expectedHol.push_back(Date(1,May,2004)); // Saturday
1469     expectedHol.push_back(Date(5, May, 2004));
1470     expectedHol.push_back(Date(26, May, 2004));
1471     //    expectedHol.push_back(Date(6,June,2004)); // Sunday
1472     //    expectedHol.push_back(Date(17,July,2004)); // Saturday
1473     //    expectedHol.push_back(Date(15,August,2004)); // Sunday
1474     expectedHol.push_back(Date(27, September, 2004));
1475     expectedHol.push_back(Date(28, September, 2004));
1476     expectedHol.push_back(Date(29, September, 2004));
1477     //    expectedHol.push_back(Date(3,October,2004)); // Sunday
1478     //    expectedHol.push_back(Date(25,December,2004)); // Saturday
1479     expectedHol.push_back(Date(31, December, 2004));
1480 
1481     //    expectedHol.push_back(Date(1,January,2005)); // Saturday
1482     expectedHol.push_back(Date(8, February, 2005));
1483     expectedHol.push_back(Date(9, February, 2005));
1484     expectedHol.push_back(Date(10, February, 2005));
1485     expectedHol.push_back(Date(1, March, 2005));
1486     expectedHol.push_back(Date(5, April, 2005));
1487     expectedHol.push_back(Date(5, May, 2005));
1488     //    expectedHol.push_back(Date(15,May,2005)); // Sunday
1489     expectedHol.push_back(Date(6, June, 2005));
1490     //    expectedHol.push_back(Date(17,July,2005)); // Sunday
1491     expectedHol.push_back(Date(15, August, 2005));
1492     //    expectedHol.push_back(Date(17,September,2005)); // Saturday
1493     //    expectedHol.push_back(Date(18,September,2005)); // Sunday
1494     expectedHol.push_back(Date(19, September, 2005));
1495     expectedHol.push_back(Date(3, October, 2005));
1496     //    expectedHol.push_back(Date(25,December,2005)); // Sunday
1497     expectedHol.push_back(Date(30, December, 2005));
1498 
1499     //    expectedHol.push_back(Date(1,January,2006)); // Sunday
1500     //    expectedHol.push_back(Date(28,January,2006)); // Saturday
1501     //    expectedHol.push_back(Date(29,January,2006)); // Sunday
1502     expectedHol.push_back(Date(30, January, 2006));
1503     expectedHol.push_back(Date(1, March, 2006));
1504     expectedHol.push_back(Date(1, May, 2006));
1505     expectedHol.push_back(Date(5, May, 2006));
1506     expectedHol.push_back(Date(31, May, 2006)); // election
1507     expectedHol.push_back(Date(6, June, 2006));
1508     expectedHol.push_back(Date(17, July, 2006));
1509     expectedHol.push_back(Date(15, August, 2006));
1510     expectedHol.push_back(Date(3, October, 2006));
1511     expectedHol.push_back(Date(5, October, 2006));
1512     expectedHol.push_back(Date(6, October, 2006));
1513     //    expectedHol.push_back(Date(7,October,2006)); // Saturday
1514     expectedHol.push_back(Date(25, December, 2006));
1515     expectedHol.push_back(Date(29, December, 2006));
1516 
1517     expectedHol.push_back(Date(1, January, 2007));
1518     //    expectedHol.push_back(Date(17,February,2007)); // Saturday
1519     //    expectedHol.push_back(Date(18,February,2007)); // Sunday
1520     expectedHol.push_back(Date(19, February, 2007));
1521     expectedHol.push_back(Date(1, March, 2007));
1522     expectedHol.push_back(Date(1, May, 2007));
1523     //    expectedHol.push_back(Date(5,May,2007)); // Saturday
1524     expectedHol.push_back(Date(24, May, 2007));
1525     expectedHol.push_back(Date(6, June, 2007));
1526     expectedHol.push_back(Date(17, July, 2007));
1527     expectedHol.push_back(Date(15, August, 2007));
1528     expectedHol.push_back(Date(24, September, 2007));
1529     expectedHol.push_back(Date(25, September, 2007));
1530     expectedHol.push_back(Date(26, September, 2007));
1531     expectedHol.push_back(Date(3, October, 2007));
1532     expectedHol.push_back(Date(19, December, 2007)); // election
1533     expectedHol.push_back(Date(25, December, 2007));
1534     expectedHol.push_back(Date(31, December, 2007));
1535 
1536     Calendar c = SouthKorea(SouthKorea::KRX);
1537     std::vector<Date> hol = c.holidayList(Date(1, January, 2004), Date(31, December, 2007));
1538 
1539     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
1540         if (hol[i] != expectedHol[i])
1541             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
1542                                                << hol[i]);
1543     }
1544     if (hol.size() != expectedHol.size())
1545         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
1546                                  << hol.size() << " calculated holidays");
1547 }
1548 
testChinaSSE()1549 void CalendarTest::testChinaSSE() {
1550     BOOST_TEST_MESSAGE("Testing China Shanghai Stock Exchange holiday list...");
1551 
1552     std::vector<Date> expectedHol;
1553 
1554     // China Shanghai Securities Exchange holiday list in the year 2014
1555     expectedHol.push_back(Date(1, Jan, 2014));
1556     expectedHol.push_back(Date(31, Jan, 2014));
1557     expectedHol.push_back(Date(3, Feb, 2014));
1558     expectedHol.push_back(Date(4, Feb, 2014));
1559     expectedHol.push_back(Date(5, Feb, 2014));
1560     expectedHol.push_back(Date(6, Feb, 2014));
1561     expectedHol.push_back(Date(7, Apr, 2014));
1562     expectedHol.push_back(Date(1, May, 2014));
1563     expectedHol.push_back(Date(2, May, 2014));
1564     expectedHol.push_back(Date(2, Jun, 2014));
1565     expectedHol.push_back(Date(8, Sep, 2014));
1566     expectedHol.push_back(Date(1, Oct, 2014));
1567     expectedHol.push_back(Date(2, Oct, 2014));
1568     expectedHol.push_back(Date(3, Oct, 2014));
1569     expectedHol.push_back(Date(6, Oct, 2014));
1570     expectedHol.push_back(Date(7, Oct, 2014));
1571 
1572     // China Shanghai Securities Exchange holiday list in the year 2015
1573     expectedHol.push_back(Date(1, Jan, 2015));
1574     expectedHol.push_back(Date(2, Jan, 2015));
1575     expectedHol.push_back(Date(18, Feb, 2015));
1576     expectedHol.push_back(Date(19, Feb, 2015));
1577     expectedHol.push_back(Date(20, Feb, 2015));
1578     expectedHol.push_back(Date(23, Feb, 2015));
1579     expectedHol.push_back(Date(24, Feb, 2015));
1580     expectedHol.push_back(Date(6, Apr, 2015));
1581     expectedHol.push_back(Date(1, May, 2015));
1582     expectedHol.push_back(Date(22, Jun, 2015));
1583     expectedHol.push_back(Date(3, Sep, 2015));
1584     expectedHol.push_back(Date(4, Sep, 2015));
1585     expectedHol.push_back(Date(1, Oct, 2015));
1586     expectedHol.push_back(Date(2, Oct, 2015));
1587     expectedHol.push_back(Date(5, Oct, 2015));
1588     expectedHol.push_back(Date(6, Oct, 2015));
1589     expectedHol.push_back(Date(7, Oct, 2015));
1590 
1591     // China Shanghai Securities Exchange holiday list in the year 2016
1592     expectedHol.push_back(Date(1, Jan, 2016));
1593     expectedHol.push_back(Date(8, Feb, 2016));
1594     expectedHol.push_back(Date(9, Feb, 2016));
1595     expectedHol.push_back(Date(10, Feb, 2016));
1596     expectedHol.push_back(Date(11, Feb, 2016));
1597     expectedHol.push_back(Date(12, Feb, 2016));
1598     expectedHol.push_back(Date(4, Apr, 2016));
1599     expectedHol.push_back(Date(2, May, 2016));
1600     expectedHol.push_back(Date(9, Jun, 2016));
1601     expectedHol.push_back(Date(10, Jun, 2016));
1602     expectedHol.push_back(Date(15, Sep, 2016));
1603     expectedHol.push_back(Date(16, Sep, 2016));
1604     expectedHol.push_back(Date(3, Oct, 2016));
1605     expectedHol.push_back(Date(4, Oct, 2016));
1606     expectedHol.push_back(Date(5, Oct, 2016));
1607     expectedHol.push_back(Date(6, Oct, 2016));
1608     expectedHol.push_back(Date(7, Oct, 2016));
1609 
1610     // China Shanghai Securities Exchange holiday list in the year 2017
1611     expectedHol.push_back(Date(2, Jan, 2017));
1612     expectedHol.push_back(Date(27, Jan, 2017));
1613     expectedHol.push_back(Date(30, Jan, 2017));
1614     expectedHol.push_back(Date(31, Jan, 2017));
1615     expectedHol.push_back(Date(1, Feb, 2017));
1616     expectedHol.push_back(Date(2, Feb, 2017));
1617     expectedHol.push_back(Date(3, April, 2017));
1618     expectedHol.push_back(Date(4, April, 2017));
1619     expectedHol.push_back(Date(1, May, 2017));
1620     expectedHol.push_back(Date(29, May, 2017));
1621     expectedHol.push_back(Date(30, May, 2017));
1622     expectedHol.push_back(Date(2, Oct, 2017));
1623     expectedHol.push_back(Date(3, Oct, 2017));
1624     expectedHol.push_back(Date(4, Oct, 2017));
1625     expectedHol.push_back(Date(5, Oct, 2017));
1626     expectedHol.push_back(Date(6, Oct, 2017));
1627 
1628     // China Shanghai Securities Exchange holiday list in the year 2018
1629     expectedHol.push_back(Date(1, Jan, 2018));
1630     expectedHol.push_back(Date(15, Feb, 2018));
1631     expectedHol.push_back(Date(16, Feb, 2018));
1632     expectedHol.push_back(Date(19, Feb, 2018));
1633     expectedHol.push_back(Date(20, Feb, 2018));
1634     expectedHol.push_back(Date(21, Feb, 2018));
1635     expectedHol.push_back(Date(5, April, 2018));
1636     expectedHol.push_back(Date(6, April, 2018));
1637     expectedHol.push_back(Date(30, April, 2018));
1638     expectedHol.push_back(Date(1, May, 2018));
1639     expectedHol.push_back(Date(18, June, 2018));
1640     expectedHol.push_back(Date(24, September, 2018));
1641     expectedHol.push_back(Date(1, Oct, 2018));
1642     expectedHol.push_back(Date(2, Oct, 2018));
1643     expectedHol.push_back(Date(3, Oct, 2018));
1644     expectedHol.push_back(Date(4, Oct, 2018));
1645     expectedHol.push_back(Date(5, Oct, 2018));
1646     expectedHol.push_back(Date(31, December, 2018));
1647 
1648     // China Shanghai Securities Exchange holiday list in the year 2019
1649     expectedHol.push_back(Date(1, Jan, 2019));
1650     expectedHol.push_back(Date(4, Feb, 2019));
1651     expectedHol.push_back(Date(5, Feb, 2019));
1652     expectedHol.push_back(Date(6, Feb, 2019));
1653     expectedHol.push_back(Date(7, Feb, 2019));
1654     expectedHol.push_back(Date(8, Feb, 2019));
1655     expectedHol.push_back(Date(5, April, 2019));
1656     expectedHol.push_back(Date(1, May, 2019));
1657     expectedHol.push_back(Date(2, May, 2019));
1658     expectedHol.push_back(Date(3, May, 2019));
1659     expectedHol.push_back(Date(7, June, 2019));
1660     expectedHol.push_back(Date(13, September, 2019));
1661     expectedHol.push_back(Date(1, October, 2019));
1662     expectedHol.push_back(Date(2, October, 2019));
1663     expectedHol.push_back(Date(3, October, 2019));
1664     expectedHol.push_back(Date(4, October, 2019));
1665     expectedHol.push_back(Date(7, October, 2019));
1666 
1667     // China Shanghai Securities Exchange holiday list in the year 2020
1668     expectedHol.push_back(Date(1, Jan, 2020));
1669     expectedHol.push_back(Date(24, Jan, 2020));
1670     expectedHol.push_back(Date(27, Jan, 2020));
1671     expectedHol.push_back(Date(28, Jan, 2020));
1672     expectedHol.push_back(Date(29, Jan, 2020));
1673     expectedHol.push_back(Date(30, Jan, 2020));
1674     expectedHol.push_back(Date(31, Jan, 2020));
1675     expectedHol.push_back(Date(6, April, 2020));
1676     expectedHol.push_back(Date(1, May, 2020));
1677     expectedHol.push_back(Date(4, May, 2020));
1678     expectedHol.push_back(Date(5, May, 2020));
1679     expectedHol.push_back(Date(25, June, 2020));
1680     expectedHol.push_back(Date(26, June, 2020));
1681     expectedHol.push_back(Date(1, October, 2020));
1682     expectedHol.push_back(Date(2, October, 2020));
1683     expectedHol.push_back(Date(5, October, 2020));
1684     expectedHol.push_back(Date(6, October, 2020));
1685     expectedHol.push_back(Date(7, October, 2020));
1686     expectedHol.push_back(Date(8, October, 2020));
1687 
1688     Calendar c = China(China::SSE);
1689     std::vector<Date> hol = c.holidayList(Date(1, January, 2014), Date(31, December, 2020));
1690 
1691     for (Size i = 0; i < std::min<Size>(hol.size(), expectedHol.size()); i++) {
1692         if (hol[i] != expectedHol[i])
1693             BOOST_FAIL("expected holiday was " << expectedHol[i] << " while calculated holiday is "
1694                                                << hol[i]);
1695     }
1696     if (hol.size() != expectedHol.size())
1697         BOOST_FAIL("there were " << expectedHol.size() << " expected holidays, while there are "
1698                                  << hol.size() << " calculated holidays");
1699 }
1700 
testChinaIB()1701 void CalendarTest::testChinaIB() {
1702     BOOST_TEST_MESSAGE("Testing China Inter Bank working weekends list...");
1703 
1704     std::vector<Date> expectedWorkingWeekEnds;
1705 
1706     // China Inter Bank working weekends list in the year 2014
1707     expectedWorkingWeekEnds.push_back(Date(26, Jan, 2014));
1708     expectedWorkingWeekEnds.push_back(Date(8, Feb, 2014));
1709     expectedWorkingWeekEnds.push_back(Date(4, May, 2014));
1710     expectedWorkingWeekEnds.push_back(Date(28, Sep, 2014));
1711     expectedWorkingWeekEnds.push_back(Date(11, Oct, 2014));
1712 
1713     // China Inter Bank working weekends list in the year 2015
1714     expectedWorkingWeekEnds.push_back(Date(4, Jan, 2015));
1715     expectedWorkingWeekEnds.push_back(Date(15, Feb, 2015));
1716     expectedWorkingWeekEnds.push_back(Date(28, Feb, 2015));
1717     expectedWorkingWeekEnds.push_back(Date(6, Sep, 2015));
1718     expectedWorkingWeekEnds.push_back(Date(10, Oct, 2015));
1719 
1720     // China Inter Bank working weekends list in the year 2016
1721     expectedWorkingWeekEnds.push_back(Date(6, Feb, 2016));
1722     expectedWorkingWeekEnds.push_back(Date(14, Feb, 2016));
1723     expectedWorkingWeekEnds.push_back(Date(12, Jun, 2016));
1724     expectedWorkingWeekEnds.push_back(Date(18, Sep, 2016));
1725     expectedWorkingWeekEnds.push_back(Date(8, Oct, 2016));
1726     expectedWorkingWeekEnds.push_back(Date(9, Oct, 2016));
1727 
1728     // China Inter Bank working weekends list in the year 2017
1729     expectedWorkingWeekEnds.push_back(Date(22, Jan, 2017));
1730     expectedWorkingWeekEnds.push_back(Date(4, Feb, 2017));
1731     expectedWorkingWeekEnds.push_back(Date(1, April, 2017));
1732     expectedWorkingWeekEnds.push_back(Date(27, May, 2017));
1733     expectedWorkingWeekEnds.push_back(Date(30, Sep, 2017));
1734 
1735     // China Inter Bank working weekends list in the year 2018
1736     expectedWorkingWeekEnds.push_back(Date(11, Feb, 2018));
1737     expectedWorkingWeekEnds.push_back(Date(24, Feb, 2018));
1738     expectedWorkingWeekEnds.push_back(Date(8, April, 2018));
1739     expectedWorkingWeekEnds.push_back(Date(28, April, 2018));
1740     expectedWorkingWeekEnds.push_back(Date(29, Sep, 2018));
1741     expectedWorkingWeekEnds.push_back(Date(30, Sep, 2018));
1742     expectedWorkingWeekEnds.push_back(Date(29, December, 2018));
1743 
1744     // China Inter Bank working weekends list in the year 2019
1745     expectedWorkingWeekEnds.push_back(Date(2, Feb, 2019));
1746     expectedWorkingWeekEnds.push_back(Date(3, Feb, 2019));
1747     expectedWorkingWeekEnds.push_back(Date(28, April, 2019));
1748     expectedWorkingWeekEnds.push_back(Date(5, May, 2019));
1749     expectedWorkingWeekEnds.push_back(Date(29, September, 2019));
1750     expectedWorkingWeekEnds.push_back(Date(12, October, 2019));
1751 
1752     // China Inter Bank working weekends list in the year 2020
1753     expectedWorkingWeekEnds.push_back(Date(19, January, 2020));
1754     expectedWorkingWeekEnds.push_back(Date(26, April, 2020));
1755     expectedWorkingWeekEnds.push_back(Date(9, May, 2020));
1756     expectedWorkingWeekEnds.push_back(Date(28, June, 2020));
1757     expectedWorkingWeekEnds.push_back(Date(27, September, 2020));
1758     expectedWorkingWeekEnds.push_back(Date(10, October, 2020));
1759 
1760     Calendar c = China(China::IB);
1761     Date start(1, Jan, 2014);
1762     Date end(31, Dec, 2020);
1763 
1764     Size k = 0;
1765 
1766     while (start <= end) {
1767         if (c.isBusinessDay(start) && c.isWeekend(start.weekday())) {
1768             if (expectedWorkingWeekEnds[k] != start)
1769                 BOOST_FAIL("expected working weekend was "
1770                            << expectedWorkingWeekEnds[k] << " while calculated working weekend is "
1771                            << start);
1772             ++k;
1773         }
1774         ++start;
1775     }
1776 
1777     if (k != (expectedWorkingWeekEnds.size()))
1778         BOOST_FAIL("there were " << expectedWorkingWeekEnds.size()
1779                                  << " expected working weekends, while there are " << k
1780                                  << " calculated working weekends");
1781 }
1782 
testEndOfMonth()1783 void CalendarTest::testEndOfMonth() {
1784     BOOST_TEST_MESSAGE("Testing end-of-month calculation...");
1785 
1786     Calendar c = TARGET(); // any calendar would be OK
1787 
1788     Date eom, counter = Date::minDate();
1789     Date last = Date::maxDate() - 2 * Months;
1790 
1791     while (counter <= last) {
1792         eom = c.endOfMonth(counter);
1793         // check that eom is eom
1794         if (!c.isEndOfMonth(eom))
1795             BOOST_FAIL("\n  " << eom.weekday() << " " << eom << " is not the last business day in "
1796                               << eom.month() << " " << eom.year() << " according to " << c.name());
1797         // check that eom is in the same month as counter
1798         if (eom.month() != counter.month())
1799             BOOST_FAIL("\n  " << eom << " is not in the same month as " << counter);
1800         counter = counter + 1;
1801     }
1802 }
1803 
testBusinessDaysBetween()1804 void CalendarTest::testBusinessDaysBetween() {
1805 
1806     BOOST_TEST_MESSAGE("Testing calculation of business days between dates...");
1807 
1808     std::vector<Date> testDates;
1809     testDates.push_back(Date(1, February, 2002));  // isBusinessDay = true
1810     testDates.push_back(Date(4, February, 2002));  // isBusinessDay = true
1811     testDates.push_back(Date(16, May, 2003));      // isBusinessDay = true
1812     testDates.push_back(Date(17, December, 2003)); // isBusinessDay = true
1813     testDates.push_back(Date(17, December, 2004)); // isBusinessDay = true
1814     testDates.push_back(Date(19, December, 2005)); // isBusinessDay = true
1815     testDates.push_back(Date(2, January, 2006));   // isBusinessDay = true
1816     testDates.push_back(Date(13, March, 2006));    // isBusinessDay = true
1817     testDates.push_back(Date(15, May, 2006));      // isBusinessDay = true
1818     testDates.push_back(Date(17, March, 2006));    // isBusinessDay = true
1819     testDates.push_back(Date(15, May, 2006));      // isBusinessDay = true
1820     testDates.push_back(Date(26, July, 2006));     // isBusinessDay = true
1821     testDates.push_back(Date(26, July, 2006));     // isBusinessDay = true
1822     testDates.push_back(Date(27, July, 2006));     // isBusinessDay = true
1823     testDates.push_back(Date(29, July, 2006));     // isBusinessDay = false
1824     testDates.push_back(Date(29, July, 2006));     // isBusinessDay = false
1825 
1826     // default params: from date included, to excluded
1827     Date::serial_type expected[] = {1, 321, 152, 251, 252, 10, 48, 42, -38, 38, 51, 0, 1, 2, 0};
1828 
1829     // exclude from, include to
1830     Date::serial_type expected_include_to[] = {1,   321, 152, 251, 252, 10, 48, 42,
1831                                                -38, 38,  51,  0,   1,   1,  0};
1832 
1833     // include both from and to
1834     Date::serial_type expected_include_all[] = {2,   322, 153, 252, 253, 11, 49, 43,
1835                                                 -39, 39,  52,  1,   2,   2,  0};
1836 
1837     // exclude both from and to
1838     Date::serial_type expected_exclude_all[] = {0,   320, 151, 250, 251, 9, 47, 41,
1839                                                 -37, 37,  50,  0,   0,   1, 0};
1840 
1841     Calendar calendar = Brazil();
1842 
1843     for (Size i = 1; i < testDates.size(); i++) {
1844         Integer calculated =
1845             calendar.businessDaysBetween(testDates[i - 1], testDates[i], true, false);
1846         if (calculated != expected[i - 1]) {
1847             BOOST_ERROR("from " << testDates[i - 1] << " included"
1848                                 << " to " << testDates[i] << " excluded:\n"
1849                                 << "    calculated: " << calculated << "\n"
1850                                 << "    expected:   " << expected[i - 1]);
1851         }
1852 
1853         calculated = calendar.businessDaysBetween(testDates[i - 1], testDates[i], false, true);
1854         if (calculated != expected_include_to[i - 1]) {
1855             BOOST_ERROR("from " << testDates[i - 1] << " excluded"
1856                                 << " to " << testDates[i] << " included:\n"
1857                                 << "    calculated: " << calculated << "\n"
1858                                 << "    expected:   " << expected_include_to[i - 1]);
1859         }
1860 
1861         calculated = calendar.businessDaysBetween(testDates[i - 1], testDates[i], true, true);
1862         if (calculated != expected_include_all[i - 1]) {
1863             BOOST_ERROR("from " << testDates[i - 1] << " included"
1864                                 << " to " << testDates[i] << " included:\n"
1865                                 << "    calculated: " << calculated << "\n"
1866                                 << "    expected:   " << expected_include_all[i - 1]);
1867         }
1868 
1869         calculated = calendar.businessDaysBetween(testDates[i - 1], testDates[i], false, false);
1870         if (calculated != expected_exclude_all[i - 1]) {
1871             BOOST_ERROR("from " << testDates[i - 1] << " excluded"
1872                                 << " to " << testDates[i] << " excluded:\n"
1873                                 << "    calculated: " << calculated << "\n"
1874                                 << "    expected:   " << expected_exclude_all[i - 1]);
1875         }
1876     }
1877 }
1878 
1879 
testBespokeCalendars()1880 void CalendarTest::testBespokeCalendars() {
1881 
1882     BOOST_TEST_MESSAGE("Testing bespoke calendars...");
1883 
1884     BespokeCalendar a1;
1885     BespokeCalendar b1;
1886 
1887     Date testDate1 = Date(4, October, 2008); // Saturday
1888     Date testDate2 = Date(5, October, 2008); // Sunday
1889     Date testDate3 = Date(6, October, 2008); // Monday
1890     Date testDate4 = Date(7, October, 2008); // Tuesday
1891 
1892     if (!a1.isBusinessDay(testDate1))
1893         BOOST_ERROR(testDate1 << " erroneously detected as holiday");
1894     if (!a1.isBusinessDay(testDate2))
1895         BOOST_ERROR(testDate2 << " erroneously detected as holiday");
1896     if (!a1.isBusinessDay(testDate3))
1897         BOOST_ERROR(testDate3 << " erroneously detected as holiday");
1898     if (!a1.isBusinessDay(testDate4))
1899         BOOST_ERROR(testDate4 << " erroneously detected as holiday");
1900 
1901     if (!b1.isBusinessDay(testDate1))
1902         BOOST_ERROR(testDate1 << " erroneously detected as holiday");
1903     if (!b1.isBusinessDay(testDate2))
1904         BOOST_ERROR(testDate2 << " erroneously detected as holiday");
1905     if (!b1.isBusinessDay(testDate3))
1906         BOOST_ERROR(testDate3 << " erroneously detected as holiday");
1907     if (!b1.isBusinessDay(testDate4))
1908         BOOST_ERROR(testDate4 << " erroneously detected as holiday");
1909 
1910     a1.addWeekend(Sunday);
1911 
1912     if (!a1.isBusinessDay(testDate1))
1913         BOOST_ERROR(testDate1 << " erroneously detected as holiday");
1914     if (a1.isBusinessDay(testDate2))
1915         BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
1916     if (!a1.isBusinessDay(testDate3))
1917         BOOST_ERROR(testDate3 << " erroneously detected as holiday");
1918     if (!a1.isBusinessDay(testDate4))
1919         BOOST_ERROR(testDate4 << " erroneously detected as holiday");
1920 
1921     if (!b1.isBusinessDay(testDate1))
1922         BOOST_ERROR(testDate1 << " erroneously detected as holiday");
1923     if (!b1.isBusinessDay(testDate2))
1924         BOOST_ERROR(testDate2 << " erroneously detected as holiday");
1925     if (!b1.isBusinessDay(testDate3))
1926         BOOST_ERROR(testDate3 << " erroneously detected as holiday");
1927     if (!b1.isBusinessDay(testDate4))
1928         BOOST_ERROR(testDate4 << " erroneously detected as holiday");
1929 
1930     a1.addHoliday(testDate3);
1931 
1932     if (!a1.isBusinessDay(testDate1))
1933         BOOST_ERROR(testDate1 << " erroneously detected as holiday");
1934     if (a1.isBusinessDay(testDate2))
1935         BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
1936     if (a1.isBusinessDay(testDate3))
1937         BOOST_ERROR(testDate3 << " (marked as holiday) not detected");
1938     if (!a1.isBusinessDay(testDate4))
1939         BOOST_ERROR(testDate4 << " erroneously detected as holiday");
1940 
1941     if (!b1.isBusinessDay(testDate1))
1942         BOOST_ERROR(testDate1 << " erroneously detected as holiday");
1943     if (!b1.isBusinessDay(testDate2))
1944         BOOST_ERROR(testDate2 << " erroneously detected as holiday");
1945     if (!b1.isBusinessDay(testDate3))
1946         BOOST_ERROR(testDate3 << " erroneously detected as holiday");
1947     if (!b1.isBusinessDay(testDate4))
1948         BOOST_ERROR(testDate4 << " erroneously detected as holiday");
1949 
1950     BespokeCalendar a2 = a1; // linked to a1
1951 
1952     a2.addWeekend(Saturday);
1953 
1954     if (a1.isBusinessDay(testDate1))
1955         BOOST_ERROR(testDate1 << " (Saturday) not detected as weekend");
1956     if (a1.isBusinessDay(testDate2))
1957         BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
1958     if (a1.isBusinessDay(testDate3))
1959         BOOST_ERROR(testDate3 << " (marked as holiday) not detected");
1960     if (!a1.isBusinessDay(testDate4))
1961         BOOST_ERROR(testDate4 << " erroneously detected as holiday");
1962 
1963     if (a2.isBusinessDay(testDate1))
1964         BOOST_ERROR(testDate1 << " (Saturday) not detected as weekend");
1965     if (a2.isBusinessDay(testDate2))
1966         BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
1967     if (a2.isBusinessDay(testDate3))
1968         BOOST_ERROR(testDate3 << " (marked as holiday) not detected");
1969     if (!a2.isBusinessDay(testDate4))
1970         BOOST_ERROR(testDate4 << " erroneously detected as holiday");
1971 
1972     a2.addHoliday(testDate4);
1973 
1974     if (a1.isBusinessDay(testDate1))
1975         BOOST_ERROR(testDate1 << " (Saturday) not detected as weekend");
1976     if (a1.isBusinessDay(testDate2))
1977         BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
1978     if (a1.isBusinessDay(testDate3))
1979         BOOST_ERROR(testDate3 << " (marked as holiday) not detected");
1980     if (a1.isBusinessDay(testDate4))
1981         BOOST_ERROR(testDate4 << " (marked as holiday) not detected");
1982 
1983     if (a2.isBusinessDay(testDate1))
1984         BOOST_ERROR(testDate1 << " (Saturday) not detected as weekend");
1985     if (a2.isBusinessDay(testDate2))
1986         BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
1987     if (a2.isBusinessDay(testDate3))
1988         BOOST_ERROR(testDate3 << " (marked as holiday) not detected");
1989     if (a2.isBusinessDay(testDate4))
1990         BOOST_ERROR(testDate4 << " (marked as holiday) not detected");
1991 }
1992 
testIntradayAddHolidays()1993 void CalendarTest::testIntradayAddHolidays() {
1994 #ifdef QL_HIGH_RESOLUTION_DATE
1995     BOOST_TEST_MESSAGE("Testing addHolidays with enable-intraday...");
1996 
1997     // test cases taken from testModifiedCalendars
1998 
1999     Calendar c1 = TARGET();
2000     Calendar c2 = UnitedStates(UnitedStates::NYSE);
2001     Date d1(1, May, 2004);                // holiday for both calendars
2002     Date d2(26, April, 2004, 0, 0, 1, 1); // business day
2003 
2004     Date d1Mock(1, May, 2004, 1, 1, 0, 0); // holiday for both calendars
2005     Date d2Mock(26, April, 2004);          // business day
2006 
2007     // this works anyhow because implementation uses day() month() etc
2008     QL_REQUIRE(c1.isHoliday(d1), "wrong assumption---correct the test");
2009     QL_REQUIRE(c1.isBusinessDay(d2), "wrong assumption---correct the test");
2010 
2011     QL_REQUIRE(c2.isHoliday(d1), "wrong assumption---correct the test");
2012     QL_REQUIRE(c2.isBusinessDay(d2), "wrong assumption---correct the test");
2013 
2014     // now with different hourly/min/sec
2015     QL_REQUIRE(c1.isHoliday(d1Mock), "wrong assumption---correct the test");
2016     QL_REQUIRE(c1.isBusinessDay(d2Mock), "wrong assumption---correct the test");
2017 
2018     QL_REQUIRE(c2.isHoliday(d1Mock), "wrong assumption---correct the test");
2019     QL_REQUIRE(c2.isBusinessDay(d2Mock), "wrong assumption---correct the test");
2020 
2021 
2022     // modify the TARGET calendar
2023     c1.removeHoliday(d1);
2024     c1.addHoliday(d2);
2025 
2026     // test
2027     if (c1.isHoliday(d1))
2028         BOOST_FAIL(d1 << " still a holiday for original TARGET instance");
2029     if (c1.isBusinessDay(d2))
2030         BOOST_FAIL(d2 << " still a business day for original TARGET instance");
2031 
2032     if (c1.isHoliday(d1Mock))
2033         BOOST_FAIL(d1Mock << " still a holiday for original TARGET instance"
2034                           << " and different hours/min/secs");
2035     if (c1.isBusinessDay(d2Mock))
2036         BOOST_FAIL(d2Mock << " still a business day for generic TARGET instance"
2037                           << " and different hours/min/secs");
2038 
2039     // any instance of TARGET should be modified...
2040     Calendar c3 = TARGET();
2041     if (c3.isHoliday(d1))
2042         BOOST_FAIL(d1 << " still a holiday for generic TARGET instance");
2043     if (c3.isBusinessDay(d2))
2044         BOOST_FAIL(d2 << " still a business day for generic TARGET instance");
2045 
2046     if (c3.isHoliday(d1Mock))
2047         BOOST_FAIL(d1Mock << " still a holiday for original TARGET instance"
2048                           << " and different hours/min/secs");
2049     if (c3.isBusinessDay(d2Mock))
2050         BOOST_FAIL(d2Mock << " still a business day for generic TARGET instance"
2051                           << " and different hours/min/secs");
2052 
2053     // ...but not other calendars
2054     if (c2.isBusinessDay(d1))
2055         BOOST_FAIL(d1 << " business day for New York");
2056     if (c2.isHoliday(d2))
2057         BOOST_FAIL(d2 << " holiday for New York");
2058 
2059     if (c2.isBusinessDay(d1Mock))
2060         BOOST_FAIL(d1Mock << " business day for New York"
2061                           << " and different hours/min/secs");
2062     if (c2.isHoliday(d2Mock))
2063         BOOST_FAIL(d2Mock << " holiday for New York"
2064                           << " and different hours/min/secs");
2065 
2066     // restore original holiday set---test the other way around
2067     c3.addHoliday(d1Mock);
2068     c3.removeHoliday(d2Mock);
2069 
2070     if (c1.isBusinessDay(d1))
2071         BOOST_FAIL(d1 << " still a business day");
2072     if (c1.isHoliday(d2))
2073         BOOST_FAIL(d2 << " still a holiday");
2074 
2075     if (c1.isBusinessDay(d1Mock))
2076         BOOST_FAIL(d1Mock << " still a business day"
2077                           << " and different hours/min/secs");
2078     if (c1.isHoliday(d2Mock))
2079         BOOST_FAIL(d2Mock << " still a holiday and different hours/min/secs");
2080 
2081 #endif
2082 }
2083 
testDayLists()2084 void CalendarTest::testDayLists() {
2085 
2086     BOOST_TEST_MESSAGE("Testing holidayList and businessDaysList...");
2087     Calendar germany = Germany();
2088     Date firstDate = Settings::instance().evaluationDate(), endDate = firstDate + 1 * Years;
2089 
2090     std::vector<Date> holidays = germany.holidayList(firstDate, endDate, true);
2091     std::vector<Date> businessDays = germany.businessDayList(firstDate, endDate);
2092 
2093     std::vector<Date>::iterator it_holidays = holidays.begin(),
2094                                 it_businessDays = businessDays.begin();
2095     for (Date d = firstDate; d < endDate; d++) {
2096         if (it_holidays != holidays.end() && it_businessDays != businessDays.end() &&
2097             d == *it_holidays && d == *it_businessDays) {
2098             BOOST_FAIL("Date " << d << "is both holiday and business day.");
2099             ++it_holidays;
2100             ++it_businessDays;
2101         } else if (it_holidays != holidays.end() && d == *it_holidays) {
2102             ++it_holidays;
2103         } else if (it_businessDays != businessDays.end() && d == *it_businessDays) {
2104             ++it_businessDays;
2105         } else {
2106             BOOST_FAIL("Date " << d << "is neither holiday nor business day.");
2107         }
2108     }
2109 }
2110 
suite()2111 test_suite* CalendarTest::suite() {
2112     test_suite* suite = BOOST_TEST_SUITE("Calendar tests");
2113 
2114     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testBrazil));
2115     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testRussia));
2116 
2117     //    suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testItalySettlement));
2118     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testItalyExchange));
2119 
2120     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testUKSettlement));
2121     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testUKExchange));
2122     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testUKMetals));
2123 
2124     //    suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testGermanySettlement));
2125     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testGermanyFrankfurt));
2126     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testGermanyXetra));
2127     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testGermanyEurex));
2128 
2129     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testTARGET));
2130 
2131     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testUSSettlement));
2132     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testUSGovernmentBondMarket));
2133     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testUSNewYorkStockExchange));
2134 
2135     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testSouthKoreanSettlement));
2136     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testKoreaStockExchange));
2137 
2138     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testChinaSSE));
2139     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testChinaIB));
2140 
2141     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testModifiedCalendars));
2142     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testJointCalendars));
2143     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testBespokeCalendars));
2144 
2145     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testEndOfMonth));
2146     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testBusinessDaysBetween));
2147 
2148     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testIntradayAddHolidays));
2149     suite->add(QUANTLIB_TEST_CASE(&CalendarTest::testDayLists));
2150 
2151     return suite;
2152 }
2153