/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.forex.definition;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import org.testng.annotations.Test;
import org.threeten.bp.ZonedDateTime;
import com.opengamma.analytics.financial.forex.derivative.ForexOptionSingleBarrier;
import com.opengamma.analytics.financial.model.option.definition.Barrier;
import com.opengamma.analytics.financial.model.option.definition.Barrier.BarrierType;
import com.opengamma.analytics.financial.model.option.definition.Barrier.KnockType;
import com.opengamma.analytics.financial.model.option.definition.Barrier.ObservationType;
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 ForexOptionSingleBarrierDefinitionTest {
private static final Currency CCY1 = Currency.AUD;
private static final Currency CCY2 = Currency.CAD;
private static final ZonedDateTime EXCHANGE = DateUtils.getUTCDate(2011, 12, 5);
private static final double AMOUNT = 1000;
private static final double RATE = 1.5;
private static final double REBATE = 0.5;
private static final ForexDefinition FOREX = new ForexDefinition(CCY1, CCY2, EXCHANGE, AMOUNT, RATE);
private static final ZonedDateTime EXPIRY = DateUtils.getUTCDate(2011, 12, 1);
private static final boolean IS_CALL = true;
private static final boolean IS_LONG = true;
private static final ForexOptionVanillaDefinition UNDERLYING = new ForexOptionVanillaDefinition(FOREX, EXPIRY, IS_CALL, IS_LONG);
private static final Barrier BARRIER = new Barrier(KnockType.IN, BarrierType.DOWN, ObservationType.CLOSE, 1);
private static final ForexOptionSingleBarrierDefinition OPTION = new ForexOptionSingleBarrierDefinition(UNDERLYING, BARRIER);
private static final ForexOptionSingleBarrierDefinition OPTION_REBATE = new ForexOptionSingleBarrierDefinition(UNDERLYING, BARRIER, REBATE);
private static final ZonedDateTime DATE = DateUtils.getUTCDate(2011, 7, 1);
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullUnderlying() {
new ForexOptionSingleBarrierDefinition(null, BARRIER);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullBarrier() {
new ForexOptionSingleBarrierDefinition(UNDERLYING, null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullDate() {
OPTION.toDerivative(null);
}
@Test
public void testObject() {
assertEquals(UNDERLYING, OPTION.getUnderlyingOption());
assertEquals(BARRIER, OPTION.getBarrier());
assertEquals(0.0, OPTION.getRebate(), 1.0E-10);
assertEquals(UNDERLYING, OPTION_REBATE.getUnderlyingOption());
assertEquals(BARRIER, OPTION_REBATE.getBarrier());
assertEquals(REBATE, OPTION_REBATE.getRebate(), 1.0E-10);
assertEquals(OPTION, OPTION);
ForexOptionSingleBarrierDefinition other = new ForexOptionSingleBarrierDefinition(UNDERLYING, BARRIER);
assertEquals(OPTION, other);
assertEquals(OPTION.hashCode(), other.hashCode());
final ForexOptionSingleBarrierDefinition otherRebate = new ForexOptionSingleBarrierDefinition(UNDERLYING, BARRIER, REBATE);
assertEquals(OPTION_REBATE, otherRebate);
assertEquals(OPTION_REBATE.hashCode(), otherRebate.hashCode());
other = new ForexOptionSingleBarrierDefinition(new ForexOptionVanillaDefinition(FOREX, EXPIRY, !IS_CALL, IS_LONG), BARRIER);
assertFalse(other.equals(OPTION));
other = new ForexOptionSingleBarrierDefinition(UNDERLYING, new Barrier(KnockType.OUT, BarrierType.DOWN, ObservationType.CLOSE, 1));
assertFalse(other.equals(OPTION));
assertFalse(OPTION_REBATE.equals(OPTION));
assertFalse(OPTION_REBATE.equals(BARRIER));
assertFalse(OPTION_REBATE.equals(null));
}
@Test
public void testToDerivative() {
final ForexOptionSingleBarrier derivative = OPTION.toDerivative(DATE);
assertEquals(derivative.getUnderlyingOption(), UNDERLYING.toDerivative(DATE));
assertEquals(derivative.getBarrier(), BARRIER);
}
}