00001
00011 #include "scalt1.hpp"
00012
00013 #include "utilities.hpp"
00014 #include <ql/time/calendar.hpp>
00015 #include <ql/time/calendars/brazil.hpp>
00016 #include <ql/time/calendars/germany.hpp>
00017 #include <ql/time/calendars/italy.hpp>
00018 #include <ql/time/calendars/target.hpp>
00019 #include <ql/time/calendars/unitedkingdom.hpp>
00020 #include <ql/time/calendars/unitedstates.hpp>
00021 #include <ql/time/calendars/japan.hpp>
00022 #include <ql/time/calendars/jointcalendar.hpp>
00023 #include <ql/time/calendars/bespokecalendar.hpp>
00024 #include <ql/errors.hpp>
00025 #include <fstream>
00026
00027 using namespace QuantLib;
00028 using namespace boost::unit_test_framework;
00029
00030 BOOST_AUTO_TEST_SUITE(qlcal)
00031
00032 BOOST_AUTO_TEST_CASE( modified )
00033 {
00034 BOOST_MESSAGE("Testing calendar modification...");
00035
00036 Calendar c1 = TARGET();
00037 Calendar c2 = UnitedStates(UnitedStates::NYSE);
00038 Date d1(1,May,2004);
00039 Date d2(26,April,2004);
00040
00041 QL_REQUIRE(c1.isHoliday(d1), "wrong assumption---correct the test");
00042 QL_REQUIRE(c1.isBusinessDay(d2), "wrong assumption---correct the test");
00043
00044 QL_REQUIRE(c2.isHoliday(d1), "wrong assumption---correct the test");
00045 QL_REQUIRE(c2.isBusinessDay(d2), "wrong assumption---correct the test");
00046
00047
00048 c1.removeHoliday(d1);
00049 c1.addHoliday(d2);
00050
00051
00052 if (c1.isHoliday(d1))
00053 BOOST_FAIL(d1 << " still a holiday for original TARGET instance");
00054 if (c1.isBusinessDay(d2))
00055 BOOST_FAIL(d2 << " still a business day for original TARGET instance");
00056
00057
00058 Calendar c3 = TARGET();
00059 if (c3.isHoliday(d1))
00060 BOOST_FAIL(d1 << " still a holiday for generic TARGET instance");
00061 if (c3.isBusinessDay(d2))
00062 BOOST_FAIL(d2 << " still a business day for generic TARGET instance");
00063
00064
00065 if (c2.isBusinessDay(d1))
00066 BOOST_FAIL(d1 << " business day for New York");
00067 if (c2.isHoliday(d2))
00068 BOOST_FAIL(d2 << " holiday for New York");
00069
00070
00071 c3.addHoliday(d1);
00072 c3.removeHoliday(d2);
00073
00074 if (c1.isBusinessDay(d1))
00075 BOOST_FAIL(d1 << " still a business day");
00076 if (c1.isHoliday(d2))
00077 BOOST_FAIL(d2 << " still a holiday");
00078 }
00079
00080 BOOST_AUTO_TEST_CASE( joint )
00081 {
00082 BOOST_MESSAGE("Testing joint calendars...");
00083
00084 Calendar c1 = TARGET(),
00085 c2 = UnitedKingdom(),
00086 c3 = UnitedStates(UnitedStates::NYSE),
00087 c4 = Japan();
00088
00089 Calendar c12h = JointCalendar(c1,c2,JoinHolidays),
00090 c12b = JointCalendar(c1,c2,JoinBusinessDays),
00091 c123h = JointCalendar(c1,c2,c3,JoinHolidays),
00092 c123b = JointCalendar(c1,c2,c3,JoinBusinessDays),
00093 c1234h = JointCalendar(c1,c2,c3,c4,JoinHolidays),
00094 c1234b = JointCalendar(c1,c2,c3,c4,JoinBusinessDays);
00095
00096
00097 Date firstDate = Date::todaysDate(),
00098 endDate = firstDate + 1*Years;
00099
00100 for (Date d = firstDate; d < endDate; d++) {
00101
00102 bool b1 = c1.isBusinessDay(d),
00103 b2 = c2.isBusinessDay(d),
00104 b3 = c3.isBusinessDay(d),
00105 b4 = c4.isBusinessDay(d);
00106
00107 if ((b1 && b2) != c12h.isBusinessDay(d))
00108 BOOST_FAIL("At date " << d << ":\n"
00109 << " inconsistency between joint calendar "
00110 << c12h.name() << " (joining holidays)\n"
00111 << " and its components");
00112
00113 if ((b1 || b2) != c12b.isBusinessDay(d))
00114 BOOST_FAIL("At date " << d << ":\n"
00115 << " inconsistency between joint calendar "
00116 << c12b.name() << " (joining business days)\n"
00117 << " and its components");
00118
00119 if ((b1 && b2 && b3) != c123h.isBusinessDay(d))
00120 BOOST_FAIL("At date " << d << ":\n"
00121 << " inconsistency between joint calendar "
00122 << c123h.name() << " (joining holidays)\n"
00123 << " and its components");
00124
00125 if ((b1 || b2 || b3) != c123b.isBusinessDay(d))
00126 BOOST_FAIL("At date " << d << ":\n"
00127 << " inconsistency between joint calendar "
00128 << c123b.name() << " (joining business days)\n"
00129 << " and its components");
00130
00131 if ((b1 && b2 && b3 && b4) != c1234h.isBusinessDay(d))
00132 BOOST_FAIL("At date " << d << ":\n"
00133 << " inconsistency between joint calendar "
00134 << c1234h.name() << " (joining holidays)\n"
00135 << " and its components");
00136
00137 if ((b1 || b2 || b3 || b4) != c1234b.isBusinessDay(d))
00138 BOOST_FAIL("At date " << d << ":\n"
00139 << " inconsistency between joint calendar "
00140 << c1234b.name() << " (joining business days)\n"
00141 << " and its components");
00142
00143 }
00144 }
00145
00146 BOOST_AUTO_TEST_CASE( ussettlement )
00147 {
00148 BOOST_MESSAGE("Testing US settlement holiday list...");
00149
00150 std::vector<Date> expectedHol;
00151 expectedHol.push_back(Date(1,January,2004));
00152 expectedHol.push_back(Date(19,January,2004));
00153 expectedHol.push_back(Date(16,February,2004));
00154 expectedHol.push_back(Date(31,May,2004));
00155 expectedHol.push_back(Date(5,July,2004));
00156 expectedHol.push_back(Date(6,September,2004));
00157 expectedHol.push_back(Date(11,October,2004));
00158 expectedHol.push_back(Date(11,November,2004));
00159 expectedHol.push_back(Date(25,November,2004));
00160 expectedHol.push_back(Date(24,December,2004));
00161
00162 expectedHol.push_back(Date(31,December,2004));
00163 expectedHol.push_back(Date(17,January,2005));
00164 expectedHol.push_back(Date(21,February,2005));
00165 expectedHol.push_back(Date(30,May,2005));
00166 expectedHol.push_back(Date(4,July,2005));
00167 expectedHol.push_back(Date(5,September,2005));
00168 expectedHol.push_back(Date(10,October,2005));
00169 expectedHol.push_back(Date(11,November,2005));
00170 expectedHol.push_back(Date(24,November,2005));
00171 expectedHol.push_back(Date(26,December,2005));
00172
00173 Calendar c = UnitedStates(UnitedStates::Settlement);
00174 std::vector<Date> hol = Calendar::holidayList(c, Date( 1, January, 2004),
00175 Date(31,December, 2005));
00176 for (Size i=0; i<std::min<Size>(hol.size(), expectedHol.size()); i++) {
00177 if (hol[i]!=expectedHol[i])
00178 BOOST_FAIL("expected holiday was " << expectedHol[i]
00179 << " while calculated holiday is " << hol[i]);
00180 }
00181 if (hol.size()!=expectedHol.size())
00182 BOOST_FAIL("there were " << expectedHol.size()
00183 << " expected holidays, while there are " << hol.size()
00184 << " calculated holidays");
00185 }
00186
00187 BOOST_AUTO_TEST_CASE( usbond )
00188 {
00189 BOOST_MESSAGE("Testing US government bond market holiday list...");
00190
00191 std::vector<Date> expectedHol;
00192 expectedHol.push_back(Date(1,January,2004));
00193 expectedHol.push_back(Date(19,January,2004));
00194 expectedHol.push_back(Date(16,February,2004));
00195 expectedHol.push_back(Date(9,April,2004));
00196 expectedHol.push_back(Date(31,May,2004));
00197 expectedHol.push_back(Date(5,July,2004));
00198 expectedHol.push_back(Date(6,September,2004));
00199 expectedHol.push_back(Date(11,October,2004));
00200 expectedHol.push_back(Date(11,November,2004));
00201 expectedHol.push_back(Date(25,November,2004));
00202 expectedHol.push_back(Date(24,December,2004));
00203
00204 Calendar c = UnitedStates(UnitedStates::GovernmentBond);
00205 std::vector<Date> hol = Calendar::holidayList(c, Date(1,January,2004),
00206 Date(31,December,2004));
00207
00208 for (Size i=0; i<std::min<Size>(hol.size(), expectedHol.size()); i++) {
00209 if (hol[i]!=expectedHol[i])
00210 BOOST_FAIL("expected holiday was " << expectedHol[i]
00211 << " while calculated holiday is " << hol[i]);
00212 }
00213 if (hol.size()!=expectedHol.size())
00214 BOOST_FAIL("there were " << expectedHol.size()
00215 << " expected holidays, while there are " << hol.size()
00216 << " calculated holidays");
00217 }
00218
00219 BOOST_AUTO_TEST_CASE( usexchange )
00220 {
00221 BOOST_MESSAGE("Testing New York Stock Exchange holiday list...");
00222
00223 std::vector<Date> expectedHol;
00224 expectedHol.push_back(Date(1,January,2004));
00225 expectedHol.push_back(Date(19,January,2004));
00226 expectedHol.push_back(Date(16,February,2004));
00227 expectedHol.push_back(Date(9,April,2004));
00228 expectedHol.push_back(Date(31,May,2004));
00229 expectedHol.push_back(Date(11,June,2004));
00230 expectedHol.push_back(Date(5,July,2004));
00231 expectedHol.push_back(Date(6,September,2004));
00232 expectedHol.push_back(Date(25,November,2004));
00233 expectedHol.push_back(Date(24,December,2004));
00234
00235 expectedHol.push_back(Date(17,January,2005));
00236 expectedHol.push_back(Date(21,February,2005));
00237 expectedHol.push_back(Date(25,March,2005));
00238 expectedHol.push_back(Date(30,May,2005));
00239 expectedHol.push_back(Date(4,July,2005));
00240 expectedHol.push_back(Date(5,September,2005));
00241 expectedHol.push_back(Date(24,November,2005));
00242 expectedHol.push_back(Date(26,December,2005));
00243
00244 expectedHol.push_back(Date(2,January,2006));
00245 expectedHol.push_back(Date(16,January,2006));
00246 expectedHol.push_back(Date(20,February,2006));
00247 expectedHol.push_back(Date(14,April,2006));
00248 expectedHol.push_back(Date(29,May,2006));
00249 expectedHol.push_back(Date(4,July,2006));
00250 expectedHol.push_back(Date(4,September,2006));
00251 expectedHol.push_back(Date(23,November,2006));
00252 expectedHol.push_back(Date(25,December,2006));
00253
00254 Calendar c = UnitedStates(UnitedStates::NYSE);
00255 std::vector<Date> hol = Calendar::holidayList(c, Date(1,January,2004),
00256 Date(31,December,2006));
00257
00258 Size i;
00259 for (i=0; i<std::min<Size>(hol.size(), expectedHol.size()); i++) {
00260 if (hol[i]!=expectedHol[i])
00261 BOOST_FAIL("expected holiday was " << expectedHol[i]
00262 << " while calculated holiday is " << hol[i]);
00263 }
00264 if (hol.size()!=expectedHol.size())
00265 BOOST_FAIL("there were " << expectedHol.size()
00266 << " expected holidays, while there are " << hol.size()
00267 << " calculated holidays");
00268
00269 std::vector<Date> histClose;
00270 histClose.push_back(Date(11,June,2004));
00271 histClose.push_back(Date(14,September,2001));
00272 histClose.push_back(Date(13,September,2001));
00273 histClose.push_back(Date(12,September,2001));
00274 histClose.push_back(Date(11,September,2001));
00275 histClose.push_back(Date(14,July,1977));
00276 histClose.push_back(Date(25,January,1973));
00277 histClose.push_back(Date(28,December,1972));
00278 histClose.push_back(Date(21,July,1969));
00279 histClose.push_back(Date(31,March,1969));
00280 histClose.push_back(Date(10,February,1969));
00281 histClose.push_back(Date(5,July,1968));
00282
00283
00284 histClose.push_back(Date(12,Jun,1968));
00285 histClose.push_back(Date(19,Jun,1968));
00286 histClose.push_back(Date(26,Jun,1968));
00287 histClose.push_back(Date(3,Jul,1968 ));
00288 histClose.push_back(Date(10,Jul,1968));
00289 histClose.push_back(Date(17,Jul,1968));
00290 histClose.push_back(Date(20,Nov,1968));
00291 histClose.push_back(Date(27,Nov,1968));
00292 histClose.push_back(Date(4,Dec,1968 ));
00293 histClose.push_back(Date(11,Dec,1968));
00294 histClose.push_back(Date(18,Dec,1968));
00295
00296 histClose.push_back(Date(4,Nov,1980));
00297 histClose.push_back(Date(2,Nov,1976));
00298 histClose.push_back(Date(7,Nov,1972));
00299 histClose.push_back(Date(5,Nov,1968));
00300 histClose.push_back(Date(3,Nov,1964));
00301 for (i=0; i<histClose.size(); i++) {
00302 if (!c.isHoliday(histClose[i]))
00303 BOOST_FAIL(histClose[i]
00304 << " should be holiday (historical close)");
00305 }
00306
00307
00308 }
00309
00310 BOOST_AUTO_TEST_CASE( Target )
00311 {
00312 BOOST_MESSAGE("Testing TARGET holiday list...");
00313
00314 std::vector<Date> expectedHol;
00315 expectedHol.push_back(Date(1,January,1999));
00316 expectedHol.push_back(Date(31,December,1999));
00317
00318 expectedHol.push_back(Date(21,April,2000));
00319 expectedHol.push_back(Date(24,April,2000));
00320 expectedHol.push_back(Date(1,May,2000));
00321 expectedHol.push_back(Date(25,December,2000));
00322 expectedHol.push_back(Date(26,December,2000));
00323
00324 expectedHol.push_back(Date(1,January,2001));
00325 expectedHol.push_back(Date(13,April,2001));
00326 expectedHol.push_back(Date(16,April,2001));
00327 expectedHol.push_back(Date(1,May,2001));
00328 expectedHol.push_back(Date(25,December,2001));
00329 expectedHol.push_back(Date(26,December,2001));
00330 expectedHol.push_back(Date(31,December,2001));
00331
00332 expectedHol.push_back(Date(1,January,2002));
00333 expectedHol.push_back(Date(29,March,2002));
00334 expectedHol.push_back(Date(1,April,2002));
00335 expectedHol.push_back(Date(1,May,2002));
00336 expectedHol.push_back(Date(25,December,2002));
00337 expectedHol.push_back(Date(26,December,2002));
00338
00339 expectedHol.push_back(Date(1,January,2003));
00340 expectedHol.push_back(Date(18,April,2003));
00341 expectedHol.push_back(Date(21,April,2003));
00342 expectedHol.push_back(Date(1,May,2003));
00343 expectedHol.push_back(Date(25,December,2003));
00344 expectedHol.push_back(Date(26,December,2003));
00345
00346 expectedHol.push_back(Date(1,January,2004));
00347 expectedHol.push_back(Date(9,April,2004));
00348 expectedHol.push_back(Date(12,April,2004));
00349
00350 expectedHol.push_back(Date(25,March,2005));
00351 expectedHol.push_back(Date(28,March,2005));
00352 expectedHol.push_back(Date(26,December,2005));
00353
00354 expectedHol.push_back(Date(14,April,2006));
00355 expectedHol.push_back(Date(17,April,2006));
00356 expectedHol.push_back(Date(1,May,2006));
00357 expectedHol.push_back(Date(25,December,2006));
00358 expectedHol.push_back(Date(26,December,2006));
00359
00360 Calendar c = TARGET();
00361 std::vector<Date> hol = Calendar::holidayList(c, Date(1,January,1999),
00362 Date(31,December,2006));
00363
00364 for (Size i=0; i<std::min<Size>(hol.size(), expectedHol.size()); i++) {
00365 if (hol[i]!=expectedHol[i])
00366 BOOST_FAIL("expected holiday was " << expectedHol[i]
00367 << " while calculated holiday is " << hol[i]);
00368 }
00369 if (hol.size()!=expectedHol.size())
00370 BOOST_FAIL("there were " << expectedHol.size()
00371 << " expected holidays, while there are " << hol.size()
00372 << " calculated holidays");
00373
00374 }
00375
00376 BOOST_AUTO_TEST_CASE( Frankfurt )
00377 {
00378 BOOST_MESSAGE("Testing Frankfurt Stock Exchange holiday list...");
00379
00380 std::vector<Date> expectedHol;
00381
00382 expectedHol.push_back(Date(1,January,2003));
00383 expectedHol.push_back(Date(18,April,2003));
00384 expectedHol.push_back(Date(21,April,2003));
00385 expectedHol.push_back(Date(1,May,2003));
00386 expectedHol.push_back(Date(24,December,2003));
00387 expectedHol.push_back(Date(25,December,2003));
00388 expectedHol.push_back(Date(26,December,2003));
00389 expectedHol.push_back(Date(31,December,2003));
00390
00391 expectedHol.push_back(Date(1,January,2004));
00392 expectedHol.push_back(Date(9,April,2004));
00393 expectedHol.push_back(Date(12,April,2004));
00394 expectedHol.push_back(Date(24,December,2004));
00395 expectedHol.push_back(Date(31,December,2004));
00396
00397 Calendar c = Germany(Germany::FrankfurtStockExchange);
00398 std::vector<Date> hol = Calendar::holidayList(c, Date(1,January,2003),
00399 Date(31,December,2004));
00400 for (Size i=0; i<std::min<Size>(hol.size(), expectedHol.size()); i++) {
00401 if (hol[i]!=expectedHol[i])
00402 BOOST_FAIL("expected holiday was " << expectedHol[i]
00403 << " while calculated holiday is " << hol[i]);
00404 }
00405 if (hol.size()!=expectedHol.size())
00406 BOOST_FAIL("there were " << expectedHol.size()
00407 << " expected holidays, while there are " << hol.size()
00408 << " calculated holidays");
00409 }
00410
00411 BOOST_AUTO_TEST_CASE( Eurex )
00412 {
00413 BOOST_MESSAGE("Testing Eurex holiday list...");
00414
00415 std::vector<Date> expectedHol;
00416
00417 expectedHol.push_back(Date(1,January,2003));
00418 expectedHol.push_back(Date(18,April,2003));
00419 expectedHol.push_back(Date(21,April,2003));
00420 expectedHol.push_back(Date(1,May,2003));
00421 expectedHol.push_back(Date(24,December,2003));
00422 expectedHol.push_back(Date(25,December,2003));
00423 expectedHol.push_back(Date(26,December,2003));
00424 expectedHol.push_back(Date(31,December,2003));
00425
00426 expectedHol.push_back(Date(1,January,2004));
00427 expectedHol.push_back(Date(9,April,2004));
00428 expectedHol.push_back(Date(12,April,2004));
00429 expectedHol.push_back(Date(24,December,2004));
00430 expectedHol.push_back(Date(31,December,2004));
00431
00432 Calendar c = Germany(Germany::Eurex);
00433 std::vector<Date> hol = Calendar::holidayList(c, Date(1,January,2003),
00434 Date(31,December,2004));
00435 for (Size i=0; i<std::min<Size>(hol.size(), expectedHol.size()); i++) {
00436 if (hol[i]!=expectedHol[i])
00437 BOOST_FAIL("expected holiday was " << expectedHol[i]
00438 << " while calculated holiday is " << hol[i]);
00439 }
00440 if (hol.size()!=expectedHol.size())
00441 BOOST_FAIL("there were " << expectedHol.size()
00442 << " expected holidays, while there are " << hol.size()
00443 << " calculated holidays");
00444 }
00445
00446 BOOST_AUTO_TEST_CASE( Xetra )
00447 {
00448 BOOST_MESSAGE("Testing Xetra holiday list...");
00449
00450 std::vector<Date> expectedHol;
00451
00452 expectedHol.push_back(Date(1,January,2003));
00453 expectedHol.push_back(Date(18,April,2003));
00454 expectedHol.push_back(Date(21,April,2003));
00455 expectedHol.push_back(Date(1,May,2003));
00456 expectedHol.push_back(Date(24,December,2003));
00457 expectedHol.push_back(Date(25,December,2003));
00458 expectedHol.push_back(Date(26,December,2003));
00459 expectedHol.push_back(Date(31,December,2003));
00460
00461 expectedHol.push_back(Date(1,January,2004));
00462 expectedHol.push_back(Date(9,April,2004));
00463 expectedHol.push_back(Date(12,April,2004));
00464 expectedHol.push_back(Date(24,December,2004));
00465 expectedHol.push_back(Date(31,December,2004));
00466
00467 Calendar c = Germany(Germany::Xetra);
00468 std::vector<Date> hol = Calendar::holidayList(c, Date(1,January,2003),
00469 Date(31,December,2004));
00470 for (Size i=0; i<std::min<Size>(hol.size(), expectedHol.size()); i++) {
00471 if (hol[i]!=expectedHol[i])
00472 BOOST_FAIL("expected holiday was " << expectedHol[i]
00473 << " while calculated holiday is " << hol[i]);
00474 }
00475 if (hol.size()!=expectedHol.size())
00476 BOOST_FAIL("there were " << expectedHol.size()
00477 << " expected holidays, while there are " << hol.size()
00478 << " calculated holidays");
00479 }
00480
00481 BOOST_AUTO_TEST_CASE( uksettlement )
00482 {
00483 BOOST_MESSAGE("Testing UK settlement holiday list...");
00484
00485 std::vector<Date> expectedHol;
00486
00487 expectedHol.push_back(Date(1,January,2004));
00488 expectedHol.push_back(Date(9,April,2004));
00489 expectedHol.push_back(Date(12,April,2004));
00490 expectedHol.push_back(Date(3,May,2004));
00491 expectedHol.push_back(Date(31,May,2004));
00492 expectedHol.push_back(Date(30,August,2004));
00493 expectedHol.push_back(Date(27,December,2004));
00494 expectedHol.push_back(Date(28,December,2004));
00495
00496 expectedHol.push_back(Date(3,January,2005));
00497 expectedHol.push_back(Date(25,March,2005));
00498 expectedHol.push_back(Date(28,March,2005));
00499 expectedHol.push_back(Date(2,May,2005));
00500 expectedHol.push_back(Date(30,May,2005));
00501 expectedHol.push_back(Date(29,August,2005));
00502 expectedHol.push_back(Date(26,December,2005));
00503 expectedHol.push_back(Date(27,December,2005));
00504
00505 expectedHol.push_back(Date(2,January,2006));
00506 expectedHol.push_back(Date(14,April,2006));
00507 expectedHol.push_back(Date(17,April,2006));
00508 expectedHol.push_back(Date(1,May,2006));
00509 expectedHol.push_back(Date(29,May,2006));
00510 expectedHol.push_back(Date(28,August,2006));
00511 expectedHol.push_back(Date(25,December,2006));
00512 expectedHol.push_back(Date(26,December,2006));
00513
00514 expectedHol.push_back(Date(1,January,2007));
00515 expectedHol.push_back(Date(6,April,2007));
00516 expectedHol.push_back(Date(9,April,2007));
00517 expectedHol.push_back(Date(7,May,2007));
00518 expectedHol.push_back(Date(28,May,2007));
00519 expectedHol.push_back(Date(27,August,2007));
00520 expectedHol.push_back(Date(25,December,2007));
00521 expectedHol.push_back(Date(26,December,2007));
00522
00523 Calendar c = UnitedKingdom(UnitedKingdom::Settlement);
00524 std::vector<Date> hol = Calendar::holidayList(c, Date(1,January,2004),
00525 Date(31,December,2007));
00526 for (Size i=0; i<std::min<Size>(hol.size(), expectedHol.size()); i++) {
00527 if (hol[i]!=expectedHol[i])
00528 BOOST_FAIL("expected holiday was " << expectedHol[i]
00529 << " while calculated holiday is " << hol[i]);
00530 }
00531 if (hol.size()!=expectedHol.size())
00532 BOOST_FAIL("there were " << expectedHol.size()
00533 << " expected holidays, while there are " << hol.size()
00534 << " calculated holidays");
00535 }
00536
00537 BOOST_AUTO_TEST_CASE( ukexchange )
00538 {
00539 BOOST_MESSAGE("Testing London Stock Exchange holiday list...");
00540
00541 std::vector<Date> expectedHol;
00542
00543 expectedHol.push_back(Date(1,January,2004));
00544 expectedHol.push_back(Date(9,April,2004));
00545 expectedHol.push_back(Date(12,April,2004));
00546 expectedHol.push_back(Date(3,May,2004));
00547 expectedHol.push_back(Date(31,May,2004));
00548 expectedHol.push_back(Date(30,August,2004));
00549 expectedHol.push_back(Date(27,December,2004));
00550 expectedHol.push_back(Date(28,December,2004));
00551
00552 expectedHol.push_back(Date(3,January,2005));
00553 expectedHol.push_back(Date(25,March,2005));
00554 expectedHol.push_back(Date(28,March,2005));
00555 expectedHol.push_back(Date(2,May,2005));
00556 expectedHol.push_back(Date(30,May,2005));
00557 expectedHol.push_back(Date(29,August,2005));
00558 expectedHol.push_back(Date(26,December,2005));
00559 expectedHol.push_back(Date(27,December,2005));
00560
00561 expectedHol.push_back(Date(2,January,2006));
00562 expectedHol.push_back(Date(14,April,2006));
00563 expectedHol.push_back(Date(17,April,2006));
00564 expectedHol.push_back(Date(1,May,2006));
00565 expectedHol.push_back(Date(29,May,2006));
00566 expectedHol.push_back(Date(28,August,2006));
00567 expectedHol.push_back(Date(25,December,2006));
00568 expectedHol.push_back(Date(26,December,2006));
00569
00570 expectedHol.push_back(Date(1,January,2007));
00571 expectedHol.push_back(Date(6,April,2007));
00572 expectedHol.push_back(Date(9,April,2007));
00573 expectedHol.push_back(Date(7,May,2007));
00574 expectedHol.push_back(Date(28,May,2007));
00575 expectedHol.push_back(Date(27,August,2007));
00576 expectedHol.push_back(Date(25,December,2007));
00577 expectedHol.push_back(Date(26,December,2007));
00578
00579 Calendar c = UnitedKingdom(UnitedKingdom::Exchange);
00580 std::vector<Date> hol = Calendar::holidayList(c, Date(1,January,2004),
00581 Date(31,December,2007));
00582 for (Size i=0; i<std::min<Size>(hol.size(), expectedHol.size()); i++) {
00583 if (hol[i]!=expectedHol[i])
00584 BOOST_FAIL("expected holiday was " << expectedHol[i]
00585 << " while calculated holiday is " << hol[i]);
00586 }
00587 if (hol.size()!=expectedHol.size())
00588 BOOST_FAIL("there were " << expectedHol.size()
00589 << " expected holidays, while there are " << hol.size()
00590 << " calculated holidays");
00591 }
00592
00593
00594 BOOST_AUTO_TEST_CASE( ukmetals )
00595 {
00596 BOOST_MESSAGE("Testing London Metals Exchange holiday list...");
00597
00598 std::vector<Date> expectedHol;
00599
00600 expectedHol.push_back(Date(1,January,2004));
00601 expectedHol.push_back(Date(9,April,2004));
00602 expectedHol.push_back(Date(12,April,2004));
00603 expectedHol.push_back(Date(3,May,2004));
00604 expectedHol.push_back(Date(31,May,2004));
00605 expectedHol.push_back(Date(30,August,2004));
00606 expectedHol.push_back(Date(27,December,2004));
00607 expectedHol.push_back(Date(28,December,2004));
00608
00609 expectedHol.push_back(Date(3,January,2005));
00610 expectedHol.push_back(Date(25,March,2005));
00611 expectedHol.push_back(Date(28,March,2005));
00612 expectedHol.push_back(Date(2,May,2005));
00613 expectedHol.push_back(Date(30,May,2005));
00614 expectedHol.push_back(Date(29,August,2005));
00615 expectedHol.push_back(Date(26,December,2005));
00616 expectedHol.push_back(Date(27,December,2005));
00617
00618 expectedHol.push_back(Date(2,January,2006));
00619 expectedHol.push_back(Date(14,April,2006));
00620 expectedHol.push_back(Date(17,April,2006));
00621 expectedHol.push_back(Date(1,May,2006));
00622 expectedHol.push_back(Date(29,May,2006));
00623 expectedHol.push_back(Date(28,August,2006));
00624 expectedHol.push_back(Date(25,December,2006));
00625 expectedHol.push_back(Date(26,December,2006));
00626
00627 expectedHol.push_back(Date(1,January,2007));
00628 expectedHol.push_back(Date(6,April,2007));
00629 expectedHol.push_back(Date(9,April,2007));
00630 expectedHol.push_back(Date(7,May,2007));
00631 expectedHol.push_back(Date(28,May,2007));
00632 expectedHol.push_back(Date(27,August,2007));
00633 expectedHol.push_back(Date(25,December,2007));
00634 expectedHol.push_back(Date(26,December,2007));
00635
00636 Calendar c = UnitedKingdom(UnitedKingdom::Metals);
00637 std::vector<Date> hol = Calendar::holidayList(c, Date(1,January,2004),
00638 Date(31,December,2007));
00639 for (Size i=0; i<std::min<Size>(hol.size(), expectedHol.size()); i++) {
00640 if (hol[i]!=expectedHol[i])
00641 BOOST_FAIL("expected holiday was " << expectedHol[i]
00642 << " while calculated holiday is " << hol[i]);
00643 }
00644 if (hol.size()!=expectedHol.size())
00645 BOOST_FAIL("there were " << expectedHol.size()
00646 << " expected holidays, while there are " << hol.size()
00647 << " calculated holidays");
00648 }
00649
00650
00651 BOOST_AUTO_TEST_CASE( endofmonth )
00652 {
00653 BOOST_MESSAGE("Testing end-of-month calculation...");
00654
00655 Calendar c = TARGET();
00656
00657 Date eom, counter = Date::minDate();
00658 Date last = Date::maxDate() - 2*Months;
00659
00660 while (counter<=last) {
00661 eom = c.endOfMonth(counter);
00662
00663 if (!c.isEndOfMonth(eom))
00664 BOOST_FAIL("\n "
00665 << eom.weekday() << " " << eom
00666 << " is not the last business day in "
00667 << eom.month() << " " << eom.year()
00668 << " according to " << c.name());
00669
00670 if (eom.month()!=counter.month())
00671 BOOST_FAIL("\n "
00672 << eom
00673 << " is not in the same month as "
00674 << counter);
00675 counter = counter + 1;
00676 }
00677 }
00678
00679 BOOST_AUTO_TEST_CASE( between )
00680 {
00681 BOOST_MESSAGE("Testing calculation of business days between dates...");
00682
00683 std::vector<Date> testDates;
00684 testDates.push_back(Date(1,February,2002));
00685 testDates.push_back(Date(4,February,2002));
00686 testDates.push_back(Date(16,May,2003));
00687 testDates.push_back(Date(17,December,2003));
00688 testDates.push_back(Date(17,December,2004));
00689 testDates.push_back(Date(19,December,2005));
00690 testDates.push_back(Date(2,January,2006));
00691 testDates.push_back(Date(13,March,2006));
00692 testDates.push_back(Date(15,May,2006));
00693 testDates.push_back(Date(17,March,2006));
00694 testDates.push_back(Date(15,May,2006));
00695 testDates.push_back(Date(26,July,2006));
00696
00697 BigInteger expected[] = {
00698 1,
00699 321,
00700 152,
00701 251,
00702 252,
00703 10,
00704 48,
00705 42,
00706 -38,
00707 38,
00708 51
00709 };
00710
00711 Calendar calendar = Brazil();
00712
00713 for (Size i=1; i<testDates.size(); i++) {
00714 Integer calculated = calendar.businessDaysBetween(testDates[i-1],
00715 testDates[i]);
00716 if (calculated != expected[i-1]) {
00717 BOOST_ERROR("from " << testDates[i-1]
00718 << " to " << testDates[i] << ":\n"
00719 << " calculated: " << calculated << "\n"
00720 << " expected: " << expected[i-1]);
00721 }
00722 }
00723 }
00724
00725 BOOST_AUTO_TEST_CASE( bespoke )
00726 {
00727 BOOST_MESSAGE("Testing bespoke calendars...");
00728
00729 BespokeCalendar a1;
00730 BespokeCalendar b1;
00731
00732 Date testDate1 = Date(4, October, 2008);
00733 Date testDate2 = Date(5, October, 2008);
00734 Date testDate3 = Date(6, October, 2008);
00735 Date testDate4 = Date(7, October, 2008);
00736
00737 if (!a1.isBusinessDay(testDate1))
00738 BOOST_ERROR(testDate1 << " erroneously detected as holiday");
00739 if (!a1.isBusinessDay(testDate2))
00740 BOOST_ERROR(testDate2 << " erroneously detected as holiday");
00741 if (!a1.isBusinessDay(testDate3))
00742 BOOST_ERROR(testDate3 << " erroneously detected as holiday");
00743 if (!a1.isBusinessDay(testDate4))
00744 BOOST_ERROR(testDate4 << " erroneously detected as holiday");
00745
00746 if (!b1.isBusinessDay(testDate1))
00747 BOOST_ERROR(testDate1 << " erroneously detected as holiday");
00748 if (!b1.isBusinessDay(testDate2))
00749 BOOST_ERROR(testDate2 << " erroneously detected as holiday");
00750 if (!b1.isBusinessDay(testDate3))
00751 BOOST_ERROR(testDate3 << " erroneously detected as holiday");
00752 if (!b1.isBusinessDay(testDate4))
00753 BOOST_ERROR(testDate4 << " erroneously detected as holiday");
00754
00755 a1.addWeekend(Sunday);
00756
00757 if (!a1.isBusinessDay(testDate1))
00758 BOOST_ERROR(testDate1 << " erroneously detected as holiday");
00759 if (a1.isBusinessDay(testDate2))
00760 BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
00761 if (!a1.isBusinessDay(testDate3))
00762 BOOST_ERROR(testDate3 << " erroneously detected as holiday");
00763 if (!a1.isBusinessDay(testDate4))
00764 BOOST_ERROR(testDate4 << " erroneously detected as holiday");
00765
00766 if (!b1.isBusinessDay(testDate1))
00767 BOOST_ERROR(testDate1 << " erroneously detected as holiday");
00768 if (!b1.isBusinessDay(testDate2))
00769 BOOST_ERROR(testDate2 << " erroneously detected as holiday");
00770 if (!b1.isBusinessDay(testDate3))
00771 BOOST_ERROR(testDate3 << " erroneously detected as holiday");
00772 if (!b1.isBusinessDay(testDate4))
00773 BOOST_ERROR(testDate4 << " erroneously detected as holiday");
00774
00775 a1.addHoliday(testDate3);
00776
00777 if (!a1.isBusinessDay(testDate1))
00778 BOOST_ERROR(testDate1 << " erroneously detected as holiday");
00779 if (a1.isBusinessDay(testDate2))
00780 BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
00781 if (a1.isBusinessDay(testDate3))
00782 BOOST_ERROR(testDate3 << " (marked as holiday) not detected");
00783 if (!a1.isBusinessDay(testDate4))
00784 BOOST_ERROR(testDate4 << " erroneously detected as holiday");
00785
00786 if (!b1.isBusinessDay(testDate1))
00787 BOOST_ERROR(testDate1 << " erroneously detected as holiday");
00788 if (!b1.isBusinessDay(testDate2))
00789 BOOST_ERROR(testDate2 << " erroneously detected as holiday");
00790 if (!b1.isBusinessDay(testDate3))
00791 BOOST_ERROR(testDate3 << " erroneously detected as holiday");
00792 if (!b1.isBusinessDay(testDate4))
00793 BOOST_ERROR(testDate4 << " erroneously detected as holiday");
00794
00795 BespokeCalendar a2 = a1;
00796
00797 a2.addWeekend(Saturday);
00798
00799 if (a1.isBusinessDay(testDate1))
00800 BOOST_ERROR(testDate1 << " (Saturday) not detected as weekend");
00801 if (a1.isBusinessDay(testDate2))
00802 BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
00803 if (a1.isBusinessDay(testDate3))
00804 BOOST_ERROR(testDate3 << " (marked as holiday) not detected");
00805 if (!a1.isBusinessDay(testDate4))
00806 BOOST_ERROR(testDate4 << " erroneously detected as holiday");
00807
00808 if (a2.isBusinessDay(testDate1))
00809 BOOST_ERROR(testDate1 << " (Saturday) not detected as weekend");
00810 if (a2.isBusinessDay(testDate2))
00811 BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
00812 if (a2.isBusinessDay(testDate3))
00813 BOOST_ERROR(testDate3 << " (marked as holiday) not detected");
00814 if (!a2.isBusinessDay(testDate4))
00815 BOOST_ERROR(testDate4 << " erroneously detected as holiday");
00816
00817 a2.addHoliday(testDate4);
00818
00819 if (a1.isBusinessDay(testDate1))
00820 BOOST_ERROR(testDate1 << " (Saturday) not detected as weekend");
00821 if (a1.isBusinessDay(testDate2))
00822 BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
00823 if (a1.isBusinessDay(testDate3))
00824 BOOST_ERROR(testDate3 << " (marked as holiday) not detected");
00825 if (a1.isBusinessDay(testDate4))
00826 BOOST_ERROR(testDate4 << " (marked as holiday) not detected");
00827
00828 if (a2.isBusinessDay(testDate1))
00829 BOOST_ERROR(testDate1 << " (Saturday) not detected as weekend");
00830 if (a2.isBusinessDay(testDate2))
00831 BOOST_ERROR(testDate2 << " (Sunday) not detected as weekend");
00832 if (a2.isBusinessDay(testDate3))
00833 BOOST_ERROR(testDate3 << " (marked as holiday) not detected");
00834 if (a2.isBusinessDay(testDate4))
00835 BOOST_ERROR(testDate4 << " (marked as holiday) not detected");
00836
00837 }
00838
00839 BOOST_AUTO_TEST_SUITE_END()