2
* Copyright 2014 Goldman Sachs.
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
8
* http://www.apache.org/licenses/LICENSE-2.0
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
17
package com.gs.collections.impl.map.immutable;
19
import java.util.Collections;
20
import java.util.HashMap;
21
import java.util.Iterator;
22
import java.util.List;
25
import com.gs.collections.api.list.MutableList;
26
import com.gs.collections.api.map.ImmutableMap;
27
import com.gs.collections.api.map.MutableMap;
28
import com.gs.collections.api.set.MutableSet;
29
import com.gs.collections.api.tuple.Pair;
30
import com.gs.collections.impl.block.factory.Functions;
31
import com.gs.collections.impl.block.function.PassThruFunction0;
32
import com.gs.collections.impl.block.procedure.CollectionAddProcedure;
33
import com.gs.collections.impl.factory.Lists;
34
import com.gs.collections.impl.factory.Maps;
35
import com.gs.collections.impl.list.Interval;
36
import com.gs.collections.impl.list.fixed.ArrayAdapter;
37
import com.gs.collections.impl.map.mutable.UnifiedMap;
38
import com.gs.collections.impl.set.mutable.UnifiedSet;
39
import com.gs.collections.impl.test.Verify;
40
import com.gs.collections.impl.tuple.Tuples;
41
import org.junit.Assert;
42
import org.junit.Test;
45
* JUnit test for {@link ImmutableMap}.
47
public abstract class ImmutableMapTestCase
50
* @return A map containing 1 => "1", 2 => "2", etc.
52
protected abstract ImmutableMap<Integer, String> classUnderTest();
55
* @return Size (and max key) of {@link #classUnderTest()}.
57
protected abstract int size();
60
public void castToMap()
62
ImmutableMap<Integer, String> immutable = this.classUnderTest();
63
Map<Integer, String> map = immutable.castToMap();
64
Assert.assertSame(immutable, map);
65
Assert.assertEquals(immutable, new HashMap<Integer, String>(map));
71
ImmutableMap<Integer, String> immutable = this.classUnderTest();
72
MutableMap<Integer, String> map = immutable.toMap();
73
Assert.assertNotSame(immutable, map);
74
Assert.assertEquals(immutable, map);
78
public void equalsAndHashCode()
80
MutableMap<Integer, String> expected = this.equalUnifiedMap();
81
Verify.assertEqualsAndHashCode(expected, this.classUnderTest());
82
Verify.assertPostSerializedEqualsAndHashCode(this.classUnderTest());
86
public void forEachKeyValue()
88
MutableSet<Integer> actualKeys = UnifiedSet.newSet();
89
MutableSet<String> actualValues = UnifiedSet.newSet();
91
this.classUnderTest().forEachKeyValue((key, value) -> {
93
actualValues.add(value);
96
MutableSet<Integer> expectedKeys = this.expectedKeys();
97
Assert.assertEquals(expectedKeys, actualKeys);
99
MutableSet<String> expectedValues = expectedKeys.collect(String::valueOf);
100
Assert.assertEquals(expectedValues, actualValues);
104
public void forEachValue()
106
MutableSet<String> actualValues = UnifiedSet.newSet();
107
this.classUnderTest().forEachValue(CollectionAddProcedure.on(actualValues));
108
Assert.assertEquals(this.expectedValues(), actualValues);
112
public void forEach()
114
MutableSet<String> actualValues = UnifiedSet.newSet();
115
this.classUnderTest().forEach(CollectionAddProcedure.on(actualValues));
116
Assert.assertEquals(this.expectedValues(), actualValues);
120
public void flipUniqueValues()
122
ImmutableMap<Integer, String> immutableMap = this.classUnderTest();
123
Assert.assertEquals(Interval.oneTo(this.size()).toMap(String::valueOf, Functions.getIntegerPassThru()),
124
immutableMap.flipUniqueValues());
128
public void iterator()
130
MutableSet<String> actualValues = UnifiedSet.newSet();
131
for (String eachValue : this.classUnderTest())
133
actualValues.add(eachValue);
135
Assert.assertEquals(this.expectedValues(), actualValues);
139
public void iteratorThrows()
141
Verify.assertThrows(UnsupportedOperationException.class, () -> {
142
Iterator<String> iterator = this.classUnderTest().iterator();
148
public void forEachKey()
150
MutableSet<Integer> actualKeys = UnifiedSet.newSet();
151
this.classUnderTest().forEachKey(CollectionAddProcedure.on(actualKeys));
152
Assert.assertEquals(this.expectedKeys(), actualKeys);
158
Integer absentKey = this.size() + 1;
159
String absentValue = String.valueOf(absentKey);
161
// Absent key behavior
162
ImmutableMap<Integer, String> classUnderTest = this.classUnderTest();
163
Assert.assertNull(classUnderTest.get(absentKey));
164
Assert.assertFalse(classUnderTest.containsValue(absentValue));
166
// Present key behavior
167
Assert.assertEquals("1", classUnderTest.get(1));
170
Assert.assertEquals(this.equalUnifiedMap(), classUnderTest);
174
public void getIfAbsent_function()
176
Integer absentKey = this.size() + 1;
177
String absentValue = String.valueOf(absentKey);
179
// Absent key behavior
180
ImmutableMap<Integer, String> classUnderTest = this.classUnderTest();
181
Assert.assertEquals(absentValue, classUnderTest.getIfAbsent(absentKey, new PassThruFunction0<String>(absentValue)));
183
// Present key behavior
184
Assert.assertEquals("1", classUnderTest.getIfAbsent(1, new PassThruFunction0<String>(absentValue)));
187
Assert.assertEquals(this.equalUnifiedMap(), classUnderTest);
191
public void getIfAbsent()
193
Integer absentKey = this.size() + 1;
194
String absentValue = String.valueOf(absentKey);
196
// Absent key behavior
197
ImmutableMap<Integer, String> classUnderTest = this.classUnderTest();
198
Assert.assertEquals(absentValue, classUnderTest.getIfAbsentValue(absentKey, absentValue));
200
// Present key behavior
201
Assert.assertEquals("1", classUnderTest.getIfAbsentValue(1, absentValue));
204
Assert.assertEquals(this.equalUnifiedMap(), classUnderTest);
208
public void getIfAbsentWith()
210
Integer absentKey = this.size() + 1;
211
String absentValue = String.valueOf(absentKey);
213
// Absent key behavior
214
ImmutableMap<Integer, String> classUnderTest = this.classUnderTest();
215
Assert.assertEquals(absentValue, classUnderTest.getIfAbsentWith(absentKey, String::valueOf, absentValue));
217
// Present key behavior
218
Assert.assertEquals("1", classUnderTest.getIfAbsentWith(1, String::valueOf, absentValue));
221
Assert.assertEquals(this.equalUnifiedMap(), classUnderTest);
225
public void ifPresentApply()
227
Integer absentKey = this.size() + 1;
229
ImmutableMap<Integer, String> classUnderTest = this.classUnderTest();
230
Assert.assertNull(classUnderTest.ifPresentApply(absentKey, Functions.<String>getPassThru()));
231
Assert.assertEquals("1", classUnderTest.ifPresentApply(1, Functions.<String>getPassThru()));
235
public void notEmpty()
237
Assert.assertTrue(this.classUnderTest().notEmpty());
241
public void forEachWith()
243
Object actualParameter = new Object();
245
MutableSet<String> actualValues = UnifiedSet.newSet();
246
MutableList<Object> actualParameters = Lists.mutable.of();
248
this.classUnderTest().forEachWith((eachValue, parameter) -> {
249
actualValues.add(eachValue);
250
actualParameters.add(parameter);
253
Assert.assertEquals(this.expectedKeys().collect(String::valueOf), actualValues);
254
Assert.assertEquals(Collections.nCopies(this.size(), actualParameter), actualParameters);
258
public void forEachWithIndex()
260
MutableSet<String> actualValues = UnifiedSet.newSet();
261
MutableList<Integer> actualIndices = Lists.mutable.of();
263
this.classUnderTest().forEachWithIndex((eachValue, index) -> {
264
actualValues.add(eachValue);
265
actualIndices.add(index);
268
Assert.assertEquals(this.expectedKeys().collect(String::valueOf), actualValues);
269
Assert.assertEquals(this.expectedIndices(), actualIndices);
273
public void keyValuesView()
275
MutableSet<Integer> actualKeys = UnifiedSet.newSet();
276
MutableSet<String> actualValues = UnifiedSet.newSet();
278
for (Pair<Integer, String> entry : this.classUnderTest().keyValuesView())
280
actualKeys.add(entry.getOne());
281
actualValues.add(entry.getTwo());
284
MutableSet<Integer> expectedKeys = this.expectedKeys();
285
Assert.assertEquals(expectedKeys, actualKeys);
287
MutableSet<String> expectedValues = expectedKeys.collect(String::valueOf);
288
Assert.assertEquals(expectedValues, actualValues);
292
public void valuesView()
294
MutableSet<String> actualValues = UnifiedSet.newSet();
295
for (String eachValue : this.classUnderTest().valuesView())
297
actualValues.add(eachValue);
299
MutableSet<String> expectedValues = this.expectedValues();
300
Assert.assertEquals(expectedValues, actualValues);
304
public void keysView()
306
MutableSet<Integer> actualKeys = UnifiedSet.newSet();
307
for (Integer eachKey : this.classUnderTest().keysView())
309
actualKeys.add(eachKey);
311
Assert.assertEquals(this.expectedKeys(), actualKeys);
317
Verify.assertThrows(UnsupportedOperationException.class, () -> ((Map<Integer, String>) this.classUnderTest()).putAll(null));
323
Verify.assertThrows(UnsupportedOperationException.class, () -> ((Map<Integer, String>) this.classUnderTest()).clear());
327
public void entrySet()
329
ImmutableMap<Integer, String> immutable = this.classUnderTest();
330
Map<Integer, String> map = new HashMap<Integer, String>(immutable.castToMap());
331
Assert.assertEquals(immutable.size(), immutable.castToMap().entrySet().size());
332
Assert.assertEquals(map.entrySet(), immutable.castToMap().entrySet());
336
public void newWithKeyValue()
338
ImmutableMap<Integer, String> immutable = this.classUnderTest();
339
ImmutableMap<Integer, String> immutable2 = immutable.newWithKeyValue(Integer.MAX_VALUE, Integer.toString(Integer.MAX_VALUE));
340
Verify.assertSize(immutable.size() + 1, immutable2);
344
public void newWithAllKeyValuePairs()
346
ImmutableMap<Integer, String> immutable = this.classUnderTest();
347
ImmutableMap<Integer, String> immutable2 = immutable.newWithAllKeyValueArguments(
348
Tuples.pair(Integer.MAX_VALUE, Integer.toString(Integer.MAX_VALUE)),
349
Tuples.pair(Integer.MIN_VALUE, Integer.toString(Integer.MIN_VALUE)));
350
Verify.assertSize(immutable.size() + 2, immutable2);
354
public void newWithAllKeyValues()
356
ImmutableMap<Integer, String> immutable = this.classUnderTest();
357
ImmutableMap<Integer, String> immutable2 = immutable.newWithAllKeyValues(ArrayAdapter.newArrayWith(
358
Tuples.pair(Integer.MAX_VALUE, Integer.toString(Integer.MAX_VALUE)),
359
Tuples.pair(Integer.MIN_VALUE, Integer.toString(Integer.MIN_VALUE))));
360
Verify.assertSize(immutable.size() + 2, immutable2);
364
public void newWithoutKey()
366
ImmutableMap<Integer, String> immutable = this.classUnderTest();
367
ImmutableMap<Integer, String> immutable3 = immutable.newWithoutKey(Integer.MAX_VALUE);
368
Verify.assertSize(immutable.size(), immutable3);
372
public void newWithoutKeys()
374
ImmutableMap<Integer, String> immutable = this.classUnderTest();
375
ImmutableMap<Integer, String> immutable2 = immutable.newWithoutAllKeys(immutable.keysView());
376
ImmutableMap<Integer, String> immutable3 = immutable.newWithoutAllKeys(Lists.immutable.<Integer>of());
377
Assert.assertEquals(immutable, immutable3);
378
Assert.assertEquals(Maps.immutable.of(), immutable2);
384
Verify.assertThrows(UnsupportedOperationException.class, () -> {
385
((Map<Integer, String>) this.classUnderTest()).put(null, null);
392
Verify.assertThrows(UnsupportedOperationException.class, () -> {
393
((Map<Integer, String>) this.classUnderTest()).remove(null);
398
public abstract void testToString();
400
protected MutableMap<Integer, String> equalUnifiedMap()
402
MutableMap<Integer, String> expected = UnifiedMap.newMap();
403
for (int i = 1; i <= this.size(); i++)
405
expected.put(i, String.valueOf(i));
410
private MutableSet<String> expectedValues()
412
return this.expectedKeys().collect(String::valueOf);
415
private MutableSet<Integer> expectedKeys()
417
if (this.size() == 0)
419
return UnifiedSet.newSet();
421
return Interval.oneTo(this.size()).toSet();
424
private List<Integer> expectedIndices()
426
if (this.size() == 0)
428
return Lists.mutable.of();
430
return Interval.zeroTo(this.size() - 1);