/* * 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.frame.FrameDemo.BUSY_CHECKBOX; import static com.sun.swingset3.demos.frame.FrameDemo.CONTENT_LABEL; import static com.sun.swingset3.demos.frame.FrameDemo.CONTENT_LABEL_COLOR; import static com.sun.swingset3.demos.frame.FrameDemo.CONTENT_LABEL_SIZE; import static com.sun.swingset3.demos.frame.FrameDemo.DEMO_TITLE; import static com.sun.swingset3.demos.frame.FrameDemo.INTERNAL_FRAME; import static com.sun.swingset3.demos.frame.FrameDemo.MENU; import static com.sun.swingset3.demos.frame.FrameDemo.MENU_ITEM1; import static com.sun.swingset3.demos.frame.FrameDemo.MENU_ITEM2; import static com.sun.swingset3.demos.frame.FrameDemo.SHOW_BUTTON; import static com.sun.swingset3.demos.frame.FrameDemo.STATUS_LABEL; import static com.sun.swingset3.demos.frame.FrameDemo.STATUS_LABEL_BORDER; import static com.sun.swingset3.demos.frame.FrameDemo.STATUS_LABEL_HOR_ALIGNMENT; import static com.sun.swingset3.demos.frame.FrameDemo.TOOLBAR_BUTTON; import static org.jemmy2ext.JemmyExt.EXACT_STRING_COMPARATOR; import static org.testng.AssertJUnit.assertEquals; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Frame; import java.awt.Point; import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.UIManager; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; import org.jtregext.GuiTestListener; import org.netbeans.jemmy.ClassReference; import org.netbeans.jemmy.ComponentChooser; import org.netbeans.jemmy.WindowWaiter; import org.netbeans.jemmy.operators.ComponentOperator; import org.netbeans.jemmy.operators.FrameOperator; import org.netbeans.jemmy.operators.JButtonOperator; import org.netbeans.jemmy.operators.JCheckBoxOperator; import org.netbeans.jemmy.operators.JFrameOperator; import org.netbeans.jemmy.operators.JLabelOperator; import org.netbeans.jemmy.operators.JMenuBarOperator; import org.netbeans.jemmy.operators.JMenuItemOperator; import org.netbeans.jemmy.operators.JMenuOperator; import org.testng.annotations.Listeners; import org.testng.annotations.Test; import com.sun.swingset3.demos.frame.FrameDemo; /* * @test * @key headful * @summary Verifies SwingSet3 FrameDemo page by checking the different actions * on the frame, properties and different actions on subcomponents of frame * and control panel actions by checking and unchecking the busy check box and * pressing the show button. * * @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.frame.FrameDemo * @run testng/timeout=600 FrameDemoTest */ @Listeners(GuiTestListener.class) public class FrameDemoTest { private final static Dimension NEW_SIZE = new Dimension(500, 500); private final static Point NEW_LOCATION = new Point(200, 200); private final static int NUMBER_OF_MENUS = 1; private final static int NUMBER_OF_MENU_ITEMS = 2; private final static int MAX_NUMBER_OF_FRAMES = 1; private final static int DELAY_AFTER_SHOW_BUTTON_PRESS = 500; /** * Testing the different actions on the frame, properties and different * actions on subcomponents of the frame and control panel action by * checking and unchecking the busy check box and pressing the show button. * * @throws Exception */ @Test(dataProvider = "availableLookAndFeels", dataProviderClass = TestHelpers.class) public void test(String lookAndFeel) throws Exception { UIManager.setLookAndFeel(lookAndFeel); new ClassReference(FrameDemo.class.getCanonicalName()).startApplication(); JFrameOperator masterFrameOperator = new JFrameOperator(DEMO_TITLE); masterFrameOperator.setComparator(EXACT_STRING_COMPARATOR); JFrameOperator internalFrameOperator = new JFrameOperator(INTERNAL_FRAME); internalFrameOperator.setComparator(EXACT_STRING_COMPARATOR); internalFrameOperator.setVerification(true); internalFrameOperator.waitComponentVisible(true); checkSubComponents(internalFrameOperator); checkFrameActions(internalFrameOperator); checkControlPanelActions(masterFrameOperator, internalFrameOperator); } /** * Verifying the status of added components to the frame * @param internalFrameOperator */ private void checkSubComponents(JFrameOperator internalFrameOperator) { // Verifying the properties of added button to the frame JButtonOperator buttonOperator = new JButtonOperator(internalFrameOperator, TOOLBAR_BUTTON); AtomicBoolean buttonActionStatus = new AtomicBoolean(false); buttonOperator.addActionListener(event -> buttonActionStatus.set(true)); buttonOperator.push(); buttonOperator.waitStateOnQueue(comp -> buttonActionStatus.get()); // Verifying the properties of added labels to the frame JLabelOperator contentLabelOperator = new JLabelOperator(internalFrameOperator, CONTENT_LABEL); contentLabelOperator.waitStateOnQueue(comp -> CONTENT_LABEL_SIZE.equals(comp.getSize())); contentLabelOperator.waitStateOnQueue(comp -> CONTENT_LABEL_COLOR.equals(comp.getBackground())); JLabelOperator statusLabelOperator = new JLabelOperator(internalFrameOperator, STATUS_LABEL); statusLabelOperator.waitStateOnQueue(comp -> STATUS_LABEL_BORDER.equals(((JLabel)comp).getBorder())); statusLabelOperator.waitStateOnQueue((component) -> STATUS_LABEL_HOR_ALIGNMENT == ((JLabel)component).getHorizontalAlignment()); // Verifying the properties of added menu to the frame JMenuBarOperator menuBarOperator = new JMenuBarOperator(internalFrameOperator); menuBarOperator.waitStateOnQueue(comp -> NUMBER_OF_MENUS == ((JMenuBar)comp).getMenuCount()); JMenuOperator menuOperator = new JMenuOperator(internalFrameOperator, MENU); menuOperator.waitStateOnQueue(comp -> NUMBER_OF_MENU_ITEMS == ((JMenu)comp).getMenuComponentCount()); AtomicBoolean menuActionStatus = new AtomicBoolean(false); addMenuListener(menuOperator, menuActionStatus); menuOperator.push(); menuOperator.waitStateOnQueue(comp -> menuActionStatus.get()); // Verifying the properties of the menu items checkMenuItem((JMenuItem) menuOperator.getMenuComponent(0), MENU_ITEM1); checkMenuItem((JMenuItem) menuOperator.getMenuComponent(1), MENU_ITEM2); } /** * Verifying different actions on the frame * @param internalFrameOperator */ private void checkFrameActions(JFrameOperator internalFrameOperator) throws InterruptedException { // Verifying the maximized status internalFrameOperator.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(); internalFrameOperator.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(); // Verifying the iconified status internalFrameOperator.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(); internalFrameOperator.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(); // Verifying the resize of the frame TestHelpers.checkChangeSize(internalFrameOperator, NEW_SIZE); // Verifying the change of location of the frame TestHelpers.checkChangeLocation(internalFrameOperator, NEW_LOCATION); } /** * Verifying control panel actions on the frame * @param masterFrameOprator * @param internalFrameOperator * @throws InterruptedException */ private void checkControlPanelActions(JFrameOperator masterFrameOprator, JFrameOperator internalFrameOperator) throws InterruptedException { // Verifying the visibility and number of frames after pressing Show Button internalFrameOperator.requestClose(); internalFrameOperator.waitClosed(); JButtonOperator showButtonOperator = new JButtonOperator(masterFrameOprator, SHOW_BUTTON); showButtonOperator.push(); internalFrameOperator.waitComponentVisible(true); showButtonOperator.push(); showButtonOperator.push(); Thread.sleep(DELAY_AFTER_SHOW_BUTTON_PRESS); int count = WindowWaiter.countWindows(masterFrameOprator.getOwner(), new FrameOperator.FrameFinder(new ComponentChooser() { @Override public String getDescription() { return "frames with name != " + DEMO_TITLE; } @Override public boolean checkComponent(Component comp) { return comp.isShowing() && ((Frame) comp).getTitle() != DEMO_TITLE; } })); assertEquals("Number of frames after clicking Show Button two times" + " validation failed,", MAX_NUMBER_OF_FRAMES, count); // Verifying the visibility and cursor type after selecting busy check box JCheckBoxOperator busyCheckBoxOperator = new JCheckBoxOperator(masterFrameOprator, BUSY_CHECKBOX); busyCheckBoxOperator.setVerification(true); checkBusyCheckBox(internalFrameOperator, busyCheckBoxOperator, true); internalFrameOperator.waitStateOnQueue(comp -> Cursor.WAIT_CURSOR == internalFrameOperator.getGlassPane().getCursor().getType()); checkBusyCheckBox(internalFrameOperator, busyCheckBoxOperator, false); internalFrameOperator.waitStateOnQueue(comp -> Cursor.DEFAULT_CURSOR == internalFrameOperator.getCursor().getType()); } private void checkBusyCheckBox(JFrameOperator internalFrameOperator, JCheckBoxOperator busyCheckBoxOperator, boolean isSelect) { busyCheckBoxOperator.changeSelection(isSelect); new ComponentOperator(internalFrameOperator. getGlassPane()).waitComponentVisible(isSelect); } /** * Verifying the properties of the menu item * @param menuItem : menu item component * @param menuExpectedName : expected menu item name/text */ private void checkMenuItem(JMenuItem menuItem, String menuExpectedName) { JMenuItemOperator menuItemOperator = new JMenuItemOperator(menuItem); AtomicBoolean menuItemActionStatus = new AtomicBoolean(false); menuItemOperator.addActionListener(event -> menuItemActionStatus.set(true)); menuItemOperator.waitStateOnQueue((component) -> menuExpectedName.equals(((JMenuItem)component).getText())); menuItemOperator.push(); menuItemOperator.waitStateOnQueue(comp -> menuItemActionStatus.get()); } /** * Add menu listener to the operator * @param menuOperator : JMenuOperator on which menu listener has to be added * @param menuActionStatus : menu action status variable */ private void addMenuListener(JMenuOperator menuOperator, AtomicBoolean menuActionStatus) { menuOperator.addMenuListener(new MenuListener() { @Override public void menuSelected(MenuEvent e) { menuActionStatus.set(true); } @Override public void menuDeselected(MenuEvent e) { } @Override public void menuCanceled(MenuEvent e) { } }); } }