1/*
2 * Copyright (c) 2001, 2014, 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
24
25/*
26 * @test
27 * @key headful
28 * @bug 8043126
29 * @summary Check whether KeyEvent.getModifiers() returns correct modifiers
30 *          when Ctrl, Alt or Shift keys are pressed.
31 *
32 * @library ../../../../../lib/testlibrary/  ../../helpers/lwcomponents/
33 * @build LWComponent
34 * @build LWButton
35 * @build LWList
36 * @build ExtendedRobot
37 * @run main/timeout=600 KeyMaskTest
38 */
39
40
41import java.awt.*;
42import java.awt.event.InputEvent;
43
44import java.awt.event.KeyAdapter;
45import java.awt.event.KeyEvent;
46
47import java.util.ArrayList;
48
49import static jdk.testlibrary.Asserts.*;
50
51import test.java.awt.event.helpers.lwcomponents.LWButton;
52import test.java.awt.event.helpers.lwcomponents.LWList;
53
54
55
56public class KeyMaskTest extends KeyAdapter {
57
58    Frame frame;
59
60    Button    button;
61    LWButton  buttonLW;
62    TextField textField;
63    TextArea  textArea;
64    List      list;
65    LWList    listLW;
66
67    int buttonPressedNumber;
68    int buttonReleasedNumber;
69
70    ExtendedRobot robot;
71
72    private final static int robotDelay = 1500;
73    private final static int waitDelay  = 3500;
74
75    final Object lock;
76
77    private boolean keyPressReceived = false;
78    private int keyCode = -1;
79
80    KeyMaskTest() throws Exception {
81        lock = new Object();
82        robot = new ExtendedRobot();
83        EventQueue.invokeAndWait( this::createGUI );
84    }
85
86    public void createGUI() {
87
88        frame = new Frame();
89        frame.setTitle("KeyMaskTest");
90        frame.setLayout(new GridLayout(1, 6));
91
92        button = new Button();
93        button.addKeyListener(this);
94        frame.add(button);
95
96        buttonLW = new LWButton();
97        buttonLW.addKeyListener(this);
98        frame.add(buttonLW);
99
100        textField = new TextField(5);
101        textField.addKeyListener(this);
102        frame.add(textField);
103
104        textArea = new TextArea(5, 5);
105        textArea.addKeyListener(this);
106        frame.add(textArea);
107
108        list = new List();
109        for (int i = 1; i <= 5; ++i) { list.add("item " + i); }
110        list.addKeyListener(this);
111        frame.add(list);
112
113        listLW = new LWList();
114        for (int i = 1; i <= 5; ++i) { listLW.add("item " + i); }
115        listLW.addKeyListener(this);
116        frame.add(listLW);
117
118
119        frame.setBackground(Color.gray);
120        frame.setSize(500, 100);
121        frame.setVisible(true);
122        frame.toFront();
123    }
124
125    @Override
126    public void keyPressed(KeyEvent e) {
127
128        keyPressReceived = true;
129
130        int code = e.getKeyCode();
131
132        assertEQ(code, keyCode, "wrong key code");
133
134        int mask = 0;
135
136        if (code == KeyEvent.VK_SHIFT) {
137            mask = InputEvent.SHIFT_MASK;
138        } else if (code == KeyEvent.VK_CONTROL) {
139            mask = InputEvent.CTRL_MASK;
140        } else if (code == KeyEvent.VK_ALT) {
141            mask = InputEvent.ALT_MASK;
142        } else if (code == KeyEvent.VK_META) {
143            mask = InputEvent.META_MASK;
144        }
145
146        int mod = e.getModifiers() & mask;
147        assertEQ(mod, mask, "invalid key mask");
148
149        synchronized (lock) { lock.notifyAll(); }
150    }
151
152
153    void doTest() throws Exception {
154
155        ArrayList<Component> components = new ArrayList();
156        components.add(button);
157        components.add(buttonLW);
158        components.add(textField);
159        components.add(textArea);
160        components.add(list);
161        components.add(listLW);
162
163        int keys[];
164        String OS = System.getProperty("os.name").toLowerCase();
165        System.out.println(OS);
166        if (OS.contains("os x") || OS.contains("sunos")) {
167            keys = new int[] {KeyEvent.VK_SHIFT, KeyEvent.VK_CONTROL, KeyEvent.VK_ALT, KeyEvent.VK_META};
168        } else {
169            keys = new int[] {KeyEvent.VK_SHIFT, KeyEvent.VK_CONTROL, KeyEvent.VK_ALT};
170        }
171
172        for (Component c: components) {
173
174            System.out.print(c.getClass().getName() + ": ");
175
176            Point origin = c.getLocationOnScreen();
177            int xc = origin.x + c.getWidth() / 2;
178            int yc = origin.y + c.getHeight() / 2;
179            Point center = new Point(xc, yc);
180
181            robot.delay(robotDelay);
182            robot.glide(origin, center);
183            robot.click();
184            robot.delay(robotDelay);
185
186            for (int k = 0; k < keys.length; ++k) {
187
188                keyPressReceived = false;
189
190                keyCode = keys[k];
191
192                robot.type(keyCode);
193
194                robot.delay(robotDelay);
195
196                if (!keyPressReceived) {
197                    synchronized (lock) {
198                        try {
199                            lock.wait(waitDelay);
200                        } catch (InterruptedException e) {}
201                    }
202                }
203
204                assertTrue(keyPressReceived, "key press event was not received");
205            }
206
207            System.out.println("passed");
208        }
209
210        robot.waitForIdle();
211        frame.dispose();
212    }
213
214
215    public static void main(String[] args) throws Exception {
216
217        KeyMaskTest test = new KeyMaskTest();
218        test.doTest();
219    }
220}
221