package org.marketcetera.trade;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertEquals;
import java.math.BigDecimal;
import java.util.List;
import org.junit.Test;
import org.marketcetera.module.ExpectedFailure;
import org.marketcetera.util.test.EqualityAssert;
import com.google.common.collect.ImmutableList;
/* $License$ */
/**
* Tests {@link Option}.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: OptionTest.java 16154 2012-07-14 16:34:05Z colin $
* @since 2.0.0
*/
public class OptionTest extends InstrumentTestBase<Option> {
@Override
protected Option createFixture() {
return new Option("ABC", "20091010", BigDecimal.ONE, OptionType.Call);
}
@Override
protected Option createEqualFixture() {
return new Option("ABC", "20091010", BigDecimal.ONE, OptionType.Call);
}
@Override
protected List<Option> createDifferentFixtures() {
return ImmutableList.of(
new Option("ABC", "20091010", new BigDecimal("5"), OptionType.Call),
new Option("ABC", "20091010", new BigDecimal("6"), OptionType.Call),
new Option("ABC", "20091011", new BigDecimal("5"), OptionType.Call),
new Option("ABC", "20091010", new BigDecimal("5"), OptionType.Put),
new Option("METC", "20091011", new BigDecimal("5"), OptionType.Call));
}
@Override
protected SecurityType getSecurityType() {
return SecurityType.Option;
}
@Test
public void testStrikePriceTrailingZerosTrimmed() throws Exception {
verifyStrikePriceTrimTrailingZero("5", "5.00");
verifyStrikePriceTrimTrailingZero("50", "50.00");
verifyStrikePriceTrimTrailingZero("5.5", "5.500");
verifyStrikePriceTrimTrailingZero("5000", "5000.00000");
verifyStrikePriceTrimTrailingZero("5000.4343", "5000.434300000");
}
private void verifyStrikePriceTrimTrailingZero(String inPrice1, String inPrice2) {
Option option1 = new Option("ABC", "20091010", new BigDecimal(inPrice1),
OptionType.Call);
Option option2 = new Option("ABC", "20091010", new BigDecimal(inPrice2),
OptionType.Call);
assertThat(option2.getStrikePrice(), is(new BigDecimal(inPrice1)));
assertThat(option1, is(option2));
assertThat(option1.hashCode(), is(option2.hashCode()));
}
@Test
public void testNullSymbol() throws Exception {
new ExpectedFailure<IllegalArgumentException>() {
@Override
protected void run() throws Exception {
new Option(null, "20091010", BigDecimal.ONE, OptionType.Call);
}
};
}
@Test
public void testWhitespaceSymbol() throws Exception {
new ExpectedFailure<IllegalArgumentException>() {
@Override
protected void run() throws Exception {
new Option("", "20091010", BigDecimal.ONE, OptionType.Call);
}
};
new ExpectedFailure<IllegalArgumentException>() {
@Override
protected void run() throws Exception {
new Option(" ", "20091010", BigDecimal.ONE, OptionType.Call);
}
};
}
@Test
public void testNullType() throws Exception {
new ExpectedFailure<IllegalArgumentException>() {
@Override
protected void run() throws Exception {
new Option("ABC", "20091010", BigDecimal.ONE, null);
}
};
}
@Test
public void testNullExpiry() throws Exception {
new ExpectedFailure<IllegalArgumentException>() {
@Override
protected void run() throws Exception {
new Option("ABC", null, BigDecimal.ONE, OptionType.Call);
}
};
}
@Test
public void testWhitespaceExpiry() throws Exception {
new ExpectedFailure<IllegalArgumentException>() {
@Override
protected void run() throws Exception {
new Option("ABC", "", BigDecimal.ONE, OptionType.Call);
}
};
new ExpectedFailure<IllegalArgumentException>() {
@Override
protected void run() throws Exception {
new Option("ABC", " ", BigDecimal.ONE, OptionType.Call);
}
};
}
@Test
public void testNullStrikePrice() throws Exception {
new ExpectedFailure<IllegalArgumentException>() {
@Override
protected void run() throws Exception {
new Option("ABC", "20091010", null, OptionType.Call);
}
};
}
@Test
public void testToString() throws Exception {
assertThat(
createFixture().toString(),
is("Option[symbol=ABC,type=Call,expiry=20091010,strikePrice=1]"));
assertThat(
new Option("ABC", "200911", BigDecimal.ONE, OptionType.Put).toString(),
is("Option[symbol=ABC,type=Put,expiry=200911,strikePrice=1,augmentedExpiry=20091121]"));
}
@Test
public void testAugmentedExpiryEquality() {
String symbol = "SYM";
OptionType type = OptionType.Call;
BigDecimal strikePrice = BigDecimal.TEN;
Option [] options = {
new Option(symbol, "200911", strikePrice, type),
new Option(symbol, "20091121", strikePrice, type)
};
//Test all permutations of equality
for(Option option1: options) {
for(Option option2: options) {
assertEquals(option1, option2);
assertEquals(option1.hashCode(), option2.hashCode());
}
}
EqualityAssert.assertEquality(options[0], options[1],
new Option(symbol, "20091120", strikePrice, type),
new Option(symbol, "200912", strikePrice, type),
new Option(symbol, "2009", strikePrice, type)
);
}
@Test
public void testAugmentedExpiryValue() {
//augmented expiry
Option option = new Option("s", "200911", BigDecimal.TEN, OptionType.Call);
assertEquals("200911", option.getExpiry());
assertEquals("20091121", option.getAugmentedExpiry());
//no augmentation
option = new Option("s", "20091111", BigDecimal.TEN, OptionType.Call);
assertEquals("20091111", option.getExpiry());
assertEquals(null, option.getAugmentedExpiry());
//invalid expiry
option = new Option("s", "2009", BigDecimal.TEN, OptionType.Call);
assertEquals("2009", option.getExpiry());
assertEquals(null, option.getAugmentedExpiry());
}
}