package com.codiform.moo; import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasToString; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; import java.util.Calendar; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.junit.Before; import org.junit.Test; import com.codiform.moo.configuration.Configuration; import com.codiform.moo.curry.Translate; import com.codiform.moo.domain.LastSecurityPrices; import com.codiform.moo.domain.Portfolio; import com.codiform.moo.domain.PortfolioCopy; import com.codiform.moo.domain.PortfolioValue; import com.codiform.moo.domain.Position; import com.codiform.moo.domain.PositionBySymbol; import com.codiform.moo.domain.PreviousMarketPrices; import com.codiform.moo.domain.Security; import com.codiform.moo.domain.SecurityPrices; public class MapPropertyTranslationTest { private Portfolio source = new Portfolio(); private Map<String, Security> securities; @Before public void testSetUpStocks() { securities = new HashMap<String, Security>(); securities.put( "AAPL", new Security( "AAPL", "NASDAQ" ) ); securities.put( "RIMM", new Security( "RIMM", "TSE" ) ); securities.put( "BB", new Security( "BB", "TSE", securities.get( "RIMM" ) ) ); securities.put( "ORCL", new Security( "ORCL", "NYSE" ) ); Calendar cal = Calendar.getInstance(); cal.set( 2013, Calendar.DECEMBER, 4, 16, 0, 0 ); source.add( securities.get( "ORCL" ), new Position( 5000, 35.07f, cal.getTime() ) ); cal.set( 2013, Calendar.NOVEMBER, 21, 13, 00, 00 ); Position oldPosition = new Position( 8000, 514.86f, cal.getTime() ); cal.set( 2013, Calendar.DECEMBER, 4, 19, 59, 00 ); source.add( securities.get( "AAPL" ), new Position( 10000, 565.00f, cal.getTime(), oldPosition ) ); cal.set( Calendar.MINUTE, 57 ); source.add( securities.get( "BB" ), new Position( 3000, 38.94f, cal.getTime() ) ); } @Test public void testTranslateWithoutAnnotationsCopiesMap() { PortfolioCopy copy = Translate.to( PortfolioCopy.class ).from( source ); assertNotSame( source.getPositions(), copy.getPositions() ); assertEquals( source.getPositions(), copy.getPositions() ); } @Test public void testTranslateWithoutAnnotationsCopiesMapWithNullKey() { Position nullPosition = new Position( 0, 0.0f, null ); source.add( null, nullPosition ); PortfolioCopy copy = Translate.to( PortfolioCopy.class ).from( source ); assertNotSame( source.getPositions(), copy.getPositions() ); assertEquals( source.getPositions(), copy.getPositions() ); Position nullCopy = copy.getPositions().get( null ); assertNotNull( nullCopy ); assertEquals( nullPosition, nullCopy ); } @Test public void testTranslateWithoutDefensiveCopyUsesSameMap() { Configuration configuration = new Configuration(); configuration.setPerformingDefensiveCopies( false ); PortfolioCopy copy = new Moo( configuration ).translate( source, PortfolioCopy.class ); assertEquals( source.getPositions(), copy.getPositions() ); assertSame( source.getPositions(), copy.getPositions() ); } @Test public void testTranslateMapKeyWithSourceClass() { PositionBySymbol pbs = Translate.to( PositionBySymbol.class ).from( source ); assertThat( pbs.size(), equalTo( 3 ) ); assertNotNull( pbs.getPosition( "AAPL" ) ); assertThat( pbs.getPosition( "AAPL" ).getLastKnownValue(), is( closeTo( 5650000d, 1d ) ) ); assertThat( pbs.getPosition( "BB" ).getLastKnownValue(), is( closeTo( 116820d, 1d ) ) ); assertThat( pbs.getPosition( "ORCL" ).getLastKnownValue(), is( closeTo( 175350d, 1d ) ) ); } @Test public void testTranslateMapKeyWithSourceKeyExpressionAndSourceClass() { MarketHoldings mh = Translate.to( MarketHoldings.class ).from( source ); assertThat( mh.size(), equalTo( 3 ) ); assertNotNull( mh.getPosition( "NASDAQ" ) ); assertThat( mh.getPosition( "NASDAQ" ).getLastKnownValue(), is( closeTo( 5650000d, 1d ) ) ); assertThat( mh.getPosition( "TSE" ).getLastKnownValue(), is( closeTo( 116820d, 1d ) ) ); assertThat( mh.getPosition( "NYSE" ).getLastKnownValue(), is( closeTo( 175350d, 1d ) ) ); } @Test public void testTranslateMapKeyWithSourceKeyExpression() { // given Security bb = securities.get( "BB" ); Security rimm = bb.getPreviousSecurity(); // when RenamedHoldings rh = Translate.to( RenamedHoldings.class ).from( source ); // then assertThat( rh.size(), equalTo( 1 ) ); assertNotNull( rh.getPosition( rimm ) ); assertThat( rh.getPosition( rimm ), is( equalTo( source.getPosition( bb ) ) ) ); } @Test public void testTranslateMapValueWithSourceValueExpression() { // when PortfolioValue pv = Translate.to( PortfolioValue.class ).from( source ); // then assertThat( pv.size(), is( equalTo( 3 ) ) ); assertThat( pv.getValue( securities.get( "BB" ) ), is( closeTo( 116820d, 1d ) ) ); } @Test public void testTranslateMapValueWithValueClass() { SecurityPrices prices = Translate.to( SecurityPrices.class ).from( source ); assertThat( prices.size(), is( equalTo( 3 ) ) ); assertThat( prices.getPrice( securities.get( "AAPL" ) ), hasToString( "$565.0 at 2013-Dec-04 19:59" ) ); assertThat( prices.getPrice( securities.get( "BB" ) ), hasToString( "$38.94 at 2013-Dec-04 19:57" ) ); assertThat( prices.getPrice( securities.get( "ORCL" ) ), hasToString( "$35.07 at 2013-Dec-04 16:00" ) ); } @Test public void testTranslateMapValueWithValueSourceAndValueClass() { LastSecurityPrices prices = Translate.to( LastSecurityPrices.class ).from( source ); assertThat( prices.size(), is( equalTo( 3 ) ) ); assertThat( prices.getPrice( securities.get( "AAPL" ) ), hasToString( "$514.86 at 2013-Nov-21 13:00" ) ); assertThat( prices.getPrice( securities.get( "BB" ) ), is( nullValue() ) ); assertThat( prices.getPrice( securities.get( "ORACL" ) ), is( nullValue() ) ); } @Test public void testTranslateMapKeyAndValueWithSourceAndClass() { PreviousMarketPrices prices = Translate.to( PreviousMarketPrices.class ).from( source ); assertThat( prices.size(), is( equalTo( 3 ) ) ); assertThat( prices.getPrice( "NASDAQ" ), hasToString( "$514.86 at 2013-Nov-21 13:00" ) ); assertThat( prices.getPrice( "TSE" ), is( nullValue() ) ); assertThat( prices.getPrice( "NYSE" ), is( nullValue() ) ); } @Test public void testTranslateMapType() { SymbolSortedPortfolio sorted = Translate.to( SymbolSortedPortfolio.class ).from( source ); assertThat( sorted.size(), is( equalTo( 3 ) )); Iterator<Security> iterator = sorted.iterator(); Security security = iterator.next(); assertThat( security, is( equalTo( securities.get( "AAPL" ) ) ) ); Position position = sorted.getPosition( security ); assertThat( position.getLastKnownValue(), is( closeTo( 5650000d, 1d ) ) ); security = iterator.next(); assertThat( security, is( equalTo( securities.get( "BB" ) ) ) ); position = sorted.getPosition( security ); assertThat( position.getLastKnownValue(), is( closeTo( 116820d, 1d ) ) ); security = iterator.next(); assertThat( security, is( equalTo( securities.get( "ORCL" ) ) ) ); position = sorted.getPosition( security ); assertThat( position.getLastKnownValue(), is( closeTo( 175350d, 1d ) ) ); } }