1 /*
   2  * Copyright (c) 2005, 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 
  24  /*
  25   @test
  26   @key headful
  27   @bug 6273031
  28   @summary  PIT. Choice drop down does not close once it is right clicked to show a popup menu
  29   @author andrei.dmitriev: area=awt.window
  30   @library ../../regtesthelpers
  31   @build Util
  32   @run main GrabSequence
  33 */
  34 
  35 import java.awt.*;
  36 import java.awt.event.*;
  37 import test.java.awt.regtesthelpers.Util;
  38 
  39 public class GrabSequence
  40 {
  41     private static void init()
  42     {
  43         String toolkit = Toolkit.getDefaultToolkit().getClass().getName();
  44         if ( toolkit.equals("sun.awt.motif.MToolkit")){
  45             System.out.println("This test is for XToolkit and WToolkit only. Now using " + toolkit + ". Automatically passed.");
  46             return;
  47         }
  48         Sysout.createDialog();
  49         Frame frame = new Frame("Frame");
  50         frame.setBackground(Color.green);
  51         frame.setForeground(Color.green);
  52         frame.setLayout(new FlowLayout());
  53         Choice ch = new Choice();
  54         ch.setBackground(Color.red);
  55         ch.setForeground(Color.red);
  56         ch.addItem("One");
  57         ch.addItem("Two");
  58         ch.addItem("Three");
  59         ch.addItem("Four");
  60         ch.addItem("Five");
  61         final PopupMenu pm = new PopupMenu();
  62 
  63         MenuItem i1 = new MenuItem("Item1");
  64         MenuItem i2 = new MenuItem("Item2");
  65         MenuItem i3 = new MenuItem("Item3");
  66         pm.add(i1);
  67         pm.add(i2);
  68         pm.add(i3);
  69         ch.add(pm);
  70         ch.addMouseListener(new MouseAdapter() {
  71             public void mousePressed(MouseEvent event) {
  72                 if (event.isPopupTrigger()) {
  73                     System.out.println("mousePressed"+event);
  74                     pm.show((Choice)event.getSource(), event.getX(), event.getY());
  75                 }
  76             }
  77 
  78             public void mouseReleased(MouseEvent event) {
  79                 if (event.isPopupTrigger()) {
  80                     System.out.println("mouseReleased"+event);
  81                     pm.show((Choice)event.getSource(), event.getX(), event.getY());
  82                 }
  83             }
  84         });
  85         frame.add(ch);
  86         frame.setSize(200, 200);
  87 
  88 
  89         frame.setVisible(true);
  90 
  91         try {
  92             Robot robot = new Robot();
  93             Util.waitForIdle(robot);
  94             robot.mouseMove(ch.getLocationOnScreen().x + ch.getWidth()/2,
  95                             ch.getLocationOnScreen().y + ch.getHeight()/2 );
  96             robot.mousePress(InputEvent.BUTTON1_MASK);
  97             robot.delay(100);
  98             robot.mouseRelease(InputEvent.BUTTON1_MASK);
  99             Util.waitForIdle(robot);
 100 
 101             Color color = robot.getPixelColor(ch.getLocationOnScreen().x + ch.getWidth()/2,
 102                                               ch.getLocationOnScreen().y + ch.getHeight()*4);
 103             System.out.println("1. Color is " + color);
 104             if (!color.equals(Color.red)){
 105                 GrabSequence.fail("Test failed. Choice is still not opened. ");
 106             }
 107 
 108             robot.mousePress(InputEvent.BUTTON3_MASK);
 109             robot.delay(100);
 110             robot.mouseRelease(InputEvent.BUTTON3_MASK);
 111             Util.waitForIdle(robot);
 112 
 113             color = robot.getPixelColor(ch.getLocationOnScreen().x + ch.getWidth()/2,
 114                                               ch.getLocationOnScreen().y + ch.getHeight()*2);
 115             System.out.println("2. Color is " + color);
 116             if (color.equals(Color.green)){
 117                 GrabSequence.fail("Test failed. popup menu is not opened. ");
 118             }
 119 
 120             color = robot.getPixelColor(ch.getLocationOnScreen().x + ch.getWidth()/2,
 121                                               ch.getLocationOnScreen().y + ch.getHeight()*4);
 122             System.out.println("3. Color is " + color);
 123             if (!color.equals(Color.green) && !Toolkit.getDefaultToolkit().getClass().getName().equals("sun.awt.windows.WToolkit")){
 124                 GrabSequence.fail("Test failed. Choice is still opened. ");
 125             }
 126         } catch(AWTException e){
 127             GrabSequence.fail("Test interrupted."+e);
 128         }
 129 
 130         GrabSequence.pass();
 131     }//End  init()
 132 
 133 
 134 
 135     /*****************************************************
 136      * Standard Test Machinery Section
 137      * DO NOT modify anything in this section -- it's a
 138      * standard chunk of code which has all of the
 139      * synchronisation necessary for the test harness.
 140      * By keeping it the same in all tests, it is easier
 141      * to read and understand someone else's test, as
 142      * well as insuring that all tests behave correctly
 143      * with the test harness.
 144      * There is a section following this for test-
 145      * classes
 146      ******************************************************/
 147     private static boolean theTestPassed = false;
 148     private static boolean testGeneratedInterrupt = false;
 149     private static String failureMessage = "";
 150 
 151     private static Thread mainThread = null;
 152 
 153     private static int sleepTime = 300000;
 154 
 155     // Not sure about what happens if multiple of this test are
 156     //  instantiated in the same VM.  Being static (and using
 157     //  static vars), it aint gonna work.  Not worrying about
 158     //  it for now.
 159     public static void main( String args[] ) throws InterruptedException
 160     {
 161         mainThread = Thread.currentThread();
 162         try
 163         {
 164             init();
 165         }
 166         catch( TestPassedException e )
 167         {
 168             //The test passed, so just return from main and harness will
 169             // interepret this return as a pass
 170             return;
 171         }
 172         //At this point, neither test pass nor test fail has been
 173         // called -- either would have thrown an exception and ended the
 174         // test, so we know we have multiple threads.
 175 
 176         //Test involves other threads, so sleep and wait for them to
 177         // called pass() or fail()
 178         try
 179         {
 180             Thread.sleep( sleepTime );
 181             //Timed out, so fail the test
 182             throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
 183         }
 184         catch (InterruptedException e)
 185         {
 186             //The test harness may have interrupted the test.  If so, rethrow the exception
 187             // so that the harness gets it and deals with it.
 188             if( ! testGeneratedInterrupt ) throw e;
 189 
 190             //reset flag in case hit this code more than once for some reason (just safety)
 191             testGeneratedInterrupt = false;
 192 
 193             if ( theTestPassed == false )
 194             {
 195                 throw new RuntimeException( failureMessage );
 196             }
 197         }
 198 
 199     }//main
 200 
 201     public static synchronized void setTimeoutTo( int seconds )
 202     {
 203         sleepTime = seconds * 1000;
 204     }
 205 
 206     public static synchronized void pass()
 207     {
 208         Sysout.println( "The test passed." );
 209         Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
 210         //first check if this is executing in main thread
 211         if ( mainThread == Thread.currentThread() )
 212         {
 213             //Still in the main thread, so set the flag just for kicks,
 214             // and throw a test passed exception which will be caught
 215             // and end the test.
 216             theTestPassed = true;
 217             throw new TestPassedException();
 218         }
 219         theTestPassed = true;
 220         testGeneratedInterrupt = true;
 221         mainThread.interrupt();
 222     }//pass()
 223 
 224     public static synchronized void fail()
 225     {
 226         //test writer didn't specify why test failed, so give generic
 227         fail( "it just plain failed! :-)" );
 228     }
 229 
 230     public static synchronized void fail( String whyFailed )
 231     {
 232         Sysout.println( "The test failed: " + whyFailed );
 233         Sysout.println( "The test is over, hit  Ctl-C to stop Java VM" );
 234         //check if this called from main thread
 235         if ( mainThread == Thread.currentThread() )
 236         {
 237             //If main thread, fail now 'cause not sleeping
 238             throw new RuntimeException( whyFailed );
 239         }
 240         theTestPassed = false;
 241         testGeneratedInterrupt = true;
 242         failureMessage = whyFailed;
 243         mainThread.interrupt();
 244     }//fail()
 245 
 246 }// class
 247 
 248 //This exception is used to exit from any level of call nesting
 249 // when it's determined that the test has passed, and immediately
 250 // end the test.
 251 class TestPassedException extends RuntimeException
 252 {
 253 }
 254 
 255 //*********** End Standard Test Machinery Section **********
 256 
 257 
 258 //************ Begin classes defined for the test ****************
 259 
 260 // if want to make listeners, here is the recommended place for them, then instantiate
 261 //  them in init()
 262 
 263 /* Example of a class which may be written as part of a test
 264 class NewClass implements anInterface
 265  {
 266    static int newVar = 0;
 267 
 268    public void eventDispatched(AWTEvent e)
 269     {
 270       //Counting events to see if we get enough
 271       eventCount++;
 272 
 273       if( eventCount == 20 )
 274        {
 275          //got enough events, so pass
 276 
 277          AutomaticMainTest.pass();
 278        }
 279       else if( tries == 20 )
 280        {
 281          //tried too many times without getting enough events so fail
 282 
 283          AutomaticMainTest.fail();
 284        }
 285 
 286     }// eventDispatched()
 287 
 288  }// NewClass class
 289 
 290 */
 291 
 292 
 293 //************** End classes defined for the test *******************
 294 
 295 
 296 
 297 
 298 /****************************************************
 299  Standard Test Machinery
 300  DO NOT modify anything below -- it's a standard
 301   chunk of code whose purpose is to make user
 302   interaction uniform, and thereby make it simpler
 303   to read and understand someone else's test.
 304  ****************************************************/
 305 
 306 /**
 307  This is part of the standard test machinery.
 308  It creates a dialog (with the instructions), and is the interface
 309   for sending text messages to the user.
 310  To print the instructions, send an array of strings to Sysout.createDialog
 311   WithInstructions method.  Put one line of instructions per array entry.
 312  To display a message for the tester to see, simply call Sysout.println
 313   with the string to be displayed.
 314  This mimics System.out.println but works within the test harness as well
 315   as standalone.
 316  */
 317 
 318 class Sysout
 319 {
 320     private static TestDialog dialog;
 321 
 322     public static void createDialogWithInstructions( String[] instructions )
 323     {
 324         dialog = new TestDialog( new Frame(), "Instructions" );
 325         dialog.printInstructions( instructions );
 326         dialog.setVisible(true);
 327         println( "Any messages for the tester will display here." );
 328     }
 329 
 330     public static void createDialog( )
 331     {
 332         dialog = new TestDialog( new Frame(), "Instructions" );
 333         String[] defInstr = { "Instructions will appear here. ", "" } ;
 334         dialog.printInstructions( defInstr );
 335         dialog.setVisible(true);
 336         println( "Any messages for the tester will display here." );
 337     }
 338 
 339 
 340     public static void printInstructions( String[] instructions )
 341     {
 342         dialog.printInstructions( instructions );
 343     }
 344 
 345 
 346     public static void println( String messageIn )
 347     {
 348         dialog.displayMessage( messageIn );
 349         System.out.println(messageIn);
 350     }
 351 
 352 }// Sysout  class
 353 
 354 /**
 355   This is part of the standard test machinery.  It provides a place for the
 356    test instructions to be displayed, and a place for interactive messages
 357    to the user to be displayed.
 358   To have the test instructions displayed, see Sysout.
 359   To have a message to the user be displayed, see Sysout.
 360   Do not call anything in this dialog directly.
 361   */
 362 class TestDialog extends Dialog
 363 {
 364 
 365     TextArea instructionsText;
 366     TextArea messageText;
 367     int maxStringLength = 80;
 368 
 369     //DO NOT call this directly, go through Sysout
 370     public TestDialog( Frame frame, String name )
 371     {
 372         super( frame, name );
 373         int scrollBoth = TextArea.SCROLLBARS_BOTH;
 374         instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
 375         add( "North", instructionsText );
 376 
 377         messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
 378         add("Center", messageText);
 379 
 380         pack();
 381 
 382         setVisible(true);
 383     }// TestDialog()
 384 
 385     //DO NOT call this directly, go through Sysout
 386     public void printInstructions( String[] instructions )
 387     {
 388         //Clear out any current instructions
 389         instructionsText.setText( "" );
 390 
 391         //Go down array of instruction strings
 392 
 393         String printStr, remainingStr;
 394         for( int i=0; i < instructions.length; i++ )
 395         {
 396             //chop up each into pieces maxSringLength long
 397             remainingStr = instructions[ i ];
 398             while( remainingStr.length() > 0 )
 399             {
 400                 //if longer than max then chop off first max chars to print
 401                 if( remainingStr.length() >= maxStringLength )
 402                 {
 403                     //Try to chop on a word boundary
 404                     int posOfSpace = remainingStr.
 405                         lastIndexOf( ' ', maxStringLength - 1 );
 406 
 407                     if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
 408 
 409                     printStr = remainingStr.substring( 0, posOfSpace + 1 );
 410                     remainingStr = remainingStr.substring( posOfSpace + 1 );
 411                 }
 412                 //else just print
 413                 else
 414                 {
 415                     printStr = remainingStr;
 416                     remainingStr = "";
 417                 }
 418 
 419                 instructionsText.append( printStr + "\n" );
 420 
 421             }// while
 422 
 423         }// for
 424 
 425     }//printInstructions()
 426 
 427     //DO NOT call this directly, go through Sysout
 428     public void displayMessage( String messageIn )
 429     {
 430         messageText.append( messageIn + "\n" );
 431         System.out.println(messageIn);
 432     }
 433 
 434 }// TestDialog  class