package org.jabref.logic.bibtexkeypattern; import java.util.Optional; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.ParseException; import org.jabref.logic.importer.fileformat.BibtexParser; 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.assertNull; import static org.mockito.Mockito.mock; public class BibtexKeyPatternUtilTest { private static final String AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_1 = "Isaac Newton"; private static final String AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_2 = "Isaac Newton and James Maxwell"; private static final String AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_3 = "Isaac Newton and James Maxwell and Albert Einstein"; private static final String AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_1 = "Wil van der Aalst"; private static final String AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_2 = "Wil van der Aalst and Tammo van Lessen"; private static final String AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1 = "I. Newton"; private static final String AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2 = "I. Newton and J. Maxwell"; private static final String AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_3 = "I. Newton and J. Maxwell and A. Einstein"; private static final String AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_4 = "I. Newton and J. Maxwell and A. Einstein and N. Bohr"; private static final String AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_5 = "I. Newton and J. Maxwell and A. Einstein and N. Bohr and Harry Unknown"; private static final String TITLE_STRING_ALL_LOWER_FOUR_SMALL_WORDS_ONE_EN_DASH = "application migration effort in the cloud - the case of cloud platforms"; private static final String TITLE_STRING_ALL_LOWER_FIRST_WORD_IN_BRACKETS_TWO_SMALL_WORDS_SMALL_WORD_AFTER_COLON = "{BPEL} conformance in open source engines: the case of static analysis"; private static final String TITLE_STRING_CASED = "Process Viewing Patterns"; private static final String TITLE_STRING_CASED_ONE_UPPER_WORD_ONE_SMALL_WORD = "BPMN Conformance in Open Source Engines"; private static final String TITLE_STRING_CASED_TWO_SMALL_WORDS_SMALL_WORD_AT_THE_BEGINNING = "The Difference Between Graph-Based and Block-Structured Business Process Modelling Languages"; private static final String TITLE_STRING_CASED_TWO_SMALL_WORDS_SMALL_WORD_AFTER_COLON = "Cloud Computing: The Next Revolution in IT"; private static final String TITLE_STRING_CASED_TWO_SMALL_WORDS_ONE_CONNECTED_WORD = "Towards Choreography-based Process Distribution in the Cloud"; private static final String TITLE_STRING_CASED_FOUR_SMALL_WORDS_TWO_CONNECTED_WORDS = "On the Measurement of Design-Time Adaptability for Process-Based Systems "; private static ImportFormatPreferences importFormatPreferences; @Before public void setUp() { importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); } @Test public void testAndInAuthorName() throws ParseException { Optional<BibEntry> entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Simon Holland}}", importFormatPreferences); assertEquals("Holland", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth", ',', new BibDatabase()), true)); } @Test public void testAndAuthorNames() throws ParseException { String bibtexString = "@ARTICLE{whatevery, author={Mari D. Herland and Mona-Iren Hauge and Ingeborg M. Helgeland}}"; Optional<BibEntry> entry = BibtexParser.singleFromString(bibtexString, importFormatPreferences); assertEquals("HerlandHaugeHelgeland", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry.get(), "authors3", ',', new BibDatabase()), true)); } @Test public void testSpecialLatexCharacterInAuthorName() throws ParseException { Optional<BibEntry> entry = BibtexParser.singleFromString( "@ARTICLE{kohn, author={Simon Popovi\\v{c}ov\\'{a}}}", importFormatPreferences); assertEquals("Popovicova", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry.get(), "auth", ',', new BibDatabase()), true)); } /** * Test for https://sourceforge.net/forum/message.php?msg_id=4498555 Test the Labelmaker and all kind of accents Á á * Ć ć É é Í í Ĺ ĺ Ń ń Ó ó Ŕ ŕ Ś ś Ú ú Ý ý Ź ź */ @Test public void testMakeLabelAndCheckLegalKeys() throws ParseException { Optional<BibEntry> entry0 = BibtexParser.singleFromString( "@ARTICLE{kohn, author={Andreas Köning}, year={2000}}", importFormatPreferences); assertEquals("Koen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Áöning}, year={2000}}", importFormatPreferences); assertEquals("Aoen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Éöning}, year={2000}}", importFormatPreferences); assertEquals("Eoen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Íöning}, year={2000}}", importFormatPreferences); assertEquals("Ioen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ĺöning}, year={2000}}", importFormatPreferences); assertEquals("Loen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ńöning}, year={2000}}", importFormatPreferences); assertEquals("Noen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Óöning}, year={2000}}", importFormatPreferences); assertEquals("Ooen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ŕöning}, year={2000}}", importFormatPreferences); assertEquals("Roen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Śöning}, year={2000}}", importFormatPreferences); assertEquals("Soen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Úöning}, year={2000}}", importFormatPreferences); assertEquals("Uoen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ýöning}, year={2000}}", importFormatPreferences); assertEquals("Yoen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Źöning}, year={2000}}", importFormatPreferences); assertEquals("Zoen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); } /** * Test the Labelmaker and with accent grave Chars to test: "ÀÈÌÒÙ"; */ @Test public void testMakeLabelAndCheckLegalKeysAccentGrave() throws ParseException { Optional<BibEntry> entry0 = BibtexParser.singleFromString( "@ARTICLE{kohn, author={Andreas Àöning}, year={2000}}", importFormatPreferences); assertEquals("Aoen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Èöning}, year={2000}}", importFormatPreferences); assertEquals("Eoen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ìöning}, year={2000}}", importFormatPreferences); assertEquals("Ioen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Òöning}, year={2000}}", importFormatPreferences); assertEquals("Ooen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ùöning}, year={2000}}", importFormatPreferences); assertEquals("Uoen", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry0.get(), "auth3", ',', new BibDatabase()), true)); } /** * Tests if checkLegalKey replaces Non-ASCII chars. * There are quite a few chars that should be replaced. Perhaps there is a better method than the current. * * @see BibtexKeyPatternUtil#checkLegalKey(String) */ @Test public void testCheckLegalKey() { // not tested/ not in hashmap UNICODE_CHARS: // Ł ł Ő ő Ű ű Ŀ ŀ Ħ ħ Ð ð Þ þ Œ œ Æ æ Ø ø Å å Ə ə Đ đ Ů ů Ǣ ǣ ǖ ǘ ǚ ǜ //" Ǣ ǣ ǖ ǘ ǚ ǜ " + //"Đ đ Ů ů " + //"Ł ł Ő ő Ű ű Ŀ ŀ Ħ ħ Ð ð Þ þ Œ œ Æ æ Ø ø Å å Ə ə String accents = "ÀàÈèÌìÒòÙù  â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ"; String expectedResult = "AaEeIiOoUuAaCcEeGgHhIiJjOoSsUuWwYy"; assertEquals(expectedResult, BibtexKeyPatternUtil.checkLegalKey(accents, true)); accents = "ÄäËëÏïÖöÜüŸÿ"; expectedResult = "AeaeEeIiOeoeUeueYy"; assertEquals(expectedResult, BibtexKeyPatternUtil.checkLegalKey(accents, true)); accents = "Ç ç Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ"; expectedResult = "CcGgKkLlNnRrSsTt"; assertEquals(expectedResult, BibtexKeyPatternUtil.checkLegalKey(accents, true)); accents = "Ă ă Ĕ ĕ Ğ ğ Ĭ ĭ Ŏ ŏ Ŭ ŭ"; expectedResult = "AaEeGgIiOoUu"; assertEquals(expectedResult, BibtexKeyPatternUtil.checkLegalKey(accents, true)); accents = "Ċ ċ Ė ė Ġ ġ İ ı Ż ż"; expectedResult = "CcEeGgIiZz"; assertEquals(expectedResult, BibtexKeyPatternUtil.checkLegalKey(accents, true)); accents = "Ą ą Ę ę Į į Ǫ ǫ Ų ų"; expectedResult = "AaEeIiOoUu"; // O or Q? o or q? assertEquals(expectedResult, BibtexKeyPatternUtil.checkLegalKey(accents, true)); accents = "Ā ā Ē ē Ī ī Ō ō Ū ū Ȳ ȳ"; expectedResult = "AaEeIiOoUuYy"; assertEquals(expectedResult, BibtexKeyPatternUtil.checkLegalKey(accents, true)); accents = "Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž"; expectedResult = "AaCcDdEeIiLlNnOoRrSsTtUuZz"; assertEquals(expectedResult, BibtexKeyPatternUtil.checkLegalKey(accents, true)); expectedResult = "AaEeIiNnOoUuYy"; accents = "ÃãẼẽĨĩÑñÕõŨũỸỹ"; assertEquals(expectedResult, BibtexKeyPatternUtil.checkLegalKey(accents, true)); accents = "Ḍ ḍ Ḥ ḥ Ḷ ḷ Ḹ ḹ Ṃ ṃ Ṇ ṇ Ṛ ṛ Ṝ ṝ Ṣ ṣ Ṭ ṭ"; expectedResult = "DdHhLlLlMmNnRrRrSsTt"; assertEquals(expectedResult, BibtexKeyPatternUtil.checkLegalKey(accents, true)); String totest = "À à È è Ì ì Ò ò Ù ù  â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ " + "à ã Ẽ ẽ Ĩ ĩ Ñ ñ Õ õ Ũ ũ Ỹ ỹ Ç ç Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ" + " Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž " + "Ā ā Ē ē Ī ī Ō ō Ū ū Ȳ ȳ" + "Ă ă Ĕ ĕ Ğ ğ Ĭ ĭ Ŏ ŏ Ŭ ŭ " + "Ċ ċ Ė ė Ġ ġ İ ı Ż ż Ą ą Ę ę Į į Ǫ ǫ Ų ų " + "Ḍ ḍ Ḥ ḥ Ḷ ḷ Ḹ ḹ Ṃ ṃ Ṇ ṇ Ṛ ṛ Ṝ ṝ Ṣ ṣ Ṭ ṭ "; String expectedResults = "AaEeIiOoUuAaCcEeGgHhIiJjOoSsUuWwYyAeaeEeIiOeoeUeueYy" + "AaEeIiNnOoUuYyCcGgKkLlNnRrSsTt" + "AaCcDdEeIiLlNnOoRrSsTtUuZz" + "AaEeIiOoUuYy" + "AaEeGgIiOoUu" + "CcEeGgIiZzAaEeIiOoUu" + "DdHhLlLlMmNnRrRrSsTt"; assertEquals(expectedResults, BibtexKeyPatternUtil.checkLegalKey(totest, true)); } @Test public void testFirstAuthor() { assertEquals("Newton", BibtexKeyPatternUtil.firstAuthor(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_5)); assertEquals("Newton", BibtexKeyPatternUtil.firstAuthor(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1)); // https://sourceforge.net/forum/message.php?msg_id=4498555 assertEquals("K{\\\"o}ning", BibtexKeyPatternUtil.firstAuthor("K{\\\"o}ning")); assertEquals("", BibtexKeyPatternUtil.firstAuthor("")); } @Test(expected = NullPointerException.class) public void testFirstAuthorNull() { BibtexKeyPatternUtil.firstAuthor(null); } @Test public void testUniversity() throws ParseException { Optional<BibEntry> entry = BibtexParser.singleFromString( "@ARTICLE{kohn, author={{Link{\\\"{o}}ping University}}}", importFormatPreferences); assertEquals("UniLinkoeping", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry.get(), "auth", ',', new BibDatabase()), true)); } @Test public void testDepartment() throws ParseException { Optional<BibEntry> entry = BibtexParser.singleFromString( "@ARTICLE{kohn, author={{Link{\\\"{o}}ping University, Department of Electrical Engineering}}}", importFormatPreferences); assertEquals("UniLinkoepingEE", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry.get(), "auth", ',', new BibDatabase()), true)); } @Test public void testSchool() throws ParseException { Optional<BibEntry> entry = BibtexParser.singleFromString( "@ARTICLE{kohn, author={{Link{\\\"{o}}ping University, School of Computer Engineering}}}", importFormatPreferences); assertEquals("UniLinkoepingCE", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry.get(), "auth", ',', new BibDatabase()), true)); } @Test public void testInstituteOfTechnology() throws ParseException { Optional<BibEntry> entry = BibtexParser.singleFromString( "@ARTICLE{kohn, author={{Massachusetts Institute of Technology}}}", importFormatPreferences); assertEquals("MIT", BibtexKeyPatternUtil.checkLegalKey(BibtexKeyPatternUtil.makeLabel(entry.get(), "auth", ',', new BibDatabase()), true)); } @Test public void testAuthIniN() { assertEquals("NMEB", BibtexKeyPatternUtil.authIniN(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_5, 4)); assertEquals("NMEB", BibtexKeyPatternUtil.authIniN(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_4, 4)); assertEquals("NeME", BibtexKeyPatternUtil.authIniN(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_3, 4)); assertEquals("NeMa", BibtexKeyPatternUtil.authIniN(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2, 4)); assertEquals("Newt", BibtexKeyPatternUtil.authIniN(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1, 4)); assertEquals("", ""); assertEquals("N", BibtexKeyPatternUtil.authIniN(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1, 1)); assertEquals("", BibtexKeyPatternUtil.authIniN(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1, 0)); assertEquals("", BibtexKeyPatternUtil.authIniN(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1, -1)); assertEquals("Newton", BibtexKeyPatternUtil.authIniN(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1, 6)); assertEquals("Newton", BibtexKeyPatternUtil.authIniN(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1, 7)); } @Test(expected = NullPointerException.class) public void testAuthIniNNull() { BibtexKeyPatternUtil.authIniN(null, 3); } @Test public void testAuthIniNEmptyReturnsEmpty() { assertEquals("", BibtexKeyPatternUtil.authIniN("", 1)); } /** * Tests [auth.auth.ea] */ @Test public void authAuthEa() { assertEquals("Newton", BibtexKeyPatternUtil.authAuthEa(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_1)); assertEquals("Newton.Maxwell", BibtexKeyPatternUtil.authAuthEa(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_2)); assertEquals("Newton.Maxwell.ea", BibtexKeyPatternUtil.authAuthEa(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_3)); } @Test public void testAuthEaEmptyReturnsEmpty() { assertEquals("", BibtexKeyPatternUtil.authAuthEa("")); } /** * Tests the [auth.etal] and [authEtAl] patterns */ @Test public void testAuthEtAl() { // tests taken from the comments // [auth.etal] String delim = "."; String append = ".etal"; assertEquals("Newton.etal", BibtexKeyPatternUtil.authEtal(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_3, delim, append)); assertEquals("Newton.Maxwell", BibtexKeyPatternUtil.authEtal(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_2, delim, append)); // [authEtAl] delim = ""; append = "EtAl"; assertEquals("NewtonEtAl", BibtexKeyPatternUtil.authEtal(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_3, delim, append)); assertEquals("NewtonMaxwell", BibtexKeyPatternUtil.authEtal(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_2, delim, append)); } /** * Test the [authshort] pattern */ @Test public void testAuthShort() { // tests taken from the comments assertEquals("NME+", BibtexKeyPatternUtil.authshort(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_4)); assertEquals("NME", BibtexKeyPatternUtil.authshort(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_3)); assertEquals("NM", BibtexKeyPatternUtil.authshort(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2)); assertEquals("Newton", BibtexKeyPatternUtil.authshort(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1)); } @Test public void testAuthShortEmptyReturnsEmpty() { assertEquals("", BibtexKeyPatternUtil.authshort("")); } /** * Test the [authN_M] pattern */ @Test public void authNM() { assertEquals("N", BibtexKeyPatternUtil.authNofMth(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1, 1, 1)); assertEquals("Max", BibtexKeyPatternUtil.authNofMth(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2, 3, 2)); assertEquals("New", BibtexKeyPatternUtil.authNofMth(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_3, 3, 1)); assertEquals("Bo", BibtexKeyPatternUtil.authNofMth(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_4, 2, 4)); assertEquals("Bohr", BibtexKeyPatternUtil.authNofMth(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_5, 6, 4)); assertEquals("Aal", BibtexKeyPatternUtil.authNofMth(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_1, 3, 1)); assertEquals("Less", BibtexKeyPatternUtil.authNofMth(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_2, 4, 2)); assertEquals("", BibtexKeyPatternUtil.authNofMth("", 2, 4)); } @Test(expected = NullPointerException.class) public void authNMThrowsNPE() { BibtexKeyPatternUtil.authNofMth(null, 2, 4); } /** * Tests [authForeIni] */ @Test public void firstAuthorForenameInitials() { assertEquals("I", BibtexKeyPatternUtil .firstAuthorForenameInitials(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1)); assertEquals("I", BibtexKeyPatternUtil .firstAuthorForenameInitials(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2)); assertEquals("I", BibtexKeyPatternUtil.firstAuthorForenameInitials(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_1)); assertEquals("I", BibtexKeyPatternUtil.firstAuthorForenameInitials(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_2)); } /** * Tests [authFirstFull] */ @Test public void firstAuthorVonAndLast() { assertEquals("vanderAalst", BibtexKeyPatternUtil .firstAuthorVonAndLast(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_1)); assertEquals("vanderAalst", BibtexKeyPatternUtil .firstAuthorVonAndLast(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_2)); } @Test public void firstAuthorVonAndLastNoVonInName() { assertEquals("Newton", BibtexKeyPatternUtil.firstAuthorVonAndLast(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_1)); assertEquals("Newton", BibtexKeyPatternUtil.firstAuthorVonAndLast(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_2)); } /** * Tests [authors] */ @Test public void testAllAuthors() { assertEquals("Newton", BibtexKeyPatternUtil.allAuthors(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1)); assertEquals("NewtonMaxwell", BibtexKeyPatternUtil.allAuthors(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2)); assertEquals("NewtonMaxwellEinstein", BibtexKeyPatternUtil.allAuthors(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_3)); } /** * Tests [authorsAlpha] */ @Test public void authorsAlpha() { assertEquals("New", BibtexKeyPatternUtil.authorsAlpha(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1)); assertEquals("NM", BibtexKeyPatternUtil.authorsAlpha(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2)); assertEquals("NME", BibtexKeyPatternUtil.authorsAlpha(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_3)); assertEquals("NMEB", BibtexKeyPatternUtil.authorsAlpha(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_4)); assertEquals("NME+", BibtexKeyPatternUtil.authorsAlpha(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_5)); assertEquals("vdAal", BibtexKeyPatternUtil.authorsAlpha(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_1)); assertEquals("vdAvL", BibtexKeyPatternUtil.authorsAlpha(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_2)); } /** * Tests [authorLast] */ @Test public void lastAuthor() { assertEquals("Newton", BibtexKeyPatternUtil.lastAuthor(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1)); assertEquals("Maxwell", BibtexKeyPatternUtil.lastAuthor(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2)); assertEquals("Einstein", BibtexKeyPatternUtil.lastAuthor(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_3)); assertEquals("Bohr", BibtexKeyPatternUtil.lastAuthor(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_4)); assertEquals("Unknown", BibtexKeyPatternUtil.lastAuthor(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_5)); assertEquals("Aalst", BibtexKeyPatternUtil.lastAuthor(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_1)); assertEquals("Lessen", BibtexKeyPatternUtil.lastAuthor(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_2)); } /** * Tests [authorLastForeIni] */ @Test public void lastAuthorForenameInitials() { assertEquals("I", BibtexKeyPatternUtil.lastAuthorForenameInitials(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1)); assertEquals("J", BibtexKeyPatternUtil.lastAuthorForenameInitials(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2)); assertEquals("A", BibtexKeyPatternUtil.lastAuthorForenameInitials(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_3)); assertEquals("N", BibtexKeyPatternUtil.lastAuthorForenameInitials(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_4)); assertEquals("H", BibtexKeyPatternUtil.lastAuthorForenameInitials(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_5)); assertEquals("W", BibtexKeyPatternUtil .lastAuthorForenameInitials(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_1)); assertEquals("T", BibtexKeyPatternUtil .lastAuthorForenameInitials(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_2)); } /** * Tests [authorIni] */ @Test public void oneAuthorPlusIni() { assertEquals("Newto", BibtexKeyPatternUtil.oneAuthorPlusIni(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1)); assertEquals("NewtoM", BibtexKeyPatternUtil.oneAuthorPlusIni(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2)); assertEquals("NewtoME", BibtexKeyPatternUtil.oneAuthorPlusIni(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_3)); assertEquals("NewtoMEB", BibtexKeyPatternUtil.oneAuthorPlusIni(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_4)); assertEquals("NewtoMEBU", BibtexKeyPatternUtil.oneAuthorPlusIni(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_5)); assertEquals("Aalst", BibtexKeyPatternUtil.oneAuthorPlusIni(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_1)); assertEquals("AalstL", BibtexKeyPatternUtil.oneAuthorPlusIni(AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_WITH_VAN_COUNT_2)); } /** * Tests the [authorsN] pattern. -> [authors1] */ @Test public void testNAuthors1() { assertEquals("Newton", BibtexKeyPatternUtil.nAuthors(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1, 1)); assertEquals("NewtonEtAl", BibtexKeyPatternUtil.nAuthors(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2, 1)); assertEquals("NewtonEtAl", BibtexKeyPatternUtil.nAuthors(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_3, 1)); assertEquals("NewtonEtAl", BibtexKeyPatternUtil.nAuthors(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_4, 1)); } @Test public void testNAuthors1EmptyReturnEmpty() { assertEquals("", BibtexKeyPatternUtil.nAuthors("", 1)); } /** * Tests the [authorsN] pattern. -> [authors3] */ @Test public void testNAuthors3() { assertEquals("Newton", BibtexKeyPatternUtil.nAuthors(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_1, 3)); assertEquals("NewtonMaxwell", BibtexKeyPatternUtil.nAuthors(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_2, 3)); assertEquals("NewtonMaxwellEinstein", BibtexKeyPatternUtil.nAuthors(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_3, 3)); assertEquals("NewtonMaxwellEinsteinEtAl", BibtexKeyPatternUtil.nAuthors(AUTHOR_STRING_FIRSTNAME_INITIAL_LASTNAME_FULL_COUNT_4, 3)); } @Test public void testFirstPage() { assertEquals("7", BibtexKeyPatternUtil.firstPage("7--27")); assertEquals("27", BibtexKeyPatternUtil.firstPage("--27")); assertEquals("", BibtexKeyPatternUtil.firstPage("")); assertEquals("42", BibtexKeyPatternUtil.firstPage("42--111")); assertEquals("7", BibtexKeyPatternUtil.firstPage("7,41,73--97")); assertEquals("7", BibtexKeyPatternUtil.firstPage("41,7,73--97")); assertEquals("43", BibtexKeyPatternUtil.firstPage("43+")); } @Test(expected = NullPointerException.class) public void testFirstPageNull() { BibtexKeyPatternUtil.firstPage(null); } @Test public void testLastPage() { assertEquals("27", BibtexKeyPatternUtil.lastPage("7--27")); assertEquals("27", BibtexKeyPatternUtil.lastPage("--27")); assertEquals("", BibtexKeyPatternUtil.lastPage("")); assertEquals("111", BibtexKeyPatternUtil.lastPage("42--111")); assertEquals("97", BibtexKeyPatternUtil.lastPage("7,41,73--97")); assertEquals("97", BibtexKeyPatternUtil.lastPage("7,41,97--73")); assertEquals("43", BibtexKeyPatternUtil.lastPage("43+")); } @Test(expected = NullPointerException.class) public void testLastPageNull() { BibtexKeyPatternUtil.lastPage(null); } /** * Tests [veryShortTitle] */ @Test public void veryShortTitle() { // veryShortTitle is getTitleWords with "1" as count int count = 1; assertEquals("application", BibtexKeyPatternUtil.getTitleWords(count, BibtexKeyPatternUtil.removeSmallWords(TITLE_STRING_ALL_LOWER_FOUR_SMALL_WORDS_ONE_EN_DASH))); assertEquals("BPEL", BibtexKeyPatternUtil.getTitleWords(count, BibtexKeyPatternUtil.removeSmallWords( TITLE_STRING_ALL_LOWER_FIRST_WORD_IN_BRACKETS_TWO_SMALL_WORDS_SMALL_WORD_AFTER_COLON))); assertEquals("Process", BibtexKeyPatternUtil.getTitleWords(count, BibtexKeyPatternUtil.removeSmallWords(TITLE_STRING_CASED))); assertEquals("BPMN", BibtexKeyPatternUtil.getTitleWords(count, BibtexKeyPatternUtil.removeSmallWords(TITLE_STRING_CASED_ONE_UPPER_WORD_ONE_SMALL_WORD))); assertEquals("Difference", BibtexKeyPatternUtil.getTitleWords(count, BibtexKeyPatternUtil.removeSmallWords(TITLE_STRING_CASED_TWO_SMALL_WORDS_SMALL_WORD_AT_THE_BEGINNING))); assertEquals("Cloud", BibtexKeyPatternUtil.getTitleWords(count, BibtexKeyPatternUtil .removeSmallWords(TITLE_STRING_CASED_TWO_SMALL_WORDS_SMALL_WORD_AFTER_COLON))); assertEquals("Towards", BibtexKeyPatternUtil.getTitleWords(count, BibtexKeyPatternUtil.removeSmallWords(TITLE_STRING_CASED_TWO_SMALL_WORDS_ONE_CONNECTED_WORD))); assertEquals("Measurement", BibtexKeyPatternUtil.getTitleWords(count, BibtexKeyPatternUtil .removeSmallWords(TITLE_STRING_CASED_FOUR_SMALL_WORDS_TWO_CONNECTED_WORDS))); } /** * Tests [shortTitle] */ @Test public void shortTitle() { // shortTitle is getTitleWords with "3" as count int count = 3; assertEquals("applicationmigrationeffort", BibtexKeyPatternUtil.getTitleWords(count, TITLE_STRING_ALL_LOWER_FOUR_SMALL_WORDS_ONE_EN_DASH)); assertEquals("BPELconformancein", BibtexKeyPatternUtil.getTitleWords(count, TITLE_STRING_ALL_LOWER_FIRST_WORD_IN_BRACKETS_TWO_SMALL_WORDS_SMALL_WORD_AFTER_COLON)); assertEquals("ProcessViewingPatterns", BibtexKeyPatternUtil.getTitleWords(count, TITLE_STRING_CASED)); assertEquals("BPMNConformancein", BibtexKeyPatternUtil.getTitleWords(count, TITLE_STRING_CASED_ONE_UPPER_WORD_ONE_SMALL_WORD)); assertEquals("TheDifferenceBetween", BibtexKeyPatternUtil.getTitleWords(count, TITLE_STRING_CASED_TWO_SMALL_WORDS_SMALL_WORD_AT_THE_BEGINNING)); assertEquals("CloudComputingThe", BibtexKeyPatternUtil.getTitleWords(count, TITLE_STRING_CASED_TWO_SMALL_WORDS_SMALL_WORD_AFTER_COLON)); assertEquals("TowardsChoreographybased", BibtexKeyPatternUtil.getTitleWords(count, TITLE_STRING_CASED_TWO_SMALL_WORDS_ONE_CONNECTED_WORD)); assertEquals("OntheMeasurement", BibtexKeyPatternUtil.getTitleWords(count, TITLE_STRING_CASED_FOUR_SMALL_WORDS_TWO_CONNECTED_WORDS)); } /** * Tests [camel] */ @Test public void camel() { // camel capitalises and concatenates all the words of the title assertEquals("ApplicationMigrationEffortInTheCloudTheCaseOfCloudPlatforms", BibtexKeyPatternUtil.getCamelizedTitle(TITLE_STRING_ALL_LOWER_FOUR_SMALL_WORDS_ONE_EN_DASH)); assertEquals("BPELConformanceInOpenSourceEnginesTheCaseOfStaticAnalysis", BibtexKeyPatternUtil.getCamelizedTitle( TITLE_STRING_ALL_LOWER_FIRST_WORD_IN_BRACKETS_TWO_SMALL_WORDS_SMALL_WORD_AFTER_COLON)); assertEquals("ProcessViewingPatterns", BibtexKeyPatternUtil.getCamelizedTitle(TITLE_STRING_CASED)); assertEquals("BPMNConformanceInOpenSourceEngines", BibtexKeyPatternUtil.getCamelizedTitle(TITLE_STRING_CASED_ONE_UPPER_WORD_ONE_SMALL_WORD)); assertEquals("TheDifferenceBetweenGraphBasedAndBlockStructuredBusinessProcessModellingLanguages", BibtexKeyPatternUtil.getCamelizedTitle( TITLE_STRING_CASED_TWO_SMALL_WORDS_SMALL_WORD_AT_THE_BEGINNING)); assertEquals("CloudComputingTheNextRevolutionInIT", BibtexKeyPatternUtil.getCamelizedTitle(TITLE_STRING_CASED_TWO_SMALL_WORDS_SMALL_WORD_AFTER_COLON)); assertEquals("TowardsChoreographyBasedProcessDistributionInTheCloud", BibtexKeyPatternUtil.getCamelizedTitle(TITLE_STRING_CASED_TWO_SMALL_WORDS_ONE_CONNECTED_WORD)); assertEquals("OnTheMeasurementOfDesignTimeAdaptabilityForProcessBasedSystems", BibtexKeyPatternUtil.getCamelizedTitle(TITLE_STRING_CASED_FOUR_SMALL_WORDS_TWO_CONNECTED_WORDS)); } /** * Tests [title] */ @Test public void title() { // title capitalises the significant words of the title // for the title case the concatenation happens at formatting, which is tested in MakeLabelWithDatabaseTest.java assertEquals("Application Migration Effort in the Cloud the Case of Cloud Platforms", BibtexKeyPatternUtil .camelizeSignificantWordsInTitle(TITLE_STRING_ALL_LOWER_FOUR_SMALL_WORDS_ONE_EN_DASH)); assertEquals("BPEL Conformance in Open Source Engines: the Case of Static Analysis", BibtexKeyPatternUtil.camelizeSignificantWordsInTitle( TITLE_STRING_ALL_LOWER_FIRST_WORD_IN_BRACKETS_TWO_SMALL_WORDS_SMALL_WORD_AFTER_COLON)); assertEquals("Process Viewing Patterns", BibtexKeyPatternUtil.camelizeSignificantWordsInTitle(TITLE_STRING_CASED)); assertEquals("BPMN Conformance in Open Source Engines", BibtexKeyPatternUtil .camelizeSignificantWordsInTitle(TITLE_STRING_CASED_ONE_UPPER_WORD_ONE_SMALL_WORD)); assertEquals("The Difference between Graph Based and Block Structured Business Process Modelling Languages", BibtexKeyPatternUtil.camelizeSignificantWordsInTitle( TITLE_STRING_CASED_TWO_SMALL_WORDS_SMALL_WORD_AT_THE_BEGINNING)); assertEquals("Cloud Computing: the Next Revolution in IT", BibtexKeyPatternUtil.camelizeSignificantWordsInTitle( TITLE_STRING_CASED_TWO_SMALL_WORDS_SMALL_WORD_AFTER_COLON)); assertEquals("Towards Choreography Based Process Distribution in the Cloud", BibtexKeyPatternUtil .camelizeSignificantWordsInTitle(TITLE_STRING_CASED_TWO_SMALL_WORDS_ONE_CONNECTED_WORD)); assertEquals("On the Measurement of Design Time Adaptability for Process Based Systems", BibtexKeyPatternUtil.camelizeSignificantWordsInTitle( TITLE_STRING_CASED_FOUR_SMALL_WORDS_TWO_CONNECTED_WORDS)); } @Test public void keywordNKeywordsSeparatedBySpace() { BibEntry entry = new BibEntry(); entry.setField("keywords", "w1, w2a w2b, w3"); String result = BibtexKeyPatternUtil.makeLabel(entry, "keyword1", ',', new BibDatabase()); assertEquals("w1", result); // check keywords with space result = BibtexKeyPatternUtil.makeLabel(entry, "keyword2", ',', new BibDatabase()); assertEquals("w2a w2b", result); // check out of range result = BibtexKeyPatternUtil.makeLabel(entry, "keyword4", ',', new BibDatabase()); assertEquals("", result); } @Test public void keywordsNKeywordsSeparatedBySpace() { BibEntry entry = new BibEntry(); entry.setField("keywords", "w1, w2a w2b, w3"); // all keywords String result = BibtexKeyPatternUtil.makeLabel(entry, "keywords", ',', new BibDatabase()); assertEquals("w1w2aw2bw3", result); // check keywords with space result = BibtexKeyPatternUtil.makeLabel(entry, "keywords2", ',', new BibDatabase()); assertEquals("w1w2aw2b", result); // check out of range result = BibtexKeyPatternUtil.makeLabel(entry, "keywords55", ',', new BibDatabase()); assertEquals("w1w2aw2bw3", result); } @Test public void testCheckLegalKeyEnforceLegal() { assertEquals("AAAA", BibtexKeyPatternUtil.checkLegalKey("AA AA", true)); assertEquals("SPECIALCHARS", BibtexKeyPatternUtil.checkLegalKey("SPECIAL CHARS#{\\\"}~,^", true)); assertEquals("", BibtexKeyPatternUtil.checkLegalKey("\n\t\r", true)); } @Test public void testCheckLegalKeyDoNotEnforceLegal() { assertEquals("AAAA", BibtexKeyPatternUtil.checkLegalKey("AA AA", false)); assertEquals("SPECIALCHARS#~^", BibtexKeyPatternUtil.checkLegalKey("SPECIAL CHARS#{\\\"}~,^", false)); assertEquals("", BibtexKeyPatternUtil.checkLegalKey("\n\t\r", false)); } @Test public void testCheckLegalNullInNullOut() { assertNull(BibtexKeyPatternUtil.checkLegalKey(null, true)); assertNull(BibtexKeyPatternUtil.checkLegalKey(null, false)); } @Test public void testApplyModifiers() { BibEntry entry = new BibEntry(); entry.setField("title", "Green Scheduling of Whatever"); assertEquals("GSo", BibtexKeyPatternUtil.makeLabel(entry, "shorttitleINI", ',', new BibDatabase())); assertEquals("GreenSchedulingof", BibtexKeyPatternUtil.makeLabel(entry, "shorttitle", ',', new BibDatabase())); } }