You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GenericSignatureParserTest.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. /* *******************************************************************
  2. * Copyright (c) 2005 Contributors
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/epl-v10.html
  8. *
  9. * Contributors:
  10. * Adrian Colyer initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.apache.bcel.classfile.tests;
  13. import org.aspectj.apache.bcel.classfile.GenericSignatureParser;
  14. import org.aspectj.apache.bcel.classfile.JavaClass;
  15. import org.aspectj.apache.bcel.classfile.Method;
  16. import org.aspectj.apache.bcel.classfile.Signature;
  17. import org.aspectj.apache.bcel.classfile.Signature.ClassSignature;
  18. import org.aspectj.apache.bcel.classfile.Signature.ClassTypeSignature;
  19. import org.aspectj.apache.bcel.classfile.Signature.FieldTypeSignature;
  20. import org.aspectj.apache.bcel.classfile.Signature.SimpleClassTypeSignature;
  21. import org.aspectj.apache.bcel.util.SyntheticRepository;
  22. import junit.framework.TestCase;
  23. public class GenericSignatureParserTest extends TestCase {
  24. GenericSignatureParser parser;
  25. public void testSimpleTokenize() {
  26. String [] tokens = parser.tokenize("Ljava/lang/String;");
  27. assertEquals(new String[] {"Ljava","/","lang","/","String",";"},tokens);
  28. }
  29. public void testTokenizeWithWildTypeArguments() {
  30. String[] tokens = parser.tokenize("Ljava/lang/String<*>;");
  31. assertEquals(new String[] {"Ljava","/","lang","/","String","<","*",">",";"},tokens);
  32. }
  33. public void testTokenizeWithExtendsTypeArguments() {
  34. String[] tokens = parser.tokenize("Ljava/util/List<+TE>;");
  35. assertEquals(new String[] {"Ljava","/","util","/","List","<","+","TE",">",";"},tokens);
  36. }
  37. public void testTokenizeWithSuperTypeArguments() {
  38. String[] tokens = parser.tokenize("Ljava/util/List<-TE>;");
  39. assertEquals(new String[] {"Ljava","/","util","/","List","<","-","TE",">",";"},tokens);
  40. }
  41. public void testTokenizeArrayType() {
  42. String [] tokens = parser.tokenize("[Ljava/lang/String;");
  43. assertEquals(new String[] {"[","Ljava","/","lang","/","String",";"},tokens);
  44. }
  45. public void testTokenizeFormalTypeParameters() {
  46. String[] tokens = parser.tokenize("<T:Ljava/lang/String;:Ljava/util/Comparable;>");
  47. assertEquals(new String[] {"<","T",":","Ljava","/","lang","/","String",";",":","Ljava","/","util","/","Comparable",";",">"},tokens);
  48. }
  49. public void testParseClassSignatureSimple() {
  50. ClassSignature sig = parser.parseAsClassSignature("Ljava/lang/String;");
  51. assertEquals("No type parameters",0,sig.formalTypeParameters.length);
  52. assertEquals("No superinterfaces",0,sig.superInterfaceSignatures.length);
  53. assertEquals("Ljava/lang/String;",sig.superclassSignature.classSignature);
  54. SimpleClassTypeSignature outerType = sig.superclassSignature.outerType;
  55. assertEquals("Ljava/lang/String;",outerType.identifier);
  56. assertEquals("No type args",0,outerType.typeArguments.length);
  57. }
  58. public void testParseClassSignatureTypeArgs() {
  59. ClassSignature sig = parser.parseAsClassSignature("Ljava/util/List<+Ljava/lang/String;>;");
  60. assertEquals("No type parameters",0,sig.formalTypeParameters.length);
  61. assertEquals("No superinterfaces",0,sig.superInterfaceSignatures.length);
  62. assertEquals("Ljava/util/List<+Ljava/lang/String;>;",sig.superclassSignature.classSignature);
  63. SimpleClassTypeSignature outerType = sig.superclassSignature.outerType;
  64. assertEquals("Ljava/util/List",outerType.identifier);
  65. assertEquals("One type arg",1,outerType.typeArguments.length);
  66. assertTrue(outerType.typeArguments[0].isPlus);
  67. assertEquals("+Ljava/lang/String;",outerType.typeArguments[0].toString());
  68. }
  69. public void testParseClassSignatureTheFullMonty() {
  70. ClassSignature sig = parser.parseAsClassSignature("<E:Ljava/lang/String;:Ljava/lang/Number<TE;>;>Ljava/util/List<TE;>;Ljava/util/Comparable<-TE;>;");
  71. assertEquals("1 formal parameter",1,sig.formalTypeParameters.length);
  72. assertEquals("E",sig.formalTypeParameters[0].identifier);
  73. ClassTypeSignature fsig = (ClassTypeSignature) sig.formalTypeParameters[0].classBound;
  74. assertEquals("Ljava/lang/String;",fsig.classSignature);
  75. assertEquals("1 interface bound",1,sig.formalTypeParameters[0].interfaceBounds.length);
  76. ClassTypeSignature isig = (ClassTypeSignature) sig.formalTypeParameters[0].interfaceBounds[0];
  77. assertEquals("Ljava/lang/Number<TE;>;",isig.classSignature);
  78. assertEquals("Ljava/util/List<TE;>;",sig.superclassSignature.classSignature);
  79. assertEquals("1 type argument",1,sig.superclassSignature.outerType.typeArguments.length);
  80. assertEquals("TE;",sig.superclassSignature.outerType.typeArguments[0].toString());
  81. assertEquals("1 super interface",1,sig.superInterfaceSignatures.length);
  82. assertEquals("Ljava/util/Comparable<-TE;>;",sig.superInterfaceSignatures[0].toString());
  83. }
  84. public void testClassSignatureParsingInJDK() throws Exception {
  85. SyntheticRepository repository = SyntheticRepository.getInstance();
  86. String[] testClasses = new String[] {
  87. "java.lang.Comparable",
  88. "java.lang.Iterable",
  89. "java.lang.Class",
  90. "java.lang.Enum",
  91. "java.lang.InheritableThreadLocal",
  92. "java.lang.ThreadLocal",
  93. "java.util.Collection",
  94. "java.util.Comparator",
  95. "java.util.Enumeration",
  96. "java.util.Iterator",
  97. "java.util.List",
  98. "java.util.ListIterator",
  99. "java.util.Map",
  100. "java.util.Map$Entry",
  101. "java.util.Queue",
  102. "java.util.Set",
  103. "java.util.SortedMap",
  104. "java.util.SortedSet"
  105. };
  106. for (int i = 0; i < testClasses.length; i++) {
  107. JavaClass jc = repository.loadClass(testClasses[i]);
  108. String sig = jc.getGenericSignature();
  109. parser.parseAsClassSignature(sig);
  110. }
  111. }
  112. public void testFieldSignatureParsingClassType() {
  113. FieldTypeSignature fsig = parser.parseAsFieldSignature("Ljava/lang/String;");
  114. assertTrue("ClassTypeSignature", fsig instanceof ClassTypeSignature);
  115. assertEquals("Ljava/lang/String;",fsig.toString());
  116. }
  117. public void testFieldSignatureParsingArrayType() {
  118. FieldTypeSignature fsig = parser.parseAsFieldSignature("[Ljava/lang/String;");
  119. assertTrue("ArrayTypeSignature", fsig instanceof Signature.ArrayTypeSignature);
  120. assertEquals("[Ljava/lang/String;",fsig.toString());
  121. }
  122. public void testFieldSignatureParsingTypeVariable() {
  123. FieldTypeSignature fsig = parser.parseAsFieldSignature("TT;");
  124. assertTrue("TypeVariableSignature",fsig instanceof Signature.TypeVariableSignature);
  125. assertEquals("TT;",fsig.toString());
  126. }
  127. public void testSimpleMethodSignatureParsing() {
  128. Signature.MethodTypeSignature mSig = parser.parseAsMethodSignature("()V");
  129. assertEquals("No type parameters",0,mSig.formalTypeParameters.length);
  130. assertEquals("No parameters",0,mSig.parameters.length);
  131. assertEquals("Void return type","V",mSig.returnType.toString());
  132. assertEquals("No throws",0,mSig.throwsSignatures.length);
  133. }
  134. public void testMethodSignatureTypeParams() {
  135. Signature.MethodTypeSignature mSig = parser.parseAsMethodSignature("<T:>(TT;)V");
  136. assertEquals("One type parameter",1,mSig.formalTypeParameters.length);
  137. assertEquals("T",mSig.formalTypeParameters[0].identifier);
  138. assertEquals("Ljava/lang/Object;",mSig.formalTypeParameters[0].classBound.toString());
  139. assertEquals("One parameter",1,mSig.parameters.length);
  140. assertEquals("TT;",mSig.parameters[0].toString());
  141. assertEquals("Void return type","V",mSig.returnType.toString());
  142. assertEquals("No throws",0,mSig.throwsSignatures.length);
  143. }
  144. public void testMethodSignatureGenericReturn() {
  145. Signature.MethodTypeSignature mSig = parser.parseAsMethodSignature("<T:>()TT;");
  146. assertEquals("One type parameter",1,mSig.formalTypeParameters.length);
  147. assertEquals("T",mSig.formalTypeParameters[0].identifier);
  148. assertEquals("Ljava/lang/Object;",mSig.formalTypeParameters[0].classBound.toString());
  149. assertEquals("No parameters",0,mSig.parameters.length);
  150. assertEquals("'T' return type","TT;",mSig.returnType.toString());
  151. assertEquals("No throws",0,mSig.throwsSignatures.length);
  152. }
  153. public void testMethodSignatureThrows() {
  154. Signature.MethodTypeSignature mSig = parser.parseAsMethodSignature("<T:>(TT;)V^Ljava/lang/Exception;^Ljava/lang/RuntimeException;");
  155. assertEquals("One type parameter",1,mSig.formalTypeParameters.length);
  156. assertEquals("T",mSig.formalTypeParameters[0].identifier);
  157. assertEquals("Ljava/lang/Object;",mSig.formalTypeParameters[0].classBound.toString());
  158. assertEquals("One parameter",1,mSig.parameters.length);
  159. assertEquals("TT;",mSig.parameters[0].toString());
  160. assertEquals("Void return type","V",mSig.returnType.toString());
  161. assertEquals("2 throws",2,mSig.throwsSignatures.length);
  162. assertEquals("Ljava/lang/Exception;",mSig.throwsSignatures[0].toString());
  163. assertEquals("Ljava/lang/RuntimeException;",mSig.throwsSignatures[1].toString());
  164. }
  165. public void testMethodSignaturePrimitiveParams() {
  166. Signature.MethodTypeSignature mSig = parser.parseAsMethodSignature("(ILjava/lang/Object;)V");
  167. assertEquals("2 parameters",2,mSig.parameters.length);
  168. assertEquals("I",mSig.parameters[0].toString());
  169. assertEquals("Ljava/lang/Object;",mSig.parameters[1].toString());
  170. }
  171. public void testMethodSignatureParsingInJDK() throws Exception{
  172. SyntheticRepository repository = SyntheticRepository.getInstance();
  173. String[] testClasses = new String[] {
  174. "java.lang.Comparable",
  175. "java.lang.Iterable",
  176. "java.lang.Class",
  177. "java.lang.Enum",
  178. "java.lang.InheritableThreadLocal",
  179. "java.lang.ThreadLocal",
  180. "java.util.Collection",
  181. "java.util.Comparator",
  182. "java.util.Enumeration",
  183. "java.util.Iterator",
  184. "java.util.List",
  185. "java.util.ListIterator",
  186. "java.util.Map",
  187. "java.util.Map$Entry",
  188. "java.util.Queue",
  189. "java.util.Set",
  190. "java.util.SortedMap",
  191. "java.util.SortedSet"
  192. };
  193. for (int i = 0; i < testClasses.length; i++) {
  194. JavaClass jc = repository.loadClass(testClasses[i]);
  195. Method[] methods = jc.getMethods();
  196. for (int j = 0; j < methods.length; j++) {
  197. String sig = methods[j].getGenericSignature();
  198. if (sig != null) parser.parseAsMethodSignature(sig);
  199. }
  200. }
  201. }
  202. public void testFullyQualifiedSuperclassAfterTypeParams() {
  203. try {
  204. Signature.FieldTypeSignature cSig = parser.parseAsFieldSignature("Ljava/util/List</;");
  205. fail("Expected IllegalStateException");
  206. } catch (IllegalStateException ex) {
  207. assertTrue(ex.getMessage().indexOf("Ljava/util/List</;") != -1);
  208. }
  209. }
  210. public void testPr107784() {
  211. parser.parseAsMethodSignature(
  212. "(Lcom/cibc/responders/mapping/CommonDataBeanScenario;Ljava/lang/Object;)Lcom/cibc/responders/response/Formatter<[BLjava/lang/Object;>;");
  213. parser.parseAsClassSignature("<Parent:Ljava/lang/Object;Child:Ljava/lang/Object;>Ljava/lang/Object;");
  214. }
  215. private void assertEquals(String[] expected, String[] actual) {
  216. if (actual.length != expected.length) {
  217. int shorter = Math.min(expected.length,actual.length);
  218. for (int i = 0; i < shorter; i++) {
  219. if (!actual[i].equals(expected[i])) {
  220. fail("Expected " + expected[i] + " at position " + i + " but found " +
  221. actual[i]);
  222. }
  223. }
  224. fail("Expected " + expected.length + " tokens but got " + actual.length +
  225. tokensToString(actual));
  226. }
  227. for (int i = 0; i < actual.length; i++) {
  228. if (!actual[i].equals(expected[i])) {
  229. fail("Expected " + expected[i] + " at position " + i + " but found " +
  230. actual[i]);
  231. }
  232. }
  233. }
  234. private String tokensToString(String[] tokens) {
  235. StringBuffer sb = new StringBuffer();
  236. sb.append(tokens[0]);
  237. for (int i = 1; i < tokens.length; i++) {
  238. sb.append(",");
  239. sb.append(tokens[i]);
  240. }
  241. return sb.toString();
  242. }
  243. protected void setUp() throws Exception {
  244. super.setUp();
  245. parser = new GenericSignatureParser();
  246. }
  247. }