1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.luni.tests.java.util;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.AbstractMap;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.AbstractSet;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Collection;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Collections;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Comparator;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.HashMap;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.HashSet;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Hashtable;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.IdentityHashMap;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Iterator;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.LinkedHashMap;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Map;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Set;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.TreeMap;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Vector;
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.WeakHashMap;
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class AbstractMapTest extends junit.framework.TestCase {
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    static final String specialKey = "specialKey".intern();
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    static final String specialValue = "specialValue".intern();
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // The impl of MyMap is not realistic, but serves to create a type
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // that uses the default remove behavior.
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    class MyMap extends AbstractMap {
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        final Set mySet = new HashSet(1);
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyMap() {
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            mySet.add(new Map.Entry() {
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public Object getKey() {
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return specialKey;
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public Object getValue() {
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return specialValue;
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public Object setValue(Object object) {
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return null;
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            });
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Object put(Object key, Object value) {
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Set entrySet() {
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return mySet;
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.util.AbstractMap#keySet()
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_keySet() {
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map1 = new HashMap(0);
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("HashMap(0)", map1.keySet(), map1.keySet());
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map2 = new HashMap(10);
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("HashMap(10)", map2.keySet(), map2.keySet());
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Map map3 = Collections.EMPTY_MAP;
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("EMPTY_MAP", map3.keySet(), map3.keySet());
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map4 = new IdentityHashMap(1);
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("IdentityHashMap", map4.keySet(), map4.keySet());
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map5 = new LinkedHashMap(122);
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("LinkedHashMap", map5.keySet(), map5.keySet());
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map6 = new TreeMap();
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("TreeMap", map6.keySet(), map6.keySet());
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map7 = new WeakHashMap();
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("WeakHashMap", map7.keySet(), map7.keySet());
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.util.AbstractMap#remove(java.lang.Object)
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_removeLjava_lang_Object() {
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Object key = new Object();
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Object value = new Object();
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map1 = new HashMap(0);
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map1.put("key", value);
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("HashMap(0)", map1.remove("key"), value);
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map4 = new IdentityHashMap(1);
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map4.put(key, value);
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("IdentityHashMap", map4.remove(key), value);
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map5 = new LinkedHashMap(122);
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map5.put(key, value);
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("LinkedHashMap", map5.remove(key), value);
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map6 = new TreeMap(new Comparator() {
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // Bogus comparator
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public int compare(Object object1, Object object2) {
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return 0;
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        });
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map6.put(key, value);
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("TreeMap", map6.remove(key), value);
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map7 = new WeakHashMap();
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map7.put(key, value);
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("WeakHashMap", map7.remove(key), value);
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap aSpecialMap = new MyMap();
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        aSpecialMap.put(specialKey, specialValue);
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Object valueOut = aSpecialMap.remove(specialKey);
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("MyMap", valueOut, specialValue);
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.util.AbstractMap#clear()
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_clear() {
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // normal clear()
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map = new HashMap();
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put(1, 1);
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.clear();
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(map.isEmpty());
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Special entrySet return a Set with no clear method.
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap myMap = new MocAbstractMap();
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            myMap.clear();
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should throw UnsupportedOprationException");
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            // expected
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    class MocAbstractMap<K, V> extends AbstractMap {
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Set entrySet() {
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            Set set = new MySet();
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return set;
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        class MySet extends HashSet {
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public void clear() {
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new UnsupportedOperationException();
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.util.AbstractMap#containsKey(Object)
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_containsKey() {
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map = new AMT();
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(map.containsKey("k"));
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(map.containsKey(null));
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put("k", "v");
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put("key", null);
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put(null, "value");
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put(null, null);
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(map.containsKey("k"));
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(map.containsKey("key"));
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(map.containsKey(null));
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.util.AbstractMap#containsValue(Object)
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_containValue() {
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map = new AMT();
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(map.containsValue("v"));
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(map.containsValue(null));
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put("k", "v");
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put("key", null);
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put(null, "value");
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(map.containsValue("v"));
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(map.containsValue("value"));
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(map.containsValue(null));
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.util.AbstractMap#get(Object)
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_get() {
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map = new AMT();
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(map.get("key"));
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(map.get(null));
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put("k", "v");
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put("key", null);
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put(null, "value");
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("v", map.get("k"));
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(map.get("key"));
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("value", map.get(null));
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.util.AbstractMap#values()
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_values() {
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map1 = new HashMap(0);
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("HashMap(0)", map1.values(), map1.values());
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map2 = new HashMap(10);
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("HashMap(10)", map2.values(), map2.values());
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Map map3 = Collections.EMPTY_MAP;
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("EMPTY_MAP", map3.values(), map3.values());
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map4 = new IdentityHashMap(1);
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("IdentityHashMap", map4.values(), map4.values());
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map5 = new LinkedHashMap(122);
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("IdentityHashMap", map5.values(), map5.values());
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map6 = new TreeMap();
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("TreeMap", map6.values(), map6.values());
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AbstractMap map7 = new WeakHashMap();
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("WeakHashMap", map7.values(), map7.values());
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests java.util.AbstractMap#clone()
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_clone() {
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        class MyMap extends AbstractMap implements Cloneable {
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            private Map map = new HashMap();
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public Set entrySet() {
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return map.entrySet();
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public Object put(Object key, Object value) {
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return map.put(key, value);
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public Map getMap() {
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return map;
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            public Object clone() {
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                try {
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return super.clone();
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                } catch (CloneNotSupportedException e) {
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return null;
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ;
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyMap map = new MyMap();
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        map.put("one", "1");
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Map.Entry entry = (Map.Entry) map.entrySet().iterator().next();
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("entry not added", entry.getKey() == "one"
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                && entry.getValue() == "1");
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        MyMap mapClone = (MyMap) map.clone();
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("clone not shallow", map.getMap() == mapClone.getMap());
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public class AMT extends AbstractMap {
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Very crude AbstractMap implementation
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Vector values = new Vector();
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Vector keys = new Vector();
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Set entrySet() {
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return new AbstractSet() {
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public Iterator iterator() {
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return new Iterator() {
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        int index = 0;
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        public boolean hasNext() {
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            return index < values.size();
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        }
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        public Object next() {
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            if (index < values.size()) {
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                Map.Entry me = new Map.Entry() {
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                    Object v = values.elementAt(index);
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                    Object k = keys.elementAt(index);
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                    public Object getKey() {
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                        return k;
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                    }
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                    public Object getValue() {
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                        return v;
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                    }
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                    public Object setValue(Object value) {
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                        return null;
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                    }
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                };
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                index++;
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                return me;
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            }
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                            return null;
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        }
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        public void remove() {
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        }
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    };
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                public int size() {
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    return values.size();
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                }
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            };
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Object put(Object k, Object v) {
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            keys.add(k);
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            values.add(v);
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return v;
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @tests {@link java.util.AbstractMap#putAll(Map)}
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void test_putAllLMap() {
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Hashtable ht = new Hashtable();
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        AMT amt = new AMT();
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ht.put("this", "that");
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        amt.putAll(ht);
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Should be equal", amt, ht);
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testEqualsWithNullValues() {
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Map<String, String> a = new HashMap<String, String>();
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        a.put("a", null);
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        a.put("b", null);
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Map<String, String> b = new HashMap<String, String>();
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        a.put("c", "cat");
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        a.put("d", "dog");
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(a.equals(b));
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(b.equals(a));
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testNullsOnViews() {
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Map<String, String> nullHostile = new Hashtable<String, String>();
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        nullHostile.put("a", "apple");
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        testNullsOnView(nullHostile.entrySet());
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        nullHostile.put("a", "apple");
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        testNullsOnView(nullHostile.keySet());
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        nullHostile.put("a", "apple");
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        testNullsOnView(nullHostile.values());
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private void testNullsOnView(Collection<?> view) {
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertFalse(view.contains(null));
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException optional) {
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertFalse(view.remove(null));
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException optional) {
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Set<Object> setOfNull = Collections.singleton(null);
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(view.equals(setOfNull));
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertFalse(view.removeAll(setOfNull));
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException optional) {
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue(view.retainAll(setOfNull)); // destructive
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException optional) {
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void setUp() {
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void tearDown() {
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
416