package name.abuchen.portfolio.snapshot.security; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import name.abuchen.portfolio.PortfolioBuilder; import name.abuchen.portfolio.SecurityBuilder; import name.abuchen.portfolio.TestCurrencyConverter; import name.abuchen.portfolio.model.Client; import name.abuchen.portfolio.model.Portfolio; import name.abuchen.portfolio.model.Security; import name.abuchen.portfolio.money.CurrencyUnit; import name.abuchen.portfolio.money.Money; import name.abuchen.portfolio.money.Values; import org.junit.Test; @SuppressWarnings("nls") public class CostCalculationTest { @Test public void testFifoBuySellTransactions() { Client client = new Client(); Security security = new SecurityBuilder() // .addTo(client); Portfolio portfolio = new PortfolioBuilder() // .buy(security, "2010-01-01", 109 * Values.Share.factor(), 314920) // .sell(security, "2010-02-01", 15 * Values.Share.factor(), 53150) // .buy(security, "2010-03-01", 52 * Values.Share.factor(), 168492) // .buy(security, "2010-03-01", 32 * Values.Share.factor(), 95930) // .addTo(client); CostCalculation cost = new CostCalculation(); cost.setTermCurrency(CurrencyUnit.EUR); cost.visitAll(new TestCurrencyConverter(), portfolio.getTransactions()); // expected: // 3149,20 - round(3149,20 * 15/109) + 1684,92 + 959,30 = 5360,04385 assertThat(cost.getFifoCost(), is(Money.of(CurrencyUnit.EUR, 536005L))); } @Test public void testThatRoundingDifferencesAreRemovedIfZeroSharesHeld() { Client client = new Client(); Security security = new SecurityBuilder() // .addTo(client); Portfolio portfolio = new PortfolioBuilder() // .buy(security, "2010-01-01", 10 * Values.Share.factor(), 1) // .sell(security, "2010-02-01", 3 * Values.Share.factor(), 1) // .sell(security, "2010-03-01", 3 * Values.Share.factor(), 1) // .sell(security, "2010-03-01", 4 * Values.Share.factor(), 1) // .addTo(client); CostCalculation cost = new CostCalculation(); cost.setTermCurrency(CurrencyUnit.EUR); cost.visitAll(new TestCurrencyConverter(), portfolio.getTransactions()); assertThat(cost.getFifoCost(), is(Money.of(CurrencyUnit.EUR, 0L))); } @Test public void testWhenSharesHeldGoToZero() { Client client = new Client(); Security security = new SecurityBuilder() // .addTo(client); Portfolio portfolio = new PortfolioBuilder() // .buy(security, "2010-01-01", 100 * Values.Share.factor(), 314920) // .sell(security, "2010-02-01", 100 * Values.Share.factor(), 53150) // .buy(security, "2010-03-01", 50 * Values.Share.factor(), 168492) // .sell(security, "2010-04-01", 50 * Values.Share.factor(), 53150) // .addTo(client); CostCalculation cost = new CostCalculation(); cost.setTermCurrency(CurrencyUnit.EUR); cost.visitAll(new TestCurrencyConverter(), portfolio.getTransactions()); assertThat(cost.getFifoCost(), is(Money.of(CurrencyUnit.EUR, 0L))); } }