/*** * ASM tests * Copyright (c) 2000-2011 INRIA, France Telecom * 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. Neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS 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 COPYRIGHT OWNER OR 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. */ package org.objectweb.asm.util; import java.util.StringTokenizer; import junit.framework.TestCase; import junit.framework.TestSuite; import org.objectweb.asm.Opcodes; import org.objectweb.asm.signature.SignatureReader; /** * TraceSignatureVisitor unit tests. * * @author Eugene Kuleshov */ public class TraceSignatureVisitorUnitTest extends TestCase { public final static String[] DATA = { "C|E|> implements java.lang.Comparable, java.io.Serializable" + "|;>Ljava/lang/Object;Ljava/lang/Comparable;Ljava/io/Serializable;", "C|I| extends java.lang.reflect.Type" + "|Ljava/lang/Object;Ljava/lang/reflect/Type;", "C|C| extends java.util.AbstractMap implements java.util.concurrent.ConcurrentMap, java.io.Serializable" + "|Ljava/util/AbstractMap;Ljava/util/concurrent/ConcurrentMap;Ljava/io/Serializable;", "C|C|, V> extends java.util.AbstractMap implements java.io.Serializable, java.lang.Cloneable" + "|;V:Ljava/lang/Object;>Ljava/util/AbstractMap;Ljava/io/Serializable;Ljava/lang/Cloneable;", "F|C|java.lang.Class|Ljava/lang/Class<*>;", "F|C|java.lang.reflect.Constructor|Ljava/lang/reflect/Constructor;", "F|C|T[]|[TT;", "F|C|java.util.Hashtable|Ljava/util/Hashtable<**>;", "F|C|java.util.concurrent.atomic.AtomicReferenceFieldUpdater" + "|Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;", "F|C|AA|LAA<[[B>;", "F|C|AA[][]>" + "|LAA<[[Ljava/util/Map;>;", "F|C|java.util.Hashtable" + "|Ljava/util/Hashtable;", "M|C|void(boolean, byte, char, short, int, float, long, double)" + "|(ZBCSIFJD)V", "M|C|void()E, F|()V^TE;^TF;", "M|C|java.lang.Class()" + "|()Ljava/lang/Class<+TE;>;", "M|C|java.lang.Class()" + "|()Ljava/lang/Class<-TE;>;", "M|C|void(A.B)|(LA.B;)V", "M|C|void(A.B)|(LA.B;)V", "M|C|void(java.lang.String, java.lang.Class, java.lang.reflect.Method[], java.lang.reflect.Method, java.lang.reflect.Method)" + "|(Ljava/lang/String;Ljava/lang/Class<*>;[Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;)V", "M|C|java.util.Map(java.lang.Object, java.util.Map)" + "|(Ljava/lang/Object;Ljava/util/Map;)Ljava/util/Map;", "M|C|java.util.Map(java.lang.Object, java.util.Map, T)" + "|(Ljava/lang/Object;Ljava/util/Map;TT;)Ljava/util/Map;", "M|C|java.util.Map>(java.lang.Object, java.util.Map, T)" + "|;>(Ljava/lang/Object;Ljava/util/Map;TT;)Ljava/util/Map;", }; public static TestSuite suite() { TestSuite suite = new TestSuite( TraceSignatureVisitorUnitTest.class.getName()); for (int i = 0; i < DATA.length; i++) { suite.addTest(new TraceSignatureVisitorUnitTest(new TestData( DATA[i]))); } return suite; } private TestData data; private TraceSignatureVisitorUnitTest(final TestData data) { super("testSignature"); this.data = data; } public void testSignature() { TraceSignatureVisitor d = new TraceSignatureVisitor(data.access); SignatureReader r = new SignatureReader(data.signature); switch (data.type) { case 'C': r.accept(d); assertEquals(data.declaration, d.getDeclaration()); break; case 'F': r.acceptType(d); assertEquals(data.declaration, d.getDeclaration()); break; case 'M': r.accept(d); String fullMethodDeclaration = d.getReturnType() + d.getDeclaration() + (d.getExceptions() != null ? d.getExceptions() : ""); assertEquals(data.declaration, fullMethodDeclaration); break; } } @Override public String getName() { return super.getName() + " " + data.signature; } public static class TestData { public final char type; public final int access; public final String declaration; public final String signature; public TestData(final String data) { StringTokenizer st = new StringTokenizer(data, "|"); this.type = st.nextToken().charAt(0); String acc = st.nextToken(); switch (acc.charAt(0)) { case 'E': this.access = Opcodes.ACC_ENUM; break; case 'I': this.access = Opcodes.ACC_INTERFACE; break; case 'A': this.access = Opcodes.ACC_ANNOTATION; break; default: this.access = 0; } this.declaration = st.nextToken(); this.signature = st.nextToken(); } } }