/*
 * Copyright (c) 2005, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.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;
}
