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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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 junit.framework.TestCase;
  12. import org.aspectj.util.GenericSignature.ClassSignature;
  13. import org.aspectj.util.GenericSignature.ClassTypeSignature;
  14. import org.aspectj.util.GenericSignature.FieldTypeSignature;
  15. import org.aspectj.util.GenericSignature.SimpleClassTypeSignature;
  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 testFieldSignatureParsingClassType() {
  84. FieldTypeSignature fsig = parser.parseAsFieldSignature("Ljava/lang/String;");
  85. assertTrue("ClassTypeSignature", fsig instanceof ClassTypeSignature);
  86. assertEquals("Ljava/lang/String;", fsig.toString());
  87. }
  88. public void testFieldSignatureParsingArrayType() {
  89. FieldTypeSignature fsig = parser.parseAsFieldSignature("[Ljava/lang/String;");
  90. assertTrue("ArrayTypeSignature", fsig instanceof GenericSignature.ArrayTypeSignature);
  91. assertEquals("[Ljava/lang/String;", fsig.toString());
  92. }
  93. public void testFieldSignatureParsingTypeVariable() {
  94. FieldTypeSignature fsig = parser.parseAsFieldSignature("TT;");
  95. assertTrue("TypeVariableSignature", fsig instanceof GenericSignature.TypeVariableSignature);
  96. assertEquals("TT;", fsig.toString());
  97. }
  98. public void testSimpleMethodSignatureParsing() {
  99. GenericSignature.MethodTypeSignature mSig = parser.parseAsMethodSignature("()V");
  100. assertEquals("No type parameters", 0, mSig.formalTypeParameters.length);
  101. assertEquals("No parameters", 0, mSig.parameters.length);
  102. assertEquals("Void return type", "V", mSig.returnType.toString());
  103. assertEquals("No throws", 0, mSig.throwsSignatures.length);
  104. }
  105. public void testMethodSignatureTypeParams() {
  106. GenericSignature.MethodTypeSignature mSig = parser.parseAsMethodSignature("<T:>(TT;)V");
  107. assertEquals("One type parameter", 1, mSig.formalTypeParameters.length);
  108. assertEquals("T", mSig.formalTypeParameters[0].identifier);
  109. assertEquals("Ljava/lang/Object;", mSig.formalTypeParameters[0].classBound.toString());
  110. assertEquals("One parameter", 1, mSig.parameters.length);
  111. assertEquals("TT;", mSig.parameters[0].toString());
  112. assertEquals("Void return type", "V", mSig.returnType.toString());
  113. assertEquals("No throws", 0, mSig.throwsSignatures.length);
  114. }
  115. public void testMethodSignatureGenericReturn() {
  116. GenericSignature.MethodTypeSignature mSig = parser.parseAsMethodSignature("<T:>()TT;");
  117. assertEquals("One type parameter", 1, mSig.formalTypeParameters.length);
  118. assertEquals("T", mSig.formalTypeParameters[0].identifier);
  119. assertEquals("Ljava/lang/Object;", mSig.formalTypeParameters[0].classBound.toString());
  120. assertEquals("No parameters", 0, mSig.parameters.length);
  121. assertEquals("'T' return type", "TT;", mSig.returnType.toString());
  122. assertEquals("No throws", 0, mSig.throwsSignatures.length);
  123. }
  124. public void testMethodSignatureThrows() {
  125. GenericSignature.MethodTypeSignature mSig = parser
  126. .parseAsMethodSignature("<T:>(TT;)V^Ljava/lang/Exception;^Ljava/lang/RuntimeException;");
  127. assertEquals("One type parameter", 1, mSig.formalTypeParameters.length);
  128. assertEquals("T", mSig.formalTypeParameters[0].identifier);
  129. assertEquals("Ljava/lang/Object;", mSig.formalTypeParameters[0].classBound.toString());
  130. assertEquals("One parameter", 1, mSig.parameters.length);
  131. assertEquals("TT;", mSig.parameters[0].toString());
  132. assertEquals("Void return type", "V", mSig.returnType.toString());
  133. assertEquals("2 throws", 2, mSig.throwsSignatures.length);
  134. assertEquals("Ljava/lang/Exception;", mSig.throwsSignatures[0].toString());
  135. assertEquals("Ljava/lang/RuntimeException;", mSig.throwsSignatures[1].toString());
  136. }
  137. public void testMethodSignaturePrimitiveParams() {
  138. GenericSignature.MethodTypeSignature mSig = parser.parseAsMethodSignature("(ILjava/lang/Object;)V");
  139. assertEquals("2 parameters", 2, mSig.parameters.length);
  140. assertEquals("I", mSig.parameters[0].toString());
  141. assertEquals("Ljava/lang/Object;", mSig.parameters[1].toString());
  142. }
  143. public void testFullyQualifiedSuperclassAfterTypeParams() {
  144. try {
  145. GenericSignature.FieldTypeSignature cSig = parser.parseAsFieldSignature("Ljava/util/List</;");
  146. fail("Expected IllegalStateException");
  147. } catch (IllegalStateException ex) {
  148. assertTrue(ex.getMessage().indexOf("Ljava/util/List</;") != -1);
  149. }
  150. }
  151. public void testPr107784() {
  152. parser
  153. .parseAsMethodSignature("(Lcom/cibc/responders/mapping/CommonDataBeanScenario;Ljava/lang/Object;)Lcom/cibc/responders/response/Formatter<[BLjava/lang/Object;>;");
  154. parser.parseAsClassSignature("<Parent:Ljava/lang/Object;Child:Ljava/lang/Object;>Ljava/lang/Object;");
  155. }
  156. private void assertEquals(String[] expected, String[] actual) {
  157. if (actual.length != expected.length) {
  158. int shorter = Math.min(expected.length, actual.length);
  159. for (int i = 0; i < shorter; i++) {
  160. if (!actual[i].equals(expected[i])) {
  161. fail("Expected " + expected[i] + " at position " + i + " but found " + actual[i]);
  162. }
  163. }
  164. fail("Expected " + expected.length + " tokens but got " + actual.length + tokensToString(actual));
  165. }
  166. for (int i = 0; i < actual.length; i++) {
  167. if (!actual[i].equals(expected[i])) {
  168. fail("Expected " + expected[i] + " at position " + i + " but found " + actual[i]);
  169. }
  170. }
  171. }
  172. private String tokensToString(String[] tokens) {
  173. StringBuffer sb = new StringBuffer();
  174. sb.append(tokens[0]);
  175. for (int i = 1; i < tokens.length; i++) {
  176. sb.append(",");
  177. sb.append(tokens[i]);
  178. }
  179. return sb.toString();
  180. }
  181. protected void setUp() throws Exception {
  182. super.setUp();
  183. parser = new GenericSignatureParser();
  184. }
  185. }