package name.abuchen.portfolio.snapshot.security; import static org.junit.Assert.assertThat; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import org.hamcrest.number.IsCloseTo; import org.junit.Test; import name.abuchen.portfolio.TestCurrencyConverter; import name.abuchen.portfolio.model.PortfolioTransaction; import name.abuchen.portfolio.model.Security; import name.abuchen.portfolio.model.Transaction; import name.abuchen.portfolio.model.Transaction.Unit; import name.abuchen.portfolio.money.CurrencyUnit; import name.abuchen.portfolio.money.Money; import name.abuchen.portfolio.money.Values; @SuppressWarnings("nls") public class IRRCalculationTest { @Test public void testDividendPaymentsWithTaxes() { List<Transaction> tx = new ArrayList<>(); Security security = new Security(); tx.add(new PortfolioTransaction("2015-12-31", // CurrencyUnit.EUR, Values.Amount.factorize(1000), // security, Values.Share.factorize(10), PortfolioTransaction.Type.BUY, // Values.Amount.factorize(10), 0)); DividendTransaction t = new DividendTransaction(); t.setDate(LocalDate.parse("2016-06-01")); t.setSecurity(security); t.setMonetaryAmount(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100))); t.setShares(Values.Share.factorize(10)); t.addUnit(new Unit(Unit.Type.TAX, Money.of(CurrencyUnit.EUR, Values.Amount.factorize(50)))); tx.add(t); tx.add(new PortfolioTransaction("2016-12-31", // CurrencyUnit.EUR, Values.Amount.factorize(1200), // security, Values.Share.factorize(10), PortfolioTransaction.Type.SELL, // Values.Amount.factorize(10), Values.Amount.factorize(30))); IRRCalculation calculation = Calculation.perform(IRRCalculation.class, new TestCurrencyConverter(), tx); // Excel verification // 31.12.15 -1000 // 01.06.16 150 // 31.12.16 1230 // =XINTZINSFUSS(B1:B3;A1:A3) = 0,412128788 assertThat(calculation.getIRR(), IsCloseTo.closeTo(0.412128788d, 0.00000001d)); } }