package org.jabref.gui;
import java.util.Arrays;
import java.util.Collection;
import javax.swing.JButton;
import javax.swing.JDialog;
import org.jabref.testutils.category.GUITests;
import org.assertj.swing.core.GenericTypeMatcher;
import org.assertj.swing.dependency.jsr305.Nonnull;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import static org.assertj.swing.finder.WindowFinder.findDialog;
@RunWith(Parameterized.class)
@Category(GUITests.class)
public class ParameterizedDialogTest extends AbstractUITest {
private final boolean createDatabase;
private final String[] menuPath;
private final String dialogTitle;
private final String buttonName;
private final boolean closeButton;
public ParameterizedDialogTest(boolean createDatabase, String[] menuPath, String dialogTitle, String buttonName,
boolean closeButton) {
this.createDatabase = createDatabase;
this.menuPath = menuPath;
this.dialogTitle = dialogTitle;
this.buttonName = buttonName;
this.closeButton = closeButton;
}
@Test
public void openAndExitDialog() {
if (createDatabase) {
newDatabase();
}
mainFrame.menuItemWithPath(menuPath).click();
GenericTypeMatcher<JDialog> matcher = new GenericTypeMatcher<JDialog>(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>(JButton.class) {
@Override
protected boolean isMatching(@Nonnull JButton jButton) {
return buttonName.equals(jButton.getText());
}
}).click();
}
if (createDatabase) {
closeDatabase();
}
exitJabRef();
}
@Parameterized.Parameters(name = "{index}: {1} -> {2} : {3}")
public static Collection<Object[]> 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 Arrays.asList(
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
}
}