/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.commons.collections4.keyvalue;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
/**
* Test the DefaultKeyValue class.
*
* @since 3.0
* @version $Id$
*/
public class DefaultKeyValueTest<K, V> extends TestCase {
private final String key = "name";
private final String value = "duke";
//-----------------------------------------------------------------------
/**
* Make an instance of DefaultKeyValue with the default (null) key and value.
* Subclasses should override this method to return a DefaultKeyValue
* of the type being tested.
*/
protected DefaultKeyValue<K, V> makeDefaultKeyValue() {
return new DefaultKeyValue<K, V>(null, null);
}
/**
* Make an instance of DefaultKeyValue with the specified key and value.
* Subclasses should override this method to return a DefaultKeyValue
* of the type being tested.
*/
protected DefaultKeyValue<K, V> makeDefaultKeyValue(final K key, final V value) {
return new DefaultKeyValue<K, V>(key, value);
}
//-----------------------------------------------------------------------
@SuppressWarnings("unchecked")
public void testAccessorsAndMutators() {
final DefaultKeyValue<K, V> kv = makeDefaultKeyValue();
kv.setKey((K) key);
assertTrue(kv.getKey() == key);
kv.setValue((V) value);
assertTrue(kv.getValue() == value);
// check that null doesn't do anything funny
kv.setKey(null);
assertTrue(kv.getKey() == null);
kv.setValue(null);
assertTrue(kv.getValue() == null);
}
@SuppressWarnings("unchecked")
public void testSelfReferenceHandling() {
// test that #setKey and #setValue do not permit
// the KVP to contain itself (and thus cause infinite recursion
// in #hashCode and #toString)
final DefaultKeyValue<K, V> kv = makeDefaultKeyValue();
try {
kv.setKey((K) kv);
fail("Should throw an IllegalArgumentException");
} catch (final IllegalArgumentException iae) {
// expected to happen...
// check that the KVP's state has not changed
assertTrue(kv.getKey() == null && kv.getValue() == null);
}
try {
kv.setValue((V) kv);
fail("Should throw an IllegalArgumentException");
} catch (final IllegalArgumentException iae) {
// expected to happen...
// check that the KVP's state has not changed
assertTrue(kv.getKey() == null && kv.getValue() == null);
}
}
/**
* Subclasses should override this method to test their own constructors.
*/
@SuppressWarnings("unchecked")
public void testConstructors() {
// 1. test default constructor
DefaultKeyValue<K, V> kv = new DefaultKeyValue<K, V>();
assertTrue(kv.getKey() == null && kv.getValue() == null);
// 2. test key-value constructor
kv = new DefaultKeyValue<K, V>((K) key, (V) value);
assertTrue(kv.getKey() == key && kv.getValue() == value);
// 3. test copy constructor
final DefaultKeyValue<K, V> kv2 = new DefaultKeyValue<K, V>(kv);
assertTrue(kv2.getKey() == key && kv2.getValue() == value);
// test that the KVPs are independent
kv.setKey(null);
kv.setValue(null);
assertTrue(kv2.getKey() == key && kv2.getValue() == value);
// 4. test Map.Entry constructor
final Map<K, V> map = new HashMap<K, V>();
map.put((K) key, (V) value);
final Map.Entry<K, V> entry = map.entrySet().iterator().next();
kv = new DefaultKeyValue<K, V>(entry);
assertTrue(kv.getKey() == key && kv.getValue() == value);
// test that the KVP is independent of the Map.Entry
entry.setValue(null);
assertTrue(kv.getValue() == value);
}
@SuppressWarnings("unchecked")
public void testEqualsAndHashCode() {
// 1. test with object data
DefaultKeyValue<K, V> kv = makeDefaultKeyValue((K) key, (V) value);
DefaultKeyValue<K, V> kv2 = makeDefaultKeyValue((K) key, (V) value);
assertTrue(kv.equals(kv));
assertTrue(kv.equals(kv2));
assertTrue(kv.hashCode() == kv2.hashCode());
// 2. test with nulls
kv = makeDefaultKeyValue(null, null);
kv2 = makeDefaultKeyValue(null, null);
assertTrue(kv.equals(kv));
assertTrue(kv.equals(kv2));
assertTrue(kv.hashCode() == kv2.hashCode());
}
@SuppressWarnings("unchecked")
public void testToString() {
DefaultKeyValue<K, V> kv = makeDefaultKeyValue((K) key, (V) value);
assertTrue(kv.toString().equals(kv.getKey() + "=" + kv.getValue()));
// test with nulls
kv = makeDefaultKeyValue(null, null);
assertTrue(kv.toString().equals(kv.getKey() + "=" + kv.getValue()));
}
@SuppressWarnings("unchecked")
public void testToMapEntry() {
final DefaultKeyValue<K, V> kv = makeDefaultKeyValue((K) key, (V) value);
final Map<K, V> map = new HashMap<K, V>();
map.put(kv.getKey(), kv.getValue());
final Map.Entry<K, V> entry = map.entrySet().iterator().next();
assertTrue(entry.equals(kv.toMapEntry()));
assertTrue(entry.hashCode() == kv.hashCode());
}
}