/*
 * @(#)$RCSfile: TestAttributeSet.java,v $ $Revision: 1.3 $ $Date: 2002/02/16 03:06:40 $
 *
 * (C) Copyright IBM Corp. 1998-1999.  All Rights Reserved.
 *
 * The program is provided "as is" without any warranty express or
 * implied, including the warranty of non-infringement and the implied
 * warranties of merchantibility and fitness for a particular purpose.
 * IBM will not be liable for any damages suffered by you as a result
 * of using the Program. In no event will IBM be liable for any
 * special, indirect or consequential damages or lost profits even if
 * IBM has been advised of the possibility of their occurrence. IBM
 * will not be liable for any third party claims against you.
 */
package com.ibm.richtext.test.unit;

import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.richtext.textlayout.attributes.AttributeSet;
import java.util.Enumeration;

public class TestAttributeSet extends TestFmwk {

    static final String COPYRIGHT =
                "(C) Copyright IBM Corp. 1998-1999 - All Rights Reserved";
                
    public static void main(String[] args) throws Exception {

        new TestAttributeSet().run(args);
    }

    public void test() {

        final Object elem1 = new Object();
        final Object elem2 = new Float(4);
        final Object elem3 = "String";
        final Object elem4 = Boolean.FALSE;

        AttributeSet set1 = new AttributeSet(new Object[] {elem1, elem2, elem3});
        if (set1.size() != 3) {
            errln("Size is wrong.");
        }

        if (set1.contains(elem4)){
            errln("Set contents are wrong.");
        }

        if (!set1.contains(elem1)) {
            errln("Set contents are wrong.");
        }

        AttributeSet set2 = new AttributeSet(elem4);

        if (set2.size() != 1) {
            errln("Size is wrong.");
        }

        if (!set2.contains(elem4)){
            errln("Set contents are wrong.");
        }

        if (set2.contains(elem1)) {
            errln("Set contents are wrong.");
        }

        Enumeration iter = set2.elements();
        if (!iter.nextElement().equals(elem4)) {
            errln("Invalid object in iterator.");
        }

        AttributeSet union = set2.unionWith(set1);
        if (!set1.unionWith(set2).equals(union)) {
            errln("unionWith is not commutative.");
        }

        if (!union.contains(elem1) || !union.contains(elem4)) {
            errln("Set contents are wrong.");
        }

        if (!set1.addElement(elem4).equals(union)) {
            errln("addElement is wrong.");
        }

        if (!union.intersectWith(set1).equals(set1)) {
            errln("intersectWith is wrong.");
        }

        if (!union.subtract(set1).equals(set2)) {
            errln("subtract is wrong.");
        }
    }
}