package org.jabref.logic.importer.fileformat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Optional; import org.jabref.logic.bibtex.BibEntryAssert; import org.jabref.logic.util.FileExtensions; import org.jabref.model.entry.BibEntry; import org.apache.commons.codec.Charsets; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class MedlinePlainImporterTest { private MedlinePlainImporter importer; private BufferedReader readerForString(String string) { return new BufferedReader(new StringReader(string)); } @Before public void setUp() { importer = new MedlinePlainImporter(); } @Test public void testsGetExtensions() { assertEquals(FileExtensions.MEDLINE_PLAIN, importer.getExtensions()); } @Test public void testGetDescription() { assertEquals("Importer for the MedlinePlain format.", importer.getDescription()); } @Test public void testIsRecognizedFormat() throws IOException, URISyntaxException { List<String> list = Arrays.asList("CopacImporterTest1.txt", "CopacImporterTest2.txt", "IsiImporterTest1.isi", "IsiImporterTestInspec.isi", "IsiImporterTestWOS.isi", "IsiImporterTestMedline.isi"); for (String str : list) { Path file = Paths.get(MedlinePlainImporter.class.getResource(str).toURI()); Assert.assertFalse(importer.isRecognizedFormat(file, StandardCharsets.UTF_8)); } } @Test public void testIsNotRecognizedFormat() throws Exception { List<String> list = Arrays.asList("MedlinePlainImporterTestMultipleEntries.txt", "MedlinePlainImporterTestCompleteEntry.txt", "MedlinePlainImporterTestMultiAbstract.txt", "MedlinePlainImporterTestMultiTitle.txt", "MedlinePlainImporterTestDOI.txt", "MedlinePlainImporterTestInproceeding.txt"); for (String str : list) { Path file = Paths.get(MedlinePlainImporter.class.getResource(str).toURI()); Assert.assertTrue(importer.isRecognizedFormat(file, StandardCharsets.UTF_8)); } } @Test public void doesNotRecognizeEmptyFiles() throws IOException { Assert.assertFalse(importer.isRecognizedFormat(readerForString(""))); } @Test public void testImportMultipleEntriesInSingleFile() throws IOException, URISyntaxException { Path inputFile = Paths .get(MedlinePlainImporter.class.getResource("MedlinePlainImporterTestMultipleEntries.txt").toURI()); List<BibEntry> entries = importer.importDatabase(inputFile, StandardCharsets.UTF_8).getDatabase() .getEntries(); assertEquals(7, entries.size()); BibEntry testEntry = entries.get(0); assertEquals("article", testEntry.getType()); assertEquals(Optional.empty(), testEntry.getField("month")); assertEquals(Optional.of("Long, Vicky and Marland, Hilary"), testEntry.getField("author")); assertEquals( Optional.of( "From danger and motherhood to health and beauty: health advice for the factory girl in early twentieth-century Britain."), testEntry.getField("title")); testEntry = entries.get(1); assertEquals("conference", testEntry.getType()); assertEquals(Optional.of("06"), testEntry.getField("month")); assertEquals(Optional.empty(), testEntry.getField("author")); assertEquals(Optional.empty(), testEntry.getField("title")); testEntry = entries.get(2); assertEquals("book", testEntry.getType()); assertEquals( Optional.of( "This is a Testtitle: This title should be appended: This title should also be appended. Another append to the Title? LastTitle"), testEntry.getField("title")); testEntry = entries.get(3); assertEquals("techreport", testEntry.getType()); Assert.assertTrue(testEntry.getField("doi").isPresent()); testEntry = entries.get(4); assertEquals("inproceedings", testEntry.getType()); assertEquals(Optional.of("Inproceedings book title"), testEntry.getField("booktitle")); BibEntry expectedEntry5 = new BibEntry(); expectedEntry5.setType("proceedings"); expectedEntry5.setField("keywords", "Female"); assertEquals(expectedEntry5, entries.get(5)); BibEntry expectedEntry6 = new BibEntry(); expectedEntry6.setType("misc"); expectedEntry6.setField("keywords", "Female"); assertEquals(expectedEntry6, entries.get(6)); } @Test public void testEmptyFileImport() throws IOException { List<BibEntry> emptyEntries = importer.importDatabase(readerForString("")).getDatabase().getEntries(); assertEquals(Collections.emptyList(), emptyEntries); } @Test public void testImportSingleEntriesInSingleFiles() throws IOException, URISyntaxException { List<String> testFiles = Arrays.asList("MedlinePlainImporterTestCompleteEntry", "MedlinePlainImporterTestMultiAbstract", "MedlinePlainImporterTestMultiTitle", "MedlinePlainImporterTestDOI", "MedlinePlainImporterTestInproceeding"); for (String testFile : testFiles) { String medlineFile = testFile + ".txt"; String bibtexFile = testFile + ".bib"; assertImportOfMedlineFileEqualsBibtexFile(medlineFile, bibtexFile); } } private void assertImportOfMedlineFileEqualsBibtexFile(String medlineFile, String bibtexFile) throws IOException, URISyntaxException { Path file = Paths.get(MedlinePlainImporter.class.getResource(medlineFile).toURI()); try (InputStream nis = MedlinePlainImporter.class.getResourceAsStream(bibtexFile)) { List<BibEntry> entries = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); Assert.assertNotNull(entries); assertEquals(1, entries.size()); BibEntryAssert.assertEquals(nis, entries.get(0)); } } @Test public void testMultiLineComments() throws IOException { try (BufferedReader reader = readerForString("PMID-22664220" + "\n" + "CON - Comment1" + "\n" + "CIN - Comment2" + "\n" + "EIN - Comment3" + "\n" + "EFR - Comment4" + "\n" + "CRI - Comment5" + "\n" + "CRF - Comment6" + "\n" + "PRIN- Comment7" + "\n" + "PROF- Comment8" + "\n" + "RPI - Comment9" + "\n" + "RPF - Comment10" + "\n" + "RIN - Comment11" + "\n" + "ROF - Comment12" + "\n" + "UIN - Comment13" + "\n" + "UOF - Comment14" + "\n" + "SPIN- Comment15" + "\n" + "ORI - Comment16")) { List<BibEntry> actualEntries = importer.importDatabase(reader).getDatabase().getEntries(); BibEntry expectedEntry = new BibEntry(); expectedEntry.setField("comment", "Comment1" + "\n" + "Comment2" + "\n" + "Comment3" + "\n" + "Comment4" + "\n" + "Comment5" + "\n" + "Comment6" + "\n" + "Comment7" + "\n" + "Comment8" + "\n" + "Comment9" + "\n" + "Comment10" + "\n" + "Comment11" + "\n" + "Comment12" + "\n" + "Comment13" + "\n" + "Comment14" + "\n" + "Comment15" + "\n" + "Comment16"); assertEquals(Collections.singletonList(expectedEntry), actualEntries); } } @Test public void testKeyWords() throws IOException { try (BufferedReader reader = readerForString("PMID-22664795" + "\n" + "MH - Female" + "\n" + "OT - Male")) { List<BibEntry> actualEntries = importer.importDatabase(reader).getDatabase().getEntries(); BibEntry expectedEntry = new BibEntry(); expectedEntry.setField("keywords", "Female, Male"); assertEquals(Collections.singletonList(expectedEntry), actualEntries); } } @Test public void testWithNbibFile() throws IOException, URISyntaxException { Path file = Paths.get(MedlinePlainImporter.class.getResource("NbibImporterTest.nbib").toURI()); List<BibEntry> entries = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); BibEntryAssert.assertEquals(MedlinePlainImporter.class, "NbibImporterTest.bib", entries); } @Test public void testWithMultipleEntries() throws IOException, URISyntaxException { Path file = Paths .get(MedlinePlainImporter.class.getResource("MedlinePlainImporterStringOutOfBounds.txt").toURI()); List<BibEntry> entries = importer.importDatabase(file, Charsets.UTF_8).getDatabase().getEntries(); BibEntryAssert.assertEquals(MedlinePlainImporter.class, "MedlinePlainImporterStringOutOfBounds.bib", entries); } @Test public void testInvalidFormat() throws URISyntaxException, IOException { Path file = Paths .get(MedlinePlainImporter.class.getResource("MedlinePlainImporterTestInvalidFormat.xml").toURI()); List<BibEntry> entries = importer.importDatabase(file, Charsets.UTF_8).getDatabase().getEntries(); assertEquals(Collections.emptyList(), entries); } @Test(expected = NullPointerException.class) public void testNullReader() throws IOException { try (BufferedReader reader = null) { importer.importDatabase(reader); } fail(); } @Test public void testAllArticleTypes() throws IOException { try (BufferedReader reader = readerForString("PMID-22664795" + "\n" + "MH - Female\n" + "PT - journal article" + "\n" + "PT - classical article" + "\n" + "PT - corrected and republished article" + "\n" + "PT - introductory journal article" + "\n" + "PT - newspaper article")) { List<BibEntry> actualEntries = importer.importDatabase(reader).getDatabase().getEntries(); BibEntry expectedEntry = new BibEntry(); expectedEntry.setType("article"); expectedEntry.setField("keywords", "Female"); assertEquals(Collections.singletonList(expectedEntry), actualEntries); } } @Test public void testGetFormatName() { assertEquals("Medline/PubMed Plain", importer.getName()); } @Test public void testGetCLIId() { assertEquals("medlineplain", importer.getId()); } }