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