LinkedHashMapTest.java revision fca5aaa0a2c31d322b708012df2158d8399cefe3
1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17package libcore.java.util; 18 19import java.util.LinkedHashMap; 20import java.util.Map; 21import java.util.concurrent.atomic.AtomicBoolean; 22import java.util.concurrent.atomic.AtomicInteger; 23 24public class LinkedHashMapTest extends junit.framework.TestCase { 25 26 public void test_getOrDefault() { 27 MapDefaultMethodTester 28 .test_getOrDefault(new LinkedHashMap<>(), true /*acceptsNullKey*/, 29 true /*acceptsNullValue*/); 30 31 // Test for access order 32 Map<String, String> m = new LinkedHashMap<String, String>(8, .75f, true); 33 m.put("key", "value"); 34 m.put("key1", "value1"); 35 m.put("key2", "value2"); 36 m.getOrDefault("key1", "value"); 37 Map.Entry<String, String> newest = null; 38 for (Map.Entry<String, String> e : m.entrySet()) { 39 newest = e; 40 } 41 assertEquals("key1", newest.getKey()); 42 assertEquals("value1", newest.getValue()); 43 } 44 45 public void test_forEach() { 46 MapDefaultMethodTester.test_forEach(new LinkedHashMap<>()); 47 } 48 49 public void test_putIfAbsent() { 50 MapDefaultMethodTester.test_putIfAbsent(new LinkedHashMap<>(), true /*acceptsNullKey*/, 51 true /*acceptsNullValue*/); 52 53 // Test for access order 54 Map<String, String> m = new LinkedHashMap<String, String>(8, .75f, true); 55 m.putIfAbsent("key", "value"); 56 m.putIfAbsent("key1", "value1"); 57 m.putIfAbsent("key2", "value2"); 58 Map.Entry<String, String> newest = null; 59 for (Map.Entry<String, String> e : m.entrySet()) { 60 newest = e; 61 } 62 assertEquals("key2", newest.getKey()); 63 assertEquals("value2", newest.getValue()); 64 65 // for existed key 66 m.putIfAbsent("key1", "value1"); 67 for (Map.Entry<String, String> e : m.entrySet()) { 68 newest = e; 69 } 70 assertEquals("key1", newest.getKey()); 71 assertEquals("value1", newest.getValue()); 72 } 73 74 public void test_remove() { 75 MapDefaultMethodTester.test_remove(new LinkedHashMap<>(), true /*acceptsNullKey*/, 76 true /*acceptsNullValue*/); 77 } 78 79 public void test_replace$K$V$V() { 80 MapDefaultMethodTester. 81 test_replace$K$V$V(new LinkedHashMap<>(), true /*acceptsNullKey*/, 82 true /*acceptsNullValue*/); 83 84 // Test for access order 85 Map<String, String> m = new LinkedHashMap<>(8, .75f, true /*accessOrder*/); 86 m.put("key", "value"); 87 m.put("key1", "value1"); 88 m.put("key2", "value2"); 89 m.replace("key1", "value1", "value2"); 90 Map.Entry<String, String> newest = null; 91 for (Map.Entry<String, String> e : m.entrySet()) { 92 newest = e; 93 } 94 assertEquals("key1", newest.getKey()); 95 assertEquals("value2", newest.getValue()); 96 97 // for wrong pair of key and value, last accessed node should 98 // not change 99 m.replace("key2", "value1", "value3"); 100 for (Map.Entry<String, String> e : m.entrySet()) { 101 newest = e; 102 } 103 assertEquals("key1", newest.getKey()); 104 assertEquals("value2", newest.getValue()); 105 } 106 107 public void test_replace$K$V() { 108 MapDefaultMethodTester.test_replace$K$V(new LinkedHashMap<>(), true /*acceptsNullKey*/, 109 true /*acceptsNullValue*/); 110 111 // Test for access order 112 Map<String, String> m = new LinkedHashMap<>(8, .75f, true /*accessOrder*/); 113 m.put("key", "value"); 114 m.put("key1", "value1"); 115 m.put("key2", "value2"); 116 m.replace("key1", "value2"); 117 Map.Entry<String, String> newest = null; 118 for (Map.Entry<String, String> e : m.entrySet()) { 119 newest = e; 120 } 121 assertEquals("key1", newest.getKey()); 122 assertEquals("value2", newest.getValue()); 123 } 124 125 public void test_computeIfAbsent() { 126 MapDefaultMethodTester.test_computeIfAbsent(new LinkedHashMap<>(), true /*acceptsNullKey*/, 127 true /*acceptsNullValue*/); 128 129 // Test for access order 130 Map<String, String> m = new LinkedHashMap<>(8, .75f, true /*accessOrder*/); 131 m.put("key", "value"); 132 m.put("key1", "value1"); 133 m.put("key2", "value2"); 134 m.computeIfAbsent("key1", (k) -> "value3"); 135 Map.Entry<String, String> newest = null; 136 for (Map.Entry<String, String> e : m.entrySet()) { 137 newest = e; 138 } 139 assertEquals("key1", newest.getKey()); 140 assertEquals("value1", newest.getValue()); 141 142 // When value is absent 143 m.computeIfAbsent("key4", (k) -> "value3"); 144 newest = null; 145 for (Map.Entry<String, String> e : m.entrySet()) { 146 newest = e; 147 } 148 assertEquals("key4", newest.getKey()); 149 assertEquals("value3", newest.getValue()); 150 } 151 152 public void test_computeIfPresent() { 153 MapDefaultMethodTester.test_computeIfPresent(new LinkedHashMap<>(), true /*acceptsNullKey*/); 154 155 // Test for access order 156 Map<String, String> m = new LinkedHashMap<>(8, .75f, true /*accessOrder*/); 157 m.put("key", "value"); 158 m.put("key1", "value1"); 159 m.put("key2", "value2"); 160 m.computeIfPresent("key1", (k, v) -> "value3"); 161 Map.Entry<String, String> newest = null; 162 for (Map.Entry<String, String> e : m.entrySet()) { 163 newest = e; 164 } 165 assertEquals("key1", newest.getKey()); 166 assertEquals("value3", newest.getValue()); 167 } 168 169 public void test_compute() { 170 MapDefaultMethodTester.test_compute(new LinkedHashMap<>(), true /*acceptsNullKey*/); 171 172 // Test for access order 173 Map<String, String> m = new LinkedHashMap<>(8, .75f, true /*accessOrder*/); 174 m.put("key", "value"); 175 m.put("key1", "value1"); 176 m.put("key2", "value2"); 177 m.compute("key1", (k, v) -> "value3"); 178 Map.Entry<String, String> newest = null; 179 for (Map.Entry<String, String> e : m.entrySet()) { 180 newest = e; 181 } 182 assertEquals("key1", newest.getKey()); 183 assertEquals("value3", newest.getValue()); 184 185 m.compute("key4", (k, v) -> "value4"); 186 newest = null; 187 for (Map.Entry<String, String> e : m.entrySet()) { 188 newest = e; 189 } 190 assertEquals("key4", newest.getKey()); 191 assertEquals("value4", newest.getValue()); 192 } 193 194 public void test_merge() { 195 MapDefaultMethodTester.test_merge(new LinkedHashMap<>(), true /*acceptsNullKey*/); 196 197 // Test for access order 198 Map<String, String> m = new LinkedHashMap<>(8, .75f, true /*accessOrder*/); 199 m.put("key", "value"); 200 m.put("key1", "value1"); 201 m.put("key2", "value2"); 202 m.merge("key1", "value3", (k, v) -> "value3"); 203 Map.Entry<String, String> newest = null; 204 for (Map.Entry<String, String> e : m.entrySet()) { 205 newest = e; 206 } 207 assertEquals("key1", newest.getKey()); 208 assertEquals("value3", newest.getValue()); 209 } 210 211 // http://b/27929722 212 // This tests the behaviour is consistent with earlier Android releases. 213 // This behaviour is NOT consistent with the RI. Future Android releases 214 // might change this. 215 public void test_removeEldestEntry() { 216 final AtomicBoolean removeEldestEntryReturnValue = new AtomicBoolean(false); 217 final AtomicInteger removeEldestEntryCallCount = new AtomicInteger(0); 218 LinkedHashMap<String, String> m = new LinkedHashMap<String, String>() { 219 @Override 220 protected boolean removeEldestEntry(Entry eldest) { 221 removeEldestEntryCallCount.incrementAndGet(); 222 return removeEldestEntryReturnValue.get(); 223 } 224 }; 225 226 m.put("foo", "bar"); 227 assertEquals(0, removeEldestEntryCallCount.get()); 228 m.put("baz", "quux"); 229 assertEquals(1, removeEldestEntryCallCount.get()); 230 231 removeEldestEntryReturnValue.set(true); 232 m.put("foob", "faab"); 233 assertEquals(2, removeEldestEntryCallCount.get()); 234 assertEquals(2, m.size()); 235 assertFalse(m.containsKey("foo")); 236 } 237} 238