package issues;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.time.LocalDate;
import org.junit.Test;
import name.abuchen.portfolio.TestCurrencyConverter;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.model.ClientFactory;
import name.abuchen.portfolio.model.PortfolioTransaction;
import name.abuchen.portfolio.model.PortfolioTransferEntry;
import name.abuchen.portfolio.model.Security;
import name.abuchen.portfolio.money.CurrencyConverter;
import name.abuchen.portfolio.snapshot.ClientSnapshot;
import name.abuchen.portfolio.snapshot.ReportingPeriod;
import name.abuchen.portfolio.snapshot.SecurityPosition;
import name.abuchen.portfolio.snapshot.security.SecurityPerformanceRecord;
import name.abuchen.portfolio.snapshot.security.SecurityPerformanceSnapshot;
public class Issue371PurchaseValueWithTransfers
{
@Test
public void testPurchaseValueOfSecurityPositionWithTransfers() throws IOException
{
Client client = ClientFactory.load(Issue371PurchaseValueWithTransfers.class
.getResourceAsStream("Issue371PurchaseValueWithTransfers.xml")); //$NON-NLS-1$
Security adidas = client.getSecurities().get(0);
assertThat(adidas.getName(), is("Adidas AG")); //$NON-NLS-1$
ReportingPeriod period = new ReportingPeriod.FromXtoY(LocalDate.parse("2010-11-20"), //$NON-NLS-1$
LocalDate.parse("2015-11-20")); //$NON-NLS-1$
// make sure that the transfer entry exists
assertThat(client.getPortfolios().size(), is(2));
assertThat(client.getPortfolios().stream().flatMap(p -> p.getTransactions().stream())
.filter(t -> t.getSecurity() == adidas)
.filter(t -> t.getCrossEntry() instanceof PortfolioTransferEntry)
.filter(t -> t.getType() == PortfolioTransaction.Type.TRANSFER_IN).findAny().isPresent(),
is(true));
CurrencyConverter converter = new TestCurrencyConverter();
ClientSnapshot snapshot = ClientSnapshot.create(client, converter, period.getEndDate());
SecurityPosition securityPosition = snapshot.getPositionsByVehicle().get(adidas).getPosition();
SecurityPerformanceSnapshot securitySnapshot = SecurityPerformanceSnapshot.create(client, converter, period);
SecurityPerformanceRecord securityRecord = securitySnapshot.getRecords().get(0);
assertThat(securityRecord.getSecurity(), is(adidas));
assertThat(securityPosition.getFIFOPurchaseValue(), is(securityRecord.getFifoCost()));
}
}