LinkedHashMapTest.java revision cc05ad238516f1303687aba4a978e24e57c0c07a
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 org.apache.harmony.luni.tests.java.util;
19
20import dalvik.annotation.TestTargets;
21import dalvik.annotation.TestLevel;
22import dalvik.annotation.TestTargetNew;
23import dalvik.annotation.TestTargetClass;
24
25import java.util.AbstractMap;
26import java.util.ArrayList;
27import java.util.Arrays;
28import java.util.Collection;
29import java.util.ConcurrentModificationException;
30import java.util.Iterator;
31import java.util.LinkedHashMap;
32import java.util.Map;
33import java.util.Set;
34import java.util.TreeMap;
35
36import tests.support.Support_MapTest2;
37import tests.support.Support_UnmodifiableCollectionTest;
38
39/**
40 * @tests java.util.LinkedHashMap
41 */
42@TestTargetClass(LinkedHashMap.class)
43public class LinkedHashMapTest extends junit.framework.TestCase {
44
45    LinkedHashMap hm;
46
47    final static int hmSize = 1000;
48
49    static Object[] objArray;
50
51    static Object[] objArray2;
52    {
53        objArray = new Object[hmSize];
54        objArray2 = new Object[hmSize];
55        for (int i = 0; i < objArray.length; i++) {
56            objArray[i] = new Integer(i);
57            objArray2[i] = objArray[i].toString();
58        }
59    }
60
61    static final class CacheMap extends LinkedHashMap {
62        protected boolean removeEldestEntry(Map.Entry e) {
63            return size() > 5;
64        }
65    }
66
67    private static class MockMapNull extends AbstractMap {
68        @Override
69        public Set entrySet() {
70            return null;
71        }
72
73        @Override
74        public int size() {
75            return 10;
76        }
77    }
78
79    /**
80     * @tests java.util.LinkedHashMap#LinkedHashMap()
81     */
82    @TestTargetNew(
83        level = TestLevel.COMPLETE,
84        notes = "",
85        method = "LinkedHashMap",
86        args = {}
87    )
88    public void test_Constructor() {
89        // Test for method java.util.LinkedHashMap()
90        new Support_MapTest2(new LinkedHashMap()).runTest();
91
92        LinkedHashMap hm2 = new LinkedHashMap();
93        assertEquals("Created incorrect LinkedHashMap", 0, hm2.size());
94    }
95
96    /**
97     * @tests java.util.LinkedHashMap#LinkedHashMap(int)
98     */
99    @TestTargetNew(
100        level = TestLevel.COMPLETE,
101        notes = "",
102        method = "LinkedHashMap",
103        args = {int.class}
104    )
105    public void test_ConstructorI() {
106        // Test for method java.util.LinkedHashMap(int)
107        LinkedHashMap hm2 = new LinkedHashMap(5);
108        assertEquals("Created incorrect LinkedHashMap", 0, hm2.size());
109        try {
110            new LinkedHashMap(-1);
111            fail("IllegalArgumentException expected");
112        } catch (IllegalArgumentException e) {
113            //expected
114        }
115
116        LinkedHashMap empty = new LinkedHashMap(0);
117        assertNull("Empty LinkedHashMap access", empty.get("nothing"));
118        empty.put("something", "here");
119        assertTrue("cannot get element", empty.get("something") == "here");
120    }
121
122    /**
123     * @tests java.util.LinkedHashMap#LinkedHashMap(int, float)
124     */
125    @TestTargetNew(
126        level = TestLevel.COMPLETE,
127        notes = "",
128        method = "LinkedHashMap",
129        args = {int.class, float.class}
130    )
131    public void test_ConstructorIF() {
132        // Test for method java.util.LinkedHashMap(int, float)
133        LinkedHashMap hm2 = new LinkedHashMap(5, (float) 0.5);
134        assertEquals("Created incorrect LinkedHashMap", 0, hm2.size());
135        try {
136            new LinkedHashMap(0, 0);
137            fail("IllegalArgumentException expected");
138        } catch (IllegalArgumentException e) {
139            //expected
140        }
141
142        LinkedHashMap empty = new LinkedHashMap(0, 0.75f);
143        assertNull("Empty hashtable access", empty.get("nothing"));
144        empty.put("something", "here");
145        assertTrue("cannot get element", empty.get("something") == "here");
146    }
147
148    /**
149     * @tests java.util.LinkedHashMap#LinkedHashMap(java.util.Map)
150     */
151    @TestTargetNew(
152        level = TestLevel.COMPLETE,
153        notes = "",
154        method = "LinkedHashMap",
155        args = {java.util.Map.class}
156    )
157    public void test_ConstructorLjava_util_Map() {
158        // Test for method java.util.LinkedHashMap(java.util.Map)
159        Map myMap = new TreeMap();
160        for (int counter = 0; counter < hmSize; counter++)
161            myMap.put(objArray2[counter], objArray[counter]);
162        LinkedHashMap hm2 = new LinkedHashMap(myMap);
163        for (int counter = 0; counter < hmSize; counter++)
164            assertTrue("Failed to construct correct LinkedHashMap", hm
165                    .get(objArray2[counter]) == hm2.get(objArray2[counter]));
166
167        try {
168            new LinkedHashMap(null);
169            fail("NullPointerException expected");
170        } catch (NullPointerException e) {
171            //expected
172        }
173    }
174
175    /**
176     * @tests java.util.LinkedHashMap#get(java.lang.Object)
177     */
178    @TestTargetNew(
179        level = TestLevel.COMPLETE,
180        notes = "",
181        method = "get",
182        args = {java.lang.Object.class}
183    )
184    public void test_getLjava_lang_Object() {
185        // Test for method java.lang.Object
186        // java.util.LinkedHashMap.get(java.lang.Object)
187        assertNull("Get returned non-null for non existent key",
188                hm.get("T"));
189        hm.put("T", "HELLO");
190        assertEquals("Get returned incorecct value for existing key", "HELLO", hm.get("T")
191                );
192
193        LinkedHashMap m = new LinkedHashMap();
194        m.put(null, "test");
195        assertEquals("Failed with null key", "test", m.get(null));
196        assertNull("Failed with missing key matching null hash", m
197                .get(new Integer(0)));
198    }
199
200    /**
201     * @tests java.util.LinkedHashMap#put(java.lang.Object, java.lang.Object)
202     */
203    @TestTargetNew(
204        level = TestLevel.PARTIAL_COMPLETE,
205        notes = "",
206        method = "put",
207        args = {java.lang.Object.class, java.lang.Object.class}
208    )
209    public void test_putLjava_lang_ObjectLjava_lang_Object() {
210        // Test for method java.lang.Object
211        // java.util.LinkedHashMap.put(java.lang.Object, java.lang.Object)
212        hm.put("KEY", "VALUE");
213        assertEquals("Failed to install key/value pair",
214                "VALUE", hm.get("KEY"));
215
216        LinkedHashMap m = new LinkedHashMap();
217        m.put(new Short((short) 0), "short");
218        m.put(null, "test");
219        m.put(new Integer(0), "int");
220        assertEquals("Failed adding to bucket containing null", "short", m.get(
221                new Short((short) 0)));
222        assertEquals("Failed adding to bucket containing null2", "int", m.get(
223                new Integer(0)));
224    }
225
226    /**
227     * @tests java.util.LinkedHashMap#putAll(java.util.Map)
228     */
229    @TestTargetNew(
230        level = TestLevel.PARTIAL_COMPLETE,
231        notes = "Verifies only positive functionality.",
232        method = "putAll",
233        args = {java.util.Map.class}
234    )
235    public void test_putAllLjava_util_Map() {
236        // Test for method void java.util.LinkedHashMap.putAll(java.util.Map)
237        LinkedHashMap hm2 = new LinkedHashMap();
238        hm2.putAll(hm);
239        for (int i = 0; i < 1000; i++)
240            assertTrue("Failed to clear all elements", hm2.get(
241                    new Integer(i).toString()).equals((new Integer(i))));
242    }
243
244    /**
245     * @tests java.util.LinkedHashMap#putAll(java.util.Map)
246     */
247    @TestTargetNew(
248        level = TestLevel.PARTIAL_COMPLETE,
249        notes = "Verifies NullPointerException.",
250        method = "putAll",
251        args = {java.util.Map.class}
252    )
253    public void test_putAll_Ljava_util_Map_Null() {
254        LinkedHashMap linkedHashMap = new LinkedHashMap();
255        try {
256            linkedHashMap.putAll(new MockMapNull());
257            fail("Should throw NullPointerException");
258        } catch (NullPointerException e) {
259            // expected.
260        }
261
262        try {
263            linkedHashMap = new LinkedHashMap(new MockMapNull());
264            fail("Should throw NullPointerException");
265        } catch (NullPointerException e) {
266            // expected.
267        }
268    }
269
270    /**
271     * @tests java.util.LinkedHashMap#entrySet()
272     */
273    @TestTargetNew(
274        level = TestLevel.COMPLETE,
275        notes = "",
276        method = "entrySet",
277        args = {}
278    )
279    public void test_entrySet() {
280        // Test for method java.util.Set java.util.LinkedHashMap.entrySet()
281        Set s = hm.entrySet();
282        Iterator i = s.iterator();
283        assertTrue("Returned set of incorrect size", hm.size() == s.size());
284        while (i.hasNext()) {
285            Map.Entry m = (Map.Entry) i.next();
286            assertTrue("Returned incorrect entry set", hm.containsKey(m
287                    .getKey())
288                    && hm.containsValue(m.getValue()));
289        }
290    }
291
292    /**
293     * @tests java.util.LinkedHashMap#keySet()
294     */
295    @TestTargetNew(
296        level = TestLevel.COMPLETE,
297        notes = "",
298        method = "keySet",
299        args = {}
300    )
301    public void test_keySet() {
302        // Test for method java.util.Set java.util.LinkedHashMap.keySet()
303        Set s = hm.keySet();
304        assertTrue("Returned set of incorrect size()", s.size() == hm.size());
305        for (int i = 0; i < objArray.length; i++)
306            assertTrue("Returned set does not contain all keys", s
307                    .contains(objArray[i].toString()));
308
309        LinkedHashMap m = new LinkedHashMap();
310        m.put(null, "test");
311        assertTrue("Failed with null key", m.keySet().contains(null));
312        assertNull("Failed with null key", m.keySet().iterator().next());
313
314        Map map = new LinkedHashMap(101);
315        map.put(new Integer(1), "1");
316        map.put(new Integer(102), "102");
317        map.put(new Integer(203), "203");
318        Iterator it = map.keySet().iterator();
319        Integer remove1 = (Integer) it.next();
320        it.hasNext();
321        it.remove();
322        Integer remove2 = (Integer) it.next();
323        it.remove();
324        ArrayList list = new ArrayList(Arrays.asList(new Integer[] {
325                new Integer(1), new Integer(102), new Integer(203) }));
326        list.remove(remove1);
327        list.remove(remove2);
328        assertTrue("Wrong result", it.next().equals(list.get(0)));
329        assertEquals("Wrong size", 1, map.size());
330        assertTrue("Wrong contents", map.keySet().iterator().next().equals(
331                list.get(0)));
332
333        Map map2 = new LinkedHashMap(101);
334        map2.put(new Integer(1), "1");
335        map2.put(new Integer(4), "4");
336        Iterator it2 = map2.keySet().iterator();
337        Integer remove3 = (Integer) it2.next();
338        Integer next;
339        if (remove3.intValue() == 1)
340            next = new Integer(4);
341        else
342            next = new Integer(1);
343        it2.hasNext();
344        it2.remove();
345        assertTrue("Wrong result 2", it2.next().equals(next));
346        assertEquals("Wrong size 2", 1, map2.size());
347        assertTrue("Wrong contents 2", map2.keySet().iterator().next().equals(
348                next));
349    }
350
351    /**
352     * @tests java.util.LinkedHashMap#values()
353     */
354    @TestTargetNew(
355        level = TestLevel.COMPLETE,
356        notes = "",
357        method = "values",
358        args = {}
359    )
360    public void test_values() {
361        // Test for method java.util.Collection java.util.LinkedHashMap.values()
362        Collection c = hm.values();
363        assertTrue("Returned collection of incorrect size()", c.size() == hm
364                .size());
365        for (int i = 0; i < objArray.length; i++)
366            assertTrue("Returned collection does not contain all keys", c
367                    .contains(objArray[i]));
368
369        LinkedHashMap myLinkedHashMap = new LinkedHashMap();
370        for (int i = 0; i < 100; i++)
371            myLinkedHashMap.put(objArray2[i], objArray[i]);
372        Collection values = myLinkedHashMap.values();
373        new Support_UnmodifiableCollectionTest(
374                "Test Returned Collection From LinkedHashMap.values()", values)
375                .runTest();
376        values.remove(new Integer(0));
377        assertTrue(
378                "Removing from the values collection should remove from the original map",
379                !myLinkedHashMap.containsValue(new Integer(0)));
380
381    }
382
383    /**
384     * @tests java.util.LinkedHashMap#remove(java.lang.Object)
385     */
386    @TestTargetNew(
387        level = TestLevel.COMPLETE,
388        notes = "",
389        method = "remove",
390        args = {java.lang.Object.class}
391    )
392    public void test_removeLjava_lang_Object() {
393        // Test for method java.lang.Object
394        // java.util.LinkedHashMap.remove(java.lang.Object)
395        int size = hm.size();
396        Integer y = new Integer(9);
397        Integer x = ((Integer) hm.remove(y.toString()));
398        assertTrue("Remove returned incorrect value", x.equals(new Integer(9)));
399        assertNull("Failed to remove given key", hm.get(new Integer(9)));
400        assertTrue("Failed to decrement size", hm.size() == (size - 1));
401        assertNull("Remove of non-existent key returned non-null", hm
402                .remove("LCLCLC"));
403
404        LinkedHashMap m = new LinkedHashMap();
405        m.put(null, "test");
406        assertNull("Failed with same hash as null",
407                m.remove(new Integer(0)));
408        assertEquals("Failed with null key", "test", m.remove(null));
409    }
410
411    /**
412     * @tests java.util.LinkedHashMap#clear()
413     */
414    @TestTargetNew(
415        level = TestLevel.COMPLETE,
416        notes = "",
417        method = "clear",
418        args = {}
419    )
420    public void test_clear() {
421        // Test for method void java.util.LinkedHashMap.clear()
422        hm.clear();
423        assertEquals("Clear failed to reset size", 0, hm.size());
424        for (int i = 0; i < hmSize; i++)
425            assertNull("Failed to clear all elements",
426                    hm.get(objArray2[i]));
427
428    }
429
430    /**
431     * @tests java.util.LinkedHashMap#clone()
432     */
433    @TestTargetNew(
434        level = TestLevel.COMPLETE,
435        notes = "",
436        method = "clone",
437        args = {}
438    )
439    public void test_clone() {
440        // Test for method java.lang.Object java.util.LinkedHashMap.clone()
441        LinkedHashMap hm2 = (LinkedHashMap) hm.clone();
442        assertTrue("Clone answered equivalent LinkedHashMap", hm2 != hm);
443        for (int counter = 0; counter < hmSize; counter++)
444            assertTrue("Clone answered unequal LinkedHashMap", hm
445                    .get(objArray2[counter]) == hm2.get(objArray2[counter]));
446
447        LinkedHashMap map = new LinkedHashMap();
448        map.put("key", "value");
449        // get the keySet() and values() on the original Map
450        Set keys = map.keySet();
451        Collection values = map.values();
452        assertEquals("values() does not work",
453                "value", values.iterator().next());
454        assertEquals("keySet() does not work",
455                "key", keys.iterator().next());
456        AbstractMap map2 = (AbstractMap) map.clone();
457        map2.put("key", "value2");
458        Collection values2 = map2.values();
459        assertTrue("values() is identical", values2 != values);
460
461        // values() and keySet() on the cloned() map should be different
462        assertEquals("values() was not cloned",
463                "value2", values2.iterator().next());
464        map2.clear();
465        map2.put("key2", "value3");
466        Set key2 = map2.keySet();
467        assertTrue("keySet() is identical", key2 != keys);
468        assertEquals("keySet() was not cloned",
469                "key2", key2.iterator().next());
470    }
471
472    /**
473     * @tests java.util.LinkedHashMap#containsKey(java.lang.Object)
474     */
475    @TestTargetNew(
476        level = TestLevel.COMPLETE,
477        notes = "",
478        method = "containsKey",
479        args = {java.lang.Object.class}
480    )
481    public void test_containsKeyLjava_lang_Object() {
482        // Test for method boolean
483        // java.util.LinkedHashMap.containsKey(java.lang.Object)
484        assertTrue("Returned false for valid key", hm.containsKey(new Integer(
485                876).toString()));
486        assertTrue("Returned true for invalid key", !hm.containsKey("KKDKDKD"));
487
488        LinkedHashMap m = new LinkedHashMap();
489        m.put(null, "test");
490        assertTrue("Failed with null key", m.containsKey(null));
491        assertTrue("Failed with missing key matching null hash", !m
492                .containsKey(new Integer(0)));
493    }
494
495    /**
496     * @tests java.util.LinkedHashMap#containsValue(java.lang.Object)
497     */
498    @TestTargetNew(
499        level = TestLevel.COMPLETE,
500        notes = "",
501        method = "containsValue",
502        args = {java.lang.Object.class}
503    )
504    public void test_containsValueLjava_lang_Object() {
505        // Test for method boolean
506        // java.util.LinkedHashMap.containsValue(java.lang.Object)
507        assertTrue("Returned false for valid value", hm
508                .containsValue(new Integer(875)));
509        assertTrue("Returned true for invalid valie", !hm
510                .containsValue(new Integer(-9)));
511    }
512
513    /**
514     * @tests java.util.LinkedHashMap#isEmpty()
515     */
516    @TestTargetNew(
517        level = TestLevel.COMPLETE,
518        notes = "",
519        method = "isEmpty",
520        args = {}
521    )
522    public void test_isEmpty() {
523        // Test for method boolean java.util.LinkedHashMap.isEmpty()
524        assertTrue("Returned false for new map", new LinkedHashMap().isEmpty());
525        assertTrue("Returned true for non-empty", !hm.isEmpty());
526    }
527
528    /**
529     * @tests java.util.LinkedHashMap#size()
530     */
531    @TestTargetNew(
532        level = TestLevel.COMPLETE,
533        notes = "",
534        method = "size",
535        args = {}
536    )
537    public void test_size() {
538        // Test for method int java.util.LinkedHashMap.size()
539        assertTrue("Returned incorrect size",
540                hm.size() == (objArray.length + 2));
541    }
542
543    /**
544     * @tests java.util.LinkedHashMap#entrySet()
545     */
546    @TestTargetNew(
547        level = TestLevel.COMPLETE,
548        notes = "",
549        method = "entrySet",
550        args = {}
551    )
552    public void test_ordered_entrySet() {
553        int i;
554        int sz = 100;
555        LinkedHashMap lhm = new LinkedHashMap();
556        for (i = 0; i < sz; i++) {
557            Integer ii = new Integer(i);
558            lhm.put(ii, ii.toString());
559        }
560
561        Set s1 = lhm.entrySet();
562        Iterator it1 = s1.iterator();
563        assertTrue("Returned set of incorrect size 1", lhm.size() == s1.size());
564        for (i = 0; it1.hasNext(); i++) {
565            Map.Entry m = (Map.Entry) it1.next();
566            Integer jj = (Integer) m.getKey();
567            assertTrue("Returned incorrect entry set 1", jj.intValue() == i);
568        }
569
570        LinkedHashMap lruhm = new LinkedHashMap(200, .75f, true);
571        for (i = 0; i < sz; i++) {
572            Integer ii = new Integer(i);
573            lruhm.put(ii, ii.toString());
574        }
575
576        Set s3 = lruhm.entrySet();
577        Iterator it3 = s3.iterator();
578        assertTrue("Returned set of incorrect size 2", lruhm.size() == s3
579                .size());
580        for (i = 0; i < sz && it3.hasNext(); i++) {
581            Map.Entry m = (Map.Entry) it3.next();
582            Integer jj = (Integer) m.getKey();
583            assertTrue("Returned incorrect entry set 2", jj.intValue() == i);
584        }
585
586        /* fetch the even numbered entries to affect traversal order */
587        int p = 0;
588        for (i = 0; i < sz; i += 2) {
589            String ii = (String) lruhm.get(new Integer(i));
590            p = p + Integer.parseInt(ii);
591        }
592        assertEquals("invalid sum of even numbers", 2450, p);
593
594        Set s2 = lruhm.entrySet();
595        Iterator it2 = s2.iterator();
596        assertTrue("Returned set of incorrect size 3", lruhm.size() == s2
597                .size());
598        for (i = 1; i < sz && it2.hasNext(); i += 2) {
599            Map.Entry m = (Map.Entry) it2.next();
600            Integer jj = (Integer) m.getKey();
601            assertTrue("Returned incorrect entry set 3", jj.intValue() == i);
602        }
603        for (i = 0; i < sz && it2.hasNext(); i += 2) {
604            Map.Entry m = (Map.Entry) it2.next();
605            Integer jj = (Integer) m.getKey();
606            assertTrue("Returned incorrect entry set 4", jj.intValue() == i);
607        }
608        assertTrue("Entries left to iterate on", !it2.hasNext());
609    }
610
611    /**
612     * @tests java.util.LinkedHashMap#keySet()
613     */
614    @TestTargetNew(
615        level = TestLevel.COMPLETE,
616        notes = "",
617        method = "keySet",
618        args = {}
619    )
620    public void test_ordered_keySet() {
621        int i;
622        int sz = 100;
623        LinkedHashMap lhm = new LinkedHashMap();
624        for (i = 0; i < sz; i++) {
625            Integer ii = new Integer(i);
626            lhm.put(ii, ii.toString());
627        }
628
629        Set s1 = lhm.keySet();
630        Iterator it1 = s1.iterator();
631        assertTrue("Returned set of incorrect size", lhm.size() == s1.size());
632        for (i = 0; it1.hasNext(); i++) {
633            Integer jj = (Integer) it1.next();
634            assertTrue("Returned incorrect entry set", jj.intValue() == i);
635        }
636
637        LinkedHashMap lruhm = new LinkedHashMap(200, .75f, true);
638        for (i = 0; i < sz; i++) {
639            Integer ii = new Integer(i);
640            lruhm.put(ii, ii.toString());
641        }
642
643        Set s3 = lruhm.keySet();
644        Iterator it3 = s3.iterator();
645        assertTrue("Returned set of incorrect size", lruhm.size() == s3.size());
646        for (i = 0; i < sz && it3.hasNext(); i++) {
647            Integer jj = (Integer) it3.next();
648            assertTrue("Returned incorrect entry set", jj.intValue() == i);
649        }
650
651        /* fetch the even numbered entries to affect traversal order */
652        int p = 0;
653        for (i = 0; i < sz; i += 2) {
654            String ii = (String) lruhm.get(new Integer(i));
655            p = p + Integer.parseInt(ii);
656        }
657        assertEquals("invalid sum of even numbers", 2450, p);
658
659        Set s2 = lruhm.keySet();
660        Iterator it2 = s2.iterator();
661        assertTrue("Returned set of incorrect size", lruhm.size() == s2.size());
662        for (i = 1; i < sz && it2.hasNext(); i += 2) {
663            Integer jj = (Integer) it2.next();
664            assertTrue("Returned incorrect entry set", jj.intValue() == i);
665        }
666        for (i = 0; i < sz && it2.hasNext(); i += 2) {
667            Integer jj = (Integer) it2.next();
668            assertTrue("Returned incorrect entry set", jj.intValue() == i);
669        }
670        assertTrue("Entries left to iterate on", !it2.hasNext());
671    }
672
673    /**
674     * @tests java.util.LinkedHashMap#values()
675     */
676    @TestTargetNew(
677        level = TestLevel.COMPLETE,
678        notes = "",
679        method = "values",
680        args = {}
681    )
682    public void test_ordered_values() {
683        int i;
684        int sz = 100;
685        LinkedHashMap lhm = new LinkedHashMap();
686        for (i = 0; i < sz; i++) {
687            Integer ii = new Integer(i);
688            lhm.put(ii, new Integer(i * 2));
689        }
690
691        Collection s1 = lhm.values();
692        Iterator it1 = s1.iterator();
693        assertTrue("Returned set of incorrect size 1", lhm.size() == s1.size());
694        for (i = 0; it1.hasNext(); i++) {
695            Integer jj = (Integer) it1.next();
696            assertTrue("Returned incorrect entry set 1", jj.intValue() == i * 2);
697        }
698
699        LinkedHashMap lruhm = new LinkedHashMap(200, .75f, true);
700        for (i = 0; i < sz; i++) {
701            Integer ii = new Integer(i);
702            lruhm.put(ii, new Integer(i * 2));
703        }
704
705        Collection s3 = lruhm.values();
706        Iterator it3 = s3.iterator();
707        assertTrue("Returned set of incorrect size", lruhm.size() == s3.size());
708        for (i = 0; i < sz && it3.hasNext(); i++) {
709            Integer jj = (Integer) it3.next();
710            assertTrue("Returned incorrect entry set", jj.intValue() == i * 2);
711        }
712
713        // fetch the even numbered entries to affect traversal order
714        int p = 0;
715        for (i = 0; i < sz; i += 2) {
716            Integer ii = (Integer) lruhm.get(new Integer(i));
717            p = p + ii.intValue();
718        }
719        assertTrue("invalid sum of even numbers", p == 2450 * 2);
720
721        Collection s2 = lruhm.values();
722        Iterator it2 = s2.iterator();
723        assertTrue("Returned set of incorrect size", lruhm.size() == s2.size());
724        for (i = 1; i < sz && it2.hasNext(); i += 2) {
725            Integer jj = (Integer) it2.next();
726            assertTrue("Returned incorrect entry set", jj.intValue() == i * 2);
727        }
728        for (i = 0; i < sz && it2.hasNext(); i += 2) {
729            Integer jj = (Integer) it2.next();
730            assertTrue("Returned incorrect entry set", jj.intValue() == i * 2);
731        }
732        assertTrue("Entries left to iterate on", !it2.hasNext());
733    }
734
735    /**
736     * @tests java.util.LinkedHashMap#removeEldestEntry(java.util.Map$Entry)
737     */
738    @TestTargetNew(
739        level = TestLevel.PARTIAL_COMPLETE,
740        notes = "Doesn't verify null as a parameter.",
741        method = "removeEldestEntry",
742        args = {java.util.Map.Entry.class}
743    )
744    public void test_remove_eldest() {
745        int i;
746        int sz = 10;
747        CacheMap lhm = new CacheMap();
748        for (i = 0; i < sz; i++) {
749            Integer ii = new Integer(i);
750            lhm.put(ii, new Integer(i * 2));
751        }
752
753        Collection s1 = lhm.values();
754        Iterator it1 = s1.iterator();
755        assertTrue("Returned set of incorrect size 1", lhm.size() == s1.size());
756        for (i = 5; it1.hasNext(); i++) {
757            Integer jj = (Integer) it1.next();
758            assertTrue("Returned incorrect entry set 1", jj.intValue() == i * 2);
759        }
760        assertTrue("Entries left in map", !it1.hasNext());
761    }
762
763    @TestTargets({
764        @TestTargetNew(
765            level = TestLevel.COMPLETE,
766            notes = "",
767            method = "LinkedHashMap",
768            args = {int.class, float.class, boolean.class}
769        ),
770        @TestTargetNew(
771            level = TestLevel.COMPLETE,
772            notes = "",
773            method = "put",
774            args = {java.lang.Object.class, java.lang.Object.class}
775        )
776    })
777    // BEGIN android-added
778    public void testLinkedHashMap() {
779        // we want to test the LinkedHashMap in access ordering mode.
780        LinkedHashMap map = new LinkedHashMap<String, String>(10, 0.75f, true);
781
782        map.put("key1", "value1");
783        map.put("key2", "value2");
784        map.put("key3", "value3");
785
786        Iterator iterator = map.keySet().iterator();
787        String id = (String) iterator.next();
788        map.get(id);
789        try {
790            iterator.next();
791            // A LinkedHashMap is supposed to throw this Exception when a
792            // iterator.next() Operation takes place after a get
793            // Operation. This is because the get Operation is considered
794            // a structural modification if the LinkedHashMap is in
795            // access order mode.
796            fail("expected ConcurrentModificationException was not thrown.");
797        } catch(ConcurrentModificationException e) {
798            // expected
799        }
800
801        LinkedHashMap mapClone = (LinkedHashMap) map.clone();
802
803        iterator = map.keySet().iterator();
804        id = (String) iterator.next();
805        mapClone.get(id);
806        try {
807            iterator.next();
808        } catch(ConcurrentModificationException e) {
809            fail("expected ConcurrentModificationException was not thrown.");
810        }
811
812        try {
813            new LinkedHashMap<String, String>(-10, 0.75f, true);
814            fail("IllegalArgumentException expected");
815        } catch (IllegalArgumentException e) {
816            //expected
817        }
818
819        try {
820            new LinkedHashMap<String, String>(10, -0.75f, true);
821            fail("IllegalArgumentException expected");
822        } catch (IllegalArgumentException e) {
823            //expected
824        }
825    }
826    // END android-added
827
828    /**
829     * Sets up the fixture, for example, open a network connection. This method
830     * is called before a test is executed.
831     */
832    protected void setUp() {
833        hm = new LinkedHashMap();
834        for (int i = 0; i < objArray.length; i++)
835            hm.put(objArray2[i], objArray[i]);
836        hm.put("test", null);
837        hm.put(null, "test");
838    }
839
840    /**
841     * Tears down the fixture, for example, close a network connection. This
842     * method is called after a test is executed.
843     */
844    protected void tearDown() {
845    }
846}
847