/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.equity.option;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import org.testng.annotations.Test;
import org.threeten.bp.LocalDate;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.ExerciseDecisionType;
import com.opengamma.analytics.financial.commodity.definition.SettlementType;
import com.opengamma.util.money.Currency;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.time.DateUtils;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class EquityIndexOptionDefinitionTest {
private static final boolean IS_CALL = false;
private static final double STRIKE = 100;
private static final Currency CCY = Currency.AUD;
private static final ExerciseDecisionType EXERCISE = ExerciseDecisionType.AMERICAN;
private static final ZonedDateTime EXPIRY = DateUtils.getUTCDate(2013, 2, 1);
private static final LocalDate SETTLEMENT = LocalDate.of(2013, 2, 4);
private static final double POINT_VALUE = 2500;
private static final SettlementType SETTLEMENT_TYPE = SettlementType.CASH;
private static final EquityIndexOptionDefinition AMERICAN_PUT = new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, EXERCISE, EXPIRY, SETTLEMENT, POINT_VALUE,
SETTLEMENT_TYPE);
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNegativeStrike() {
new EquityIndexOptionDefinition(IS_CALL, -STRIKE, CCY, EXERCISE, EXPIRY, SETTLEMENT, POINT_VALUE, SETTLEMENT_TYPE);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testZeroStrike() {
new EquityIndexOptionDefinition(IS_CALL, 0, CCY, EXERCISE, EXPIRY, SETTLEMENT, POINT_VALUE, SETTLEMENT_TYPE);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCurrency() {
new EquityIndexOptionDefinition(IS_CALL, STRIKE, null, EXERCISE, EXPIRY, SETTLEMENT, POINT_VALUE, SETTLEMENT_TYPE);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullExerciseType() {
new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, null, EXPIRY, SETTLEMENT, POINT_VALUE, SETTLEMENT_TYPE);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullExpiry() {
new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, EXERCISE, null, SETTLEMENT, POINT_VALUE, SETTLEMENT_TYPE);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullSettlementDate() {
new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, EXERCISE, EXPIRY, null, POINT_VALUE, SETTLEMENT_TYPE);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testZeroPointValue() {
new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, EXERCISE, EXPIRY, SETTLEMENT, 0, SETTLEMENT_TYPE);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullSettlementType() {
new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, EXERCISE, EXPIRY, SETTLEMENT, POINT_VALUE, null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullValuationDate() {
AMERICAN_PUT.toDerivative(null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testValuationAfterExpiry() {
AMERICAN_PUT.toDerivative(EXPIRY.plusDays(1));
}
@Test
public void testObject() {
assertEquals(AMERICAN_PUT, AMERICAN_PUT);
assertFalse(AMERICAN_PUT.equals(null));
assertFalse(AMERICAN_PUT.equals(2.));
assertEquals(IS_CALL, AMERICAN_PUT.isCall());
assertEquals(STRIKE, AMERICAN_PUT.getStrike());
assertEquals(CCY, AMERICAN_PUT.getCurrency());
assertEquals(EXERCISE, AMERICAN_PUT.getExerciseType());
assertEquals(EXPIRY, AMERICAN_PUT.getExpiryDate());
assertEquals(SETTLEMENT, AMERICAN_PUT.getSettlementDate());
assertEquals(POINT_VALUE, AMERICAN_PUT.getPointValue());
assertEquals(SETTLEMENT_TYPE, AMERICAN_PUT.getSettlementType());
EquityIndexOptionDefinition other = new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, EXERCISE, EXPIRY, SETTLEMENT, POINT_VALUE, SETTLEMENT_TYPE);
assertEquals(AMERICAN_PUT, other);
assertEquals(AMERICAN_PUT.hashCode(), other.hashCode());
other = new EquityIndexOptionDefinition(!IS_CALL, STRIKE, CCY, EXERCISE, EXPIRY, SETTLEMENT, POINT_VALUE, SETTLEMENT_TYPE);
assertFalse(AMERICAN_PUT.equals(other));
other = new EquityIndexOptionDefinition(IS_CALL, STRIKE + 1, CCY, EXERCISE, EXPIRY, SETTLEMENT, POINT_VALUE, SETTLEMENT_TYPE);
assertFalse(AMERICAN_PUT.equals(other));
other = new EquityIndexOptionDefinition(IS_CALL, STRIKE, Currency.USD, EXERCISE, EXPIRY, SETTLEMENT, POINT_VALUE, SETTLEMENT_TYPE);
assertFalse(AMERICAN_PUT.equals(other));
other = new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, ExerciseDecisionType.EUROPEAN, EXPIRY, SETTLEMENT, POINT_VALUE, SETTLEMENT_TYPE);
assertFalse(AMERICAN_PUT.equals(other));
other = new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, EXERCISE, EXPIRY.plusYears(1), SETTLEMENT, POINT_VALUE, SETTLEMENT_TYPE);
assertFalse(AMERICAN_PUT.equals(other));
other = new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, EXERCISE, EXPIRY, SETTLEMENT.plusYears(1), POINT_VALUE, SETTLEMENT_TYPE);
assertFalse(AMERICAN_PUT.equals(other));
other = new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, EXERCISE, EXPIRY, SETTLEMENT, POINT_VALUE * 2, SETTLEMENT_TYPE);
assertFalse(AMERICAN_PUT.equals(other));
other = new EquityIndexOptionDefinition(IS_CALL, STRIKE, CCY, EXERCISE, EXPIRY, SETTLEMENT, POINT_VALUE, SettlementType.PHYSICAL);
assertFalse(AMERICAN_PUT.equals(other));
}
@Test
public void testToDerivative() {
final ZonedDateTime valuationDate = EXPIRY.minusDays(10);
final EquityIndexOption derivative = AMERICAN_PUT.toDerivative(valuationDate);
assertEquals(STRIKE, derivative.getStrike());
assertEquals(10. / 365, derivative.getTimeToExpiry());
assertEquals(13. / 365, derivative.getTimeToSettlement());
assertEquals(POINT_VALUE, derivative.getUnitAmount());
assertEquals(IS_CALL, derivative.isCall());
assertEquals(CCY, derivative.getCurrency());
assertEquals(SETTLEMENT_TYPE, derivative.getSettlementType());
assertEquals(EXERCISE, derivative.getExerciseType());
}
}