ButtonDemoTest.java revision 13978:1993af50385d
1/*
2 * Copyright (c) 2011, 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.demos.JHyperlink;
25import com.sun.swingset3.demos.button.ButtonDemo;
26import java.util.concurrent.ArrayBlockingQueue;
27import java.util.concurrent.BlockingQueue;
28import javax.swing.ButtonModel;
29import javax.swing.JButton;
30import javax.swing.event.ChangeEvent;
31import static org.testng.AssertJUnit.*;
32import org.testng.annotations.Test;
33import org.jemmy2ext.JemmyExt.ByToolTipChooser;
34import static org.jemmy2ext.JemmyExt.EXACT_STRING_COMPARATOR;
35import org.netbeans.jemmy.ClassReference;
36import org.netbeans.jemmy.operators.JButtonOperator;
37import org.netbeans.jemmy.operators.JFrameOperator;
38import static com.sun.swingset3.demos.button.ButtonDemo.*;
39import org.jemmy2ext.JemmyExt;
40import org.jemmy2ext.JemmyExt.MultiThreadedTryCatch;
41import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail;
42
43/*
44 * @test
45 * @key headful
46 * @summary Verifies buttons on SwingSet3 ButtonDemo page by clicking each button
47 *          and checking model change events. It also verifies tooltips and text
48 *          on buttons before and after click.
49 *
50 * @library /sanity/client/lib/jemmy/src
51 * @library /sanity/client/lib/Jemmy2Ext/src
52 * @library /sanity/client/lib/SwingSet3/src
53 * @build org.jemmy2ext.JemmyExt
54 * @build com.sun.swingset3.demos.button.ButtonDemo
55 * @run testng ButtonDemoTest
56 */
57public class ButtonDemoTest {
58
59    private static final String[] BUTTON_TEXT_AFTER = {
60        DO_IT_AGAIN,};
61
62    private static final String[] BUTTON_TEXT_BEFORE = {
63        DO_IT,
64        "",
65        FIND,
66        GO,
67        CONNECT,
68        "",
69        GET_MORE_INFO,
70        null
71    };
72
73    private static final String[] BUTTON_TOOLTIP = {
74        SIMPLE_BUTTON,
75        IMAGE_BUTTON,
76        BUTTON_WITH_TEXT_AND_IMAGE,
77        BUTTON_WITH_BACKGROUND_COLOR,
78        BUTTON_WITH_NO_BORDER,
79        BUTTON_WITH_ROLLOVER_IMAGE,
80        JAVA_SE_URL,
81        JAVA_BLOGS_URL
82    };
83
84    private static final String[] GOLDEN = {
85        "isArmed = false, isEnabled = true, isPressed = false, isSelected = false",
86        "isArmed = true, isEnabled = true, isPressed = false, isSelected = false",
87        "isArmed = true, isEnabled = true, isPressed = true, isSelected = false",
88        "isArmed = true, isEnabled = true, isPressed = false, isSelected = false",
89        "isArmed = false, isEnabled = true, isPressed = false, isSelected = false"
90    };
91
92    @Test
93    public void test() throws Exception {
94
95        captureDebugInfoOnFail(() -> {
96
97            new ClassReference(ButtonDemo.class.getCanonicalName()).startApplication();
98
99            JFrameOperator mainFrame = new JFrameOperator(DEMO_TITLE);
100            mainFrame.setComparator(EXACT_STRING_COMPARATOR);
101
102            // Check all the buttons
103            for (int i = 0; i < BUTTON_TOOLTIP.length; i++) {
104                String tooltip = BUTTON_TOOLTIP[i];
105
106                JButtonOperator button = new JButtonOperator(mainFrame, new ByToolTipChooser(tooltip));
107
108                assertEquals(BUTTON_TEXT_BEFORE[i], button.getText());
109
110                // Two buttons are hyperlinks, we don't want to click them
111                if (!button.getSource().getClass().equals(JHyperlink.class)) {
112                    checkButton(button);
113                }
114
115                if (BUTTON_TEXT_AFTER.length > i) {
116                    assertEquals(BUTTON_TEXT_AFTER[i], button.getText());
117                } else {
118                    assertEquals(BUTTON_TEXT_BEFORE[i], button.getText());
119                }
120            }
121
122        });
123    }
124
125    private void checkButton(JButtonOperator button) throws Exception {
126        MultiThreadedTryCatch tryCatch = new JemmyExt.MultiThreadedTryCatch();
127        try {
128            BlockingQueue<String> modelStateChanges = new ArrayBlockingQueue<>(GOLDEN.length);
129            button.getQueueTool().invokeAndWait(() -> {
130                try {
131                    JButton jButton = (JButton) button.getSource();
132                    ButtonModel model = jButton.getModel();
133                    String line = toString(model);
134                    System.out.println("Inital: " + line);
135                    modelStateChanges.add(line);
136                    model.addChangeListener((ChangeEvent e) -> {
137                        try {
138                            String line2 = toString(model);
139                            System.out.println("ChangeEvent: " + line2);
140
141                            // We are only interested in the first GOLDEN.length events
142                            if (modelStateChanges.remainingCapacity() > 0) {
143                                modelStateChanges.add(line2);
144                            }
145                        } catch (RuntimeException | Error t) {
146                            tryCatch.register(t);
147                        }
148                    });
149                } catch (Error error) {
150                    // All exceptions are already handled by Jemmy but Errors are not
151                    tryCatch.register(error);
152                    throw error;
153                }
154            });
155
156            assertEquals("Initial state check", GOLDEN[0], modelStateChanges.take());
157
158            button.clickMouse();
159
160            for (int state = 1; state < GOLDEN.length; state++) {
161                assertEquals(GOLDEN[state], modelStateChanges.take());
162            }
163        } catch (RuntimeException | Error | InterruptedException t) {
164            tryCatch.registerRoot(t);
165        } finally {
166            tryCatch.throwRegistered();
167        }
168    }
169
170    private static String toString(ButtonModel model) {
171        return "isArmed = " + model.isArmed()
172                + ", isEnabled = " + model.isEnabled()
173                + ", isPressed = " + model.isPressed()
174                + ", isSelected = " + model.isSelected();
175    }
176
177}
178