package name.abuchen.portfolio.datatransfer.pdf.comdirect; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.collection.IsEmptyCollection.empty; import static org.junit.Assert.assertThat; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.time.LocalDate; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.Scanner; import org.junit.Test; import name.abuchen.portfolio.datatransfer.Extractor.BuySellEntryItem; import name.abuchen.portfolio.datatransfer.Extractor.Item; import name.abuchen.portfolio.datatransfer.Extractor.SecurityItem; import name.abuchen.portfolio.datatransfer.Extractor.TransactionItem; import name.abuchen.portfolio.datatransfer.pdf.ComdirectPDFExtractor; import name.abuchen.portfolio.model.AccountTransaction; import name.abuchen.portfolio.model.BuySellEntry; import name.abuchen.portfolio.model.Client; import name.abuchen.portfolio.model.PortfolioTransaction; import name.abuchen.portfolio.model.Security; 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 ComdirectPDFExtractorTest { @Test public void testWertpapierKauf() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectWertpapierabrechnung_Kauf.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); Optional<Item> item; // security item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getName(), is("Name der Security")); assertThat(security.getIsin(), is("DE000BASF111")); assertThat(security.getWkn(), is("BASF11")); item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class)); BuySellEntry entry = (BuySellEntry) item.get().getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(1.0))); assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2000-01-01"))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of("EUR", Values.Amount.factorize(0.0)))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1))); } @Test public void testWertpapierKauf2() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectWertpapierabrechnung_Kauf2.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); Optional<Item> item; // security item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getName(), is("ComSta foobar .ETF")); assertThat(security.getIsin(), is("LU1234444444")); assertThat(security.getWkn(), is("ETF999")); item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class)); BuySellEntry entry = (BuySellEntry) item.get().getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(1413.46))); assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2011-01-01"))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of("EUR", Values.Amount.factorize(13.6)))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(42))); } @Test public void testWertpapierKauf3() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectWertpapierabrechnung_Kauf3.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); Optional<Item> item; // security item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getName(), is("NXP Semiconductors NV")); assertThat(security.getIsin(), is("NL0009538784")); assertThat(security.getWkn(), is("A1C5WJ")); item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class)); BuySellEntry entry = (BuySellEntry) item.get().getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(822.66))); assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-06-27"))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of("EUR", Values.Amount.factorize(9.9)))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(12))); } @Test public void testWertpapierKauf4() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectWertpapierabrechnung_Kauf4.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); Optional<Item> item; // security item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getName(), is("Medtronic PLC")); assertThat(security.getIsin(), is("IE00BTN1Y115")); assertThat(security.getWkn(), is("A14M2J")); item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class)); BuySellEntry entry = (BuySellEntry) item.get().getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(1431.40))); assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-11-22"))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of("EUR", Values.Amount.factorize(11.40)))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(20))); } @Test public void testWertpapierKauf5() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectWertpapierabrechnung_Kauf5.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); Optional<Item> item; // security item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getName(), is("Boeing Co.")); assertThat(security.getIsin(), is("US0970231058")); assertThat(security.getWkn(), is("850471")); item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class)); BuySellEntry entry = (BuySellEntry) item.get().getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(19359.18))); assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-07-18"))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of("EUR", Values.Amount.factorize(55.66)))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(160))); } @Test public void testWertpapierKauf6() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectWertpapierabrechnung_Kauf6.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); Optional<Item> item; // security item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getName(), is("BayWa AG")); assertThat(security.getIsin(), is("DE0005194062")); assertThat(security.getWkn(), is("519406")); item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class)); BuySellEntry entry = (BuySellEntry) item.get().getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(16312.80))); assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2013-03-14"))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of("EUR", Values.Amount.factorize(47.66)))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1437))); } @Test public void testWertpapierKauf7() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectWertpapierabrechnung_Kauf7.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); Optional<Item> item; // security item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getName(), is("Allianz SE")); assertThat(security.getIsin(), is("DE0008404005")); assertThat(security.getWkn(), is("840400")); item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class)); BuySellEntry entry = (BuySellEntry) item.get().getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(7586.80))); assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2008-10-16"))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of("EUR", Values.Amount.factorize(23.80 + 1.5 + 0.6)))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(100))); } @Test public void testWertpapierKauf8() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectWertpapierabrechnung_Kauf8.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); Optional<Item> item; // security item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getName(), is("T. Rowe Price Group Inc.")); assertThat(security.getIsin(), is("US74144T1088")); assertThat(security.getWkn(), is("870967")); item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class)); BuySellEntry entry = (BuySellEntry) item.get().getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(1469.55))); assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-11-08"))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of("EUR", Values.Amount.factorize(2.9 + 9.9)))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(25))); } @Test public void testWertpapierVerkauf() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectWertpapierabrechnung_Verkauf.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); Optional<Item> item; // security item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getName(), is("FooBar. ETF")); assertThat(security.getIsin(), is("DE1234567890")); assertThat(security.getWkn(), is("ABC123")); item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class)); BuySellEntry entry = (BuySellEntry) item.get().getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); // expected total is total amount minux taxes long expectedTotal = Values.Amount.factorize(10111.11 - 11.11); assertThat(entry.getPortfolioTransaction().getAmount(), is(expectedTotal)); assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2010-01-01"))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of("EUR", Values.Amount.factorize(11.51)))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), is(Money.of("EUR", Values.Amount.factorize(11.11)))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(100))); } @Test public void testWertpapierVerkauf2() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectWertpapierabrechnung_Verkauf2.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); Optional<Item> item; // security item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getName(), is("Boeing Co.")); assertThat(security.getIsin(), is("US0970231058")); assertThat(security.getWkn(), is("850471")); item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class)); BuySellEntry entry = (BuySellEntry) item.get().getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(20413.33))); assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-12-08"))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of("EUR", Values.Amount.factorize(56.07)))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1140))); } @Test public void testWertpapierVerkauf3() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectWertpapierabrechnung_Verkauf3.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(3)); Optional<Item> item; // security item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getName(), is("ITC Holdings Corp.")); assertThat(security.getIsin(), is("US4656851056")); assertThat(security.getWkn(), is("A0F401")); item = results.stream().filter(i -> i instanceof BuySellEntryItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(BuySellEntry.class)); BuySellEntry entry = (BuySellEntry) item.get().getSubject(); assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); assertThat(entry.getPortfolioTransaction().getAmount(), is(Values.Amount.factorize(21239.83))); assertThat(entry.getPortfolioTransaction().getDate(), is(LocalDate.parse("2016-02-25"))); assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), is(Money.of("EUR", Values.Amount.factorize(66.47)))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(570))); // tax refund AccountTransaction t = (AccountTransaction) results.stream().filter(i -> i instanceof TransactionItem) .findFirst().get().getSubject(); assertThat(t.getSecurity(), is(security)); assertThat(t.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(71.73)))); } @Test public void testGutschrift() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectGutschrift.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); // security Optional<Item> item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getIsin(), is("DE000A9AXXX6")); assertThat(security.getName(), is("i S h a r e s I I I x x x x x x x x x x x x x x x E T F")); assertThat(security.getWkn(), is("A1XXXX")); item = results.stream().filter(i -> i instanceof TransactionItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(AccountTransaction.class)); AccountTransaction transaction = (AccountTransaction) item.get().getSubject(); assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); assertThat(transaction.getSecurity(), is(security)); assertThat(transaction.getDate(), is(LocalDate.parse("2011-01-08"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(21.99))); assertThat(transaction.getShares(), is(Values.Share.factorize(14))); } @Test public void testGutschrift2() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from("comdirectGutschrift2.txt"); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("t")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); // security Optional<Item> item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getIsin(), is("US0991991039")); assertThat(security.getName(), is("F oo B a r I n c .")); assertThat(security.getWkn(), is("123456")); item = results.stream().filter(i -> i instanceof TransactionItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(AccountTransaction.class)); AccountTransaction transaction = (AccountTransaction) item.get().getSubject(); assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); assertThat(transaction.getSecurity(), is(security)); assertThat(transaction.getDate(), is(LocalDate.parse("2011-01-09"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(13.78))); assertThat(transaction.getShares(), is(Values.Share.factorize(40))); } @Test public void testDividende1() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from(file.getName()); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("comdirectDividende1.txt")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); // security Optional<Item> item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getIsin(), is("NL0000009355")); assertThat(security.getName(), is("U n il e ve r N . V .")); assertThat(security.getWkn(), is("A0JMZB")); item = results.stream().filter(i -> i instanceof TransactionItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(AccountTransaction.class)); AccountTransaction transaction = (AccountTransaction) item.get().getSubject(); assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); assertThat(transaction.getSecurity(), is(security)); assertThat(transaction.getDate(), is(LocalDate.parse("2010-12-15"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(335.92))); assertThat(transaction.getShares(), is(Values.Share.factorize(1900))); assertThat(transaction.getUnitSum(Unit.Type.TAX).getAmount(), is(Values.Amount.factorize(59.28))); } @Test public void testDividende2() throws IOException { ComdirectPDFExtractor extractor = new ComdirectPDFExtractor(new Client()) { @Override protected String strip(File file) throws IOException { return from(file.getName()); } }; List<Exception> errors = new ArrayList<Exception>(); List<Item> results = extractor.extract(Arrays.asList(new File("comdirectDividende2.txt")), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); // security Optional<Item> item = results.stream().filter(i -> i instanceof SecurityItem).findFirst(); assertThat(item.isPresent(), is(true)); Security security = ((SecurityItem) item.get()).getSecurity(); assertThat(security.getIsin(), is("DE0008232125")); assertThat(security.getName(), is("De u t s c he L uf t h a n s a A G")); assertThat(security.getWkn(), is("823212")); item = results.stream().filter(i -> i instanceof TransactionItem).findFirst(); assertThat(item.isPresent(), is(true)); assertThat(item.get().getSubject(), instanceOf(AccountTransaction.class)); AccountTransaction transaction = (AccountTransaction) item.get().getSubject(); assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); assertThat(transaction.getSecurity(), is(security)); assertThat(transaction.getDate(), is(LocalDate.parse("2009-04-27"))); assertThat(transaction.getAmount(), is(Values.Amount.factorize(1546.13))); assertThat(transaction.getShares(), is(Values.Share.factorize(3000))); assertThat(transaction.getUnitSum(Unit.Type.TAX).getAmount(), is(Values.Amount.factorize(525 + 28.87))); } private String from(String resource) { try (Scanner scanner = new Scanner(getClass().getResourceAsStream(resource), StandardCharsets.UTF_8.name())) { return scanner.useDelimiter("\\A").next(); } } }