blob: 16255e0678d887072d35e31ec350313d91ed312c [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 6589530
27 @summary Mixing code should correctly handle insertion of components with setComponentZOrder.
28 @author antohny.petrov@...: area=awt.mixing
29 @run main setComponentZOrder
30*/
31
32/**
33 * setComponentZOrder.java
34 *
35 * summary: Mixing code should correctly handle insertion of components with setComponentZOrder.
36 */
37
38import java.awt.*;
39import java.awt.event.*;
40
41
42public class setComponentZOrder
43{
44
45 //*** test-writer defined static variables go here ***
46
47
48 private static void init()
49 {
50 //*** Create instructions for the user here ***
51
52 String[] instructions =
53 {
54 "This is an AUTOMATIC test, simply wait until it is done.",
55 "The result (passed or failed) will be shown in the",
56 "message window below."
57 };
58 Sysout.createDialog( );
59 Sysout.printInstructions( instructions );
60
61 try {
62 Container c = new Container();
63 Button b = new Button("b");
64 c.setComponentZOrder(b, 0);
65 } catch (ArrayIndexOutOfBoundsException e) {
66 e.printStackTrace();
67 fail("The setComponentZOrder method used to insert a component caused the mixing code to throw the exception: " + e);
68 }
69
70 pass();
71
72 }//End init()
73
74
75
76 /*****************************************************
77 * Standard Test Machinery Section
78 * DO NOT modify anything in this section -- it's a
79 * standard chunk of code which has all of the
80 * synchronisation necessary for the test harness.
81 * By keeping it the same in all tests, it is easier
82 * to read and understand someone else's test, as
83 * well as insuring that all tests behave correctly
84 * with the test harness.
85 * There is a section following this for test-
86 * classes
87 ******************************************************/
88 private static boolean theTestPassed = false;
89 private static boolean testGeneratedInterrupt = false;
90 private static String failureMessage = "";
91
92 private static Thread mainThread = null;
93
94 private static int sleepTime = 300000;
95
96 // Not sure about what happens if multiple of this test are
97 // instantiated in the same VM. Being static (and using
98 // static vars), it aint gonna work. Not worrying about
99 // it for now.
100 public static void main( String args[] ) throws InterruptedException
101 {
102 mainThread = Thread.currentThread();
103 try
104 {
105 init();
106 }
107 catch( TestPassedException e )
108 {
109 //The test passed, so just return from main and harness will
110 // interepret this return as a pass
111 return;
112 }
113 //At this point, neither test pass nor test fail has been
114 // called -- either would have thrown an exception and ended the
115 // test, so we know we have multiple threads.
116
117 //Test involves other threads, so sleep and wait for them to
118 // called pass() or fail()
119 try
120 {
121 Thread.sleep( sleepTime );
122 //Timed out, so fail the test
123 throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" );
124 }
125 catch (InterruptedException e)
126 {
127 //The test harness may have interrupted the test. If so, rethrow the exception
128 // so that the harness gets it and deals with it.
129 if( ! testGeneratedInterrupt ) throw e;
130
131 //reset flag in case hit this code more than once for some reason (just safety)
132 testGeneratedInterrupt = false;
133
134 if ( theTestPassed == false )
135 {
136 throw new RuntimeException( failureMessage );
137 }
138 }
139
140 }//main
141
142 public static synchronized void setTimeoutTo( int seconds )
143 {
144 sleepTime = seconds * 1000;
145 }
146
147 public static synchronized void pass()
148 {
149 Sysout.println( "The test passed." );
150 Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
151 //first check if this is executing in main thread
152 if ( mainThread == Thread.currentThread() )
153 {
154 //Still in the main thread, so set the flag just for kicks,
155 // and throw a test passed exception which will be caught
156 // and end the test.
157 theTestPassed = true;
158 throw new TestPassedException();
159 }
160 theTestPassed = true;
161 testGeneratedInterrupt = true;
162 mainThread.interrupt();
163 }//pass()
164
165 public static synchronized void fail()
166 {
167 //test writer didn't specify why test failed, so give generic
168 fail( "it just plain failed! :-)" );
169 }
170
171 public static synchronized void fail( String whyFailed )
172 {
173 Sysout.println( "The test failed: " + whyFailed );
174 Sysout.println( "The test is over, hit Ctl-C to stop Java VM" );
175 //check if this called from main thread
176 if ( mainThread == Thread.currentThread() )
177 {
178 //If main thread, fail now 'cause not sleeping
179 throw new RuntimeException( whyFailed );
180 }
181 theTestPassed = false;
182 testGeneratedInterrupt = true;
183 failureMessage = whyFailed;
184 mainThread.interrupt();
185 }//fail()
186
187}// class setComponentZOrder
188
189//This exception is used to exit from any level of call nesting
190// when it's determined that the test has passed, and immediately
191// end the test.
192class TestPassedException extends RuntimeException
193{
194}
195
196//*********** End Standard Test Machinery Section **********
197
198
199//************ Begin classes defined for the test ****************
200
201// if want to make listeners, here is the recommended place for them, then instantiate
202// them in init()
203
204/* Example of a class which may be written as part of a test
205class NewClass implements anInterface
206 {
207 static int newVar = 0;
208
209 public void eventDispatched(AWTEvent e)
210 {
211 //Counting events to see if we get enough
212 eventCount++;
213
214 if( eventCount == 20 )
215 {
216 //got enough events, so pass
217
218 setComponentZOrder.pass();
219 }
220 else if( tries == 20 )
221 {
222 //tried too many times without getting enough events so fail
223
224 setComponentZOrder.fail();
225 }
226
227 }// eventDispatched()
228
229 }// NewClass class
230
231*/
232
233
234//************** End classes defined for the test *******************
235
236
237
238
239/****************************************************
240 Standard Test Machinery
241 DO NOT modify anything below -- it's a standard
242 chunk of code whose purpose is to make user
243 interaction uniform, and thereby make it simpler
244 to read and understand someone else's test.
245 ****************************************************/
246
247/**
248 This is part of the standard test machinery.
249 It creates a dialog (with the instructions), and is the interface
250 for sending text messages to the user.
251 To print the instructions, send an array of strings to Sysout.createDialog
252 WithInstructions method. Put one line of instructions per array entry.
253 To display a message for the tester to see, simply call Sysout.println
254 with the string to be displayed.
255 This mimics System.out.println but works within the test harness as well
256 as standalone.
257 */
258
259class Sysout
260{
261 private static TestDialog dialog;
262
263 public static void createDialogWithInstructions( String[] instructions )
264 {
265 dialog = new TestDialog( new Frame(), "Instructions" );
266 dialog.printInstructions( instructions );
267 dialog.setVisible(true);
268 println( "Any messages for the tester will display here." );
269 }
270
271 public static void createDialog( )
272 {
273 dialog = new TestDialog( new Frame(), "Instructions" );
274 String[] defInstr = { "Instructions will appear here. ", "" } ;
275 dialog.printInstructions( defInstr );
276 dialog.setVisible(true);
277 println( "Any messages for the tester will display here." );
278 }
279
280
281 public static void printInstructions( String[] instructions )
282 {
283 dialog.printInstructions( instructions );
284 }
285
286
287 public static void println( String messageIn )
288 {
289 dialog.displayMessage( messageIn );
290 System.out.println(messageIn);
291 }
292
293}// Sysout class
294
295/**
296 This is part of the standard test machinery. It provides a place for the
297 test instructions to be displayed, and a place for interactive messages
298 to the user to be displayed.
299 To have the test instructions displayed, see Sysout.
300 To have a message to the user be displayed, see Sysout.
301 Do not call anything in this dialog directly.
302 */
303class TestDialog extends Dialog
304{
305
306 TextArea instructionsText;
307 TextArea messageText;
308 int maxStringLength = 80;
309
310 //DO NOT call this directly, go through Sysout
311 public TestDialog( Frame frame, String name )
312 {
313 super( frame, name );
314 int scrollBoth = TextArea.SCROLLBARS_BOTH;
315 instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
316 add( "North", instructionsText );
317
318 messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
319 add("Center", messageText);
320
321 pack();
322
323 setVisible(true);
324 }// TestDialog()
325
326 //DO NOT call this directly, go through Sysout
327 public void printInstructions( String[] instructions )
328 {
329 //Clear out any current instructions
330 instructionsText.setText( "" );
331
332 //Go down array of instruction strings
333
334 String printStr, remainingStr;
335 for( int i=0; i < instructions.length; i++ )
336 {
337 //chop up each into pieces maxSringLength long
338 remainingStr = instructions[ i ];
339 while( remainingStr.length() > 0 )
340 {
341 //if longer than max then chop off first max chars to print
342 if( remainingStr.length() >= maxStringLength )
343 {
344 //Try to chop on a word boundary
345 int posOfSpace = remainingStr.
346 lastIndexOf( ' ', maxStringLength - 1 );
347
348 if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
349
350 printStr = remainingStr.substring( 0, posOfSpace + 1 );
351 remainingStr = remainingStr.substring( posOfSpace + 1 );
352 }
353 //else just print
354 else
355 {
356 printStr = remainingStr;
357 remainingStr = "";
358 }
359
360 instructionsText.append( printStr + "\n" );
361
362 }// while
363
364 }// for
365
366 }//printInstructions()
367
368 //DO NOT call this directly, go through Sysout
369 public void displayMessage( String messageIn )
370 {
371 messageText.append( messageIn + "\n" );
372 System.out.println(messageIn);
373 }
374
375}// TestDialog class