package org.jabref.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import org.jabref.model.database.BibDatabaseMode;
import org.jabref.model.entry.BiblatexEntryTypes;
import org.jabref.model.entry.BibtexEntryTypes;
import org.jabref.model.entry.CustomEntryType;
import org.jabref.model.entry.EntryType;
import org.jabref.model.entry.FieldName;
import org.jabref.model.entry.IEEETranEntryTypes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@RunWith(Parameterized.class)
public class EntryTypesTest {
private BibDatabaseMode mode;
private BibDatabaseMode otherMode;
private EntryType standardArticleType;
private EntryType defaultType;
private CustomEntryType newCustomType;
private CustomEntryType overwrittenStandardType;
public EntryTypesTest(BibDatabaseMode mode) {
this.mode = mode;
this.otherMode = (mode == BibDatabaseMode.BIBLATEX) ? BibDatabaseMode.BIBTEX : BibDatabaseMode.BIBLATEX;
this.standardArticleType = (mode == BibDatabaseMode.BIBLATEX) ? BiblatexEntryTypes.ARTICLE : BibtexEntryTypes.ARTICLE;
this.defaultType = (mode == BibDatabaseMode.BIBLATEX) ? BiblatexEntryTypes.MISC : BibtexEntryTypes.MISC;
}
@Parameterized.Parameters
public static Object[] data() {
return new Object[] { BibDatabaseMode.BIBTEX, BibDatabaseMode.BIBLATEX };
}
@Before
public void setUp() {
newCustomType = new CustomEntryType("customType", "required", "optional");
List<String> newRequiredFields = new ArrayList<>(BibtexEntryTypes.ARTICLE.getRequiredFields());
newRequiredFields.add("additional");
overwrittenStandardType = new CustomEntryType(BibtexEntryTypes.ARTICLE.getName(), newRequiredFields,
Collections.singletonList("optional"));
}
@After
public void tearDown() {
EntryTypes.removeAllCustomEntryTypes();
}
@Test
public void assertDefaultValuesBibtex() {
List<EntryType> sortedDefaultType = new ArrayList<>(BibtexEntryTypes.ALL);
sortedDefaultType.addAll(IEEETranEntryTypes.ALL);
Collections.sort(sortedDefaultType);
List<EntryType> sortedEntryTypes = new ArrayList<>(EntryTypes.getAllValues(BibDatabaseMode.BIBTEX));
Collections.sort(sortedEntryTypes);
assertEquals(sortedDefaultType, sortedEntryTypes);
}
@Test
public void assertDefaultValuesBiblatex() {
List<EntryType> sortedDefaultType = new ArrayList<>(BiblatexEntryTypes.ALL);
Collections.sort(sortedDefaultType);
List<EntryType> sortedEntryTypes = new ArrayList<>(EntryTypes.getAllValues(BibDatabaseMode.BIBLATEX));
Collections.sort(sortedEntryTypes);
assertEquals(sortedDefaultType, sortedEntryTypes);
}
@Test
public void unknownTypeIsNotFound() {
assertEquals(Optional.empty(), EntryTypes.getType("aaaaarticle", mode));
assertEquals(Optional.empty(), EntryTypes.getStandardType("aaaaarticle", mode));
}
@Test
public void unknownTypeIsConvertedToMiscByGetTypeOrDefault() {
assertEquals(defaultType, EntryTypes.getTypeOrDefault("unknowntype", mode));
}
@Test
public void registerCustomEntryType() {
EntryTypes.addOrModifyCustomEntryType(newCustomType, mode);
assertEquals(Optional.of(newCustomType), EntryTypes.getType("customType", mode));
}
@Test
public void registeredCustomEntryTypeIsContainedInListOfCustomizedEntryTypes() {
EntryTypes.addOrModifyCustomEntryType(newCustomType, mode);
assertEquals(Arrays.asList(newCustomType), EntryTypes.getAllCustomTypes(mode));
}
@Test
public void registerCustomEntryTypeDoesNotAffectOtherMode() {
EntryTypes.addOrModifyCustomEntryType(newCustomType, mode);
assertFalse(EntryTypes.getAllValues(otherMode).contains(newCustomType));
}
@Test
public void overwriteCustomEntryTypeFields() {
EntryTypes.addOrModifyCustomEntryType(newCustomType, mode);
CustomEntryType newCustomEntryTypeAuthorRequired = new CustomEntryType("customType", FieldName.AUTHOR, "optional");
EntryTypes.addOrModifyCustomEntryType(newCustomEntryTypeAuthorRequired, mode);
assertEquals(Optional.of(newCustomEntryTypeAuthorRequired), EntryTypes.getType("customType", mode));
}
@Test
public void overwriteStandardTypeRequiredFields() {
EntryTypes.addOrModifyCustomEntryType(overwrittenStandardType, mode);
assertEquals(Optional.of(overwrittenStandardType), EntryTypes.getType(overwrittenStandardType.getName(), mode));
}
@Test
public void registeredCustomizedStandardEntryTypeIsContainedInListOfCustomizedEntryTypes() {
EntryTypes.addOrModifyCustomEntryType(overwrittenStandardType, mode);
assertEquals(Arrays.asList(overwrittenStandardType), EntryTypes.getAllModifiedStandardTypes(mode));
}
@Test
public void standardTypeIsStillAcessibleIfOverwritten() {
EntryTypes.addOrModifyCustomEntryType(overwrittenStandardType, mode);
assertEquals(Optional.of(standardArticleType), EntryTypes.getStandardType(overwrittenStandardType.getName(), mode));
}
@Test
public void standardTypeIsRestoredAfterDeletionOfOverwrittenType() {
EntryTypes.addOrModifyCustomEntryType(overwrittenStandardType, mode);
EntryTypes.removeType(overwrittenStandardType.getName(), mode);
assertEquals(Optional.of(standardArticleType), EntryTypes.getType(overwrittenStandardType.getName(), mode));
}
@Test
public void standardTypeCannotBeRemoved() {
EntryTypes.removeType(standardArticleType.getName(), mode);
assertEquals(Optional.of(standardArticleType), EntryTypes.getType(standardArticleType.getName(), mode));
}
@Test
public void overwriteStandardTypeRequiredFieldsDoesNotAffectOtherMode() {
EntryTypes.addOrModifyCustomEntryType(overwrittenStandardType, mode);
assertFalse(EntryTypes.getAllValues(otherMode).contains(overwrittenStandardType));
}
}