1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.collections4.multimap;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertFalse;
21 import static org.junit.jupiter.api.Assertions.assertNotSame;
22 import static org.junit.jupiter.api.Assertions.assertTrue;
23
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.HashMap;
27 import java.util.List;
28 import java.util.ListIterator;
29 import java.util.Map;
30
31 import org.apache.commons.collections4.ListValuedMap;
32 import org.apache.commons.collections4.MultiValuedMap;
33 import org.apache.commons.collections4.collection.AbstractCollectionTest;
34 import org.junit.jupiter.api.Test;
35
36
37
38
39 public class ArrayListValuedHashMapTest<K, V> extends AbstractMultiValuedMapTest<K, V> {
40
41 @Override
42 protected int getIterationBehaviour() {
43 return AbstractCollectionTest.UNORDERED;
44 }
45
46 @Override
47 public ListValuedMap<K, V> makeObject() {
48 return new ArrayListValuedHashMap<>();
49 }
50
51 @Test
52 public void testArrayListValuedHashMap() {
53 final ListValuedMap<K, V> listMap;
54 final ListValuedMap<K, V> listMap1;
55 final Map<K, V> map = new HashMap<>();
56 final Map<K, V> map1 = new HashMap<>();
57 map.put((K) "A", (V) "W");
58 map.put((K) "B", (V) "X");
59 map.put((K) "C", (V) "F");
60
61 listMap = new ArrayListValuedHashMap<>(map);
62 assertEquals(1, listMap.get((K) "A").size());
63 assertEquals(1, listMap.get((K) "B").size());
64 assertEquals(1, listMap.get((K) "C").size());
65
66 listMap1 = new ArrayListValuedHashMap<>(map1);
67 assertEquals("{}", listMap1.toString());
68 }
69
70 @Test
71 public void testCopyConstructorWithMultiValuedMap() {
72 final ListValuedMap<K, V> map = makeObject();
73 map.put((K) "key", (V) "sleutel");
74 final ListValuedMap<K, V> copy = new ArrayListValuedHashMap<>(map);
75 assertEquals(map, copy);
76 }
77
78 @SuppressWarnings({ "unchecked", "rawtypes" })
79 @Test
80 public void testEqualsHashCodeContract() {
81 final MultiValuedMap map1 = makeObject();
82 final MultiValuedMap map2 = makeObject();
83
84 map1.put("a", "a1");
85 map1.put("a", "a2");
86 map2.put("a", "a1");
87 map2.put("a", "a2");
88 assertEquals(map1, map2);
89 assertEquals(map1.hashCode(), map2.hashCode());
90
91 map2.put("a", "a2");
92 assertNotSame(map1, map2);
93 assertNotSame(map1.hashCode(), map2.hashCode());
94 }
95
96 @Test
97 @SuppressWarnings("unchecked")
98 public void testListValuedMapAdd() {
99 final ListValuedMap<K, V> listMap = makeObject();
100 assertTrue(listMap.get((K) "whatever") instanceof List);
101 final List<V> list = listMap.get((K) "A");
102 list.add((V) "a1");
103 assertEquals(1, listMap.size());
104 assertTrue(listMap.containsKey("A"));
105 }
106
107 @Test
108 @SuppressWarnings("unchecked")
109 public void testListValuedMapAddViaListIterator() {
110 final ListValuedMap<K, V> listMap = makeObject();
111 final ListIterator<V> listIt = listMap.get((K) "B").listIterator();
112 assertFalse(listIt.hasNext());
113 listIt.add((V) "b1");
114 listIt.add((V) "b2");
115 listIt.add((V) "b3");
116 assertEquals(3, listMap.size());
117 assertTrue(listMap.containsKey("B"));
118
119 assertFalse(listIt.hasNext());
120 }
121
122 @SuppressWarnings({ "unchecked", "rawtypes" })
123 @Test
124 public void testListValuedMapEqualsHashCodeContract() {
125 final ListValuedMap map1 = makeObject();
126 final ListValuedMap map2 = makeObject();
127
128 map1.put("a", "a1");
129 map1.put("a", "a2");
130 map2.put("a", "a1");
131 map2.put("a", "a2");
132 assertEquals(map1, map2);
133 assertEquals(map1.hashCode(), map2.hashCode());
134
135 map1.put("b", "b1");
136 map1.put("b", "b2");
137 map2.put("b", "b2");
138 map2.put("b", "b1");
139 assertNotSame(map1, map2);
140 assertNotSame(map1.hashCode(), map2.hashCode());
141 }
142
143 @Test
144 @SuppressWarnings("unchecked")
145 public void testListValuedMapRemove() {
146 final ListValuedMap<K, V> listMap = makeObject();
147 final List<V> list = listMap.get((K) "A");
148 list.add((V) "a1");
149 list.add((V) "a2");
150 list.add((V) "a3");
151 assertEquals(3, listMap.size());
152 assertEquals("a1", list.remove(0));
153 assertEquals(2, listMap.size());
154 assertEquals("a2", list.remove(0));
155 assertEquals(1, listMap.size());
156 assertEquals("a3", list.remove(0));
157 assertEquals(0, listMap.size());
158 assertFalse(listMap.containsKey("A"));
159 }
160
161 @Test
162 @SuppressWarnings("unchecked")
163 public void testListValuedMapRemoveViaListIterator() {
164 final ListValuedMap<K, V> listMap = makeObject();
165 ListIterator<V> listIt = listMap.get((K) "B").listIterator();
166 listIt.add((V) "b1");
167 listIt.add((V) "b2");
168 assertEquals(2, listMap.size());
169 assertTrue(listMap.containsKey("B"));
170 listIt = listMap.get((K) "B").listIterator();
171 while (listIt.hasNext()) {
172 listIt.next();
173 listIt.remove();
174 }
175 assertFalse(listMap.containsKey("B"));
176 listIt.add((V) "b1");
177 listIt.add((V) "b2");
178 assertTrue(listMap.containsKey("B"));
179 assertEquals(2, listMap.get((K) "B").size());
180 }
181
182 @Test
183 public void testTrimToSize() {
184 final ArrayListValuedHashMap<K, V> listMap = new ArrayListValuedHashMap<>(4);
185
186 assertEquals("{}", listMap.toString());
187 listMap.put((K) "A", (V) "W");
188 listMap.put((K) "A", (V) "X");
189 listMap.put((K) "B", (V) "F");
190 assertEquals(2, listMap.get((K) "A").size());
191 assertEquals(1, listMap.get((K) "B").size());
192
193 listMap.trimToSize();
194 assertEquals(2, listMap.get((K) "A").size());
195 assertEquals(1, listMap.get((K) "B").size());
196 }
197
198 @Test
199 public void testValuesListIteratorMethods() {
200 final ListValuedMap<K, V> listMap = makeObject();
201 final List<V> listA = listMap.get((K) "A");
202 final List<V> list = Arrays.asList((V) "W", (V) "X", (V) "F", (V) "Q", (V) "Q", (V) "F");
203 listA.addAll(0, list);
204 final ListIterator<V> it = listMap.get((K) "A").listIterator(1);
205 assertTrue(it.hasNext());
206 assertEquals("X", it.next());
207 assertEquals("F", it.next());
208 assertTrue(it.hasPrevious());
209 assertEquals("F", it.previous());
210 assertEquals(2, it.nextIndex());
211 assertEquals(1, it.previousIndex());
212 it.set((V) "Z");
213 assertEquals("Z", it.next());
214 assertEquals("Q", it.next());
215 }
216
217 @Test
218 public void testWrappedListAdd() {
219 final ListValuedMap<K, V> listMap = makeObject();
220 final List<V> listA = listMap.get((K) "A");
221 listA.add(0, (V) "W");
222 listA.add(1, (V) "X");
223 listA.add(2, (V) "F");
224 assertEquals("{A=[W, X, F]}", listMap.toString());
225 listMap.get((K) "A").set(1, (V) "Q");
226 assertEquals("{A=[W, Q, F]}", listMap.toString());
227 }
228
229 @Test
230 public void testWrappedListAddAll() {
231 final ListValuedMap<K, V> listMap = makeObject();
232 final List<V> listA = listMap.get((K) "A");
233 final List<V> list = Arrays.asList((V) "W", (V) "X", (V) "F");
234 listA.addAll(0, list);
235 assertEquals("{A=[W, X, F]}", listMap.toString());
236
237 final List<V> list1 = Arrays.asList((V) "Q", (V) "Q", (V) "L");
238 listA.addAll(3, list1);
239 assertEquals("{A=[W, X, F, Q, Q, L]}", listMap.toString());
240 assertEquals("W", listMap.get((K) "A").get(0));
241 assertEquals("X", listMap.get((K) "A").get(1));
242 assertEquals("F", listMap.get((K) "A").get(2));
243 assertEquals("Q", listMap.get((K) "A").get(3));
244 assertEquals("Q", listMap.get((K) "A").get(4));
245 assertEquals("L", listMap.get((K) "A").get(5));
246 assertEquals(0, listMap.get((K) "A").indexOf("W"));
247 assertEquals(2, listMap.get((K) "A").indexOf("F"));
248 assertEquals(-1, listMap.get((K) "A").indexOf("C"));
249 assertEquals(3, listMap.get((K) "A").indexOf("Q"));
250 assertEquals(4, listMap.get((K) "A").lastIndexOf("Q"));
251 assertEquals(-1, listMap.get((K) "A").lastIndexOf("A"));
252
253 final List<V> list2 = new ArrayList<>();
254 listMap.get((K) "B").addAll(0, list2);
255 assertEquals("{A=[W, X, F, Q, Q, L]}", listMap.toString());
256 final List<V> list3 = listMap.get((K) "A").subList(1, 4);
257 assertEquals(3, list3.size());
258 assertEquals("Q", list3.get(2));
259 }
260
261
262
263
264
265
266
267
268 }