1 /*
2  * This file is part of the LibreOffice project.
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7  *
8  * This file incorporates work covered by the following license notice:
9  *
10  *   Licensed to the Apache Software Foundation (ASF) under one or more
11  *   contributor license agreements. See the NOTICE file distributed
12  *   with this work for additional information regarding copyright
13  *   ownership. The ASF licenses this file to you under the Apache
14  *   License, Version 2.0 (the "License"); you may not use this file
15  *   except in compliance with the License. You may obtain a copy of
16  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
17  */
18 
19 package ifc.awt;
20 
21 import com.sun.star.awt.FocusEvent;
22 import com.sun.star.awt.KeyEvent;
23 import com.sun.star.awt.MouseEvent;
24 import com.sun.star.awt.PaintEvent;
25 import com.sun.star.awt.Point;
26 import com.sun.star.awt.PosSize;
27 import com.sun.star.awt.Rectangle;
28 import com.sun.star.awt.Size;
29 import com.sun.star.awt.WindowEvent;
30 import com.sun.star.awt.XFocusListener;
31 import com.sun.star.awt.XKeyListener;
32 import com.sun.star.awt.XMouseListener;
33 import com.sun.star.awt.XMouseMotionListener;
34 import com.sun.star.awt.XPaintListener;
35 import com.sun.star.awt.XWindow;
36 import com.sun.star.awt.XWindowListener;
37 import com.sun.star.drawing.XControlShape;
38 import com.sun.star.lang.EventObject;
39 import lib.MultiMethodTest;
40 import util.ValueComparer;
41 
42 /**
43 * Testing <code>com.sun.star.awt.XWindow</code>
44 * interface methods :
45 * <ul>
46 *  <li><code> setPosSize()</code></li>
47 *  <li><code> getPosSize()</code></li>
48 *  <li><code> setVisible()</code></li>
49 *  <li><code> setEnable()</code></li>
50 *  <li><code> setFocus()</code></li>
51 *  <li><code> addWindowListener()</code></li>
52 *  <li><code> removeWindowListener()</code></li>
53 *  <li><code> addFocusListener()</code></li>
54 *  <li><code> removeFocusListener()</code></li>
55 *  <li><code> addKeyListener()</code></li>
56 *  <li><code> removeKeyListener()</code></li>
57 *  <li><code> addMouseListener()</code></li>
58 *  <li><code> removeMouseListener()</code></li>
59 *  <li><code> addMouseMotionListener()</code></li>
60 *  <li><code> removeMouseMotionListener()</code></li>
61 *  <li><code> addPaintListener()</code></li>
62 *  <li><code> removePaintListener()</code></li>
63 * </ul> <p>
64 * This test needs the following object relations :
65 * <ul>
66 *  <li> <code>'XWindow.AnotherWindow'</code> (of type <code>XWindow</code>):
67 *   Some another window which can gain focus so the tested one
68 *   must lost it. </li>
69 *  <li> <code>'XWindow.ControlShape'</code> <b>optional</b>
70 *   (of type <code>XControlShape</code>):
71 *   Some shapes can't change their size within fixed ControlShape
72 *   and their size could be changed only if size of container
73 *   ControlShape is changed. For such shapes this relation should
74 *   be passed for proper <code>addWindowListener</code> test. </li>
75 * </ul> <p>
76 * Test is <b> NOT </b> multithread compliant. <p>
77 * @see com.sun.star.awt.XWindow
78 */
79 public class _XWindow extends MultiMethodTest {
80     public XWindow oObj = null;
81     private Rectangle posSize = null ;
82     private XWindow win = null;
83 
84     /**
85     * Test calls the method. <p>
86     * Has <b> OK </b> status if the method does not return null.
87     */
_getPosSize()88     public void _getPosSize() {
89         posSize = oObj.getPosSize() ;
90         tRes.tested("getPosSize()", posSize != null) ;
91     }
92 
93     /**
94     * After defining Rectangle structure to be set, test calls the method. <p>
95     * Has <b> OK </b> status if structure obtained using getPosSize() is
96     * equal to structure previously set using setPosSize(). <p>
97     * The following method tests are to be completed successfully before :
98     * <ul>
99     *  <li> <code> getPosSize() </code> :  returns the outer bounds of
100     *  the window </li>
101     * </ul>
102     */
_setPosSize()103     public void _setPosSize() {
104         Rectangle newRec = new Rectangle();
105 
106         requiredMethod("getPosSize()");
107         newRec.X = posSize.X + 1;
108         newRec.Y = posSize.Y + 1;
109         newRec.Width = posSize.Width - 3;
110         newRec.Height = posSize.Height - 3;
111         oObj.setPosSize(newRec.X, newRec.Y, newRec.Width, newRec.Height,
112             PosSize.POSSIZE);
113         Rectangle gPS = oObj.getPosSize();
114         log.println("Was : (" + posSize.X + ", " + posSize.Y + ", " +
115             posSize.Width + ", " + posSize.Height + "), ");
116         log.println("Set : (" + newRec.X + ", " + newRec.Y + ", " +
117             newRec.Width + ", " + newRec.Height + "), ");
118         log.println("Get : (" + gPS.X + ", " + gPS.Y + ", " +
119             gPS.Width + ", " + gPS.Height + "). ");
120         tRes.tested("setPosSize()", ValueComparer.equalValue(newRec, gPS) );
121     }
122 
123     /**
124     * At first object relation 'XWindow.AnotherWindow' is obtained.
125     * Then test calls the methods of two 'XWindow' objects several times to be
126     * sure that the focus has changed. <p>
127     * Has <b> OK </b> status if the method successfully returns
128     * and no exceptions were thrown.
129     */
_setFocus()130     public void _setFocus() {
131         win = (XWindow) tEnv.getObjRelation("XWindow.AnotherWindow");
132         oObj.setFocus();
133         win.setFocus();
134         oObj.setFocus();
135         tRes.tested("setFocus()", true);
136     }
137 
138     /**
139     * Test calls the method twice with two parameters: 'true' and 'false'. <p>
140     * Has <b> OK </b> status if the method successfully returns
141     * and no exceptions were thrown.
142     */
_setVisible()143     public void _setVisible() {
144         oObj.setVisible(false);
145         oObj.setVisible(true);
146         tRes.tested("setVisible()", true);
147     }
148 
149     /**
150     * Test calls the method twice with two parameters: 'true' and 'false'. <p>
151     * Has <b> OK </b> status if the method successfully returns
152     * and no exceptions were thrown.
153     */
_setEnable()154     public void _setEnable() {
155         oObj.setEnable(false);
156         oObj.setEnable(true);
157         tRes.tested("setEnable()", true);
158     }
159 
160 
161     /**
162     * A class we use to test addWindowListener() and
163     * removeWindowListener()
164     */
165     public static class TestWindowListener implements XWindowListener {
166         public boolean resized = false ;
167         public boolean moved = false ;
168         public boolean hidden = false ;
169         public boolean shown = false ;
170 
init()171         public void init() {
172             resized = false ;
173             moved = false ;
174             hidden = false ;
175             shown = false ;
176         }
177 
windowResized(WindowEvent e)178         public void windowResized(WindowEvent e) {
179             resized = true ;
180         }
windowMoved(WindowEvent e)181         public void windowMoved(WindowEvent e) {
182             moved = true ;
183         }
windowHidden(EventObject e)184         public void windowHidden(EventObject e) {
185             hidden = true ;
186         }
windowShown(EventObject e)187         public void windowShown(EventObject e) {
188             shown = true ;
189         }
disposing(EventObject e)190         public void disposing(EventObject e) {}
191 
192     }
193 
194     private final TestWindowListener wListener = new TestWindowListener() ;
195 
196 
197     /**
198     * Test calls the method. Then we check if listener's methods were called
199     * when we move, resize, hide and show the window. The resizing is
200     * performed depending on 'XWindow.ControlShape' existence. If this
201     * relation exists then the size and position of container control
202     * shape is changed, else the position and size of window itself is
203     * changed<p>
204     *
205     * Has <b> OK </b> status if methods of wListener were called when
206     * corresponding events occurred. <p>
207     *
208     * The following method tests are to be executed before :
209     * <ul>
210     *  <li> <code> setPosSize() </code>: sets the outer bounds of the
211     *  window</li>
212     *  <li> <code> setVisible() </code>: shows or hides the window
213     *  depending on the parameter</li>
214     * </ul>
215     */
_addWindowListener()216     public void _addWindowListener() {
217         executeMethod("setPosSize()");
218         executeMethod("setVisible()");
219         boolean result = true ;
220 
221         oObj.addWindowListener(wListener);
222 
223         // testing wListener.windowMoved()
224         XControlShape ctrlShape = (XControlShape)
225             tEnv.getObjRelation("XWindow.ControlShape");
226         log.println("change object position and size...");
227 
228         if (ctrlShape != null) {
229             try {
230                 Size sz = ctrlShape.getSize();
231                 sz.Height += 100;
232                 ctrlShape.setSize(sz);
233                 Point pos = ctrlShape.getPosition();
234                 pos.X += 100 ;
235                 ctrlShape.setPosition(pos);
236             } catch (com.sun.star.beans.PropertyVetoException e) {
237                 log.println("Couldn't change size or position: ");
238                 e.printStackTrace(log);
239             }
240         } else {
241             oObj.setPosSize(posSize.X + 2, 0, 0, 0, PosSize.X);
242             oObj.setPosSize(0, 0, 100, 100, PosSize.WIDTH);
243         }
244 
245         waitForEventIdle();
246         boolean res = wListener.resized && wListener.moved &&
247             !wListener.hidden && !wListener.shown;
248         result &= res;
249         if (!res) {
250             log.println("\twindowHidden()  wasn't called: " + !wListener.hidden);
251             log.println("\twindowShown()   wasn't called: " + !wListener.shown);
252             log.println("\twindowResized()    was called: " + wListener.resized);
253             log.println("\twindowMoved()      was called: " + wListener.moved);
254         } else {
255             log.println("windowMoved() and windowResized() was called");
256         }
257 
258         // testing wListener.windowHidden()
259         wListener.init();
260         waitForEventIdle();
261         log.println("set object invisible...");
262         oObj.setVisible(false);
263         waitForEventIdle();
264         res = wListener.hidden && !wListener.resized
265                         && !wListener.moved && !wListener.shown;
266         result &= res;
267         if (!res) {
268             log.println("\twindowHidden()     was called: " + wListener.hidden);
269             log.println("\twindowShown()   wasn't called: " + !wListener.shown);
270             log.println("\twindowResized() wasn't called: " + !wListener.resized);
271             log.println("\twindowMoved()   wasn't called: " + !wListener.moved);
272         } else {
273             log.println("windowHidden() was called");
274         }
275 
276         // testing wListener.windowShown()
277         wListener.init() ;
278         waitForEventIdle();
279         log.println("set object visible...");
280         oObj.setVisible(true) ;
281         waitForEventIdle();
282         res = wListener.shown && !wListener.resized &&
283                 !wListener.hidden && !wListener.moved;
284         result &= res;
285         if (!res) {
286             log.println("\twindowHidden()  wasn't called: " + !wListener.hidden);
287             log.println("\twindowShown()      was called: " + wListener.shown);
288             log.println("\twindowResized() wasn't called: " + !wListener.resized);
289             log.println("\twindowMoved()   wasn't called: " + !wListener.moved);
290         } else {
291             log.println("windowShown() was called");
292         }
293 
294         tRes.tested("addWindowListener()", result) ;
295     }
296 
297 
298     /**
299     * Test calls the method. Then we change window and check that listener's
300     * methods were not called. <p>
301     * Has <b> OK </b> status if listener does not react on window events.<p>
302     * The following method tests are to be completed successfully before :
303     * <ul>
304     *  <li> <code> addWindowListener() </code>: adds window listener to the
305     *  object </li>
306     * </ul>
307     */
_removeWindowListener()308     public void _removeWindowListener() {
309         requiredMethod("addWindowListener()");
310         oObj.removeWindowListener(wListener);
311         wListener.init();
312         oObj.setPosSize(posSize.X, posSize.Y,
313             posSize.Width , posSize.Height, PosSize.POSSIZE);
314         oObj.setVisible(false);
315         oObj.setVisible(true);
316         boolean res = !(wListener.resized || wListener.moved
317             || wListener.hidden || wListener.shown);
318 
319         tRes.tested("removeWindowListener()", res);
320     }
321 
322     /**
323     * A class we use to test addFocusListener() and
324     * removeFocusListener()
325     */
326     public static class TestFocusListener implements XFocusListener {
327         public boolean gained = false ;
328         public boolean lost = false ;
329 
focusGained(FocusEvent e)330         public void focusGained(FocusEvent e) {
331             gained = true ;
332         }
focusLost(FocusEvent e)333         public void focusLost(FocusEvent e) {
334             lost = true ;
335         }
init()336         public void init() {
337             gained = false;
338             lost = false;
339         }
disposing(EventObject e)340         public void disposing(EventObject e) {}
341 
342     }
343 
344     private final TestFocusListener fListener = new TestFocusListener();
345 
346     /**
347     * Test calls the method. Then we change focus and check that listener's
348     * methods were called. <p>
349     * Has <b> OK </b> status if methods of fListener were called when
350     * corresponding events occurred. <p>
351     * The following method tests are to be completed successfully before :
352     * <ul>
353     *  <li> <code> setFocus() </code>: sets the focus to the window </li>
354     * </ul>
355     */
_addFocusListener()356     public void _addFocusListener() {
357         boolean result = true ;
358 
359         requiredMethod("setFocus()");
360         oObj.addFocusListener(fListener) ;
361 
362         // testing fListener.lost()
363         oObj.setFocus();
364         waitForEventIdle();
365         win.setFocus();
366         waitForEventIdle();
367         result &= fListener.lost;
368         if (!fListener.lost) {
369             log.println("Lost focus was not notified about") ;
370         }
371 
372         // testing fListener.gained()
373         oObj.setFocus() ;
374         waitForEventIdle();
375         result &= fListener.gained;
376         if (!fListener.gained) {
377             log.println("Gained focus was not notified about") ;
378         }
379 
380         tRes.tested("addFocusListener()", result) ;
381     }
382 
383     /**
384     * Test calls the method. Then we change focus and check that listener's
385     * methods were not called. <p>
386     * Has <b> OK </b> status if listener does not react on focus changing. <p>
387     * The following method tests are to be completed successfully before :
388     * <ul>
389     *  <li> <code> addFocusListener() </code> : adds focus listener to
390     * the object </li>
391     * </ul>
392     */
_removeFocusListener()393     public void _removeFocusListener() {
394         requiredMethod("addFocusListener()");
395         oObj.removeFocusListener(fListener);
396         fListener.init();
397         oObj.setFocus();
398         win.setFocus();
399         oObj.setFocus();
400         boolean res = !(fListener.gained || fListener.lost);
401         tRes.tested("removeFocusListener()", res);
402     }
403 
404     /**
405     * A class we use to test addKeyListener() and
406     * removeKeyListener()
407     */
408     public static class TestKeyListener implements XKeyListener {
keyPressed(KeyEvent e)409         public void keyPressed(KeyEvent e) {}
keyReleased(KeyEvent e)410         public void keyReleased(KeyEvent e) {}
disposing(EventObject e)411         public void disposing(EventObject e) {}
init()412         public void init() {}
413     }
414 
415     private final TestKeyListener kListener = new TestKeyListener();
416 
417     /**
418     * Test calls the method. <p>
419     * Has <b> OK </b> status if no exceptions were thrown. <p>
420     */
_addKeyListener()421     public void _addKeyListener() {
422         oObj.addKeyListener(kListener);
423         tRes.tested("addKeyListener()", true);
424     }
425 
426     /**
427     * Test calls the method. <p>
428     * Has <b> OK </b> status if no exceptions were thrown. <p>
429     * The following method tests are to be completed successfully before :
430     * <ul>
431     *  <li> <code> addKeyListener() </code> : adds key listener to
432     *  the object </li>
433     * </ul>
434     */
_removeKeyListener()435     public void _removeKeyListener() {
436         requiredMethod("addKeyListener()");
437         oObj.removeKeyListener(kListener);
438         tRes.tested("removeKeyListener()", true);
439     }
440 
441     /**
442     * A class we use to test addMouseListener() and
443     * removeMouseListener()
444     */
445     public static class TestMouseListener implements XMouseListener {
446 
mousePressed(MouseEvent e)447         public void mousePressed(MouseEvent e) {
448         }
449 
mouseReleased(MouseEvent e)450         public void mouseReleased(MouseEvent e) {
451         }
452 
mouseEntered(MouseEvent e)453         public void mouseEntered(MouseEvent e) {
454         }
455 
mouseExited(MouseEvent e)456         public void mouseExited(MouseEvent e) {
457         }
458 
disposing(EventObject e)459         public void disposing(EventObject e) {}
460 
init()461         public void init() {
462         }
463 
464     }
465 
466     private final TestMouseListener mListener = new TestMouseListener();
467 
468     /**
469     * Test calls the method. <p>
470     * Has <b> OK </b> status if no exceptions were thrown. <p>
471     */
_addMouseListener()472     public void _addMouseListener() {
473         oObj.addMouseListener(mListener);
474         tRes.tested("addMouseListener()", true);
475     }
476 
477     /**
478     * Test calls the method. <p>
479     * Has <b> OK </b> status if no exceptions were thrown. <p>
480     * The following method tests are to be completed successfully before :
481     * <ul>
482     *  <li> <code> addMouseListener() </code> : adds mouse listener to
483     * the object</li>
484     * </ul>
485     */
_removeMouseListener()486     public void _removeMouseListener() {
487         requiredMethod("addMouseListener()");
488         oObj.removeMouseListener(mListener);
489         tRes.tested("removeMouseListener()", true);
490     }
491 
492     /**
493     * A class we use to test addMouseMotionListener() and
494     * removeMouseMotionListener()
495     */
496     public static class TestMouseMotionListener implements XMouseMotionListener {
497 
mouseDragged(MouseEvent e)498         public void mouseDragged(MouseEvent e) {
499         }
500 
mouseMoved(MouseEvent e)501         public void mouseMoved(MouseEvent e) {
502         }
503 
disposing(EventObject e)504         public void disposing(EventObject e) {
505         }
506 
init()507         public void init() {
508         }
509 
510     }
511 
512     private final TestMouseMotionListener mmListener = new TestMouseMotionListener();
513 
514     /**
515     * Test calls the method. <p>
516     * Has <b> OK </b> status if no exceptions were thrown. <p>
517     */
_addMouseMotionListener()518     public void _addMouseMotionListener() {
519         oObj.addMouseMotionListener(mmListener);
520         tRes.tested("addMouseMotionListener()", true);
521     }
522 
523     /**
524     * Test calls the method. <p>
525     * Has <b> OK </b> status if no exceptions were thrown. <p>
526     * The following method tests are to be completed successfully before :
527     * <ul>
528     *  <li> <code> addMouseMotionListener() </code> : adds mouse motion
529     * listener to the object</li>
530     * </ul>
531     */
_removeMouseMotionListener()532     public void _removeMouseMotionListener() {
533         requiredMethod("addMouseMotionListener()");
534         oObj.removeMouseMotionListener(mmListener);
535         tRes.tested("removeMouseMotionListener()", true);
536     }
537 
538     /**
539     * A class we use to test addPaintListener() and
540     * removePaintListener()
541     */
542     public static class TestPaintListener implements XPaintListener {
543 
windowPaint(PaintEvent e)544         public void windowPaint(PaintEvent e) {
545         }
546 
disposing(EventObject e)547         public void disposing(EventObject e) {}
548 
init()549         public void init() {
550         }
551 
552     }
553 
554     private final TestPaintListener pListener = new TestPaintListener();
555 
556     /**
557     * Test calls the method. <p>
558     * Has <b> OK </b> status if no exceptions were thrown. <p>
559     */
_addPaintListener()560     public void _addPaintListener() {
561         oObj.addPaintListener(pListener);
562         tRes.tested("addPaintListener()", true);
563     }
564 
565     /**
566     * Test calls the method. <p>
567     * Has <b> OK </b> status if no exceptions were thrown. <p>
568     * The following method tests are to be completed successfully before :
569     * <ul>
570     *  <li> <code> addPaintListener() </code> : adds paint listener to
571     * the object </li>
572     * </ul>
573     */
_removePaintListener()574     public void _removePaintListener() {
575         requiredMethod("addPaintListener()");
576         oObj.removePaintListener(pListener);
577         tRes.tested("removePaintListener()", true);
578     }
579 
580 }
581 
582