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