| /************************************************************** |
| * |
| * 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 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| package ifc.beans; |
| |
| import java.io.PrintWriter; |
| import java.util.HashSet; |
| import java.util.Set; |
| import java.util.StringTokenizer; |
| |
| import lib.MultiMethodTest; |
| import lib.Status; |
| import util.ValueChanger; |
| |
| import com.sun.star.beans.Property; |
| import com.sun.star.beans.PropertyAttribute; |
| import com.sun.star.beans.PropertyChangeEvent; |
| import com.sun.star.beans.XMultiPropertySet; |
| import com.sun.star.beans.XPropertiesChangeListener; |
| import com.sun.star.beans.XPropertySetInfo; |
| import com.sun.star.lang.EventObject; |
| |
| |
| /** |
| * Testing <code>com.sun.star.beans.XMultiPropertySet</code> |
| * interface methods : |
| * <ul> |
| * <li><code> getPropertySetInfo()</code></li> |
| * <li><code> setPropertyValues()</code></li> |
| * <li><code> getPropertyValues()</code></li> |
| * <li><code> addPropertiesChangeListener()</code></li> |
| * <li><code> removePropertiesChangeListener()</code></li> |
| * <li><code> firePropertiesChangeEvent()</code></li> |
| * </ul> <p> |
| * |
| * Required relations : |
| * <ul> |
| * <li> <code>'XMultiPropertySet.ExcludeProps'</code> |
| * <b>(optional) </b> : java.util.Set. |
| * Has property names which must be skipped from testing in |
| * some reasons (for example property accepts restricted set |
| * of values). |
| * </li> |
| * <ul> <p> |
| * |
| * Test is <b> NOT </b> multithread compilant. <p> |
| * After test completion object environment has to be recreated. |
| * @see com.sun.star.beans.XMultiPropertySet |
| */ |
| public class _XMultiPropertySet extends MultiMethodTest { |
| |
| public XMultiPropertySet oObj = null; |
| |
| private boolean propertiesChanged = false; |
| private XPropertySetInfo propertySetInfo = null; |
| private String [] testPropsNames = null; |
| private int testPropsAmount = 0; |
| private PrintWriter _log = null; |
| |
| private Object[] values = null; |
| |
| private Set exclProps = null; |
| |
| /** |
| * Initializes some fields. |
| */ |
| public void before() { |
| _log = log; |
| |
| exclProps = (Set) tEnv.getObjRelation("XMultiPropertySet.ExcludeProps"); |
| if (exclProps == null) exclProps = new HashSet(0); |
| } |
| |
| /** |
| * Listener implementation which sets a flag when |
| * listener was called. |
| */ |
| public class MyChangeListener implements XPropertiesChangeListener { |
| public void propertiesChange(PropertyChangeEvent[] e) { |
| //_log.println("Listener was called"); |
| propertiesChanged = true; |
| } |
| public void disposing (EventObject obj) {} |
| } |
| |
| private XPropertiesChangeListener PClistener = |
| new MyChangeListener(); |
| |
| /** |
| * Test calls the method and checks return value. |
| * <code>PropertySetInfo</code> object is stored<p> |
| * Has <b> OK </b> status if the method returns not null value |
| * and no exceptions were thrown. <p> |
| */ |
| public void _getPropertySetInfo() { |
| boolean bResult = true; |
| propertySetInfo = oObj.getPropertySetInfo(); |
| |
| if (propertySetInfo == null) { |
| log.println("getPropertySetInfo() method returned null"); |
| bResult = false; |
| } |
| |
| tRes.tested("getPropertySetInfo()", bResult) ; |
| } |
| |
| |
| /** |
| * Test collects all property names and retrieves their values, |
| * then checks the value returned. Finally it also collects |
| * bound properties for other methods tests.<p> |
| * Has <b> OK </b> status if the method returns non null value |
| * and no exceptions were thrown. <p> |
| * The following method tests are to be completed successfully before : |
| * <ul> |
| * <li> <code> getPropertySetInfo() </code> : to have a list |
| * of properties.</li> |
| * </ul> |
| */ |
| public void _getPropertyValues() { |
| requiredMethod("getPropertySetInfo()"); |
| boolean bResult = true; |
| |
| Property[] properties = propertySetInfo.getProperties(); |
| String[] allnames = new String[properties.length]; |
| for (int i = 0; i < properties.length; i++) { |
| allnames[i] = properties[i].Name; |
| } |
| |
| values = oObj.getPropertyValues(allnames); |
| |
| bResult &= values!=null; |
| tRes.tested("getPropertyValues()", bResult) ; |
| |
| getPropsToTest(properties); |
| } |
| |
| /** |
| * Test adds listener for all bound properties then each property |
| * is changed and listener call . <p> |
| * Has <b> OK </b> status if on each property change the listener was |
| * called and no exceptions were thrown. <p> |
| * The following method tests are to be completed successfully before : |
| * <ul> |
| * <li> <code> getPropertyValues() </code> : to collect bound |
| * properties.</li> |
| * </ul> |
| */ |
| public void _addPropertiesChangeListener() { |
| |
| requiredMethod("getPropertyValues()"); |
| |
| boolean result = true ; |
| // Creating listener |
| oObj.addPropertiesChangeListener(testPropsNames, PClistener); |
| |
| if ((testPropsAmount==1) && (testPropsNames[0].equals("none"))) { |
| testPropsAmount = 0; |
| } |
| |
| |
| // Change one of the property to be sure, that this event was cauched. |
| //Random rnd = new Random(); |
| //int idx = rnd.nextInt(testPropsAmount); |
| for (int i=0; i<testPropsAmount;i++) { |
| log.print("Trying to change property " + testPropsNames[i]); |
| try { |
| Object[] gValues = oObj.getPropertyValues(testPropsNames); |
| Object newValue = ValueChanger.changePValue(gValues[i]); |
| gValues[i] = newValue; |
| propertiesChanged = false; |
| oObj.setPropertyValues(testPropsNames, gValues); |
| waitAMoment() ; |
| result &= propertiesChanged ; |
| log.println(" ... done"); |
| } catch (com.sun.star.beans.PropertyVetoException e) { |
| log.println("Exception occured while trying to change "+ |
| "property '"+testPropsNames[i] + "' :" + e); |
| e.printStackTrace(log); |
| } catch (com.sun.star.lang.IllegalArgumentException e) { |
| log.println("Exception occured while trying to change "+ |
| "property '"+testPropsNames[i] + "' :" + e); |
| e.printStackTrace(log); |
| } catch (com.sun.star.lang.WrappedTargetException e) { |
| log.println("Exception occured while trying to change "+ |
| "property '"+testPropsNames[i] + "' :" + e); |
| e.printStackTrace(log); |
| } // end of try-catch |
| } |
| if (testPropsAmount == 0) { |
| log.println("all properties are read only"); |
| tRes.tested("addPropertiesChangeListener()", Status.skipped(true)); |
| } else { |
| tRes.tested("addPropertiesChangeListener()", propertiesChanged); |
| } |
| } |
| |
| /** |
| * Calls method and check if listener was called. <p> |
| * Has <b> OK </b> status if the listener was |
| * called and no exceptions were thrown. <p> |
| * The following method tests are to be completed successfully before : |
| * <ul> |
| * <li> <code> addPropertiesChangeListener() </code> : listener to |
| * be added.</li> |
| * </ul> |
| */ |
| public void _firePropertiesChangeEvent() { |
| requiredMethod("addPropertiesChangeListener()"); |
| propertiesChanged = false ; |
| |
| oObj.firePropertiesChangeEvent(testPropsNames, PClistener); |
| waitAMoment() ; |
| |
| tRes.tested("firePropertiesChangeEvent()", propertiesChanged); |
| } |
| |
| |
| /** |
| * Removes listener added before. <p> |
| * Has <b> OK </b> status no exceptions were thrown. <p> |
| * The following method tests are to be completed successfully before : |
| * <ul> |
| * <li> <code> addPropertiesChangeListener() </code> : listener to |
| * be added.</li> |
| * </ul> |
| */ |
| public void _removePropertiesChangeListener() { |
| requiredMethod("firePropertiesChangeEvent()"); |
| boolean bResult = true; |
| |
| oObj.removePropertiesChangeListener(PClistener); |
| |
| tRes.tested("removePropertiesChangeListener()", bResult); |
| } |
| |
| |
| /** |
| * Changes all properties, then set them to new values, get them |
| * and checks if their values were changed properly. <p> |
| * Has <b> OK </b> status if all properties properly changed |
| * and no exceptions were thrown. <p> |
| * The following method tests are to be completed successfully before : |
| * <ul> |
| * <li> <code> getPropertyValues() </code> : to collect bound |
| * properties.</li> |
| * </ul> |
| */ |
| public void _setPropertyValues() { |
| requiredMethod("getPropertyValues()"); |
| boolean bResult = true; |
| |
| if ((testPropsNames.length==1)&&(testPropsNames[0].equals("none"))) { |
| log.println("all properties are readOnly"); |
| tRes.tested("setPropertyValues()",Status.skipped(true)); |
| return; |
| } |
| |
| log.println("Changing all properties"); |
| Object[] gValues = oObj.getPropertyValues(testPropsNames); |
| for (int i=0; i<testPropsAmount;i++) { |
| Object oldValue = gValues[i]; |
| Object newValue = ValueChanger.changePValue(oldValue); |
| gValues[i] = newValue; |
| } |
| |
| try { |
| oObj.setPropertyValues(testPropsNames, gValues); |
| Object[] newValues = oObj.getPropertyValues(testPropsNames); |
| for (int i=0; i<testPropsAmount;i++) { |
| if (newValues[i].equals(gValues[i])) { |
| bResult = true; |
| } |
| } |
| } catch (com.sun.star.beans.PropertyVetoException e) { |
| log.println("Exception occured while setting properties"); |
| e.printStackTrace(log); |
| bResult = false; |
| } catch (com.sun.star.lang.IllegalArgumentException e) { |
| log.println("Exception occured while setting properties"); |
| e.printStackTrace(log); |
| bResult = false; |
| } catch (com.sun.star.lang.WrappedTargetException e) { |
| log.println("Exception occured while setting properties"); |
| e.printStackTrace(log); |
| bResult = false; |
| } // end of try-catch |
| |
| tRes.tested("setPropertyValues()", bResult); |
| } |
| |
| //Get the properties being tested |
| private void getPropsToTest(Property[] properties) { |
| |
| String bound = ""; |
| |
| for (int i = 0; i < properties.length; i++) { |
| |
| Property property = properties[i]; |
| String name = property.Name; |
| boolean isWritable = ((property.Attributes & |
| PropertyAttribute.READONLY) == 0); |
| boolean isNotNull = ((property.Attributes & |
| PropertyAttribute.MAYBEVOID) == 0); |
| boolean isBound = ((property.Attributes & |
| PropertyAttribute.BOUND) != 0); |
| boolean isExcluded = exclProps.contains(name); |
| |
| //exclude UserDefined, because we can't change XNameContainer |
| if (name.indexOf("UserDefined")>0 || name.indexOf("Device")>0) { |
| isWritable=false; |
| } |
| |
| values = oObj.getPropertyValues(new String[]{property.Name}); |
| |
| boolean isVoid = util.utils.isVoid(values[0]); |
| |
| if ( isWritable && isNotNull && isBound && !isExcluded && !isVoid) { |
| bound+=name+";"; |
| } |
| |
| } // endfor |
| |
| //get a array of bound properties |
| if (bound.equals("")) bound = "none"; |
| StringTokenizer ST=new StringTokenizer(bound,";"); |
| int nr = ST.countTokens(); |
| testPropsNames = new String[nr]; |
| for (int i=0; i<nr; i++) testPropsNames[i] = ST.nextToken(); |
| testPropsAmount = nr; |
| return; |
| |
| } |
| |
| /** |
| * Waits some time for listener to be called. |
| */ |
| private void waitAMoment() { |
| try { |
| Thread.sleep(200) ; |
| } catch (java.lang.InterruptedException e) { |
| log.println("!!! Exception while waiting !!!") ; |
| } |
| } |
| |
| /* |
| * Does nothing. |
| */ |
| protected void after() { |
| disposeEnvironment(); |
| } |
| } |
| |
| |