/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.volatility.surface;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import org.threeten.bp.LocalDate;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.core.value.MarketDataRequirementNames;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.financial.convention.calendar.MondayToFridayCalendar;
import com.opengamma.financial.convention.expirycalc.SoybeanFutureExpiryCalculator;
import com.opengamma.financial.fudgemsg.FinancialTestBase;
import com.opengamma.id.ExternalId;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class BloombergCommodityFuturePriceCurveInstrumentProviderTest extends FinancialTestBase {
private static final String DATA_FIELD_NAME = MarketDataRequirementNames.IMPLIED_VOLATILITY;
private static final String POSTFIX = "Comdty";
private static final String SCHEME = ExternalSchemes.BLOOMBERG_BUID_WEAK.getName();
private static final String PREFIX = "S ";
private static final BloombergCommodityFuturePriceCurveInstrumentProvider PROVIDER =
new BloombergCommodityFuturePriceCurveInstrumentProvider(PREFIX, POSTFIX, DATA_FIELD_NAME);
private static final SoybeanFutureExpiryCalculator EXPIRY_CALC = SoybeanFutureExpiryCalculator.getInstance();
private static final LocalDate DATE_AFTER_FIFTEENTH = LocalDate.of(2012, 11, 21);
private static final LocalDate DATE_BEFORE_FIFTEENTH = LocalDate.of(2012, 11, 10);
private static final LocalDate DATE_IN_DECEMBER = LocalDate.of(2012, 12, 10);
static final Calendar WEEKEND_CALENDAR = new MondayToFridayCalendar("a");
private static final Short[] EXPIRY_OFFSETS = new Short[] { 1, 2, 8, 10 };
private static final String[] RESULTS = new String[] {
"S H3 Comdty", "S K3 Comdty", "S H4 Comdty", "S N4 Comdty"
};
@Test
public void testSoybeanFutureExpiryCalculator_getExpiryMonth() {
assertEquals(DATE_AFTER_FIFTEENTH.plusMonths(4).getMonth(), EXPIRY_CALC.getExpiryMonth(1, DATE_AFTER_FIFTEENTH).getMonth());
assertEquals(DATE_AFTER_FIFTEENTH.plusMonths(8).getMonth(), EXPIRY_CALC.getExpiryMonth(3, DATE_AFTER_FIFTEENTH).getMonth());
assertEquals(DATE_AFTER_FIFTEENTH.plusMonths(10).getMonth(), EXPIRY_CALC.getExpiryMonth(5, DATE_AFTER_FIFTEENTH).getMonth());
assertEquals(DATE_BEFORE_FIFTEENTH.plusMonths(2).getMonth(), EXPIRY_CALC.getExpiryMonth(1, DATE_BEFORE_FIFTEENTH).getMonth());
assertEquals(DATE_BEFORE_FIFTEENTH.plusMonths(6).getMonth(), EXPIRY_CALC.getExpiryMonth(3, DATE_BEFORE_FIFTEENTH).getMonth());
assertEquals(DATE_BEFORE_FIFTEENTH.plusMonths(9).getMonth(), EXPIRY_CALC.getExpiryMonth(5, DATE_BEFORE_FIFTEENTH).getMonth());
assertEquals(DATE_BEFORE_FIFTEENTH.plusMonths(16).getMonth(), EXPIRY_CALC.getExpiryMonth(9, DATE_BEFORE_FIFTEENTH).getMonth());
assertEquals(DATE_IN_DECEMBER.plusMonths(1).getMonth(), EXPIRY_CALC.getExpiryMonth(1, DATE_IN_DECEMBER).getMonth());
}
@Test
public void testSoybeanFutureExpiryCalculator_getExpiryDate() {
assertEquals(LocalDate.of(2013, 3, 14), EXPIRY_CALC.getExpiryDate(1, DATE_AFTER_FIFTEENTH, WEEKEND_CALENDAR));
assertEquals(LocalDate.of(2013, 5, 14), EXPIRY_CALC.getExpiryDate(2, DATE_AFTER_FIFTEENTH, WEEKEND_CALENDAR));
assertEquals(LocalDate.of(2013, 7, 12), EXPIRY_CALC.getExpiryDate(3, DATE_AFTER_FIFTEENTH, WEEKEND_CALENDAR));
assertEquals(LocalDate.of(2013, 8, 14), EXPIRY_CALC.getExpiryDate(4, DATE_AFTER_FIFTEENTH, WEEKEND_CALENDAR));
assertEquals(LocalDate.of(2013, 9, 13), EXPIRY_CALC.getExpiryDate(5, DATE_AFTER_FIFTEENTH, WEEKEND_CALENDAR));
assertEquals(LocalDate.of(2013, 11, 14), EXPIRY_CALC.getExpiryDate(6, DATE_AFTER_FIFTEENTH, WEEKEND_CALENDAR));
assertEquals(LocalDate.of(2013, 1, 14), EXPIRY_CALC.getExpiryDate(1, DATE_BEFORE_FIFTEENTH, WEEKEND_CALENDAR));
assertEquals(LocalDate.of(2013, 5, 14), EXPIRY_CALC.getExpiryDate(3, DATE_BEFORE_FIFTEENTH, WEEKEND_CALENDAR));
assertEquals(LocalDate.of(2013, 9, 13), EXPIRY_CALC.getExpiryDate(6, DATE_BEFORE_FIFTEENTH, WEEKEND_CALENDAR));
assertEquals(LocalDate.of(2013, 11, 14), EXPIRY_CALC.getExpiryDate(7, DATE_BEFORE_FIFTEENTH, WEEKEND_CALENDAR));
assertEquals(LocalDate.of(2014, 1, 14), EXPIRY_CALC.getExpiryDate(8, DATE_BEFORE_FIFTEENTH, WEEKEND_CALENDAR));
}
@Test
public void testFuturePriceCurveInstrumentProvider() {
for (int i = 0; i < EXPIRY_OFFSETS.length; i++) {
final String expected = RESULTS[i];
final ExternalId actual = PROVIDER.getInstrument(EXPIRY_OFFSETS[i], DATE_AFTER_FIFTEENTH);
assertEquals(ExternalSchemes.BLOOMBERG_TICKER_WEAK, actual.getScheme());
assertEquals(expected, actual.getValue());
}
}
@Test
public void testCycle() {
BloombergCommodityFuturePriceCurveInstrumentProvider provider = new BloombergCommodityFuturePriceCurveInstrumentProvider(PREFIX, POSTFIX,
DATA_FIELD_NAME);
assertEquals(provider, cycleObject(BloombergCommodityFuturePriceCurveInstrumentProvider.class, provider));
provider = new BloombergCommodityFuturePriceCurveInstrumentProvider(PREFIX, POSTFIX,
DATA_FIELD_NAME, SCHEME);
assertEquals(provider, cycleObject(BloombergCommodityFuturePriceCurveInstrumentProvider.class, provider));
}
}