blob: 6a38dfb2b975a8dc7451f12826001a43d924cb1c [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2007 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/*
25 @test
26 @bug 6552803
27 @summary moveToFront shouldn't remove peers of HW components
28 @author anthony.petrov@...: area=awt.container
29 @library ../../regtesthelpers
30 @build Util
31 @run main JInternalFrameTest
32*/
33
34/**
35 * JInternalFrameTest.java
36 *
37 * summary: movtToFront invoked on the JInternalFrame shouldn't
38 * recreate peers of HW descendants of the JInternalFrame.
39 */
40
41import java.awt.*;
42import java.awt.event.*;
43import java.beans.PropertyVetoException;
44import javax.swing.*;
45import test.java.awt.regtesthelpers.Util;
46
47public class JInternalFrameTest
48{
49 // Indicates whether the removeNotify() was invoked on the HW Canvas
50 static volatile boolean isRemoveNotify = false;
51
52 // The HW Canvas class.
53 private static final class MyCanvas extends Canvas {
54 private final Color background;
55 public MyCanvas(Color background) {
56 this.background = background;
57 setPreferredSize(new Dimension(100, 100));
58 }
59
60 public void paint(Graphics g) {
61 g.setColor(background);
62 g.fillRect(0, 0, getWidth(), getHeight());
63 }
64
65 public void addNotify() {
66 super.addNotify();
67 System.err.println("addNotify() on " + background);
68 }
69
70 public void removeNotify() {
71 super.removeNotify();
72 isRemoveNotify = true;
73 System.err.println("removeNotify() on " + background);
74 Thread.dumpStack();
75 }
76 }
77
78
79 private static void init()
80 {
81 //*** Create instructions for the user here ***
82
83 String[] instructions =
84 {
85 "This is an AUTOMATIC test, simply wait until it is done.",
86 "The result (passed or failed) will be shown in the",
87 "message window below."
88 };
89 Sysout.createDialog( );
90 Sysout.printInstructions( instructions );
91
92 // We create a JFrame with two JInternalFrame.
93 // Each JInternalFrame contains a HW Canvas component.
94 JFrame jframe = new JFrame("mixing test");
95 JDesktopPane desktop = new JDesktopPane();
96 jframe.setContentPane(desktop);
97 JInternalFrame iframe1 = new JInternalFrame("iframe 1");
98 iframe1.setIconifiable(true);
99 iframe1.add(new MyCanvas(Color.RED));
100 iframe1.setBounds(10, 10, 100, 100);
101 iframe1.setVisible(true);
102 desktop.add(iframe1);
103 JInternalFrame iframe2 = new JInternalFrame("iframe 2");
104 iframe2.setIconifiable(true);
105 iframe2.add(new MyCanvas(Color.BLUE));
106 iframe2.setBounds(50, 50, 100, 100);
107 iframe2.setVisible(true);
108 desktop.add(iframe2);
109
110 jframe.setSize(300, 300);
111 jframe.setVisible(true);
112
113 // Wait until everything gets shown
114 Util.waitForIdle(null);
115
116 // Now cause a couple of z-order changing operations
117 iframe2.moveToFront();
118 Util.waitForIdle(null);
119 iframe1.moveToFront();
120 Util.waitForIdle(null);
121 iframe2.moveToFront();
122
123 // Wait until all the operations complete
124 Util.waitForIdle(null);
125
126 if (isRemoveNotify) {
127 fail("The removeNotify() was invoked on the HW Canvas");
128 }
129 JInternalFrameTest.pass();
130
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 JInternalFrameTest
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.
251class 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
264class 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 JInternalFrameTest.pass();
278 }
279 else if( tries == 20 )
280 {
281 //tried too many times without getting enough events so fail
282
283 JInternalFrameTest.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
318class 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 */
362class 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