/*
 * Copyright (c) 2012, 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     7164256
 * @summary EnumMap.entrySet() returns an entrySet referencing to the cloned instance
 * @author  Diego Belfer
 */

import java.util.EnumMap;

public class ProperEntrySetOnClone {
    public enum Test {
        ONE, TWO
    }

    public static void main(String[] args) {
        EnumMap<Test, String> map1 = new EnumMap<Test, String>(Test.class);
        map1.put(Test.ONE, "1");
        map1.put(Test.TWO, "2");

        // We need to force creation of the map1.entrySet
        int size = map1.entrySet().size();
        if (size != 2) {
            throw new RuntimeException(
                    "Invalid size in original map. Expected: 2 was: " + size);
        }

        EnumMap<Test, String> map2 = map1.clone();
        map2.remove(Test.ONE);
        size = map2.entrySet().size();
        if (size != 1) {
            throw new RuntimeException(
                    "Invalid size in cloned instance. Expected: 1 was: " + size);
        }
    }
}
