ToggleButtonDemoTest.java revision 13978:1993af50385d
1/* 2 * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24import com.sun.swingset3.DemoProperties; 25import com.sun.swingset3.demos.togglebutton.DirectionPanel; 26import com.sun.swingset3.demos.togglebutton.LayoutControlPanel; 27import com.sun.swingset3.demos.togglebutton.ToggleButtonDemo; 28import static com.sun.swingset3.demos.togglebutton.ToggleButtonDemo.*; 29import java.util.function.BiFunction; 30import org.jemmy2ext.JemmyExt.ByClassChooser; 31import static org.jemmy2ext.JemmyExt.EXACT_STRING_COMPARATOR; 32import static org.jemmy2ext.JemmyExt.getBorderTitledJPanelOperator; 33import static org.jemmy2ext.JemmyExt.getLabeledContainerOperator; 34import static org.testng.AssertJUnit.*; 35import org.testng.annotations.Test; 36import org.netbeans.jemmy.ClassReference; 37import org.netbeans.jemmy.ComponentChooser; 38import org.netbeans.jemmy.operators.ContainerOperator; 39import org.netbeans.jemmy.operators.JCheckBoxOperator; 40import org.netbeans.jemmy.operators.JFrameOperator; 41import org.netbeans.jemmy.operators.JRadioButtonOperator; 42import org.netbeans.jemmy.operators.JTabbedPaneOperator; 43import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail; 44 45/* 46 * @test 47 * @key headful 48 * @summary Verifies SwingSet3 ToggleButtonDemo by toggling each radio button, 49 * each checkbox and each location of the direction dial toggle. 50 * It verifies initial selected values for all the elements and checks 51 * that those change upon clicking. When toggling radio buttons it 52 * verifies that other radio buttons in the same group are not longer 53 * selected. 54 * 55 * @library /sanity/client/lib/jemmy/src 56 * @library /sanity/client/lib/Jemmy2Ext/src 57 * @library /sanity/client/lib/SwingSet3/src 58 * @build org.jemmy2ext.JemmyExt 59 * @build com.sun.swingset3.demos.togglebutton.ToggleButtonDemo 60 * @run testng ToggleButtonDemoTest 61 */ 62public class ToggleButtonDemoTest { 63 64 @Test 65 public void test() throws Exception { 66 captureDebugInfoOnFail(() -> { 67 new ClassReference(ToggleButtonDemo.class.getCanonicalName()).startApplication(); 68 69 JFrameOperator mainFrame = new JFrameOperator(ToggleButtonDemo.class.getAnnotation(DemoProperties.class).value()); 70 JTabbedPaneOperator tabPane = new JTabbedPaneOperator(mainFrame); 71 72 // Radio Button Toggles 73 testRadioButtons(getBorderTitledJPanelOperator(mainFrame, TEXT_RADIO_BUTTONS), 3, null); 74 testRadioButtons(getBorderTitledJPanelOperator(mainFrame, IMAGE_RADIO_BUTTONS), 3, null); 75 testRadioButtons(getLabeledContainerOperator(mainFrame, PAD_AMOUNT), 3, (t, i) -> DEFAULT.equals(t)); 76 77 // switch to the Check Boxes Tab 78 tabPane.selectPage(CHECK_BOXES); 79 80 // Check Box Toggles 81 ContainerOperator<?> textCheckBoxesJPanel = getBorderTitledJPanelOperator(mainFrame, TEXT_CHECKBOXES); 82 testCheckBox(textCheckBoxesJPanel, CHECK1, false); 83 testCheckBox(textCheckBoxesJPanel, CHECK2, false); 84 testCheckBox(textCheckBoxesJPanel, CHECK3, false); 85 86 ContainerOperator<?> imageCheckBoxesJPanel = getBorderTitledJPanelOperator(mainFrame, IMAGE_CHECKBOXES); 87 testCheckBox(imageCheckBoxesJPanel, CHECK1, false); 88 testCheckBox(imageCheckBoxesJPanel, CHECK2, false); 89 testCheckBox(imageCheckBoxesJPanel, CHECK3, false); 90 91 ContainerOperator<?> displayOptionsContainer = getLabeledContainerOperator(mainFrame, DISPLAY_OPTIONS); 92 testCheckBox(displayOptionsContainer, PAINT_BORDER, false); 93 testCheckBox(displayOptionsContainer, PAINT_FOCUS, true); 94 testCheckBox(displayOptionsContainer, ENABLED, true); 95 testCheckBox(displayOptionsContainer, CONTENT_FILLED, true); 96 97 // Direction Button Toggles 98 testToggleButtons(mainFrame); 99 }); 100 } 101 102 /** 103 * The interface is invoked for each radio button providing its name and 104 * index and it should return whether the radio button has to be selected. 105 */ 106 private static interface SelectedRadioButton extends BiFunction<String, Integer, Boolean> { 107 } 108 109 /** 110 * Tests a group of radio buttons 111 * 112 * @param parent container containing the buttons 113 * @param radioButtonCount number of radio buttons 114 * @param selectedRadioButton initial selected radio button 115 */ 116 private void testRadioButtons(ContainerOperator<?> parent, int radioButtonCount, SelectedRadioButton selectedRadioButton) { 117 JRadioButtonOperator[] jrbo = new JRadioButtonOperator[radioButtonCount]; 118 for (int i = 0; i < radioButtonCount; i++) { 119 jrbo[i] = new JRadioButtonOperator(parent, i); 120 if (selectedRadioButton != null && selectedRadioButton.apply(jrbo[i].getText(), i)) { 121 assertTrue("Radio Button " + i + " is initially selected", jrbo[i].isSelected()); 122 } else { 123 assertFalse("Radio Button " + i + " is initially not selected", jrbo[i].isSelected()); 124 } 125 } 126 127 for (int i = 0; i < radioButtonCount; i++) { 128 jrbo[i].doClick(); 129 assertTrue("Radio Button " + i + " is selected", jrbo[i].isSelected()); 130 131 for (int j = 0; j < radioButtonCount; j++) { 132 if (i != j) { 133 assertFalse("Radio Button " + j + " is not selected", jrbo[j].isSelected()); 134 } 135 } 136 } 137 } 138 139 /** 140 * Will change the state of the CheckBox then change back to initial state. 141 * 142 * @param parent 143 * @param text 144 * @param expectedValue 145 * @throws Exception 146 */ 147 private void testCheckBox(ContainerOperator<?> parent, String text, boolean expectedValue) { 148 149 parent.setComparator(EXACT_STRING_COMPARATOR); 150 JCheckBoxOperator jcbo = new JCheckBoxOperator(parent, text); 151 assertEquals("Initial selection state of the checkbox '" + text + "'", expectedValue, jcbo.isSelected()); 152 153 // click check box (toggle the state) 154 jcbo.doClick(); 155 assertEquals("Selection state of the checkbox '" + text + "' after click", !expectedValue, jcbo.isSelected()); 156 if (jcbo.isSelected()) { 157 // toggle back to not-selected state 158 jcbo.doClick(); 159 assertFalse("Check Box '" + text + "' is not selected", jcbo.isSelected()); 160 } else { 161 // toggle back to selected state 162 jcbo.doClick(); 163 164 assertTrue("Check Box '" + text + "' is selected", jcbo.isSelected()); 165 } 166 } 167 168 169 /* 170 * testDirectionRadioButtons(JFrameOperator) will toggle each position of 171 * the direction radio button panels 172 */ 173 private void testToggleButtons(JFrameOperator jfo) { 174 ComponentChooser directionPanelChooser = new ByClassChooser(DirectionPanel.class); 175 176 String text_Position = LayoutControlPanel.TEXT_POSITION; 177 ContainerOperator<?> textPositionContainer = getLabeledContainerOperator(jfo, text_Position); 178 ContainerOperator<?> directionPanelOperator = new ContainerOperator<>(textPositionContainer, directionPanelChooser); 179 testRadioButtons(directionPanelOperator, 9, (t, i) -> i == 5); 180 181 // Unfortunately, both directionPanels are in the same parent container 182 // so we have to use indexes here. 183 // There is no guarantee that if the UI changes, the code would be still 184 // valid in terms of which directionPanel is checked first. However, it 185 // does guarantee that two different directionPanels are checked. 186 String content_Alignment = LayoutControlPanel.CONTENT_ALIGNMENT; 187 ContainerOperator<?> contentAlignmentContainer = getLabeledContainerOperator(jfo, content_Alignment); 188 ContainerOperator<?> directionPanelOperator2 = new ContainerOperator<>(contentAlignmentContainer, directionPanelChooser, 189 contentAlignmentContainer.getSource() == textPositionContainer.getSource() ? 1 : 0); 190 testRadioButtons(directionPanelOperator2, 9, (t, i) -> i == 4); 191 192 } 193 194} 195