package org.marketcetera.event.beans; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import java.math.BigDecimal; import java.util.Date; import org.junit.Test; import org.marketcetera.event.EventType; import org.marketcetera.marketdata.DateUtils; 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; import org.marketcetera.util.test.EqualityAssert; /* $License$ */ /** * Tests {@link MarketDataBean}. * * @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> * @version $Id: MarketDataBeanTest.java 16154 2012-07-14 16:34:05Z colin $ * @since 2.0.0 */ public class MarketDataBeanTest extends AbstractEventBeanTestBase<MarketDataBean> { /** * Tests {@link MarketDataBean#copy(MarketDataBean)}. * * @throws Exception if an unexpected error occurs */ @Test public void copy() throws Exception { EventBeanTest.doCopyTest(new MarketDataBean()); doCopyTest(new MarketDataBean()); } /** * Tests {@link E#getInstrument()} and {@link E#setInstrument(org.marketcetera.trade.Instrument)}. * * @throws Exception if an unexpected error occurs */ @Test public void instrument() throws Exception { MarketDataBean bean = constructBean(); assertNull(bean.getInstrument()); assertNull(bean.getInstrumentAsString()); Equity equity = new Equity("METC"); Option option = new Option("METC", "201001", BigDecimal.TEN, OptionType.Put); bean.setInstrument(equity); assertEquals(equity, bean.getInstrument()); assertEquals(equity.getSymbol(), bean.getInstrumentAsString()); bean.setInstrument(option); assertEquals(option, bean.getInstrument()); assertEquals(option.getSymbol(), bean.getInstrumentAsString()); } /** * Tests {@link MarketDataBean#hashCode()} and {@link MarketDataBean#equals(Object)}. * * @throws Exception if an unexpected error occurs */ @Override public void hashCodeAndEquals() throws Exception { // test empty bean equality (and inequality with an object of a different class and null) // beans 1 & 2 will always be the same, bean 3 will always be different MarketDataBean bean1 = constructBean(); MarketDataBean bean2 = constructBean(); MarketDataBean bean3 = constructBean(); assertNull(bean1.getExchange()); assertNull(bean2.getExchange()); assertNull(bean1.getExchangeTimestamp()); assertNull(bean2.getExchangeTimestamp()); assertNull(bean1.getInstrument()); assertNull(bean2.getInstrument()); assertNull(bean1.getPrice()); assertNull(bean2.getPrice()); assertNull(bean1.getSize()); assertNull(bean2.getSize()); assertEquals(EventType.UNKNOWN, bean1.getEventType()); assertEquals(EventType.UNKNOWN, bean2.getEventType()); EqualityAssert.assertEquality(bean1, bean2, this, null); // test exchange // set bean3 to non-null assertNull(bean1.getExchange()); bean3.setExchange("test"); EqualityAssert.assertEquality(bean1, bean2, bean3); bean3.setExchange(bean1.getExchange()); // test exchangeTimestamp // set bean3 to non-null assertNull(bean1.getExchangeTimestamp()); bean3.setExchangeTimestamp(DateUtils.dateToString(new Date())); EqualityAssert.assertEquality(bean1, bean2, bean3); bean3.setExchangeTimestamp(bean1.getExchangeTimestamp()); // test instrument // set bean3 to non-null assertNull(bean1.getInstrument()); bean3.setInstrument(new Equity("METC")); EqualityAssert.assertEquality(bean1, bean2, bean3); bean3.setInstrument(bean1.getInstrument()); // test price // set bean3 to non-null assertNull(bean1.getPrice()); bean3.setPrice(BigDecimal.ZERO); EqualityAssert.assertEquality(bean1, bean2, bean3); bean3.setPrice(bean1.getPrice()); // test size // set bean3 to non-null assertNull(bean1.getSize()); bean3.setSize(BigDecimal.TEN); EqualityAssert.assertEquality(bean1, bean2, bean3); // test meta-type // set bean3 to non-null assertEquals(EventType.UNKNOWN, bean1.getEventType()); bean3.setEventType(EventType.UPDATE_FINAL); EqualityAssert.assertEquality(bean1, bean2, bean3); } /* (non-Javadoc) * @see org.marketcetera.event.beans.AbstractEventBeanTestBase#doAdditionalValidationTest(org.marketcetera.event.beans.EventBean) */ @Override protected void doAdditionalValidationTest(final MarketDataBean inBean) throws Exception { assertNull(inBean.getInstrument()); new ExpectedFailure<IllegalArgumentException>(VALIDATION_NULL_INSTRUMENT.getText()) { @Override protected void run() throws Exception { inBean.validate(); } }; inBean.setInstrument(new Equity("METC")); assertNull(inBean.getPrice()); new ExpectedFailure<IllegalArgumentException>(VALIDATION_NULL_PRICE.getText()) { @Override protected void run() throws Exception { inBean.validate(); } }; inBean.setPrice(BigDecimal.ONE); assertNull(inBean.getSize()); new ExpectedFailure<IllegalArgumentException>(VALIDATION_NULL_SIZE.getText()) { @Override protected void run() throws Exception { inBean.validate(); } }; inBean.setSize(BigDecimal.ZERO); assertNull(inBean.getExchange()); new ExpectedFailure<IllegalArgumentException>(VALIDATION_NULL_EXCHANGE.getText()) { @Override protected void run() throws Exception { inBean.validate(); } }; inBean.setExchange(""); new ExpectedFailure<IllegalArgumentException>(VALIDATION_NULL_EXCHANGE.getText()) { @Override protected void run() throws Exception { inBean.validate(); } }; inBean.setExchange("Q"); assertNull(inBean.getExchangeTimestamp()); new ExpectedFailure<IllegalArgumentException>(VALIDATION_NULL_EXCHANGE_TIMESTAMP.getText()) { @Override protected void run() throws Exception { inBean.validate(); } }; inBean.setExchangeTimestamp(""); new ExpectedFailure<IllegalArgumentException>(VALIDATION_NULL_EXCHANGE_TIMESTAMP.getText()) { @Override protected void run() throws Exception { inBean.validate(); } }; inBean.setExchangeTimestamp(DateUtils.dateToString(new Date())); inBean.setEventType(null); new ExpectedFailure<IllegalArgumentException>(VALIDATION_NULL_META_TYPE.getText()) { @Override protected void run() throws Exception { inBean.validate(); } }; inBean.setEventType(EventType.UPDATE_PART); } /* (non-Javadoc) * @see org.marketcetera.event.beans.AbstractEventBeanTestBase#constructBean() */ @Override protected MarketDataBean constructBean() { return new MarketDataBean(); } /** * Tests {@link MarketDataBean#copy(MarketDataBean)}. * * @param inBean a <code>MarketDataBean</code> value * @throws Exception if an unexpected error occurs */ static void doCopyTest(MarketDataBean inBean) throws Exception { verifyMarketDataBean(inBean, null, null, null, null, null, EventType.UNKNOWN); MarketDataBean newBean = MarketDataBean.copy(inBean); verifyMarketDataBean(newBean, null, null, null, null, null, EventType.UNKNOWN); String exchange = "test exchange"; String exchangeTimestamp = DateUtils.dateToString(new Date()); Instrument instrument = new Equity("GOOG"); BigDecimal price = BigDecimal.ONE; BigDecimal size = BigDecimal.TEN; EventType metaType = EventType.UPDATE_FINAL; inBean.setExchange(exchange); inBean.setExchangeTimestamp(exchangeTimestamp); inBean.setInstrument(instrument); inBean.setPrice(price); inBean.setSize(size); inBean.setEventType(metaType); verifyMarketDataBean(inBean, exchange, exchangeTimestamp, instrument, price, size, metaType); newBean = MarketDataBean.copy(inBean); verifyMarketDataBean(newBean, exchange, exchangeTimestamp, instrument, price, size, metaType); } /** * Verifies that the given <code>MarketDataBean</code> contains the given attributes. * * @param inBean a <code>MarketDataBean</code> value * @param inExpectedExchange a <code>String</code> value * @param inExpectedExchangeTimestamp a <code>String</code> value * @param inExpectedInstrument an <code>Instrument</code> value * @param inExpectedPrice a <code>BigDecimal</code> value * @param inExpectedSize a <code>BigDecimal</code> value * @param inExpectedMetaType an <code>EventMetaType</code> value * @throws Exception if an unexpected error occurs */ static void verifyMarketDataBean(MarketDataBean inBean, String inExpectedExchange, String inExpectedExchangeTimestamp, Instrument inExpectedInstrument, BigDecimal inExpectedPrice, BigDecimal inExpectedSize, EventType inExpectedMetaType) throws Exception { assertEquals(inExpectedExchange, inBean.getExchange()); assertEquals(inExpectedExchangeTimestamp, inBean.getExchangeTimestamp()); assertEquals(inExpectedInstrument, inBean.getInstrument()); assertEquals(inExpectedPrice, inBean.getPrice()); assertEquals(inExpectedSize, inBean.getSize()); assertEquals(inExpectedMetaType, inBean.getEventType()); } }