870N/A/*
870N/A @test %I% %E%
870N/A @bug 6315717
870N/A @summary verifies that modifiers are correct for extra buttons
870N/A @author Andrei Dmitriev : area=awt.mouse
870N/A @run main MouseModifiersUnitTest_Extra
870N/A */
870N/A
870N/Aimport java.awt.*;
870N/Aimport java.awt.event.*;
870N/Aimport java.util.Arrays;
870N/Aimport java.util.HashMap;
870N/Aimport java.util.StringTokenizer;
870N/Aimport java.util.Vector;
870N/A
870N/A// will process extra buttons only
870N/A// asking parameters from CMD: manual/automatic, modifier to test
870N/A
870N/Apublic class MouseModifiersUnitTest_Extra extends Frame {
870N/A static final int NONE = 0;
870N/A static final int SHIFT = 1;
870N/A static final int CTRL = 2;
870N/A static final int ALT = 3;
2774N/A static CheckingModifierAdapterExtra adapterTest1;
2774N/A static CheckingModifierAdapterExtra adapterTest2;
2774N/A static CheckingModifierAdapterExtra adapterTest3;
2774N/A static CheckingModifierAdapterExtra adapterTest4;
870N/A
870N/A static boolean debug = true; //dump all errors (debug) or throw first(under jtreg) exception
870N/A static boolean autorun = false; //use robot or manual run
870N/A static int testModifier = NONE;
870N/A
870N/A static int [] mouseButtonDownMasks;
870N/A
870N/A //an arrays representing a modifiersEx of extra mouse buttons while using ALT/CTRL/SHIFT or none of them
870N/A static int [] modifiersExStandard;
870N/A static int [] modifiersExStandardSHIFT;
870N/A static int [] modifiersExStandardCTRL;
870N/A static int [] modifiersExStandardALT;
870N/A
870N/A // BUTTON1, 2, 3 press-release.
870N/A final static int modifiersStandard = 0; //InputEvent.BUTTON_DOWN_MASK;
870N/A
870N/A public static void checkPressedModifiersTest(int testModifier, MouseEvent event){
870N/A int [] curStandardExModifiers = getStandardExArray(testModifier);
870N/A int button = event.getButton();
870N/A int modifiers = event.getModifiers();
870N/A int modifiersEx = event.getModifiersEx();
870N/A int index = (button - 4)*3;
870N/A dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]);
870N/A if (modifiers != modifiersStandard){
870N/A MessageLogger.reportError("Test failed : Pressed. modifiers != modifiersStandard");
870N/A }
870N/A
870N/A if (modifiersEx != curStandardExModifiers[index]){
870N/A// System.out.println(">>>>>>>>>>>>>>> Pressed. modifiersEx "+modifiersEx +" : "+!= curStandardExModifiers");
2774N/A MessageLogger.reportError("Test failed : Pressed. modifiersEx != curStandardExModifiers. Got: " + modifiersEx + " , Expected: " + curStandardExModifiers[index]);
870N/A }
870N/A
870N/A //check event.paramString() output
870N/A HashMap <String, String> paramStringElements = tokenizeParamString(event.paramString());
870N/A System.out.println(event.paramString());
870N/A checkButton(paramStringElements, button);
870N/A checkModifiers(testModifier, paramStringElements, button);
870N/A checkExtModifiersOnPress(testModifier, paramStringElements, button);
870N/A }
870N/A
870N/A public static void checkExtModifiersOnReleaseClick(int testModifier, HashMap h, int button){
870N/A String ethalon = "";
870N/A switch (testModifier){
870N/A case SHIFT:{
870N/A ethalon = "Shift";
870N/A break;
870N/A }
870N/A case ALT:{
870N/A ethalon = "Alt";
870N/A break;
870N/A }
870N/A case CTRL:{
870N/A ethalon = "Ctrl";
870N/A break;
870N/A }
870N/A }
870N/A //
870N/A if (h.get("extModifiers") == null){
870N/A h.put("extModifiers", "");
870N/A }
870N/A if (!ethalon.equals(h.get("extModifiers"))) {
870N/A MessageLogger.reportError("Test failed : Released/Clicked. extModifiers = " +h.get("extModifiers")+" instead of : "+ethalon);
870N/A }
870N/A }
870N/A
870N/A public static void checkExtModifiersOnPress(int testModifier, HashMap h, int button){
870N/A String ethalon = "";
870N/A switch (testModifier){
870N/A case SHIFT:{
870N/A ethalon = "Shift+";
870N/A break;
870N/A }
870N/A case ALT:{
870N/A ethalon = "Alt+";
870N/A break;
870N/A }
870N/A case CTRL:{
870N/A ethalon = "Ctrl+";
870N/A break;
870N/A }
870N/A }
870N/A ethalon = ethalon + "Button" +button;
870N/A
870N/A if (!h.get("extModifiers").equals(ethalon)) {
870N/A MessageLogger.reportError("Test failed : Pressed. extModifiers = " +h.get("extModifiers")+" instead of : "+ethalon);
870N/A }
870N/A }
870N/A
870N/A public static void checkModifiers(int testModifier, HashMap<String, String> h, int button){
870N/A // none of modifiers for extra button should be null
870N/A if (h.get("modifiers") != null) {
870N/A MessageLogger.reportError("Test failed : modifiers != null");
870N/A }
870N/A }
870N/A
870N/A public static void checkButton(HashMap<String, String> h, int button){
870N/A if (h.get("button") == null) {
870N/A MessageLogger.reportError("Test failed : checkButton(). button is absent in paramString()");
870N/A }
870N/A if (Integer.parseInt(h.get("button")) != button) {
870N/A MessageLogger.reportError("Test failed : checkButton. button in paramString() doesn't equal to button being pressed.");
870N/A }
870N/A }
870N/A public static HashMap<String, String> tokenizeParamString(String param){
870N/A HashMap <String, String> params = new HashMap<String, String>();
870N/A StringTokenizer st = new StringTokenizer(param, ",=");
870N/A while (st.hasMoreTokens()){
870N/A String tmp = st.nextToken();
870N/A// System.out.println("PARSER : "+tmp);
870N/A if (tmp.equals("button") ||
870N/A tmp.equals("modifiers") ||
870N/A tmp.equals("extModifiers")) {
870N/A params.put(tmp, st.nextToken());
870N/A }
870N/A }
870N/A return params;
870N/A }
870N/A
870N/A public static Vector<String> tokenizeModifiers(String modifierList){
870N/A Vector<String> modifiers = new Vector<String>();
870N/A StringTokenizer st = new StringTokenizer(modifierList, "+");
870N/A while (st.hasMoreTokens()){
870N/A String tmp = st.nextToken();
870N/A modifiers.addElement(tmp);
870N/A System.out.println("MODIFIER PARSER : "+tmp);
870N/A }
870N/A return modifiers;
870N/A }
870N/A
870N/A public static void checkReleasedModifiersTest(int testModifier, MouseEvent event){
870N/A int [] curStandardExModifiers = getStandardExArray(testModifier);
870N/A int button = event.getButton();
870N/A int modifiers = event.getModifiers();
870N/A int modifiersEx = event.getModifiersEx();
870N/A int index = (button - 4)*3 + 1;
870N/A dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]);
870N/A if (modifiers != modifiersStandard){
870N/A MessageLogger.reportError("Test failed : Released. modifiers != modifiersStandard");
870N/A }
870N/A
870N/A if (modifiersEx != curStandardExModifiers[index]){
2774N/A MessageLogger.reportError("Test failed : Released. modifiersEx != curStandardExModifiers. Got: " + modifiersEx + " , Expected: " + curStandardExModifiers[index]);
870N/A }
870N/A
870N/A //check event.paramString() output
870N/A HashMap <String, String> paramStringElements = tokenizeParamString(event.paramString());
870N/A checkButton(paramStringElements, button);
870N/A checkModifiers(testModifier, paramStringElements, button);
870N/A System.out.println("paramStringElements = "+paramStringElements);
870N/A checkExtModifiersOnReleaseClick(testModifier, paramStringElements, button);
870N/A }
870N/A
870N/A public static void checkClickedModifiersTest(int testModifier, MouseEvent event){
870N/A int [] curStandardExModifiers = getStandardExArray(testModifier);
870N/A int button = event.getButton();
870N/A int modifiers = event.getModifiers();
870N/A int modifiersEx = event.getModifiersEx();
870N/A int index = (button - 4)*3 + 2;
870N/A dumpValues(button, modifiers, modifiersStandard, modifiersEx, curStandardExModifiers[index]);
870N/A if (modifiers != modifiersStandard){
870N/A MessageLogger.reportError("Test failed : Clicked. modifiers != modifiersStandard");
870N/A }
870N/A
870N/A if (modifiersEx != curStandardExModifiers[index]){
2774N/A MessageLogger.reportError("Test failed : Clicked. modifiersEx != curStandardExModifiers. Got: " + modifiersEx + " , Expected: " + curStandardExModifiers[index]);
870N/A }
870N/A
870N/A //check event.paramString() output
870N/A HashMap <String, String> paramStringElements = tokenizeParamString(event.paramString());
870N/A checkButton(paramStringElements, button);
870N/A checkModifiers(testModifier, paramStringElements, button);
870N/A checkExtModifiersOnReleaseClick(testModifier, paramStringElements, button);
870N/A }
870N/A
870N/A private static int[] getStandardExArray(int testModifier) {
870N/A int [] curStandardExModifiers;
870N/A switch (testModifier){
870N/A case SHIFT:
870N/A curStandardExModifiers = modifiersExStandardSHIFT;
870N/A break;
870N/A case CTRL:
870N/A curStandardExModifiers = modifiersExStandardCTRL;
870N/A break;
870N/A case ALT:
870N/A curStandardExModifiers = modifiersExStandardALT;
870N/A break;
870N/A default: //NONE by default
870N/A curStandardExModifiers = modifiersExStandard;
870N/A }
870N/A return curStandardExModifiers;
870N/A }
870N/A
870N/A static Robot robot;
870N/A public void init() {
870N/A this.setLayout(new BorderLayout());
870N/A
870N/A String[] instructions =
870N/A {
870N/A "This test should be used with the mouse having more then three buttons.",
870N/A "Currently, " + MouseInfo.getNumberOfButtons() +" buttons are available.",
870N/A "If there are less then three buttons, press PASS.",
870N/A "1. Press each extra mouse button.",
870N/A "2. For each mouse event its modifiers and ExModifiers will be printed.",
870N/A "3. Verify that they are correct.",
870N/A "4. Press Pass or Fail accordingly."
870N/A };
870N/A// Sysout.createDialogWithInstructions( instructions );
870N/A
870N/A// addMouseListener(adapterTest1);
870N/A try {
870N/A robot = new Robot();
870N/A } catch (Exception e) {
870N/A MessageLogger.reportError("Test failed. "+e);
870N/A }
870N/A }//End init()
870N/A
870N/A public void start() {
870N/A //Get things going. Request focus, set size, et cetera
870N/A setSize(200,200);
870N/A setVisible(true);
870N/A validate();
870N/A if (autorun) {
870N/A testNONE();
870N/A testSHIFT();
870N/A testCTRL();
870N/A testALT();
870N/A } else {
870N/A switch (testModifier){
870N/A case SHIFT:
870N/A this.addMouseListener(adapterTest2);
870N/A break;
870N/A case CTRL:
870N/A this.addMouseListener(adapterTest3);
870N/A break;
870N/A case ALT:
870N/A this.addMouseListener(adapterTest4);
870N/A break;
870N/A default: //NONE by default
870N/A this.addMouseListener(adapterTest1);
870N/A }
870N/A }
870N/A }// start()
870N/A
870N/A //000000000000000000000000000000000000000000000000000000000000000
870N/A public void testNONE(){
870N/A this.addMouseListener(adapterTest1);
870N/A robot.delay(1000);
870N/A robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);
2774N/A for (int i = 3; i< mouseButtonDownMasks.length; i++){
2774N/A System.out.println("testNONE() => " +mouseButtonDownMasks[i] );
2774N/A robot.mousePress(mouseButtonDownMasks[i]);
870N/A robot.delay(100);
2774N/A robot.mouseRelease(mouseButtonDownMasks[i]);
870N/A }
870N/A robot.delay(1000);
870N/A this.removeMouseListener(adapterTest1);
870N/A }
870N/A
870N/A public void testSHIFT(){
870N/A this.addMouseListener(adapterTest2);
870N/A robot.delay(1000);
870N/A robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);
2774N/A for (int i = 3; i< mouseButtonDownMasks.length; i++){
870N/A robot.keyPress(KeyEvent.VK_SHIFT);
2774N/A System.out.println("testSHIFT() => " +mouseButtonDownMasks[i] );
2774N/A robot.mousePress(mouseButtonDownMasks[i]);
870N/A robot.delay(100);
2774N/A robot.mouseRelease(mouseButtonDownMasks[i]);
870N/A robot.keyRelease(KeyEvent.VK_SHIFT);
870N/A }
870N/A robot.delay(1000);
870N/A this.removeMouseListener(adapterTest2);
870N/A }
870N/A
870N/A public void testCTRL(){
870N/A this.addMouseListener(adapterTest3);
870N/A robot.delay(1000);
870N/A robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);
2774N/A for (int i = 3; i< mouseButtonDownMasks.length; i++){
870N/A robot.keyPress(KeyEvent.VK_CONTROL);
2774N/A System.out.println("testCTRL() => " +mouseButtonDownMasks[i] );
2774N/A robot.mousePress(mouseButtonDownMasks[i]);
870N/A robot.delay(100);
2774N/A robot.mouseRelease(mouseButtonDownMasks[i]);
870N/A robot.keyRelease(KeyEvent.VK_CONTROL);
870N/A }
870N/A robot.delay(1000);
870N/A this.removeMouseListener(adapterTest3);
870N/A }
870N/A
870N/A public void testALT(){
870N/A this.addMouseListener(adapterTest4);
870N/A robot.delay(1000);
870N/A robot.mouseMove(getLocationOnScreen().x + getWidth()/2, getLocationOnScreen().y + getHeight()/2);
2774N/A for (int i = 3; i< mouseButtonDownMasks.length; i++){
870N/A robot.keyPress(KeyEvent.VK_ALT);
2774N/A System.out.println("testALT() => " +mouseButtonDownMasks[i] );
2774N/A robot.mousePress(mouseButtonDownMasks[i]);
870N/A robot.delay(100);
2774N/A robot.mouseRelease(mouseButtonDownMasks[i]);
870N/A robot.keyRelease(KeyEvent.VK_ALT);
870N/A }
870N/A robot.delay(1000);
870N/A this.removeMouseListener(adapterTest4);
870N/A }
870N/A
870N/A //**************************************************************************************************
870N/A public static void dumpValues(int button, int modifiers, int modifiersStandard, int modifiersEx, int modifiersExStandard){
870N/A System.out.println("Button = "+button + "Modifiers = "+ modifiers + "standard = "+ modifiersStandard);
870N/A System.out.println("Button = "+button + "ModifiersEx = "+ modifiersEx + "standardEx = "+ modifiersExStandard);
870N/A }
870N/A
870N/A public static void initParams(String []s){
870N/A if (s.length != 3){
870N/A autorun = true;
870N/A debug = false;
870N/A testModifier = NONE;
870N/A } else {
870N/A autorun = Boolean.valueOf(s[0]);
870N/A debug = Boolean.valueOf(s[1]);
870N/A
870N/A if (s[2].equals("NONE")){
870N/A testModifier = NONE;
870N/A }
870N/A if (s[2].equals("SHIFT")){
870N/A testModifier = SHIFT;
870N/A }
870N/A if (s[2].equals("CTRL")){
870N/A testModifier = CTRL;
870N/A }
870N/A if (s[2].equals("ALT")){
870N/A testModifier = ALT;
870N/A }
870N/A }
870N/A MessageLogger.setDebug(debug);
870N/A System.out.println("Autorun : " +autorun);
870N/A System.out.println("Debug mode : " +debug);
870N/A System.out.println("Modifier to verify : " + testModifier);
870N/A }
870N/A
870N/A public static void initAdapters(){
2774N/A adapterTest1 = new CheckingModifierAdapterExtra(NONE);
2774N/A adapterTest2 = new CheckingModifierAdapterExtra(SHIFT);
2774N/A adapterTest3 = new CheckingModifierAdapterExtra(CTRL);
2774N/A adapterTest4 = new CheckingModifierAdapterExtra(ALT);
870N/A }
870N/A
870N/A public static void initVars(){
2774N/A //Init the array of the mouse button masks. It will be used for generating mouse events.
2774N/A mouseButtonDownMasks = new int [MouseInfo.getNumberOfButtons()];
2774N/A for (int i = 0; i < mouseButtonDownMasks.length; i++){
2774N/A mouseButtonDownMasks[i] = InputEvent.getMaskForButton(i+1);
2774N/A System.out.println("MouseArray [i] == "+mouseButtonDownMasks[i]);
870N/A }
870N/A
870N/A // So we need to get the number of extra buttons on the mouse: "MouseInfo.getNumberOfButtons() - 3"
870N/A // and multyply on 3 because each button will generate three events : PRESS, RELEASE and CLICK.
2774N/A int [] tmp = new int [(MouseInfo.getNumberOfButtons()-3)*3];
2774N/A
2774N/A //Fill array of expected results for the case when mouse buttons are only used (no-modifier keys)
870N/A Arrays.fill(tmp, 0);
870N/A for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){
870N/A tmp[i] = mouseButtonDownMasks[j];
870N/A }
870N/A modifiersExStandard = Arrays.copyOf(tmp, tmp.length);
870N/A
2774N/A //Fill array of expected results for the case when mouse buttons are only used with SHIFT modifier key
870N/A Arrays.fill(tmp, InputEvent.SHIFT_DOWN_MASK);
2774N/A for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){
2774N/A System.out.println("modifiersExStandardSHIFT FILLING : " + tmp[i] + " + " + mouseButtonDownMasks[j]);
2774N/A tmp[i] = tmp[i] | mouseButtonDownMasks[j];
870N/A }
870N/A modifiersExStandardSHIFT = Arrays.copyOf(tmp, tmp.length);
870N/A
2774N/A //Fill array of expected results for the case when mouse buttons are only used with CTRL modifier key
870N/A Arrays.fill(tmp, InputEvent.CTRL_DOWN_MASK);
2774N/A for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){
2774N/A System.out.println("modifiersExStandardCTRL FILLING : " + tmp[i] + " + " + mouseButtonDownMasks[j]);
2774N/A tmp[i] = tmp[i] | mouseButtonDownMasks[j];
870N/A }
870N/A modifiersExStandardCTRL = Arrays.copyOf(tmp, tmp.length);
870N/A
2774N/A //Fill array of expected results for the case when mouse buttons are only used with ALT modifier key
870N/A Arrays.fill(tmp, InputEvent.ALT_DOWN_MASK);
2774N/A for (int i = 0, j = 3; i < tmp.length; i = i + 3, j++){
2774N/A System.out.println("modifiersExStandardALT FILLING : " + tmp[i] + " + " + mouseButtonDownMasks[j]);
2774N/A tmp[i] = tmp[i] | mouseButtonDownMasks[j];
870N/A }
870N/A modifiersExStandardALT = Arrays.copyOf(tmp, tmp.length);
870N/A }
870N/A
870N/A public static void main(String []s){
870N/A if (MouseInfo.getNumberOfButtons() < 4){
870N/A System.out.println("There are less then 4 buttons on the mouse. The test may not be accomplished. Skipping.");
870N/A return;
870N/A }
870N/A initVars();
870N/A MouseModifiersUnitTest_Extra frame = new MouseModifiersUnitTest_Extra();
870N/A frame.initParams(s);
870N/A frame.init();
870N/A initAdapters();
870N/A frame.start();
870N/A }
870N/A
870N/A}// class
870N/A
870N/A/* A class that invoke appropriate verification
870N/A * routine with current modifier.
870N/A */
2774N/Aclass CheckingModifierAdapterExtra extends MouseAdapter{
870N/A int modifier;
2774N/A public CheckingModifierAdapterExtra(int modifier){
870N/A this.modifier = modifier;
870N/A }
870N/A
870N/A public void mousePressed(MouseEvent e) {
870N/A System.out.println("PRESSED "+e);
870N/A if (e.getButton() <= MouseEvent.BUTTON3) {
870N/A System.out.println("Standard button affected. Skip.");
870N/A } else {
870N/A MouseModifiersUnitTest_Extra.checkPressedModifiersTest(modifier, e);
870N/A }
870N/A }
870N/A public void mouseReleased(MouseEvent e) {
870N/A System.out.println("RELEASED "+e);
870N/A if (e.getButton() <= MouseEvent.BUTTON3) {
870N/A System.out.println("Standard button affected. Skip.");
870N/A } else {
870N/A MouseModifiersUnitTest_Extra.checkReleasedModifiersTest(modifier, e);
870N/A }
870N/A }
870N/A public void mouseClicked(MouseEvent e) {
870N/A System.out.println("CLICKED "+e);
870N/A if (e.getButton() <= MouseEvent.BUTTON3) {
870N/A System.out.println("Standard button affected. Skip.");
870N/A } else {
870N/A MouseModifiersUnitTest_Extra.checkClickedModifiersTest(modifier, e);
870N/A }
870N/A }
870N/A}
870N/A//Utility class that could report a message depending on current purpose of the test run
870N/Aclass MessageLogger{
870N/A private static boolean debug;
870N/A
870N/A public static void setDebug(boolean d){
870N/A debug = d;
870N/A log("Switch to "+ ((debug)?"debug":"trial") +" mode");
870N/A }
870N/A
870N/A public static void log(String message){
870N/A System.out.println(message);
870N/A }
870N/A
870N/A public static void reportError(String message){
870N/A if (debug){
870N/A System.out.println(message);
870N/A } else {
870N/A throw new RuntimeException(message);
870N/A }
870N/A }
870N/A}