package org.marketcetera.event.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; 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.DepthOfBookEvent; import org.marketcetera.event.Event; import org.marketcetera.event.EventTestBase; import org.marketcetera.event.QuoteAction; 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 DepthOfBookEventBuilder} and {@link DepthOfBookEventImpl}. * * @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> * @version $Id: DepthOfBookEventTest.java 16154 2012-07-14 16:34:05Z colin $ * @since 2.0.0 */ public class DepthOfBookEventTest extends AbstractEventBuilderTestBase<DepthOfBookEvent,DepthOfBookEventBuilder> { /** * Run before each test. * * @throws Exception if an unexpected error occurs */ @Before public void setup() throws Exception { equity = new Equity("METC"); option = new Option("MSFT", "20100319", BigDecimal.ONE, OptionType.Call); builder = setDefaults(DepthOfBookEventBuilder.depthOfBook()); } /** * Tests {@link DepthOfBookEventBuilder#withBids(List)}. * * @throws Exception if an unexpected error occurs */ @Test public void withBids() throws Exception { // null bids builder.withBids(null); assertEquals(new ArrayList<BidEvent>(), builder.getBids()); // empty bids builder.withBids(new ArrayList<BidEvent>()); assertEquals(new ArrayList<BidEvent>(), builder.getBids()); // real bids builder.withBids(bids); assertEquals(bids, builder.getBids()); verify(builder); } /** * Tests {@link DepthOfBookEventBuilder#withAsks(List)}. * * @throws Exception if an unexpected error occurs */ @Test public void withAsks() throws Exception { // null asks builder.withAsks(null); assertEquals(new ArrayList<AskEvent>(), builder.getAsks()); // empty asks builder.withAsks(new ArrayList<AskEvent>()); assertEquals(new ArrayList<AskEvent>(), builder.getAsks()); // real asks builder.withAsks(asks); assertEquals(asks, builder.getAsks()); verify(builder); } /** * Tests {@link DepthOfBookEventBuilder#withInstrument(Instrument)}. * * @throws Exception if an unexpected error occurs */ @Test public void withInstrument() throws Exception { builder.withInstrument(null); assertNull(builder.getInstrument()); builder.withInstrument(equity); assertEquals(equity, builder.getInstrument()); builder.withInstrument(option); assertEquals(option, builder.getInstrument()); } /** * Tests {@link DepthOfBookEventImpl} validation. * * @throws Exception if an unexpected error occurs */ @Test public void validation() throws Exception { super.validation(); // null instrument builder.withInstrument(null); new ExpectedFailure<IllegalArgumentException>(VALIDATION_NULL_INSTRUMENT.getText()) { @Override protected void run() throws Exception { builder.create(); } }; setDefaults(builder); // asks contains null List<AskEvent> newAsks = new ArrayList<AskEvent>(builder.getAsks()); newAsks.add(null); builder.withAsks(newAsks); new ExpectedFailure<IllegalArgumentException>(VALIDATION_LIST_CONTAINS_NULL.getText(String.valueOf(newAsks))) { @Override protected void run() throws Exception { builder.create(); } }; setDefaults(builder); // bids contains null List<BidEvent> newBids = new ArrayList<BidEvent>(builder.getBids()); newBids.add(null); builder.withBids(newBids); new ExpectedFailure<IllegalArgumentException>(VALIDATION_LIST_CONTAINS_NULL.getText(String.valueOf(newBids))) { @Override protected void run() throws Exception { builder.create(); } }; setDefaults(builder); // contains a bid with the wrong instrument builder.withInstrument(option); new ExpectedFailure<IllegalArgumentException>(VALIDATION_LIST_INCORRECT_INSTRUMENT.getText(builder.getBids().get(0), option)) { @Override protected void run() throws Exception { builder.create(); } }; setDefaults(builder); // contains an ask with the wrong instrument (a little harder to set up because bids are checked first) newAsks = new ArrayList<AskEvent>(builder.getAsks()); AskEvent badAsk = EventTestBase.generateOptionAskEvent(option, QuoteAction.ADD); newAsks.add(badAsk); builder.withAsks(newAsks); new ExpectedFailure<IllegalArgumentException>(VALIDATION_LIST_INCORRECT_INSTRUMENT.getText(badAsk, equity)) { @Override protected void run() throws Exception { builder.create(); } }; } /* (non-Javadoc) * @see org.marketcetera.event.impl.AbstractEventBuilderTestBase#verify(org.marketcetera.event.impl.AbstractEventBuilderImpl) */ @Override protected DepthOfBookEvent verify(DepthOfBookEventBuilder inBuilder) throws Exception { DepthOfBookEvent event = super.verify(inBuilder); if(inBuilder.getAsks() == null) { assertEquals(new ArrayList<AskEvent>(), event.getAsks()); } else { assertEquals(inBuilder.getAsks(), event.getAsks()); } if(inBuilder.getBids() == null) { assertEquals(new ArrayList<BidEvent>(), event.getBids()); } else { assertEquals(inBuilder.getBids(), event.getBids()); } assertEquals(inBuilder.getInstrument(), event.getInstrument()); assertEquals(inBuilder.getInstrument().getSymbol(), event.getInstrumentAsString()); List<Event> expectedDecomposedEvents = new ArrayList<Event>(); expectedDecomposedEvents.addAll(inBuilder.getBids()); expectedDecomposedEvents.addAll(inBuilder.getAsks()); assertEquals(expectedDecomposedEvents, event.decompose()); return event; } /* (non-Javadoc) * @see org.marketcetera.event.impl.AbstractEventBuilderTestBase#getBuilder() */ @Override protected DepthOfBookEventBuilder getBuilder() { return builder; } /* (non-Javadoc) * @see org.marketcetera.event.impl.AbstractEventBuilderTestBase#setDefaults(org.marketcetera.event.impl.AbstractEventBuilderImpl) */ @Override protected DepthOfBookEventBuilder setDefaults(DepthOfBookEventBuilder inBuilder) throws Exception { super.setDefaults(inBuilder); asks = EventTestBase.generateEquityAskEvents(equity, "exchange", 5); bids = EventTestBase.generateEquityBidEvents(equity, "exchange", 5); inBuilder.withAsks(asks) .withBids(bids) .withInstrument(equity); return inBuilder; } /** * test builder */ private DepthOfBookEventBuilder builder; /** * test list of asks */ private List<AskEvent> asks; /** * test list of bids */ private List<BidEvent> bids; /** * test equity */ private Equity equity; /** * test option */ private Option option; }