Extra tests and optimisations suggested by Clover
git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/lang/trunk@137532 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c7767ea25b
commit
7f9f65f7e2
|
@ -63,6 +63,7 @@ import java.util.Iterator;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.lang.ClassUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
/**
|
||||
|
@ -203,12 +204,15 @@ import org.apache.commons.lang.StringUtils;
|
|||
* @author Chris Webb
|
||||
* @author Mike Bowler
|
||||
* @since 1.0
|
||||
* @version $Id: Enum.java,v 1.15 2003/07/20 15:49:58 scolebourne Exp $
|
||||
* @version $Id: Enum.java,v 1.16 2003/07/30 23:13:09 scolebourne Exp $
|
||||
*/
|
||||
public abstract class Enum implements Comparable, Serializable {
|
||||
|
||||
/** Serialization id */
|
||||
static final long serialVersionUID = -487045951170455942L;
|
||||
|
||||
// After discussion, the default size for HashMaps is used, as the
|
||||
// sizing algorithm changes across the JDK versions
|
||||
|
||||
/**
|
||||
* An empty <code>Map</code>, as JDK1.2 didn't have an empty map.
|
||||
*/
|
||||
|
@ -221,6 +225,14 @@ public abstract class Enum implements Comparable, Serializable {
|
|||
* The string representation of the Enum.
|
||||
*/
|
||||
private final String iName;
|
||||
/**
|
||||
* The hashcode representation of the Enum.
|
||||
*/
|
||||
private transient final int iHashCode;
|
||||
/**
|
||||
* The toString representation of the Enum.
|
||||
*/
|
||||
protected transient String iToString = null;
|
||||
|
||||
/**
|
||||
* <p>Enable the iterator to retain the source code order.</p>
|
||||
|
@ -268,6 +280,9 @@ public abstract class Enum implements Comparable, Serializable {
|
|||
}
|
||||
entry.map.put(name, this);
|
||||
entry.list.add(this);
|
||||
|
||||
iHashCode = 7 + enumClass.hashCode() + 3 * name.hashCode();
|
||||
// cannot create toString here as subclasses may want to include other data
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -490,7 +505,7 @@ public abstract class Enum implements Comparable, Serializable {
|
|||
* @return a hashcode based on the name
|
||||
*/
|
||||
public final int hashCode() {
|
||||
return 7 + iName.hashCode();
|
||||
return iHashCode;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -507,25 +522,26 @@ public abstract class Enum implements Comparable, Serializable {
|
|||
* @throws NullPointerException if other is <code>null</code>
|
||||
*/
|
||||
public int compareTo(Object other) {
|
||||
if (other == this) {
|
||||
return 0;
|
||||
}
|
||||
return iName.compareTo(((Enum) other).iName);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Human readable description of this Enum item.</p>
|
||||
*
|
||||
* <p>For use when debugging.</p>
|
||||
*
|
||||
* @return String in the form <code>type[name]</code>, for example:
|
||||
* <code>Color[Red]</code>. Note that the package name is stripped from
|
||||
* the type name.
|
||||
*/
|
||||
public String toString() {
|
||||
String shortName = Enum.getEnumClass(getClass()).getName();
|
||||
int pos = shortName.lastIndexOf('.');
|
||||
if (pos != -1) {
|
||||
shortName = shortName.substring(pos + 1);
|
||||
if (iToString == null) {
|
||||
Class cls = Enum.getEnumClass(getClass());
|
||||
String shortName = ClassUtils.getShortClassName(cls);
|
||||
iToString = shortName + "[" + getName() + "]";
|
||||
}
|
||||
shortName = shortName.replace('$', '.');
|
||||
return shortName + "[" + getName() + "]";
|
||||
return iToString;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -56,6 +56,8 @@ package org.apache.commons.lang.enum;
|
|||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.lang.ClassUtils;
|
||||
|
||||
/**
|
||||
* <p>Abstract superclass for type-safe enums with integer values suitable
|
||||
* for use in <code>switch</code> statements.</p>
|
||||
|
@ -131,7 +133,7 @@ import java.util.List;
|
|||
* @author Apache Avalon project
|
||||
* @author Stephen Colebourne
|
||||
* @since 1.0
|
||||
* @version $Id: ValuedEnum.java,v 1.8 2003/07/20 15:49:58 scolebourne Exp $
|
||||
* @version $Id: ValuedEnum.java,v 1.9 2003/07/30 23:13:09 scolebourne Exp $
|
||||
*/
|
||||
public abstract class ValuedEnum extends Enum {
|
||||
/**
|
||||
|
@ -205,19 +207,16 @@ public abstract class ValuedEnum extends Enum {
|
|||
/**
|
||||
* <p>Human readable description of this <code>Enum</code> item.</p>
|
||||
*
|
||||
* <p>For use when debugging.</p>
|
||||
*
|
||||
* @return String in the form <code>type[name=value]</code>, for example:
|
||||
* <code>JavaVersion[Java 1.0=100]</code>. Note that the package name is
|
||||
* stripped from the type name.
|
||||
*/
|
||||
public String toString() {
|
||||
String shortName = Enum.getEnumClass(getClass()).getName();
|
||||
int pos = shortName.lastIndexOf('.');
|
||||
if (pos != -1) {
|
||||
shortName = shortName.substring(pos + 1);
|
||||
if (iToString == null) {
|
||||
Class cls = Enum.getEnumClass(getClass());
|
||||
String shortName = ClassUtils.getShortClassName(cls);
|
||||
iToString = shortName + "[" + getName() + "=" + getValue() + "]";
|
||||
}
|
||||
shortName = shortName.replace('$', '.');
|
||||
return shortName + "[" + getName() + "=" + getValue() + "]";
|
||||
return iToString;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
/* ====================================================================
|
||||
* The Apache Software License, Version 1.1
|
||||
*
|
||||
* Copyright (c) 2002-2003 The Apache Software Foundation. All rights
|
||||
* reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The end-user documentation included with the redistribution, if
|
||||
* any, must include the following acknowlegement:
|
||||
* "This product includes software developed by the
|
||||
* Apache Software Foundation (http://www.apache.org/)."
|
||||
* Alternately, this acknowlegement may appear in the software itself,
|
||||
* if and wherever such third-party acknowlegements normally appear.
|
||||
*
|
||||
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
|
||||
* Foundation" must not be used to endorse or promote products derived
|
||||
* from this software without prior written permission. For written
|
||||
* permission, please contact apache@apache.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "Apache"
|
||||
* nor may "Apache" appear in their names without prior written
|
||||
* permission of the Apache Software Foundation.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This software consists of voluntary contributions made by many
|
||||
* individuals on behalf of the Apache Software Foundation. For more
|
||||
* information on the Apache Software Foundation, please see
|
||||
* <http://www.apache.org/>.
|
||||
*/
|
||||
package org.apache.commons.lang.enum;
|
||||
|
||||
/**
|
||||
* Dummy enumeration - no values.
|
||||
*
|
||||
* @author Stephen Colebourne
|
||||
* @version $Id: DummyEnum.java,v 1.1 2003/07/30 23:13:09 scolebourne Exp $
|
||||
*/
|
||||
public abstract class DummyEnum extends Enum {
|
||||
|
||||
private DummyEnum(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
}
|
|
@ -67,7 +67,7 @@ import org.apache.commons.lang.SerializationUtils;
|
|||
* Test cases for the {@link Enum} class.
|
||||
*
|
||||
* @author Stephen Colebourne
|
||||
* @version $Id: EnumTest.java,v 1.7 2003/05/22 22:00:06 scolebourne Exp $
|
||||
* @version $Id: EnumTest.java,v 1.8 2003/07/30 23:13:09 scolebourne Exp $
|
||||
*/
|
||||
|
||||
public final class EnumTest extends TestCase {
|
||||
|
@ -95,11 +95,27 @@ public final class EnumTest extends TestCase {
|
|||
assertTrue(ColorEnum.BLUE.compareTo(ColorEnum.BLUE) == 0);
|
||||
assertTrue(ColorEnum.RED.compareTo(ColorEnum.BLUE) > 0);
|
||||
assertTrue(ColorEnum.BLUE.compareTo(ColorEnum.RED) < 0);
|
||||
try {
|
||||
ColorEnum.RED.compareTo(null);
|
||||
fail();
|
||||
} catch (NullPointerException ex) {}
|
||||
try {
|
||||
ColorEnum.RED.compareTo(new Object());
|
||||
fail();
|
||||
} catch (ClassCastException ex) {}
|
||||
}
|
||||
|
||||
public void testEquals() {
|
||||
assertSame(ColorEnum.RED, ColorEnum.RED);
|
||||
assertSame(ColorEnum.getEnum("Red"), ColorEnum.RED);
|
||||
assertEquals(false, ColorEnum.RED.equals(null));
|
||||
assertEquals(true, ColorEnum.RED.equals(ColorEnum.RED));
|
||||
assertEquals(true, ColorEnum.RED.equals(ColorEnum.getEnum("Red")));
|
||||
}
|
||||
|
||||
public void testHashCode() {
|
||||
assertEquals(ColorEnum.RED.hashCode(), ColorEnum.RED.hashCode());
|
||||
assertEquals(7 + ColorEnum.class.hashCode() + 3 * "Red".hashCode(), ColorEnum.RED.hashCode());
|
||||
}
|
||||
|
||||
public void testToString() {
|
||||
|
@ -151,7 +167,9 @@ public final class EnumTest extends TestCase {
|
|||
}
|
||||
|
||||
public void testSerialization() {
|
||||
int hashCode = ColorEnum.RED.hashCode();
|
||||
assertSame(ColorEnum.RED, SerializationUtils.clone(ColorEnum.RED));
|
||||
assertEquals(hashCode, SerializationUtils.clone(ColorEnum.RED).hashCode());
|
||||
assertSame(ColorEnum.GREEN, SerializationUtils.clone(ColorEnum.GREEN));
|
||||
assertSame(ColorEnum.BLUE, SerializationUtils.clone(ColorEnum.BLUE));
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ import junit.framework.TestSuite;
|
|||
* Test cases for the {@link Enum} class.
|
||||
*
|
||||
* @author <a href="mailto:scolebourne@joda.org">Stephen Colebourne</a>
|
||||
* @version $Id: EnumUtilsTest.java,v 1.3 2003/05/22 22:00:06 scolebourne Exp $
|
||||
* @version $Id: EnumUtilsTest.java,v 1.4 2003/07/30 23:13:09 scolebourne Exp $
|
||||
*/
|
||||
|
||||
public final class EnumUtilsTest extends TestCase {
|
||||
|
@ -88,15 +88,19 @@ public final class EnumUtilsTest extends TestCase {
|
|||
assertSame(ColorEnum.RED, it.next());
|
||||
assertSame(ColorEnum.GREEN, it.next());
|
||||
assertSame(ColorEnum.BLUE, it.next());
|
||||
it = EnumUtils.iterator(DummyEnum.class);
|
||||
assertEquals(false, it.hasNext());
|
||||
}
|
||||
|
||||
public void testIteratorEx() {
|
||||
try {
|
||||
EnumUtils.iterator(null);
|
||||
} catch (IllegalArgumentException ex) {
|
||||
return;
|
||||
}
|
||||
fail();
|
||||
fail();
|
||||
} catch (IllegalArgumentException ex) {}
|
||||
try {
|
||||
EnumUtils.iterator(Object.class);
|
||||
fail();
|
||||
} catch (IllegalArgumentException ex) {}
|
||||
}
|
||||
|
||||
public void testList() {
|
||||
|
@ -105,15 +109,19 @@ public final class EnumUtilsTest extends TestCase {
|
|||
assertSame(ColorEnum.RED, it.next());
|
||||
assertSame(ColorEnum.GREEN, it.next());
|
||||
assertSame(ColorEnum.BLUE, it.next());
|
||||
list = EnumUtils.getEnumList(DummyEnum.class);
|
||||
assertEquals(0, list.size());
|
||||
}
|
||||
|
||||
public void testListEx() {
|
||||
try {
|
||||
EnumUtils.getEnumList(null);
|
||||
} catch (IllegalArgumentException ex) {
|
||||
return;
|
||||
}
|
||||
fail();
|
||||
fail();
|
||||
} catch (IllegalArgumentException ex) {}
|
||||
try {
|
||||
EnumUtils.getEnumList(Object.class);
|
||||
fail();
|
||||
} catch (IllegalArgumentException ex) {}
|
||||
}
|
||||
|
||||
public void testMap() {
|
||||
|
@ -124,15 +132,19 @@ public final class EnumUtilsTest extends TestCase {
|
|||
assertSame(ColorEnum.RED, map.get("Red"));
|
||||
assertSame(ColorEnum.GREEN, map.get("Green"));
|
||||
assertSame(ColorEnum.BLUE, map.get("Blue"));
|
||||
map = EnumUtils.getEnumMap(DummyEnum.class);
|
||||
assertEquals(0, map.size());
|
||||
}
|
||||
|
||||
public void testMapEx() {
|
||||
try {
|
||||
EnumUtils.getEnumMap(null);
|
||||
} catch (IllegalArgumentException ex) {
|
||||
return;
|
||||
}
|
||||
fail();
|
||||
fail();
|
||||
} catch (IllegalArgumentException ex) {}
|
||||
try {
|
||||
EnumUtils.getEnumMap(Object.class);
|
||||
fail();
|
||||
} catch (IllegalArgumentException ex) {}
|
||||
}
|
||||
|
||||
public void testGet() {
|
||||
|
@ -140,15 +152,18 @@ public final class EnumUtilsTest extends TestCase {
|
|||
assertSame(ColorEnum.GREEN, EnumUtils.getEnum(ColorEnum.class, "Green"));
|
||||
assertSame(ColorEnum.BLUE, EnumUtils.getEnum(ColorEnum.class, "Blue"));
|
||||
assertSame(null, EnumUtils.getEnum(ColorEnum.class, "Pink"));
|
||||
assertSame(null, EnumUtils.getEnum(DummyEnum.class, "Pink"));
|
||||
}
|
||||
|
||||
public void testGetEx() {
|
||||
try {
|
||||
EnumUtils.getEnum(null, "");
|
||||
} catch (IllegalArgumentException ex) {
|
||||
return;
|
||||
}
|
||||
fail();
|
||||
fail();
|
||||
} catch (IllegalArgumentException ex) {}
|
||||
try {
|
||||
EnumUtils.getEnum(Object.class, "Red");
|
||||
fail();
|
||||
} catch (IllegalArgumentException ex) {}
|
||||
}
|
||||
|
||||
public void testGetValue() {
|
||||
|
@ -156,15 +171,18 @@ public final class EnumUtilsTest extends TestCase {
|
|||
assertSame(ValuedColorEnum.GREEN, EnumUtils.getEnum(ValuedColorEnum.class, 2));
|
||||
assertSame(ValuedColorEnum.BLUE, EnumUtils.getEnum(ValuedColorEnum.class, 3));
|
||||
assertSame(null, EnumUtils.getEnum(ValuedColorEnum.class, 4));
|
||||
assertSame(null, EnumUtils.getEnum(DummyEnum.class, 5));
|
||||
}
|
||||
|
||||
public void testGetValueEx() {
|
||||
try {
|
||||
EnumUtils.getEnum(null, 0);
|
||||
} catch (IllegalArgumentException ex) {
|
||||
return;
|
||||
}
|
||||
fail();
|
||||
fail();
|
||||
} catch (IllegalArgumentException ex) {}
|
||||
try {
|
||||
EnumUtils.getEnum(Object.class, 2);
|
||||
fail();
|
||||
} catch (IllegalArgumentException ex) {}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue