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