1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package tests.api.java.util;
19
20import java.util.AbstractMap;
21import java.util.ArrayList;
22import java.util.Arrays;
23import java.util.Collection;
24import java.util.Iterator;
25import java.util.LinkedHashMap;
26import java.util.Map;
27import java.util.Set;
28import java.util.TreeMap;
29
30import tests.support.Support_MapTest2;
31import tests.support.Support_UnmodifiableCollectionTest;
32
33/**
34 * java.util.LinkedHashMap
35 */
36public class LinkedHashMapTest extends junit.framework.TestCase {
37
38    LinkedHashMap hm;
39
40    final static int hmSize = 1000;
41
42    Object[] objArray;
43
44    Object[] objArray2;
45
46    static final class CacheMap extends LinkedHashMap {
47        protected boolean removeEldestEntry(Map.Entry e) {
48            return size() > 5;
49        }
50    }
51
52    private static class MockMapNull extends AbstractMap {
53        @Override
54        public Set entrySet() {
55            return null;
56        }
57
58        @Override
59        public int size() {
60            return 10;
61        }
62    }
63
64    /**
65     * java.util.LinkedHashMap#LinkedHashMap()
66     */
67    public void test_Constructor() {
68        // Test for method java.util.LinkedHashMap()
69        new Support_MapTest2(new LinkedHashMap()).runTest();
70
71        LinkedHashMap hm2 = new LinkedHashMap();
72        assertEquals("Created incorrect LinkedHashMap", 0, hm2.size());
73    }
74
75    /**
76     * java.util.LinkedHashMap#LinkedHashMap(int)
77     */
78    public void test_ConstructorI() {
79        // Test for method java.util.LinkedHashMap(int)
80        LinkedHashMap hm2 = new LinkedHashMap(5);
81        assertEquals("Created incorrect LinkedHashMap", 0, hm2.size());
82        try {
83            new LinkedHashMap(-1);
84            fail("Failed to throw IllegalArgumentException for initial " +
85                    "capacity < 0");
86        } catch (IllegalArgumentException e) {
87            //expected
88        }
89
90        LinkedHashMap empty = new LinkedHashMap(0);
91        assertNull("Empty LinkedHashMap access", empty.get("nothing"));
92        empty.put("something", "here");
93        assertTrue("cannot get element", empty.get("something") == "here");
94    }
95
96    /**
97     * java.util.LinkedHashMap#LinkedHashMap(int, float)
98     */
99    public void test_ConstructorIF() {
100        // Test for method java.util.LinkedHashMap(int, float)
101        LinkedHashMap hm2 = new LinkedHashMap(5, (float) 0.5);
102        assertEquals("Created incorrect LinkedHashMap", 0, hm2.size());
103        try {
104            new LinkedHashMap(0, 0);
105            fail("Failed to throw IllegalArgumentException for initial " +
106                    "load factor <= 0");
107        } catch (IllegalArgumentException e) {
108            //expected
109        }
110
111        LinkedHashMap empty = new LinkedHashMap(0, 0.75f);
112        assertNull("Empty hashtable access", empty.get("nothing"));
113        empty.put("something", "here");
114        assertTrue("cannot get element", empty.get("something") == "here");
115    }
116
117    /**
118     * java.util.LinkedHashMap#LinkedHashMap(java.util.Map)
119     */
120    public void test_ConstructorLjava_util_Map() {
121        // Test for method java.util.LinkedHashMap(java.util.Map)
122        Map myMap = new TreeMap();
123        for (int counter = 0; counter < hmSize; counter++)
124            myMap.put(objArray2[counter], objArray[counter]);
125        LinkedHashMap hm2 = new LinkedHashMap(myMap);
126        for (int counter = 0; counter < hmSize; counter++)
127            assertTrue("Failed to construct correct LinkedHashMap", hm
128                    .get(objArray2[counter]) == hm2.get(objArray2[counter]));
129    }
130
131    /**
132     * java.util.LinkedHashMap#get(java.lang.Object)
133     */
134    public void test_getLjava_lang_Object() {
135        // Test for method java.lang.Object
136        // java.util.LinkedHashMap.get(java.lang.Object)
137        assertNull("Get returned non-null for non existent key",
138                hm.get("T"));
139        hm.put("T", "HELLO");
140        assertEquals("Get returned incorecct value for existing key", "HELLO", hm.get("T")
141                );
142
143        LinkedHashMap m = new LinkedHashMap();
144        m.put(null, "test");
145        assertEquals("Failed with null key", "test", m.get(null));
146        assertNull("Failed with missing key matching null hash", m
147                .get(new Integer(0)));
148    }
149
150    /**
151     * java.util.LinkedHashMap#put(java.lang.Object, java.lang.Object)
152     */
153    public void test_putLjava_lang_ObjectLjava_lang_Object() {
154        // Test for method java.lang.Object
155        // java.util.LinkedHashMap.put(java.lang.Object, java.lang.Object)
156        hm.put("KEY", "VALUE");
157        assertEquals("Failed to install key/value pair",
158                "VALUE", hm.get("KEY"));
159
160        LinkedHashMap m = new LinkedHashMap();
161        m.put(new Short((short) 0), "short");
162        m.put(null, "test");
163        m.put(new Integer(0), "int");
164        assertEquals("Failed adding to bucket containing null", "short", m.get(
165                new Short((short) 0)));
166        assertEquals("Failed adding to bucket containing null2", "int", m.get(
167                new Integer(0)));
168    }
169
170
171    public void test_putPresent() {
172        Map<String, String> m = new LinkedHashMap<String, String>(8, .75f, true);
173        m.put("KEY", "VALUE");
174        m.put("WOMBAT", "COMBAT");
175        m.put("KEY", "VALUE");
176        Map.Entry newest = null;
177        for (Map.Entry<String, String> e : m.entrySet()) {
178            newest = e;
179        }
180        assertEquals("KEY", newest.getKey());
181        assertEquals("VALUE", newest.getValue());
182    }
183
184    /**
185     * java.util.LinkedHashMap#putAll(java.util.Map)
186     */
187    public void test_putAllLjava_util_Map() {
188        // Test for method void java.util.LinkedHashMap.putAll(java.util.Map)
189        LinkedHashMap hm2 = new LinkedHashMap();
190        hm2.putAll(hm);
191        for (int i = 0; i < 1000; i++)
192            assertTrue("Failed to clear all elements", hm2.get(
193                    new Integer(i).toString()).equals((new Integer(i))));
194    }
195
196    /**
197     * java.util.LinkedHashMap#putAll(java.util.Map)
198     */
199    public void test_putAll_Ljava_util_Map_Null() {
200        LinkedHashMap linkedHashMap = new LinkedHashMap();
201        try {
202            linkedHashMap.putAll(new MockMapNull());
203            fail("Should throw NullPointerException");
204        } catch (NullPointerException e) {
205            // expected.
206        }
207
208        try {
209            linkedHashMap = new LinkedHashMap(new MockMapNull());
210            fail("Should throw NullPointerException");
211        } catch (NullPointerException e) {
212            // expected.
213        }
214    }
215
216    /**
217     * java.util.LinkedHashMap#entrySet()
218     */
219    public void test_entrySet() {
220        // Test for method java.util.Set java.util.LinkedHashMap.entrySet()
221        Set s = hm.entrySet();
222        Iterator i = s.iterator();
223        assertTrue("Returned set of incorrect size", hm.size() == s.size());
224        while (i.hasNext()) {
225            Map.Entry m = (Map.Entry) i.next();
226            assertTrue("Returned incorrect entry set", hm.containsKey(m
227                    .getKey())
228                    && hm.containsValue(m.getValue()));
229        }
230    }
231
232    public void test_entrySetRemove() {
233        entrySetRemoveHelper("military", "intelligence");
234        entrySetRemoveHelper(null, "hypothesis");
235    }
236    private void entrySetRemoveHelper(String key, String value) {
237        Map<String, String> m1 = new LinkedHashMap<String, String>();
238        m1.put(key, value);
239        m1.put("jumbo", "shrimp");
240        LinkedHashMap<String, String> m2 = new LinkedHashMap<String, String>(m1);
241        Set<Map.Entry<String, String>> s1 = m1.entrySet();
242        s1.remove(m2.entrySet().iterator().next());
243        assertEquals("jumbo", s1.iterator().next().getKey());
244    }
245
246    /**
247     * java.util.LinkedHashMap#keySet()
248     */
249    public void test_keySet() {
250        // Test for method java.util.Set java.util.LinkedHashMap.keySet()
251        Set s = hm.keySet();
252        assertTrue("Returned set of incorrect size()", s.size() == hm.size());
253        for (int i = 0; i < objArray.length; i++)
254            assertTrue("Returned set does not contain all keys", s
255                    .contains(objArray[i].toString()));
256
257        LinkedHashMap m = new LinkedHashMap();
258        m.put(null, "test");
259        assertTrue("Failed with null key", m.keySet().contains(null));
260        assertNull("Failed with null key", m.keySet().iterator().next());
261
262        Map map = new LinkedHashMap(101);
263        map.put(new Integer(1), "1");
264        map.put(new Integer(102), "102");
265        map.put(new Integer(203), "203");
266        Iterator it = map.keySet().iterator();
267        Integer remove1 = (Integer) it.next();
268        it.hasNext();
269        it.remove();
270        Integer remove2 = (Integer) it.next();
271        it.remove();
272        ArrayList list = new ArrayList(Arrays.asList(new Integer[] {
273                new Integer(1), new Integer(102), new Integer(203) }));
274        list.remove(remove1);
275        list.remove(remove2);
276        assertTrue("Wrong result", it.next().equals(list.get(0)));
277        assertEquals("Wrong size", 1, map.size());
278        assertTrue("Wrong contents", map.keySet().iterator().next().equals(
279                list.get(0)));
280
281        Map map2 = new LinkedHashMap(101);
282        map2.put(new Integer(1), "1");
283        map2.put(new Integer(4), "4");
284        Iterator it2 = map2.keySet().iterator();
285        Integer remove3 = (Integer) it2.next();
286        Integer next;
287        if (remove3.intValue() == 1)
288            next = new Integer(4);
289        else
290            next = new Integer(1);
291        it2.hasNext();
292        it2.remove();
293        assertTrue("Wrong result 2", it2.next().equals(next));
294        assertEquals("Wrong size 2", 1, map2.size());
295        assertTrue("Wrong contents 2", map2.keySet().iterator().next().equals(
296                next));
297    }
298
299    /**
300     * java.util.LinkedHashMap#values()
301     */
302    public void test_values() {
303        // Test for method java.util.Collection java.util.LinkedHashMap.values()
304        Collection c = hm.values();
305        assertTrue("Returned collection of incorrect size()", c.size() == hm
306                .size());
307        for (int i = 0; i < objArray.length; i++)
308            assertTrue("Returned collection does not contain all keys", c
309                    .contains(objArray[i]));
310
311        LinkedHashMap myLinkedHashMap = new LinkedHashMap();
312        for (int i = 0; i < 100; i++)
313            myLinkedHashMap.put(objArray2[i], objArray[i]);
314        Collection values = myLinkedHashMap.values();
315        new Support_UnmodifiableCollectionTest(
316                "Test Returned Collection From LinkedHashMap.values()", values)
317                .runTest();
318        values.remove(new Integer(0));
319        assertTrue(
320                "Removing from the values collection should remove from the original map",
321                !myLinkedHashMap.containsValue(new Integer(0)));
322
323    }
324
325    /**
326     * java.util.LinkedHashMap#remove(java.lang.Object)
327     */
328    public void test_removeLjava_lang_Object() {
329        // Test for method java.lang.Object
330        // java.util.LinkedHashMap.remove(java.lang.Object)
331        int size = hm.size();
332        Integer y = new Integer(9);
333        Integer x = ((Integer) hm.remove(y.toString()));
334        assertTrue("Remove returned incorrect value", x.equals(new Integer(9)));
335        assertNull("Failed to remove given key", hm.get(new Integer(9)));
336        assertTrue("Failed to decrement size", hm.size() == (size - 1));
337        assertNull("Remove of non-existent key returned non-null", hm
338                .remove("LCLCLC"));
339
340        LinkedHashMap m = new LinkedHashMap();
341        m.put(null, "test");
342        assertNull("Failed with same hash as null",
343                m.remove(new Integer(0)));
344        assertEquals("Failed with null key", "test", m.remove(null));
345    }
346
347    /**
348     * java.util.LinkedHashMap#clear()
349     */
350    public void test_clear() {
351        // Test for method void java.util.LinkedHashMap.clear()
352        hm.clear();
353        assertEquals("Clear failed to reset size", 0, hm.size());
354        for (int i = 0; i < hmSize; i++)
355            assertNull("Failed to clear all elements",
356                    hm.get(objArray2[i]));
357
358    }
359
360    /**
361     * java.util.LinkedHashMap#clone()
362     */
363    public void test_clone() {
364        // Test for method java.lang.Object java.util.LinkedHashMap.clone()
365        LinkedHashMap hm2 = (LinkedHashMap) hm.clone();
366        assertTrue("Clone answered equivalent LinkedHashMap", hm2 != hm);
367        for (int counter = 0; counter < hmSize; counter++)
368            assertTrue("Clone answered unequal LinkedHashMap", hm
369                    .get(objArray2[counter]) == hm2.get(objArray2[counter]));
370
371        LinkedHashMap map = new LinkedHashMap();
372        map.put("key", "value");
373        // get the keySet() and values() on the original Map
374        Set keys = map.keySet();
375        Collection values = map.values();
376        assertEquals("values() does not work",
377                "value", values.iterator().next());
378        assertEquals("keySet() does not work",
379                "key", keys.iterator().next());
380        AbstractMap map2 = (AbstractMap) map.clone();
381        map2.put("key", "value2");
382        Collection values2 = map2.values();
383        assertTrue("values() is identical", values2 != values);
384
385        // values() and keySet() on the cloned() map should be different
386        assertEquals("values() was not cloned",
387                "value2", values2.iterator().next());
388        map2.clear();
389        map2.put("key2", "value3");
390        Set key2 = map2.keySet();
391        assertTrue("keySet() is identical", key2 != keys);
392        assertEquals("keySet() was not cloned",
393                "key2", key2.iterator().next());
394    }
395
396    /**
397     * java.util.LinkedHashMap#clone()
398     */
399    public void test_clone_ordered() {
400        // Test for method java.lang.Object java.util.LinkedHashMap.clone()
401        LinkedHashMap<String, String> hm1 = new LinkedHashMap<String, String>(10, 0.75f, true);
402        hm1.put("a", "a");
403        hm1.put("b", "b");
404        hm1.put("c", "c");
405        LinkedHashMap<String, String> hm2 = (LinkedHashMap<String, String>) hm1.clone();
406        hm1.get("a");
407
408        Map.Entry<String, String>[] set = new Map.Entry[3];
409        Iterator<Map.Entry<String,String>> iterator = hm1.entrySet().iterator();
410
411        assertEquals("b", iterator.next().getKey());
412        assertEquals("c", iterator.next().getKey());
413        assertEquals("a", iterator.next().getKey());
414
415        iterator = hm2.entrySet().iterator();
416        assertEquals("a", iterator.next().getKey());
417        assertEquals("b", iterator.next().getKey());
418        assertEquals("c", iterator.next().getKey());
419    }
420
421    // regresion test for HARMONY-4603
422    public void test_clone_Mock() {
423        LinkedHashMap hashMap = new MockMap();
424        String value = "value a";
425        hashMap.put("key", value);
426        MockMap cloneMap = (MockMap) hashMap.clone();
427        assertEquals(value, cloneMap.get("key"));
428        assertEquals(hashMap, cloneMap);
429        assertEquals(1, cloneMap.num);
430
431        hashMap.put("key", "value b");
432        assertFalse(hashMap.equals(cloneMap));
433    }
434
435    class MockMap extends LinkedHashMap {
436        int num;
437
438        public Object put(Object k, Object v) {
439            num++;
440            return super.put(k, v);
441        }
442
443        protected boolean removeEldestEntry(Map.Entry e) {
444            return num > 1;
445        }
446    }
447
448    /**
449     * put/get interaction in access-order map where removeEldest
450     * returns true.
451     */
452    public void test_removeEldestFromSameBucketAsNewEntry() {
453        LinkedHashMap<String, String> map
454                = new LinkedHashMap<String, String>(6, 0.75F, true) {
455            @Override
456            protected boolean removeEldestEntry(Entry<String, String> e) {
457                return true;
458            }
459        };
460        map.put("N", "E");
461        map.put("F", "I");
462        assertEquals(null, map.get("N"));
463    }
464
465    /**
466     * java.util.LinkedHashMap#containsKey(java.lang.Object)
467     */
468    public void test_containsKeyLjava_lang_Object() {
469        // Test for method boolean
470        // java.util.LinkedHashMap.containsKey(java.lang.Object)
471        assertTrue("Returned false for valid key", hm.containsKey(new Integer(
472                876).toString()));
473        assertTrue("Returned true for invalid key", !hm.containsKey("KKDKDKD"));
474
475        LinkedHashMap m = new LinkedHashMap();
476        m.put(null, "test");
477        assertTrue("Failed with null key", m.containsKey(null));
478        assertTrue("Failed with missing key matching null hash", !m
479                .containsKey(new Integer(0)));
480    }
481
482    /**
483     * java.util.LinkedHashMap#containsValue(java.lang.Object)
484     */
485    public void test_containsValueLjava_lang_Object() {
486        // Test for method boolean
487        // java.util.LinkedHashMap.containsValue(java.lang.Object)
488        assertTrue("Returned false for valid value", hm
489                .containsValue(new Integer(875)));
490        assertTrue("Returned true for invalid valie", !hm
491                .containsValue(new Integer(-9)));
492    }
493
494    /**
495     * java.util.LinkedHashMap#isEmpty()
496     */
497    public void test_isEmpty() {
498        // Test for method boolean java.util.LinkedHashMap.isEmpty()
499        assertTrue("Returned false for new map", new LinkedHashMap().isEmpty());
500        assertTrue("Returned true for non-empty", !hm.isEmpty());
501    }
502
503    /**
504     * java.util.LinkedHashMap#size()
505     */
506    public void test_size() {
507        // Test for method int java.util.LinkedHashMap.size()
508        assertTrue("Returned incorrect size",
509                hm.size() == (objArray.length + 2));
510    }
511
512    /**
513     * java.util.LinkedHashMap#entrySet()
514     */
515    public void test_ordered_entrySet() {
516        int i;
517        int sz = 100;
518        LinkedHashMap lhm = new LinkedHashMap();
519        for (i = 0; i < sz; i++) {
520            Integer ii = new Integer(i);
521            lhm.put(ii, ii.toString());
522        }
523
524        Set s1 = lhm.entrySet();
525        Iterator it1 = s1.iterator();
526        assertTrue("Returned set of incorrect size 1", lhm.size() == s1.size());
527        for (i = 0; it1.hasNext(); i++) {
528            Map.Entry m = (Map.Entry) it1.next();
529            Integer jj = (Integer) m.getKey();
530            assertTrue("Returned incorrect entry set 1", jj.intValue() == i);
531        }
532
533        LinkedHashMap lruhm = new LinkedHashMap(200, .75f, true);
534        for (i = 0; i < sz; i++) {
535            Integer ii = new Integer(i);
536            lruhm.put(ii, ii.toString());
537        }
538
539        Set s3 = lruhm.entrySet();
540        Iterator it3 = s3.iterator();
541        assertTrue("Returned set of incorrect size 2", lruhm.size() == s3
542                .size());
543        for (i = 0; i < sz && it3.hasNext(); i++) {
544            Map.Entry m = (Map.Entry) it3.next();
545            Integer jj = (Integer) m.getKey();
546            assertTrue("Returned incorrect entry set 2", jj.intValue() == i);
547        }
548
549        /* fetch the even numbered entries to affect traversal order */
550        int p = 0;
551        for (i = 0; i < sz; i += 2) {
552            String ii = (String) lruhm.get(new Integer(i));
553            p = p + Integer.parseInt(ii);
554        }
555        assertEquals("invalid sum of even numbers", 2450, p);
556
557        Set s2 = lruhm.entrySet();
558        Iterator it2 = s2.iterator();
559        assertTrue("Returned set of incorrect size 3", lruhm.size() == s2
560                .size());
561        for (i = 1; i < sz && it2.hasNext(); i += 2) {
562            Map.Entry m = (Map.Entry) it2.next();
563            Integer jj = (Integer) m.getKey();
564            assertTrue("Returned incorrect entry set 3", jj.intValue() == i);
565        }
566        for (i = 0; i < sz && it2.hasNext(); i += 2) {
567            Map.Entry m = (Map.Entry) it2.next();
568            Integer jj = (Integer) m.getKey();
569            assertTrue("Returned incorrect entry set 4", jj.intValue() == i);
570        }
571        assertTrue("Entries left to iterate on", !it2.hasNext());
572    }
573
574    /**
575     * java.util.LinkedHashMap#keySet()
576     */
577    public void test_ordered_keySet() {
578        int i;
579        int sz = 100;
580        LinkedHashMap lhm = new LinkedHashMap();
581        for (i = 0; i < sz; i++) {
582            Integer ii = new Integer(i);
583            lhm.put(ii, ii.toString());
584        }
585
586        Set s1 = lhm.keySet();
587        Iterator it1 = s1.iterator();
588        assertTrue("Returned set of incorrect size", lhm.size() == s1.size());
589        for (i = 0; it1.hasNext(); i++) {
590            Integer jj = (Integer) it1.next();
591            assertTrue("Returned incorrect entry set", jj.intValue() == i);
592        }
593
594        LinkedHashMap lruhm = new LinkedHashMap(200, .75f, true);
595        for (i = 0; i < sz; i++) {
596            Integer ii = new Integer(i);
597            lruhm.put(ii, ii.toString());
598        }
599
600        Set s3 = lruhm.keySet();
601        Iterator it3 = s3.iterator();
602        assertTrue("Returned set of incorrect size", lruhm.size() == s3.size());
603        for (i = 0; i < sz && it3.hasNext(); i++) {
604            Integer jj = (Integer) it3.next();
605            assertTrue("Returned incorrect entry set", jj.intValue() == i);
606        }
607
608        /* fetch the even numbered entries to affect traversal order */
609        int p = 0;
610        for (i = 0; i < sz; i += 2) {
611            String ii = (String) lruhm.get(new Integer(i));
612            p = p + Integer.parseInt(ii);
613        }
614        assertEquals("invalid sum of even numbers", 2450, p);
615
616        Set s2 = lruhm.keySet();
617        Iterator it2 = s2.iterator();
618        assertTrue("Returned set of incorrect size", lruhm.size() == s2.size());
619        for (i = 1; i < sz && it2.hasNext(); i += 2) {
620            Integer jj = (Integer) it2.next();
621            assertTrue("Returned incorrect entry set", jj.intValue() == i);
622        }
623        for (i = 0; i < sz && it2.hasNext(); i += 2) {
624            Integer jj = (Integer) it2.next();
625            assertTrue("Returned incorrect entry set", jj.intValue() == i);
626        }
627        assertTrue("Entries left to iterate on", !it2.hasNext());
628    }
629
630    /**
631     * java.util.LinkedHashMap#values()
632     */
633    public void test_ordered_values() {
634        int i;
635        int sz = 100;
636        LinkedHashMap lhm = new LinkedHashMap();
637        for (i = 0; i < sz; i++) {
638            Integer ii = new Integer(i);
639            lhm.put(ii, new Integer(i * 2));
640        }
641
642        Collection s1 = lhm.values();
643        Iterator it1 = s1.iterator();
644        assertTrue("Returned set of incorrect size 1", lhm.size() == s1.size());
645        for (i = 0; it1.hasNext(); i++) {
646            Integer jj = (Integer) it1.next();
647            assertTrue("Returned incorrect entry set 1", jj.intValue() == i * 2);
648        }
649
650        LinkedHashMap lruhm = new LinkedHashMap(200, .75f, true);
651        for (i = 0; i < sz; i++) {
652            Integer ii = new Integer(i);
653            lruhm.put(ii, new Integer(i * 2));
654        }
655
656        Collection s3 = lruhm.values();
657        Iterator it3 = s3.iterator();
658        assertTrue("Returned set of incorrect size", lruhm.size() == s3.size());
659        for (i = 0; i < sz && it3.hasNext(); i++) {
660            Integer jj = (Integer) it3.next();
661            assertTrue("Returned incorrect entry set", jj.intValue() == i * 2);
662        }
663
664        // fetch the even numbered entries to affect traversal order
665        int p = 0;
666        for (i = 0; i < sz; i += 2) {
667            Integer ii = (Integer) lruhm.get(new Integer(i));
668            p = p + ii.intValue();
669        }
670        assertTrue("invalid sum of even numbers", p == 2450 * 2);
671
672        Collection s2 = lruhm.values();
673        Iterator it2 = s2.iterator();
674        assertTrue("Returned set of incorrect size", lruhm.size() == s2.size());
675        for (i = 1; i < sz && it2.hasNext(); i += 2) {
676            Integer jj = (Integer) it2.next();
677            assertTrue("Returned incorrect entry set", jj.intValue() == i * 2);
678        }
679        for (i = 0; i < sz && it2.hasNext(); i += 2) {
680            Integer jj = (Integer) it2.next();
681            assertTrue("Returned incorrect entry set", jj.intValue() == i * 2);
682        }
683        assertTrue("Entries left to iterate on", !it2.hasNext());
684    }
685
686    /**
687     * java.util.LinkedHashMap#removeEldestEntry(java.util.Map$Entry)
688     */
689    public void test_remove_eldest() {
690        int i;
691        int sz = 10;
692        CacheMap lhm = new CacheMap();
693        for (i = 0; i < sz; i++) {
694            Integer ii = new Integer(i);
695            lhm.put(ii, new Integer(i * 2));
696        }
697
698        Collection s1 = lhm.values();
699        Iterator it1 = s1.iterator();
700        assertTrue("Returned set of incorrect size 1", lhm.size() == s1.size());
701        for (i = 5; it1.hasNext(); i++) {
702            Integer jj = (Integer) it1.next();
703            assertTrue("Returned incorrect entry set 1", jj.intValue() == i * 2);
704        }
705        assertTrue("Entries left in map", !it1.hasNext());
706    }
707
708    /**
709     * Sets up the fixture, for example, open a network connection. This method
710     * is called before a test is executed.
711     */
712    protected void setUp() {
713        objArray = new Object[hmSize];
714        objArray2 = new Object[hmSize];
715        for (int i = 0; i < objArray.length; i++) {
716            objArray[i] = new Integer(i);
717            objArray2[i] = objArray[i].toString();
718        }
719
720        hm = new LinkedHashMap();
721        for (int i = 0; i < objArray.length; i++)
722            hm.put(objArray2[i], objArray[i]);
723        hm.put("test", null);
724        hm.put(null, "test");
725    }
726
727    /**
728     * Tears down the fixture, for example, close a network connection. This
729     * method is called after a test is executed.
730     */
731    protected void tearDown() {
732        objArray = null;
733        objArray2 = null;
734        hm = null;
735    }
736}
737