/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.commodity.definition;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertTrue;
import org.testng.annotations.Test;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.ExerciseDecisionType;
import com.opengamma.analytics.financial.commodity.derivative.MetalFutureOption;
import com.opengamma.id.ExternalId;
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 MetalFutureOptionDefinitionTest {
private final static ExternalId AN_ID = ExternalId.of("Scheme", "value");
private final static ZonedDateTime FIRST_DELIVERY_DATE = DateUtils.getUTCDate(2011, 9, 21);
private final static ZonedDateTime LAST_DELIVERY_DATE = DateUtils.getUTCDate(2012, 9, 21);
private final static ZonedDateTime SETTLEMENT_DATE = LAST_DELIVERY_DATE;
private final static ZonedDateTime EXPIRY_DATE = DateUtils.getUTCDate(2011, 9, 21);
private final static ZonedDateTime A_DATE = DateUtils.getUTCDate(2011, 9, 20);
private final static MetalFutureDefinition AN_UNDERLYING = new MetalFutureDefinition(EXPIRY_DATE, AN_ID, 100, FIRST_DELIVERY_DATE, LAST_DELIVERY_DATE, 1000, "tonnes", SettlementType.PHYSICAL, 0,
Currency.GBP, SETTLEMENT_DATE);
/**
* Test hashCode and equals methods.
*/
@Test()
public void testHashEquals() {
MetalFutureOptionDefinition first = new MetalFutureOptionDefinition(EXPIRY_DATE, AN_UNDERLYING, 100, ExerciseDecisionType.EUROPEAN, true);
MetalFutureOptionDefinition second = new MetalFutureOptionDefinition(EXPIRY_DATE, AN_UNDERLYING, 100, ExerciseDecisionType.EUROPEAN, true);
assertEquals(first, second);
assertEquals(first.hashCode(), second.hashCode());
MetalFutureOptionDefinition third = new MetalFutureOptionDefinition(EXPIRY_DATE, AN_UNDERLYING, 100, ExerciseDecisionType.AMERICAN, false);
assertFalse(first.equals(third));
assertFalse(second.hashCode() == third.hashCode());
}
/**
* Test getters
*/
@Test
public void testGetters() {
MetalFutureOptionDefinition first = new MetalFutureOptionDefinition(EXPIRY_DATE, AN_UNDERLYING, 100, ExerciseDecisionType.EUROPEAN, true);
MetalFutureOptionDefinition second = new MetalFutureOptionDefinition(EXPIRY_DATE, AN_UNDERLYING, 100, ExerciseDecisionType.AMERICAN, false);
assertEquals(first.getStrike(), 100.);
assertEquals(first.getExerciseType(), ExerciseDecisionType.EUROPEAN);
assertEquals(first.getUnderlying(), AN_UNDERLYING);
assertTrue(first.isCall());
assertEquals(second.getExerciseType(), ExerciseDecisionType.AMERICAN);
assertFalse(second.isCall());
}
/**
* Test method for {@link com.opengamma.analytics.financial.commodity.definition.MetalFutureOptionDefinition#toDerivative(javax.time.calendar.ZonedDateTime)}.
*/
@Test
public void testToDerivative() {
MetalFutureOptionDefinition first = new MetalFutureOptionDefinition(EXPIRY_DATE, AN_UNDERLYING, 100, ExerciseDecisionType.EUROPEAN, true);
MetalFutureOptionDefinition second = new MetalFutureOptionDefinition(EXPIRY_DATE, AN_UNDERLYING, 100, ExerciseDecisionType.AMERICAN, false);
MetalFutureOption firstDerivative = first.toDerivative(A_DATE);
MetalFutureOption secondDerivative = second.toDerivative(A_DATE);
assertEquals(firstDerivative.getStrike(), 100.);
assertEquals(firstDerivative.getExerciseType(), ExerciseDecisionType.EUROPEAN);
assertEquals(firstDerivative.getUnderlying(), AN_UNDERLYING.toDerivative(A_DATE));
assertTrue(firstDerivative.isCall());
assertEquals(secondDerivative.getExerciseType(), ExerciseDecisionType.AMERICAN);
assertFalse(secondDerivative.isCall());
MetalFutureOption firstDerivative2 = new MetalFutureOption(0.0027397260273972603, AN_UNDERLYING.toDerivative(A_DATE), 100, ExerciseDecisionType.EUROPEAN, true);
assertEquals(firstDerivative.hashCode(), firstDerivative2.hashCode());
assertEquals(firstDerivative, firstDerivative2);
}
}