Path: blob/jdk8u272-b10-aarch32-20201026/jdk/test/java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersUnitTest_Extra.java
48795 views
/*1* Copyright (c) 2008, 2013, 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@bug 631571726@summary verifies that modifiers are correct for extra buttons27@author Andrei Dmitriev : area=awt.mouse28@run main MouseModifiersUnitTest_Extra29*/3031import sun.awt.OSInfo;3233import java.awt.*;34import java.awt.event.*;35import java.util.Arrays;36import java.util.HashMap;37import java.util.StringTokenizer;38import java.util.Vector;3940// will process extra buttons only41// asking parameters from CMD: manual/automatic, modifier to test4243public class MouseModifiersUnitTest_Extra extends Frame {44static final int NONE = 0;45static final int SHIFT = 1;46static final int CTRL = 2;47static final int ALT = 3;48static CheckingModifierAdapterExtra adapterTest1;49static CheckingModifierAdapterExtra adapterTest2;50static CheckingModifierAdapterExtra adapterTest3;51static CheckingModifierAdapterExtra adapterTest4;5253static boolean debug = true; //dump all errors (debug) or throw first(under jtreg) exception54static boolean autorun = false; //use robot or manual run55static int testModifier = NONE;5657static int [] mouseButtonDownMasks;5859//an arrays representing a modifiersEx of extra mouse buttons while using ALT/CTRL/SHIFT or none of them60static int [] modifiersExStandard;61static int [] modifiersExStandardSHIFT;62static int [] modifiersExStandardCTRL;63static int [] modifiersExStandardALT;6465private final static String SHIFT_MODIFIER = OSInfo.getOSType().equals(OSInfo.OSType.MACOSX) ?66"\u21e7" : "Shift";6768private final static String ALT_MODIFIER = OSInfo.getOSType().equals(OSInfo.OSType.MACOSX) ?69"\u2325" : "Alt";707172private final static String CTRL_MODIFIER = OSInfo.getOSType().equals(OSInfo.OSType.MACOSX) ?73"\u2303" : "Ctrl";747576// BUTTON1, 2, 3 press-release.77final static int modifiersStandard = 0; //InputEvent.BUTTON_DOWN_MASK;7879public static void checkPressedModifiersTest(int testModifier, MouseEvent event){80int [] curStandardExModifiers = getStandardExArray(testModifier);81int button = event.getButton();82int modifiers = event.getModifiers();83int modifiersEx = event.getModifiersEx();84int index = (button - 4)*3;85dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]);86if (modifiers != modifiersStandard){87MessageLogger.reportError("Test failed : Pressed. modifiers != modifiersStandard");88}8990if (modifiersEx != curStandardExModifiers[index]){91// System.out.println(">>>>>>>>>>>>>>> Pressed. modifiersEx "+modifiersEx +" : "+!= curStandardExModifiers");92MessageLogger.reportError("Test failed : Pressed. modifiersEx != curStandardExModifiers. Got: "93+ modifiersEx + " , Expected: " + curStandardExModifiers[index]);94}9596//check event.paramString() output97HashMap <String, String> paramStringElements = tokenizeParamString(event.paramString());98System.out.println(event.paramString());99checkButton(paramStringElements, button);100checkModifiers(testModifier, paramStringElements, button);101checkExtModifiersOnPress(testModifier, paramStringElements, button);102}103104public static void checkExtModifiersOnReleaseClick(int testModifier, HashMap<String, String> h, int button){105String ethalon = "";106switch (testModifier){107case SHIFT:{108ethalon = SHIFT_MODIFIER;109break;110}111case ALT:{112ethalon = ALT_MODIFIER;113break;114}115case CTRL:{116ethalon = CTRL_MODIFIER;117break;118}119}120121if (h.get("extModifiers") == null){122h.put("extModifiers", "");123}124125if (!ethalon.equals(h.get("extModifiers"))) {126MessageLogger.reportError("Test failed : Released/Clicked. extModifiers = "127+ h.get("extModifiers") + " instead of : " + ethalon);128}129}130131public static void checkExtModifiersOnPress(int testModifier, HashMap<String, String> h, int button){132String ethalon = "";133switch (testModifier){134case SHIFT:{135ethalon = SHIFT_MODIFIER + "+";136break;137}138case ALT:{139ethalon = ALT_MODIFIER + "+";140break;141}142case CTRL:{143ethalon = CTRL_MODIFIER + "+";144break;145}146}147ethalon = ethalon + "Button" +button;148149if (!h.get("extModifiers").equals(ethalon)) {150MessageLogger.reportError("Test failed : Pressed. extModifiers = " +h.get("extModifiers")+" instead of : "151+ ethalon);152}153}154155public static void checkModifiers(int testModifier, HashMap<String, String> h, int button){156// none of modifiers for extra button should be null157if (h.get("modifiers") != null) {158MessageLogger.reportError("Test failed : modifiers != null");159}160}161162public static void checkButton(HashMap<String, String> h, int button){163if (h.get("button") == null) {164MessageLogger.reportError("Test failed : checkButton(). button is absent in paramString()");165}166if (Integer.parseInt(h.get("button")) != button) {167MessageLogger.reportError("Test failed : checkButton. button in paramString() doesn't equal to button being pressed.");168}169}170public static HashMap<String, String> tokenizeParamString(String param){171HashMap <String, String> params = new HashMap<>();172StringTokenizer st = new StringTokenizer(param, ",=");173while (st.hasMoreTokens()){174String tmp = st.nextToken();175// System.out.println("PARSER : "+tmp);176if (tmp.equals("button") ||177tmp.equals("modifiers") ||178tmp.equals("extModifiers")) {179params.put(tmp, st.nextToken());180}181}182return params;183}184185public static Vector<String> tokenizeModifiers(String modifierList){186Vector<String> modifiers = new Vector<>();187StringTokenizer st = new StringTokenizer(modifierList, "+");188while (st.hasMoreTokens()){189String tmp = st.nextToken();190modifiers.addElement(tmp);191System.out.println("MODIFIER PARSER : "+tmp);192}193return modifiers;194}195196public static void checkReleasedModifiersTest(int testModifier, MouseEvent event){197int [] curStandardExModifiers = getStandardExArray(testModifier);198int button = event.getButton();199int modifiers = event.getModifiers();200int modifiersEx = event.getModifiersEx();201int index = (button - 4)*3 + 1;202dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]);203if (modifiers != modifiersStandard){204MessageLogger.reportError("Test failed : Released. modifiers != modifiersStandard");205}206207if (modifiersEx != curStandardExModifiers[index]){208MessageLogger.reportError("Test failed : Released. modifiersEx != curStandardExModifiers. Got: "209+ modifiersEx + " , Expected: " + curStandardExModifiers[index]);210}211212//check event.paramString() output213HashMap <String, String> paramStringElements = tokenizeParamString(event.paramString());214checkButton(paramStringElements, button);215checkModifiers(testModifier, paramStringElements, button);216System.out.println("paramStringElements = "+paramStringElements);217checkExtModifiersOnReleaseClick(testModifier, paramStringElements, button);218}219220public static void checkClickedModifiersTest(int testModifier, MouseEvent event){221int [] curStandardExModifiers = getStandardExArray(testModifier);222int button = event.getButton();223int modifiers = event.getModifiers();224int modifiersEx = event.getModifiersEx();225int index = (button - 4)*3 + 2;226dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]);227if (modifiers != modifiersStandard){228MessageLogger.reportError("Test failed : Clicked. modifiers != modifiersStandard");229}230231if (modifiersEx != curStandardExModifiers[index]){232MessageLogger.reportError("Test failed : Clicked. modifiersEx != curStandardExModifiers. Got: "233+ modifiersEx + " , Expected: " + curStandardExModifiers[index]);234}235236//check event.paramString() output237HashMap <String, String> paramStringElements = tokenizeParamString(event.paramString());238checkButton(paramStringElements, button);239checkModifiers(testModifier, paramStringElements, button);240checkExtModifiersOnReleaseClick(testModifier, paramStringElements, button);241}242243private static int[] getStandardExArray(int testModifier) {244int [] curStandardExModifiers;245switch (testModifier){246case SHIFT:247curStandardExModifiers = modifiersExStandardSHIFT;248break;249case CTRL:250curStandardExModifiers = modifiersExStandardCTRL;251break;252case ALT:253curStandardExModifiers = modifiersExStandardALT;254break;255default: //NONE by default256curStandardExModifiers = modifiersExStandard;257}258return curStandardExModifiers;259}260261static Robot robot;262public void init() {263this.setLayout(new BorderLayout());264try {265robot = new Robot();266robot.setAutoDelay(100);267robot.setAutoWaitForIdle(true);268} catch (Exception e) {269MessageLogger.reportError("Test failed. "+e);270}271}//End init()272273public void start() {274//Get things going. Request focus, set size, et cetera275setSize(200,200);276setVisible(true);277validate();278if (autorun) {279testNONE();280testSHIFT();281testCTRL();282testALT();283} else {284switch (testModifier){285case SHIFT:286this.addMouseListener(adapterTest2);287break;288case CTRL:289this.addMouseListener(adapterTest3);290break;291case ALT:292this.addMouseListener(adapterTest4);293break;294default: //NONE by default295this.addMouseListener(adapterTest1);296}297}298}// start()299300//000000000000000000000000000000000000000000000000000000000000000301public void testNONE(){302this.addMouseListener(adapterTest1);303robot.delay(1000);304robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);305for (int i = 3; i< mouseButtonDownMasks.length; i++){306System.out.println("testNONE() => " + mouseButtonDownMasks[i]);307robot.mousePress(mouseButtonDownMasks[i]);308robot.mouseRelease(mouseButtonDownMasks[i]);309}310robot.delay(1000);311this.removeMouseListener(adapterTest1);312}313314public void testSHIFT(){315this.addMouseListener(adapterTest2);316robot.delay(1000);317robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);318for (int i = 3; i< mouseButtonDownMasks.length; i++){319robot.keyPress(KeyEvent.VK_SHIFT);320System.out.println("testSHIFT() => " + mouseButtonDownMasks[i]);321robot.mousePress(mouseButtonDownMasks[i]);322robot.mouseRelease(mouseButtonDownMasks[i]);323robot.keyRelease(KeyEvent.VK_SHIFT);324}325robot.delay(1000);326this.removeMouseListener(adapterTest2);327}328329public void testCTRL(){330this.addMouseListener(adapterTest3);331robot.delay(1000);332robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);333for (int i = 3; i< mouseButtonDownMasks.length; i++){334robot.keyPress(KeyEvent.VK_CONTROL);335System.out.println("testCTRL() => " + mouseButtonDownMasks[i]);336robot.mousePress(mouseButtonDownMasks[i]);337robot.mouseRelease(mouseButtonDownMasks[i]);338robot.keyRelease(KeyEvent.VK_CONTROL);339}340robot.delay(1000);341this.removeMouseListener(adapterTest3);342}343344public void testALT(){345this.addMouseListener(adapterTest4);346robot.delay(1000);347robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);348for (int i = 3; i< mouseButtonDownMasks.length; i++){349robot.keyPress(KeyEvent.VK_ALT);350System.out.println("testALT() => " + mouseButtonDownMasks[i]);351robot.mousePress(mouseButtonDownMasks[i]);352robot.mouseRelease(mouseButtonDownMasks[i]);353robot.keyRelease(KeyEvent.VK_ALT);354}355robot.delay(1000);356this.removeMouseListener(adapterTest4);357}358359//**************************************************************************************************360public static void dumpValues(int button, int modifiers, int modifiersStandard, int modifiersEx, int modifiersExStandard){361System.out.println("Button = "+button + "Modifiers = "+ modifiers + "standard = "+ modifiersStandard);362System.out.println("Button = "+button + "ModifiersEx = "+ modifiersEx + "standardEx = "+ modifiersExStandard);363}364365public static void initParams(String []s){366if (s.length != 3){367autorun = true;368debug = false;369testModifier = NONE;370} else {371autorun = Boolean.valueOf(s[0]);372debug = Boolean.valueOf(s[1]);373374if (s[2].equals("NONE")){375testModifier = NONE;376}377if (s[2].equals("SHIFT")){378testModifier = SHIFT;379}380if (s[2].equals("CTRL")){381testModifier = CTRL;382}383if (s[2].equals("ALT")){384testModifier = ALT;385}386}387MessageLogger.setDebug(debug);388System.out.println("Autorun : " +autorun);389System.out.println("Debug mode : " +debug);390System.out.println("Modifier to verify : " + testModifier);391}392393public static void initAdapters(){394adapterTest1 = new CheckingModifierAdapterExtra(NONE);395adapterTest2 = new CheckingModifierAdapterExtra(SHIFT);396adapterTest3 = new CheckingModifierAdapterExtra(CTRL);397adapterTest4 = new CheckingModifierAdapterExtra(ALT);398}399400public static void initVars(){401//Init the array of the mouse button masks. It will be used for generating mouse events.402mouseButtonDownMasks = new int [MouseInfo.getNumberOfButtons()];403for (int i = 0; i < mouseButtonDownMasks.length; i++){404mouseButtonDownMasks[i] = InputEvent.getMaskForButton(i+1);405System.out.println("MouseArray [i] == "+mouseButtonDownMasks[i]);406}407408// So we need to get the number of extra buttons on the mouse: "MouseInfo.getNumberOfButtons() - 3"409// and multyply on 3 because each button will generate three events : PRESS, RELEASE and CLICK.410int [] tmp = new int [(MouseInfo.getNumberOfButtons()-3)*3];411412//Fill array of expected results for the case when mouse buttons are only used (no-modifier keys)413Arrays.fill(tmp, 0);414for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){415tmp[i] = mouseButtonDownMasks[j];416}417modifiersExStandard = Arrays.copyOf(tmp, tmp.length);418419//Fill array of expected results for the case when mouse buttons are only used with SHIFT modifier key420Arrays.fill(tmp, InputEvent.SHIFT_DOWN_MASK);421for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){422System.out.println("modifiersExStandardSHIFT FILLING : " + tmp[i] + " + " + mouseButtonDownMasks[j]);423tmp[i] = tmp[i] | mouseButtonDownMasks[j];424}425modifiersExStandardSHIFT = Arrays.copyOf(tmp, tmp.length);426427//Fill array of expected results for the case when mouse buttons are only used with CTRL modifier key428Arrays.fill(tmp, InputEvent.CTRL_DOWN_MASK);429for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){430System.out.println("modifiersExStandardCTRL FILLING : " + tmp[i] + " + " + mouseButtonDownMasks[j]);431tmp[i] = tmp[i] | mouseButtonDownMasks[j];432}433modifiersExStandardCTRL = Arrays.copyOf(tmp, tmp.length);434435//Fill array of expected results for the case when mouse buttons are only used with ALT modifier key436Arrays.fill(tmp, InputEvent.ALT_DOWN_MASK);437for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){438System.out.println("modifiersExStandardALT FILLING : " + tmp[i] + " + " + mouseButtonDownMasks[j]);439tmp[i] = tmp[i] | mouseButtonDownMasks[j];440}441modifiersExStandardALT = Arrays.copyOf(tmp, tmp.length);442}443444public static void main(String []s){445if (MouseInfo.getNumberOfButtons() < 4){446System.out.println("There are less then 4 buttons on the mouse. The test may not be accomplished. Skipping.");447return;448}449initVars();450MouseModifiersUnitTest_Extra frame = new MouseModifiersUnitTest_Extra();451frame.initParams(s);452frame.init();453initAdapters();454frame.start();455}456457}// class458459/* A class that invoke appropriate verification460* routine with current modifier.461*/462class CheckingModifierAdapterExtra extends MouseAdapter{463int modifier;464public CheckingModifierAdapterExtra(int modifier){465this.modifier = modifier;466}467468public void mousePressed(MouseEvent e) {469System.out.println("PRESSED "+e);470if (e.getButton() <= MouseEvent.BUTTON3) {471System.out.println("Standard button affected. Skip.");472} else {473MouseModifiersUnitTest_Extra.checkPressedModifiersTest(modifier, e);474}475}476public void mouseReleased(MouseEvent e) {477System.out.println("RELEASED "+e);478if (e.getButton() <= MouseEvent.BUTTON3) {479System.out.println("Standard button affected. Skip.");480} else {481MouseModifiersUnitTest_Extra.checkReleasedModifiersTest(modifier, e);482}483}484public void mouseClicked(MouseEvent e) {485System.out.println("CLICKED "+e);486if (e.getButton() <= MouseEvent.BUTTON3) {487System.out.println("Standard button affected. Skip.");488} else {489MouseModifiersUnitTest_Extra.checkClickedModifiersTest(modifier, e);490}491}492}493//Utility class that could report a message depending on current purpose of the test run494class MessageLogger{495private static boolean debug;496497public static void setDebug(boolean d){498debug = d;499log("Switch to "+ ((debug)?"debug":"trial") +" mode");500}501502public static void log(String message){503System.out.println(message);504}505506public static void reportError(String message){507if (debug){508System.out.println(message);509} else {510throw new RuntimeException(message);511}512}513}514515516