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