/* * ObjectLab, http://www.objectlab.co.uk/open is sponsoring the ObjectLab Kit. * * Based in London, we are world leaders in the design and development * of bespoke applications for the securities financing markets. * * <a href="http://www.objectlab.co.uk/open">Click here to learn more</a> * ___ _ _ _ _ _ * / _ \| |__ (_) ___ ___| |_| | __ _| |__ * | | | | '_ \| |/ _ \/ __| __| | / _` | '_ \ * | |_| | |_) | | __/ (__| |_| |__| (_| | |_) | * \___/|_.__// |\___|\___|\__|_____\__,_|_.__/ * |__/ * * www.ObjectLab.co.uk * * $Id$ * * Copyright 2006 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package net.objectlab.kit.datecalc.common; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import junit.framework.Assert; public abstract class AbstractCurrencyDateCalculatorTest<E extends Serializable> extends AbstractDateTestCase<E> { protected HolidayCalendar<E> createRUHolidayCalendar() { final Set<E> us = new HashSet<E>(); us.add(newDate("2006-01-06")); return new DefaultHolidayCalendar<E>(us, newDate("2005-01-01"), newDate("2021-12-31")); } protected HolidayCalendar<E> createEUHolidayCalendar() { final Set<E> us = new HashSet<E>(); us.add(newDate("2006-01-02")); us.add(newDate("2006-12-26")); return new DefaultHolidayCalendar<E>(us, newDate("2005-01-01"), newDate("2021-12-31")); } @Override public void tearDown() { getDateCalculatorFactory().unregisterAllHolidayCalendars(); } protected CurrencyDateCalculator<E> newCurrencyCalculator(final String ccy1, final String ccy2) { getDateCalculatorFactory().registerHolidays("GBP", createUKHolidayCalendar()); getDateCalculatorFactory().registerHolidays(CurrencyDateCalculator.USD_CODE, createUSHolidayCalendar()); getDateCalculatorFactory().registerHolidays("RUB", createRUHolidayCalendar()); getDateCalculatorFactory().registerHolidays("EUR", createEUHolidayCalendar()); return getDateCalculatorFactory().getDefaultCurrencyDateCalculator(ccy1, ccy2, SpotLag.T_2); } /* * August 2006 * Su Mo Tu We Th Fr Sa * 1 2 3 4 5 * 6 7 8 9 10 11 12 * 13 14 15 16 17 18 19 * 20 21 22 23 24 25 26 * 27 28 29 30 31 */ public void testSimpleSpotUsdEur() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "EUR"); Assert.assertEquals("Name", "USD.EUR", cal.getName()); checkDate("Spot", cal.calculateSpotDate(newDate("2006-08-01")), "2006-08-03"); // Tues->Thur checkDate("Spot", cal.calculateSpotDate(newDate("2006-08-02")), "2006-08-04"); // Wed -> Fri checkDate("Spot", cal.calculateSpotDate(newDate("2006-08-03")), "2006-08-07"); // Thu -> Mon checkDate("Spot", cal.calculateSpotDate(newDate("2006-08-04")), "2006-08-08"); // Fri -> Tue checkDate("Spot", cal.calculateSpotDate(newDate("2006-08-05")), "2006-08-09"); // Sat (move to Mon) -> Wed } public void testSimpleTodayUsdEur() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "EUR"); Assert.assertEquals("Name", "USD.EUR", cal.getName()); checkDate("Spot", cal.calculateTenorDate(newDate("2006-08-01"), StandardTenor.OVERNIGHT), "2006-08-01"); // Tues->Tues } public void testSimpleTomUsdEur() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "EUR"); Assert.assertEquals("Name", "USD.EUR", cal.getName()); final Tenor tom = new Tenor(0, TenorCode.TOM_NEXT); checkDate("Spot", cal.calculateTenorDate(newDate("2006-08-01"), tom), "2006-08-02"); // Tues-> Wed checkDate("Spot", cal.calculateTenorDate(newDate("2006-08-04"), tom), "2006-08-07"); // Fri -> Mon } /* * July 2006 * Su Mo Tu We Th Fr Sa * .... 1 * .2 3 4 5 6 7 8 * .9 10 11 12 13 14 15 * 16 17 18 19 20 21 22 * 23 24 25 26 27 28 29 * 30 31 */ public void testSimpleSpotUsdEurWithUSDHoliday() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "EUR"); Assert.assertEquals("Name", "USD.EUR", cal.getName()); checkDate("Spot from " + newDate("2006-06-30"), cal.calculateSpotDate(newDate("2006-06-30")), "2006-07-05"); // Fri -> Wed checkDate("Spot from " + newDate("2006-07-01"), cal.calculateSpotDate(newDate("2006-07-01")), "2006-07-05"); // Sat -> Wed checkDate("Spot from " + newDate("2006-07-03"), cal.calculateSpotDate(newDate("2006-07-03")), "2006-07-05"); // Mon -> Wed checkDate("Spot from " + newDate("2006-07-04"), cal.calculateSpotDate(newDate("2006-07-04")), "2006-07-07"); // Tue -> Fri } public void testCrossEurGbp() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator("EUR", "GBP"); checkDate("Spot from " + newDate("2006-06-30"), cal.calculateSpotDate(newDate("2006-06-30")), "2006-07-05"); // Fri->Wed (use USD!) checkDate("Spot from " + newDate("2006-07-02"), cal.calculateSpotDate(newDate("2006-07-02")), "2006-07-05"); // Sun->Wed checkDate("Spot from " + newDate("2006-07-03"), cal.calculateSpotDate(newDate("2006-07-03")), "2006-07-05"); // Mon->Wed } public void testCrossEurGbpButDoNotUseUsd() { final CurrencyDateCalculator<E> cal = getDateCalculatorFactory().buildCurrencyDateCalculator( getDateCalculatorFactory().getDefaultCurrencyDateCalculatorBuilder("EUR", "GBP", SpotLag.T_2).brokenDateAllowed(true)); checkDate("Spot from " + newDate("2006-06-30"), cal.calculateSpotDate(newDate("2006-06-30")), "2006-07-04"); // Fri->Tue (do NOT use USD!) checkDate("Spot from " + newDate("2006-07-02"), cal.calculateSpotDate(newDate("2006-07-02")), "2006-07-05"); // Sun->Wed checkDate("Spot from " + newDate("2006-07-03"), cal.calculateSpotDate(newDate("2006-07-03")), "2006-07-05"); // Mon->Wed } public void testCrossEurGbpButDoNotAdjustStartDate() { final CurrencyDateCalculator<E> cal = getDateCalculatorFactory().buildCurrencyDateCalculator(getDateCalculatorFactory() .getDefaultCurrencyDateCalculatorBuilder("EUR", "GBP", SpotLag.T_2).adjustStartDateWithCurrencyPair(false).brokenDateAllowed(true)); checkDate("Spot from " + newDate("2006-07-09"), cal.calculateSpotDate(newDate("2006-07-09")), "2006-07-11"); // Sun->Tue checkDate("Spot from " + newDate("2006-07-03"), cal.calculateSpotDate(newDate("2006-07-03")), "2006-07-05"); // Mon->Wed } public void testCrossEurMxnUsingUsdT1() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator("EUR", "MXN"); checkDate("Spot from " + cal.getName() + " " + newDate("2006-06-30"), cal.calculateSpotDate(newDate("2006-06-30")), "2006-07-05"); // Fri->Wed // (use // USD!) final E spot = cal.calculateSpotDate(newDate("2006-07-02")); checkDate("Spot from " + cal.getName() + " " + newDate("2006-07-02"), spot, "2006-07-06"); // Sun->Wed checkDate("Spot from " + cal.getName() + " " + newDate("2006-07-03"), cal.calculateSpotDate(newDate("2006-07-03")), "2006-07-06"); // Mon->Thu } public void testSimpleUsdJod() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "JOD"); // 3 day weekend! checkDate("Spot from " + cal.getName() + " " + newDate("2006-07-06"), cal.calculateSpotDate(newDate("2006-07-06")), "2006-07-11"); } public void testSimpleUsdAed() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "AED"); // mix of weeks! checkDate("Spot from " + cal.getName() + " " + newDate("2006-07-06"), cal.calculateSpotDate(newDate("2006-07-06")), "2006-07-10"); } public void testCrossGbpJpyWithHolidays() { final Set<E> xxxHholidays = new HashSet<E>(); xxxHholidays.add(newDate("2014-08-04")); final HolidayCalendar<E> xxxCalendar = new DefaultHolidayCalendar<E>(xxxHholidays, newDate("2014-01-01"), newDate("2014-12-31")); getDateCalculatorFactory().registerHolidays("XXX", xxxCalendar); final Set<E> yyyHholidays = new HashSet<E>(); yyyHholidays.add(newDate("2014-08-05")); final HolidayCalendar<E> yyyCalendar = new DefaultHolidayCalendar<E>(yyyHholidays, newDate("2014-01-01"), newDate("2014-12-31")); getDateCalculatorFactory().registerHolidays("YYY", yyyCalendar); final CurrencyDateCalculator<E> calc = newCurrencyCalculator("XXX", "YYY"); // set startDate, this will also set the current business date. System.out.println( calc.getName() + " TD: " + newDate("2014-08-01") + " Spot " + calc.calculateSpotDate(newDate("2014-08-01")) + " expects 6 Aug"); } public void testTenorNoHolidayModifiedFollowing() { final CurrencyDateCalculator<E> cal = getDateCalculatorFactory() .buildCurrencyDateCalculator(getDateCalculatorFactory().getDefaultCurrencyDateCalculatorBuilder("EUR", "USD", SpotLag.T_2)// ); E startDate = newDate("2014-06-26"); E spotDate = cal.calculateSpotDate(startDate); checkDate("Spot from 26-Jun-2014", spotDate, "2014-06-30"); E t1mDate = cal.calculateTenorDate(startDate, StandardTenor.T_1M); checkDate("1M from 26-Jun-2014", t1mDate, "2014-07-30"); startDate = newDate("2014-10-28"); spotDate = cal.calculateSpotDate(startDate); checkDate("Spot from 28-Oct-2014", spotDate, "2014-10-30"); t1mDate = cal.calculateTenorDate(startDate, StandardTenor.T_1M); checkDate("1M from 28-Oct-2014", t1mDate, "2014-11-28"); } public void testTenorNoHolidayForward() { final CurrencyDateCalculator<E> cal = getDateCalculatorFactory() .buildCurrencyDateCalculator(getDateCalculatorFactory().getDefaultCurrencyDateCalculatorBuilder("EUR", "USD", SpotLag.T_2)// .tenorHolidayHandler(getDateCalculatorFactory().getHolidayHandler(HolidayHandlerType.FORWARD)) // ); E startDate = newDate("2014-10-28"); E spotDate = cal.calculateSpotDate(startDate); checkDate("Spot from 28-Oct-2014", spotDate, "2014-10-30"); E t1mDate = cal.calculateTenorDate(startDate, StandardTenor.T_1M); checkDate("1M from 28-Oct-2014", t1mDate, "2014-12-01"); // ALLOWED to Cross over to next month } /* public void testSimpleForwardStartDateWithWeekend() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "EUR"); Assert.assertEquals("Name", "USD.EUR", cal.getName()); cal.setStartDate(newDate("2006-07-31")); // start date Monday checkDate("start date Monday", cal, "2006-07-31"); cal.setStartDate(newDate("2006-08-01")); // start date Tuesday checkDate("start date Tuesday", cal, "2006-08-01"); cal.setStartDate(newDate("2006-08-02")); // start date Wednesday checkDate("start date Wednesday", cal, "2006-08-02"); cal.setStartDate(newDate("2006-08-03")); // start date Thursday checkDate("start date Thursday", cal, "2006-08-03"); cal.setStartDate(newDate("2006-08-04")); // set on a Friday checkDate("start date friday", cal, "2006-08-04"); cal.setStartDate(newDate("2006-08-05")); // set on a Saturday checkDate("start date Saturday", cal, "2006-08-07"); cal.setStartDate(newDate("2006-08-06")); // set on a Sunday checkDate("start date Sunday", cal, "2006-08-07"); } public void testSimpleForwardStartDateNoWeekend() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "EUR"); Assert.assertEquals("Name", "USD.EUR", cal.getName()); final WorkingWeek ww = new WorkingWeek().withWorkingDayFromCalendar(true, Calendar.SATURDAY) .withWorkingDayFromCalendar(true, Calendar.SUNDAY); cal.setWorkingWeek(getWorkingWeek(ww)); Assert.assertEquals("Holidays size", 0, cal.getHolidayCalendar().getHolidays().size()); cal.setStartDate(newDate("2006-07-31")); // start date Monday checkDate("start date Monday", cal, "2006-07-31"); cal.setStartDate(newDate("2006-08-01")); // start date Tuesday checkDate("start date Tuesday", cal, "2006-08-01"); cal.setStartDate(newDate("2006-08-02")); // start date Wednesday checkDate("start date Wednesday", cal, "2006-08-02"); cal.setStartDate(newDate("2006-08-03")); // start date Thursday checkDate("start date Thursday", cal, "2006-08-03"); cal.setStartDate(newDate("2006-08-04")); // set on a Friday checkDate("start date friday", cal, "2006-08-04"); cal.setStartDate(newDate("2006-08-05")); // set on a Saturday checkDate("start date Saturday", cal, "2006-08-05"); cal.setStartDate(newDate("2006-08-06")); // set on a Sunday checkDate("start date Sunday", cal, "2006-08-06"); } public void testSimpleForwardStartDateWhackyWeek() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "EUR"); Assert.assertEquals("Name", "USD.EUR", cal.getName()); final WorkingWeek ww = new WorkingWeek().withWorkingDayFromCalendar(false, Calendar.MONDAY) .withWorkingDayFromCalendar(true, Calendar.TUESDAY).withWorkingDayFromCalendar(false, Calendar.WEDNESDAY) .withWorkingDayFromCalendar(true, Calendar.THURSDAY).withWorkingDayFromCalendar(false, Calendar.FRIDAY) .withWorkingDayFromCalendar(true, Calendar.SATURDAY).withWorkingDayFromCalendar(false, Calendar.SUNDAY); cal.setWorkingWeek(getWorkingWeek(ww)); cal.setStartDate(newDate("2006-07-31")); // start date Monday checkDate("start date Monday", cal, "2006-08-01"); cal.setStartDate(newDate("2006-08-01")); // start date Tuesday checkDate("start date Tuesday", cal, "2006-08-01"); cal.setStartDate(newDate("2006-08-02")); // start date Wednesday checkDate("start date Wednesday", cal, "2006-08-03"); cal.setStartDate(newDate("2006-08-03")); // start date Thursday checkDate("start date Thursday", cal, "2006-08-03"); cal.setStartDate(newDate("2006-08-04")); // set on a Friday checkDate("start date friday", cal, "2006-08-05"); cal.setStartDate(newDate("2006-08-05")); // set on a Saturday checkDate("start date Saturday", cal, "2006-08-05"); cal.setStartDate(newDate("2006-08-06")); // set on a Sunday checkDate("start date Sunday", cal, "2006-08-08"); } public void testSimpleForwardStartDateIdealWeekend() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "EUR"); Assert.assertEquals("Name", "USD.EUR", cal.getName()); Assert.assertEquals("Holidays size", 0, cal.getHolidayCalendar().getHolidays().size()); final WorkingWeek ww = new WorkingWeek().withWorkingDayFromCalendar(false, Calendar.MONDAY) .withWorkingDayFromCalendar(true, Calendar.TUESDAY).withWorkingDayFromCalendar(true, Calendar.WEDNESDAY) .withWorkingDayFromCalendar(true, Calendar.THURSDAY).withWorkingDayFromCalendar(true, Calendar.FRIDAY) .withWorkingDayFromCalendar(false, Calendar.SATURDAY).withWorkingDayFromCalendar(false, Calendar.SUNDAY); cal.setWorkingWeek(getWorkingWeek(ww)); cal.setStartDate(newDate("2006-07-31")); // start date Monday checkDate("start date Monday", cal, "2006-08-01"); cal.setStartDate(newDate("2006-08-01")); // start date Tuesday checkDate("start date Tuesday", cal, "2006-08-01"); cal.setStartDate(newDate("2006-08-02")); // start date Wednesday checkDate("start date Wednesday", cal, "2006-08-02"); cal.setStartDate(newDate("2006-08-03")); // start date Thursday checkDate("start date Thursday", cal, "2006-08-03"); cal.setStartDate(newDate("2006-08-04")); // set on a Friday checkDate("start date friday", cal, "2006-08-04"); cal.setStartDate(newDate("2006-08-05")); // set on a Saturday checkDate("start date Saturday", cal, "2006-08-08"); cal.setStartDate(newDate("2006-08-06")); // set on a Sunday checkDate("start date Sunday", cal, "2006-08-08"); } public void testSimpleForwardWithHolidays() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "GBP"); Assert.assertEquals("Name", "USD.GBP", cal.getName()); cal.setStartDate(newDate("2006-08-28")); checkDate("Move given Bank Holiday", cal, "2006-08-29"); cal.setStartDate(newDate("2006-12-24")); checkDate("Xmas Eve", cal, "2006-12-27"); cal.setStartDate(newDate("2006-12-21")); checkDate("21/12 + 1", cal.moveByDays(1), "2006-12-22"); cal.setStartDate(newDate("2006-12-21")); checkDate("21/12 + 1", cal.moveByDays(2), "2006-12-27"); cal.setStartDate(newDate("2006-12-22")); checkDate("22/12 + 1", cal.moveByDays(1), "2006-12-27"); cal.setStartDate(newDate("2006-12-23")); checkDate("23/12 + 1", cal.moveByDays(1), "2006-12-28"); } // ----------------------------------------------------------------------- // // ObjectLab, world leaders in the design and development of bespoke // applications for the securities financing markets. // www.ObjectLab.co.uk // // ----------------------------------------------------------------------- public void testMoveByBusinessDays() { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "GBP"); Assert.assertEquals("Name", "USD.GBP", cal.getName()); cal.setStartDate(newDate("2006-08-24")); checkDate("Move 1 BD", cal.moveByBusinessDays(1), "2006-08-25"); cal.setStartDate(newDate("2006-08-24")); checkDate("Add 1 week", cal.moveByDays(7), "2006-08-31"); cal.setStartDate(newDate("2006-08-24")); checkDate("Move by 1W with 1 bank holiday", cal.moveByBusinessDays(7), "2006-09-05"); } protected void checkMoveByTenor(final String ccy1, final String ccy2, final String startDate, final Tenor tenor, final int spotLag, final String expectedDate) { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(ccy1, ccy2); cal.setStartDate(newDate(startDate)); checkDate("Move start:" + startDate + " tenor:" + tenor + " daysToSpot:" + spotLag, cal.moveByTenor(tenor, spotLag), expectedDate); } protected void checkMoveByTenor(final String ccy1, final String ccy2, final String startDate, final Tenor tenor, final String expectedDate, final String holidayHandlerType) { final CurrencyDateCalculator<E> cal = newCurrencyCalculator(ccy1, ccy2); cal.setStartDate(newDate(startDate)); checkDate("Move start:" + startDate + " tenor:" + tenor, cal.moveByTenor(tenor), expectedDate); } public void testMoveByTenorDaysZeroDayToSpot() { checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "RUB", "2006-08-08", StandardTenor.SPOT, 0, "2006-08-08"); checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "RUB", "2006-01-06", StandardTenor.SPOT, 0, "2006-01-09"); // moved to Monday checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "RUB", "2006-08-08", new Tenor(2, TenorCode.DAY), 0, "2006-08-10"); checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "RUB", "2006-01-06", new Tenor(2, TenorCode.DAY), 0, "2006-01-11"); } /* July 2006 Su Mo Tu We Th Fr Sa .... 1 .2 3 4 5 6 7 8 .9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 August 2006 Su Mo Tu We Th Fr Sa .. . 1 2 3 4 5 .6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 */ /* public void testMoveByTenorDaysOneDayToSpot() { checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "CAD", "2006-07-05", StandardTenor.SPOT, 1, "2006-07-06"); // US holiday on T+1 checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "CAD", "2006-07-03", StandardTenor.SPOT, 1, "2006-07-05"); // TD on weekend, should be moved first checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "CAD", "2006-07-01", StandardTenor.SPOT, 1, "2006-07-05"); checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "CAD", "2006-07-01", new Tenor(2, TenorCode.DAY), 1, "2006-07-07"); } public void testMoveByTenorDaysTwoDaysToSpot() { // US holiday on 4 July! checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "EUR", "2006-06-30", StandardTenor.SPOT, 2, "2006-07-05"); checkMoveByTenor("EUR", CurrencyDateCalculator.USD_CODE, "2006-06-30", StandardTenor.SPOT, 2, "2006-07-05"); checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "EUR", "2006-07-03", StandardTenor.SPOT, 2, "2006-07-05"); checkMoveByTenor("EUR", CurrencyDateCalculator.USD_CODE, "2006-07-03", StandardTenor.SPOT, 2, "2006-07-05"); checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "EUR", "2006-07-04", StandardTenor.SPOT, 2, "2006-07-07"); checkMoveByTenor("EUR", CurrencyDateCalculator.USD_CODE, "2006-07-04", StandardTenor.SPOT, 2, "2006-07-07"); checkMoveByTenor("EUR", CurrencyDateCalculator.USD_CODE, "2005-12-30", StandardTenor.SPOT, 2, "2006-01-04"); checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "EUR", "2005-12-30", StandardTenor.SPOT, 2, "2006-01-04"); // cross Ccy with US Bank holiday on T+1 but it should not impact it checkMoveByTenor("GBP", "EUR", "2006-07-03", StandardTenor.SPOT, 2, "2006-07-05"); checkMoveByTenor("EUR", "GBP", "2006-07-03", StandardTenor.SPOT, 2, "2006-07-05"); // cross Ccy with US Bank holiday on T+1 BUT ARS!!! checkMoveByTenor("ARS", "EUR", "2006-07-03", StandardTenor.SPOT, 2, "2006-07-06"); checkMoveByTenor("EUR", "ARS", "2006-07-03", StandardTenor.SPOT, 2, "2006-07-06"); // cross Ccy with US Bank holiday on T+1 BUT MXN!!! And MXN is on Holiday on 6 July checkMoveByTenor("MXN", "EUR", "2006-07-03", StandardTenor.SPOT, 2, "2006-07-07"); checkMoveByTenor("EUR", "MXN", "2006-07-03", StandardTenor.SPOT, 2, "2006-07-07"); // checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "EUR", "2006-08-08", new Tenor(2, TenorCode.DAY), 2, "2006-08-14"); // checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "EUR", "2006-08-07", new Tenor(10, TenorCode.DAY), 2, "2006-08-21"); // checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "EUR", "2006-08-07", new Tenor(11, TenorCode.DAY), 2, "2006-08-21"); // checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "EUR", "2006-08-07", new Tenor(12, TenorCode.DAY), 2, "2006-08-21"); // checkMoveByTenor(CurrencyDateCalculator.USD_CODE, "EUR", "2006-08-07", new Tenor(13, TenorCode.DAY), 2, "2006-08-22"); } public void testCalculateTenorsZeroDaysToSpot() { final List<Tenor> list = new ArrayList<Tenor>(); list.add(StandardTenor.OVERNIGHT); list.add(StandardTenor.SPOT); list.add(StandardTenor.T_1D); list.add(StandardTenor.T_2D); list.add(StandardTenor.T_1W); list.add(StandardTenor.T_1M); list.add(StandardTenor.T_2M); list.add(StandardTenor.T_3M); list.add(StandardTenor.T_6M); list.add(StandardTenor.T_9M); list.add(StandardTenor.T_1Y); final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "GBP"); final String startDate = "2006-08-24"; cal.setStartDate(newDate(startDate)); final List<E> expectedResults = new ArrayList<E>(); expectedResults.add(newDate("2006-08-25")); // ON expectedResults.add(newDate("2006-08-24")); // SPOT expectedResults.add(newDate("2006-08-25")); // 1D expectedResults.add(newDate("2006-08-29")); // 2D expectedResults.add(newDate("2006-08-31")); // 1W expectedResults.add(newDate("2006-09-25")); // 1M expectedResults.add(newDate("2006-10-24")); // 2M expectedResults.add(newDate("2006-11-24")); // 3M expectedResults.add(newDate("2007-02-26")); // 6M expectedResults.add(newDate("2007-05-24")); // 9M expectedResults.add(newDate("2007-08-24")); // 1Y final List<E> results = cal.calculateTenorDates(list); assertEquals("Same size as tenor", list.size(), results.size()); final Iterator<E> it = results.iterator(); final Iterator<E> expected = expectedResults.iterator(); for (final Tenor tenor : list) { assertEquals("Move start:" + startDate + " tenor:" + tenor, expected.next(), it.next()); } } public void testCalculateTenorsTwoDaysToSpot() { final List<Tenor> list = new ArrayList<Tenor>(); list.add(StandardTenor.OVERNIGHT); list.add(StandardTenor.SPOT); list.add(StandardTenor.T_1D); list.add(StandardTenor.T_2D); list.add(StandardTenor.T_1W); list.add(StandardTenor.T_1M); list.add(StandardTenor.T_2M); list.add(StandardTenor.T_3M); list.add(StandardTenor.T_6M); list.add(StandardTenor.T_9M); list.add(StandardTenor.T_1Y); final CurrencyDateCalculator<E> cal = newCurrencyCalculator(CurrencyDateCalculator.USD_CODE, "GBP"); final String startDate = "2006-08-24"; cal.setStartDate(newDate(startDate)); final List<E> expectedResults = new ArrayList<E>(); expectedResults.add(newDate("2006-08-25")); // ON expectedResults.add(newDate("2006-08-29")); // SPOT expectedResults.add(newDate("2006-08-30")); // 1D expectedResults.add(newDate("2006-08-31")); // 2D expectedResults.add(newDate("2006-09-05")); // 1W expectedResults.add(newDate("2006-09-29")); // 1M expectedResults.add(newDate("2006-10-30")); // 2M expectedResults.add(newDate("2006-11-29")); // 3M expectedResults.add(newDate("2007-02-28")); // 6M - is this correct? expectedResults.add(newDate("2007-05-29")); // 9M expectedResults.add(newDate("2007-08-29")); // 1Y final List<E> results = cal.calculateTenorDates(list, 2); assertEquals("Same size as tenor", list.size(), results.size()); final Iterator<E> it = results.iterator(); final Iterator<E> expected = expectedResults.iterator(); for (final Tenor tenor : list) { assertEquals("Move start:" + startDate + " tenor:" + tenor, expected.next(), it.next()); } } */ } /* * ObjectLab, http://www.objectlab.co.uk/open is sponsoring the ObjectLab Kit. * * Based in London, we are world leaders in the design and development * of bespoke applications for the securities financing markets. * * <a href="http://www.objectlab.co.uk/open">Click here to learn more about us</a> * ___ _ _ _ _ _ * / _ \| |__ (_) ___ ___| |_| | __ _| |__ * | | | | '_ \| |/ _ \/ __| __| | / _` | '_ \ * | |_| | |_) | | __/ (__| |_| |__| (_| | |_) | * \___/|_.__// |\___|\___|\__|_____\__,_|_.__/ * |__/ * * www.ObjectLab.co.uk */