package org.marketcetera.marketdata; import static org.junit.Assert.*; import static org.marketcetera.marketdata.AssetClass.OPTION; import static org.marketcetera.marketdata.Content.DIVIDEND; import static org.marketcetera.marketdata.Content.LATEST_TICK; import static org.marketcetera.marketdata.Content.LEVEL_2; import static org.marketcetera.marketdata.Content.*; import java.util.*; import org.junit.Test; import org.marketcetera.module.ExpectedFailure; import org.marketcetera.util.test.EqualityAssert; /* $License$ */ /** * Tests {@link MarketDataRequestBean}. * * @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> * @version $Id: MarketDataRequestBeanTest.java 16154 2012-07-14 16:34:05Z colin $ * @since 2.1.0 */ public class MarketDataRequestBeanTest { /** * Tests {@link MarketDataRequestBean#getProvider()} and {@link MarketDataRequestBean#setProvider(String)}. * * @throws Exception if an unexpected error occurs */ @Test public void provider() throws Exception { MarketDataRequestBean bean = new MarketDataRequestBean(); assertNull(bean.getProvider()); bean.setProvider(""); assertEquals("", bean.getProvider()); bean.setProvider("provider"); assertEquals("provider", bean.getProvider()); bean.setProvider(null); assertNull(bean.getProvider()); assertNotNull(bean.toString()); } /** * Tests {@link MarketDataRequestBean#getExchange()} and {@link MarketDataRequestBean#setExchange(String)}. * * @throws Exception if an unexpected error occurs */ @Test public void exchange() throws Exception { MarketDataRequestBean bean = new MarketDataRequestBean(); assertNull(bean.getExchange()); bean.setExchange(""); assertEquals("", bean.getExchange()); bean.setExchange("Exchange"); assertEquals("Exchange", bean.getExchange()); bean.setExchange(null); assertNull(bean.getExchange()); assertNotNull(bean.toString()); } /** * Tests {@link MarketDataRequestBean#getAssetClass()} and {@link MarketDataRequestBean#setAssetClass(AssetClass)}. * * @throws Exception if an unexpected error occurs */ @Test public void assetClass() throws Exception { MarketDataRequestBean bean = new MarketDataRequestBean(); assertNull(bean.getAssetClass()); bean.setAssetClass(AssetClass.EQUITY); assertEquals(AssetClass.EQUITY, bean.getAssetClass()); bean.setAssetClass(null); assertNull(bean.getAssetClass()); assertNotNull(bean.toString()); } /** * Tests {@link MarketDataRequestBean#getSymbols()} and {@link MarketDataRequestBean#setSymbols(java.util.Collection)}. * * @throws Exception if an unexpected error occurs */ @Test public void symbols() throws Exception { final MarketDataRequestBean bean = new MarketDataRequestBean(); assertTrue(bean.getSymbols().isEmpty()); new ExpectedFailure<NullPointerException>() { @Override protected void run() throws Exception { bean.setSymbols(null); } }; bean.setSymbols(Arrays.asList(symbols)); assertEquals(new LinkedHashSet<String>(Arrays.asList(expectedSymbols)), bean.getSymbols()); bean.setSymbols(new ArrayList<String>()); assertTrue(bean.getSymbols().isEmpty()); assertNotNull(bean.toString()); } /** * Tests {@link MarketDataRequestBean#getUnderlyingSymbols()} and {@link MarketDataRequestBean#setUnderlyingSymbols(java.util.Collection)}. * * @throws Exception if an unexpected error occurs */ @Test public void underlyingSymbols() throws Exception { final MarketDataRequestBean bean = new MarketDataRequestBean(); assertTrue(bean.getUnderlyingSymbols().isEmpty()); new ExpectedFailure<NullPointerException>() { @Override protected void run() throws Exception { bean.setUnderlyingSymbols(null); } }; bean.setUnderlyingSymbols(Arrays.asList(symbols)); assertTrue(Arrays.equals(expectedSymbols, bean.getUnderlyingSymbols().toArray(new String[0]))); bean.setUnderlyingSymbols(new ArrayList<String>()); assertTrue(bean.getUnderlyingSymbols().isEmpty()); assertNotNull(bean.toString()); } /** * Tests {@link MarketDataRequestBean#getParameters()}, {@link MarketDataRequestBean#setParameter(String, String)}, * and {@link MarketDataRequestBean#setParameters(java.util.Map)}. * * @throws Exception if an unexpected error occurs */ @Test public void parameters() throws Exception { final MarketDataRequestBean bean = new MarketDataRequestBean(); Map<String,String> expectedResults = new HashMap<String,String>(); assertTrue(bean.getParameters().isEmpty()); bean.setParameter(null, "value"); expectedResults.put(null, "value"); assertEquals(expectedResults, bean.getParameters()); bean.setParameter("", "value2"); expectedResults.put("", "value2"); assertEquals(expectedResults, bean.getParameters()); bean.setParameter("key", "value3"); expectedResults.put("key", "value3"); assertEquals(expectedResults, bean.getParameters()); bean.setParameter("key", "value4"); expectedResults.put("key", "value4"); assertEquals(expectedResults, bean.getParameters()); bean.setParameter("key", null); expectedResults.put("key", null); assertEquals(expectedResults, bean.getParameters()); bean.setParameter("key2", ""); expectedResults.put("key2", ""); assertEquals(expectedResults, bean.getParameters()); // test setParameters expectedResults.clear(); new ExpectedFailure<NullPointerException>() { @Override protected void run() throws Exception { bean.setParameters(null); } }; Map<String,String> testMap = new HashMap<String,String>(); bean.setParameters(testMap); assertTrue(bean.getParameters().isEmpty()); testMap.put(null, "value"); expectedResults.put(null, "value"); bean.setParameters(testMap); assertEquals(expectedResults, bean.getParameters()); testMap.put("", "value2"); expectedResults.put("", "value2"); bean.setParameters(testMap); assertEquals(expectedResults, bean.getParameters()); testMap.put("key3", "value3"); expectedResults.put("key3", "value3"); bean.setParameters(testMap); assertEquals(expectedResults, bean.getParameters()); testMap.put("key3", null); expectedResults.put("key3", null); bean.setParameters(testMap); assertEquals(expectedResults, bean.getParameters()); testMap.put("key4", ""); expectedResults.put("key4", ""); bean.setParameters(testMap); assertEquals(expectedResults, bean.getParameters()); assertNotNull(bean.toString()); } /** * Tests {@link MarketDataRequestBean#getContent()} and {@link MarketDataRequestBean#setContent(java.util.Collection)}. * * @throws Exception if an unexpected error occurs */ @Test public void content() throws Exception { final MarketDataRequestBean bean = new MarketDataRequestBean(); new ExpectedFailure<NullPointerException>() { @Override protected void run() throws Exception { bean.setContent(null); } }; assertTrue(bean.getContent().isEmpty()); bean.setContent(Arrays.asList(contents)); assertTrue(Arrays.equals(expectedContents, bean.getContent().toArray(new Content[0]))); bean.setContent(EnumSet.noneOf(Content.class)); assertTrue(bean.getContent().isEmpty()); assertNotNull(bean.toString()); } /** * Tests {@link MarketDataRequestBean#clone()}. * * @throws Exception if an unexpected error occurs */ @Test public void testClone() throws Exception { // this test will create a MDRB and change its attributes one-by-one. as each attribute // is changed, a clone will be spawned. the clone will be equal to the original until the // next attribute is changed. within each attribute test block, the attribute is modified // to make sure that the clone has its own attribute value, not a reference to the original's. // clone an empty bean MarketDataRequestBean bean1 = new MarketDataRequestBean(); // asset class MarketDataRequestBean bean2 = bean1.clone(); EqualityAssert.assertEquality(bean1, bean2, this); bean1.setAssetClass(OPTION); EqualityAssert.assertEquality(bean1, bean1.clone(), bean2); // content MarketDataRequestBean bean3 = bean1.clone(); EqualityAssert.assertEquality(bean1, bean3, bean2); bean1.setContent(Arrays.asList(contents)); EqualityAssert.assertEquality(bean1, bean1.clone(), bean2, bean3); // exchange MarketDataRequestBean bean4 = bean1.clone(); EqualityAssert.assertEquality(bean1, bean4, bean2, bean3); bean1.setExchange("exchange"); EqualityAssert.assertEquality(bean1, bean1.clone(), bean2, bean3, bean4); // parameters MarketDataRequestBean bean5 = bean1.clone(); EqualityAssert.assertEquality(bean1, bean5, bean2, bean3, bean4); bean1.setParameter("key", "value"); EqualityAssert.assertEquality(bean1, bean1.clone(), bean2, bean3, bean4, bean5); // provider MarketDataRequestBean bean6 = bean1.clone(); EqualityAssert.assertEquality(bean1, bean6, bean2, bean3, bean4, bean5); bean1.setProvider("provider"); EqualityAssert.assertEquality(bean1, bean1.clone(), bean2, bean3, bean4, bean5, bean6); // symbols MarketDataRequestBean bean7 = bean1.clone(); EqualityAssert.assertEquality(bean1, bean7, bean2, bean3, bean4, bean5, bean6); List<String> symbols = Arrays.asList(new String[] { "symbol1", "symbol2" } ); bean1.setSymbols(symbols); EqualityAssert.assertEquality(bean1, bean1.clone(), bean2, bean3, bean4, bean5, bean6, bean7); // special test for non-empty collections, make sure the collection was deep-copied bean7 = bean1.clone(); EqualityAssert.assertEquality(bean1, bean7, bean2); assertFalse(bean7.getSymbols().isEmpty()); assertEquals(bean1.getSymbols(), bean7.getSymbols()); symbols = Arrays.asList(new String[] { "symbol1", "symbol2", "symbol3" } ); bean1.setSymbols(symbols); EqualityAssert.assertEquality(bean1, bean1.clone(), bean7); // underlying symbols MarketDataRequestBean bean8 = bean1.clone(); EqualityAssert.assertEquality(bean1, bean8, bean2, bean3, bean4, bean5, bean6, bean7); symbols = Arrays.asList(new String[] { "symbol1", "symbol2" } ); bean1.setUnderlyingSymbols(symbols); EqualityAssert.assertEquality(bean1, bean1.clone(), bean2, bean3, bean4, bean5, bean6, bean7, bean8); // special test for non-empty collections, make sure the collection was deep-copied bean8 = bean1.clone(); EqualityAssert.assertEquality(bean1, bean8, bean2); assertFalse(bean8.getUnderlyingSymbols().isEmpty()); assertEquals(bean1.getUnderlyingSymbols(), bean8.getUnderlyingSymbols()); symbols = Arrays.asList(new String[] { "symbol1", "symbol2", "symbol3" } ); bean1.setUnderlyingSymbols(symbols); EqualityAssert.assertEquality(bean1, bean1.clone(), bean8); assertNotNull(bean1.toString()); } /** * Tests {@link MarketDataRequest#hashCode()} and {@link MarketDataRequest#equals(Object)}. * * @throws Exception if an unexpected error occurs */ @Test public void hashCodeAndEquals() throws Exception { // the pattern of this test is to create two beans: 1 & 2 that will always // be equal (but not same). there will also be a bean: 3 that is always // not equal to 1 & 2. the attributes are set in 3 one-at-a-time to a // non-null or non-empty value. after each comparison, the values in 1 & 2 // are synced to 3 to make 1 & 2 progressively non-null or non-empty. in this // way, each component of the equals (and hashCode) method is tested in sequence. MarketDataRequestBean bean1 = new MarketDataRequestBean(); // this bean will always be the same MarketDataRequestBean bean2 = bean1.clone(); // compare with null and not MDRB EqualityAssert.assertEquality(bean1, bean2, this, null); // this bean will always be different MarketDataRequestBean bean3 = new MarketDataRequestBean(); // differ by AssetClass assertNull(bean1.getAssetClass()); bean3.setAssetClass(OPTION); EqualityAssert.assertEquality(bean1, bean2, bean3); bean1 = bean3.clone(); bean2 = bean1.clone(); // differ by content assertTrue(bean1.getContent().isEmpty()); bean3.setContent(EnumSet.of(TOP_OF_BOOK)); EqualityAssert.assertEquality(bean1, bean2, bean3); bean1 = bean3.clone(); bean2 = bean1.clone(); // differ by exchange assertNull(bean1.getExchange()); bean3.setExchange("exchange"); EqualityAssert.assertEquality(bean1, bean2, bean3); bean1 = bean3.clone(); bean2 = bean1.clone(); // differ by provider assertNull(bean1.getProvider()); bean3.setProvider("provider"); EqualityAssert.assertEquality(bean1, bean2, bean3); bean1 = bean3.clone(); bean2 = bean1.clone(); // differ by symbols assertTrue(bean1.getSymbols().isEmpty()); bean3.setSymbols(Arrays.asList(symbols)); EqualityAssert.assertEquality(bean1, bean2, bean3); bean1 = bean3.clone(); bean2 = bean1.clone(); // differ by underlying symbols assertTrue(bean1.getUnderlyingSymbols().isEmpty()); bean3.setUnderlyingSymbols(Arrays.asList(symbols)); EqualityAssert.assertEquality(bean1, bean2, bean3); bean1 = bean3.clone(); bean2 = bean1.clone(); // differ by parameters assertTrue(bean1.getParameters().isEmpty()); bean3.setParameter("key", "value"); EqualityAssert.assertEquality(bean1, bean2, bean3); } /** * test content values (contain duplicates and null) */ private static Content[] contents = new Content[] { BBO10, LEVEL_2, DIVIDEND, LATEST_TICK, LATEST_TICK, OPEN_BOOK, null }; /** * expected content values (same as {@link #contents} except duplicates removed) */ private static Content[] expectedContents = new Content[] { BBO10, LEVEL_2, DIVIDEND, LATEST_TICK, OPEN_BOOK, null }; /** * test symbols (contain duplicates, null, and empty) */ private static String[] symbols = new String[] { "A", "ABC", "ABCD", "B", "A", "AAA", null, "" }; /** * expected symbol values (same as {@link #symbols} except duplicates removed) */ private static String[] expectedSymbols = new String[] { "A", "ABC", "ABCD", "B", "AAA", null, "" }; }