package org.jabref.logic.openoffice; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.jabref.JabRefMain; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Importer; import org.jabref.logic.importer.ParserResult; import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.logic.layout.Layout; import org.jabref.logic.layout.LayoutFormatterPreferences; import org.jabref.model.database.BibDatabase; import org.jabref.model.entry.BibEntry; import org.junit.Before; import org.junit.Test; import org.mockito.Answers; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; public class OOBibStyleTest { private LayoutFormatterPreferences layoutFormatterPreferences; private ImportFormatPreferences importFormatPreferences; @Before public void setUp() { layoutFormatterPreferences = mock(LayoutFormatterPreferences.class, Answers.RETURNS_DEEP_STUBS); importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); } @Test public void testAuthorYear() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH, layoutFormatterPreferences); assertTrue(style.isValid()); assertTrue(style.isFromResource()); assertFalse(style.isBibtexKeyCiteMarkers()); assertFalse(style.isBoldCitations()); assertFalse(style.isFormatCitations()); assertFalse(style.isItalicCitations()); assertFalse(style.isNumberEntries()); assertFalse(style.isSortByPosition()); } @Test public void testAuthorYearAsFile() throws URISyntaxException, IOException { File defFile = Paths.get(JabRefMain.class.getResource(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH).toURI()) .toFile(); OOBibStyle style = new OOBibStyle(defFile, layoutFormatterPreferences, StandardCharsets.UTF_8); assertTrue(style.isValid()); assertFalse(style.isFromResource()); assertFalse(style.isBibtexKeyCiteMarkers()); assertFalse(style.isBoldCitations()); assertFalse(style.isFormatCitations()); assertFalse(style.isItalicCitations()); assertFalse(style.isNumberEntries()); assertFalse(style.isSortByPosition()); } @Test public void testNumerical() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); assertTrue(style.isValid()); assertFalse(style.isBibtexKeyCiteMarkers()); assertFalse(style.isBoldCitations()); assertFalse(style.isFormatCitations()); assertFalse(style.isItalicCitations()); assertTrue(style.isNumberEntries()); assertTrue(style.isSortByPosition()); } @Test public void testGetNumCitationMarker() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); assertEquals("[1] ", style.getNumCitationMarker(Arrays.asList(1), -1, true)); assertEquals("[1]", style.getNumCitationMarker(Arrays.asList(1), -1, false)); assertEquals("[1] ", style.getNumCitationMarker(Arrays.asList(1), 0, true)); assertEquals("[1-3] ", style.getNumCitationMarker(Arrays.asList(1, 2, 3), 1, true)); assertEquals("[1; 2; 3] ", style.getNumCitationMarker(Arrays.asList(1, 2, 3), 5, true)); assertEquals("[1; 2; 3] ", style.getNumCitationMarker(Arrays.asList(1, 2, 3), -1, true)); assertEquals("[1; 3; 12] ", style.getNumCitationMarker(Arrays.asList(1, 12, 3), 1, true)); assertEquals("[3-5; 7; 10-12] ", style.getNumCitationMarker(Arrays.asList(12, 7, 3, 4, 11, 10, 5), 1, true)); String citation = style.getNumCitationMarker(Arrays.asList(1), -1, false); assertEquals("[1; pp. 55-56]", style.insertPageInfo(citation, "pp. 55-56")); } @Test public void testGetNumCitationMarkerUndefined() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); assertEquals("[" + OOBibStyle.UNDEFINED_CITATION_MARKER + "; 2-4] ", style.getNumCitationMarker(Arrays.asList(4, 2, 3, 0), 1, true)); assertEquals("[" + OOBibStyle.UNDEFINED_CITATION_MARKER + "] ", style.getNumCitationMarker(Arrays.asList(0), 1, true)); assertEquals("[" + OOBibStyle.UNDEFINED_CITATION_MARKER + "; 1-3] ", style.getNumCitationMarker(Arrays.asList(1, 2, 3, 0), 1, true)); assertEquals("[" + OOBibStyle.UNDEFINED_CITATION_MARKER + "; " + OOBibStyle.UNDEFINED_CITATION_MARKER + "; " + OOBibStyle.UNDEFINED_CITATION_MARKER + "] ", style.getNumCitationMarker(Arrays.asList(0, 0, 0), 1, true)); } @Test public void testGetCitProperty() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); assertEquals(", ", style.getStringCitProperty("AuthorSeparator")); assertEquals(3, style.getIntCitProperty("MaxAuthors")); assertTrue(style.getBooleanCitProperty(OOBibStyle.MULTI_CITE_CHRONOLOGICAL)); assertEquals("Default", style.getCitationCharacterFormat()); assertEquals("Default [number] style file.", style.getName()); Set<String> journals = style.getJournals(); assertTrue(journals.contains("Journal name 1")); } @Test public void testGetCitationMarker() throws IOException { Path testBibtexFile = Paths.get("src/test/resources/testbib/complex.bib"); ParserResult result = new BibtexParser(importFormatPreferences).parse(Importer.getReader(testBibtexFile, StandardCharsets.UTF_8)); OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); Map<BibEntry, BibDatabase> entryDBMap = new HashMap<>(); BibDatabase db = result.getDatabase(); for (BibEntry entry : db.getEntries()) { entryDBMap.put(entry, db); } BibEntry entry = db.getEntryByKey("1137631").get(); assertEquals("[Boström et al., 2006]", style.getCitationMarker(Arrays.asList(entry), entryDBMap, true, null, null)); assertEquals("Boström et al. [2006]", style.getCitationMarker(Arrays.asList(entry), entryDBMap, false, null, new int[] {3})); assertEquals("[Boström, Wäyrynen, Bodén, Beznosov & Kruchten, 2006]", style.getCitationMarker(Arrays.asList(entry), entryDBMap, true, null, new int[] {5})); } @Test public void testLayout() throws IOException { Path testBibtexFile = Paths.get("src/test/resources/testbib/complex.bib"); ParserResult result = new BibtexParser(importFormatPreferences).parse(Importer.getReader(testBibtexFile, StandardCharsets.UTF_8)); OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); BibDatabase db = result.getDatabase(); Layout l = style.getReferenceFormat("default"); l.setPostFormatter(new OOPreFormatter()); BibEntry entry = db.getEntryByKey("1137631").get(); assertEquals( "Boström, G.; Wäyrynen, J.; Bodén, M.; Beznosov, K. and Kruchten, P. (<b>2006</b>). <i>Extending XP practices to support security requirements engineering</i>, : 11-18.", l.doLayout(entry, db)); l = style.getReferenceFormat("incollection"); l.setPostFormatter(new OOPreFormatter()); assertEquals( "Boström, G.; Wäyrynen, J.; Bodén, M.; Beznosov, K. and Kruchten, P. (<b>2006</b>). <i>Extending XP practices to support security requirements engineering</i>. In: (Ed.), <i>SESS '06: Proceedings of the 2006 international workshop on Software engineering for secure systems</i>, ACM.", l.doLayout(entry, db)); } @Test public void testInstitutionAuthor() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); BibDatabase database = new BibDatabase(); Layout l = style.getReferenceFormat("article"); l.setPostFormatter(new OOPreFormatter()); BibEntry entry = new BibEntry(); entry.setType("article"); entry.setField("author", "{JabRef Development Team}"); entry.setField("title", "JabRef Manual"); entry.setField("year", "2016"); database.insertEntry(entry); assertEquals("<b>JabRef Development Team</b> (<b>2016</b>). <i>JabRef Manual</i>, .", l.doLayout(entry, database)); } @Test public void testVonAuthor() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); BibDatabase database = new BibDatabase(); Layout l = style.getReferenceFormat("article"); l.setPostFormatter(new OOPreFormatter()); BibEntry entry = new BibEntry(); entry.setType("article"); entry.setField("author", "Alpha von Beta"); entry.setField("title", "JabRef Manual"); entry.setField("year", "2016"); database.insertEntry(entry); assertEquals("<b>von Beta, A.</b> (<b>2016</b>). <i>JabRef Manual</i>, .", l.doLayout(entry, database)); } @Test public void testInstitutionAuthorMarker() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); Map<BibEntry, BibDatabase> entryDBMap = new HashMap<>(); List<BibEntry> entries = new ArrayList<>(); BibDatabase database = new BibDatabase(); BibEntry entry = new BibEntry(); entry.setType("article"); entry.setField("author", "{JabRef Development Team}"); entry.setField("title", "JabRef Manual"); entry.setField("year", "2016"); database.insertEntry(entry); entries.add(entry); entryDBMap.put(entry, database); assertEquals("[JabRef Development Team, 2016]", style.getCitationMarker(entries, entryDBMap, true, null, null)); } @Test public void testVonAuthorMarker() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); Map<BibEntry, BibDatabase> entryDBMap = new HashMap<>(); List<BibEntry> entries = new ArrayList<>(); BibDatabase database = new BibDatabase(); BibEntry entry = new BibEntry(); entry.setType("article"); entry.setField("author", "Alpha von Beta"); entry.setField("title", "JabRef Manual"); entry.setField("year", "2016"); database.insertEntry(entry); entries.add(entry); entryDBMap.put(entry, database); assertEquals("[von Beta, 2016]", style.getCitationMarker(entries, entryDBMap, true, null, null)); } @Test public void testNullAuthorMarker() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); Map<BibEntry, BibDatabase> entryDBMap = new HashMap<>(); List<BibEntry> entries = new ArrayList<>(); BibDatabase database = new BibDatabase(); BibEntry entry = new BibEntry(); entry.setType("article"); entry.setField("year", "2016"); database.insertEntry(entry); entries.add(entry); entryDBMap.put(entry, database); assertEquals("[, 2016]", style.getCitationMarker(entries, entryDBMap, true, null, null)); } @Test public void testNullYearMarker() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); Map<BibEntry, BibDatabase> entryDBMap = new HashMap<>(); List<BibEntry> entries = new ArrayList<>(); BibDatabase database = new BibDatabase(); BibEntry entry = new BibEntry(); entry.setType("article"); entry.setField("author", "Alpha von Beta"); database.insertEntry(entry); entries.add(entry); entryDBMap.put(entry, database); assertEquals("[von Beta, ]", style.getCitationMarker(entries, entryDBMap, true, null, null)); } @Test public void testEmptyEntryMarker() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); Map<BibEntry, BibDatabase> entryDBMap = new HashMap<>(); List<BibEntry> entries = new ArrayList<>(); BibDatabase database = new BibDatabase(); BibEntry entry = new BibEntry(); entry.setType("article"); database.insertEntry(entry); entries.add(entry); entryDBMap.put(entry, database); assertEquals("[, ]", style.getCitationMarker(entries, entryDBMap, true, null, null)); } @Test public void testGetCitationMarkerInParenthesisUniquefiers() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); Map<BibEntry, BibDatabase> entryDBMap = new HashMap<>(); List<BibEntry> entries = new ArrayList<>(); BibDatabase database = new BibDatabase(); BibEntry entry1 = new BibEntry(); entry1.setField("author", "Alpha Beta"); entry1.setField("title", "Paper 1"); entry1.setField("year", "2000"); entries.add(entry1); database.insertEntry(entry1); BibEntry entry3 = new BibEntry(); entry3.setField("author", "Alpha Beta"); entry3.setField("title", "Paper 2"); entry3.setField("year", "2000"); entries.add(entry3); database.insertEntry(entry3); BibEntry entry2 = new BibEntry(); entry2.setField("author", "Gamma Epsilon"); entry2.setField("year", "2001"); entries.add(entry2); database.insertEntry(entry2); for (BibEntry entry : database.getEntries()) { entryDBMap.put(entry, database); } assertEquals("[Beta, 2000; Beta, 2000; Epsilon, 2001]", style.getCitationMarker(entries, entryDBMap, true, null, null)); assertEquals("[Beta, 2000a,b; Epsilon, 2001]", style.getCitationMarker(entries, entryDBMap, true, new String[] {"a", "b", ""}, new int[] {1, 1, 1})); } @Test public void testGetCitationMarkerInTextUniquefiers() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); Map<BibEntry, BibDatabase> entryDBMap = new HashMap<>(); List<BibEntry> entries = new ArrayList<>(); BibDatabase database = new BibDatabase(); BibEntry entry1 = new BibEntry(); entry1.setField("author", "Alpha Beta"); entry1.setField("title", "Paper 1"); entry1.setField("year", "2000"); entries.add(entry1); database.insertEntry(entry1); BibEntry entry3 = new BibEntry(); entry3.setField("author", "Alpha Beta"); entry3.setField("title", "Paper 2"); entry3.setField("year", "2000"); entries.add(entry3); database.insertEntry(entry3); BibEntry entry2 = new BibEntry(); entry2.setField("author", "Gamma Epsilon"); entry2.setField("year", "2001"); entries.add(entry2); database.insertEntry(entry2); for (BibEntry entry : database.getEntries()) { entryDBMap.put(entry, database); } assertEquals("Beta [2000]; Beta [2000]; Epsilon [2001]", style.getCitationMarker(entries, entryDBMap, false, null, null)); assertEquals("Beta [2000a,b]; Epsilon [2001]", style.getCitationMarker(entries, entryDBMap, false, new String[] {"a", "b", ""}, new int[] {1, 1, 1})); } @Test public void testGetCitationMarkerInParenthesisUniquefiersThreeSameAuthor() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); Map<BibEntry, BibDatabase> entryDBMap = new HashMap<>(); List<BibEntry> entries = new ArrayList<>(); BibDatabase database = new BibDatabase(); BibEntry entry1 = new BibEntry(); entry1.setField("author", "Alpha Beta"); entry1.setField("title", "Paper 1"); entry1.setField("year", "2000"); entries.add(entry1); database.insertEntry(entry1); BibEntry entry2 = new BibEntry(); entry2.setField("author", "Alpha Beta"); entry2.setField("title", "Paper 2"); entry2.setField("year", "2000"); entries.add(entry2); database.insertEntry(entry2); BibEntry entry3 = new BibEntry(); entry3.setField("author", "Alpha Beta"); entry3.setField("title", "Paper 3"); entry3.setField("year", "2000"); entries.add(entry3); database.insertEntry(entry3); for (BibEntry entry : database.getEntries()) { entryDBMap.put(entry, database); } assertEquals("[Beta, 2000a,b,c]", style.getCitationMarker(entries, entryDBMap, true, new String[] {"a", "b", "c"}, new int[] {1, 1, 1})); } @Test public void testGetCitationMarkerInTextUniquefiersThreeSameAuthor() throws IOException { OOBibStyle style = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); Map<BibEntry, BibDatabase> entryDBMap = new HashMap<>(); List<BibEntry> entries = new ArrayList<>(); BibDatabase database = new BibDatabase(); BibEntry entry1 = new BibEntry(); entry1.setField("author", "Alpha Beta"); entry1.setField("title", "Paper 1"); entry1.setField("year", "2000"); entries.add(entry1); database.insertEntry(entry1); BibEntry entry2 = new BibEntry(); entry2.setField("author", "Alpha Beta"); entry2.setField("title", "Paper 2"); entry2.setField("year", "2000"); entries.add(entry2); database.insertEntry(entry2); BibEntry entry3 = new BibEntry(); entry3.setField("author", "Alpha Beta"); entry3.setField("title", "Paper 3"); entry3.setField("year", "2000"); entries.add(entry3); database.insertEntry(entry3); for (BibEntry entry : database.getEntries()) { entryDBMap.put(entry, database); } assertEquals("Beta [2000a,b,c]", style.getCitationMarker(entries, entryDBMap, false, new String[] {"a", "b", "c"}, new int[] {1, 1, 1})); } @Test // TODO: equals only work when initialized from file, not from reader public void testEquals() throws IOException { OOBibStyle style1 = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); OOBibStyle style2 = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); assertEquals(style1, style2); } @Test // TODO: equals only work when initialized from file, not from reader public void testNotEquals() throws IOException { OOBibStyle style1 = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); OOBibStyle style2 = new OOBibStyle(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH, layoutFormatterPreferences); assertNotEquals(style1, style2); } @Test public void testCompareToEqual() throws IOException { OOBibStyle style1 = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); OOBibStyle style2 = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); assertEquals(0, style1.compareTo(style2)); } @Test public void testCompareToNotEqual() throws IOException { OOBibStyle style1 = new OOBibStyle(StyleLoader.DEFAULT_NUMERICAL_STYLE_PATH, layoutFormatterPreferences); OOBibStyle style2 = new OOBibStyle(StyleLoader.DEFAULT_AUTHORYEAR_STYLE_PATH, layoutFormatterPreferences); assertTrue(style1.compareTo(style2) > 0); assertFalse(style2.compareTo(style1) > 0); } @Test public void testEmptyStringPropertyAndOxfordComma() throws URISyntaxException, IOException { OOBibStyle style = new OOBibStyle("test.jstyle", layoutFormatterPreferences); Map<BibEntry, BibDatabase> entryDBMap = new HashMap<>(); List<BibEntry> entries = new ArrayList<>(); BibDatabase database = new BibDatabase(); BibEntry entry = new BibEntry(); entry.setType("article"); entry.setField("author", "Alpha von Beta and Gamma Epsilon and Ypsilon Tau"); entry.setField("title", "JabRef Manual"); entry.setField("year", "2016"); database.insertEntry(entry); entries.add(entry); entryDBMap.put(entry, database); assertEquals("von Beta, Epsilon, & Tau, 2016", style.getCitationMarker(entries, entryDBMap, true, null, null)); } }