package org.marketcetera.client.instruments;
import static org.marketcetera.client.instruments.OptionValidationHandler.validateExpiry;
import static org.marketcetera.client.instruments.OptionValidationHandler.validateExpiryDate;
import java.math.BigDecimal;
import org.junit.BeforeClass;
import org.junit.Test;
import org.marketcetera.client.OrderValidationException;
import org.marketcetera.core.LoggerConfiguration;
import org.marketcetera.module.ExpectedFailure;
import org.marketcetera.trade.*;
import org.marketcetera.util.log.I18NMessage1P;
import org.marketcetera.util.misc.ClassVersion;
/* $License$ */
/**
* Tests {@link InstrumentValidationHandler}
*
* @author anshul@marketcetera.com
* @version $Id: InstrumentValidationHandlerTest.java 16395 2012-12-10 16:29:14Z colin $
* @since 2.0.0
*/
@ClassVersion("$Id: InstrumentValidationHandlerTest.java 16395 2012-12-10 16:29:14Z colin $")
public class InstrumentValidationHandlerTest {
@BeforeClass
public static void logSetup() {
LoggerConfiguration.logSetup();
}
@Test
public void equity() throws Exception {
Equity equity = new Equity("WIU");
InstrumentValidationHandler.SELECTOR.forInstrument(equity).validate(equity);
}
@Test
public void future() throws Exception {
Future future = new Future("XEURFDAX0F2010U", FutureExpirationMonth.APRIL, 2010);
InstrumentValidationHandler.SELECTOR.forInstrument(future).validate(future);
// todo: we may need to do better expiry validation?
}
@Test
public void currency() throws Exception {
Currency currency = new Currency("USD", "GBP", "", "");
InstrumentValidationHandler.SELECTOR.forInstrument(currency).validate(currency);
}
@Test
public void option() throws Exception {
validate("000001");
validate("000009");
validate("000010");
validate("999912");
validate("00000101");
validate("00000109");
validate("00000110");
validate("00000119");
validate("00000120");
validate("00000129");
validate("00000130");
validate("99991231");
validate("20090231");
validate("999912w1");
validate("999912w3");
validate("999912w5");
//incorrect length
invalid("100");
invalid("2000");
invalid("10001");
invalid("1000101");
invalid("100010101");
//invalid year
invalid("AAAA10");
invalid("AAAA1010");
//invalid month
invalid("100000");
invalid("100013");
invalid("100020");
invalid("100032");
invalid("10000012");
invalid("10001312");
invalid("10002012");
invalid("1000AB12");
//invalid day
invalid("10000100");
invalid("10000132");
invalid("10000140");
invalid("100001BA");
//invalid week
invalid("100001w0");
invalid("100001w6");
invalid("100001a1");
invalid("100001w9");
invalid("100001ww");
invalid("100001x2");
}
@Test
public void optionExpiryDate() throws Exception {
validateExpiryDate("20010101");
validateExpiryDate("20010131");
validateExpiryDate("20001231");
validateExpiryDate("20001201");
validateExpiryDate("20000228");
validateExpiryDate("20000229");
validateExpiryDate("200002w1");
validateExpiryDate("200002w4");
validateExpiryDate("200905w5");
invalidExpiryDate("20000230", Messages.INVALID_OPTION_EXPIRY_DAY);
invalidExpiryDate("20010229", Messages.INVALID_OPTION_EXPIRY_DAY);
invalidExpiryDate("20000631", Messages.INVALID_OPTION_EXPIRY_DAY);
invalidExpiryDate("20090231", Messages.INVALID_OPTION_EXPIRY_DAY);
//has only 4 weeks
invalidExpiryDate("200902w5", Messages.INVALID_OPTION_EXPIRY_WEEK);
//doesn't have 4 days in the first week.
invalidExpiryDate("200910w5", Messages.INVALID_OPTION_EXPIRY_WEEK);
}
private static void invalid(final String inExpiry) throws Exception {
new ExpectedFailure<OrderValidationException>(
Messages.INVALID_OPTION_EXPIRY_FORMAT, inExpiry) {
@Override
protected void run() throws Exception {
validateOption(inExpiry);
}
};
new ExpectedFailure<OrderValidationException>(
Messages.INVALID_OPTION_EXPIRY_FORMAT, inExpiry) {
@Override
protected void run() throws Exception {
validateExpiry(inExpiry);
}
};
new ExpectedFailure<OrderValidationException>(
Messages.INVALID_OPTION_EXPIRY_FORMAT, inExpiry) {
@Override
protected void run() throws Exception {
validateExpiryDate(inExpiry);
}
};
}
private static void invalidExpiryDate(final String inExpiry,
I18NMessage1P inMsg) throws Exception {
new ExpectedFailure<OrderValidationException>(
inMsg, inExpiry) {
@Override
protected void run() throws Exception {
validateExpiryDate(inExpiry);
}
};
}
private static void validate(String inExpiry) throws OrderValidationException {
validateOption(inExpiry);
validateExpiry(inExpiry);
}
private static void validateOption(String inExpiry) throws OrderValidationException {
Option option = new Option("XYZ", inExpiry, BigDecimal.TEN, OptionType.Call);
InstrumentValidationHandler.SELECTOR.forInstrument(option).validate(option);
}
}