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.assertNotNull;
22  import static org.junit.jupiter.api.Assertions.assertTrue;
23  
24  import java.util.Collection;
25  
26  import org.apache.commons.collections4.MultiValuedMap;
27  import org.apache.commons.collections4.Transformer;
28  import org.apache.commons.collections4.TransformerUtils;
29  import org.apache.commons.collections4.collection.AbstractCollectionTest;
30  import org.apache.commons.collections4.collection.TransformedCollectionTest;
31  import org.junit.jupiter.api.Test;
32  
33  /**
34   * Tests {@link TransformedMultiValuedMap}.
35   */
36  public class TransformedMultiValuedMapTest<K, V> extends AbstractMultiValuedMapTest<K, V> {
37  
38      public TransformedMultiValuedMapTest() {
39          super(TransformedMultiValuedMapTest.class.getSimpleName());
40      }
41  
42      @Override
43      protected int getIterationBehaviour() {
44          return AbstractCollectionTest.UNORDERED;
45      }
46  
47      @Override
48      public MultiValuedMap<K, V> makeObject() {
49          return TransformedMultiValuedMap.transformingMap(new ArrayListValuedHashMap<>(),
50                  TransformerUtils.<K>nopTransformer(), TransformerUtils.<V>nopTransformer());
51      }
52  
53      @Test
54      @SuppressWarnings("unchecked")
55      public void testFactory_Decorate() {
56          final MultiValuedMap<K, V> base = new ArrayListValuedHashMap<>();
57          base.put((K) "A", (V) "1");
58          base.put((K) "B", (V) "2");
59          base.put((K) "C", (V) "3");
60  
61          final MultiValuedMap<K, V> trans = TransformedMultiValuedMap
62                  .transformingMap(
63                          base,
64                          null,
65                          (Transformer<? super V, ? extends V>) TransformedCollectionTest.STRING_TO_INTEGER_TRANSFORMER);
66          assertEquals(3, trans.size());
67          assertTrue(trans.get((K) "A").contains("1"));
68          assertTrue(trans.get((K) "B").contains("2"));
69          assertTrue(trans.get((K) "C").contains("3"));
70          trans.put((K) "D", (V) "4");
71          assertTrue(trans.get((K) "D").contains(Integer.valueOf(4)));
72      }
73  
74      @Test
75      @SuppressWarnings("unchecked")
76      public void testFactory_decorateTransform() {
77          final MultiValuedMap<K, V> base = new ArrayListValuedHashMap<>();
78          base.put((K) "A", (V) "1");
79          base.put((K) "B", (V) "2");
80          base.put((K) "C", (V) "3");
81  
82          final MultiValuedMap<K, V> trans = TransformedMultiValuedMap
83                  .transformedMap(
84                          base,
85                          null,
86                          (Transformer<? super V, ? extends V>) TransformedCollectionTest.STRING_TO_INTEGER_TRANSFORMER);
87          assertEquals(3, trans.size());
88          assertTrue(trans.get((K) "A").contains(Integer.valueOf(1)));
89          assertTrue(trans.get((K) "B").contains(Integer.valueOf(2)));
90          assertTrue(trans.get((K) "C").contains(Integer.valueOf(3)));
91          trans.put((K) "D", (V) "4");
92          assertTrue(trans.get((K) "D").contains(Integer.valueOf(4)));
93  
94          final MultiValuedMap<K, V> baseMap = new ArrayListValuedHashMap<>();
95          final MultiValuedMap<K, V> transMap = TransformedMultiValuedMap
96                  .transformedMap(
97                          baseMap,
98                          null,
99                          (Transformer<? super V, ? extends V>) TransformedCollectionTest.STRING_TO_INTEGER_TRANSFORMER);
100         assertEquals(0, transMap.size());
101         transMap.put((K) "D", (V) "4");
102         assertEquals(1, transMap.size());
103         assertTrue(transMap.get((K) "D").contains(Integer.valueOf(4)));
104     }
105 
106     @Test
107     @SuppressWarnings("unchecked")
108     public void testKeyTransformedMap() {
109         final Object[] els = { "1", "3", "5", "7", "2", "4", "6" };
110 
111         final MultiValuedMap<K, V> map = TransformedMultiValuedMap.transformingMap(
112                 new ArrayListValuedHashMap<>(),
113                 (Transformer<? super K, ? extends K>) TransformedCollectionTest.STRING_TO_INTEGER_TRANSFORMER,
114                 null);
115         assertEquals(0, map.size());
116         for (int i = 0; i < els.length; i++) {
117             map.put((K) els[i], (V) els[i]);
118             assertEquals(i + 1, map.size());
119             assertTrue(map.containsKey(Integer.valueOf((String) els[i])));
120             assertFalse(map.containsKey(els[i]));
121             assertTrue(map.containsValue(els[i]));
122             assertTrue(map.get((K) Integer.valueOf((String) els[i])).contains(els[i]));
123         }
124 
125         final Collection<V> coll = map.remove(els[0]);
126         assertNotNull(coll);
127         assertEquals(0, coll.size());
128         assertTrue(map.remove(Integer.valueOf((String) els[0])).contains(els[0]));
129     }
130 
131     @Test
132     @SuppressWarnings("unchecked")
133     public void testValueTransformedMap() {
134         final Object[] els = { "1", "3", "5", "7", "2", "4", "6" };
135 
136         final MultiValuedMap<K, V> map = TransformedMultiValuedMap.transformingMap(
137                 new ArrayListValuedHashMap<>(), null,
138                 (Transformer<? super V, ? extends V>) TransformedCollectionTest.STRING_TO_INTEGER_TRANSFORMER);
139         assertEquals(0, map.size());
140         for (int i = 0; i < els.length; i++) {
141             map.put((K) els[i], (V) els[i]);
142             assertEquals(i + 1, map.size());
143             assertTrue(map.containsValue(Integer.valueOf((String) els[i])));
144             assertFalse(map.containsValue(els[i]));
145             assertTrue(map.containsKey(els[i]));
146             assertTrue(map.get((K) els[i]).contains(Integer.valueOf((String) els[i])));
147         }
148         assertTrue(map.remove(els[0]).contains(Integer.valueOf((String) els[0])));
149     }
150 
151 //    public void testCreate() throws Exception {
152 //        writeExternalFormToDisk((java.io.Serializable) makeObject(),
153 //                "src/test/resources/data/test/TransformedMultiValuedMap.emptyCollection.version4.1.obj");
154 //        writeExternalFormToDisk((java.io.Serializable) makeFullMap(),
155 //                "src/test/resources/data/test/TransformedMultiValuedMap.fullCollection.version4.1.obj");
156 //    }
157 
158 }