/* * Copyright (c) 2018, 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 static com.sun.swingset3.demos.internalframe.InternalFrameDemo.CLOSABLE_LABEL; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.DEMO_TITLE; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.FRAME0_X; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.FRAME0_Y; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.FRAME_GAP; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.FRAME_HEIGHT; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.FRAME_WIDTH; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.ICONIFIABLE_LABEL; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.INTERNAL_FRAME_LABEL; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.MAXIMIZABLE_LABEL; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.PALETTE_HEIGHT; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.PALETTE_LABEL; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.PALETTE_WIDTH; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.PALETTE_X; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.PALETTE_Y; import static com.sun.swingset3.demos.internalframe.InternalFrameDemo.RESIZABLE_LABEL; import static org.jemmy2ext.JemmyExt.EXACT_STRING_COMPARATOR; import static org.testng.AssertJUnit.assertFalse; import java.awt.Dimension; import java.awt.Point; import javax.swing.JDesktopPane; import javax.swing.JInternalFrame; import javax.swing.UIManager; import org.jemmy2ext.JemmyExt; import org.jtregext.GuiTestListener; import org.netbeans.jemmy.ClassReference; import org.netbeans.jemmy.JemmyProperties; import org.netbeans.jemmy.operators.ComponentOperator; import org.netbeans.jemmy.operators.JButtonOperator; import org.netbeans.jemmy.operators.JCheckBoxOperator; import org.netbeans.jemmy.operators.JFrameOperator; import org.netbeans.jemmy.operators.JInternalFrameOperator; import org.netbeans.jemmy.operators.JTextFieldOperator; import org.testng.annotations.Listeners; import org.testng.annotations.Test; import com.sun.swingset3.demos.internalframe.InternalFrameDemo; /* * @test * @bug 8211703 * @key headful * @summary Verifies SwingSet3 InternalFrameDemo page by checking the different * actions on the parent frame, internal frame and creating internal frame * with different properties * * @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.internalframe.InternalFrameDemo * @run testng/timeout=600 InternalFrameDemoTest */ @Listeners(GuiTestListener.class) public class InternalFrameDemoTest { private final static int PARENT_FRAME_NEW_SIZE_DELTA = 300; private final static int PARENT_FRAME_NEW_LOCATION_DELTA = 200; private final static Dimension INTERNAL_FRAME_NEW_SIZE = new Dimension(400, 400); private final static Point INTERNAL_FRAME_NEW_LOCATION = new Point(390, 120); private final static int DELAY = 500; private final static String INTERNAL_FRAME_NEW_NAME = "New Internal Frame"; /** * Testing the different actions on the parent frame, internal frame and * creating internal frame with different properties * * @throws Exception */ @Test(dataProvider = "availableLookAndFeels", dataProviderClass = TestHelpers.class) public void test(String lookAndFeel) throws Exception { UIManager.setLookAndFeel(lookAndFeel); // initializing internal frame driver for each L&F JemmyProperties.setCurrentDispatchingModel( JemmyProperties.getCurrentDispatchingModel()); new ClassReference(InternalFrameDemo.class.getCanonicalName()).startApplication(); JFrameOperator frameOperator = new JFrameOperator(DEMO_TITLE); frameOperator.setComparator(EXACT_STRING_COMPARATOR); frameOperator.setVerification(true); // verifying internal frame primary properties JInternalFrameOperator internalFrameOperator = new JInternalFrameOperator( frameOperator, getInternalFrameName(INTERNAL_FRAME_LABEL, 0)); internalFrameOperator.setVerification(true); checkInternalFramePrimaryProps(internalFrameOperator, new Point(FRAME0_X, FRAME0_Y), new Dimension(FRAME_WIDTH, FRAME_HEIGHT)); // Verifying the internal frame properties after doing different // actions on parent frame checkParentFrameAction(frameOperator, internalFrameOperator); // Verifying different actions on the internal frame checkInternalFrameAction(internalFrameOperator); // Creating internal frames with different action properties // and verifying their properties checkPaletteFrameAction(frameOperator); } /** * Verifying the internal frame properties after doing different actions on * parent frame, it should not affect internal frame. * * @param parentFrameOperator : parent fame operator * @param internalFrameOperator : internal fame operator * @throws InterruptedException */ private void checkParentFrameAction(JFrameOperator parentFrameOperator, JInternalFrameOperator internalFrameOperator) throws InterruptedException { // Resizing the parent frame and verifying the size of the internal // frame(it should not be resized) Dimension orignalSize = parentFrameOperator.getSize(); Dimension newSize = new Dimension(orignalSize.width - PARENT_FRAME_NEW_SIZE_DELTA, orignalSize.height - PARENT_FRAME_NEW_SIZE_DELTA); parentFrameOperator.resize(newSize.width, newSize.height); parentFrameOperator.waitComponentSize(newSize); // TODO This is a workaround for JDK-8210638, this delay has to remove // after fixing this bug, this is an unstable code. TestHelpers.delayBetweenFrameStateChange(); // keeping some delay before checking the internal frame property // as it is a negative scenario Thread.sleep(DELAY); internalFrameOperator.waitComponentSize(new Dimension(FRAME_WIDTH, FRAME_HEIGHT)); // Resizing parent frame back to original size parentFrameOperator.resize(orignalSize.width, orignalSize.height); parentFrameOperator.waitComponentSize(orignalSize); // TODO This is a workaround for JDK-8210638, this delay has to remove // after fixing this bug, this is an unstable code. TestHelpers.delayBetweenFrameStateChange(); // Iconifying the parent frame and verifying the iconified status of the internal // frame(it should not be iconified) parentFrameOperator.iconify(); // TODO This is a workaround for JDK-8210638, this delay has to remove // after fixing this bug, this is an unstable code. TestHelpers.delayBetweenFrameStateChange(); // keeping some delay before checking the internal frame property // as it is a negative scenario Thread.sleep(DELAY); assertFalse("Internal Frame should not be iconified when parent frame" + " alone is iconified.", internalFrameOperator.isIcon()); parentFrameOperator.deiconify(); // TODO This is a workaround for JDK-8210638, this delay has to remove // after fixing this bug, this is an unstable code. TestHelpers.delayBetweenFrameStateChange(); // Maximizing the parent frame and verifying the maximized status of the internal // frame(it should not be maximized) parentFrameOperator.maximize(); // TODO This is a workaround for JDK-8210638, this delay has to remove // after fixing this bug, this is an unstable code. TestHelpers.delayBetweenFrameStateChange(); // keeping some delay before checking the internal frame property // as it is a negative scenario Thread.sleep(DELAY); assertFalse("Internal Frame should not be maximized when parent frame" + " alone is maximized.", internalFrameOperator.isMaximum()); parentFrameOperator.demaximize(); // TODO This is a workaround for JDK-8210638, this delay has to remove // after fixing this bug, this is an unstable code. TestHelpers.delayBetweenFrameStateChange(); // Relocating the parent frame and verifying the location of the internal // frame(it should not be changed the location) Point orignalLocation = parentFrameOperator.getLocation(); Point newLocation = new Point((orignalLocation.x - PARENT_FRAME_NEW_LOCATION_DELTA), (orignalLocation.y + PARENT_FRAME_NEW_LOCATION_DELTA)); parentFrameOperator.move(newLocation.x, newLocation.y); parentFrameOperator.waitComponentLocation(newLocation); // TODO This is a workaround for JDK-8210638, this delay has to remove // after fixing this bug, this is an unstable code. TestHelpers.delayBetweenFrameStateChange(); // keeping some delay before checking the internal frame property // as it is a negative scenario Thread.sleep(DELAY); internalFrameOperator.waitComponentLocation(new Point(FRAME0_X, FRAME0_Y)); // Moving back parent frame to original location parentFrameOperator.move(orignalLocation.x, orignalLocation.y); parentFrameOperator.waitComponentLocation(orignalLocation); // TODO This is a workaround for JDK-8210638, this delay has to remove // after fixing this bug, this is an unstable code. TestHelpers.delayBetweenFrameStateChange(); } /** * Verifying different actions on the internal frame. * * @param internalFrameOperator : internal fame operator * @throws InterruptedException */ private void checkInternalFrameAction(JInternalFrameOperator internalFrameOperator) throws InterruptedException { // Verifying maximize and demaximize actions internalFrameOperator.waitStateOnQueue(comp -> ((JInternalFrame)comp).isMaximizable()); internalFrameOperator.maximize(); internalFrameOperator.demaximize(); // Verifying iconify and deiconify actions internalFrameOperator.waitStateOnQueue(comp -> ((JInternalFrame)comp).isIconifiable()); internalFrameOperator.iconify(); internalFrameOperator.deiconify(); // Verifying resize action internalFrameOperator.waitStateOnQueue(comp -> ((JInternalFrame)comp).isResizable()); TestHelpers.checkChangeSize(internalFrameOperator, INTERNAL_FRAME_NEW_SIZE); // Verifying move action TestHelpers.checkChangeLocation(internalFrameOperator, INTERNAL_FRAME_NEW_LOCATION); // Verifying close action internalFrameOperator.waitStateOnQueue(comp -> ((JInternalFrame)comp).isClosable()); internalFrameOperator.close(); } /** * Creating internal frames with different action properties and verifying * their properties * * @param frameOperator : parent frame operator */ private void checkPaletteFrameAction(JFrameOperator frameOperator) { // Getting palette frame and checking the properties of it JInternalFrameOperator paletteFrameOperator = new JInternalFrameOperator(frameOperator, PALETTE_LABEL); paletteFrameOperator.setComparator(EXACT_STRING_COMPARATOR); checkInternalFramePrimaryProps(paletteFrameOperator, new Point(PALETTE_X, PALETTE_Y), new Dimension(PALETTE_WIDTH, PALETTE_HEIGHT)); // Getting all check boxes to set/reset frame properties JCheckBoxOperator closableOperator = new JCheckBoxOperator(paletteFrameOperator, CLOSABLE_LABEL); JCheckBoxOperator iconifiableOperator = new JCheckBoxOperator(paletteFrameOperator, ICONIFIABLE_LABEL); JCheckBoxOperator maximizableOperator = new JCheckBoxOperator(paletteFrameOperator, MAXIMIZABLE_LABEL); JCheckBoxOperator resizableOperator = new JCheckBoxOperator(paletteFrameOperator, RESIZABLE_LABEL); JCheckBoxOperator[] checkBoxes = {closableOperator, iconifiableOperator, maximizableOperator, resizableOperator}; // Verifying internal frame with all action properties set to false checkFrameProps(frameOperator, paletteFrameOperator, getInternalFrameName(INTERNAL_FRAME_LABEL, 1), 1, checkBoxes, false); // Verifying internal frame with all action properties set to true and setting title JTextFieldOperator frameTitle = new JTextFieldOperator(paletteFrameOperator); frameTitle.setText(INTERNAL_FRAME_NEW_NAME); checkFrameProps(frameOperator, paletteFrameOperator, getInternalFrameName(INTERNAL_FRAME_NEW_NAME), 2, checkBoxes, true); } /** * Verifying internal frame properties * * @param frameOperator : parent frame operator * @param paletteFrameOperator : palette frame operator * @param title : title of the internal frame * @param index : index of the internal frame * @param checkBoxes : array of check boxes * @param checkBoxStatus : status of check box */ private void checkFrameProps(JFrameOperator frameOperator, JInternalFrameOperator paletteFrameOperator, String title, int index, JCheckBoxOperator[] checkBoxes, boolean checkBoxStatus) { pushCheckBoxes(checkBoxes, checkBoxStatus); JButtonOperator button = new JButtonOperator(paletteFrameOperator, (index -1)); button.push(); JInternalFrameOperator internalFrameOperator = new JInternalFrameOperator(frameOperator, title); int gap = FRAME_GAP * index; checkInternalFramePrimaryProps(internalFrameOperator, new Point(FRAME0_X + gap, FRAME0_Y + gap), new Dimension(FRAME_WIDTH, FRAME_HEIGHT)); checkFrameActionProps(internalFrameOperator, checkBoxStatus); ComponentOperator desktopOperator = new ComponentOperator( frameOperator, new JemmyExt.ByClassChooser(JDesktopPane.class)); frameOperator.waitStateOnQueue(comp -> ((JDesktopPane)desktopOperator. getSource()).getAllFrames().length == index + 1); } /** * Verifying internal frame primary properties like showing status, location and size * @param internalFrameOperator * @param location * @param size */ private void checkInternalFramePrimaryProps(JInternalFrameOperator internalFrameOperator, Point location, Dimension size) { internalFrameOperator.waitComponentShowing(true); internalFrameOperator.waitComponentLocation(location); internalFrameOperator.waitComponentSize(size); } /** * Verifying internal frame action status * * @param internalFrameOperator : internal frame operator * @param propertyStatus : status to check */ private void checkFrameActionProps(JInternalFrameOperator internalFrameOperator, boolean propertyStatus) { internalFrameOperator.waitStateOnQueue(comp -> ((JInternalFrame)comp).isClosable() == propertyStatus); internalFrameOperator.waitStateOnQueue(comp -> ((JInternalFrame)comp).isIconifiable() == propertyStatus); internalFrameOperator.waitStateOnQueue(comp -> ((JInternalFrame)comp).isMaximizable() == propertyStatus); internalFrameOperator.waitStateOnQueue(comp -> ((JInternalFrame)comp).isResizable() == propertyStatus); } /** * To set/reset check boxes * * @param checkBoxes : array of check boxes * @param select : set/reset */ private void pushCheckBoxes(JCheckBoxOperator []checkBoxes, boolean select){ for (JCheckBoxOperator checkBox : checkBoxes) { checkBox.push(); checkBox.waitSelected(select); } } /** * Gets the internal frame name * @param frameLabel * @return */ private String getInternalFrameName(String frameLabel) { return (frameLabel+ " "); } /** * Gets the internal frame name * @param frameLabel * @param index * @return */ private String getInternalFrameName(String frameLabel, int index) { return getInternalFrameName(frameLabel+ " " + index); } }