/* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ package ifc.accessibility; import com.sun.star.accessibility.AccessibleRole; import com.sun.star.accessibility.XAccessible; import com.sun.star.accessibility.XAccessibleContext; import com.sun.star.accessibility.XAccessibleSelection; import com.sun.star.uno.UnoRuntime; import lib.MultiMethodTest; import lib.Status; import lib.StatusException; /** * Testing com.sun.star.accessibility.XAccessibleSelection * interface methods : *

* * This test needs the following object relations : *

* * @see com.sun.star.accessibility.XAccessibleSelection */ public class _XAccessibleSelection extends MultiMethodTest { private static final String className = "com.sun.star.accessibility.XAccessibleSelection"; public XAccessibleSelection oObj = null; XAccessibleContext xAC = null; int childCount; protected boolean multiSelection = true; protected boolean OneAlwaysSelected = false; // temporary while accessibility package is in com.sun.star @Override protected String getTestedClassName() { return className; } /** * Retrieves the interface XAccessibleContext * and object relation. * @see com.sun.star.accessibility.XAccessibleContext * @see ifc.accessibility._XAccessibleContext */ @Override protected void before() { xAC = UnoRuntime.queryInterface( XAccessibleContext.class, oObj); if (xAC == null) { throw new StatusException(Status.failed( "Couldn't query XAccessibleContext. Test must be modified")); } Boolean b = (Boolean) tEnv.getObjRelation( "XAccessibleSelection.multiSelection"); if (b != null) { multiSelection = b.booleanValue(); } Boolean b2 = (Boolean) tEnv.getObjRelation( "XAccessibleSelection.OneAlwaysSelected"); if (b2 != null) { OneAlwaysSelected = b2.booleanValue(); } childCount = xAC.getAccessibleChildCount(); log.println("Child count: " + childCount); } /** * Selects accessible child with index some wrong indexes * and with legal index. * Has OK status if exception was thrown for wrong indexes * and if exception wasn't thrown for correct index. */ public void _selectAccessibleChild() { boolean res = true; try { log.println("Try to select child with index " + childCount); oObj.selectAccessibleChild(childCount); log.println("Exception was expected"); res = false; } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Expected exception"); res = true; } try { log.println("Try to select child with index -1"); oObj.selectAccessibleChild(-1); log.println("Exception was expected"); res = false; } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Expected exception"); res &= true; } log.println("ChildCount: " + childCount); int usedChildren = childCount; if (childCount > 500) { log.println("Restricting to 500"); usedChildren = 500; } if (usedChildren > 0) { try { for (int i = 0; i < usedChildren; i++) { log.print("Trying to select child with index " + i + ": "); if (isSelectable(tEnv.getTestObject(), i)) { oObj.selectAccessibleChild(i); log.println("OK"); } else { log.println("Child isn't selectable"); } } res &= true; } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Unexpected exception"); e.printStackTrace(log); res = false; } } tRes.tested("selectAccessibleChild()", res); } /** * Calls the method with the wrong index and with the correct index. * Has OK status if exception was thrown for wrong index and * if exception wasn't thrown for the correct index. */ public void _isAccessibleChildSelected() throws Exception { executeMethod("selectAccessibleChild()"); boolean res = true; boolean isSelected = false; try { log.print("isAccessibleChildSelected(-1)? "); isSelected = oObj.isAccessibleChildSelected(-1); log.println(res); log.println("Exception was expected"); res = false; } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Expected exception"); res = true; } try { log.print("isAccessibleChildSelected(" + childCount + ")? "); isSelected = oObj.isAccessibleChildSelected(childCount); log.println(isSelected); log.println("Exception was expected"); res = false; } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Expected exception"); res &= true; } int SelectableChildCount = chkSelectable(tEnv.getTestObject()); if (SelectableChildCount > 500) { SelectableChildCount = 500; } log.println("SelectableChildCount: " + SelectableChildCount); if (SelectableChildCount > 0) { try { oObj.selectAllAccessibleChildren(); for (int k = 0; k < SelectableChildCount; k++) { log.println("Trying to select child with index " + k); if (isSelectable(tEnv.getTestObject(), k)) { oObj.selectAccessibleChild(k); waitForEventIdle(); isSelected = oObj.isAccessibleChildSelected(k); log.println("isAccessibleChildSelected - " + isSelected); res &= isSelected; } else { log.println("Child isn't selectable"); } } } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Unexpected exception"); e.printStackTrace(log); res = false; } } tRes.tested("isAccessibleChildSelected()", res); } /** * Calls the method. * Has OK status if the method isAccessibleChildSelected() * returned false. */ public void _clearAccessibleSelection() throws Exception { executeMethod("isAccessibleChildSelected()"); boolean res = true; log.println("clearAccessibleSelection"); oObj.clearAccessibleSelection(); // clearAccessibleSelection() call is oneway so we need // some waiting waitForEventIdle(); if ((childCount > 0) && !OneAlwaysSelected) { try { log.print("isAccessibleChildSelected(" + (childCount - 1) + ")? "); boolean isSel = oObj.isAccessibleChildSelected(childCount - 1); log.println(isSel); res = !isSel; } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Unexpected exception"); e.printStackTrace(log); res = false; } } else if (OneAlwaysSelected) { log.println("Can't clear selection, one child is always selected"); } tRes.tested("clearAccessibleSelection()", res); } /** * Calls the method. * Has OK status if the method isAccessibleChildSelected() * returns true for first and for last accessible child * or if multiselection is not allowed. */ public void _selectAllAccessibleChildren() { executeMethod("clearAccessibleSelection()"); log.println("selectAllAccessibleChildren..."); oObj.selectAllAccessibleChildren(); // selectAllAccessibleChildren() call is oneway so we need // some waiting waitForEventIdle(); boolean res = true; boolean isSelected = true; int SelectableChildCount = chkSelectable(tEnv.getTestObject()); if ((SelectableChildCount > 0) && multiSelection) { try { log.print("isAccessibleChildSelected(1)? "); isSelected = oObj.isAccessibleChildSelected(1); log.println(isSelected); res = isSelected; log.print("isAccessibleChildSelected(" + (childCount - 1) + ")? "); isSelected = oObj.isAccessibleChildSelected(childCount - 1); log.println(isSelected); res &= isSelected; } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Unexpected exception"); e.printStackTrace(log); res = false; } } tRes.tested("selectAllAccessibleChildren()", res); } /** * Calls the method. Clears accessible selection and calls the method again. *

* Has OK status if the method returns number equal to number of accessible * child count after first call if multiselection allowed, or * 1 returned if multiselection not allowed. * And if the method returns a zero after clearing selection. */ public void _getSelectedAccessibleChildCount() { log.println("getSelectedAccessibleChildCount():"); if (multiSelection) { oObj.selectAllAccessibleChildren(); } else { int usedChildren = childCount; if (childCount > 500) { log.println("Restricting to 500"); usedChildren = 500; } if (usedChildren > 0) { try { for (int i = 0; i < usedChildren; i++) { if (isSelectable(tEnv.getTestObject(), i)) { log.print("Trying to select child with index "+i+": "); oObj.selectAccessibleChild(i); long curtime = System.currentTimeMillis(); long checktime = System.currentTimeMillis(); while (!oObj.isAccessibleChildSelected(i) && (checktime-curtime<5000)) { checktime = System.currentTimeMillis(); } log.println("OK"); } } } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Unexpected exception"); e.printStackTrace(log); } } } int sCount = chkSelectable(tEnv.getTestObject()); log.println("Found " + sCount + " selectable Children"); int selectedCount = oObj.getSelectedAccessibleChildCount(); log.println("After selecting all accessible " + selectedCount + " are selected"); boolean res = true; if (multiSelection) { res &= (selectedCount == sCount); } else { res &= (selectedCount == 1); } log.println("clearAccessibleSelection..."); oObj.clearAccessibleSelection(); log.print("getSelectedAccessibleChildCount: "); selectedCount = oObj.getSelectedAccessibleChildCount(); log.println(selectedCount); if (OneAlwaysSelected) { res &= (selectedCount == 1); } else { res &= (selectedCount == 0); } tRes.tested("getSelectedAccessibleChildCount()", res); } /** * Calls the method with wrong and correct indexes. * Has OK status if exception was thrown for the wrong indexes, * if exception wasn't thrown for the correct index and * if the method have returned a not null for the correct index. */ public void _getSelectedAccessibleChild() throws Exception { executeMethod("getSelectedAccessibleChildCount()"); boolean res = true; int selectedCount = oObj.getSelectedAccessibleChildCount(); log.println("getSelectedAccessibleChildCount: " + selectedCount); try { log.println("getSelectedAccessibleChild(-1)"); oObj.getSelectedAccessibleChild(-1); log.println("Exception was expected"); res = false; } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Expected exception"); res = true; } try { log.println("getSelectedAccessibleChild(" + selectedCount + ")"); oObj.getSelectedAccessibleChild(selectedCount); log.println("Exception was expected"); res &= false; } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Expected exception"); res &= true; } int SelectableChildCount = chkSelectable(tEnv.getTestObject()); if (SelectableChildCount > 500) { SelectableChildCount = 500; } if (SelectableChildCount > 0) { int k = 0; try { for (k = 0; k < SelectableChildCount; k++) { log.println("Trying to select child with index " + k); if (isSelectable(tEnv.getTestObject(), k)) { oObj.selectAccessibleChild(k); waitForEventIdle(); log.println("selected child count: " + oObj.getSelectedAccessibleChildCount()); XAccessible selChild = oObj.getSelectedAccessibleChild(0); res &= (selChild != null); log.println("valid child - " + (selChild != null)); } else { log.println("Child isn't selectable"); } } } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Unexpected exception: Last relevant calls:\n " + "\toObj.selectAccessibleChild("+k+")\n" + "\toObj.getSelectedAccessibleChild(0)"); e.printStackTrace(log); res = false; } } tRes.tested("getSelectedAccessibleChild()", res); } /** * Calls the method with wrong and with correct indexes. * Has OK status if exceptions were thrown for the calls with * the wrong indexes, if exception wasn't thrown for the call * with correct index and if number of selected child was * decreased after the correct call. */ public void _deselectAccessibleChild() { executeMethod("getSelectedAccessibleChild()"); boolean res = true; int selCount = oObj.getSelectedAccessibleChildCount(); log.println("getSelectedAccessibleChildCount():" + selCount); try { log.println("deselectAccessibleChild(-1)"); oObj.deselectAccessibleChild(-1); log.println("Exception was expected"); res = false; } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Expected exception"); res &= true; } try { log.println("deselectAccessibleChild(" + (childCount + 1) + ")"); oObj.deselectAccessibleChild(childCount + 1); log.println("Exception was expected"); res = false; } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Expected exception"); res &= true; } log.println("#################"); log.println("Selecting all accessible"); oObj.selectAllAccessibleChildren(); selCount = oObj.getSelectedAccessibleChildCount(); log.println("getSelectedAccessibleChildCount():" + selCount); if ((childCount > 0) && (selCount > 0)) { try { int maxCount = chkSelectable(tEnv.getTestObject()); if (childCount > 100) { maxCount = 100; } for (int k = 0; k < maxCount; k++) { log.println("deselectAccessibleChild(" + k + ")"); if (oObj.isAccessibleChildSelected(k)) { oObj.deselectAccessibleChild(k); } } int newSelCount = oObj.getSelectedAccessibleChildCount(); log.println("getSelectedAccessibleChildCount():" + newSelCount); if (OneAlwaysSelected && (selCount == 1)) { log.println("One Child is always selected"); res &= true; } else { res &= (selCount > newSelCount); } } catch (com.sun.star.lang.IndexOutOfBoundsException e) { log.println("Unexpected exception"); e.printStackTrace(log); res = false; } } tRes.tested("deselectAccessibleChild()", res); } protected static int chkSelectable(Object Testcase) { int ret = 0; XAccessibleContext accCon = UnoRuntime.queryInterface( XAccessibleContext.class, Testcase); int cc = accCon.getAccessibleChildCount(); if (cc > 500) { return cc; } for (int i = 0; i < cc; i++) { try { if (accCon.getAccessibleChild(i).getAccessibleContext() .getAccessibleStateSet() .contains(com.sun.star.accessibility.AccessibleStateType.SELECTABLE)) { ret = ret + 1; System.out.println("Child " + i + " is selectable"); } } catch (com.sun.star.lang.IndexOutOfBoundsException iab) { } } return ret; } protected static boolean isSelectable(Object Testcase, int index) { XAccessibleContext accCon = UnoRuntime.queryInterface( XAccessibleContext.class, Testcase); boolean res = false; try { if (accCon.getAccessibleChild(index).getAccessibleContext() .getAccessibleStateSet() .contains(com.sun.star.accessibility.AccessibleStateType.SELECTABLE)) { res = true; } //selecting menuitems or the separator will lead to closing the menu if ((accCon.getAccessibleChild(index).getAccessibleContext() .getAccessibleRole() == AccessibleRole.MENU_ITEM) || (accCon.getAccessibleChild(index).getAccessibleContext() .getAccessibleRole() == AccessibleRole.SEPARATOR)) { res = false; } } catch (com.sun.star.lang.IndexOutOfBoundsException e) { System.out.println("Exception while checking for selectability"); } return res; } }