/* * FindBugs - Find Bugs in Java programs * Copyright (C) 2006, University of Maryland * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package edu.umd.cs.findbugs.ba.generic; import java.util.Arrays; import java.util.List; import junit.framework.TestCase; import org.apache.bcel.generic.ReferenceType; import org.apache.bcel.generic.Type; import edu.umd.cs.findbugs.ba.generic.GenericUtilities.TypeCategory; /** * @author Nat Ayewah */ public class TestGenericObjectType extends TestCase { GenericObjectType obj; String javaSignature; String underlyingClass; GenericUtilities.TypeCategory typeCategory; String variable; Type extension; List<ReferenceType> parameters; public void initTest( String bytecodeSignature, String javaSignature, String underlyingClass, GenericUtilities.TypeCategory typeCategory, String variable, Type extension, List<ReferenceType> parameters) { this.obj = (GenericObjectType) GenericUtilities.getType(bytecodeSignature); this.javaSignature = javaSignature; this.underlyingClass = underlyingClass; this.typeCategory = typeCategory; this.variable = variable; this.extension = extension; this.parameters = parameters; } public void processTest() { assertEquals(obj.toString(true), javaSignature); assertEquals(obj.getClassName(), underlyingClass); assertEquals(obj.getTypeCategory(), typeCategory); if (typeCategory == TypeCategory.PARAMETERIZED) { assertTrue(obj.hasParameters()); assertTrue(obj.getNumParameters() == parameters.size()); for (int i=0; i<obj.getNumParameters(); i++) compareTypes(obj.getParameterAt(i), parameters.get(i)); assertNull(obj.getVariable()); assertNull(obj.getExtension()); }else if (typeCategory == TypeCategory.TYPE_VARIABLE) { assertFalse(obj.hasParameters()); assertNull(obj.getExtension()); assertNotNull(obj.getVariable()); assertEquals(obj.getVariable(), variable); }else if (typeCategory == TypeCategory.WILDCARD) { assertFalse(obj.hasParameters()); assertNull(obj.getExtension()); assertNotNull(obj.getVariable()); assertEquals(obj.getVariable(), "*"); } else if (typeCategory == TypeCategory.WILDCARD_EXTENDS || typeCategory == TypeCategory.WILDCARD_SUPER) { assertFalse(obj.hasParameters()); assertNotNull(obj.getExtension()); assertNotNull(obj.getVariable()); assertEquals(obj.getVariable(), variable); compareTypes(obj.getExtension(), extension); } } private void compareTypes(Type a, Type b) { assertEquals(a, b); if (a instanceof GenericObjectType || b instanceof GenericObjectType) { assertTrue(a instanceof GenericObjectType && b instanceof GenericObjectType); assertEquals( ((GenericObjectType)a).toString(true), ((GenericObjectType)b).toString(true) ); } } public void testParameterizedList() { initTest( "Ljava/util/List<Ljava/lang/Comparable;>;", "java.util.List<java.lang.Comparable>", "java.util.List", GenericUtilities.TypeCategory.PARAMETERIZED, null, null, GenericUtilities.getTypes("Ljava/lang/Comparable;") ); processTest(); } public void testCreateTypes() { initTest( "LDummyClass<Ljava/lang/Comparable;TE;>;", "DummyClass<java.lang.Comparable,E>", "DummyClass", GenericUtilities.TypeCategory.PARAMETERIZED, null, null, Arrays.asList( (ReferenceType) GenericUtilities.getType("Ljava/lang/Comparable;"), (ReferenceType) GenericUtilities.getType("TE;") ) ); processTest(); } public void testTypeVariables() { initTest( "TE;", "E", "java.lang.Object", GenericUtilities.TypeCategory.TYPE_VARIABLE, "E", null, null ); processTest(); initTest( "*", "?", "java.lang.Object", GenericUtilities.TypeCategory.WILDCARD, "*", null, null ); processTest(); initTest( "+TE;", "? extends E", "java.lang.Object", GenericUtilities.TypeCategory.WILDCARD_EXTENDS, "+", GenericUtilities.getType("TE;"), null ); processTest(); initTest( "-TE;", "? super E", "java.lang.Object", GenericUtilities.TypeCategory.WILDCARD_SUPER, "-", GenericUtilities.getType("TE;"), null ); processTest(); initTest( "-[TE;", "? super E[]", "java.lang.Object", GenericUtilities.TypeCategory.WILDCARD_SUPER, "-", GenericUtilities.getType("[TE;"), null ); processTest(); } }