/*************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 * 
 * Copyright 2000, 2010 Oracle and/or its affiliates.
 *
 * OpenOffice.org - a multi-platform office productivity suite
 *
 * This file is part of OpenOffice.org.
 *
 * OpenOffice.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * OpenOffice.org is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with OpenOffice.org.  If not, see
 * <http://www.openoffice.org/license.html>
 * for a copy of the LGPLv3 License.
 *
 ************************************************************************/

package com.sun.star.lib.uno.helper;
import com.sun.star.lang.EventObject;
import com.sun.star.lang.DisposedException;
import com.sun.star.uno.Type;
import com.sun.star.uno.TypeClass;
import com.sun.star.uno.XInterface;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.Any;
import com.sun.star.uno.XWeak;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.UnknownPropertyException;
import com.sun.star.beans.Property;
import com.sun.star.beans.PropertyAttribute;
import com.sun.star.beans.XPropertyChangeListener;
import com.sun.star.beans.PropertyVetoException;
import com.sun.star.beans.PropertyChangeEvent;
import com.sun.star.beans.XVetoableChangeListener;
import com.sun.star.beans.XPropertySetInfo;
import com.sun.star.beans.XPropertiesChangeListener;

import java.util.Arrays;

public class PropertySet_Test
{
    
    /** Creates a new instance of PropertySet_Test */
    public PropertySet_Test()
    {
    }
    
    public boolean convertPropertyValue()
    {
        System.out.println("PropertySet.convertPropertyValue");
        boolean[] r= new boolean[50];
        int i= 0;
        
        TestClass cl= new TestClass();
        try {
        r[i++]= cl.test_convertPropertyValue();
        }catch(java.lang.Exception e){
            i++;
        }
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }

    public boolean setPropertyValueNoBroadcast()
    {
        System.out.println("PropertySet.setValueNoBroadcast");
        boolean[] r= new boolean[50];
        int i= 0;
        
        TestClass cl= new TestClass();
        try {
            r[i++]= cl.test_setPropertyValueNoBroadcast();
        }catch(java.lang.Exception e){
            i++;
        }
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }

    public boolean setPropertyValue()
    {
        System.out.println("PropertySet.setPropertyValue");
        boolean[] r= new boolean[150];
        int i= 0;
        
        TestClass cl= new TestClass();
        try {
            cl.resetPropertyMembers();
            Object value;
            Object ret;
            value= new Boolean(true);
            cl.setPropertyValue("PropBoolA", value);
            ret=  cl.getPropertyValue("PropBoolA");
            r[i++]= ((Boolean) ret).equals( (Boolean) value);
            value= new Character('A');
            cl.setPropertyValue("PropCharA",value);
            ret= cl.getPropertyValue("PropCharA");
            r[i++]= ((Character) ret).equals((Character) value);
            value= new Byte((byte) 111);
            cl.setPropertyValue("PropByteA",value);
            ret= cl.getPropertyValue("PropByteA");
            r[i++]= ((Byte) ret).equals((Byte) value);
            value= new Short((short)112);
            cl.setPropertyValue("PropShortA", value);
            ret= cl.getPropertyValue("PropShortA");
            r[i++]= ((Short) ret).equals((Short) value);
            value= new Integer(113);
            cl.setPropertyValue("PropIntA", value);
            ret= cl.getPropertyValue("PropIntA");
            r[i++]= ((Integer) ret).equals((Integer) value);
            value= new Long(115);
            cl.setPropertyValue("PropLongA", value);
            ret= cl.getPropertyValue("PropLongA");
            r[i++]= ((Long) ret).equals((Long) value);
            value= new Float(3.14);
            cl.setPropertyValue("PropFloatA", value);
            ret= cl.getPropertyValue("PropFloatA");
            r[i++]= ((Float) ret).equals((Float) value);
            value= new Double(3.145);
            cl.setPropertyValue("PropDoubleA",value);
            ret= cl.getPropertyValue("PropDoubleA");
            r[i++]= ((Double) ret).equals((Double) value);
            value= new String("string");
            cl.setPropertyValue("PropStringA",value);
            ret= cl.getPropertyValue("PropStringA");
            r[i++]= ((String) ret).equals((String) value);
            value= new ComponentBase();
            cl.setPropertyValue("PropXInterfaceA",value);
            ret= cl.getPropertyValue("PropXInterfaceA");
            r[i++]= ((XInterface) ret).equals((XInterface) value);
            value= new ComponentBase();
            cl.setPropertyValue("PropXWeakA",value);
            ret= cl.getPropertyValue("PropXWeakA");
            r[i++]= ((XWeak) ret).equals((XWeak) value);
            value = com.sun.star.beans.PropertyState.AMBIGUOUS_VALUE;
            cl.setPropertyValue("PropEnum",value);
            ret= cl.getPropertyValue("PropEnum");
            r[i++]= ret == value;
            value= new byte[]{1,2,3};
            cl.setPropertyValue("PropArrayByteA", value);
            ret= cl.getPropertyValue("PropArrayByteA");
            r[i++]= ((byte[]) ret).equals((byte[]) value);
            value= new Type(String.class);
            cl.setPropertyValue("PropTypeA", value);
            ret= cl.getPropertyValue("PropTypeA");
            r[i++]= ((Type) ret).equals(value);
            
            // test protected,package,private members
            value= new Boolean(true);
            cl.setPropertyValue("PropBoolB", value);
            ret= cl.getPropertyValue("PropBoolB");
            r[i++]= ((Boolean) ret).equals((Boolean) value);
            cl.setPropertyValue("PropBoolC", value);
            ret= cl.getPropertyValue("PropBoolC");
            r[i++]= ((Boolean) ret).equals((Boolean) value);
            
            try{
                cl.setPropertyValue("PropBoolD", value);
                i++;
            }catch (Exception e)
            {
                r[i++]= true;
            }
            cl.resetPropertyMembers();
            
            value= new Boolean(true);
            cl.setPropertyValue("PropObjectA", value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((Boolean) ret).equals((Boolean) value);
            value= new Character('A');
            cl.setPropertyValue("PropObjectA",value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((Character) ret).equals((Character) value);
            value= new Byte((byte) 111);
            cl.setPropertyValue("PropObjectA",value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((Byte) ret).equals((Byte) value);
            value= new Short((short)112);
            cl.setPropertyValue("PropObjectA", value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((Short) ret).equals((Short) value);
            value= new Integer(113);
            cl.setPropertyValue("PropObjectA", value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((Integer) ret).equals((Integer) value);
            value= new Long(115);
            cl.setPropertyValue("PropObjectA", value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((Long) ret).equals((Long) value);
            value= new Float(3.14);
            cl.setPropertyValue("PropObjectA", value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((Float) ret).equals((Float) value);
            value= new Double(3.145);
            cl.setPropertyValue("PropObjectA",value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((Double) ret).equals((Double) value);
            value= new String("string");
            cl.setPropertyValue("PropObjectA",value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((String) ret).equals((String) value);
            value= new ComponentBase();
            cl.setPropertyValue("PropObjectA",value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((XInterface) ret).equals((XInterface) value);
            value= new ComponentBase();
            cl.setPropertyValue("PropObjectA",value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((XWeak) ret).equals((XWeak) value);
            value= new byte[]{1,2,3};
            cl.setPropertyValue("PropObjectA", value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((byte[]) ret).equals((byte[]) value);
            value= new Type(String.class);
            cl.setPropertyValue("PropObjectA", value);
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((Type) ret).equals(value);
            cl.setPropertyValue("PropObjectA", new Any( new Type(byte.class), new Byte((byte)1)));
            ret= cl.getPropertyValue("PropObjectA");
            r[i++]= ((Byte) ret).byteValue() == 1;
            
           cl.resetPropertyMembers();           
            value= new Boolean(true);
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Character('A');
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Byte((byte) 111);
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Short((short)112);
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Integer(113);
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Long(115);
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Float(3.14);
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Double(3.145);
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new String("string");
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new ComponentBase();
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new ComponentBase();
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new byte[]{1,2,3};
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Type(String.class);
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);

            cl.resetPropertyMembers();           
            value= new Any(new Type(boolean.class), new Boolean(true));
            cl.setPropertyValue("PropBoolA", value);
            ret= cl.getPropertyValue("PropBoolA");
            r[i++]= ret instanceof Boolean && util.anyEquals(value, ret);
            value= new Any (new Type(char.class), new Character('A'));
            cl.setPropertyValue("PropCharA",value);
            ret= cl.getPropertyValue("PropCharA");
            r[i++]= ret instanceof Character && util.anyEquals(value, ret);
            value= new Any(new Type(byte.class), new Byte((byte) 111));
            cl.setPropertyValue("PropByteA",value);
            ret= cl.getPropertyValue("PropByteA");
            r[i++]= ret instanceof Byte && util.anyEquals(value, ret);
            value= new Any(new Type(short.class), new Short((short)112));
            cl.setPropertyValue("PropShortA", value);
            ret= cl.getPropertyValue("PropShortA");
            r[i++]= ret instanceof Short && util.anyEquals(value, ret);
            value= new Any(new Type(int.class), new Integer(113));
            cl.setPropertyValue("PropIntA", value);
            ret= cl.getPropertyValue("PropIntA");
            r[i++]= ret instanceof Integer && util.anyEquals(value, ret);
            value= new Any(new  Type(long.class), new Long(115));
            cl.setPropertyValue("PropLongA", value);
            ret= cl.getPropertyValue("PropLongA");
            r[i++]= ret instanceof Long && util.anyEquals(value, ret);
            value= new Any(new Type(float.class), new Float(3.14));
            cl.setPropertyValue("PropFloatA", value);
            ret= cl.getPropertyValue("PropFloatA");
            r[i++]= ret instanceof Float && util.anyEquals(value, ret);
            value= new Any(new Type(double.class),new Double(3.145));
            cl.setPropertyValue("PropDoubleA",value);
            ret= cl.getPropertyValue("PropDoubleA");
            r[i++]= ret instanceof Double && util.anyEquals(value, ret);
            value= new Any(new Type(String.class), new String("string"));
            cl.setPropertyValue("PropStringA",value);
            ret= cl.getPropertyValue("PropStringA");
            r[i++]= ret instanceof String && util.anyEquals(value, ret);
            value= new Any(new Type(ComponentBase.class), new ComponentBase());
            cl.setPropertyValue("PropXInterfaceA",value);
            ret= cl.getPropertyValue("PropXInterfaceA");
            r[i++]= ret instanceof ComponentBase && util.anyEquals(value, ret);
            value= new Any( new Type(ComponentBase.class), new ComponentBase());
            cl.setPropertyValue("PropXWeakA",value);
            ret= cl.getPropertyValue("PropXWeakA");
            r[i++]= ret instanceof ComponentBase && util.anyEquals(value, ret);
            value= new Any(new Type(byte[].class), new byte[]{1,2,3});
            cl.setPropertyValue("PropArrayByteA", value);
            ret= cl.getPropertyValue("PropArrayByteA");
            r[i++]= ret instanceof byte[] && util.anyEquals(value, ret);
            value= new Any(new Type(Type.class), new Type(String.class));
            cl.setPropertyValue("PropTypeA", value);
            ret= cl.getPropertyValue("PropTypeA");
            r[i++]= ret instanceof Type && util.anyEquals(value, ret);
            

            cl.resetPropertyMembers();           
            value= new Any(new Type(boolean.class), new Boolean(true));
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any (new Type(char.class), new Character('A'));
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any(new Type(byte.class), new Byte((byte) 111));
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any(new Type(short.class), new Short((short)112));
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any(new Type(int.class), new Integer(113));
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any(new  Type(long.class), new Long(115));
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any(new Type(float.class), new Float(3.14));
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any(new Type(double.class),new Double(3.145));
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any(new Type(String.class), new String("string"));
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any(new Type(ComponentBase.class), new ComponentBase());
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any( new Type(ComponentBase.class), new ComponentBase());
            cl.setPropertyValue("PropAnyA",value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any(new Type(byte[].class), new byte[]{1,2,3});
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            value= new Any(new Type(Type.class), new Type(String.class));
            cl.setPropertyValue("PropAnyA", value);
            ret= cl.getPropertyValue("PropAnyA");
            r[i++]= ret instanceof Any && util.anyEquals(value, ret);
            
            
            // ------------------------------------------------------------------------------
            cl.resetPropertyMembers();
            value= new Boolean(true);
            cl.setPropertyValue("PropBoolClass", value);
            ret=  cl.getPropertyValue("PropBoolClass");
            r[i++]= ((Boolean) ret).equals( (Boolean) value);
            value= new Character('A');
            cl.setPropertyValue("PropCharClass",value);
            ret= cl.getPropertyValue("PropCharClass");
            r[i++]= ((Character) ret).equals((Character) value);
            value= new Byte((byte) 111);
            cl.setPropertyValue("PropByteClass",value);
            ret= cl.getPropertyValue("PropByteClass");
            r[i++]= ((Byte) ret).equals((Byte) value);
            value= new Short((short)112);
            cl.setPropertyValue("PropShortClass", value);
            ret= cl.getPropertyValue("PropShortClass");
            r[i++]= ((Short) ret).equals((Short) value);
            value= new Integer(113);
            cl.setPropertyValue("PropIntClass", value);
            ret= cl.getPropertyValue("PropIntClass");
            r[i++]= ((Integer) ret).equals((Integer) value);
            value= new Long(115);
            cl.setPropertyValue("PropLongClass", value);
            ret= cl.getPropertyValue("PropLongClass");
            r[i++]= ((Long) ret).equals((Long) value);
            value= new Float(3.14);
            cl.setPropertyValue("PropFloatClass", value);
            ret= cl.getPropertyValue("PropFloatClass");
            r[i++]= ((Float) ret).equals((Float) value);
            value= new Double(3.145);
            cl.setPropertyValue("PropDoubleClass",value);
            ret= cl.getPropertyValue("PropDoubleClass");
            r[i++]= ((Double) ret).equals((Double) value);
            
            cl.resetPropertyMembers();
                        
            cl.resetPropertyMembers();           
            value= new Any(new Type(boolean.class), new Boolean(true));
            cl.setPropertyValue("PropBoolClass", value);
            ret= cl.getPropertyValue("PropBoolClass");
            r[i++]= ret instanceof Boolean && util.anyEquals(value, ret);
            value= new Any (new Type(char.class), new Character('A'));
            cl.setPropertyValue("PropCharClass",value);
            ret= cl.getPropertyValue("PropCharClass");
            r[i++]= ret instanceof Character && util.anyEquals(value, ret);
            value= new Any(new Type(byte.class), new Byte((byte) 111));
            cl.setPropertyValue("PropByteClass",value);
            ret= cl.getPropertyValue("PropByteClass");
            r[i++]= ret instanceof Byte && util.anyEquals(value, ret);
            value= new Any(new Type(short.class), new Short((short)112));
            cl.setPropertyValue("PropShortClass", value);
            ret= cl.getPropertyValue("PropShortClass");
            r[i++]= ret instanceof Short && util.anyEquals(value, ret);
            value= new Any(new Type(int.class), new Integer(113));
            cl.setPropertyValue("PropIntClass", value);
            ret= cl.getPropertyValue("PropIntClass");
            r[i++]= ret instanceof Integer && util.anyEquals(value, ret);
            value= new Any(new  Type(long.class), new Long(115));
            cl.setPropertyValue("PropLongClass", value);
            ret= cl.getPropertyValue("PropLongClass");
            r[i++]= ret instanceof Long && util.anyEquals(value, ret);
            value= new Any(new Type(float.class), new Float(3.14));
            cl.setPropertyValue("PropFloatClass", value);
            ret= cl.getPropertyValue("PropFloatClass");
            r[i++]= ret instanceof Float && util.anyEquals(value, ret);
            value= new Any(new Type(double.class),new Double(3.145));
            cl.setPropertyValue("PropDoubleClass",value);
            ret= cl.getPropertyValue("PropDoubleClass");
            r[i++]= ret instanceof Double && util.anyEquals(value, ret);
            value= new Any(new Type(String.class), new String("string"));

            

            // PropertyAttribute.READONLY
            cl.propBoolA.Attributes= PropertyAttribute.READONLY;
            try{
                cl.setPropertyValue("PropBoolA", new Boolean(true));
                i++;
            }catch (com.sun.star.beans.PropertyVetoException e)
            {
                r[i++]= true;
            }
            cl.propBoolA.Attributes= 0;
            
            // MAYBEVOID
            cl.resetPropertyMembers();
            // first MAYBEVOID not set
            
            //primitive members: must not work
            
            cl.boolPropA= false;
            try {
                cl.setPropertyValue("PropBoolA", null); i++;
            } catch (com.sun.star.lang.IllegalArgumentException e) {
                r[i++]= true;
            }
            try {
                cl.setPropertyValue("PropBoolA", new Any(new Type(boolean.class), null)); i++;
            } catch (com.sun.star.lang.IllegalArgumentException e) {
                r[i++]= true;
            }
            cl.propBoolA.Attributes= PropertyAttribute.MAYBEVOID;
            try{
                cl.setPropertyValue("PropBoolA", null); i++;
            } catch (com.sun.star.lang.IllegalArgumentException e) {
                r[i++]= true;
            }
            cl.propBoolA.Attributes= 0;
            
            cl.propBoolClass.Attributes= PropertyAttribute.MAYBEVOID;
            cl.boolClassProp= null;
            cl.setPropertyValue("PropBoolClass", null);
            r[i++]= cl.boolClassProp == null;
            // the returned value must be a void any
            Object objAny= cl.getPropertyValue("PropBoolClass");
            r[i++]= util.isVoidAny( objAny);
            
            cl.boolClassProp= new Boolean(true);
            cl.setPropertyValue("PropBoolClass", null);
            r[i++]= cl.boolClassProp == null;
            cl.boolClassProp= new Boolean(false);
            cl.setPropertyValue("PropBoolClass", new Any(new Type(boolean.class),null));
            r[i++]= cl.boolClassProp == null;

            cl.propXWeakA.Attributes= PropertyAttribute.MAYBEVOID;
            cl.setPropertyValue("PropXWeakA", null);
            r[i++]= util.isVoidAny(cl.getPropertyValue("PropXWeakA"));
            cl.propXWeakA.Attributes= 0;
            
            cl.anyPropA= null;
            try{
                cl.setPropertyValue("PropAnyA", null); i++;
            }catch (com.sun.star.lang.IllegalArgumentException e) {
                r[i++]= true;
            }
            cl.anyPropA= null;
            cl.propAnyA.Attributes= PropertyAttribute.MAYBEVOID;
            
            Type _t= new Type(Object.class);
            cl.setPropertyValue("PropAnyA", null);
            r[i++]= cl.anyPropA.getType().equals(new Type(void.class)) &&
                    cl.anyPropA.getObject() == null;
            
            cl.anyPropA= new Any(new Type(byte.class),new Byte((byte) 111));
            cl.setPropertyValue("PropAnyA", null);
            r[i++]= cl.anyPropA.getType().equals(new Type(byte.class)) &&
                    cl.anyPropA.getObject() == null;
            
            cl.anyPropA= null;
            try{
                cl.setPropertyValue("PropAnyA", new Object()); i++;
            }catch (com.sun.star.lang.IllegalArgumentException e)
            {
                r[i++]= true;
            }
            
            cl.propObjectA.Attributes= 0;
            try{
                cl.setPropertyValue("PropObjectA", null); i++;
            }catch (com.sun.star.lang.IllegalArgumentException e)
            {
                r[i++]= true;
            }
            try{
                cl.setPropertyValue("PropObjectA", new Any( new Type(byte.class), null)); i++;
            } catch (com.sun.star.lang.IllegalArgumentException e)
            {
                r[i++]= true;
            }
            
            cl.propObjectA.Attributes= PropertyAttribute.MAYBEVOID;
            cl.propObjectA= null;
            cl.setPropertyValue("PropObjectA", null);
            r[i++]= cl.propObjectA == null;
            
            cl.propObjectA= null;
            cl.setPropertyValue("PropObjectA", new Any( new Type(byte.class), null));
            r[i++]= cl.propObjectA == null;
            
            
            // 
            
        }catch(java.lang.Exception e){
            i++;
        }
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }

    public boolean addPropertyChangeListener()
    {
        System.out.println("PropertySet.addPropertyChangeListener,\n" +
                            "PropertySet.removePropertChangeListener," + 
                            "PropertySet.addVetoableChangeListener, \n" +
                            "PropertySet.removeVetoableChangeListener" +
                            "Notification of listeners");
        boolean[] r= new boolean[50];
        int i= 0;
        try {
            TestClass cl= new TestClass();
            Listener li= new Listener();
            cl.addPropertyChangeListener("PropByteA", li);
            Byte val1= new Byte((byte)115);
            cl.setPropertyValue("PropByteA", val1);
            r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0;
            cl.propByteA.Attributes = PropertyAttribute.BOUND;
            cl.addPropertyChangeListener("PropByteA", li);
            Byte val2= new Byte((byte)116);
            cl.setPropertyValue("PropByteA", val2);
            r[i++]= li.nChangeCalled == 1 && li.nVetoCalled == 0;
            r[i++]= li.evt.OldValue.equals(val1) && li.evt.NewValue.equals(val2) && li.evt.Source == cl;
            
            li.reset();
            Listener li2= new Listener();
            cl.addPropertyChangeListener("PropByteA", li2);
            Byte val3= new Byte((byte) 117);
            cl.setPropertyValue("PropByteA", val3);
            r[i++]= li.nChangeCalled == 1 && li.nVetoCalled == 0
                    && li2.nChangeCalled == 1 && li2.nVetoCalled == 0;
            r[i++]= li.evt.OldValue.equals(val2) && li.evt.NewValue.equals(val3) && li.evt.Source == cl 
                    && li2.evt.OldValue.equals(val2) && li2.evt.NewValue.equals(val3) && li2.evt.Source == cl ;
            
            li.reset();
            li2.reset();
            Listener li3= new Listener();
            val1= new Byte((byte)118);
            cl.addPropertyChangeListener("", li3);
            cl.setPropertyValue("PropByteA", val1);
            r[i++]= li.nChangeCalled == 1 && li.nVetoCalled == 0
                    && li2.nChangeCalled == 1 && li2.nVetoCalled == 0
                    &&  li3.nChangeCalled == 1 && li3.nVetoCalled == 0;
            r[i++]= li.evt.OldValue.equals(val3) && li.evt.NewValue.equals(val1) && li.evt.Source == cl; 
            r[i++]= li2.evt.OldValue.equals(val3) && li2.evt.NewValue.equals(val1) && li2.evt.Source == cl; 
            r[i++]= li3.evt.OldValue.equals(val3) && li3.evt.NewValue.equals(val1) && li3.evt.Source == cl ;

            li.reset();
            li2.reset();
            li3.reset();
            cl.removePropertyChangeListener("PropByteA",li);
            cl.setPropertyValue("PropByteA", val1);
            r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0
                    && li2.nChangeCalled == 1 && li2.nVetoCalled == 0
                    &&  li3.nChangeCalled == 1 && li3.nVetoCalled == 0;
            cl.removePropertyChangeListener("PropByteA", li2);
            li.reset();
            li2.reset();
            li3.reset();
            cl.setPropertyValue("PropByteA", val1);
            r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0
                    && li2.nChangeCalled == 0 && li2.nVetoCalled == 0
                    &&  li3.nChangeCalled == 1 && li3.nVetoCalled == 0;
            
            cl.removePropertyChangeListener("", li3);
            li.reset();
            li2.reset();
            li3.reset();
            cl.setPropertyValue("PropByteA", val2);
            r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0
                    && li2.nChangeCalled == 0 && li2.nVetoCalled == 0
                    &&  li3.nChangeCalled == 0 && li3.nVetoCalled == 0;

            cl.addPropertyChangeListener("PropByteA", li);
            cl.addPropertyChangeListener("PropByteA", li2);
            cl.addPropertyChangeListener("", li3);
            cl.dispose();
            li.reset();
            li2.reset();
            li3.reset();
            try {
                cl.setPropertyValue("PropByteA", val2); i++;
            }catch (DisposedException e)
            {
                r[i++]= true;
            }
            
            //Vetoable tests
            cl= new TestClass();
            li.reset();
            li2.reset();
            li3.reset();
            cl.addVetoableChangeListener("PropByteA", li);
            val1= new Byte((byte)115);
            cl.setPropertyValue("PropByteA", val1);
            r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0;
            cl.propByteA.Attributes = PropertyAttribute.CONSTRAINED;
            cl.addVetoableChangeListener("PropByteA", li);
            val2= new Byte((byte)116);
            li.reset();
            cl.setPropertyValue("PropByteA", val2);
            r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 1;
            r[i++]= li.evt.OldValue.equals(val1) && li.evt.NewValue.equals(val2) && li.evt.Source == cl;
            
            li.reset();
            li2.reset();
            li3.reset();
            cl.addVetoableChangeListener("PropByteA", li2);
            val3= new Byte((byte) 117);
            cl.setPropertyValue("PropByteA", val3);
            r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 1
                    && li2.nChangeCalled == 0 && li2.nVetoCalled == 1;
            r[i++]= li.evt.OldValue.equals(val2) && li.evt.NewValue.equals(val3) && li.evt.Source == cl 
                    && li2.evt.OldValue.equals(val2) && li2.evt.NewValue.equals(val3) && li2.evt.Source == cl ;
            
            li.reset();
            li2.reset();
            li3.reset();
            val1= new Byte((byte)118);
            cl.addVetoableChangeListener("", li3);
            cl.setPropertyValue("PropByteA", val1);
            r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 1
                    && li2.nChangeCalled == 0 && li2.nVetoCalled == 1
                    &&  li3.nChangeCalled == 0 && li3.nVetoCalled == 1;
            r[i++]= li.evt.OldValue.equals(val3) && li.evt.NewValue.equals(val1) && li.evt.Source == cl; 
            r[i++]= li2.evt.OldValue.equals(val3) && li2.evt.NewValue.equals(val1) && li2.evt.Source == cl; 
            r[i++]= li3.evt.OldValue.equals(val3) && li3.evt.NewValue.equals(val1) && li3.evt.Source == cl ;

            li.reset();
            li2.reset();
            li3.reset();
            // Test Veto Exception
            cl.setPropertyValue("PropByteA", val1);
            li.bVeto= true;
            try {
                cl.setPropertyValue("PropByteA", val2);i++;
            } catch (PropertyVetoException e)
            {
                r[i++]= true;
            }
            r[i++]= cl.bytePropA == val1.byteValue();
            li.bVeto= false;

            li.reset();
            li2.reset();
            li3.reset();
            cl.removeVetoableChangeListener("PropByteA",li);
            cl.setPropertyValue("PropByteA", val1);
            r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0
                    && li2.nChangeCalled == 0 && li2.nVetoCalled == 1
                    &&  li3.nChangeCalled == 0 && li3.nVetoCalled == 1;
            cl.removeVetoableChangeListener("PropByteA", li2);
            li.reset();
            li2.reset();
            li3.reset();
            cl.setPropertyValue("PropByteA", val1);
            r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0
                    && li2.nChangeCalled == 0 && li2.nVetoCalled == 0
                    &&  li3.nChangeCalled == 0 && li3.nVetoCalled == 1;
            
            cl.removeVetoableChangeListener("", li3);
            li.reset();
            li2.reset();
            li3.reset();
            cl.setPropertyValue("PropByteA", val2);
            r[i++]= li.nChangeCalled == 0 && li.nVetoCalled == 0
                    && li2.nChangeCalled == 0 && li2.nVetoCalled == 0
                    &&  li3.nChangeCalled == 0 && li3.nVetoCalled == 0;

            cl.addVetoableChangeListener("PropByteA", li);
            cl.addVetoableChangeListener("PropByteA", li2);
            cl.addVetoableChangeListener("", li3);
            cl.dispose();
            li.reset();
            li2.reset();
            li3.reset();
            try {
                cl.setPropertyValue("PropByteA", val2);
            }catch (DisposedException e)
            {
                r[i++]= true;
            }
        }catch (Exception e)
        {
            i++;
        }
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }

    public boolean getPropertySetInfo()
    {
        System.out.println("PropertySet.getPropertySetInfo");
        boolean[] r= new boolean[50];
        int i= 0;
        
        TestClass cl= new TestClass();
        try {
            XPropertySetInfo info= cl.getPropertySetInfo();
            Property[] arProps= info.getProperties();
            Property[] arRegProps= cl.getRegisteredProperties();
            r[i++]= arProps.length == arRegProps.length;
            for (int j= 0; j < arProps.length; j++)
            {
                boolean bFound= false;
                for (int k= 0; k < arRegProps.length; k++)
                {
                    if (arProps[j] == arRegProps[k])
                    {
                        bFound= true;
                        break;
                    }
                }
                if ( !bFound)
                    r[i++]= false;
            }
            
            for (int j= 0; j < arRegProps.length; j++)
            {
                Property prop= info.getPropertyByName(arRegProps[j].Name);
                if (prop != arRegProps[j])
                    r[i++]= false;
                if (! info.hasPropertyByName(arRegProps[j].Name))
                    r[i++]= false;
            }
                
            
        }catch(java.lang.Exception e){
            System.out.println(e.getMessage());
            i++;
        }
        
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }

    public boolean setFastPropertyValue()
    {
        System.out.println("PropertySet.setFastPropertyValue");
        boolean[] r= new boolean[50];
        int i= 0;
        
        TestClass cl= new TestClass();
        try {
            cl.setFastPropertyValue(5, new Integer(111));
            r[i++]= cl.intPropA == 111;
            try {
            cl.setFastPropertyValue(-1, new Integer(1)); i++;
            } catch(UnknownPropertyException e)
            {
                r[i++]= true;
            }
        }catch(java.lang.Exception e){
            System.out.println(e.getMessage());
            i++;
        }
        
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }

    public boolean getFastPropertyValue()
    {
        System.out.println("PropertySet.setFastPropertyValue");
        boolean[] r= new boolean[50];
        int i= 0;
        
        TestClass cl= new TestClass();
        try {
            cl.setFastPropertyValue(5, new Integer(111));
            Integer aInt= (Integer) cl.getFastPropertyValue(5);
            r[i++]= aInt.intValue() == 111;
        }catch(java.lang.Exception e){
            System.out.println(e.getMessage());
            i++;
        }
        
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }

    public boolean setPropertyValues()
    {
        System.out.println("PropertySet.setPropertyValues");
        boolean[] r= new boolean[50];
        int i= 0;
        
        TestClass cl= new TestClass();
        try {
            cl.setPropertyValues(new String[0], new Object[0]);
            String[] arNames= new String[] {"PropCharA","PropIntClass","PropObjectA"};
            Character aChar= new Character('A');
            Integer aInt= new Integer(111);
            Byte aByte= new Byte((byte)11);
            Object[] values= new Object[]{aChar, aInt, aByte};
            cl.setPropertyValues(arNames, values);
            r[i++]= cl.charPropA == 'A' && cl.intClassProp.intValue() == 111 && ((Byte)cl.objectPropA).byteValue() == 11;
            
            arNames= new String[] {"blabla","PropIntClass","PropObjectA"};
            cl.resetPropertyMembers();
            cl.setPropertyValues(arNames, values);
            r[i++]= cl.intClassProp.intValue() == 111 && ((Byte)cl.objectPropA).byteValue() == 11;
        }catch(java.lang.Exception e){
            System.out.println(e.getMessage());
            i++;
        }
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }

    public boolean getPropertyValues()
    {
        System.out.println("PropertySet.getPropertyValues");
        boolean[] r= new boolean[50];
        int i= 0;
        
        TestClass cl= new TestClass();
        try {
            cl.charPropA= 'A';
            cl.intClassProp= new Integer(111);
            cl.objectPropA= new Byte((byte)11);
            Object[] values= cl.getPropertyValues(new String[] {"PropCharA","PropIntClass","PropObjectA"});
            
            r[i++]= ((Character) values[0]).charValue() == 'A' && ((Integer) values[1]).intValue() == 111 
                        && ((Byte) values[2]).byteValue() == 11;
        }catch(java.lang.Exception e){
            System.out.println(e.getMessage());
            i++;
        }
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }

    // Currently the listeners are always notified if one of properties has changed.
    // The property names in the first argument are ignored.
    public boolean addPropertiesChangeListener()
    {
        System.out.println("PropertySet.addPropertiesChangeListener\n" +    
                            "PropertySet.removePropertiesChangeListener\n" +
                            "notification of such listeners");
        boolean[] r= new boolean[50];
        int i= 0;
        
        TestClass cl= new TestClass();
        try {
            Listener li1= new Listener();
            Listener li2= new Listener();
            cl.addPropertiesChangeListener(new String[]{"PropCharA"}, li1);
            cl.setPropertyValue("PropCharA", new Character('B'));
            r[i++]= li1.nPropertiesChange == 0;
            cl.propCharA.Attributes= PropertyAttribute.BOUND;
            cl.setPropertyValue("PropCharA", new Character('C'));
            r[i++]= li1.nPropertiesChange == 1;
            
            PropertyChangeEvent evt= li1.arEvt[0];
            r[i++]= evt.PropertyName.equals("PropCharA") && ((Character)evt.OldValue).charValue() == 'B'
                    && ((Character) evt.NewValue).charValue() == 'C';
            li1.reset();
            cl.removePropertiesChangeListener(li1);
            cl.setPropertyValue("PropCharA", new Character('F'));
            r[i++]= li1.nPropertiesChange == 0;
        }catch(java.lang.Exception e){
            System.out.println(e.getMessage());
            i++;
        }
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }

    public boolean firePropertiesChangeEvent()
    {
        System.out.println("PropertySet.firePropertiesChangeEvent");    
        boolean[] r= new boolean[50];
        int i= 0;
        
        TestClass cl= new TestClass();
        try {
            Listener li1= new Listener();
            cl.intClassProp= new Integer(111);
            cl.charPropA= 'A';
            cl.firePropertiesChangeEvent(new String[]{"PropCharA","PropIntClass"},  li1);
            r[i++]= li1.nPropertiesChange == 1;
            PropertyChangeEvent[] arEvt= li1.arEvt;
            r[i++]= arEvt[0].PropertyName.equals("PropCharA") 
                    && ((Character) arEvt[0].OldValue).charValue() == 'A'
                    && ((Character) arEvt[0].NewValue).charValue() == 'A';
            r[i++]= arEvt[1].PropertyName.equals("PropIntClass") 
                    && ((Integer) arEvt[1].OldValue).intValue() == 111
                    && ((Integer) arEvt[1].NewValue).intValue() == 111;
        }catch(java.lang.Exception e){
            System.out.println(e.getMessage());
            i++;
        }
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }
    
    public boolean registerProperty1()
    {
        TestClass2 cl= new TestClass2();
        return cl.test_registerProperty1();
    }

    public boolean registerProperty2()
    {
        TestClass2 cl= new TestClass2();
        return cl.test_registerProperty2();
    }

    public static boolean test()
    {
        PropertySet_Test test= new PropertySet_Test();
        boolean r[]= new boolean[50];
        int i= 0;
        r[i++]= test.convertPropertyValue();
        r[i++]= test.setPropertyValueNoBroadcast();
        r[i++]= test.setPropertyValue();
        r[i++]= test.addPropertyChangeListener();
        r[i++]= test.getPropertySetInfo();
        r[i++]= test.setFastPropertyValue();
        r[i++]= test.getFastPropertyValue();
        r[i++]= test.setPropertyValues();
        r[i++]= test.getPropertyValues();
        r[i++]= test.addPropertiesChangeListener();
        r[i++]= test.firePropertiesChangeEvent();
        r[i++]= test.registerProperty1();
        r[i++]= test.registerProperty2();
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Errors occurred!");
        else
            System.out.println("No errors.");
        return bOk;
    }
    public static void main(String[] args)
    {
        test();
    }   
}

class TestClass extends PropertySet
{
    public Property propBoolA= new Property("PropBoolA", 1, new Type(Boolean.TYPE), (short)0);
    public boolean boolPropA;
    public Property propCharA= new Property("PropCharA", 2, new Type(Character.TYPE), (short) 0);
    public char charPropA;
    public Property propByteA= new Property("PropByteA", 3, new Type(Byte.TYPE), (short) 0);
    public byte bytePropA;
    public Property propShortA= new Property("PropShortA", 4, new Type(Short.TYPE), (short) 0);
    public short shortPropA;
    public Property propIntA= new Property("PropIntA", 5, new Type(Integer.TYPE), (short) 0);
    public int intPropA;
    public Property propLongA= new Property("PropLongA", 6, new Type(Long.TYPE), (short) 0);
    public long longPropA;
    public Property propFloatA= new Property("PropFloatA", 7, new Type(Float.TYPE), (short) 0);
    public float floatPropA;
    public Property propDoubleA= new Property("PropDoubleA", 8, new Type(Double.TYPE), (short) 0);
    public double doublePropA;
    public Property propStringA= new Property("PropStringA", 9, new Type(String.class), (short) 0);
    public String stringPropA;
    public Property propArrayByteA= new Property("PropArrayByteA", 10, new Type(byte[].class), (short) 0);
    public byte[] arBytePropA;
    public Property propTypeA= new Property("PropTypeA", 11, new Type(Type.class), (short) 0);
    public Type typePropA;
    public Property propObjectA= new Property("PropObjectA",12, new Type(Object.class), (short) 0);
    public Object objectPropA;
    public Property propAnyA= new Property("PropAnyA", 13, new Type(Any.class), (short) 0);
    public Any anyPropA;
    public Property propXInterfaceA= new Property("PropXInterfaceA", 13, new Type(Any.class), (short) 0);
    public XInterface xInterfacePropA;
    public Property propXWeakA= new Property("PropXWeakA", 13, new Type(Any.class), (short) 0);
    public XWeak xWeakPropA;
    public Property propEnum = 
        new Property("PropEnum", 14, new Type("com.sun.star.beans.PropertyState", TypeClass.ENUM), (short)0);
    public com.sun.star.beans.PropertyState enumPropertyState = com.sun.star.beans.PropertyState.DEFAULT_VALUE;
    // Test private, protected, package access, Anys as arguments and members, members whith a value

    public Property propBoolB= new Property("PropBoolB", 101, new Type(Boolean.TYPE), (short) 0);
    protected boolean boolPropB;
    
    public Property propBoolC= new Property("PropBoolC", 201, new Type(Boolean.TYPE), (short) 0);
    boolean boolPropC;

    public Property propBoolD= new Property("PropBoolD", 301, new Type(Boolean.TYPE), (short) 0); 
    private boolean boolPropD;
    
    public Property propBoolClass= new Property("PropBoolClass", 1001, new Type(Boolean.class), (short) 0);
    public Boolean boolClassProp;
    public Property propCharClass= new Property("PropCharClass", 1002, new Type(Character.class), (short) 0);
    public Character charClassProp;
    public Property propByteClass= new Property("PropByteClass", 1003, new Type(Byte.class), (short) 0);
    public Byte byteClassProp;
    public Property propShortClass= new Property("PropShortClass", 1004, new Type(Short.class), (short) 0);
    public Short shortClassProp;
    public Property propIntClass= new Property("PropIntClass", 1005, new Type(Integer.class), (short) 0);
    public Integer intClassProp;
    public Property propLongClass= new Property("PropLongClass", 1006, new Type(Long.class), (short) 0);
    public Long longClassProp;
    public Property propFloatClass= new Property("PropFloatClass", 1007, new Type(Float.class), (short) 0);
    public Float floatClassProp;
    public Property propDoubleClass= new Property("PropDoubleClass", 1008, new Type(Double.class), (short) 0);
    public Double doubleClassProp;

    
    public TestClass()
    {
        
        super();
//        When adding properties then modify the getRegisteredProperties method
        //registerProperty(String name, int handle, Type type, short attributes, String memberName)
        registerProperty(propBoolA, "boolPropA");
        registerProperty(propCharA, "charPropA");
        registerProperty(propByteA, "bytePropA");
        registerProperty(propShortA, "shortPropA");
        registerProperty(propIntA, "intPropA");
        registerProperty(propLongA, "longPropA");
        registerProperty(propFloatA, "floatPropA");
        registerProperty(propDoubleA, "doublePropA");
        registerProperty(propStringA, "stringPropA");
        registerProperty(propArrayByteA, "arBytePropA");
        registerProperty(propTypeA, "typePropA");
        registerProperty(propObjectA, "objectPropA");
        registerProperty(propAnyA, "anyPropA");
        registerProperty(propXInterfaceA, "xInterfacePropA");
        registerProperty(propXWeakA, "xWeakPropA");
        registerProperty(propEnum,"enumPropertyState");
        registerProperty(propBoolB, "boolPropB");
        registerProperty(propBoolC, "boolPropC");
        registerProperty(propBoolD, "boolPropD");
        registerProperty(propBoolClass, "boolClassProp");
        registerProperty(propCharClass, "charClassProp");
        registerProperty(propByteClass, "byteClassProp");
        registerProperty(propShortClass, "shortClassProp");
        registerProperty(propIntClass, "intClassProp");
        registerProperty(propLongClass, "longClassProp");
        registerProperty(propFloatClass, "floatClassProp");
        registerProperty(propDoubleClass, "doubleClassProp");
    }
    
    /** When adding properties then modify the getRegisteredProperties method
     */
    public Property[] getRegisteredProperties()
    {
        return new Property[] {
                    propBoolA, propCharA, propByteA, propShortA,
                    propIntA, propLongA, propFloatA, propDoubleA, 
                    propStringA, propArrayByteA, propTypeA, propObjectA, 
                    propAnyA, propXInterfaceA, propXWeakA, propEnum, propBoolB, 
                    propBoolC, propBoolD, propBoolClass, propCharClass, 
                    propByteClass, propShortClass, propIntClass, propLongClass,
                    propFloatClass, propDoubleClass
        };

    }
    public boolean test_convertPropertyValue()
    {
        boolean[] r= new boolean[150];
        int i= 0;
    
        resetPropertyMembers();
        Object[] outOldVal= new Object[1];
        Object[] outNewVal= new Object[1];
        
        Object value= new Boolean(true);
        try
        {
            r[i++]= convertPropertyValue(propBoolA,  outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Boolean && outNewVal[0].equals(value)  && outOldVal[0].equals(new Boolean(false));
            value= new Character('A');
            r[i++]= convertPropertyValue(propCharA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Character && outNewVal[0].equals(value) && outOldVal[0].equals(new Character((char)0));
            charPropA= 'B';
            r[i++]= convertPropertyValue(propCharA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Character && outNewVal[0].equals(value) && outOldVal[0].equals(new Character('B'));
            value= new Byte((byte) 111);
            r[i++]= convertPropertyValue(propByteA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Byte && outNewVal[0].equals(value);
            value= new Short((short) 112);
            r[i++]= convertPropertyValue(propShortA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Short && outNewVal[0].equals(value);
            value= new Integer( 113);
            r[i++]= convertPropertyValue(propIntA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Integer && outNewVal[0].equals(value);
            value= new Long(114);
            r[i++]= convertPropertyValue(propLongA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Long && outNewVal[0].equals(value);
            value= new Float(3.14);
            r[i++]= convertPropertyValue(propFloatA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Float && outNewVal[0].equals(value);
            value= new Double(3.145);
            r[i++]= convertPropertyValue(propDoubleA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Double && outNewVal[0].equals(value);
            value= "string";
            r[i++]= convertPropertyValue(propStringA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof String && outNewVal[0].equals(value);
            value= new byte[]{1,2,3};
            arBytePropA= null;
            r[i++]= convertPropertyValue(propArrayByteA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof byte[] && outNewVal[0].equals(value) && outOldVal[0] == null;
            r[i++]= convertPropertyValue(propArrayByteA, outNewVal, outOldVal, value);
            r[i++]= outOldVal[0] == null;
            value= new Type(XInterface.class);
            r[i++]= convertPropertyValue(propTypeA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Type && outNewVal[0].equals(value);

            value= new Object(); // TypeClass.VOID
            r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Object && outNewVal[0].equals(value);
            value= new Integer(111);
            r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Integer && outNewVal[0].equals(value);
            value= new ComponentBase();
            r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Object && outNewVal[0].equals(value);
            value= new Integer(111);
            r[i++]= convertPropertyValue(propAnyA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Any && ((Any)outNewVal[0]).getType().equals(new Type(Integer.class))
                    && ((Any)outNewVal[0]).getObject().equals(value);
            XWeak oWeak= new ComponentBase();
            value= oWeak;
            // The returned Any must contain an XInterface
            r[i++]= convertPropertyValue(propAnyA, outNewVal, outOldVal, value);
            r[i++]= ((Any) outNewVal[0]).getType().equals(new Type(XInterface.class))
                    && ((Any) outNewVal[0]).getObject() == oWeak;
            value= new ComponentBase();
            r[i++]= convertPropertyValue(propXInterfaceA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof XInterface && outNewVal[0].equals(value);
            r[i++]= convertPropertyValue(propXWeakA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof XWeak && outNewVal[0].equals(value);
            
            value = com.sun.star.beans.PropertyState.DIRECT_VALUE;
            r[i++]= convertPropertyValue(propEnum, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof com.sun.star.uno.Enum && outNewVal[0].equals(value);
            
            // Any arguments ------------------------------------------------------------------
            value= new Any( new Type(Integer.class),new Integer(111));
            r[i++]= convertPropertyValue(propIntA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Integer && ((Integer)outNewVal[0]).equals( ((Any)value).getObject());
            value= new Any(new Type(Boolean.class), new Boolean(true));
            r[i++]= convertPropertyValue(propBoolA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Boolean && ((Boolean)outNewVal[0]).equals(((Any) value).getObject());
            //Character, Byte, Short, Long
            // must fail
            value= new Any(new Type(Object.class), new Object());
            r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value);
            r[i++]= convertPropertyValue(propAnyA, outNewVal, outOldVal, value);
            value= new Any(new Type(Integer.class), new Integer(111));
            r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Integer && outNewVal[0].equals( ((Any)value).getObject());
            r[i++]= convertPropertyValue(propAnyA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Any && ((Any) outNewVal[0]).getType().equals( ((Any) value).getType())
                    && ((Any) outNewVal[0]).getObject().equals( ((Any) value).getObject());
            value= new Any(new Type(XInterface.class), new ComponentBase());
            r[i++]= convertPropertyValue(propObjectA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof XInterface && outNewVal[0] == ((Any) value).getObject();
            r[i++]= convertPropertyValue(propXInterfaceA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] == ((Any) value).getObject();
            value= new Any(new Type(byte[].class), new byte[]{1,2,3});
            r[i++]= convertPropertyValue(propArrayByteA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof byte[];



            // test private, protected, package fields
            value= new Boolean(true);
            r[i++]= convertPropertyValue(propBoolB, outNewVal, outOldVal, value);
            r[i++]= ((Boolean)value).booleanValue() == ((Boolean) outNewVal[0]).booleanValue();
            r[i++]= convertPropertyValue(propBoolC, outNewVal,  outOldVal, value);
            r[i++]= ((Boolean)value).booleanValue() == ((Boolean) outNewVal[0]).booleanValue();
            // must fail because the the member boolPropD is private
            try{
                convertPropertyValue(propBoolD, outNewVal,  outOldVal, value);
                i++;
            }catch (Exception e)
            {
                r[i++]= true;
            }

            // Properties member of type Byte,Short etc.
            value= new Boolean(true);
            r[i++]= convertPropertyValue(propBoolClass, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Boolean && outNewVal[0].equals(value);
            value= new Character('A');
            r[i++]= convertPropertyValue(propCharClass, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Character && outNewVal[0].equals(value);
            value= new Byte((byte) 111);
            r[i++]= convertPropertyValue(propByteClass, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Byte && outNewVal[0].equals(value);
            value= new Short((short) 112);
            r[i++]= convertPropertyValue(propShortClass, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Short && outNewVal[0].equals(value);
            value= new Integer( 113);
            r[i++]= convertPropertyValue(propIntClass, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Integer && outNewVal[0].equals(value);
            value= new Long(114);
            r[i++]= convertPropertyValue(propLongClass, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Long && outNewVal[0].equals(value);
            value= new Float(3.14);
            r[i++]= convertPropertyValue(propFloatClass, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Float && outNewVal[0].equals(value);
            value= new Double(3.145);
            r[i++]= convertPropertyValue(propDoubleA, outNewVal, outOldVal, value);
            r[i++]= outNewVal[0] instanceof Double && outNewVal[0].equals(value);
        }catch (com.sun.star.uno.Exception e)
        {
            i++;
        }
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];

        return bOk;
    }

    public boolean test_setPropertyValueNoBroadcast()
    {
        boolean[] r= new boolean[150];
        int i= 0;
        resetPropertyMembers();
        try {
            Object value= new Boolean(true);
            setPropertyValueNoBroadcast(propBoolA, value);
            r[i++]= boolPropA == ((Boolean) value).booleanValue();
            value= new Character('A');
            setPropertyValueNoBroadcast(propCharA, value);
            r[i++]= charPropA == ((Character) value).charValue();
            value= new Byte((byte) 111);
            setPropertyValueNoBroadcast(propByteA, value);
            r[i++]= bytePropA == ((Byte)value).byteValue();
            value= new Short((short) 112);
            setPropertyValueNoBroadcast(propShortA, value);
            r[i++]= shortPropA == ((Short) value).shortValue();
            value= new Integer( 113);
            setPropertyValueNoBroadcast(propIntA, value);
            r[i++]= intPropA == ((Integer) value).intValue();
            value= new Long(114);
            setPropertyValueNoBroadcast(propLongA, value);
            r[i++]= longPropA == ((Long) value).longValue();
            value= new Float(3.14);
            setPropertyValueNoBroadcast(propFloatA,  value);
            r[i++]= floatPropA == ((Float) value).floatValue();
            value= new Double(3.145);
            setPropertyValueNoBroadcast(propDoubleA, value);
            r[i++]= doublePropA == ((Double) value).doubleValue();
            value= "string";
            setPropertyValueNoBroadcast(propStringA, value);
            r[i++]= stringPropA.equals(value);
            value= new byte[]{1,2,3};
            setPropertyValueNoBroadcast(propArrayByteA, value);
            r[i++]= arBytePropA.equals(value);
            value= new Type(XInterface.class);
            setPropertyValueNoBroadcast(propTypeA, value);
            r[i++]= typePropA.equals(value);
            value= new Integer(111);
            setPropertyValueNoBroadcast(propObjectA, value);
            r[i++]= objectPropA.equals(value);
            value= (XInterface) new ComponentBase();
            setPropertyValueNoBroadcast(propObjectA, value);
            r[i++]= objectPropA.equals(value);
            value= new Any( new Type(Integer.TYPE), new Integer(111));
            setPropertyValueNoBroadcast(propAnyA, value);
            r[i++]= util.anyEquals(anyPropA, value);
            value= new ComponentBase();
            setPropertyValueNoBroadcast(propXInterfaceA, value);
            r[i++]= xInterfacePropA instanceof XInterface && xInterfacePropA.equals(value);
            setPropertyValueNoBroadcast(propXWeakA, value);
            r[i++]= xInterfacePropA instanceof XWeak && xInterfacePropA.equals(value);
            value = com.sun.star.beans.PropertyState.AMBIGUOUS_VALUE;
            setPropertyValueNoBroadcast(propEnum, value);
            r[i++]= enumPropertyState == value;
            value= new Boolean(true);
            setPropertyValueNoBroadcast(propBoolB, value);
            r[i++]= boolPropB == ((Boolean) value).booleanValue();
            setPropertyValueNoBroadcast(propBoolC, value);
            r[i++]= boolPropC == ((Boolean) value).booleanValue();
            // must fail because the the member boolPropD is private
            try{
            setPropertyValueNoBroadcast(propBoolD, value);
            }catch(com.sun.star.lang.WrappedTargetException e)
            {
                r[i++]= true;
            }
        }catch (java.lang.Exception e)
        {
            i++;
        }
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        return bOk;
    }

    void resetPropertyMembers()
    {
        boolPropA= false;
        charPropA= (char) 0;
        bytePropA= 0;
        shortPropA= 0;
        intPropA= 0;
        longPropA= 0;
        floatPropA= 0;
        doublePropA= 0.;
        stringPropA= null;
        arBytePropA= null;
        typePropA= null;
        objectPropA= null;
        anyPropA= null;
        xInterfacePropA= null;
        xWeakPropA= null;
        enumPropertyState = com.sun.star.beans.PropertyState.DEFAULT_VALUE;
        boolPropB= false;
        boolPropC= false;
        boolPropD= false;
        boolClassProp= null;
        charClassProp= null;
        byteClassProp= null;
        shortClassProp= null;
        intClassProp= null;
        longClassProp= null;
        floatClassProp= null;
        doubleClassProp= null;
    }
}

class TestClass2 extends PropertySet
{

    public char charA;
    protected char charB;
    char charC;
    
    int intMemberA;
    
    public Character charClassA;
    protected Character charClassB;
    Character charClassC;
    
    boolean test_registerProperty1()
    {
        System.out.println("registerProperty Test 1");
        boolean r[]= new boolean[50];
        int i= 0;

        registerProperty("PropChar", new Type(char.class), (short) 0, "PropChar");
        registerProperty("PropInt", new Type(int.class), (short) 0, "PropInt");
        registerProperty("PropString", new Type(String.class), (short) 0, "PropString");
        
        XPropertySetInfo info= getPropertySetInfo();
        Property[] props= info.getProperties();
        for (int j= 0; j < props.length; j++)
        {
           Property aProp= props[j];
           if (aProp.Name.equals("PropChar") && aProp.Type.equals(new Type(char.class)) &&
                aProp.Attributes == 0)
               r[i++]= true;
           else if (aProp.Name.equals("PropInt") && aProp.Type.equals(new Type(int.class)) &&
                aProp.Attributes == 0)
               r[i++]= true;
           else if (aProp.Name.equals("PropString") && aProp.Type.equals(new Type(String.class)) &&
                aProp.Attributes == 0)
               r[i++]= true;
           else
               r[i++]= false;
        }

        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }
    
    boolean test_registerProperty2()
    {
        System.out.println("registerProperty Test 2");
        boolean r[]= new boolean[50];
        int i= 0;

        registerProperty("charA", "charA", (short) 0);
        registerProperty("charB", "charB", (short) 0);
        registerProperty("charC", "charC", (short) 0);
        registerProperty("charClassB", "charClassB", PropertyAttribute.MAYBEVOID);
        registerProperty("IntProp", "intMemberA", (short) 0);
        
        XPropertySetInfo info= getPropertySetInfo();
        Property[] props= info.getProperties();
        for (int j= 0; j < props.length; j++)
        {
           Property aProp= props[j];
           if (aProp.Name.equals("charA") && aProp.Type.equals(new Type(char.class)) &&
                aProp.Attributes == 0)
               r[i++]= true;
           else if (aProp.Name.equals("charB") && aProp.Type.equals(new Type(char.class)) &&
                aProp.Attributes == 0)
               r[i++]= true;
           else if (aProp.Name.equals("charC") && aProp.Type.equals(new Type(char.class)) &&
                aProp.Attributes == 0)
               r[i++]= true;
           else if (aProp.Name.equals("charClassB") && aProp.Type.equals(new Type(char.class)) &&
                aProp.Attributes == PropertyAttribute.MAYBEVOID)
               r[i++]= true;
           else if (aProp.Name.equals("IntProp") && aProp.Type.equals(new Type(int.class)) &&
                aProp.Attributes == 0)
               r[i++]= true;
           else
               r[i++]= false;
        }
        Object ret;
        Object val= new Character('A');
        try{
            setPropertyValue("charA", val);
            ret= getPropertyValue("charA");
            r[i++]= val.equals(ret);
            setPropertyValue("charClassB",val);
            ret= getPropertyValue("charClassB");
            r[i++]= val.equals(ret);
            val= new Integer(111);
            setPropertyValue("IntProp",val);
            ret= getPropertyValue("IntProp");
            r[i++]= val.equals(ret);
        }
        catch(Exception e)
        {
            r[i++]=false;
        }
        boolean bOk= true;
        for (int c= 0; c < i; c++)
            bOk= bOk && r[c];
        if (bOk == false)
            System.out.println("Failed");
        else
            System.out.println("Ok");
        return bOk;
    }

}

class util 
{
    // An Object is considered an Any with TypeClass.VOID and no value.
    static boolean anyEquals(Object val1, Object val2)
    {
        Object obj1= null;
        Object obj2= null;
        Type t1= null;
        Type t2= null;
        if (val1 instanceof Any)
        {
            obj1= ((Any) val1).getObject();
            t1= ((Any) val1).getType();
        }
        else
            obj1= val1;

        if (val2 instanceof Any)
        {
            obj2= ((Any) val2).getObject();
            t2= ((Any) val2).getType();
        }
        else
            obj2= val2;

        if (obj1 != null && obj1.equals(obj2))
            return true;
        else if ((obj1 == null && obj2 == null) && t1 != null && t1.equals(t2))
            return true;
        return false;
    }

    // returns true if obj is an any that contains a void or interface type and the
    // object is null
    static boolean isVoidAny(Object obj)
    {
        boolean ret= false;
        if( obj != null && obj instanceof Any)
        {
            Any a= (Any) obj;
            if( a.getType().getTypeClass().equals( TypeClass.INTERFACE)
                && a.getObject() == null) {
                ret= true;
            }
            else if( a.getType().equals( new Type(void.class)) && a.getObject() == null) {
                ret= true;
            }
        }
        return ret;
    }
}

class Listener implements XPropertyChangeListener, XVetoableChangeListener, 
XPropertiesChangeListener
{
    int nChangeCalled;
    int nPropertiesChange;
    int nVetoCalled;
    int nDisposingCalled;
    boolean bVeto= false;
    PropertyChangeEvent evt;
    PropertyChangeEvent[] arEvt;
    // XPropertyChangeListener
    public void propertyChange(PropertyChangeEvent evt )
    {
        nChangeCalled++;
        this.evt= evt;
    }

    //VetoableChangeListener
    public void vetoableChange(PropertyChangeEvent evt ) throws PropertyVetoException
    {
        nVetoCalled++;
         this.evt= evt;
         if (bVeto)
             throw new PropertyVetoException();
    }
    
    public void disposing( /*IN*/EventObject Source )
    {
        nDisposingCalled++;
    }
    
    public void reset()
    {
        nChangeCalled= 0;
        nPropertiesChange= 0;
        nVetoCalled= 0;
        nDisposingCalled= 0;
        evt= null;
        arEvt= null;
        bVeto= false;
    }
    // XPropertiesChangeListener
    public void propertiesChange(PropertyChangeEvent[] propertyChangeEvent)
    {
        nPropertiesChange++;
        arEvt= propertyChangeEvent;
    }
    
}
