package org.jabref.logic.bibtexkeypattern; import java.util.Optional; import org.jabref.model.bibtexkeypattern.DatabaseBibtexKeyPattern; import org.jabref.model.bibtexkeypattern.GlobalBibtexKeyPattern; import org.jabref.model.database.BibDatabase; import org.jabref.model.entry.BibEntry; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; public class MakeLabelWithDatabaseTest { private BibDatabase database; private BibtexKeyPatternPreferences preferences; private GlobalBibtexKeyPattern pattern; private DatabaseBibtexKeyPattern bibtexKeyPattern; private BibEntry entry; @Before public void setUp() { database = new BibDatabase(); entry = new BibEntry(); entry.setField("author", "John Doe"); entry.setField("year", "2016"); entry.setField("title", "An awesome paper on JabRef"); database.insertEntry(entry); pattern = GlobalBibtexKeyPattern.fromPattern("[auth][year]"); bibtexKeyPattern = new DatabaseBibtexKeyPattern(pattern); preferences = new BibtexKeyPatternPreferences("", "", false, true, true, pattern, ','); } @Test public void generateDefaultKey() { BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Doe2016"), entry.getCiteKeyOptional()); } @Test public void generateDefaultKeyAlreadyExistsDuplicatesStartAtA() { BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); BibEntry entry2 = new BibEntry(); entry2.setField("author", "John Doe"); entry2.setField("year", "2016"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry2, preferences); assertEquals(Optional.of("Doe2016a"), entry2.getCiteKeyOptional()); } @Test public void generateDefaultKeyAlwaysLetter() { preferences = new BibtexKeyPatternPreferences("", "", true, true, true, pattern, ','); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Doe2016a"), entry.getCiteKeyOptional()); } @Test public void generateDefaultKeyAlwaysLetterAlreadyExistsDuplicatesStartAtB() { preferences = new BibtexKeyPatternPreferences("", "", true, true, true, pattern, ','); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); BibEntry entry2 = new BibEntry(); entry2.setField("author", "John Doe"); entry2.setField("year", "2016"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry2, preferences); assertEquals(Optional.of("Doe2016b"), entry2.getCiteKeyOptional()); } @Test public void generateDefaultKeyStartDuplicatesAtB() { preferences = new BibtexKeyPatternPreferences("", "", false, false, true, pattern, ','); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Doe2016"), entry.getCiteKeyOptional()); } @Test public void generateDefaultKeyAlreadyExistsDuplicatesStartAtB() { preferences = new BibtexKeyPatternPreferences("", "", false, false, true, pattern, ','); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); BibEntry entry2 = new BibEntry(); entry2.setField("author", "John Doe"); entry2.setField("year", "2016"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry2, preferences); assertEquals(Optional.of("Doe2016b"), entry2.getCiteKeyOptional()); } @Test public void generateDefaultKeyAlreadyExistsManyDuplicates() { BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); BibEntry entry2 = new BibEntry(); entry2.setField("author", "John Doe"); entry2.setField("year", "2016"); entry2.setCiteKey(entry.getCiteKeyOptional().get()); database.insertEntry(entry2); BibEntry entry3 = new BibEntry(); entry3.setField("author", "John Doe"); entry3.setField("year", "2016"); entry3.setCiteKey(entry.getCiteKeyOptional().get()); database.insertEntry(entry3); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry3, preferences); assertEquals(Optional.of("Doe2016a"), entry3.getCiteKeyOptional()); } @Test public void generateDefaultKeyFirstTwoAlreadyExists() { BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); BibEntry entry2 = new BibEntry(); entry2.setField("author", "John Doe"); entry2.setField("year", "2016"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry2, preferences); database.insertEntry(entry2); BibEntry entry3 = new BibEntry(); entry3.setField("author", "John Doe"); entry3.setField("year", "2016"); entry3.setCiteKey(entry.getCiteKeyOptional().get()); database.insertEntry(entry3); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry3, preferences); assertEquals(Optional.of("Doe2016b"), entry3.getCiteKeyOptional()); } @Test public void generateDefaultKeyLowerModified() { bibtexKeyPattern.setDefaultValue("[auth:lower][year]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("doe2016"), entry.getCiteKeyOptional()); } @Test public void generateDefaultKeyUpperModified() { bibtexKeyPattern.setDefaultValue("[auth:upper][year]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("DOE2016"), entry.getCiteKeyOptional()); } @Test public void generateDefaultKeyFixedValue() { bibtexKeyPattern.setDefaultValue("[auth]Test[year]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("DoeTest2016"), entry.getCiteKeyOptional()); } @Test public void generateKeyShortYear() { bibtexKeyPattern.setDefaultValue("[shortyear]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("16"), entry.getCiteKeyOptional()); } @Test public void generateKeyAuthN() { bibtexKeyPattern.setDefaultValue("[auth2]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Do"), entry.getCiteKeyOptional()); } @Test public void generateKeyAuthNShortName() { bibtexKeyPattern.setDefaultValue("[auth10]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Doe"), entry.getCiteKeyOptional()); } @Test public void generateKeyEmptyField() { entry = new BibEntry(); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.empty(), entry.getCiteKeyOptional()); } @Test public void generateKeyEmptyFieldDefaultText() { bibtexKeyPattern.setDefaultValue("[author:(No Author Provided)]"); entry.clearField("author"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("NoAuthorProvided"), entry.getCiteKeyOptional()); } @Test public void generateKeyEmptyFieldColonInDefaultText() { bibtexKeyPattern.setDefaultValue("[author:(Problem:No Author Provided)]"); entry.clearField("author"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Problem:NoAuthorProvided"), entry.getCiteKeyOptional()); } @Test public void generateKeyTitle() { bibtexKeyPattern.setDefaultValue("[title]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("AnAwesomePaperonJabRef"), entry.getCiteKeyOptional()); } @Test public void generateKeyTitleAbbr() { bibtexKeyPattern.setDefaultValue("[title:abbr]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("AAPoJ"), entry.getCiteKeyOptional()); } @Test public void generateKeyShorttitle() { bibtexKeyPattern.setDefaultValue("[shorttitle]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Anawesomepaper"), entry.getCiteKeyOptional()); } @Test public void generateKeyVeryshorttitle() { bibtexKeyPattern.setDefaultValue("[veryshorttitle]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("awesome"), entry.getCiteKeyOptional()); } @Test public void generateKeyShorttitleINI() { bibtexKeyPattern.setDefaultValue("[shorttitleINI]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Aap"), entry.getCiteKeyOptional()); } @Test public void generateKeyCamel() { bibtexKeyPattern.setDefaultValue("[camel]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("AnAwesomePaperOnJabRef"), entry.getCiteKeyOptional()); } @Test public void generateKeyAuthNM() { bibtexKeyPattern.setDefaultValue("[auth4_3]"); entry.setField("author", "John Doe and Donald Smith and Will Wonder"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Wond"), entry.getCiteKeyOptional()); } @Test public void generateKeyAuthNMLargeN() { bibtexKeyPattern.setDefaultValue("[auth20_3]"); entry.setField("author", "John Doe and Donald Smith and Will Wonder"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Wonder"), entry.getCiteKeyOptional()); } @Test public void generateKeyAuthNMLargeM() { bibtexKeyPattern.setDefaultValue("[auth2_4]"); entry.setField("author", "John Doe and Donald Smith and Will Wonder"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.empty(), entry.getCiteKeyOptional()); } @Test public void generateKeyAuthNMLargeMReallyReturnsEmptyString() { bibtexKeyPattern.setDefaultValue("[auth2_4][year]"); entry.setField("author", "John Doe and Donald Smith and Will Wonder"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("2016"), entry.getCiteKeyOptional()); } @Test public void generateKeyRegExReplace() { preferences = new BibtexKeyPatternPreferences("2", "3", false, true, true, pattern, ','); bibtexKeyPattern.setDefaultValue("[auth][year]"); entry.setField("author", "John Doe and Donald Smith and Will Wonder"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Doe3016"), entry.getCiteKeyOptional()); } @Test public void generateKeyAuthIni() { bibtexKeyPattern.setDefaultValue("[authIni2]"); entry.setField("author", "John Doe and Donald Smith and Will Wonder"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("DS"), entry.getCiteKeyOptional()); } @Test public void generateKeyAuthIniMany() { bibtexKeyPattern.setDefaultValue("[authIni10]"); entry.setField("author", "John Doe and Donald Smith and Will Wonder"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("DoeSmiWon"), entry.getCiteKeyOptional()); } @Test public void generateKeyTitleTitleCase() { bibtexKeyPattern.setDefaultValue("[title:title_case]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("AnAwesomePaperonJabref"), entry.getCiteKeyOptional()); } @Test public void generateKeyTitleCapitalize() { bibtexKeyPattern.setDefaultValue("[title:capitalize]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("AnAwesomePaperOnJabref"), entry.getCiteKeyOptional()); } @Test public void generateKeyTitleSentenceCase() { bibtexKeyPattern.setDefaultValue("[title:sentence_case]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Anawesomepaperonjabref"), entry.getCiteKeyOptional()); } @Test public void generateKeyTitleTitleCaseAbbr() { bibtexKeyPattern.setDefaultValue("[title:title_case:abbr]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("AAPoJ"), entry.getCiteKeyOptional()); } @Test public void generateKeyTitleCapitalizeAbbr() { bibtexKeyPattern.setDefaultValue("[title:capitalize:abbr]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("AAPOJ"), entry.getCiteKeyOptional()); } @Test public void generateKeyTitleSentenceCaseAbbr() { bibtexKeyPattern.setDefaultValue("[title:sentence_case:abbr]"); BibtexKeyPatternUtil.makeAndSetLabel(bibtexKeyPattern, database, entry, preferences); assertEquals(Optional.of("Aapoj"), entry.getCiteKeyOptional()); } }