/*
 * Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code 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 General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

/*
 * @test
 * @bug 6273752
 * @summary Test ImmutableDescriptor.union
 * @author Eamonn McManus
 * @run clean UnionTest
 * @run build UnionTest
 * @run main UnionTest
 */

import java.util.Collections;
import javax.management.Descriptor;
import javax.management.ImmutableDescriptor;
import static javax.management.ImmutableDescriptor.union;
import static javax.management.ImmutableDescriptor.EMPTY_DESCRIPTOR;
import javax.management.modelmbean.DescriptorSupport;

public class UnionTest {
    public static void main(String[] args) throws Exception {
        ImmutableDescriptor immutableEmpty = new ImmutableDescriptor();
        DescriptorSupport mutableEmpty = new DescriptorSupport();

        checkEmpty(union());
        checkEmpty(union(immutableEmpty));
        checkEmpty(union(mutableEmpty));
        checkEmpty(union(EMPTY_DESCRIPTOR, immutableEmpty, mutableEmpty));
        checkEmpty(union(null, immutableEmpty, null));

        ImmutableDescriptor immutableNumbers =
            new ImmutableDescriptor(new String[] {"one", "two", "three"},
                                    new Object[] {1, 2, 3});
        final String[] noNames = null;
        DescriptorSupport mutableNumbers =
            new DescriptorSupport(immutableNumbers.getFieldNames(),
                                  immutableNumbers.getFieldValues(noNames));
        ImmutableDescriptor immutableOne =
            new ImmutableDescriptor(Collections.singletonMap("one", 1));
        DescriptorSupport mutableOne =
            new DescriptorSupport(new String[] {"one"}, new Object[] {1});
        ImmutableDescriptor immutableTwo =
            new ImmutableDescriptor(Collections.singletonMap("two", 2));
        DescriptorSupport mutableTwo =
            new DescriptorSupport(new String[] {"two"}, new Object[] {2});
        ImmutableDescriptor immutableOneTwo =
            new ImmutableDescriptor(new String[] {"one", "two"},
                                    new Object[] {1, 2});


        checkEqual(union(immutableNumbers), immutableNumbers);
        checkEqual(union(immutableNumbers, mutableNumbers), immutableNumbers);
        checkEqual(union(mutableNumbers, immutableNumbers), immutableNumbers);
        checkEqual(union(mutableEmpty, immutableEmpty, immutableNumbers,
                         mutableNumbers, immutableOne), immutableNumbers);
        checkEqual(union(immutableOne, immutableTwo, immutableNumbers),
                   immutableNumbers);
        checkEquivalent(union(immutableOne, mutableNumbers), immutableNumbers);
        checkEquivalent(union(immutableOne, immutableTwo), immutableOneTwo);
        checkEquivalent(union(mutableOne, mutableTwo), immutableOneTwo);

        if (failure != null)
            throw new Exception("TEST FAILED: " + failure);
        System.out.println("TEST PASSED");
    }

    private static void checkEmpty(ImmutableDescriptor d) {
        if (d != EMPTY_DESCRIPTOR) {
            failure = "Union of empty descriptors should be " +
                "ImmutableDescriptor.EMPTY";
            System.err.println("FAILED: " + failure);
            Thread.dumpStack();
        }
    }

    private static void checkEqual(ImmutableDescriptor d,
                                   ImmutableDescriptor e) {
        if (d != e) {
            failure = "Union should produce one of its arguments but does not";
            System.err.println("FAILED: " + failure);
            Thread.dumpStack();
        }
    }

    private static void checkEquivalent(ImmutableDescriptor d,
                                        ImmutableDescriptor e) {
        if (!d.equals(e)) {
            failure = "Union produced this: " + d + "; but should have " +
                "produced this: " + e;
            System.err.println("FAILED: " + failure);
            Thread.dumpStack();
        }
    }

    private static String failure;
}
