1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski package ifc.accessibility;
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.AccessibleRole;
26*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.XAccessible;
27*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.XAccessibleContext;
28*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.XAccessibleSelection;
29*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski import lib.MultiMethodTest;
32*b1cdbd2cSJim Jagielski import lib.Status;
33*b1cdbd2cSJim Jagielski import lib.StatusException;
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski /**
37*b1cdbd2cSJim Jagielski  * Testing <code>com.sun.star.accessibility.XAccessibleSelection</code>
38*b1cdbd2cSJim Jagielski  * interface methods :
39*b1cdbd2cSJim Jagielski  * <ul>
40*b1cdbd2cSJim Jagielski  *  <li><code>selectAccessibleChild()</code></li>
41*b1cdbd2cSJim Jagielski  *  <li><code>isAccessibleChildSelected()</code></li>
42*b1cdbd2cSJim Jagielski  *  <li><code>clearAccessibleSelection()</code></li>
43*b1cdbd2cSJim Jagielski  *  <li><code>selectAllAccessibleChildren()</code></li>
44*b1cdbd2cSJim Jagielski  *  <li><code>getSelectedAccessibleChildCount()</code></li>
45*b1cdbd2cSJim Jagielski  *  <li><code>getSelectedAccessibleChild()</code></li>
46*b1cdbd2cSJim Jagielski  *  <li><code>deselectAccessibleChild()</code></li>
47*b1cdbd2cSJim Jagielski  * </ul> <p>
48*b1cdbd2cSJim Jagielski  *
49*b1cdbd2cSJim Jagielski  * This test needs the following object relations :
50*b1cdbd2cSJim Jagielski  * <ul>
51*b1cdbd2cSJim Jagielski  *  <li> <code>'XAccessibleSelection.multiSelection'</code>
52*b1cdbd2cSJim Jagielski  *  (of type <code>Boolean</code>) <b> optional </b>:
53*b1cdbd2cSJim Jagielski  *   Indicates whether or not mutiply children could be selected.
54*b1cdbd2cSJim Jagielski  *   If the relation is <code>false</code> then more than 1 child
55*b1cdbd2cSJim Jagielski  *   couldn't be selected. </li>
56*b1cdbd2cSJim Jagielski  * </ul> <p>
57*b1cdbd2cSJim Jagielski  *
58*b1cdbd2cSJim Jagielski  * @see com.sun.star.accessibility.XAccessibleSelection
59*b1cdbd2cSJim Jagielski  */
60*b1cdbd2cSJim Jagielski public class _XAccessibleSelection extends MultiMethodTest {
61*b1cdbd2cSJim Jagielski     private static final String className = "com.sun.star.accessibility.XAccessibleSelection";
62*b1cdbd2cSJim Jagielski     public XAccessibleSelection oObj = null;
63*b1cdbd2cSJim Jagielski     XAccessibleContext xAC = null;
64*b1cdbd2cSJim Jagielski     int childCount;
65*b1cdbd2cSJim Jagielski     protected boolean multiSelection = true;
66*b1cdbd2cSJim Jagielski     protected boolean OneAlwaysSelected = false;
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski     // temporary while accessibility package is in com.sun.star
getTestedClassName()69*b1cdbd2cSJim Jagielski     protected String getTestedClassName() {
70*b1cdbd2cSJim Jagielski         return className;
71*b1cdbd2cSJim Jagielski     }
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski     /**
74*b1cdbd2cSJim Jagielski      * Retrieves the interface <code>XAccessibleContext</code>
75*b1cdbd2cSJim Jagielski      * and object relation.
76*b1cdbd2cSJim Jagielski      * @see com.sun.star.accessibility.XAccessibleContext
77*b1cdbd2cSJim Jagielski      * @see ifc.accessibility._XAccessibleContext
78*b1cdbd2cSJim Jagielski      */
before()79*b1cdbd2cSJim Jagielski     protected void before() {
80*b1cdbd2cSJim Jagielski         xAC = (XAccessibleContext) UnoRuntime.queryInterface(
81*b1cdbd2cSJim Jagielski                       XAccessibleContext.class, oObj);
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski         if (xAC == null) {
84*b1cdbd2cSJim Jagielski             throw new StatusException(Status.failed(
85*b1cdbd2cSJim Jagielski                                               "Couldn't query XAccessibleContext. Test must be modified"));
86*b1cdbd2cSJim Jagielski         }
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski         Boolean b = (Boolean) tEnv.getObjRelation(
89*b1cdbd2cSJim Jagielski                             "XAccessibleSelection.multiSelection");
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski         if (b != null) {
92*b1cdbd2cSJim Jagielski             multiSelection = b.booleanValue();
93*b1cdbd2cSJim Jagielski         }
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski         Boolean b2 = (Boolean) tEnv.getObjRelation(
96*b1cdbd2cSJim Jagielski                              "XAccessibleSelection.OneAlwaysSelected");
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski         if (b2 != null) {
99*b1cdbd2cSJim Jagielski             OneAlwaysSelected = b2.booleanValue();
100*b1cdbd2cSJim Jagielski         }
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski         childCount = xAC.getAccessibleChildCount();
103*b1cdbd2cSJim Jagielski         log.println("Child count: " + childCount);
104*b1cdbd2cSJim Jagielski     }
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski     /**
107*b1cdbd2cSJim Jagielski      * Selects accessible child with index some wrong indexes
108*b1cdbd2cSJim Jagielski      * and with legal index.
109*b1cdbd2cSJim Jagielski      * Has OK status if exception was thrown for wrong indexes
110*b1cdbd2cSJim Jagielski      * and if exception wasn't thrown for correct index.
111*b1cdbd2cSJim Jagielski      */
_selectAccessibleChild()112*b1cdbd2cSJim Jagielski     public void _selectAccessibleChild() {
113*b1cdbd2cSJim Jagielski         boolean res = true;
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski         try {
116*b1cdbd2cSJim Jagielski             log.println("Try to select child with index " + childCount);
117*b1cdbd2cSJim Jagielski             oObj.selectAccessibleChild(childCount);
118*b1cdbd2cSJim Jagielski             log.println("Exception was expected");
119*b1cdbd2cSJim Jagielski             res = false;
120*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
121*b1cdbd2cSJim Jagielski             log.println("Expected exception");
122*b1cdbd2cSJim Jagielski             res = true;
123*b1cdbd2cSJim Jagielski         }
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski         try {
126*b1cdbd2cSJim Jagielski             log.println("Try to select child with index -1");
127*b1cdbd2cSJim Jagielski             oObj.selectAccessibleChild(-1);
128*b1cdbd2cSJim Jagielski             log.println("Exception was expected");
129*b1cdbd2cSJim Jagielski             res = false;
130*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
131*b1cdbd2cSJim Jagielski             log.println("Expected exception");
132*b1cdbd2cSJim Jagielski             res &= true;
133*b1cdbd2cSJim Jagielski         }
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski         log.println("ChildCount: " + childCount);
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski         int usedChilds = childCount;
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski         if (childCount > 500) {
140*b1cdbd2cSJim Jagielski             log.println("Restricting to 500");
141*b1cdbd2cSJim Jagielski             usedChilds = 500;
142*b1cdbd2cSJim Jagielski         }
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski         if (usedChilds > 0) {
145*b1cdbd2cSJim Jagielski             try {
146*b1cdbd2cSJim Jagielski                 for (int i = 0; i < usedChilds; i++) {
147*b1cdbd2cSJim Jagielski                     log.print("Trying to select child with index " + i + ": ");
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski                     if (isSelectable(tEnv.getTestObject(), i)) {
150*b1cdbd2cSJim Jagielski                         oObj.selectAccessibleChild(i);
151*b1cdbd2cSJim Jagielski                         log.println("OK");
152*b1cdbd2cSJim Jagielski                     } else {
153*b1cdbd2cSJim Jagielski                         log.println("Child isn't selectable");
154*b1cdbd2cSJim Jagielski                     }
155*b1cdbd2cSJim Jagielski                 }
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski                 res &= true;
158*b1cdbd2cSJim Jagielski             } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
159*b1cdbd2cSJim Jagielski                 log.println("Unexpected exception");
160*b1cdbd2cSJim Jagielski                 e.printStackTrace(log);
161*b1cdbd2cSJim Jagielski                 res = false;
162*b1cdbd2cSJim Jagielski             }
163*b1cdbd2cSJim Jagielski         }
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski         tRes.tested("selectAccessibleChild()", res);
166*b1cdbd2cSJim Jagielski     }
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski     /**
169*b1cdbd2cSJim Jagielski      * Calls the method with the wrong index and with the correct index.
170*b1cdbd2cSJim Jagielski      * Has OK status if exception was thrown for wrong index and
171*b1cdbd2cSJim Jagielski      * if exception wasn't thrown for the correct index.
172*b1cdbd2cSJim Jagielski      */
_isAccessibleChildSelected()173*b1cdbd2cSJim Jagielski     public void _isAccessibleChildSelected() {
174*b1cdbd2cSJim Jagielski         executeMethod("selectAccessibleChild()");
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski         boolean res = true;
177*b1cdbd2cSJim Jagielski         boolean isSelected = false;
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski         try {
180*b1cdbd2cSJim Jagielski             log.print("isAccessibleChildSelected(-1)? ");
181*b1cdbd2cSJim Jagielski             isSelected = oObj.isAccessibleChildSelected(-1);
182*b1cdbd2cSJim Jagielski             log.println(res);
183*b1cdbd2cSJim Jagielski             log.println("Exception was expected");
184*b1cdbd2cSJim Jagielski             res = false;
185*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
186*b1cdbd2cSJim Jagielski             log.println("Expected exception");
187*b1cdbd2cSJim Jagielski             res = true;
188*b1cdbd2cSJim Jagielski         }
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski         try {
191*b1cdbd2cSJim Jagielski             log.print("isAccessibleChildSelected(" + childCount + ")? ");
192*b1cdbd2cSJim Jagielski             isSelected = oObj.isAccessibleChildSelected(childCount);
193*b1cdbd2cSJim Jagielski             log.println(isSelected);
194*b1cdbd2cSJim Jagielski             log.println("Exception was expected");
195*b1cdbd2cSJim Jagielski             res = false;
196*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
197*b1cdbd2cSJim Jagielski             log.println("Expected exception");
198*b1cdbd2cSJim Jagielski             res &= true;
199*b1cdbd2cSJim Jagielski         }
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski         int SelectableChildCount = chkSelectable(tEnv.getTestObject());
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski         if (SelectableChildCount > 500) {
204*b1cdbd2cSJim Jagielski             SelectableChildCount = 500;
205*b1cdbd2cSJim Jagielski         }
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski         log.println("SelectableChildCount: " + SelectableChildCount);
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski         if (SelectableChildCount > 0) {
210*b1cdbd2cSJim Jagielski             try {
211*b1cdbd2cSJim Jagielski                 oObj.selectAllAccessibleChildren();
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski                 for (int k = 0; k < SelectableChildCount; k++) {
214*b1cdbd2cSJim Jagielski                     log.println("Trying to select child with index " + k);
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski                     if (isSelectable(tEnv.getTestObject(), k)) {
217*b1cdbd2cSJim Jagielski                         oObj.selectAccessibleChild(k);
218*b1cdbd2cSJim Jagielski                         shortWait();
219*b1cdbd2cSJim Jagielski                         isSelected = oObj.isAccessibleChildSelected(k);
220*b1cdbd2cSJim Jagielski                         log.println("isAccessibleChildSelected - " +
221*b1cdbd2cSJim Jagielski                                     isSelected);
222*b1cdbd2cSJim Jagielski                         res &= isSelected;
223*b1cdbd2cSJim Jagielski                     } else {
224*b1cdbd2cSJim Jagielski                         log.println("Child isn't selectable");
225*b1cdbd2cSJim Jagielski                     }
226*b1cdbd2cSJim Jagielski                 }
227*b1cdbd2cSJim Jagielski             } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
228*b1cdbd2cSJim Jagielski                 log.println("Unexpected exception");
229*b1cdbd2cSJim Jagielski                 e.printStackTrace(log);
230*b1cdbd2cSJim Jagielski                 res = false;
231*b1cdbd2cSJim Jagielski             }
232*b1cdbd2cSJim Jagielski         }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski         tRes.tested("isAccessibleChildSelected()", res);
235*b1cdbd2cSJim Jagielski     }
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski     /**
238*b1cdbd2cSJim Jagielski      * Calls the method.
239*b1cdbd2cSJim Jagielski      * Has OK status if the method <code>isAccessibleChildSelected()</code>
240*b1cdbd2cSJim Jagielski      * returned <code>false</code>.
241*b1cdbd2cSJim Jagielski      */
_clearAccessibleSelection()242*b1cdbd2cSJim Jagielski     public void _clearAccessibleSelection() {
243*b1cdbd2cSJim Jagielski         executeMethod("isAccessibleChildSelected()");
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski         boolean res = true;
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski         log.println("clearAccessibleSelection");
248*b1cdbd2cSJim Jagielski         oObj.clearAccessibleSelection();
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski         // clearAccessibleSelection() call is oneway so we need
252*b1cdbd2cSJim Jagielski         // some waiting
253*b1cdbd2cSJim Jagielski         shortWait();
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski         if ((childCount > 0) && !OneAlwaysSelected) {
256*b1cdbd2cSJim Jagielski             try {
257*b1cdbd2cSJim Jagielski                 log.print("isAccessibleChildSelected(" + (childCount - 1) +
258*b1cdbd2cSJim Jagielski                           ")? ");
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski                 boolean isSel = oObj.isAccessibleChildSelected(childCount - 1);
261*b1cdbd2cSJim Jagielski                 log.println(isSel);
262*b1cdbd2cSJim Jagielski                 res = !isSel;
263*b1cdbd2cSJim Jagielski             } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
264*b1cdbd2cSJim Jagielski                 log.println("Unexpected exception");
265*b1cdbd2cSJim Jagielski                 e.printStackTrace(log);
266*b1cdbd2cSJim Jagielski                 res = false;
267*b1cdbd2cSJim Jagielski             }
268*b1cdbd2cSJim Jagielski         } else if (OneAlwaysSelected) {
269*b1cdbd2cSJim Jagielski             log.println("Can't clear selection, one child is always selected");
270*b1cdbd2cSJim Jagielski         }
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski         tRes.tested("clearAccessibleSelection()", res);
273*b1cdbd2cSJim Jagielski     }
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski     /**
276*b1cdbd2cSJim Jagielski      * Calls the method.
277*b1cdbd2cSJim Jagielski      * Has OK status if the method <code>isAccessibleChildSelected()</code>
278*b1cdbd2cSJim Jagielski      * returns <code>true</code> for first and for last accessible child
279*b1cdbd2cSJim Jagielski      * or if multiselection is not allowed.
280*b1cdbd2cSJim Jagielski      */
_selectAllAccessibleChildren()281*b1cdbd2cSJim Jagielski     public void _selectAllAccessibleChildren() {
282*b1cdbd2cSJim Jagielski         executeMethod("clearAccessibleSelection()");
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski         log.println("selectAllAccessibleChildren...");
285*b1cdbd2cSJim Jagielski         oObj.selectAllAccessibleChildren();
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski         // selectAllAccessibleChildren() call is oneway so we need
289*b1cdbd2cSJim Jagielski         // some waiting
290*b1cdbd2cSJim Jagielski         shortWait();
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski         boolean res = true;
293*b1cdbd2cSJim Jagielski         boolean isSelected = true;
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski         int SelectableChildCount = chkSelectable(tEnv.getTestObject());
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski         if ((SelectableChildCount > 0) && multiSelection) {
298*b1cdbd2cSJim Jagielski             try {
299*b1cdbd2cSJim Jagielski                 log.print("isAccessibleChildSelected(1)? ");
300*b1cdbd2cSJim Jagielski                 isSelected = oObj.isAccessibleChildSelected(1);
301*b1cdbd2cSJim Jagielski                 log.println(isSelected);
302*b1cdbd2cSJim Jagielski                 res = isSelected;
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski                 log.print("isAccessibleChildSelected(" + (childCount - 1) +
305*b1cdbd2cSJim Jagielski                           ")? ");
306*b1cdbd2cSJim Jagielski                 isSelected = oObj.isAccessibleChildSelected(childCount - 1);
307*b1cdbd2cSJim Jagielski                 log.println(isSelected);
308*b1cdbd2cSJim Jagielski                 res &= isSelected;
309*b1cdbd2cSJim Jagielski             } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
310*b1cdbd2cSJim Jagielski                 log.println("Unexpected exception");
311*b1cdbd2cSJim Jagielski                 e.printStackTrace(log);
312*b1cdbd2cSJim Jagielski                 res = false;
313*b1cdbd2cSJim Jagielski             }
314*b1cdbd2cSJim Jagielski         }
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski         tRes.tested("selectAllAccessibleChildren()", res);
317*b1cdbd2cSJim Jagielski     }
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski     /**
320*b1cdbd2cSJim Jagielski      * Calls the method. Clears accessible selection and calls the method again.
321*b1cdbd2cSJim Jagielski      * <p>
322*b1cdbd2cSJim Jagielski      * Has OK status if the method returns number equal to number of accessible
323*b1cdbd2cSJim Jagielski      * child count after first call if multiselection allowed, or
324*b1cdbd2cSJim Jagielski      * 1 returned if multiselection not allowed.
325*b1cdbd2cSJim Jagielski      * And if the method returns a zero after clearing selection.
326*b1cdbd2cSJim Jagielski      */
_getSelectedAccessibleChildCount()327*b1cdbd2cSJim Jagielski     public void _getSelectedAccessibleChildCount() {
328*b1cdbd2cSJim Jagielski         log.println("getSelectedAccessibleChildCount():");
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski         if (multiSelection) {
331*b1cdbd2cSJim Jagielski             oObj.selectAllAccessibleChildren();
332*b1cdbd2cSJim Jagielski         } else {
333*b1cdbd2cSJim Jagielski             int usedChilds = childCount;
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski             if (childCount > 500) {
336*b1cdbd2cSJim Jagielski                 log.println("Restricting to 500");
337*b1cdbd2cSJim Jagielski                 usedChilds = 500;
338*b1cdbd2cSJim Jagielski             }
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski             if (usedChilds > 0) {
341*b1cdbd2cSJim Jagielski                 try {
342*b1cdbd2cSJim Jagielski                     for (int i = 0; i < usedChilds; i++) {
343*b1cdbd2cSJim Jagielski 
344*b1cdbd2cSJim Jagielski                         if (isSelectable(tEnv.getTestObject(), i)) {
345*b1cdbd2cSJim Jagielski                             log.print("Trying to select child with index "+i+": ");
346*b1cdbd2cSJim Jagielski                             oObj.selectAccessibleChild(i);
347*b1cdbd2cSJim Jagielski                             long curtime = System.currentTimeMillis();
348*b1cdbd2cSJim Jagielski                             long checktime = System.currentTimeMillis();
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski                             while (!oObj.isAccessibleChildSelected(i) && (checktime-curtime<5000)) {
351*b1cdbd2cSJim Jagielski                                 checktime = System.currentTimeMillis();
352*b1cdbd2cSJim Jagielski                             }
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski                             log.println("OK");
355*b1cdbd2cSJim Jagielski                         }
356*b1cdbd2cSJim Jagielski                     }
357*b1cdbd2cSJim Jagielski                 } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
358*b1cdbd2cSJim Jagielski                     log.println("Unexpected exception");
359*b1cdbd2cSJim Jagielski                     e.printStackTrace(log);
360*b1cdbd2cSJim Jagielski                 }
361*b1cdbd2cSJim Jagielski             }
362*b1cdbd2cSJim Jagielski         }
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski         int sCount = chkSelectable(tEnv.getTestObject());
365*b1cdbd2cSJim Jagielski         log.println("Found " + sCount + " selectable Childs");
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski         int selectedCount = oObj.getSelectedAccessibleChildCount();
368*b1cdbd2cSJim Jagielski         log.println("After selecting all accessible " + selectedCount +
369*b1cdbd2cSJim Jagielski                     " are selected");
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski         boolean res = true;
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski         if (multiSelection) {
374*b1cdbd2cSJim Jagielski             res &= (selectedCount == sCount);
375*b1cdbd2cSJim Jagielski         } else {
376*b1cdbd2cSJim Jagielski             res &= (selectedCount == 1);
377*b1cdbd2cSJim Jagielski         }
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski         log.println("clearAccessibleSelection...");
380*b1cdbd2cSJim Jagielski         oObj.clearAccessibleSelection();
381*b1cdbd2cSJim Jagielski         log.print("getSelectedAccessibleChildCount: ");
382*b1cdbd2cSJim Jagielski         selectedCount = oObj.getSelectedAccessibleChildCount();
383*b1cdbd2cSJim Jagielski         log.println(selectedCount);
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski         if (OneAlwaysSelected) {
386*b1cdbd2cSJim Jagielski             res &= (selectedCount == 1);
387*b1cdbd2cSJim Jagielski         } else {
388*b1cdbd2cSJim Jagielski             res &= (selectedCount == 0);
389*b1cdbd2cSJim Jagielski         }
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski         tRes.tested("getSelectedAccessibleChildCount()", res);
392*b1cdbd2cSJim Jagielski     }
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski     /**
395*b1cdbd2cSJim Jagielski      * Calls the method with wrong and correct indexes.
396*b1cdbd2cSJim Jagielski      * Has OK status if exception was thrown for the wrong indexes,
397*b1cdbd2cSJim Jagielski      * if exception wasn't thrown for the correct index and
398*b1cdbd2cSJim Jagielski      * if the method have returned a not null for the correct index.
399*b1cdbd2cSJim Jagielski      */
_getSelectedAccessibleChild()400*b1cdbd2cSJim Jagielski     public void _getSelectedAccessibleChild() {
401*b1cdbd2cSJim Jagielski         executeMethod("getSelectedAccessibleChildCount()");
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski         boolean res = true;
404*b1cdbd2cSJim Jagielski         int selectedCount = oObj.getSelectedAccessibleChildCount();
405*b1cdbd2cSJim Jagielski         log.println("getSelectedAccessibleChildCount: " + selectedCount);
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski         try {
408*b1cdbd2cSJim Jagielski             log.println("getSelectedAccessibleChild(-1)");
409*b1cdbd2cSJim Jagielski             oObj.getSelectedAccessibleChild(-1);
410*b1cdbd2cSJim Jagielski             log.println("Exception was expected");
411*b1cdbd2cSJim Jagielski             res = false;
412*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
413*b1cdbd2cSJim Jagielski             log.println("Expected exception");
414*b1cdbd2cSJim Jagielski             res = true;
415*b1cdbd2cSJim Jagielski         }
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski         try {
418*b1cdbd2cSJim Jagielski             log.println("getSelectedAccessibleChild(" + selectedCount + ")");
419*b1cdbd2cSJim Jagielski             oObj.getSelectedAccessibleChild(selectedCount);
420*b1cdbd2cSJim Jagielski             log.println("Exception was expected");
421*b1cdbd2cSJim Jagielski             res &= false;
422*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
423*b1cdbd2cSJim Jagielski             log.println("Expected exception");
424*b1cdbd2cSJim Jagielski             res &= true;
425*b1cdbd2cSJim Jagielski         }
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski         int SelectableChildCount = chkSelectable(tEnv.getTestObject());
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski         if (SelectableChildCount > 500) {
430*b1cdbd2cSJim Jagielski             SelectableChildCount = 500;
431*b1cdbd2cSJim Jagielski         }
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski         if (SelectableChildCount > 0) {
434*b1cdbd2cSJim Jagielski             int k = 0;
435*b1cdbd2cSJim Jagielski             try {
436*b1cdbd2cSJim Jagielski                 for (k = 0; k < SelectableChildCount; k++) {
437*b1cdbd2cSJim Jagielski                     log.println("Trying to select child with index " + k);
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski                     if (isSelectable(tEnv.getTestObject(), k)) {
440*b1cdbd2cSJim Jagielski                         oObj.selectAccessibleChild(k);
441*b1cdbd2cSJim Jagielski                         shortWait();
442*b1cdbd2cSJim Jagielski                         log.println("selected child count: " +
443*b1cdbd2cSJim Jagielski                                     oObj.getSelectedAccessibleChildCount());
444*b1cdbd2cSJim Jagielski                         XAccessible selChild = oObj.getSelectedAccessibleChild(0);
445*b1cdbd2cSJim Jagielski                         res &= (selChild != null);
446*b1cdbd2cSJim Jagielski                         log.println("valid child - " + (selChild != null));
447*b1cdbd2cSJim Jagielski                     } else {
448*b1cdbd2cSJim Jagielski                         log.println("Child isn't selectable");
449*b1cdbd2cSJim Jagielski                     }
450*b1cdbd2cSJim Jagielski                 }
451*b1cdbd2cSJim Jagielski             } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
452*b1cdbd2cSJim Jagielski                 log.println("Unexpected exception: Last relevant calls:\n " +
453*b1cdbd2cSJim Jagielski                             "\toObj.selectAccessibleChild("+k+")\n" +
454*b1cdbd2cSJim Jagielski                             "\toObj.getSelectedAccessibleChild(0)");
455*b1cdbd2cSJim Jagielski                 e.printStackTrace(log);
456*b1cdbd2cSJim Jagielski                 res = false;
457*b1cdbd2cSJim Jagielski             }
458*b1cdbd2cSJim Jagielski         }
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski         tRes.tested("getSelectedAccessibleChild()", res);
461*b1cdbd2cSJim Jagielski     }
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski     /**
464*b1cdbd2cSJim Jagielski      * Calls the method with wrong and with correct indexes.
465*b1cdbd2cSJim Jagielski      * Has OK status if exceptions were thrown for the calls with
466*b1cdbd2cSJim Jagielski      * the wrong indexes, if exception wasn't thrown for the call
467*b1cdbd2cSJim Jagielski      * with correct index and if number of selected child was
468*b1cdbd2cSJim Jagielski      * decreased after the correct call.
469*b1cdbd2cSJim Jagielski      */
_deselectAccessibleChild()470*b1cdbd2cSJim Jagielski     public void _deselectAccessibleChild() {
471*b1cdbd2cSJim Jagielski         executeMethod("getSelectedAccessibleChild()");
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski         boolean res = true;
474*b1cdbd2cSJim Jagielski         int selCount = oObj.getSelectedAccessibleChildCount();
475*b1cdbd2cSJim Jagielski         log.println("getSelectedAccessibleChildCount():" + selCount);
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski         try {
478*b1cdbd2cSJim Jagielski             log.println("deselectAccessibleChild(-1)");
479*b1cdbd2cSJim Jagielski             oObj.deselectAccessibleChild(-1);
480*b1cdbd2cSJim Jagielski             log.println("Exception was expected");
481*b1cdbd2cSJim Jagielski             res = false;
482*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
483*b1cdbd2cSJim Jagielski             log.println("Expected exception");
484*b1cdbd2cSJim Jagielski             res &= true;
485*b1cdbd2cSJim Jagielski         }
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski         try {
488*b1cdbd2cSJim Jagielski             log.println("deselectAccessibleChild(" + (childCount + 1) + ")");
489*b1cdbd2cSJim Jagielski             oObj.deselectAccessibleChild(childCount + 1);
490*b1cdbd2cSJim Jagielski             log.println("Exception was expected");
491*b1cdbd2cSJim Jagielski             res = false;
492*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
493*b1cdbd2cSJim Jagielski             log.println("Expected exception");
494*b1cdbd2cSJim Jagielski             res &= true;
495*b1cdbd2cSJim Jagielski         }
496*b1cdbd2cSJim Jagielski 
497*b1cdbd2cSJim Jagielski         log.println("#################");
498*b1cdbd2cSJim Jagielski         log.println("Selecting all accessible");
499*b1cdbd2cSJim Jagielski         oObj.selectAllAccessibleChildren();
500*b1cdbd2cSJim Jagielski         selCount = oObj.getSelectedAccessibleChildCount();
501*b1cdbd2cSJim Jagielski         log.println("getSelectedAccessibleChildCount():" + selCount);
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski         if ((childCount > 0) && (selCount > 0)) {
504*b1cdbd2cSJim Jagielski             try {
505*b1cdbd2cSJim Jagielski                 int maxCount = chkSelectable(tEnv.getTestObject());
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski                 if (childCount > 100) {
508*b1cdbd2cSJim Jagielski                     maxCount = 100;
509*b1cdbd2cSJim Jagielski                 }
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski                 for (int k = 0; k < maxCount; k++) {
512*b1cdbd2cSJim Jagielski                     log.println("deselectAccessibleChild(" + k + ")");
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski                     if (oObj.isAccessibleChildSelected(k)) {
515*b1cdbd2cSJim Jagielski                         oObj.deselectAccessibleChild(k);
516*b1cdbd2cSJim Jagielski                     }
517*b1cdbd2cSJim Jagielski                 }
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski                 int newSelCount = oObj.getSelectedAccessibleChildCount();
520*b1cdbd2cSJim Jagielski                 log.println("getSelectedAccessibleChildCount():" +
521*b1cdbd2cSJim Jagielski                             newSelCount);
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski                 if (OneAlwaysSelected && (selCount == 1)) {
524*b1cdbd2cSJim Jagielski                     log.println("One Child is always selected");
525*b1cdbd2cSJim Jagielski                     res &= true;
526*b1cdbd2cSJim Jagielski                 } else {
527*b1cdbd2cSJim Jagielski                     res &= (selCount > newSelCount);
528*b1cdbd2cSJim Jagielski                 }
529*b1cdbd2cSJim Jagielski             } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
530*b1cdbd2cSJim Jagielski                 log.println("Unexpected exception");
531*b1cdbd2cSJim Jagielski                 e.printStackTrace(log);
532*b1cdbd2cSJim Jagielski                 res = false;
533*b1cdbd2cSJim Jagielski             }
534*b1cdbd2cSJim Jagielski         }
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski         tRes.tested("deselectAccessibleChild()", res);
537*b1cdbd2cSJim Jagielski     }
538*b1cdbd2cSJim Jagielski 
chkSelectable(Object Testcase)539*b1cdbd2cSJim Jagielski     protected static int chkSelectable(Object Testcase) {
540*b1cdbd2cSJim Jagielski         int ret = 0;
541*b1cdbd2cSJim Jagielski         XAccessibleContext accCon = (XAccessibleContext) UnoRuntime.queryInterface(
542*b1cdbd2cSJim Jagielski                                             XAccessibleContext.class, Testcase);
543*b1cdbd2cSJim Jagielski         int cc = accCon.getAccessibleChildCount();
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski         if (cc > 500) {
546*b1cdbd2cSJim Jagielski             return cc;
547*b1cdbd2cSJim Jagielski         }
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski         for (int i = 0; i < cc; i++) {
550*b1cdbd2cSJim Jagielski             try {
551*b1cdbd2cSJim Jagielski                 if (accCon.getAccessibleChild(i).getAccessibleContext()
552*b1cdbd2cSJim Jagielski                           .getAccessibleStateSet()
553*b1cdbd2cSJim Jagielski                           .contains(com.sun.star.accessibility.AccessibleStateType.SELECTABLE)) {
554*b1cdbd2cSJim Jagielski                     ret = ret + 1;
555*b1cdbd2cSJim Jagielski                     System.out.println("Child " + i + " is selectable");
556*b1cdbd2cSJim Jagielski                 }
557*b1cdbd2cSJim Jagielski             } catch (com.sun.star.lang.IndexOutOfBoundsException iab) {
558*b1cdbd2cSJim Jagielski             }
559*b1cdbd2cSJim Jagielski         }
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski         return ret;
562*b1cdbd2cSJim Jagielski     }
563*b1cdbd2cSJim Jagielski 
isSelectable(Object Testcase, int index)564*b1cdbd2cSJim Jagielski     protected static boolean isSelectable(Object Testcase, int index) {
565*b1cdbd2cSJim Jagielski         XAccessibleContext accCon = (XAccessibleContext) UnoRuntime.queryInterface(
566*b1cdbd2cSJim Jagielski                                             XAccessibleContext.class, Testcase);
567*b1cdbd2cSJim Jagielski         boolean res = false;
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski         try {
570*b1cdbd2cSJim Jagielski             if (accCon.getAccessibleChild(index).getAccessibleContext()
571*b1cdbd2cSJim Jagielski                       .getAccessibleStateSet()
572*b1cdbd2cSJim Jagielski                       .contains(com.sun.star.accessibility.AccessibleStateType.SELECTABLE)) {
573*b1cdbd2cSJim Jagielski                 res = true;
574*b1cdbd2cSJim Jagielski             }
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski             //selecting menuitems or the separator will lead to closing the menu
577*b1cdbd2cSJim Jagielski             if ((accCon.getAccessibleChild(index).getAccessibleContext()
578*b1cdbd2cSJim Jagielski                        .getAccessibleRole() == AccessibleRole.MENU_ITEM) ||
579*b1cdbd2cSJim Jagielski                     (accCon.getAccessibleChild(index).getAccessibleContext()
580*b1cdbd2cSJim Jagielski                            .getAccessibleRole() == AccessibleRole.SEPARATOR)) {
581*b1cdbd2cSJim Jagielski                 res = false;
582*b1cdbd2cSJim Jagielski             }
583*b1cdbd2cSJim Jagielski         } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
584*b1cdbd2cSJim Jagielski             System.out.println("Exception while checking for selectability");
585*b1cdbd2cSJim Jagielski         }
586*b1cdbd2cSJim Jagielski 
587*b1cdbd2cSJim Jagielski         return res;
588*b1cdbd2cSJim Jagielski     }
589*b1cdbd2cSJim Jagielski 
shortWait()590*b1cdbd2cSJim Jagielski     private void shortWait() {
591*b1cdbd2cSJim Jagielski         try {
592*b1cdbd2cSJim Jagielski             Thread.sleep(500);
593*b1cdbd2cSJim Jagielski         } catch (InterruptedException ex) {
594*b1cdbd2cSJim Jagielski         }
595*b1cdbd2cSJim Jagielski     }
596*b1cdbd2cSJim Jagielski }
597