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.jabref.testutils.category.GUITests;
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.Assert;
import org.junit.experimental.categories.Category;
import static org.assertj.swing.finder.WindowFinder.findFrame;
import static org.assertj.swing.launcher.ApplicationLauncher.application;
@Category(GUITests.class)
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(JabRefFrame.class).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) {
final URL resource = this.getClass().getClassLoader().getResource(relativePath);
try {
return Paths.get(resource.toURI()).toAbsolutePath().toString().replace("\\", "/");
} catch (URISyntaxException e) {
e.printStackTrace();
}
return null;
}
/**
* 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];
Assert.assertEquals(value, selectionValue);
}
}