/* * 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 Motif L&F, open button text is 'OK' if (LookAndFeel.isMotif()) { 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)); } }