package org.marketcetera.event.impl; import static org.junit.Assert.assertEquals; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.marketcetera.event.AskEvent; import org.marketcetera.event.BidEvent; import org.marketcetera.event.Event; import org.marketcetera.event.EventTestBase; import org.marketcetera.event.QuoteAction; import org.marketcetera.event.TopOfBookEvent; import org.marketcetera.module.ExpectedFailure; import org.marketcetera.trade.Equity; import org.marketcetera.trade.Instrument; import org.marketcetera.trade.Option; import org.marketcetera.trade.OptionType; /* $License$ */ /** * Tests {@link TopOfBookEventBuilder} and {@link TopOfBookEventImpl}. * * @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> * @version $Id: TopOfBookEventTest.java 16154 2012-07-14 16:34:05Z colin $ * @since 2.0.0 */ public class TopOfBookEventTest extends AbstractEventBuilderTestBase<TopOfBookEvent,TopOfBookEventBuilder> { /** * Run before each test. * * @throws Exception if an error occurs */ @Before public void setup() throws Exception { useEquity = true; } /** * Tests {@link TopOfBookEventBuilder#withAsk(org.marketcetera.event.AskEvent)}. * * @throws Exception if an unexpected error occurs */ @Test public void withAsk() throws Exception { useEquity = true; TopOfBookEventBuilder builder = setDefaults(getBuilder()); AskEvent ask = null; builder.withAsk(ask); assertEquals(ask, builder.getAsk()); ask = generateAsk(); builder.withAsk(ask); assertEquals(ask, builder.getAsk()); useEquity = false; builder.withAsk(ask); assertEquals(ask, builder.getAsk()); verify(builder); } /** * Tests {@link TopOfBookEventBuilder#withBid(org.marketcetera.event.BidEvent)}. * * @throws Exception if an unexpected error occurs */ @Test public void withBid() throws Exception { useEquity = true; TopOfBookEventBuilder builder = setDefaults(getBuilder()); BidEvent bid = null; builder.withBid(bid); assertEquals(bid, builder.getBid()); bid = generateBid(); builder.withBid(bid); assertEquals(bid, builder.getBid()); useEquity = false; builder.withBid(bid); assertEquals(bid, builder.getBid()); verify(builder); } /** * Tests {@link TopOfBookEventBuilder#withInstrument(org.marketcetera.trade.Instrument)}. * * @throws Exception if an unexpected error occurs */ @Test public void withInstrument() throws Exception { TopOfBookEventBuilder builder = setDefaults(getBuilder()); Instrument instrument = null; builder.withInstrument(instrument); assertEquals(instrument, builder.getInstrument()); instrument = equity; builder.withInstrument(instrument); assertEquals(instrument, builder.getInstrument()); useEquity = false; builder = setDefaults(getBuilder()); instrument = option; builder.withInstrument(instrument); assertEquals(instrument, builder.getInstrument()); verify(builder); } /** * Tests {@link DepthOfBookEventImpl} validation. * * @throws Exception if an unexpected error occurs */ @Test public void validation() throws Exception { super.validation(); // null instrument final TopOfBookEventBuilder builder = setDefaults(getBuilder()).withInstrument(null); new ExpectedFailure<IllegalArgumentException>(VALIDATION_NULL_INSTRUMENT.getText()) { @Override protected void run() throws Exception { builder.create(); } }; // ask null (ok) setDefaults(builder).withAsk(null); verify(builder); // bid null (ok) setDefaults(builder).withBid(null); verify(builder); // bid instrument does not match top-of-book instrument setDefaults(builder).withInstrument(option); new ExpectedFailure<IllegalArgumentException>(VALIDATION_BID_INCORRECT_INSTRUMENT.getText(equity, option)) { @Override protected void run() throws Exception { builder.create(); } }; // ask instrument does not match top-of-book instrument (takes a little more set-up because bid is validated first) AskEvent optionAsk = EventTestBase.generateOptionAskEvent(option, QuoteAction.ADD); setDefaults(builder).withAsk(optionAsk); new ExpectedFailure<IllegalArgumentException>(VALIDATION_ASK_INCORRECT_INSTRUMENT.getText(option, equity)) { @Override protected void run() throws Exception { builder.create(); } }; } /* (non-Javadoc) * @see org.marketcetera.event.impl.AbstractEventBuilderTestBase#setDefaults(org.marketcetera.event.impl.AbstractEventBuilderImpl) */ @Override protected TopOfBookEventBuilder setDefaults(TopOfBookEventBuilder inBuilder) throws Exception { inBuilder = super.setDefaults(inBuilder); if(useEquity) { inBuilder.withAsk(EventTestBase.generateEquityAskEvent(equity, QuoteAction.ADD)); inBuilder.withBid(EventTestBase.generateEquityBidEvent(equity, QuoteAction.ADD)); inBuilder.withInstrument(equity); } else { inBuilder.withAsk(EventTestBase.generateOptionAskEvent(option, QuoteAction.ADD)); inBuilder.withBid(EventTestBase.generateOptionBidEvent(option, QuoteAction.ADD)); inBuilder.withInstrument(option); } return inBuilder; } /* (non-Javadoc) * @see org.marketcetera.event.impl.AbstractEventBuilderTestBase#verify(org.marketcetera.event.impl.AbstractEventBuilderImpl) */ @Override protected TopOfBookEvent verify(TopOfBookEventBuilder inBuilder) throws Exception { TopOfBookEvent event = super.verify(inBuilder); assertEquals(inBuilder.getAsk(), event.getAsk()); assertEquals(inBuilder.getBid(), event.getBid()); assertEquals(inBuilder.getInstrument(), event.getInstrument()); assertEquals(inBuilder.getInstrument().getSymbol(), event.getInstrumentAsString()); List<Event> expectedDecomposedEvents = new ArrayList<Event>(); if(inBuilder.getBid() != null) { expectedDecomposedEvents.add(inBuilder.getBid()); } if(inBuilder.getAsk() != null) { expectedDecomposedEvents.add(inBuilder.getAsk()); } assertEquals(expectedDecomposedEvents, event.decompose()); return event; } /* (non-Javadoc) * @see org.marketcetera.event.impl.AbstractEventBuilderTestBase#getBuilder() */ @Override protected TopOfBookEventBuilder getBuilder() { return TopOfBookEventBuilder.topOfBookEvent(); } /** * Generates an <code>AskEvent</code>. * * @return an <code>AskEvent</code> value * @throws Exception if an unexpected error occurs */ private AskEvent generateAsk() throws Exception { if(useEquity) { return EventTestBase.generateEquityAskEvent(equity, QuoteAction.ADD); } else { return EventTestBase.generateOptionAskEvent(option, QuoteAction.ADD); } } /** * Generates a <code>BidEvent</code>. * * @return a <code>BidEvent</code> value * @throws Exception if an unexpected error occurs */ private BidEvent generateBid() throws Exception { if(useEquity) { return EventTestBase.generateEquityBidEvent(equity, QuoteAction.ADD); } else { return EventTestBase.generateOptionBidEvent(option, QuoteAction.ADD); } } /** * indicates whether to use EQUITY or OPTION instrument types to create builders */ private boolean useEquity = true; /** * test instrument */ private final Equity equity = new Equity("METC"); /** * test option */ private final Option option = new Option("MSFT", "20100319", BigDecimal.ONE, OptionType.Call); }