View Javadoc
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  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   * Tests {@link ArrayListValuedHashMap}.
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         // As ListIterator always adds before the current cursor
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 //    public void testCreate() throws Exception {
258 //        writeExternalFormToDisk((java.io.Serializable) makeObject(),
259 //                "src/test/resources/data/test/ArrayListValuedHashMap.emptyCollection.version4.1.obj");
260 //        writeExternalFormToDisk((java.io.Serializable) makeFullMap(),
261 //                "src/test/resources/data/test/ArrayListValuedHashMap.fullCollection.version4.1.obj");
262 //    }
263 
264 }