/*******************************************************************************
* Copyright 2012 Analog Devices, Inc.
*
* 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.analog.lyric.collect.tests;
import static org.junit.Assert.*;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTester<K,V>
{
protected SetTester<Map.Entry<K,V>> _entrySetTester;
protected SetTester<K> _keySetTester;
protected CollectionTester<V> _valueCollectionTester;
public MapTester(
SetTester<Map.Entry<K,V>> entrySetTester,
SetTester<K> keySetTester,
CollectionTester<V> valueCollectionTester)
{
this._entrySetTester = entrySetTester;
this._keySetTester = keySetTester;
this._valueCollectionTester = valueCollectionTester;
}
public MapTester()
{
this(new SetTester<Map.Entry<K, V>>(),
new SetTester<K>(),
new CollectionTester<V>());
}
public void validateMap(Map<K,V> map)
{
assertTrue(map.size() >= 0);
assertEquals(map.size() == 0, map.isEmpty());
assertTrue(map.equals(map));
Set<K> keySet = map.keySet();
this._keySetTester.validateSet(keySet);
assertEquals(keySet.size(), map.size());
assertFalse(map.equals(keySet));
Set<Map.Entry<K,V>> entrySet = map.entrySet();
this._entrySetTester .validateSet(entrySet);
assertEquals(entrySet.size(), map.size());
Collection<V> values = map.values();
this._valueCollectionTester.validateCollection(values);
assertEquals(values.size(), map.size());
int expectedHash = 0;
K key = null;
V value = null;
for (Map.Entry<K, V> entry : entrySet)
{
key = entry.getKey();
value = entry.getValue();
assertEquals(key.hashCode() ^ value.hashCode(), entry.hashCode());
expectedHash += entry.hashCode();
assertEquals( value, map.get(key) );
assertTrue( map.containsKey(key) );
assertTrue( map.containsValue(value) );
assertTrue( keySet.contains(key) );
assertTrue( values.contains(value) );
}
assertEquals(expectedHash, map.hashCode());
HashMap<K,V> map2 = new HashMap<K,V>(map);
assertTrue(map.equals(map2));
if (!map2.isEmpty())
{
if (value != null)
{
map2.put(key, null);
assertFalse(map.equals(map2));
}
map2.remove(key);
assertFalse(map.equals(map2));
}
}
public void assertMapEquals(Map<K,V> map1, Map<K,V> map2)
{
assertEquals(map1.isEmpty(), map2.isEmpty());
assertEquals(map1.size(), map2.size());
assertTrue(map1.equals(map2));
_entrySetTester.assertSetEquals(map1.entrySet(), map2.entrySet());
_keySetTester.assertSetEquals(map1.keySet(), map2.keySet());
_valueCollectionTester.assertCollectionEquals(map1.values(), map2.values());
}
}