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 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /* *******************************************************************
  2. * Copyright (c) 2005-2008 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. * ******************************************************************/
  10. package org.aspectj.util;
  11. import org.aspectj.util.GenericSignature.ClassSignature;
  12. import org.aspectj.util.GenericSignature.ClassTypeSignature;
  13. import org.aspectj.util.GenericSignature.FieldTypeSignature;
  14. import org.aspectj.util.GenericSignature.SimpleClassTypeSignature;
  15. import junit.framework.TestCase;
  16. /**
  17. * @author Adrian Colyer
  18. * @author Andy Clement
  19. */
  20. public class GenericSignatureParserTest extends TestCase {
  21. GenericSignatureParser parser;
  22. public void testSimpleTokenize() {
  23. String[] tokens = parser.tokenize("Ljava/lang/String;");
  24. assertEquals(new String[] { "Ljava", "/", "lang", "/", "String", ";" }, tokens);
  25. }
  26. public void testTokenizeWithWildTypeArguments() {
  27. String[] tokens = parser.tokenize("Ljava/lang/String<*>;");
  28. assertEquals(new String[] { "Ljava", "/", "lang", "/", "String", "<", "*", ">", ";" }, tokens);
  29. }
  30. public void testTokenizeWithExtendsTypeArguments() {
  31. String[] tokens = parser.tokenize("Ljava/util/List<+TE>;");
  32. assertEquals(new String[] { "Ljava", "/", "util", "/", "List", "<", "+", "TE", ">", ";" }, tokens);
  33. }
  34. public void testTokenizeWithSuperTypeArguments() {
  35. String[] tokens = parser.tokenize("Ljava/util/List<-TE>;");
  36. assertEquals(new String[] { "Ljava", "/", "util", "/", "List", "<", "-", "TE", ">", ";" }, tokens);
  37. }
  38. public void testTokenizeArrayType() {
  39. String[] tokens = parser.tokenize("[Ljava/lang/String;");
  40. assertEquals(new String[] { "[", "Ljava", "/", "lang", "/", "String", ";" }, tokens);
  41. }
  42. public void testTokenizeFormalTypeParameters() {
  43. String[] tokens = parser.tokenize("<T:Ljava/lang/String;:Ljava/util/Comparable;>");
  44. assertEquals(new String[] { "<", "T", ":", "Ljava", "/", "lang", "/", "String", ";", ":", "Ljava", "/", "util", "/",
  45. "Comparable", ";", ">" }, tokens);
  46. }
  47. public void testParseClassSignatureSimple() {
  48. ClassSignature sig = parser.parseAsClassSignature("Ljava/lang/String;");
  49. assertEquals("No type parameters", 0, sig.formalTypeParameters.length);
  50. assertEquals("No superinterfaces", 0, sig.superInterfaceSignatures.length);
  51. assertEquals("Ljava/lang/String;", sig.superclassSignature.classSignature);
  52. SimpleClassTypeSignature outerType = sig.superclassSignature.outerType;
  53. assertEquals("Ljava/lang/String;", outerType.identifier);
  54. assertEquals("No type args", 0, outerType.typeArguments.length);
  55. }
  56. public void testParseClassSignatureTypeArgs() {
  57. ClassSignature sig = parser.parseAsClassSignature("Ljava/util/List<+Ljava/lang/String;>;");
  58. assertEquals("No type parameters", 0, sig.formalTypeParameters.length);
  59. assertEquals("No superinterfaces", 0, sig.superInterfaceSignatures.length);
  60. assertEquals("Ljava/util/List<+Ljava/lang/String;>;", sig.superclassSignature.classSignature);
  61. SimpleClassTypeSignature outerType = sig.superclassSignature.outerType;
  62. assertEquals("Ljava/util/List", outerType.identifier);
  63. assertEquals("One type arg", 1, outerType.typeArguments.length);
  64. assertTrue(outerType.typeArguments[0].isPlus);
  65. assertEquals("+Ljava/lang/String;", outerType.typeArguments[0].toString());
  66. }
  67. public void testParseClassSignatureTheFullMonty() {
  68. ClassSignature sig = parser
  69. .parseAsClassSignature("<E:Ljava/lang/String;:Ljava/lang/Number<TE;>;>Ljava/util/List<TE;>;Ljava/util/Comparable<-TE;>;");
  70. assertEquals("1 formal parameter", 1, sig.formalTypeParameters.length);
  71. assertEquals("E", sig.formalTypeParameters[0].identifier);
  72. ClassTypeSignature fsig = (ClassTypeSignature) sig.formalTypeParameters[0].classBound;
  73. assertEquals("Ljava/lang/String;", fsig.classSignature);
  74. assertEquals("1 interface bound", 1, sig.formalTypeParameters[0].interfaceBounds.length);
  75. ClassTypeSignature isig = (ClassTypeSignature) sig.formalTypeParameters[0].interfaceBounds[0];
  76. assertEquals("Ljava/lang/Number<TE;>;", isig.classSignature);
  77. assertEquals("Ljava/util/List<TE;>;", sig.superclassSignature.classSignature);
  78. assertEquals("1 type argument", 1, sig.superclassSignature.outerType.typeArguments.length);
  79. assertEquals("TE;", sig.superclassSignature.outerType.typeArguments[0].toString());
  80. assertEquals("1 super interface", 1, sig.superInterfaceSignatures.length);
  81. assertEquals("Ljava/util/Comparable<-TE;>;", sig.superInterfaceSignatures[0].toString());
  82. }
  83. public void testFunky_406167() {
  84. ClassSignature sig = parser
  85. .parseAsClassSignature("Lcom/google/android/gms/internal/hb<TT;>.com/google/android/gms/internal/hb$b<Ljava/lang/Boolean;>;");
  86. // Note the package prefix on the nested types has been dropped
  87. assertEquals("Lcom/google/android/gms/internal/hb<TT;>.hb$b<Ljava/lang/Boolean;>;",sig.superclassSignature.toString());
  88. sig = parser
  89. .parseAsClassSignature("Lcom/a/a/b/t<TK;TV;>.com/a/a/b/af.com/a/a/b/ag;Ljava/util/ListIterator<TV;>;");
  90. // Note the package prefix on the nested types has been dropped
  91. assertEquals("Lcom/a/a/b/t<TK;TV;>.af.ag;",sig.superclassSignature.toString());
  92. assertEquals("Ljava/util/ListIterator<TV;>;",sig.superInterfaceSignatures[0].toString());
  93. sig = parser.parseAsClassSignature("Lcom/google/android/gms/internal/hb.com/google/android/gms/internal/hb$b<Ljava/lang/Boolean;>;");
  94. // Note the package prefix on the nested types has been dropped
  95. assertEquals("Lcom/google/android/gms/internal/hb.hb$b<Ljava/lang/Boolean;>;",sig.superclassSignature.toString());
  96. sig = parser
  97. .parseAsClassSignature("Lcom/a/a/b/t.com/a/a/b/af.com/a/a/b/ag;Ljava/util/ListIterator<TV;>;");
  98. // Note the package prefix on the nested types has been dropped
  99. assertEquals("Lcom/a/a/b/t.af.ag;",sig.superclassSignature.toString());
  100. assertEquals("Ljava/util/ListIterator<TV;>;",sig.superInterfaceSignatures[0].toString());
  101. }
  102. public void testFieldSignatureParsingClassType() {
  103. FieldTypeSignature fsig = parser.parseAsFieldSignature("Ljava/lang/String;");
  104. assertTrue("ClassTypeSignature", fsig instanceof ClassTypeSignature);
  105. assertEquals("Ljava/lang/String;", fsig.toString());
  106. }
  107. public void testFieldSignatureParsingArrayType() {
  108. FieldTypeSignature fsig = parser.parseAsFieldSignature("[Ljava/lang/String;");
  109. assertTrue("ArrayTypeSignature", fsig instanceof GenericSignature.ArrayTypeSignature);
  110. assertEquals("[Ljava/lang/String;", fsig.toString());
  111. }
  112. public void testFieldSignatureParsingTypeVariable() {
  113. FieldTypeSignature fsig = parser.parseAsFieldSignature("TT;");
  114. assertTrue("TypeVariableSignature", fsig instanceof GenericSignature.TypeVariableSignature);
  115. assertEquals("TT;", fsig.toString());
  116. }
  117. public void testSimpleMethodSignatureParsing() {
  118. GenericSignature.MethodTypeSignature mSig = parser.parseAsMethodSignature("()V");
  119. assertEquals("No type parameters", 0, mSig.formalTypeParameters.length);
  120. assertEquals("No parameters", 0, mSig.parameters.length);
  121. assertEquals("Void return type", "V", mSig.returnType.toString());
  122. assertEquals("No throws", 0, mSig.throwsSignatures.length);
  123. }
  124. public void testMethodSignatureTypeParams() {
  125. GenericSignature.MethodTypeSignature mSig = parser.parseAsMethodSignature("<T:>(TT;)V");
  126. assertEquals("One type parameter", 1, mSig.formalTypeParameters.length);
  127. assertEquals("T", mSig.formalTypeParameters[0].identifier);
  128. assertEquals("Ljava/lang/Object;", mSig.formalTypeParameters[0].classBound.toString());
  129. assertEquals("One parameter", 1, mSig.parameters.length);
  130. assertEquals("TT;", mSig.parameters[0].toString());
  131. assertEquals("Void return type", "V", mSig.returnType.toString());
  132. assertEquals("No throws", 0, mSig.throwsSignatures.length);
  133. }
  134. public void testMethodSignatureGenericReturn() {
  135. GenericSignature.MethodTypeSignature mSig = parser.parseAsMethodSignature("<T:>()TT;");
  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("No parameters", 0, mSig.parameters.length);
  140. assertEquals("'T' return type", "TT;", mSig.returnType.toString());
  141. assertEquals("No throws", 0, mSig.throwsSignatures.length);
  142. }
  143. public void testMethodSignatureThrows() {
  144. GenericSignature.MethodTypeSignature mSig = parser
  145. .parseAsMethodSignature("<T:>(TT;)V^Ljava/lang/Exception;^Ljava/lang/RuntimeException;");
  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("One parameter", 1, mSig.parameters.length);
  150. assertEquals("TT;", mSig.parameters[0].toString());
  151. assertEquals("Void return type", "V", mSig.returnType.toString());
  152. assertEquals("2 throws", 2, mSig.throwsSignatures.length);
  153. assertEquals("Ljava/lang/Exception;", mSig.throwsSignatures[0].toString());
  154. assertEquals("Ljava/lang/RuntimeException;", mSig.throwsSignatures[1].toString());
  155. }
  156. public void testMethodSignaturePrimitiveParams() {
  157. GenericSignature.MethodTypeSignature mSig = parser.parseAsMethodSignature("(ILjava/lang/Object;)V");
  158. assertEquals("2 parameters", 2, mSig.parameters.length);
  159. assertEquals("I", mSig.parameters[0].toString());
  160. assertEquals("Ljava/lang/Object;", mSig.parameters[1].toString());
  161. }
  162. public void testFullyQualifiedSuperclassAfterTypeParams() {
  163. try {
  164. GenericSignature.FieldTypeSignature cSig = parser.parseAsFieldSignature("Ljava/util/List</;");
  165. fail("Expected IllegalStateException");
  166. } catch (IllegalStateException ex) {
  167. assertTrue(ex.getMessage().contains("Ljava/util/List</;"));
  168. }
  169. }
  170. public void testPr107784() {
  171. parser.parseAsMethodSignature("(Lcom/cibc/responders/mapping/CommonDataBeanScenario;Ljava/lang/Object;)Lcom/cibc/responders/response/Formatter<[BLjava/lang/Object;>;");
  172. parser.parseAsClassSignature("<Parent:Ljava/lang/Object;Child:Ljava/lang/Object;>Ljava/lang/Object;");
  173. }
  174. private void assertEquals(String[] expected, String[] actual) {
  175. if (actual.length != expected.length) {
  176. int shorter = Math.min(expected.length, actual.length);
  177. for (int i = 0; i < shorter; i++) {
  178. if (!actual[i].equals(expected[i])) {
  179. fail("Expected " + expected[i] + " at position " + i + " but found " + actual[i]);
  180. }
  181. }
  182. fail("Expected " + expected.length + " tokens but got " + actual.length + tokensToString(actual));
  183. }
  184. for (int i = 0; i < actual.length; i++) {
  185. if (!actual[i].equals(expected[i])) {
  186. fail("Expected " + expected[i] + " at position " + i + " but found " + actual[i]);
  187. }
  188. }
  189. }
  190. private String tokensToString(String[] tokens) {
  191. StringBuffer sb = new StringBuffer();
  192. sb.append(tokens[0]);
  193. for (int i = 1; i < tokens.length; i++) {
  194. sb.append(",");
  195. sb.append(tokens[i]);
  196. }
  197. return sb.toString();
  198. }
  199. protected void setUp() throws Exception {
  200. super.setUp();
  201. parser = new GenericSignatureParser();
  202. }
  203. }