Path: blob/master/test/jdk/java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersUnitTest_Extra.java
41152 views
/*1* Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24@test %I% %E%25@key headful26@bug 631571727@summary verifies that modifiers are correct for extra buttons28@author Andrei Dmitriev : area=awt.mouse29@library /test/lib30@build jdk.test.lib.Platform31@run main MouseModifiersUnitTest_Extra32*/3334import jdk.test.lib.Platform;3536import java.awt.*;37import java.awt.event.*;38import java.util.Arrays;39import java.util.HashMap;40import java.util.StringTokenizer;41import java.util.Vector;4243// will process extra buttons only44// asking parameters from CMD: manual/automatic, modifier to test4546public class MouseModifiersUnitTest_Extra extends Frame {47static final int NONE = 0;48static final int SHIFT = 1;49static final int CTRL = 2;50static final int ALT = 3;51static CheckingModifierAdapterExtra adapterTest1;52static CheckingModifierAdapterExtra adapterTest2;53static CheckingModifierAdapterExtra adapterTest3;54static CheckingModifierAdapterExtra adapterTest4;5556static boolean debug = true; //dump all errors (debug) or throw first(under jtreg) exception57static boolean autorun = false; //use robot or manual run58static int testModifier = NONE;5960static int [] mouseButtonDownMasks;6162//an arrays representing a modifiersEx of extra mouse buttons while using ALT/CTRL/SHIFT or none of them63static int [] modifiersExStandard;64static int [] modifiersExStandardSHIFT;65static int [] modifiersExStandardCTRL;66static int [] modifiersExStandardALT;6768private final static String SHIFT_MODIFIER = Platform.isOSX() ?69"\u21e7" : "Shift";7071private final static String ALT_MODIFIER = Platform.isOSX() ?72"\u2325" : "Alt";737475private final static String CTRL_MODIFIER = Platform.isOSX() ?76"\u2303" : "Ctrl";777879// BUTTON1, 2, 3 press-release.80final static int modifiersStandard = 0; //InputEvent.BUTTON_DOWN_MASK;8182public static void checkPressedModifiersTest(int testModifier, MouseEvent event){83int [] curStandardExModifiers = getStandardExArray(testModifier);84int button = event.getButton();85int modifiers = event.getModifiers();86int modifiersEx = event.getModifiersEx();87int index = (button - 4)*3;88dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]);89if (modifiers != modifiersStandard){90MessageLogger.reportError("Test failed : Pressed. modifiers != modifiersStandard");91}9293if (modifiersEx != curStandardExModifiers[index]){94// System.out.println(">>>>>>>>>>>>>>> Pressed. modifiersEx "+modifiersEx +" : "+!= curStandardExModifiers");95MessageLogger.reportError("Test failed : Pressed. modifiersEx != curStandardExModifiers. Got: "96+ modifiersEx + " , Expected: " + curStandardExModifiers[index]);97}9899//check event.paramString() output100HashMap <String, String> paramStringElements = tokenizeParamString(event.paramString());101System.out.println(event.paramString());102checkButton(paramStringElements, button);103checkModifiers(testModifier, paramStringElements, button);104checkExtModifiersOnPress(testModifier, paramStringElements, button);105}106107public static void checkExtModifiersOnReleaseClick(int testModifier, HashMap<String, String> h, int button){108String ethalon = "";109switch (testModifier){110case SHIFT:{111ethalon = SHIFT_MODIFIER;112break;113}114case ALT:{115ethalon = ALT_MODIFIER;116break;117}118case CTRL:{119ethalon = CTRL_MODIFIER;120break;121}122}123124if (h.get("extModifiers") == null){125h.put("extModifiers", "");126}127128if (!ethalon.equals(h.get("extModifiers"))) {129MessageLogger.reportError("Test failed : Released/Clicked. extModifiers = "130+ h.get("extModifiers") + " instead of : " + ethalon);131}132}133134public static void checkExtModifiersOnPress(int testModifier, HashMap<String, String> h, int button){135String ethalon = "";136switch (testModifier){137case SHIFT:{138ethalon = SHIFT_MODIFIER + "+";139break;140}141case ALT:{142ethalon = ALT_MODIFIER + "+";143break;144}145case CTRL:{146ethalon = CTRL_MODIFIER + "+";147break;148}149}150ethalon = ethalon + "Button" +button;151152if (!h.get("extModifiers").equals(ethalon)) {153MessageLogger.reportError("Test failed : Pressed. extModifiers = " +h.get("extModifiers")+" instead of : "154+ ethalon);155}156}157158public static void checkModifiers(int testModifier, HashMap<String, String> h, int button){159// none of modifiers for extra button should be null160if (h.get("modifiers") != null) {161MessageLogger.reportError("Test failed : modifiers != null");162}163}164165public static void checkButton(HashMap<String, String> h, int button){166if (h.get("button") == null) {167MessageLogger.reportError("Test failed : checkButton(). button is absent in paramString()");168}169if (Integer.parseInt(h.get("button")) != button) {170MessageLogger.reportError("Test failed : checkButton. button in paramString() doesn't equal to button being pressed.");171}172}173public static HashMap<String, String> tokenizeParamString(String param){174HashMap <String, String> params = new HashMap<>();175StringTokenizer st = new StringTokenizer(param, ",=");176while (st.hasMoreTokens()){177String tmp = st.nextToken();178// System.out.println("PARSER : "+tmp);179if (tmp.equals("button") ||180tmp.equals("modifiers") ||181tmp.equals("extModifiers")) {182params.put(tmp, st.nextToken());183}184}185return params;186}187188public static Vector<String> tokenizeModifiers(String modifierList){189Vector<String> modifiers = new Vector<>();190StringTokenizer st = new StringTokenizer(modifierList, "+");191while (st.hasMoreTokens()){192String tmp = st.nextToken();193modifiers.addElement(tmp);194System.out.println("MODIFIER PARSER : "+tmp);195}196return modifiers;197}198199public static void checkReleasedModifiersTest(int testModifier, MouseEvent event){200int [] curStandardExModifiers = getStandardExArray(testModifier);201int button = event.getButton();202int modifiers = event.getModifiers();203int modifiersEx = event.getModifiersEx();204int index = (button - 4)*3 + 1;205dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]);206if (modifiers != modifiersStandard){207MessageLogger.reportError("Test failed : Released. modifiers != modifiersStandard");208}209210if (modifiersEx != curStandardExModifiers[index]){211MessageLogger.reportError("Test failed : Released. modifiersEx != curStandardExModifiers. Got: "212+ modifiersEx + " , Expected: " + curStandardExModifiers[index]);213}214215//check event.paramString() output216HashMap <String, String> paramStringElements = tokenizeParamString(event.paramString());217checkButton(paramStringElements, button);218checkModifiers(testModifier, paramStringElements, button);219System.out.println("paramStringElements = "+paramStringElements);220checkExtModifiersOnReleaseClick(testModifier, paramStringElements, button);221}222223public static void checkClickedModifiersTest(int testModifier, MouseEvent event){224int [] curStandardExModifiers = getStandardExArray(testModifier);225int button = event.getButton();226int modifiers = event.getModifiers();227int modifiersEx = event.getModifiersEx();228int index = (button - 4)*3 + 2;229dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]);230if (modifiers != modifiersStandard){231MessageLogger.reportError("Test failed : Clicked. modifiers != modifiersStandard");232}233234if (modifiersEx != curStandardExModifiers[index]){235MessageLogger.reportError("Test failed : Clicked. modifiersEx != curStandardExModifiers. Got: "236+ modifiersEx + " , Expected: " + curStandardExModifiers[index]);237}238239//check event.paramString() output240HashMap <String, String> paramStringElements = tokenizeParamString(event.paramString());241checkButton(paramStringElements, button);242checkModifiers(testModifier, paramStringElements, button);243checkExtModifiersOnReleaseClick(testModifier, paramStringElements, button);244}245246private static int[] getStandardExArray(int testModifier) {247int [] curStandardExModifiers;248switch (testModifier){249case SHIFT:250curStandardExModifiers = modifiersExStandardSHIFT;251break;252case CTRL:253curStandardExModifiers = modifiersExStandardCTRL;254break;255case ALT:256curStandardExModifiers = modifiersExStandardALT;257break;258default: //NONE by default259curStandardExModifiers = modifiersExStandard;260}261return curStandardExModifiers;262}263264static Robot robot;265public void init() {266this.setLayout(new BorderLayout());267try {268robot = new Robot();269robot.setAutoDelay(100);270robot.setAutoWaitForIdle(true);271} catch (Exception e) {272MessageLogger.reportError("Test failed. "+e);273}274}//End init()275276public void start() {277//Get things going. Request focus, set size, et cetera278setSize(200,200);279setVisible(true);280validate();281if (autorun) {282testNONE();283testSHIFT();284testCTRL();285testALT();286} else {287switch (testModifier){288case SHIFT:289this.addMouseListener(adapterTest2);290break;291case CTRL:292this.addMouseListener(adapterTest3);293break;294case ALT:295this.addMouseListener(adapterTest4);296break;297default: //NONE by default298this.addMouseListener(adapterTest1);299}300}301}// start()302303//000000000000000000000000000000000000000000000000000000000000000304public void testNONE(){305this.addMouseListener(adapterTest1);306robot.delay(1000);307robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);308for (int i = 3; i< mouseButtonDownMasks.length; i++){309System.out.println("testNONE() => " + mouseButtonDownMasks[i]);310robot.mousePress(mouseButtonDownMasks[i]);311robot.mouseRelease(mouseButtonDownMasks[i]);312}313robot.delay(1000);314this.removeMouseListener(adapterTest1);315}316317public void testSHIFT(){318this.addMouseListener(adapterTest2);319robot.delay(1000);320robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);321for (int i = 3; i< mouseButtonDownMasks.length; i++){322robot.keyPress(KeyEvent.VK_SHIFT);323System.out.println("testSHIFT() => " + mouseButtonDownMasks[i]);324robot.mousePress(mouseButtonDownMasks[i]);325robot.mouseRelease(mouseButtonDownMasks[i]);326robot.keyRelease(KeyEvent.VK_SHIFT);327}328robot.delay(1000);329this.removeMouseListener(adapterTest2);330}331332public void testCTRL(){333this.addMouseListener(adapterTest3);334robot.delay(1000);335robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);336for (int i = 3; i< mouseButtonDownMasks.length; i++){337robot.keyPress(KeyEvent.VK_CONTROL);338System.out.println("testCTRL() => " + mouseButtonDownMasks[i]);339robot.mousePress(mouseButtonDownMasks[i]);340robot.mouseRelease(mouseButtonDownMasks[i]);341robot.keyRelease(KeyEvent.VK_CONTROL);342}343robot.delay(1000);344this.removeMouseListener(adapterTest3);345}346347public void testALT(){348this.addMouseListener(adapterTest4);349robot.delay(1000);350robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);351for (int i = 3; i< mouseButtonDownMasks.length; i++){352robot.keyPress(KeyEvent.VK_ALT);353System.out.println("testALT() => " + mouseButtonDownMasks[i]);354robot.mousePress(mouseButtonDownMasks[i]);355robot.mouseRelease(mouseButtonDownMasks[i]);356robot.keyRelease(KeyEvent.VK_ALT);357}358robot.delay(1000);359this.removeMouseListener(adapterTest4);360}361362//**************************************************************************************************363public static void dumpValues(int button, int modifiers, int modifiersStandard, int modifiersEx, int modifiersExStandard){364System.out.println("Button = "+button + "Modifiers = "+ modifiers + "standard = "+ modifiersStandard);365System.out.println("Button = "+button + "ModifiersEx = "+ modifiersEx + "standardEx = "+ modifiersExStandard);366}367368public static void initParams(String []s){369if (s.length != 3){370autorun = true;371debug = false;372testModifier = NONE;373} else {374autorun = Boolean.valueOf(s[0]);375debug = Boolean.valueOf(s[1]);376377if (s[2].equals("NONE")){378testModifier = NONE;379}380if (s[2].equals("SHIFT")){381testModifier = SHIFT;382}383if (s[2].equals("CTRL")){384testModifier = CTRL;385}386if (s[2].equals("ALT")){387testModifier = ALT;388}389}390MessageLogger.setDebug(debug);391System.out.println("Autorun : " +autorun);392System.out.println("Debug mode : " +debug);393System.out.println("Modifier to verify : " + testModifier);394}395396public static void initAdapters(){397adapterTest1 = new CheckingModifierAdapterExtra(NONE);398adapterTest2 = new CheckingModifierAdapterExtra(SHIFT);399adapterTest3 = new CheckingModifierAdapterExtra(CTRL);400adapterTest4 = new CheckingModifierAdapterExtra(ALT);401}402403public static void initVars(){404//Init the array of the mouse button masks. It will be used for generating mouse events.405mouseButtonDownMasks = new int [MouseInfo.getNumberOfButtons()];406for (int i = 0; i < mouseButtonDownMasks.length; i++){407mouseButtonDownMasks[i] = InputEvent.getMaskForButton(i+1);408System.out.println("MouseArray [i] == "+mouseButtonDownMasks[i]);409}410411// So we need to get the number of extra buttons on the mouse: "MouseInfo.getNumberOfButtons() - 3"412// and multyply on 3 because each button will generate three events : PRESS, RELEASE and CLICK.413int [] tmp = new int [(MouseInfo.getNumberOfButtons()-3)*3];414415//Fill array of expected results for the case when mouse buttons are only used (no-modifier keys)416Arrays.fill(tmp, 0);417for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){418tmp[i] = mouseButtonDownMasks[j];419}420modifiersExStandard = Arrays.copyOf(tmp, tmp.length);421422//Fill array of expected results for the case when mouse buttons are only used with SHIFT modifier key423Arrays.fill(tmp, InputEvent.SHIFT_DOWN_MASK);424for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){425System.out.println("modifiersExStandardSHIFT FILLING : " + tmp[i] + " + " + mouseButtonDownMasks[j]);426tmp[i] = tmp[i] | mouseButtonDownMasks[j];427}428modifiersExStandardSHIFT = Arrays.copyOf(tmp, tmp.length);429430//Fill array of expected results for the case when mouse buttons are only used with CTRL modifier key431Arrays.fill(tmp, InputEvent.CTRL_DOWN_MASK);432for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){433System.out.println("modifiersExStandardCTRL FILLING : " + tmp[i] + " + " + mouseButtonDownMasks[j]);434tmp[i] = tmp[i] | mouseButtonDownMasks[j];435}436modifiersExStandardCTRL = Arrays.copyOf(tmp, tmp.length);437438//Fill array of expected results for the case when mouse buttons are only used with ALT modifier key439Arrays.fill(tmp, InputEvent.ALT_DOWN_MASK);440for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){441System.out.println("modifiersExStandardALT FILLING : " + tmp[i] + " + " + mouseButtonDownMasks[j]);442tmp[i] = tmp[i] | mouseButtonDownMasks[j];443}444modifiersExStandardALT = Arrays.copyOf(tmp, tmp.length);445}446447public static void main(String []s){448if (MouseInfo.getNumberOfButtons() < 4){449System.out.println("There are less than 4 buttons on the mouse. The test may not be accomplished. Skipping.");450return;451}452initVars();453MouseModifiersUnitTest_Extra frame = new MouseModifiersUnitTest_Extra();454frame.initParams(s);455frame.init();456initAdapters();457frame.start();458}459460}// class461462/* A class that invoke appropriate verification463* routine with current modifier.464*/465class CheckingModifierAdapterExtra extends MouseAdapter{466int modifier;467public CheckingModifierAdapterExtra(int modifier){468this.modifier = modifier;469}470471public void mousePressed(MouseEvent e) {472System.out.println("PRESSED "+e);473if (e.getButton() <= MouseEvent.BUTTON3) {474System.out.println("Standard button affected. Skip.");475} else {476MouseModifiersUnitTest_Extra.checkPressedModifiersTest(modifier, e);477}478}479public void mouseReleased(MouseEvent e) {480System.out.println("RELEASED "+e);481if (e.getButton() <= MouseEvent.BUTTON3) {482System.out.println("Standard button affected. Skip.");483} else {484MouseModifiersUnitTest_Extra.checkReleasedModifiersTest(modifier, e);485}486}487public void mouseClicked(MouseEvent e) {488System.out.println("CLICKED "+e);489if (e.getButton() <= MouseEvent.BUTTON3) {490System.out.println("Standard button affected. Skip.");491} else {492MouseModifiersUnitTest_Extra.checkClickedModifiersTest(modifier, e);493}494}495}496//Utility class that could report a message depending on current purpose of the test run497class MessageLogger{498private static boolean debug;499500public static void setDebug(boolean d){501debug = d;502log("Switch to "+ ((debug)?"debug":"trial") +" mode");503}504505public static void log(String message){506System.out.println(message);507}508509public static void reportError(String message){510if (debug){511System.out.println(message);512} else {513throw new RuntimeException(message);514}515}516}517518519