package org.jabref.model.database; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.BibtexString; import org.jabref.model.entry.IdGenerator; import org.jabref.model.event.TestEventListener; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class BibDatabaseTest { @Rule public ExpectedException thrown = ExpectedException.none(); private BibDatabase database; @Before public void setUp() { database = new BibDatabase(); } @Test public void insertEntryAddsEntryToEntriesList() { BibEntry entry = new BibEntry(); database.insertEntry(entry); assertEquals(database.getEntries().size(), 1); assertEquals(database.getEntryCount(), 1); assertEquals(entry, database.getEntries().get(0)); } @Test public void containsEntryIdFindsEntry() { BibEntry entry = new BibEntry(); assertFalse(database.containsEntryWithId(entry.getId())); database.insertEntry(entry); assertTrue(database.containsEntryWithId(entry.getId())); } @Test(expected = KeyCollisionException.class) public void insertEntryWithSameIdThrowsException() { BibEntry entry0 = new BibEntry(); database.insertEntry(entry0); BibEntry entry1 = new BibEntry(); entry1.setId(entry0.getId()); database.insertEntry(entry1); fail(); } @Test public void removeEntryRemovesEntryFromEntriesList() { BibEntry entry = new BibEntry(); database.insertEntry(entry); database.removeEntry(entry); assertEquals(Collections.emptyList(), database.getEntries()); assertFalse(database.containsEntryWithId(entry.getId())); } @Test(expected = NullPointerException.class) public void insertNullEntryThrowsException() { database.insertEntry(null); fail(); } @Test(expected = NullPointerException.class) public void removeNullEntryThrowsException() { database.removeEntry(null); fail(); } @Test public void emptyDatabaseHasNoStrings() { assertEquals(Collections.emptySet(), database.getStringKeySet()); assertTrue(database.hasNoStrings()); } @Test public void insertStringUpdatesStringList() { BibtexString string = new BibtexString("DSP", "Digital Signal Processing"); database.addString(string); assertFalse(database.hasNoStrings()); assertEquals(database.getStringKeySet().size(), 1); assertEquals(database.getStringCount(), 1); assertTrue(database.getStringValues().contains(string)); assertTrue(database.getStringKeySet().contains(string.getId())); assertEquals(string, database.getString(string.getId())); } @Test public void removeStringUpdatesStringList() { BibtexString string = new BibtexString("DSP", "Digital Signal Processing"); database.addString(string); database.removeString(string.getId()); assertTrue(database.hasNoStrings()); assertEquals(database.getStringKeySet().size(), 0); assertEquals(database.getStringCount(), 0); assertFalse(database.getStringValues().contains(string)); assertFalse(database.getStringKeySet().contains(string.getId())); assertNull(database.getString(string.getId())); } @Test public void hasStringLabelFindsString() { BibtexString string = new BibtexString( "DSP", "Digital Signal Processing"); database.addString(string); assertTrue(database.hasStringLabel("DSP")); assertFalse(database.hasStringLabel("VLSI")); } @Test(expected = KeyCollisionException.class) public void addSameStringLabelTwiceThrowsKeyCollisionException() { BibtexString string = new BibtexString("DSP", "Digital Signal Processing"); database.addString(string); string = new BibtexString("DSP", "Digital Signal Processor"); database.addString(string); fail(); } @Test(expected = KeyCollisionException.class) public void addSameStringIdTwiceThrowsKeyCollisionException() { BibtexString string = new BibtexString( "DSP", "Digital Signal Processing"); string.setId("duplicateid"); database.addString(string); string = new BibtexString("VLSI", "Very Large Scale Integration"); string.setId("duplicateid"); database.addString(string); fail(); } @Test public void insertEntryPostsAddedEntryEvent() { BibEntry expectedEntry = new BibEntry(); TestEventListener tel = new TestEventListener(); database.registerListener(tel); database.insertEntry(expectedEntry); BibEntry actualEntry = tel.getBibEntry(); assertEquals(expectedEntry, actualEntry); } @Test public void removeEntryPostsRemovedEntryEvent() { BibEntry expectedEntry = new BibEntry(); TestEventListener tel = new TestEventListener(); database.insertEntry(expectedEntry); database.registerListener(tel); database.removeEntry(expectedEntry); BibEntry actualEntry = tel.getBibEntry(); assertEquals(expectedEntry, actualEntry); } @Test public void changingEntryPostsChangeEntryEvent() { BibEntry entry = new BibEntry(); TestEventListener tel = new TestEventListener(); database.insertEntry(entry); database.registerListener(tel); entry.setField("test", "some value"); assertEquals(entry, tel.getBibEntry()); } @Test public void correctKeyCountOne() { BibEntry entry = new BibEntry(); entry.setCiteKey("AAA"); database.insertEntry(entry); assertEquals(database.getDuplicationChecker().getNumberOfKeyOccurrences("AAA"), 1); } @Test public void correctKeyCountTwo() { BibEntry entry = new BibEntry(); entry.setCiteKey("AAA"); database.insertEntry(entry); entry = new BibEntry(); entry.setCiteKey("AAA"); database.insertEntry(entry); assertEquals(database.getDuplicationChecker().getNumberOfKeyOccurrences("AAA"), 2); } @Test public void correctKeyCountAfterRemoving() { BibEntry entry = new BibEntry(); entry.setCiteKey("AAA"); database.insertEntry(entry); entry = new BibEntry(); entry.setCiteKey("AAA"); database.insertEntry(entry); database.removeEntry(entry); assertEquals(database.getDuplicationChecker().getNumberOfKeyOccurrences("AAA"), 1); } @Test public void circularStringResolving() { BibtexString string = new BibtexString("AAA", "#BBB#"); database.addString(string); string = new BibtexString("BBB", "#AAA#"); database.addString(string); assertEquals(database.resolveForStrings("#AAA#"), "AAA"); assertEquals(database.resolveForStrings("#BBB#"), "BBB"); } @Test public void circularStringResolvingLongerCycle() { BibtexString string = new BibtexString("AAA", "#BBB#"); database.addString(string); string = new BibtexString( "BBB", "#CCC#"); database.addString(string); string = new BibtexString("CCC", "#DDD#"); database.addString(string); string = new BibtexString( "DDD", "#AAA#"); database.addString(string); assertEquals(database.resolveForStrings("#AAA#"), "AAA"); assertEquals(database.resolveForStrings("#BBB#"), "BBB"); assertEquals(database.resolveForStrings("#CCC#"), "CCC"); assertEquals(database.resolveForStrings("#DDD#"), "DDD"); } @Test public void resolveForStringsMonth() { assertEquals(database.resolveForStrings("#jan#"), "January"); } @Test public void resolveForStringsSurroundingContent() { BibtexString string = new BibtexString("AAA", "aaa"); database.addString(string); assertEquals(database.resolveForStrings("aa#AAA#AAA"), "aaaaaAAA"); } @Test public void resolveForStringsOddHashMarkAtTheEnd() { BibtexString string = new BibtexString("AAA", "aaa"); database.addString(string); assertEquals(database.resolveForStrings("AAA#AAA#AAA#"), "AAAaaaAAA#"); } @Test public void getUsedStrings() { BibEntry entry = new BibEntry(IdGenerator.next()); entry.setField("author", "#AAA#"); BibtexString tripleA = new BibtexString( "AAA", "Some other #BBB#"); BibtexString tripleB = new BibtexString( "BBB", "Some more text"); BibtexString tripleC = new BibtexString( "CCC", "Even more text"); Set<BibtexString> stringSet = new HashSet<>(); stringSet.add(tripleA); stringSet.add(tripleB); database.addString(tripleA); database.addString(tripleB); database.addString(tripleC); database.insertEntry(entry); Set<BibtexString> usedStrings = new HashSet<>(database.getUsedStrings(Arrays.asList(entry))); assertEquals(stringSet, usedStrings); } @Test public void getUsedStringsSingleString() { BibEntry entry = new BibEntry(); entry.setField("author", "#AAA#"); BibtexString tripleA = new BibtexString("AAA", "Some other text"); BibtexString tripleB = new BibtexString("BBB", "Some more text"); List<BibtexString> strings = new ArrayList<>(1); strings.add(tripleA); database.addString(tripleA); database.addString(tripleB); database.insertEntry(entry); List<BibtexString> usedStrings = (List<BibtexString>) database.getUsedStrings(Arrays.asList(entry)); assertEquals(strings, usedStrings); } @Test public void getUsedStringsNoString() { BibEntry entry = new BibEntry(); entry.setField("author", "Oscar Gustafsson"); BibtexString string = new BibtexString("AAA", "Some other text"); database.addString(string); database.insertEntry(entry); Collection<BibtexString> usedStrings = database.getUsedStrings(Arrays.asList(entry)); assertEquals(Collections.emptyList(), usedStrings); } public void preambleIsEmptyIfNotSet() { assertEquals(Optional.empty(), database.getPreamble()); } @Test public void setPreambleWorks() { database.setPreamble("Oh yeah!"); assertEquals(Optional.of("Oh yeah!"), database.getPreamble()); } }