/*
* Copyright 2015 Goldman Sachs.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.gs.collections.impl.multimap;
import com.gs.collections.api.block.HashingStrategy;
import com.gs.collections.api.list.ImmutableList;
import com.gs.collections.api.multimap.bag.MutableBagMultimap;
import com.gs.collections.api.multimap.set.MutableSetMultimap;
import com.gs.collections.api.set.ImmutableSet;
import com.gs.collections.api.set.MutableSet;
import com.gs.collections.api.tuple.Pair;
import com.gs.collections.impl.block.factory.HashingStrategies;
import com.gs.collections.impl.factory.Lists;
import com.gs.collections.impl.factory.Sets;
import com.gs.collections.impl.map.mutable.UnifiedMap;
import com.gs.collections.impl.multimap.bag.HashBagMultimap;
import com.gs.collections.impl.multimap.set.AbstractMutableSetMultimapTestCase;
import com.gs.collections.impl.multimap.set.UnifiedSetMultimap;
import com.gs.collections.impl.multimap.set.strategy.UnifiedSetWithHashingStrategyMultimap;
import com.gs.collections.impl.set.mutable.UnifiedSet;
import com.gs.collections.impl.set.strategy.mutable.UnifiedSetWithHashingStrategy;
import com.gs.collections.impl.test.SerializeTestHelper;
import com.gs.collections.impl.test.Verify;
import com.gs.collections.impl.test.domain.Person;
import com.gs.collections.impl.tuple.Tuples;
import com.gs.collections.impl.utility.Iterate;
import org.junit.Assert;
import org.junit.Test;
/**
* Test of {@link UnifiedSetWithHashingStrategyMultimap}.
*/
public class UnifiedSetWithHashingStrategyMultimapTest extends AbstractMutableSetMultimapTestCase
{
private static final HashingStrategy<Person> LAST_NAME_STRATEGY = HashingStrategies.fromFunction(Person.TO_LAST);
private static final HashingStrategy<Person> FIRST_NAME_STRATEGY = HashingStrategies.fromFunction(Person.TO_FIRST);
private static final Person JOHNSMITH = new Person("John", "Smith");
private static final Person JANESMITH = new Person("Jane", "Smith");
private static final Person JOHNDOE = new Person("John", "Doe");
private static final Person JANEDOE = new Person("Jane", "Doe");
private static final ImmutableList<Person> PEOPLE = Lists.immutable.of(JOHNSMITH, JANESMITH, JOHNDOE, JANEDOE);
private static final ImmutableSet<Person> LAST_NAME_HASHED_SET = Sets.immutable.of(JOHNSMITH, JOHNDOE);
@Override
public <K, V> UnifiedSetWithHashingStrategyMultimap<K, V> newMultimap()
{
return UnifiedSetWithHashingStrategyMultimap.newMultimap(HashingStrategies.<V>defaultStrategy());
}
@Override
public <K, V> UnifiedSetWithHashingStrategyMultimap<K, V> newMultimapWithKeyValue(K key, V value)
{
UnifiedSetWithHashingStrategyMultimap<K, V> mutableMultimap = this.newMultimap();
mutableMultimap.put(key, value);
return mutableMultimap;
}
@Override
public <K, V> UnifiedSetWithHashingStrategyMultimap<K, V> newMultimapWithKeysValues(K key1, V value1, K key2, V value2)
{
UnifiedSetWithHashingStrategyMultimap<K, V> mutableMultimap = this.newMultimap();
mutableMultimap.put(key1, value1);
mutableMultimap.put(key2, value2);
return mutableMultimap;
}
@Override
public <K, V> UnifiedSetWithHashingStrategyMultimap<K, V> newMultimapWithKeysValues(
K key1, V value1,
K key2, V value2,
K key3, V value3)
{
UnifiedSetWithHashingStrategyMultimap<K, V> mutableMultimap = this.newMultimap();
mutableMultimap.put(key1, value1);
mutableMultimap.put(key2, value2);
mutableMultimap.put(key3, value3);
return mutableMultimap;
}
@Override
public <K, V> UnifiedSetWithHashingStrategyMultimap<K, V> newMultimapWithKeysValues(
K key1, V value1,
K key2, V value2,
K key3, V value3,
K key4, V value4)
{
UnifiedSetWithHashingStrategyMultimap<K, V> mutableMultimap = this.newMultimap();
mutableMultimap.put(key1, value1);
mutableMultimap.put(key2, value2);
mutableMultimap.put(key3, value3);
mutableMultimap.put(key4, value4);
return mutableMultimap;
}
@Override
protected final <K, V> UnifiedSetWithHashingStrategyMultimap<K, V> newMultimap(Pair<K, V>... pairs)
{
return UnifiedSetWithHashingStrategyMultimap.newMultimap(HashingStrategies.<V>defaultStrategy(), pairs);
}
@Override
protected <K, V> UnifiedSetWithHashingStrategyMultimap<K, V> newMultimapFromPairs(Iterable<Pair<K, V>> inputIterable)
{
return UnifiedSetWithHashingStrategyMultimap.newMultimap(HashingStrategies.<V>defaultStrategy(), inputIterable);
}
@Override
protected final <V> MutableSet<V> createCollection(V... args)
{
return UnifiedSetWithHashingStrategy.newSetWith(HashingStrategies.<V>defaultStrategy(), args);
}
@Override
@Test
public void testClear()
{
UnifiedSetWithHashingStrategyMultimap<Integer, String> map = this.newMultimapWithKeysValues(1, "1", 1, "One", 2, "2", 2, "Two");
map.clear();
Verify.assertEmpty(map);
}
@Test
public void testHashingStrategyConstructors()
{
UnifiedSetWithHashingStrategyMultimap<Integer, Person> peopleMap = UnifiedSetWithHashingStrategyMultimap.newMultimap(HashingStrategies.<Person>defaultStrategy());
UnifiedSetWithHashingStrategyMultimap<Integer, Person> lastNameMap = UnifiedSetWithHashingStrategyMultimap.newMultimap(LAST_NAME_STRATEGY);
UnifiedSetWithHashingStrategyMultimap<Integer, Person> firstNameMap = UnifiedSetWithHashingStrategyMultimap.newMultimap(FIRST_NAME_STRATEGY);
peopleMap.putAll(1, PEOPLE);
lastNameMap.putAll(1, PEOPLE);
firstNameMap.putAll(1, PEOPLE);
Verify.assertSetsEqual(PEOPLE.toSet(), peopleMap.get(1));
Verify.assertSetsEqual(UnifiedSet.newSetWith(JOHNSMITH, JANESMITH), firstNameMap.get(1));
Verify.assertSetsEqual(LAST_NAME_HASHED_SET.castToSet(), lastNameMap.get(1));
}
@Test
public void testMultimapConstructor()
{
MutableSetMultimap<Integer, Person> map = UnifiedSetMultimap.newMultimap();
UnifiedSetWithHashingStrategyMultimap<Integer, Person> map2 = UnifiedSetWithHashingStrategyMultimap.newMultimap(LAST_NAME_STRATEGY);
for (Person person : PEOPLE)
{
map.put(1, person);
map2.put(1, person);
}
UnifiedSetWithHashingStrategyMultimap<Integer, Person> hashingMap =
UnifiedSetWithHashingStrategyMultimap.newMultimap(LAST_NAME_STRATEGY, map);
UnifiedSetWithHashingStrategyMultimap<Integer, Person> hashingMap2 = UnifiedSetWithHashingStrategyMultimap.newMultimap(map2);
Verify.assertSetsEqual(hashingMap.get(1), hashingMap2.get(1));
Assert.assertSame(hashingMap.getValueHashingStrategy(), hashingMap2.getValueHashingStrategy());
}
@Test
public void testNewEmpty()
{
UnifiedMap<Integer, MutableSet<Person>> expected = UnifiedMap.newMap();
UnifiedSetWithHashingStrategyMultimap<Integer, Person> lastNameMap = UnifiedSetWithHashingStrategyMultimap.newMultimap(LAST_NAME_STRATEGY);
UnifiedSetWithHashingStrategyMultimap<Integer, Person> newEmptyMap = lastNameMap.newEmpty();
for (int i = 1; i < 4; ++i)
{
expected.put(i, LAST_NAME_HASHED_SET.toSet());
lastNameMap.putAll(i, PEOPLE);
newEmptyMap.putAll(i, PEOPLE);
}
Verify.assertMapsEqual(expected, lastNameMap.getMap());
Verify.assertMapsEqual(expected, newEmptyMap.getMap());
Assert.assertSame(LAST_NAME_STRATEGY, lastNameMap.getValueHashingStrategy());
Assert.assertSame(LAST_NAME_STRATEGY, newEmptyMap.getValueHashingStrategy());
}
@Override
@Test
public void serialization()
{
super.serialization();
UnifiedSetWithHashingStrategyMultimap<Object, Person> lastNameMap = UnifiedSetWithHashingStrategyMultimap.newMultimap(LAST_NAME_STRATEGY);
lastNameMap.putAll(1, PEOPLE);
lastNameMap.putAll(2, PEOPLE.toList().reverseThis());
Verify.assertPostSerializedEqualsAndHashCode(lastNameMap);
UnifiedSetWithHashingStrategyMultimap<Object, Person> deserialized = SerializeTestHelper.serializeDeserialize(lastNameMap);
Verify.assertSetsEqual(LAST_NAME_HASHED_SET.castToSet(), deserialized.get(1));
Verify.assertSetsEqual(UnifiedSet.newSetWith(JANEDOE, JANESMITH), deserialized.get(2));
deserialized.putAll(3, PEOPLE);
Verify.assertSetsEqual(LAST_NAME_HASHED_SET.castToSet(), deserialized.get(3));
}
@Override
@Test
public void selectKeysValues()
{
UnifiedSetWithHashingStrategyMultimap<Integer, Person> multimap = UnifiedSetWithHashingStrategyMultimap.newMultimap(FIRST_NAME_STRATEGY);
multimap.put(1, JOHNSMITH);
multimap.put(1, JANESMITH);
multimap.put(1, JOHNDOE);
multimap.put(1, JANEDOE);
multimap.put(2, JOHNSMITH);
multimap.put(2, JANESMITH);
multimap.put(2, JOHNDOE);
multimap.put(2, JANEDOE);
UnifiedSetWithHashingStrategyMultimap<Integer, Person> selectedMultimap = multimap.selectKeysValues((key, value) -> (key % 2 == 0) && "Jane".equals(value.getFirstName()));
UnifiedSetWithHashingStrategyMultimap<Integer, Person> expectedMultimap = UnifiedSetWithHashingStrategyMultimap.newMultimap(FIRST_NAME_STRATEGY);
expectedMultimap.put(2, JANESMITH);
expectedMultimap.put(2, JANEDOE);
Assert.assertEquals(expectedMultimap, selectedMultimap);
Verify.assertMapsEqual(expectedMultimap.getMap(), selectedMultimap.getMap());
Assert.assertSame(expectedMultimap.getValueHashingStrategy(), selectedMultimap.getValueHashingStrategy());
}
@Override
@Test
public void rejectKeysValues()
{
UnifiedSetWithHashingStrategyMultimap<Integer, Person> multimap = UnifiedSetWithHashingStrategyMultimap.newMultimap(FIRST_NAME_STRATEGY);
multimap.put(1, JOHNSMITH);
multimap.put(1, JANESMITH);
multimap.put(1, JOHNDOE);
multimap.put(1, JANEDOE);
multimap.put(2, JOHNSMITH);
multimap.put(2, JANESMITH);
multimap.put(2, JOHNDOE);
multimap.put(2, JANEDOE);
UnifiedSetWithHashingStrategyMultimap<Integer, Person> rejectedMultimap = multimap.rejectKeysValues((key, value) -> (key % 2 == 0) || "Jane".equals(value.getFirstName()));
UnifiedSetWithHashingStrategyMultimap<Integer, Person> expectedMultimap = UnifiedSetWithHashingStrategyMultimap.newMultimap(FIRST_NAME_STRATEGY);
expectedMultimap.put(1, JOHNSMITH);
expectedMultimap.put(1, JOHNDOE);
Assert.assertEquals(expectedMultimap, rejectedMultimap);
Verify.assertMapsEqual(expectedMultimap.getMap(), rejectedMultimap.getMap());
Assert.assertSame(expectedMultimap.getValueHashingStrategy(), rejectedMultimap.getValueHashingStrategy());
}
@Override
@Test
public void selectKeysMultiValues()
{
UnifiedSetWithHashingStrategyMultimap<Integer, Person> multimap = UnifiedSetWithHashingStrategyMultimap.newMultimap(FIRST_NAME_STRATEGY);
multimap.put(1, JOHNSMITH);
multimap.put(1, JANESMITH);
multimap.put(1, JOHNDOE);
multimap.put(1, JANEDOE);
multimap.put(2, JANESMITH);
multimap.put(2, JOHNDOE);
multimap.put(2, JANEDOE);
multimap.put(3, JANESMITH);
multimap.put(3, JOHNDOE);
multimap.put(3, JANEDOE);
multimap.put(4, JOHNSMITH);
multimap.put(4, JOHNDOE);
UnifiedSetWithHashingStrategyMultimap<Integer, Person> selectedMultimap = multimap.selectKeysMultiValues((key, values) -> key % 2 == 0 && Iterate.contains(values, JANEDOE));
UnifiedSetWithHashingStrategyMultimap<Integer, Person> expectedMultimap = UnifiedSetWithHashingStrategyMultimap.newMultimap(FIRST_NAME_STRATEGY);
expectedMultimap.put(2, JANESMITH);
expectedMultimap.put(2, JANEDOE);
expectedMultimap.put(2, JOHNDOE);
Assert.assertEquals(expectedMultimap, selectedMultimap);
Verify.assertMapsEqual(expectedMultimap.getMap(), selectedMultimap.getMap());
Assert.assertSame(expectedMultimap.getValueHashingStrategy(), selectedMultimap.getValueHashingStrategy());
}
@Override
@Test
public void rejectKeysMultiValues()
{
UnifiedSetWithHashingStrategyMultimap<Integer, Person> multimap = UnifiedSetWithHashingStrategyMultimap.newMultimap(FIRST_NAME_STRATEGY);
multimap.put(1, JANESMITH);
multimap.put(1, JOHNDOE);
multimap.put(1, JANEDOE);
multimap.put(1, JANEDOE);
multimap.put(2, JANESMITH);
multimap.put(2, JOHNSMITH);
multimap.put(2, JOHNDOE);
multimap.put(2, JANEDOE);
multimap.put(3, JOHNSMITH);
multimap.put(3, JOHNDOE);
multimap.put(4, JOHNSMITH);
multimap.put(4, JOHNDOE);
UnifiedSetWithHashingStrategyMultimap<Integer, Person> rejectedMultimap = multimap.rejectKeysMultiValues((key, values) -> key % 2 == 0 || Iterate.contains(values, JANEDOE));
UnifiedSetWithHashingStrategyMultimap<Integer, Person> expectedMultimap = UnifiedSetWithHashingStrategyMultimap.newMultimap(FIRST_NAME_STRATEGY);
expectedMultimap.put(3, JOHNSMITH);
expectedMultimap.put(3, JOHNDOE);
Assert.assertEquals(expectedMultimap, rejectedMultimap);
Verify.assertMapsEqual(expectedMultimap.getMap(), rejectedMultimap.getMap());
Assert.assertSame(expectedMultimap.getValueHashingStrategy(), rejectedMultimap.getValueHashingStrategy());
}
@Override
@Test
public void collectKeysValues()
{
super.collectKeysValues();
UnifiedSetWithHashingStrategyMultimap<Integer, Person> multimap = UnifiedSetWithHashingStrategyMultimap.newMultimap(FIRST_NAME_STRATEGY);
multimap.put(1, JANESMITH);
multimap.put(1, JOHNDOE);
multimap.put(1, JANEDOE);
multimap.put(1, JANEDOE);
multimap.put(2, JANESMITH);
multimap.put(2, JOHNSMITH);
multimap.put(2, JOHNDOE);
multimap.put(2, JANEDOE);
MutableBagMultimap<String, Integer> collectedMultimap1 = multimap.collectKeysValues((key, value) -> Tuples.pair(key.toString(), key * value.getAge()));
MutableBagMultimap<String, Integer> expectedMultimap1 = HashBagMultimap.newMultimap();
expectedMultimap1.put("1", 100);
expectedMultimap1.put("1", 100);
expectedMultimap1.put("2", 200);
expectedMultimap1.put("2", 200);
Assert.assertEquals(expectedMultimap1, collectedMultimap1);
MutableBagMultimap<String, Integer> collectedMultimap2 = multimap.collectKeysValues((key, value) -> Tuples.pair("1", key * value.getAge()));
MutableBagMultimap<String, Integer> expectedMultimap2 = HashBagMultimap.newMultimap();
expectedMultimap2.put("1", 100);
expectedMultimap2.put("1", 100);
expectedMultimap2.put("1", 200);
expectedMultimap2.put("1", 200);
Assert.assertEquals(expectedMultimap2, collectedMultimap2);
}
@Override
@Test
public void collectValues()
{
UnifiedSetWithHashingStrategyMultimap<Integer, Person> multimap = UnifiedSetWithHashingStrategyMultimap.newMultimap(FIRST_NAME_STRATEGY);
multimap.put(1, JANESMITH);
multimap.put(1, JOHNDOE);
multimap.put(1, JANEDOE);
multimap.put(1, JANEDOE);
multimap.put(2, JANESMITH);
multimap.put(2, JOHNSMITH);
multimap.put(2, JOHNDOE);
multimap.put(2, JANEDOE);
MutableBagMultimap<Integer, Integer> collectedMultimap = multimap.collectValues(Person::getAge);
MutableBagMultimap<Integer, Integer> expectedMultimap = HashBagMultimap.newMultimap();
expectedMultimap.put(1, 100);
expectedMultimap.put(2, 100);
Assert.assertEquals(expectedMultimap, collectedMultimap);
}
}