blob: 4462bf2e12dfd5badec1f8052a8186f5200702e7 [file] [log] [blame]
/*
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import org.jtregext.GuiTestListener;
import com.sun.swingset3.demos.filechooser.FileChooserDemo;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.APPLY_FILTER_TOOLTIP;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.DEMO_TITLE;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.FILE_CHOOSER_DEMO_CANCEL_TEXT;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.FILE_CHOOSER_DEMO_SAVEQUESTION_TITLE;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.FILE_CHOOSER_DEMO_SAVE_TEXT;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.FILE_CHOOSER_DEMO_SELECT_TEXT;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.FILE_CHOOSER_DEMO_SELECT_WITH_PREVIEW;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.FLIP_HORIZONTAL_TOOLTIP;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.FLIP_VERTICAL_TOOLTIP;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.GRAY;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.ROTATE_LEFT_TOOLTIP;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.ROTATE_RIGHT_TOOLTIP;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.getFlipHorizontalCount;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.getFlipVerticalCount;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.getLastAppliedFilterId;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.getRotateLeftCount;
import static com.sun.swingset3.demos.filechooser.FileChooserDemo.getRotateRightCount;
import java.awt.Container;
import java.awt.event.KeyEvent;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.testng.annotations.Test;
import javax.swing.UIManager;
import org.netbeans.jemmy.ClassReference;
import org.netbeans.jemmy.operators.JFrameOperator;
import org.netbeans.jemmy.operators.JPopupMenuOperator;
import org.netbeans.jemmy.operators.JRadioButtonMenuItemOperator;
import org.netbeans.jemmy.operators.JButtonOperator;
import org.netbeans.jemmy.operators.JComboBoxOperator;
import org.netbeans.jemmy.operators.JToggleButtonOperator;
import org.netbeans.jemmy.operators.JFileChooserOperator;
import org.netbeans.jemmy.operators.JDialogOperator;
import org.netbeans.jemmy.operators.JComponentOperator.JComponentByTipFinder;
import org.netbeans.jemmy.util.Platform;
import org.netbeans.jemmy.util.LookAndFeel;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Listeners;
import org.jemmy2ext.JemmyExt.ByToolTipChooser;
/*
* @test
* @key headful
* @summary Verifies SwingSet3 FileChooserDemo by selecting an image file
* using Select Image and Select with preview, performing image
* transformation operations on the selected image and saving it.
*
* @library /sanity/client/lib/jemmy/src
* @library /sanity/client/lib/Extensions/src
* @library /sanity/client/lib/SwingSet3/src
* @modules java.desktop
* java.logging
* @build org.jemmy2ext.JemmyExt
* @build com.sun.swingset3.demos.filechooser.FileChooserDemo
* @run testng/timeout=600 FileChooserDemoTest
*/
@Listeners(GuiTestListener.class)
public class FileChooserDemoTest {
public static final Path TEST_SRC = Paths.get(System.getProperty("test.src"));
public static final Path TEST_WORK_DIR = Paths.get(System.getProperty("user.dir"));
public static final Path IMAGE_DIR = TEST_SRC.resolve("resources").resolve("images");
public static final String IMAGE = "duke.jpg";
private static final String YES = "Yes";
private static final String NO = "No";
private static final String OPEN = "Open";
private static final String OK = "OK";
private static final String CANCEL = "Cancel";
private static final String USER_HOME = "user.home";
private static final String DESKTOP = "Desktop";
private static final int greyFilterID = 7;
private JFrameOperator frame;
private JButtonOperator selectImageButton;
private JButtonOperator selectWithPreviewButton;
private JFileChooserOperator fileChooser;
private JButtonOperator upLevelButton;
private JButtonOperator rotateLeftButton;
private JButtonOperator rotateRightButton;
private JButtonOperator flipHorizontalButton;
private JButtonOperator flipVerticalButton;
private JButtonOperator applyFilterButton;
private JButtonOperator saveButton;
private JButtonOperator cancelButton;
private JButtonOperator yesButton;
private JButtonOperator noButton;
private JButtonOperator openButton;
private JComboBoxOperator filterComboBox;
private JDialogOperator confirmationDialog;
private JToggleButtonOperator getDetailsToggleButton;
private JToggleButtonOperator getListToggleButton;
private JDialogOperator fileChooserDialog;
@BeforeTest
public void beforeTest() throws Exception {
Files.copy(IMAGE_DIR.resolve(IMAGE), TEST_WORK_DIR.resolve(IMAGE));
}
@Test(dataProvider = "availableLookAndFeels", dataProviderClass = TestHelpers.class)
public void test(String lookAndFeel) throws Exception {
UIManager.setLookAndFeel(lookAndFeel);
new ClassReference(FileChooserDemo.class.getCanonicalName()).startApplication();
frame = new JFrameOperator(DEMO_TITLE);
initializeSelectImageButtons();
initializeImageOperationButtons();
checkSelectImage();
checkImageOperations();
checkSelectWithPreview();
checkImageOperations();
}
private void checkSelectImage() throws Exception {
selectImageButton.push();
fileChooser = new JFileChooserOperator(JFileChooserOperator.findJFileChooser((Container) frame.getSource()));
// In Aqua, GTK and Motif L&Fs, JFileChooser does not have
// "Go Home", "Up One Level", "Get Details", "Get List" buttons.
if (!LookAndFeel.isAqua() && !LookAndFeel.isMotif() && !LookAndFeel.isGTK()) {
File previousDirectory = fileChooser.getCurrentDirectory();
fileChooser.goHome();
// In Windows, pressing goHome navigates to Desktop inside the home directory.
// This is the expected behavior for windows.
if (!Platform.isWindows()) {
waitCurrentPath(Paths.get(System.getProperty(USER_HOME)));
} else {
waitCurrentPath(Paths.get(System.getProperty(USER_HOME)).resolve(DESKTOP));
}
fileChooser.setCurrentDirectory(previousDirectory);
fileChooser.rescanCurrentDirectory();
// In Windows and Windows Classic L&F, List and Details views are
// implemented as a popup menu item
if(LookAndFeel.isWindows() || LookAndFeel.isWindowsClassic()) {
JButtonOperator popupButton = new JButtonOperator(fileChooser, new JComponentByTipFinder(
UIManager.getString("FileChooser.viewMenuButtonToolTipText", fileChooser.getLocale())));
popupButton.push();
JPopupMenuOperator popup = new JPopupMenuOperator();
popup.pushKey(KeyEvent.VK_ENTER);
JRadioButtonMenuItemOperator detailsMenuItem = new JRadioButtonMenuItemOperator(popup, 1);
detailsMenuItem.push();
detailsMenuItem.waitSelected(true);
popupButton.push();
JRadioButtonMenuItemOperator listMenuItem = new JRadioButtonMenuItemOperator(popup);
listMenuItem.push();
listMenuItem.waitSelected(true);
} else {
initializeFileChooserButtons();
upLevelButton.push();
waitCurrentPath(previousDirectory.getParentFile().toPath());
fileChooser.setCurrentDirectory(previousDirectory);
fileChooser.rescanCurrentDirectory();
getDetailsToggleButton.push();
getDetailsToggleButton.waitSelected(true);
getListToggleButton.push();
getListToggleButton.waitSelected(true);
}
// Wait for the count of number of files to be 1
fileChooser.waitFileCount(1);
fileChooser.selectFile(IMAGE);
} else {
fileChooser.setCurrentDirectory(TEST_WORK_DIR.toFile());
fileChooser.selectFile(IMAGE);
}
selectImageButton.push();
applyFilterButton.waitComponentEnabled();
}
private void checkSelectWithPreview() {
selectWithPreviewButton.pushNoBlock();
initializeSelectWithPreviewDialog();
cancelButton.push();
fileChooserDialog.waitClosed();
selectWithPreviewButton.pushNoBlock();
initializeSelectWithPreviewDialog();
fileChooser.selectFile(IMAGE);
openButton.push();
fileChooserDialog.waitClosed();
}
private void checkImageOperations() throws Exception {
// Check Rotate Left Button
{
int initialValue = getRotateLeftCount();
// Push Button and wait for rotateLeftCount count to increment.
rotateLeftButton.push();
rotateLeftButton.waitState(button -> getRotateLeftCount() == initialValue + 1);
}
// Check Rotate Right Button
{
int initialValue = getRotateRightCount();
// Push Button and wait for rotateRightCount count to increment.
rotateRightButton.push();
rotateRightButton.waitState(button -> getRotateRightCount() == initialValue + 1);
}
// Check Apply Filter Button
filterComboBox.selectItem(GRAY);
applyFilterButton.push();
applyFilterButton.waitState(button -> getLastAppliedFilterId() == greyFilterID);
// Check Save and Yes Buttons
initializeSaveAndCancelButton();
saveButton.pushNoBlock();
//Wait for the dialog to show and initialize it
waitAndinitializeConfirmationDialog();
yesButton.push();
waitButtonDisabled(saveButton);
// Check Flip Vertical Button
{
int initialValue = getFlipVerticalCount();
// Push Button and wait for flipVerticalCount count to increment.
flipVerticalButton.push();
flipVerticalButton.waitState(button -> getFlipVerticalCount() == initialValue + 1);
}
// Check Save and No Buttons
saveButton.pushNoBlock();
//Wait for the dialog to show and initialize it
waitAndinitializeConfirmationDialog();
noButton.push();
confirmationDialog.waitClosed();
saveButton.waitComponentEnabled();
// Check Flip Horizontal Button
{
int initialValue = getFlipHorizontalCount();
// Push Button and wait for flipHorizontalCount count to increment.
flipHorizontalButton.push();
flipHorizontalButton.waitState(button -> getFlipHorizontalCount() == initialValue + 1);
}
// Check Cancel Button
cancelButton.push();
waitButtonDisabled(saveButton);
}
private void initializeFileChooserButtons() {
upLevelButton = new JButtonOperator(fileChooser.getUpLevelButton());
getDetailsToggleButton = new JToggleButtonOperator(fileChooser.getDetailsToggleButton());
getListToggleButton = new JToggleButtonOperator(fileChooser.getListToggleButton());
}
private void initializeSelectImageButtons() {
selectImageButton = new JButtonOperator(frame, FILE_CHOOSER_DEMO_SELECT_TEXT);
selectWithPreviewButton = new JButtonOperator(frame, FILE_CHOOSER_DEMO_SELECT_WITH_PREVIEW);
}
private void initializeSelectWithPreviewDialog() {
fileChooser = new JFileChooserOperator();
fileChooserDialog = new JDialogOperator(OPEN);
String openButtonText = OPEN;
// In GTK and Motif L&F, open button text is 'OK'
if (LookAndFeel.isMotif() || LookAndFeel.isGTK()) {
openButtonText = OK;
}
openButton = new JButtonOperator(fileChooser, openButtonText);
cancelButton = new JButtonOperator(fileChooser, CANCEL);
}
private void initializeImageOperationButtons() {
rotateLeftButton = new JButtonOperator(frame,
new ByToolTipChooser(ROTATE_LEFT_TOOLTIP));
rotateRightButton = new JButtonOperator(frame,
new ByToolTipChooser(ROTATE_RIGHT_TOOLTIP));
flipHorizontalButton = new JButtonOperator(frame,
new ByToolTipChooser(FLIP_HORIZONTAL_TOOLTIP));
flipVerticalButton = new JButtonOperator(frame,
new ByToolTipChooser(FLIP_VERTICAL_TOOLTIP));
applyFilterButton = new JButtonOperator(frame,
new ByToolTipChooser(APPLY_FILTER_TOOLTIP));
filterComboBox = new JComboBoxOperator(frame);
}
private void initializeSaveAndCancelButton() {
saveButton = new JButtonOperator(frame, FILE_CHOOSER_DEMO_SAVE_TEXT);
cancelButton = new JButtonOperator(frame, FILE_CHOOSER_DEMO_CANCEL_TEXT);
}
private void waitAndinitializeConfirmationDialog() {
//Wait for the dialog to show
JDialogOperator.waitJDialog(FILE_CHOOSER_DEMO_SAVEQUESTION_TITLE, true, true);
confirmationDialog = new JDialogOperator(FILE_CHOOSER_DEMO_SAVEQUESTION_TITLE);
yesButton = new JButtonOperator(confirmationDialog, YES);
noButton = new JButtonOperator(confirmationDialog, NO);
}
private void waitButtonDisabled(JButtonOperator button) {
button.waitState(b -> b.isEnabled() == false);
}
private void waitCurrentPath(Path expectedPath) {
//Wait for the current path to be same as expected path
fileChooser.waitState(chooser -> fileChooser.getCurrentDirectory().toPath().equals(expectedPath));
}
}