Home | History | Annotate | Download | only in util
      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 
     18 package org.apache.harmony.luni.tests.java.util;
     19 
     20 import dalvik.annotation.TestTargets;
     21 import dalvik.annotation.TestLevel;
     22 import dalvik.annotation.TestTargetNew;
     23 import dalvik.annotation.TestTargetClass;
     24 
     25 import java.util.AbstractMap;
     26 import java.util.ArrayList;
     27 import java.util.Arrays;
     28 import java.util.Collection;
     29 import java.util.ConcurrentModificationException;
     30 import java.util.Iterator;
     31 import java.util.LinkedHashMap;
     32 import java.util.Map;
     33 import java.util.Set;
     34 import java.util.TreeMap;
     35 
     36 import tests.support.Support_MapTest2;
     37 import tests.support.Support_UnmodifiableCollectionTest;
     38 
     39 /**
     40  * @tests java.util.LinkedHashMap
     41  */
     42 @TestTargetClass(LinkedHashMap.class)
     43 public 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