From 0313b4e77f94ebeaa2b3cf2e078c6f43c24d2872 Mon Sep 17 00:00:00 2001 From: Chelsey Ong Date: Sun, 3 Mar 2019 18:37:51 +0700 Subject: [PATCH 01/12] Clean key in BracketedPattern after author value is retrieved --- .../logic/bibtexkeypattern/BibtexKeyGenerator.java | 2 +- .../logic/bibtexkeypattern/BracketedPattern.java | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java index ff61a9035da..ffea572e61e 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java @@ -123,7 +123,7 @@ public String generateKey(BibEntry entry) { List parts = parseFieldMarker(typeListEntry); Character delimiter = bibtexKeyPatternPreferences.getKeywordDelimiter(); String pattern = "[" + parts.get(0) + "]"; - String label = expandBrackets(pattern, delimiter, entry, database); + String label = expandBrackets(pattern, delimiter, entry, database, bibtexKeyPatternPreferences.isEnforceLegalKey()); // apply modifier if present if (parts.size() > 1) { label = applyModifiers(label, parts, 1); diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index f88e98b3842..7c8114613e7 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -92,6 +92,10 @@ public String expand(BibEntry bibentry, Character keywordDelimiter, BibDatabase return expandBrackets(this.pattern, keywordDelimiter, bibentry, database); } + public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database) { + return expandBrackets(pattern, keywordDelimiter, entry, database, false); + } + /** * Expands a pattern * @@ -101,7 +105,7 @@ public String expand(BibEntry bibentry, Character keywordDelimiter, BibDatabase * @param database The database for field resolving. May be null. * @return The expanded pattern. Not null. */ - public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database) { + public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database, boolean isEnforceLegalKey) { Objects.requireNonNull(pattern); Objects.requireNonNull(entry); StringBuilder sb = new StringBuilder(); @@ -122,10 +126,10 @@ public static String expandBrackets(String pattern, Character keywordDelimiter, // check whether there is a modifier on the end such as // ":lower": if (fieldParts.size() <= 1) { - sb.append(getFieldValue(entry, token, keywordDelimiter, database)); + sb.append(getFieldValue(entry, token, keywordDelimiter, database, isEnforceLegalKey)); } else { // apply modifiers: - String fieldValue = getFieldValue(entry, fieldParts.get(0), keywordDelimiter, database); + String fieldValue = getFieldValue(entry, fieldParts.get(0), keywordDelimiter, database, isEnforceLegalKey); sb.append(applyModifiers(fieldValue, fieldParts, 1)); } // Fetch and discard the closing ']' @@ -156,7 +160,7 @@ public static String expandBrackets(String pattern, Character keywordDelimiter, * * @return String containing the evaluation result. Empty string if the pattern cannot be resolved. */ - public static String getFieldValue(BibEntry entry, String value, Character keywordDelimiter, BibDatabase database) { + public static String getFieldValue(BibEntry entry, String value, Character keywordDelimiter, BibDatabase database, boolean isEnforceLegalKey) { String val = value; try { @@ -187,7 +191,7 @@ public static String getFieldValue(BibEntry entry, String value, Character keywo } } } - + authString = BibtexKeyGenerator.cleanKey(authString, isEnforceLegalKey); // Gather all author-related checks, so we don't // have to check all the time. if ("auth".equals(val)) { From 7d8de04a6af8f8e556c7735376bed94ae63fb304 Mon Sep 17 00:00:00 2001 From: Chelsey Ong Date: Sun, 3 Mar 2019 22:44:48 +0700 Subject: [PATCH 02/12] Shift cleaning of authString to authN only --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 7c8114613e7..12d9a1d93bb 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -191,7 +191,7 @@ public static String getFieldValue(BibEntry entry, String value, Character keywo } } } - authString = BibtexKeyGenerator.cleanKey(authString, isEnforceLegalKey); + // Gather all author-related checks, so we don't // have to check all the time. if ("auth".equals(val)) { @@ -231,6 +231,7 @@ else if ("authorLast".equals(val)) { // authN. First N chars of the first author's last // name. + authString = BibtexKeyGenerator.cleanKey(authString, isEnforceLegalKey); String fa = firstAuthor(authString); int num = Integer.parseInt(val.substring(4)); if (num > fa.length()) { From fa73ea0246d75077a4fe20b73c4bfaa077645d00 Mon Sep 17 00:00:00 2001 From: Chelsey Ong Date: Fri, 8 Mar 2019 09:37:08 +0700 Subject: [PATCH 03/12] Extract authN method --- .../bibtexkeypattern/BracketedPattern.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 12d9a1d93bb..36e11757552 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -228,16 +228,8 @@ else if ("authorLast".equals(val)) { return authNofMth(authString, Integer.parseInt(nums[0]), Integer.parseInt(nums[1])); } else if (val.matches("auth\\d+")) { - // authN. First N chars of the first author's last - // name. - - authString = BibtexKeyGenerator.cleanKey(authString, isEnforceLegalKey); - String fa = firstAuthor(authString); int num = Integer.parseInt(val.substring(4)); - if (num > fa.length()) { - num = fa.length(); - } - return fa.substring(0, num); + return authN(authString, num, isEnforceLegalKey); } else if (val.matches("authors\\d+")) { return nAuthors(authString, Integer.parseInt(val.substring(7))); } else { @@ -845,6 +837,18 @@ public static String authNofMth(String authorField, int n, int m) { } } + /** + * First N chars of the first author's last name. + */ + public static String authN(String authString, int num, boolean isEnforceLegalKey) { + authString = BibtexKeyGenerator.cleanKey(authString, isEnforceLegalKey); + String fa = firstAuthor(authString); + if (num > fa.length()) { + num = fa.length(); + } + return fa.substring(0, num); + } + /** * authshort format: * added by Kolja Brix, kbx@users.sourceforge.net From eb522bbcc066ca232c377ab6e4948de7c2ed7666 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Fri, 8 Mar 2019 15:45:46 +0100 Subject: [PATCH 04/12] Remove old swing-based tests --- build.gradle | 1 - .../org/jabref/gui/AWTExceptionHandler.java | 24 --- .../java/org/jabref/gui/AbstractUITest.java | 105 ---------- src/test/java/org/jabref/gui/DialogTest.java | 51 ----- src/test/java/org/jabref/gui/DialogTest2.java | 43 ---- .../java/org/jabref/gui/EntryTableTest.java | 65 ------ .../org/jabref/gui/IdFetcherDialogTest.java | 121 ----------- .../gui/ParameterizedDialogNewEntryTest.java | 191 ------------------ .../jabref/gui/ParameterizedDialogTest.java | 133 ------------ .../gui/ParameterizedMenuNewEntryTest.java | 64 ------ .../jabref/gui/entryeditor/SourceTabTest.java | 2 + .../mergeentries/DiffHighlightingTest.java | 3 + ...sAndRegexBasedSearchRuleDescriberTest.java | 2 + .../GrammarBasedSearchRuleDescriberTest.java | 2 + .../jabref/gui/search/SearchResultsTest.java | 96 --------- 15 files changed, 9 insertions(+), 894 deletions(-) delete mode 100644 src/test/java/org/jabref/gui/AWTExceptionHandler.java delete mode 100644 src/test/java/org/jabref/gui/AbstractUITest.java delete mode 100644 src/test/java/org/jabref/gui/DialogTest.java delete mode 100644 src/test/java/org/jabref/gui/DialogTest2.java delete mode 100644 src/test/java/org/jabref/gui/EntryTableTest.java delete mode 100644 src/test/java/org/jabref/gui/IdFetcherDialogTest.java delete mode 100644 src/test/java/org/jabref/gui/ParameterizedDialogNewEntryTest.java delete mode 100644 src/test/java/org/jabref/gui/ParameterizedDialogTest.java delete mode 100644 src/test/java/org/jabref/gui/ParameterizedMenuNewEntryTest.java delete mode 100644 src/test/java/org/jabref/gui/search/SearchResultsTest.java diff --git a/build.gradle b/build.gradle index d08efe7b1a2..a3a9a3f66ab 100644 --- a/build.gradle +++ b/build.gradle @@ -169,7 +169,6 @@ dependencies { testRuntime 'org.apache.logging.log4j:log4j-jul:2.11.2' testCompile 'org.mockito:mockito-core:2.25.0' testCompile 'com.github.tomakehurst:wiremock:2.21.0' - testCompile 'org.assertj:assertj-swing-junit:3.9.2' testCompile 'org.reflections:reflections:0.9.11' testCompile 'org.xmlunit:xmlunit-core:2.6.2' testCompile 'org.xmlunit:xmlunit-matchers:2.6.2' diff --git a/src/test/java/org/jabref/gui/AWTExceptionHandler.java b/src/test/java/org/jabref/gui/AWTExceptionHandler.java deleted file mode 100644 index 74586f4d709..00000000000 --- a/src/test/java/org/jabref/gui/AWTExceptionHandler.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.jabref.gui; - -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import javax.swing.SwingUtilities; - -/** - * Can catch any exceptions occurring on the EDT thread for assertion. - */ -public class AWTExceptionHandler { - - private final List list = new CopyOnWriteArrayList<>(); - - public void installExceptionDetectionInEDT() { - SwingUtilities.invokeLater(() -> Thread.currentThread().setUncaughtExceptionHandler((t, e) -> list.add(e))); - } - - public void assertNoExceptions() { - if (!list.isEmpty()) { - throw new AssertionError("Uncaught exception in EDT", list.get(0)); - } - } -} diff --git a/src/test/java/org/jabref/gui/AbstractUITest.java b/src/test/java/org/jabref/gui/AbstractUITest.java deleted file mode 100644 index dfc33236d98..00000000000 --- a/src/test/java/org/jabref/gui/AbstractUITest.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.jabref.gui; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -import org.jabref.JabRefMain; - -import org.assertj.swing.fixture.AbstractWindowFixture; -import org.assertj.swing.fixture.FrameFixture; -import org.assertj.swing.fixture.JFileChooserFixture; -import org.assertj.swing.fixture.JTableFixture; -import org.assertj.swing.image.ScreenshotTaker; -import org.assertj.swing.junit.testcase.AssertJSwingJUnitTestCase; -import org.assertj.swing.timing.Pause; -import org.junit.jupiter.api.Tag; - -import static org.assertj.swing.launcher.ApplicationLauncher.application; -import static org.junit.jupiter.api.Assertions.assertEquals; - -@Tag("GUITest") -public abstract class AbstractUITest extends AssertJSwingJUnitTestCase { - - protected final static int SPEED_NORMAL = 50; - - protected AWTExceptionHandler awtExceptionHandler; - protected FrameFixture mainFrame; - - @Override - protected void onSetUp() { - awtExceptionHandler = new AWTExceptionHandler(); - awtExceptionHandler.installExceptionDetectionInEDT(); - application(JabRefMain.class).start(); - - robot().waitForIdle(); - - robot().settings().timeoutToFindSubMenu(1_000); - robot().settings().delayBetweenEvents(SPEED_NORMAL); - - //mainFrame = findFrame(null).withTimeout(10_000).using(robot()); - robot().waitForIdle(); - } - - /** - * Returns the absolute Path of the given relative Path The backlashes are replaced with forwardslashes b/c assertJ - * can't type the former one on windows - * - * @param relativePath the relative path to the resource database - */ - protected String getAbsolutePath(String relativePath) throws URISyntaxException { - final URL resource = this.getClass().getClassLoader().getResource(relativePath); - return Paths.get(resource.toURI()).toAbsolutePath().toString().replace("\\", "/"); - } - - /** - * opens a database and gives JabRef a second to open it before proceeding - */ - protected void importBibIntoNewDatabase(String path) { - mainFrame.menuItemWithPath("File", "Import into new library").click(); - JFileChooserFixture openFileDialog = mainFrame.fileChooser(); - robot().settings().delayBetweenEvents(1); - openFileDialog.fileNameTextBox().enterText(path); - openFileDialog.approve(); - Pause.pause(1_000); - } - - protected void exitJabRef() { - mainFrame.menuItemWithPath("File", "Quit").click(); - awtExceptionHandler.assertNoExceptions(); - } - - protected void newDatabase() { - mainFrame.menuItemWithPath("File", "New BibTeX database").click(); - } - - protected void closeDatabase() { - mainFrame.menuItemWithPath("File", "Close library").click(); - } - - protected void takeScreenshot(AbstractWindowFixture dialog, String filename) throws IOException { - ScreenshotTaker screenshotTaker = new ScreenshotTaker(); - Path folder = Paths.get("build", "screenshots"); - // Create build/srceenshots folder if not present - if (!Files.exists(folder)) { - Files.createDirectory(folder); - } - Path file = folder.resolve(filename + ".png").toAbsolutePath(); - // Delete already present file - if (Files.exists(file)) { - Files.delete(file); - } - screenshotTaker.saveComponentAsPng(dialog.target(), file.toString()); - } - - protected void assertColumnValue(JTableFixture table, int rowIndex, int columnIndex, String selectionValue) { - String[][] tableContent; - tableContent = table.contents(); - - String value = tableContent[rowIndex][columnIndex]; - assertEquals(value, selectionValue); - } -} diff --git a/src/test/java/org/jabref/gui/DialogTest.java b/src/test/java/org/jabref/gui/DialogTest.java deleted file mode 100644 index e97eb1a56dc..00000000000 --- a/src/test/java/org/jabref/gui/DialogTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.jabref.gui; - -import javax.swing.JButton; -import javax.swing.JDialog; - -import org.assertj.swing.core.GenericTypeMatcher; -import org.assertj.swing.dependency.jsr305.Nonnull; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; - -import static org.assertj.swing.finder.WindowFinder.findDialog; - -/** - * This test has been split to work, the other part can be found at DialogTest2 - */ -@Tag("GUITest") -public class DialogTest extends AbstractUITest { - - @Test - public void testCancelStyleSelectDialog() { - mainFrame.menuItemWithPath("Tools", "OpenOffice/LibreOffice connection").click(); - - GenericTypeMatcher buttonMatcher = new GenericTypeMatcher(JButton.class) { - - @Override - protected boolean isMatching(@Nonnull JButton jButton) { - return "Select style".equals(jButton.getText()); - } - }; - - mainFrame.button(buttonMatcher).click(); - - GenericTypeMatcher styleDialogMatcher = new GenericTypeMatcher(JDialog.class) { - - @Override - protected boolean isMatching(JDialog dialog) { - return "Select style".equals(dialog.getTitle()); // Only a single SidePane - } - }; - - GenericTypeMatcher buttonMatcher2 = new GenericTypeMatcher(JButton.class) { - - @Override - protected boolean isMatching(@Nonnull JButton jButton) { - return "Cancel".equals(jButton.getText()); - } - }; - findDialog(styleDialogMatcher).withTimeout(10_000).using(robot()).button(buttonMatcher2).click(); - exitJabRef(); - } -} diff --git a/src/test/java/org/jabref/gui/DialogTest2.java b/src/test/java/org/jabref/gui/DialogTest2.java deleted file mode 100644 index 652532dd9bb..00000000000 --- a/src/test/java/org/jabref/gui/DialogTest2.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.jabref.gui; - -import javax.swing.JButton; -import javax.swing.JDialog; - -import org.assertj.swing.core.GenericTypeMatcher; -import org.assertj.swing.dependency.jsr305.Nonnull; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; - -import static org.assertj.swing.finder.WindowFinder.findDialog; - -/** - * Split of DialogTest, since the test cases were only running separately - */ -@Tag("GUITest") -public class DialogTest2 extends AbstractUITest { - @Test - public void testCloseStyleSelectDialog() { - mainFrame.menuItemWithPath("Tools", "OpenOffice/LibreOffice connection").click(); - - GenericTypeMatcher buttonMatcher = new GenericTypeMatcher(JButton.class) { - - @Override - protected boolean isMatching(@Nonnull JButton jButton) { - return "Select style".equals(jButton.getText()); - } - }; - - mainFrame.button(buttonMatcher).click(); - - GenericTypeMatcher styleDialogMatcher = new GenericTypeMatcher(JDialog.class) { - - @Override - protected boolean isMatching(JDialog dialog) { - return "Select style".equals(dialog.getTitle()); // Only a single SidePane - } - }; - - findDialog(styleDialogMatcher).withTimeout(10_000).using(robot()).close(); - exitJabRef(); - } -} diff --git a/src/test/java/org/jabref/gui/EntryTableTest.java b/src/test/java/org/jabref/gui/EntryTableTest.java deleted file mode 100644 index d5f4fbfa861..00000000000 --- a/src/test/java/org/jabref/gui/EntryTableTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.jabref.gui; - -import java.awt.event.KeyEvent; -import java.util.regex.Pattern; - -import org.assertj.swing.fixture.JTableCellFixture; -import org.assertj.swing.fixture.JTableFixture; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** - * Specific Use-Case: I import a database. Then I doubleclick on the first entry in the table to open the entry editor. - * Then I click on the first entry again, and scroll through all of the lists entries, without having to click on the - * table again. - */ -@Tag("GUITest") -public class EntryTableTest extends AbstractUITest { - - private final static int SCROLL_ACTION_EXECUTION = 5; - private final static String TEST_FILE_NAME = "testbib/testjabref.bib"; - private final static int DOWN = KeyEvent.VK_DOWN; - private final static int UP = KeyEvent.VK_UP; - private final static int TITLE_COLUMN_INDEX = 5; - - @Test - public void scrollThroughEntryList() throws Exception { - String path = getAbsolutePath(TEST_FILE_NAME); - - importBibIntoNewDatabase(path); - - JTableFixture entryTable = mainFrame.table(); - - //use a pattern from the first row to select it since it seems to be the best way to get the cell object - Pattern pattern = Pattern.compile("256.*"); - JTableCellFixture firstCell = entryTable.cell(pattern); - - entryTable.selectRows(0).doubleClick(); - //delay has to be shortened so that double click is recognized - robot().settings().delayBetweenEvents(0); - firstCell.doubleClick(); - robot().settings().delayBetweenEvents(SPEED_NORMAL); - - firstCell.click(); - //is the first table entry selected? - assertColumnValue(entryTable, 0, TITLE_COLUMN_INDEX, entryTable.selectionValue()); - - //go throught the table and check if the entry with the correct index is selected - for (int i = 0; i < SCROLL_ACTION_EXECUTION; i++) { - robot().pressAndReleaseKey(DOWN); - assertNotNull(entryTable.selectionValue()); - assertColumnValue(entryTable, i + 1, TITLE_COLUMN_INDEX, entryTable.selectionValue()); - } - //do the same going up again - for (int i = SCROLL_ACTION_EXECUTION; i > 0; i--) { - robot().pressAndReleaseKey(UP); - assertNotNull(entryTable.selectionValue()); - assertColumnValue(entryTable, i - 1, TITLE_COLUMN_INDEX, entryTable.selectionValue()); - } - - closeDatabase(); - exitJabRef(); - } -} diff --git a/src/test/java/org/jabref/gui/IdFetcherDialogTest.java b/src/test/java/org/jabref/gui/IdFetcherDialogTest.java deleted file mode 100644 index 65a1330b25a..00000000000 --- a/src/test/java/org/jabref/gui/IdFetcherDialogTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.jabref.gui; - -import java.util.stream.Stream; - -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.text.JTextComponent; - -import org.assertj.swing.core.GenericTypeMatcher; -import org.assertj.swing.dependency.jsr305.Nonnull; -import org.assertj.swing.fixture.JTableFixture; -import org.assertj.swing.timing.Condition; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import static org.assertj.swing.finder.WindowFinder.findDialog; -import static org.assertj.swing.timing.Pause.pause; - -@Tag("GUITest") -public class IdFetcherDialogTest extends AbstractUITest { - - @ParameterizedTest - @MethodSource("instancesToTest") - public void insertEmptySearchID(String databaseMode, String fetcherType, String fetchID) { - mainFrame.menuItemWithPath("File", "New " + databaseMode + " database").click(); - JTableFixture entryTable = mainFrame.table(); - - entryTable.requireRowCount(0); - mainFrame.menuItemWithPath("BibTeX", "New entry...").click(); - - GenericTypeMatcher matcher = new GenericTypeMatcher(JDialog.class) { - @Override - protected boolean isMatching(JDialog dialog) { - return "Select entry type".equals(dialog.getTitle()); - } - }; - - findDialog(matcher).withTimeout(10_000).using(robot()).button(new GenericTypeMatcher(JButton.class) { - - @Override - protected boolean isMatching(@Nonnull JButton jButton) { - return "Generate".equals(jButton.getText()); - } - }).click(); - - GenericTypeMatcher matcherEmptyDialog = new GenericTypeMatcher(JDialog.class) { - @Override - protected boolean isMatching(JDialog dialog) { - return "Empty search ID".equals(dialog.getTitle()); - } - }; - - findDialog(matcherEmptyDialog).withTimeout(10_000).using(robot()).button(new GenericTypeMatcher(JButton.class) { - - @Override - protected boolean isMatching(@Nonnull JButton jButton) { - return "OK".equals(jButton.getText()); - } - }).click(); - - entryTable.requireRowCount(0); - } - - @ParameterizedTest - @MethodSource("instancesToTest") - public void testFetcherDialog(String databaseMode, String fetcherType, String fetchID) { - mainFrame.menuItemWithPath("File", "New " + databaseMode + " database").click(); - JTableFixture entryTable = mainFrame.table(); - - entryTable.requireRowCount(0); - mainFrame.menuItemWithPath("BibTeX", "New entry...").click(); - - GenericTypeMatcher matcher = new GenericTypeMatcher(JDialog.class) { - @Override - protected boolean isMatching(JDialog dialog) { - return "Select entry type".equals(dialog.getTitle()); - } - }; - - findDialog(matcher).withTimeout(10_000).using(robot()).comboBox(new GenericTypeMatcher(JComboBox.class) { - @Override - protected boolean isMatching(@Nonnull JComboBox component) { - return true; - } - }).selectItem(fetcherType); - - findDialog(matcher).withTimeout(10_000).using(robot()).textBox(new GenericTypeMatcher(JTextComponent.class) { - @Override - protected boolean isMatching(@Nonnull JTextComponent component) { - return true; - } - }).enterText(fetchID); - - findDialog(matcher).withTimeout(10_000).using(robot()).button(new GenericTypeMatcher(JButton.class) { - @Override - protected boolean isMatching(@Nonnull JButton jButton) { - return "Generate".equals(jButton.getText()); - } - }).click(); - - pause(new Condition("entrySize") { - @Override - public boolean test() { - return entryTable.rowCount() == 1; - } - }, 10_000); - - entryTable.requireRowCount(1); - } - - public static Stream instancesToTest() { - return Stream.of( - new Object[]{"BibTeX", "DOI", "10.1002/9781118257517"}, - new Object[]{"biblatex", "DOI", "10.1002/9781118257517"}, - new Object[]{"BibTeX", "ISBN", "9780321356680"}, - new Object[]{"biblatex", "ISBN", "9780321356680"} - ); - } -} diff --git a/src/test/java/org/jabref/gui/ParameterizedDialogNewEntryTest.java b/src/test/java/org/jabref/gui/ParameterizedDialogNewEntryTest.java deleted file mode 100644 index 2cfd70baa8a..00000000000 --- a/src/test/java/org/jabref/gui/ParameterizedDialogNewEntryTest.java +++ /dev/null @@ -1,191 +0,0 @@ -package org.jabref.gui; - -import java.util.Locale; -import java.util.stream.Stream; - -import javax.swing.JButton; -import javax.swing.JDialog; - -import org.assertj.swing.core.GenericTypeMatcher; -import org.assertj.swing.dependency.jsr305.Nonnull; -import org.assertj.swing.fixture.JTableFixture; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import static org.assertj.swing.finder.WindowFinder.findDialog; - -@Tag("GUITest") -public class ParameterizedDialogNewEntryTest extends AbstractUITest { - - @ParameterizedTest - @MethodSource("instancesToTest") - public void addEntryOfGivenType(String databaseMode, String entryType) { - mainFrame.menuItemWithPath("File", "New " + databaseMode + " database").click(); - JTableFixture entryTable = mainFrame.table(); - - entryTable.requireRowCount(0); - mainFrame.menuItemWithPath("BibTeX", "New entry...").click(); - - selectEntryType(entryType); - - entryTable.requireRowCount(1); - } - - private void selectEntryType(String entryType) { - GenericTypeMatcher matcher = new GenericTypeMatcher(JDialog.class) { - - @Override - protected boolean isMatching(JDialog dialog) { - return "Select entry type".equals(dialog.getTitle()); - } - }; - - findDialog(matcher).withTimeout(10_000).using(robot()).button(new GenericTypeMatcher(JButton.class) { - - @Override - protected boolean isMatching(@Nonnull JButton jButton) { - return entryType.equals(jButton.getText()); - } - }).click(); - } - - @ParameterizedTest - @MethodSource("instancesToTest") - public void addEntryPlainTextOfGivenType(String databaseMode, String entryType) { - mainFrame.menuItemWithPath("File", "New " + databaseMode + " database").click(); - JTableFixture entryTable = mainFrame.table(); - - entryTable.requireRowCount(0); - mainFrame.menuItemWithPath("BibTeX", "New entry from plain text...").click(); - - selectEntryType(entryType); - - GenericTypeMatcher matcher2 = plainTextMatcher(entryType); - - findDialog(matcher2).withTimeout(10_000).using(robot()).button(new GenericTypeMatcher(JButton.class) { - - @Override - protected boolean isMatching(@Nonnull JButton jButton) { - return "Accept".equals(jButton.getText()); - } - }).click(); - - entryTable.requireRowCount(1); - } - - @ParameterizedTest - @MethodSource("instancesToTest") - public void closeAddingEntryPlainTextOfGivenType(String databaseMode, String entryType) { - mainFrame.menuItemWithPath("File", "New " + databaseMode + " database").click(); - JTableFixture entryTable = mainFrame.table(); - - entryTable.requireRowCount(0); - mainFrame.menuItemWithPath("BibTeX", "New entry from plain text...").click(); - - selectEntryType(entryType); - - GenericTypeMatcher matcher2 = plainTextMatcher(entryType); - - findDialog(matcher2).withTimeout(10_000).using(robot()).close(); - entryTable.requireRowCount(0); - } - - @ParameterizedTest - @MethodSource("instancesToTest") - public void cancelAddingEntryPlainTextOfGivenType(String databaseMode, String entryType) { - mainFrame.menuItemWithPath("File", "New " + databaseMode + " database").click(); - JTableFixture entryTable = mainFrame.table(); - - entryTable.requireRowCount(0); - mainFrame.menuItemWithPath("BibTeX", "New entry from plain text...").click(); - - selectEntryType(entryType); - - GenericTypeMatcher matcher2 = plainTextMatcher(entryType); - - findDialog(matcher2).withTimeout(10_000).using(robot()).button(new GenericTypeMatcher(JButton.class) { - - @Override - protected boolean isMatching(@Nonnull JButton jButton) { - return "Cancel".equals(jButton.getText()); - } - }).click(); - - entryTable.requireRowCount(0); - } - - private GenericTypeMatcher plainTextMatcher(String entryType) { - GenericTypeMatcher matcher2 = new GenericTypeMatcher(JDialog.class) { - - @Override - protected boolean isMatching(JDialog dialog) { - return ("Plain text import for " + entryType.toLowerCase(Locale.ENGLISH)).equals(dialog.getTitle()); - } - }; - return matcher2; - } - - public static Stream instancesToTest() { - // Create entry from menu - // Structure: - // {"BibTeX"/"biblatex", "type"} - // @formatter:off - return Stream.of( - new Object[]{"BibTeX", "Article"}, -/* new Object[]{"BibTeX", "InBook"}, - new Object[]{"BibTeX", "Book"}, - new Object[]{"BibTeX", "Booklet"}, - new Object[]{"BibTeX", "InCollection"}, - new Object[]{"BibTeX", "Conference"}, - new Object[]{"BibTeX", "InProceedings"}, - new Object[]{"BibTeX", "Proceedings"}, - new Object[]{"BibTeX", "Manual"}, - new Object[]{"BibTeX", "MastersThesis"}, - new Object[]{"BibTeX", "PhdThesis"}, - new Object[]{"BibTeX", "TechReport"}, - new Object[]{"BibTeX", "Unpublished"}, - new Object[]{"BibTeX", "Misc"}, - new Object[]{"BibTeX", "Electronic"}, - new Object[]{"BibTeX", "IEEEtranBSTCTL"}, - new Object[]{"BibTeX", "Periodical"}, - new Object[]{"BibTeX", "Patent"}, - new Object[]{"BibTeX", "Standard"}, - new Object[]{"biblatex", "Article"}, - new Object[]{"biblatex", "Book"}, - new Object[]{"biblatex", "BookInBook"}, - new Object[]{"biblatex", "Booklet"}, - new Object[]{"biblatex", "Collection"}, - new Object[]{"biblatex", "Conference"}, - new Object[]{"biblatex", "Electronic"}, - new Object[]{"biblatex", "IEEEtranBSTCTL"}, - new Object[]{"biblatex", "InBook"}, - new Object[]{"biblatex", "InCollection"}, - new Object[]{"biblatex", "InProceedings"}, - new Object[]{"biblatex", "InReference"}, - new Object[]{"biblatex", "Manual"}, - new Object[]{"biblatex", "MastersThesis"}, - new Object[]{"biblatex", "Misc"}, - new Object[]{"biblatex", "MvBook"}, - new Object[]{"biblatex", "MvCollection"}, - new Object[]{"biblatex", "MvProceedings"}, - new Object[]{"biblatex", "MvReference"}, - new Object[]{"biblatex", "Online"}, - new Object[]{"biblatex", "Patent"}, - new Object[]{"biblatex", "Periodical"}, - new Object[]{"biblatex", "PhdThesis"}, - new Object[]{"biblatex", "Proceedings"}, - new Object[]{"biblatex", "Reference"}, - new Object[]{"biblatex", "Report"}, - new Object[]{"biblatex", "Set"}, - new Object[]{"biblatex", "SuppBook"}, - new Object[]{"biblatex", "SuppCollection"}, - new Object[]{"biblatex", "SuppPeriodical"}, - new Object[]{"biblatex", "TechReport"}, - new Object[]{"biblatex", "Thesis"}, - new Object[]{"biblatex", "Unpublished"},*/ - new Object[]{"biblatex", "WWW"} - ); - // @formatter:on - } -} diff --git a/src/test/java/org/jabref/gui/ParameterizedDialogTest.java b/src/test/java/org/jabref/gui/ParameterizedDialogTest.java deleted file mode 100644 index de3d6dcfc43..00000000000 --- a/src/test/java/org/jabref/gui/ParameterizedDialogTest.java +++ /dev/null @@ -1,133 +0,0 @@ -package org.jabref.gui; - -import java.util.stream.Stream; - -import javax.swing.JButton; -import javax.swing.JDialog; - -import org.assertj.swing.core.GenericTypeMatcher; -import org.assertj.swing.dependency.jsr305.Nonnull; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import static org.assertj.swing.finder.WindowFinder.findDialog; - -@Tag("GUITest") -public class ParameterizedDialogTest extends AbstractUITest { - - @ParameterizedTest - @MethodSource("instancesToTest") - public void openAndExitDialog(boolean createDatabase, String[] menuPath, String dialogTitle, String buttonName, - boolean closeButton) { - if (createDatabase) { - newDatabase(); - } - mainFrame.menuItemWithPath(menuPath).click(); - GenericTypeMatcher matcher = new GenericTypeMatcher(JDialog.class) { - - @Override - protected boolean isMatching(JDialog dialog) { - return dialogTitle.equals(dialog.getTitle()); - } - }; - - if (closeButton) { - findDialog(matcher).withTimeout(10_000).using(robot()).close(); - } else { - findDialog(matcher).withTimeout(10_000).using(robot()) - .button(new GenericTypeMatcher(JButton.class) { - - @Override - protected boolean isMatching(@Nonnull JButton jButton) { - return buttonName.equals(jButton.getText()); - } - }).click(); - } - if (createDatabase) { - closeDatabase(); - } - exitJabRef(); - } - - public static Stream instancesToTest() { - // Opening and closing (in different ways) the dialogs accessible from the menus without doing anything else - // Structure: - // {create new database, {"Menu", "Submenu", "Sub-sub-menu"}, "Dialog title", "Button name", use close button} - // @formatter:off - return Stream.of( - new Object[]{false, new String[]{"File", "Open library"}, "Open", "Cancel", false}, - new Object[]{false, new String[]{"File", "Open library"}, "Open", "Close button", true}, - new Object[]{true, new String[]{"File", "Append library"}, "Append library", "Cancel", false}, - new Object[]{true, new String[]{"File", "Append library"}, "Append library", "Close button", true}, - new Object[]{true, new String[]{"File", "Save library"}, "Save", "Cancel", false}, - new Object[]{true, new String[]{"File", "Save library"}, "Save", "Close button", true}, - new Object[]{true, new String[]{"File", "Save library as..."}, "Save", "Cancel", false}, - new Object[]{true, new String[]{"File", "Save library as..."}, "Save", "Close button", true}, - new Object[]{true, new String[]{"File", "Save all"}, "Save", "Cancel", false}, - new Object[]{true, new String[]{"File", "Save all"}, "Save", "Close button", true}, - new Object[]{false, new String[]{"File", "Import into new library"}, "Open", "Cancel", false}, - new Object[]{false, new String[]{"File", "Import into new library"}, "Open", "Close button", true}, - new Object[]{true, new String[]{"File", "Import into current library"}, "Open", "Cancel", false}, - new Object[]{true, new String[]{"File", "Import into current library"}, "Open", "Close button", true}, - new Object[]{true, new String[]{"File", "Export"}, "Save", "Cancel", false}, - new Object[]{true, new String[]{"File", "Export"}, "Save", "Close button", true}, - new Object[]{true, new String[]{"File", "Open shared database"}, "Open shared database", "Cancel", false}, - new Object[]{true, new String[]{"File", "Library properties"}, "Library properties", "Cancel", false}, - new Object[]{true, new String[]{"File", "Library properties"}, "Library properties", "OK", false}, - new Object[]{true, new String[]{"File", "Library properties"}, "Library properties", "Close button", true}, - new Object[]{true, new String[]{"Edit", "Set/clear/rename fields..."}, "Set/clear/rename fields", "Cancel", false}, - //new Object[]{true, new String[]{"Edit", "Set/clear/rename fields..."}, "Set/clear/rename fields", "OK", false}, - new Object[]{true, new String[]{"Edit", "Set/clear/rename fields..."}, "Set/clear/rename fields", "Close button", true}, - new Object[]{true, new String[]{"Search", "Replace string..."}, "Replace string", "Cancel", false}, - new Object[]{true, new String[]{"Search", "Replace string..."}, "Replace string", "Close button", true}, - new Object[]{true, new String[]{"Groups", "Add to group..."}, "Add to group", "Cancel", false}, - new Object[]{true, new String[]{"Groups", "Add to group..."}, "Add to group", "Close button", true}, - new Object[]{true, new String[]{"Groups", "Remove from group..."}, "Remove from group", "Cancel", false}, - new Object[]{true, new String[]{"Groups", "Remove from group..."}, "Remove from group", "Close button", true}, - new Object[]{true, new String[]{"Groups", "Move to group..."}, "Move to group", "Cancel", false}, - new Object[]{true, new String[]{"Groups", "Move to group..."}, "Move to group", "Close button", true}, - new Object[]{true, new String[]{"BibTeX", "New entry..."}, "Select entry type", "Cancel", false}, - new Object[]{true, new String[]{"BibTeX", "New entry..."}, "Select entry type", "Close button", true}, - new Object[]{true, new String[]{"BibTeX", "Edit preamble"}, "Edit preamble", "Close button", true}, - new Object[]{true, new String[]{"BibTeX", "Edit strings"}, "Strings for library: untitled", "Close button", true}, - new Object[]{true, new String[]{"BibTeX", "Customize entry types"}, "Customize entry types", "Cancel", false}, - new Object[]{true, new String[]{"BibTeX", "Customize entry types"}, "Customize entry types", "OK", false}, - new Object[]{true, new String[]{"BibTeX", "Customize entry types"}, "Customize entry types", "Close button", true}, - new Object[]{true, new String[]{"Quality", "Synchronize file links..."}, "Synchronize file links", "Cancel", false}, - new Object[]{true, new String[]{"Quality", "Synchronize file links..."}, "Synchronize file links", "Close button", true}, - new Object[]{true, new String[]{"Quality", "Find unlinked files..."}, "Find unlinked files", "Close", false}, - new Object[]{true, new String[]{"Quality", "Find unlinked files..."}, "Find unlinked files", "Close button", true}, - new Object[]{true, new String[]{"Tools", "New sublibrary based on AUX file..."}, "AUX file import", "Cancel", false}, - new Object[]{true, new String[]{"Tools", "New sublibrary based on AUX file..."}, "AUX file import", "Close button", true}, - new Object[]{false, new String[]{"Options", "Preferences"}, "JabRef preferences", "Cancel", false}, - new Object[]{false, new String[]{"Options", "Preferences"}, "JabRef preferences", "OK", false}, - new Object[]{false, new String[]{"Options", "Preferences"}, "JabRef preferences", "Close button", true}, - new Object[]{false, new String[]{"Options", "Set up general fields"}, "Set general fields", "Cancel", false}, - new Object[]{false, new String[]{"Options", "Set up general fields"}, "Set general fields", "OK", false}, - new Object[]{false, new String[]{"Options", "Set up general fields"}, "Set general fields", "Close button", true}, - new Object[]{false, new String[]{"Options", "Manage custom exports"}, "Manage custom exports", "Close", false}, - new Object[]{false, new String[]{"Options", "Manage custom exports"}, "Manage custom exports", "Close button", true}, - new Object[]{false, new String[]{"Options", "Manage custom imports"}, "Manage custom imports", "Close", false}, - new Object[]{false, new String[]{"Options", "Manage custom imports"}, "Manage custom imports", "Close button", true}, - new Object[]{false, new String[]{"Options", "Manage external file types"}, "Manage external file types", "Cancel", false}, - new Object[]{false, new String[]{"Options", "Manage external file types"}, "Manage external file types", "OK", false}, - new Object[]{false, new String[]{"Options", "Manage external file types"}, "Manage external file types", "Close button", true}, - new Object[]{false, new String[]{"Options", "Manage journal abbreviations"}, "Journal abbreviations", "Cancel", false}, - new Object[]{false, new String[]{"Options", "Manage journal abbreviations"}, "Journal abbreviations", "OK", false}, - new Object[]{false, new String[]{"Options", "Manage journal abbreviations"}, "Journal abbreviations", "Close button", true}, - new Object[]{true, new String[]{"Options", "Manage content selectors"}, "Manage content selectors", "Cancel", false}, - // new Object[]{true, new String[]{"Options", "Manage content selectors"}, "Manage content selectors", "OK", false}, - new Object[]{true, new String[]{"Options", "Manage content selectors"}, "Manage content selectors", "Close button", true}, - new Object[]{false, new String[]{"Options", "Manage protected terms"}, "Manage protected terms files", "Cancel", false}, - new Object[]{false, new String[]{"Options", "Manage protected terms"}, "Manage protected terms files", "OK", false}, - new Object[]{false, new String[]{"Options", "Manage protected terms"}, "Manage protected terms files", "Close button", true}, - new Object[]{false, new String[]{"Options", "Customize key bindings"}, "Key bindings", "Cancel", false}, - new Object[]{false, new String[]{"Options", "Customize key bindings"}, "Key bindings", "Close button", true}, - new Object[]{false, new String[]{"Help", "Show error console"}, "Program output", "OK", false}, - new Object[]{false, new String[]{"Help", "Show error console"}, "Program output", "Close button", true}, - new Object[]{false, new String[]{"Help", "About JabRef"}, "About JabRef", "Close button", true} - ); - // @formatter:on - } -} diff --git a/src/test/java/org/jabref/gui/ParameterizedMenuNewEntryTest.java b/src/test/java/org/jabref/gui/ParameterizedMenuNewEntryTest.java deleted file mode 100644 index 67efff9e04b..00000000000 --- a/src/test/java/org/jabref/gui/ParameterizedMenuNewEntryTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.jabref.gui; - -import java.util.stream.Stream; - -import org.jabref.model.strings.StringUtil; - -import org.assertj.swing.fixture.JTableFixture; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -@Tag("GUITest") -public class ParameterizedMenuNewEntryTest extends AbstractUITest { - - // Not working on Travis - @ParameterizedTest - @MethodSource("instancesToTest") - public void addEntryOfGivenType(String databaseMode, String entryType) { - mainFrame.menuItemWithPath("File", "New " + databaseMode + " database").click(); - JTableFixture entryTable = mainFrame.table(); - - entryTable.requireRowCount(0); - mainFrame.menuItemWithPath("BibTeX", "New entry by type...", StringUtil.capitalizeFirst(entryType)).click(); - entryTable.requireRowCount(1); - } - - public static Stream instancesToTest() { - // Create entry from menu - // Structure: - // {"BibTeX"/"biblatex", "type"} - // @formatter:off - return Stream.of( - new Object[]{"BibTeX", "article"}, - new Object[]{"BibTeX", "inbook"}, - new Object[]{"BibTeX", "book"}, - new Object[]{"BibTeX", "booklet"}, - new Object[]{"BibTeX", "incollection"}, - new Object[]{"BibTeX", "conference"}, - new Object[]{"BibTeX", "inproceedings"}, - new Object[]{"BibTeX", "proceedings"}, - new Object[]{"BibTeX", "manual"}, - new Object[]{"BibTeX", "mastersthesis"}, - new Object[]{"BibTeX", "phdthesis"}, - new Object[]{"BibTeX", "techreport"}, - new Object[]{"BibTeX", "unpublished"}, - new Object[]{"BibTeX", "misc"}, - new Object[]{"biblatex", "article"}, - new Object[]{"biblatex", "inbook"}, - new Object[]{"biblatex", "book"}, - new Object[]{"biblatex", "booklet"}, - new Object[]{"biblatex", "incollection"}, - new Object[]{"biblatex", "conference"}, - new Object[]{"biblatex", "inproceedings"}, - new Object[]{"biblatex", "proceedings"}, - new Object[]{"biblatex", "manual"}, - new Object[]{"biblatex", "mastersthesis"}, - new Object[]{"biblatex", "phdthesis"}, - new Object[]{"biblatex", "techreport"}, - new Object[]{"biblatex", "unpublished"}, - new Object[]{"biblatex", "misc"} - ); - // @formatter:on - } -} diff --git a/src/test/java/org/jabref/gui/entryeditor/SourceTabTest.java b/src/test/java/org/jabref/gui/entryeditor/SourceTabTest.java index df3012e67ad..51a27e3b70a 100644 --- a/src/test/java/org/jabref/gui/entryeditor/SourceTabTest.java +++ b/src/test/java/org/jabref/gui/entryeditor/SourceTabTest.java @@ -13,6 +13,7 @@ import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.jabref.model.util.DummyFileUpdateMonitor; +import org.jabref.testutils.category.GUITest; import org.fxmisc.richtext.CodeArea; import org.junit.jupiter.api.Test; @@ -23,6 +24,7 @@ import static org.mockito.Mockito.mock; +@GUITest @ExtendWith(ApplicationExtension.class) public class SourceTabTest { diff --git a/src/test/java/org/jabref/gui/mergeentries/DiffHighlightingTest.java b/src/test/java/org/jabref/gui/mergeentries/DiffHighlightingTest.java index 70d0b601cd6..9ed45408946 100644 --- a/src/test/java/org/jabref/gui/mergeentries/DiffHighlightingTest.java +++ b/src/test/java/org/jabref/gui/mergeentries/DiffHighlightingTest.java @@ -7,11 +7,14 @@ import javafx.scene.text.Text; +import org.jabref.testutils.category.GUITest; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.testfx.framework.junit5.ApplicationExtension; +@GUITest @ExtendWith(ApplicationExtension.class) class DiffHighlightingTest { diff --git a/src/test/java/org/jabref/gui/search/ContainsAndRegexBasedSearchRuleDescriberTest.java b/src/test/java/org/jabref/gui/search/ContainsAndRegexBasedSearchRuleDescriberTest.java index 278556f0db4..cfc515f5949 100644 --- a/src/test/java/org/jabref/gui/search/ContainsAndRegexBasedSearchRuleDescriberTest.java +++ b/src/test/java/org/jabref/gui/search/ContainsAndRegexBasedSearchRuleDescriberTest.java @@ -9,12 +9,14 @@ import org.jabref.gui.search.rules.describer.ContainsAndRegexBasedSearchRuleDescriber; import org.jabref.gui.util.TooltipTextUtil; +import org.jabref.testutils.category.GUITest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.testfx.framework.junit5.ApplicationExtension; import org.testfx.framework.junit5.Start; +@GUITest @ExtendWith(ApplicationExtension.class) class ContainsAndRegexBasedSearchRuleDescriberTest { diff --git a/src/test/java/org/jabref/gui/search/GrammarBasedSearchRuleDescriberTest.java b/src/test/java/org/jabref/gui/search/GrammarBasedSearchRuleDescriberTest.java index 7855be39bae..36ae0dbea71 100644 --- a/src/test/java/org/jabref/gui/search/GrammarBasedSearchRuleDescriberTest.java +++ b/src/test/java/org/jabref/gui/search/GrammarBasedSearchRuleDescriberTest.java @@ -10,6 +10,7 @@ import org.jabref.gui.search.rules.describer.GrammarBasedSearchRuleDescriber; import org.jabref.gui.util.TooltipTextUtil; import org.jabref.model.search.rules.GrammarBasedSearchRule; +import org.jabref.testutils.category.GUITest; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -18,6 +19,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; +@GUITest @ExtendWith(ApplicationExtension.class) class GrammarBasedSearchRuleDescriberTest { diff --git a/src/test/java/org/jabref/gui/search/SearchResultsTest.java b/src/test/java/org/jabref/gui/search/SearchResultsTest.java deleted file mode 100644 index 1e2badcc2ad..00000000000 --- a/src/test/java/org/jabref/gui/search/SearchResultsTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.jabref.gui.search; - -import java.util.concurrent.TimeUnit; - -import javax.swing.JFrame; - -import org.jabref.testutils.TestUtils; - -import org.assertj.swing.core.ComponentFinder; -import org.assertj.swing.edt.FailOnThreadViolationRepaintManager; -import org.assertj.swing.finder.WindowFinder; -import org.assertj.swing.fixture.FrameFixture; -import org.assertj.swing.fixture.JTextComponentFixture; -import org.assertj.swing.junit.testcase.AssertJSwingJUnitTestCase; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; - -@Tag("GUITest") -public class SearchResultsTest extends AssertJSwingJUnitTestCase { - - private FrameFixture frameFixture; - - @BeforeAll - public static void before() { - FailOnThreadViolationRepaintManager.uninstall(); - } - - @Override - protected void onSetUp() { - TestUtils.initJabRef(); - frameFixture = WindowFinder.findFrame(JFrame.class).withTimeout(15, TimeUnit.SECONDS).using(robot()); - } - - @Override - protected void onTearDown() { - frameFixture.close(); - frameFixture = null; - - TestUtils.closeJabRef(); - } - - @Test - public void testSearchFieldQuery() { - frameFixture.menuItemWithPath("Search", "Search").click(); - JTextComponentFixture searchField = frameFixture.textBox(); - ComponentFinder finder = robot().finder(); - /* - BasePanel panel = finder.findByType(BasePanel.class); - Collection entries = panel.getDatabase().getEntries(); - - searchField.deleteText().enterText(""); - Assert.assertEquals(19, entries.size()); - - searchField.deleteText().enterText("entrytype=article"); - Assert.assertFalse(entries.stream().noneMatch(entry -> entry.isSearchHit())); - Assert.assertEquals(5, entries.stream().filter(entry -> entry.isSearchHit()).count()); - - searchField.deleteText().enterText("entrytype=proceedings"); - Assert.assertFalse(entries.stream().noneMatch(entry -> entry.isSearchHit())); - Assert.assertEquals(13, entries.stream().filter(entry -> entry.isSearchHit()).count()); - - searchField.deleteText().enterText("entrytype=book"); - Assert.assertFalse(entries.stream().noneMatch(entry -> entry.isSearchHit())); - Assert.assertEquals(1, entries.stream().filter(entry -> entry.isSearchHit()).count()); - */ - } - - @Test - public void testSeachWithoutResults() { - /* - frameFixture.menuItemWithPath("Search", "Search").click(); - JTextComponentFixture searchField = frameFixture.textBox(); - ComponentFinder finder = robot().finder(); - BasePanel panel = finder.findByType(BasePanel.class); - Collection entries = panel.getDatabase().getEntries(); - - searchField.deleteText().enterText("asdf"); - Assert.assertTrue(entries.stream().noneMatch(entry -> entry.isSearchHit())); - */ - } - - @Test - public void testSearchInvalidQuery() { - /* - frameFixture.menuItemWithPath("Search", "Search").click(); - JTextComponentFixture searchField = frameFixture.textBox(); - ComponentFinder finder = robot().finder(); - BasePanel panel = finder.findByType(BasePanel.class); - Collection entries = panel.getDatabase().getEntries(); - - searchField.deleteText().enterText("asdf["); - Assert.assertTrue(entries.stream().noneMatch(entry -> entry.isSearchHit())); - */ - } -} From 06540939946648cff2428e5c5ff4d2ac69c8be19 Mon Sep 17 00:00:00 2001 From: Tobias Diez Date: Sat, 9 Mar 2019 14:42:39 +0100 Subject: [PATCH 05/12] Fix NotOnJavaFXThread exception for remote import --- .../java/org/jabref/gui/remote/JabRefMessageHandler.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/remote/JabRefMessageHandler.java b/src/main/java/org/jabref/gui/remote/JabRefMessageHandler.java index 364052baa2d..8033c9343d9 100644 --- a/src/main/java/org/jabref/gui/remote/JabRefMessageHandler.java +++ b/src/main/java/org/jabref/gui/remote/JabRefMessageHandler.java @@ -3,6 +3,8 @@ import java.util.Arrays; import java.util.List; +import javafx.application.Platform; + import org.jabref.JabRefGUI; import org.jabref.cli.ArgumentProcessor; import org.jabref.logic.importer.ParserResult; @@ -20,7 +22,11 @@ public void handleCommandLineArguments(String[] message) { List loaded = argumentProcessor.getParserResults(); for (int i = 0; i < loaded.size(); i++) { ParserResult pr = loaded.get(i); - JabRefGUI.getMainFrame().addParserResult(pr, i == 0); + boolean focusPanel = i == 0; + Platform.runLater(() -> + // Need to run this on the JavaFX thread + JabRefGUI.getMainFrame().addParserResult(pr, focusPanel) + ); } } } From 03fc076324c4d57e40a663f962d050bafac15f08 Mon Sep 17 00:00:00 2001 From: Chelsey Ong Date: Sun, 10 Mar 2019 09:56:14 +0800 Subject: [PATCH 06/12] Filter unwanted characters before removing whitespaces --- .../logic/bibtexkeypattern/BibtexKeyGenerator.java | 10 +++++++--- .../logic/bibtexkeypattern/BracketedPattern.java | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java index ffea572e61e..35b4c5f6524 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java @@ -72,7 +72,7 @@ private static String getAppendix(int number) { } } - public static String cleanKey(String key, boolean enforceLegalKey) { + public static String filterUnwantedCharacters(String key, boolean enforceLegalKey) { if (!enforceLegalKey) { // User doesn't want us to enforce legal characters. We must still look // for whitespace and some characters such as commas, since these would @@ -80,7 +80,7 @@ public static String cleanKey(String key, boolean enforceLegalKey) { StringBuilder newKey = new StringBuilder(); for (int i = 0; i < key.length(); i++) { char c = key.charAt(i); - if (!Character.isWhitespace(c) && (KEY_UNWANTED_CHARACTERS.indexOf(c) == -1)) { + if (KEY_UNWANTED_CHARACTERS.indexOf(c) == -1) { newKey.append(c); } } @@ -90,7 +90,7 @@ public static String cleanKey(String key, boolean enforceLegalKey) { StringBuilder newKey = new StringBuilder(); for (int i = 0; i < key.length(); i++) { char c = key.charAt(i); - if (!Character.isWhitespace(c) && (KEY_ILLEGAL_CHARACTERS.indexOf(c) == -1)) { + if (KEY_ILLEGAL_CHARACTERS.indexOf(c) == -1) { newKey.append(c); } } @@ -100,6 +100,10 @@ public static String cleanKey(String key, boolean enforceLegalKey) { return StringUtil.replaceSpecialCharacters(newKey.toString()); } + public static String cleanKey(String key, boolean enforceLegalKey) { + return filterUnwantedCharacters(key, enforceLegalKey).replaceAll("\\s",""); + } + public String generateKey(BibEntry entry) { String key; StringBuilder stringBuilder = new StringBuilder(); diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 36e11757552..c6a8d292ae5 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -841,7 +841,7 @@ public static String authNofMth(String authorField, int n, int m) { * First N chars of the first author's last name. */ public static String authN(String authString, int num, boolean isEnforceLegalKey) { - authString = BibtexKeyGenerator.cleanKey(authString, isEnforceLegalKey); + authString = BibtexKeyGenerator.filterUnwantedCharacters(authString, isEnforceLegalKey); String fa = firstAuthor(authString); if (num > fa.length()) { num = fa.length(); From a0219f384719159bc067e03784348662332ad8ef Mon Sep 17 00:00:00 2001 From: Chelsey Ong Date: Sun, 10 Mar 2019 10:10:01 +0800 Subject: [PATCH 07/12] Update test cases --- .../BibtexKeyGeneratorTest.java | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index 4ed5b5bb728..6c2a319c798 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -119,73 +119,73 @@ public void testMakeLabelAndCheckLegalKeys() throws ParseException { Optional entry0 = BibtexParser.singleFromString( "@ARTICLE{kohn, author={Andreas Köning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Koen", + assertEquals("Koe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Áöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Aoen", + assertEquals("Aoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Éöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Eoen", + assertEquals("Eoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Íöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ioen", + assertEquals("Ioe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ĺöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Loen", + assertEquals("Loe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ńöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Noen", + assertEquals("Noe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Óöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ooen", + assertEquals("Ooe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ŕöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Roen", + assertEquals("Roe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Śöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Soen", + assertEquals("Soe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Úöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Uoen", + assertEquals("Uoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ýöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Yoen", + assertEquals("Yoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Źöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Zoen", + assertEquals("Zoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); } @@ -197,31 +197,43 @@ public void testMakeLabelAndCheckLegalKeys() throws ParseException { public void testMakeLabelAndCheckLegalKeysAccentGrave() throws ParseException { Optional entry0 = BibtexParser.singleFromString( "@ARTICLE{kohn, author={Andreas Àöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Aoen", + assertEquals("Aoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Èöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Eoen", + assertEquals("Eoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ìöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ioen", + assertEquals("Ioe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Òöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ooen", + assertEquals("Ooe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ùöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Uoen", + assertEquals("Uoe", + BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + new BibDatabase()), true)); + + entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Oraib Al-Ketan}, year={2000}}", + importFormatPreferences, fileMonitor); + assertEquals("AlK", + BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + new BibDatabase()), true)); + + entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andrés D'Alessandro}, year={2000}}", + importFormatPreferences, fileMonitor); + assertEquals("DAl", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); } From 89a398b5951659d11e81aa4ad9979deb0150ffc2 Mon Sep 17 00:00:00 2001 From: Chelsey Ong Date: Sun, 10 Mar 2019 10:10:30 +0800 Subject: [PATCH 08/12] Remove -s from key --- .../org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java index 35b4c5f6524..f1a7306b558 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java @@ -26,8 +26,8 @@ public class BibtexKeyGenerator extends BracketedPattern { */ public static final String APPENDIX_CHARACTERS = "abcdefghijklmnopqrstuvwxyz"; private static final Logger LOGGER = LoggerFactory.getLogger(BibtexKeyGenerator.class); - private static final String KEY_ILLEGAL_CHARACTERS = "{}(),\\\"#~^':`"; - private static final String KEY_UNWANTED_CHARACTERS = "{}(),\\\""; + private static final String KEY_ILLEGAL_CHARACTERS = "{}(),\\\"-#~^':`"; + private static final String KEY_UNWANTED_CHARACTERS = "{}(),\\\"-"; private final AbstractBibtexKeyPattern citeKeyPattern; private final BibDatabase database; private final BibtexKeyPatternPreferences bibtexKeyPatternPreferences; From e3e696113b1877d856abbcfbaf80ef04a0ca77b2 Mon Sep 17 00:00:00 2001 From: Chelsey Ong Date: Sun, 10 Mar 2019 10:36:33 +0800 Subject: [PATCH 09/12] Remove the dashes from test case --- .../logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java index a28d412bc35..88345234b72 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java @@ -397,7 +397,7 @@ void generateKeyTitleRegexe() { bibtexKeyPattern.setDefaultValue("[title:regex(\" \",\"-\")]"); entry.setField("title", "Please replace the spaces"); new BibtexKeyGenerator(bibtexKeyPattern, database, preferences).generateAndSetKey(entry); - assertEquals(Optional.of("Please-Replace-the-Spaces"), entry.getCiteKeyOptional()); + assertEquals(Optional.of("PleaseReplacetheSpaces"), entry.getCiteKeyOptional()); } @Test From f414a9643f519e12553328ef9c00fd51e15fb7dc Mon Sep 17 00:00:00 2001 From: Chelsey Ong Date: Sun, 10 Mar 2019 18:18:21 +0800 Subject: [PATCH 10/12] Rename method to removeUnwantedCharacters --- .../org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java | 4 ++-- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java index f1a7306b558..6e10ac5ff8f 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java @@ -72,7 +72,7 @@ private static String getAppendix(int number) { } } - public static String filterUnwantedCharacters(String key, boolean enforceLegalKey) { + public static String removeUnwantedCharacters(String key, boolean enforceLegalKey) { if (!enforceLegalKey) { // User doesn't want us to enforce legal characters. We must still look // for whitespace and some characters such as commas, since these would @@ -101,7 +101,7 @@ public static String filterUnwantedCharacters(String key, boolean enforceLegalKe } public static String cleanKey(String key, boolean enforceLegalKey) { - return filterUnwantedCharacters(key, enforceLegalKey).replaceAll("\\s",""); + return removeUnwantedCharacters(key, enforceLegalKey).replaceAll("\\s",""); } public String generateKey(BibEntry entry) { diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index c6a8d292ae5..25f214ab164 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -841,7 +841,7 @@ public static String authNofMth(String authorField, int n, int m) { * First N chars of the first author's last name. */ public static String authN(String authString, int num, boolean isEnforceLegalKey) { - authString = BibtexKeyGenerator.filterUnwantedCharacters(authString, isEnforceLegalKey); + authString = BibtexKeyGenerator.removeUnwantedCharacters(authString, isEnforceLegalKey); String fa = firstAuthor(authString); if (num > fa.length()) { num = fa.length(); From 26f7865c64132ce619a656781a2e03525728f57a Mon Sep 17 00:00:00 2001 From: Christoph Date: Sun, 10 Mar 2019 13:40:53 +0100 Subject: [PATCH 11/12] Revert "Fix: bibkey generated does not handle diacritics" (#4741) --- .../bibtexkeypattern/BibtexKeyGenerator.java | 16 +++---- .../bibtexkeypattern/BracketedPattern.java | 33 +++++-------- .../BibtexKeyGeneratorTest.java | 46 +++++++------------ .../MakeLabelWithDatabaseTest.java | 2 +- 4 files changed, 36 insertions(+), 61 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java index 6e10ac5ff8f..ff61a9035da 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java @@ -26,8 +26,8 @@ public class BibtexKeyGenerator extends BracketedPattern { */ public static final String APPENDIX_CHARACTERS = "abcdefghijklmnopqrstuvwxyz"; private static final Logger LOGGER = LoggerFactory.getLogger(BibtexKeyGenerator.class); - private static final String KEY_ILLEGAL_CHARACTERS = "{}(),\\\"-#~^':`"; - private static final String KEY_UNWANTED_CHARACTERS = "{}(),\\\"-"; + private static final String KEY_ILLEGAL_CHARACTERS = "{}(),\\\"#~^':`"; + private static final String KEY_UNWANTED_CHARACTERS = "{}(),\\\""; private final AbstractBibtexKeyPattern citeKeyPattern; private final BibDatabase database; private final BibtexKeyPatternPreferences bibtexKeyPatternPreferences; @@ -72,7 +72,7 @@ private static String getAppendix(int number) { } } - public static String removeUnwantedCharacters(String key, boolean enforceLegalKey) { + public static String cleanKey(String key, boolean enforceLegalKey) { if (!enforceLegalKey) { // User doesn't want us to enforce legal characters. We must still look // for whitespace and some characters such as commas, since these would @@ -80,7 +80,7 @@ public static String removeUnwantedCharacters(String key, boolean enforceLegalKe StringBuilder newKey = new StringBuilder(); for (int i = 0; i < key.length(); i++) { char c = key.charAt(i); - if (KEY_UNWANTED_CHARACTERS.indexOf(c) == -1) { + if (!Character.isWhitespace(c) && (KEY_UNWANTED_CHARACTERS.indexOf(c) == -1)) { newKey.append(c); } } @@ -90,7 +90,7 @@ public static String removeUnwantedCharacters(String key, boolean enforceLegalKe StringBuilder newKey = new StringBuilder(); for (int i = 0; i < key.length(); i++) { char c = key.charAt(i); - if (KEY_ILLEGAL_CHARACTERS.indexOf(c) == -1) { + if (!Character.isWhitespace(c) && (KEY_ILLEGAL_CHARACTERS.indexOf(c) == -1)) { newKey.append(c); } } @@ -100,10 +100,6 @@ public static String removeUnwantedCharacters(String key, boolean enforceLegalKe return StringUtil.replaceSpecialCharacters(newKey.toString()); } - public static String cleanKey(String key, boolean enforceLegalKey) { - return removeUnwantedCharacters(key, enforceLegalKey).replaceAll("\\s",""); - } - public String generateKey(BibEntry entry) { String key; StringBuilder stringBuilder = new StringBuilder(); @@ -127,7 +123,7 @@ public String generateKey(BibEntry entry) { List parts = parseFieldMarker(typeListEntry); Character delimiter = bibtexKeyPatternPreferences.getKeywordDelimiter(); String pattern = "[" + parts.get(0) + "]"; - String label = expandBrackets(pattern, delimiter, entry, database, bibtexKeyPatternPreferences.isEnforceLegalKey()); + String label = expandBrackets(pattern, delimiter, entry, database); // apply modifier if present if (parts.size() > 1) { label = applyModifiers(label, parts, 1); diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 25f214ab164..f88e98b3842 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -92,10 +92,6 @@ public String expand(BibEntry bibentry, Character keywordDelimiter, BibDatabase return expandBrackets(this.pattern, keywordDelimiter, bibentry, database); } - public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database) { - return expandBrackets(pattern, keywordDelimiter, entry, database, false); - } - /** * Expands a pattern * @@ -105,7 +101,7 @@ public static String expandBrackets(String pattern, Character keywordDelimiter, * @param database The database for field resolving. May be null. * @return The expanded pattern. Not null. */ - public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database, boolean isEnforceLegalKey) { + public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database) { Objects.requireNonNull(pattern); Objects.requireNonNull(entry); StringBuilder sb = new StringBuilder(); @@ -126,10 +122,10 @@ public static String expandBrackets(String pattern, Character keywordDelimiter, // check whether there is a modifier on the end such as // ":lower": if (fieldParts.size() <= 1) { - sb.append(getFieldValue(entry, token, keywordDelimiter, database, isEnforceLegalKey)); + sb.append(getFieldValue(entry, token, keywordDelimiter, database)); } else { // apply modifiers: - String fieldValue = getFieldValue(entry, fieldParts.get(0), keywordDelimiter, database, isEnforceLegalKey); + String fieldValue = getFieldValue(entry, fieldParts.get(0), keywordDelimiter, database); sb.append(applyModifiers(fieldValue, fieldParts, 1)); } // Fetch and discard the closing ']' @@ -160,7 +156,7 @@ public static String expandBrackets(String pattern, Character keywordDelimiter, * * @return String containing the evaluation result. Empty string if the pattern cannot be resolved. */ - public static String getFieldValue(BibEntry entry, String value, Character keywordDelimiter, BibDatabase database, boolean isEnforceLegalKey) { + public static String getFieldValue(BibEntry entry, String value, Character keywordDelimiter, BibDatabase database) { String val = value; try { @@ -228,8 +224,15 @@ else if ("authorLast".equals(val)) { return authNofMth(authString, Integer.parseInt(nums[0]), Integer.parseInt(nums[1])); } else if (val.matches("auth\\d+")) { + // authN. First N chars of the first author's last + // name. + + String fa = firstAuthor(authString); int num = Integer.parseInt(val.substring(4)); - return authN(authString, num, isEnforceLegalKey); + if (num > fa.length()) { + num = fa.length(); + } + return fa.substring(0, num); } else if (val.matches("authors\\d+")) { return nAuthors(authString, Integer.parseInt(val.substring(7))); } else { @@ -837,18 +840,6 @@ public static String authNofMth(String authorField, int n, int m) { } } - /** - * First N chars of the first author's last name. - */ - public static String authN(String authString, int num, boolean isEnforceLegalKey) { - authString = BibtexKeyGenerator.removeUnwantedCharacters(authString, isEnforceLegalKey); - String fa = firstAuthor(authString); - if (num > fa.length()) { - num = fa.length(); - } - return fa.substring(0, num); - } - /** * authshort format: * added by Kolja Brix, kbx@users.sourceforge.net diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index 3857cfb6c8b..f09b091fb7e 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -119,73 +119,73 @@ public void testMakeLabelAndCheckLegalKeys() throws ParseException { Optional entry0 = BibtexParser.singleFromString( "@ARTICLE{kohn, author={Andreas Köning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Koe", + assertEquals("Koen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Áöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Aoe", + assertEquals("Aoen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Éöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Eoe", + assertEquals("Eoen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Íöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ioe", + assertEquals("Ioen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ĺöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Loe", + assertEquals("Loen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ńöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Noe", + assertEquals("Noen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Óöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ooe", + assertEquals("Ooen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ŕöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Roe", + assertEquals("Roen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Śöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Soe", + assertEquals("Soen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Úöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Uoe", + assertEquals("Uoen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ýöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Yoe", + assertEquals("Yoen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Źöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Zoe", + assertEquals("Zoen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); } @@ -197,43 +197,31 @@ public void testMakeLabelAndCheckLegalKeys() throws ParseException { public void testMakeLabelAndCheckLegalKeysAccentGrave() throws ParseException { Optional entry0 = BibtexParser.singleFromString( "@ARTICLE{kohn, author={Andreas Àöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Aoe", + assertEquals("Aoen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Èöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Eoe", + assertEquals("Eoen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ìöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ioe", + assertEquals("Ioen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Òöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ooe", + assertEquals("Ooen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ùöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Uoe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", - new BibDatabase()), true)); - - entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Oraib Al-Ketan}, year={2000}}", - importFormatPreferences, fileMonitor); - assertEquals("AlK", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", - new BibDatabase()), true)); - - entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andrés D'Alessandro}, year={2000}}", - importFormatPreferences, fileMonitor); - assertEquals("DAl", + assertEquals("Uoen", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); } diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java index 88345234b72..a28d412bc35 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java @@ -397,7 +397,7 @@ void generateKeyTitleRegexe() { bibtexKeyPattern.setDefaultValue("[title:regex(\" \",\"-\")]"); entry.setField("title", "Please replace the spaces"); new BibtexKeyGenerator(bibtexKeyPattern, database, preferences).generateAndSetKey(entry); - assertEquals(Optional.of("PleaseReplacetheSpaces"), entry.getCiteKeyOptional()); + assertEquals(Optional.of("Please-Replace-the-Spaces"), entry.getCiteKeyOptional()); } @Test From fac6e625dba9182d3fd78e66380b307e3406eab5 Mon Sep 17 00:00:00 2001 From: Christoph Date: Sun, 10 Mar 2019 13:46:55 +0100 Subject: [PATCH 12/12] Revert "Revert "Fix: bibkey generated does not handle diacritics" (#4741)" (#4742) This reverts commit 26f7865c64132ce619a656781a2e03525728f57a. --- .../bibtexkeypattern/BibtexKeyGenerator.java | 16 ++++--- .../bibtexkeypattern/BracketedPattern.java | 33 ++++++++----- .../BibtexKeyGeneratorTest.java | 46 ++++++++++++------- .../MakeLabelWithDatabaseTest.java | 2 +- 4 files changed, 61 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java index ff61a9035da..6e10ac5ff8f 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGenerator.java @@ -26,8 +26,8 @@ public class BibtexKeyGenerator extends BracketedPattern { */ public static final String APPENDIX_CHARACTERS = "abcdefghijklmnopqrstuvwxyz"; private static final Logger LOGGER = LoggerFactory.getLogger(BibtexKeyGenerator.class); - private static final String KEY_ILLEGAL_CHARACTERS = "{}(),\\\"#~^':`"; - private static final String KEY_UNWANTED_CHARACTERS = "{}(),\\\""; + private static final String KEY_ILLEGAL_CHARACTERS = "{}(),\\\"-#~^':`"; + private static final String KEY_UNWANTED_CHARACTERS = "{}(),\\\"-"; private final AbstractBibtexKeyPattern citeKeyPattern; private final BibDatabase database; private final BibtexKeyPatternPreferences bibtexKeyPatternPreferences; @@ -72,7 +72,7 @@ private static String getAppendix(int number) { } } - public static String cleanKey(String key, boolean enforceLegalKey) { + public static String removeUnwantedCharacters(String key, boolean enforceLegalKey) { if (!enforceLegalKey) { // User doesn't want us to enforce legal characters. We must still look // for whitespace and some characters such as commas, since these would @@ -80,7 +80,7 @@ public static String cleanKey(String key, boolean enforceLegalKey) { StringBuilder newKey = new StringBuilder(); for (int i = 0; i < key.length(); i++) { char c = key.charAt(i); - if (!Character.isWhitespace(c) && (KEY_UNWANTED_CHARACTERS.indexOf(c) == -1)) { + if (KEY_UNWANTED_CHARACTERS.indexOf(c) == -1) { newKey.append(c); } } @@ -90,7 +90,7 @@ public static String cleanKey(String key, boolean enforceLegalKey) { StringBuilder newKey = new StringBuilder(); for (int i = 0; i < key.length(); i++) { char c = key.charAt(i); - if (!Character.isWhitespace(c) && (KEY_ILLEGAL_CHARACTERS.indexOf(c) == -1)) { + if (KEY_ILLEGAL_CHARACTERS.indexOf(c) == -1) { newKey.append(c); } } @@ -100,6 +100,10 @@ public static String cleanKey(String key, boolean enforceLegalKey) { return StringUtil.replaceSpecialCharacters(newKey.toString()); } + public static String cleanKey(String key, boolean enforceLegalKey) { + return removeUnwantedCharacters(key, enforceLegalKey).replaceAll("\\s",""); + } + public String generateKey(BibEntry entry) { String key; StringBuilder stringBuilder = new StringBuilder(); @@ -123,7 +127,7 @@ public String generateKey(BibEntry entry) { List parts = parseFieldMarker(typeListEntry); Character delimiter = bibtexKeyPatternPreferences.getKeywordDelimiter(); String pattern = "[" + parts.get(0) + "]"; - String label = expandBrackets(pattern, delimiter, entry, database); + String label = expandBrackets(pattern, delimiter, entry, database, bibtexKeyPatternPreferences.isEnforceLegalKey()); // apply modifier if present if (parts.size() > 1) { label = applyModifiers(label, parts, 1); diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index f88e98b3842..25f214ab164 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -92,6 +92,10 @@ public String expand(BibEntry bibentry, Character keywordDelimiter, BibDatabase return expandBrackets(this.pattern, keywordDelimiter, bibentry, database); } + public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database) { + return expandBrackets(pattern, keywordDelimiter, entry, database, false); + } + /** * Expands a pattern * @@ -101,7 +105,7 @@ public String expand(BibEntry bibentry, Character keywordDelimiter, BibDatabase * @param database The database for field resolving. May be null. * @return The expanded pattern. Not null. */ - public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database) { + public static String expandBrackets(String pattern, Character keywordDelimiter, BibEntry entry, BibDatabase database, boolean isEnforceLegalKey) { Objects.requireNonNull(pattern); Objects.requireNonNull(entry); StringBuilder sb = new StringBuilder(); @@ -122,10 +126,10 @@ public static String expandBrackets(String pattern, Character keywordDelimiter, // check whether there is a modifier on the end such as // ":lower": if (fieldParts.size() <= 1) { - sb.append(getFieldValue(entry, token, keywordDelimiter, database)); + sb.append(getFieldValue(entry, token, keywordDelimiter, database, isEnforceLegalKey)); } else { // apply modifiers: - String fieldValue = getFieldValue(entry, fieldParts.get(0), keywordDelimiter, database); + String fieldValue = getFieldValue(entry, fieldParts.get(0), keywordDelimiter, database, isEnforceLegalKey); sb.append(applyModifiers(fieldValue, fieldParts, 1)); } // Fetch and discard the closing ']' @@ -156,7 +160,7 @@ public static String expandBrackets(String pattern, Character keywordDelimiter, * * @return String containing the evaluation result. Empty string if the pattern cannot be resolved. */ - public static String getFieldValue(BibEntry entry, String value, Character keywordDelimiter, BibDatabase database) { + public static String getFieldValue(BibEntry entry, String value, Character keywordDelimiter, BibDatabase database, boolean isEnforceLegalKey) { String val = value; try { @@ -224,15 +228,8 @@ else if ("authorLast".equals(val)) { return authNofMth(authString, Integer.parseInt(nums[0]), Integer.parseInt(nums[1])); } else if (val.matches("auth\\d+")) { - // authN. First N chars of the first author's last - // name. - - String fa = firstAuthor(authString); int num = Integer.parseInt(val.substring(4)); - if (num > fa.length()) { - num = fa.length(); - } - return fa.substring(0, num); + return authN(authString, num, isEnforceLegalKey); } else if (val.matches("authors\\d+")) { return nAuthors(authString, Integer.parseInt(val.substring(7))); } else { @@ -840,6 +837,18 @@ public static String authNofMth(String authorField, int n, int m) { } } + /** + * First N chars of the first author's last name. + */ + public static String authN(String authString, int num, boolean isEnforceLegalKey) { + authString = BibtexKeyGenerator.removeUnwantedCharacters(authString, isEnforceLegalKey); + String fa = firstAuthor(authString); + if (num > fa.length()) { + num = fa.length(); + } + return fa.substring(0, num); + } + /** * authshort format: * added by Kolja Brix, kbx@users.sourceforge.net diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index f09b091fb7e..3857cfb6c8b 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -119,73 +119,73 @@ public void testMakeLabelAndCheckLegalKeys() throws ParseException { Optional entry0 = BibtexParser.singleFromString( "@ARTICLE{kohn, author={Andreas Köning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Koen", + assertEquals("Koe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Áöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Aoen", + assertEquals("Aoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Éöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Eoen", + assertEquals("Eoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Íöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ioen", + assertEquals("Ioe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ĺöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Loen", + assertEquals("Loe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ńöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Noen", + assertEquals("Noe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Óöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ooen", + assertEquals("Ooe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ŕöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Roen", + assertEquals("Roe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Śöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Soen", + assertEquals("Soe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Úöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Uoen", + assertEquals("Uoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ýöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Yoen", + assertEquals("Yoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Źöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Zoen", + assertEquals("Zoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); } @@ -197,31 +197,43 @@ public void testMakeLabelAndCheckLegalKeys() throws ParseException { public void testMakeLabelAndCheckLegalKeysAccentGrave() throws ParseException { Optional entry0 = BibtexParser.singleFromString( "@ARTICLE{kohn, author={Andreas Àöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Aoen", + assertEquals("Aoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Èöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Eoen", + assertEquals("Eoe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ìöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ioen", + assertEquals("Ioe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Òöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Ooen", + assertEquals("Ooe", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ùöning}, year={2000}}", importFormatPreferences, fileMonitor); - assertEquals("Uoen", + assertEquals("Uoe", + BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + new BibDatabase()), true)); + + entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Oraib Al-Ketan}, year={2000}}", + importFormatPreferences, fileMonitor); + assertEquals("AlK", + BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + new BibDatabase()), true)); + + entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andrés D'Alessandro}, year={2000}}", + importFormatPreferences, fileMonitor); + assertEquals("DAl", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", new BibDatabase()), true)); } diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java index a28d412bc35..88345234b72 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/MakeLabelWithDatabaseTest.java @@ -397,7 +397,7 @@ void generateKeyTitleRegexe() { bibtexKeyPattern.setDefaultValue("[title:regex(\" \",\"-\")]"); entry.setField("title", "Please replace the spaces"); new BibtexKeyGenerator(bibtexKeyPattern, database, preferences).generateAndSetKey(entry); - assertEquals(Optional.of("Please-Replace-the-Spaces"), entry.getCiteKeyOptional()); + assertEquals(Optional.of("PleaseReplacetheSpaces"), entry.getCiteKeyOptional()); } @Test