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.

JDTLikeHandleProviderTests.java 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. /********************************************************************
  2. * Copyright (c) 2006 Contributors. All rights reserved.
  3. * This program and the accompanying materials are made available
  4. * under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution and is available at
  6. * http://eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors: IBM Corporation - initial API and implementation
  9. * Helen Hawkins - initial version
  10. *******************************************************************/
  11. package org.aspectj.systemtest.ajc153;
  12. import java.io.File;
  13. import java.util.Iterator;
  14. import java.util.List;
  15. import junit.framework.Test;
  16. import org.aspectj.asm.AsmManager;
  17. import org.aspectj.asm.IElementHandleProvider;
  18. import org.aspectj.asm.IHierarchy;
  19. import org.aspectj.asm.IProgramElement;
  20. import org.aspectj.asm.internal.JDTLikeHandleProvider;
  21. import org.aspectj.testing.XMLBasedAjcTestCase;
  22. public class JDTLikeHandleProviderTests extends XMLBasedAjcTestCase {
  23. IElementHandleProvider handleProvider;
  24. protected void setUp() throws Exception {
  25. super.setUp();
  26. handleProvider = AsmManager.getDefault().getHandleProvider();
  27. AsmManager.getDefault().setHandleProvider(new JDTLikeHandleProvider());
  28. }
  29. protected void tearDown() throws Exception {
  30. super.tearDown();
  31. AsmManager.getDefault().setHandleProvider(handleProvider);
  32. }
  33. public void testMoreThanOneNamedPointcut() {
  34. runTest("More than one named pointcut");
  35. }
  36. public void testAspectHandle() {
  37. runTest("aspect handle");
  38. IHierarchy top = AsmManager.getDefault().getHierarchy();
  39. IProgramElement pe = top.findElementForType("pkg", "A1");
  40. String expected = "<pkg*A1.aj}A1";
  41. String found = pe.getHandleIdentifier();
  42. assertEquals("handleIdentifier - expected " + expected + ", but found "
  43. + found, expected, found);
  44. }
  45. public void testAdviceHandle() {
  46. runTest("advice handle");
  47. compareHandles(IProgramElement.Kind.ADVICE,
  48. "before(): <anonymous pointcut>",
  49. "<pkg*A2.aj}A2&before");
  50. }
  51. public void testPointcutHandle() {
  52. runTest("pointcut handle");
  53. compareHandles(IProgramElement.Kind.POINTCUT,
  54. "p()",
  55. "<pkg*A4.aj}A4+p");
  56. }
  57. public void testGetIPEWithAspectHandle() {
  58. runTest("get IProgramElement with aspect handle");
  59. IHierarchy top = AsmManager.getDefault().getHierarchy();
  60. String handle = "<pkg*A1.aj}A1";
  61. IProgramElement ipe = top.getElement(handle);
  62. assertNotNull("should have found ipe with handle " + handle, ipe);
  63. IProgramElement ipe2 = top.getElement(handle);
  64. assertEquals("should be the same IPE",ipe,ipe2);
  65. }
  66. public void testAdviceHandleWithCrossCutting() {
  67. runTest("advice handle with crosscutting");
  68. compareHandles(IProgramElement.Kind.ADVICE,
  69. "before(): <anonymous pointcut>",
  70. "<pkg*A3.aj}A3&before");
  71. }
  72. public void testPointcutHandleWithArgs() {
  73. runTest("pointcut handle with args");
  74. compareHandles(IProgramElement.Kind.POINTCUT,
  75. "p(java.lang.Integer)",
  76. "*A6.aj}A6+p+QInteger;");
  77. }
  78. public void testAdviceHandleWithArgs() {
  79. runTest("advice handle with args");
  80. compareHandles(IProgramElement.Kind.ADVICE,
  81. "afterReturning(java.lang.Integer): p..",
  82. "<pkg*A8.aj}A8&afterReturning&QInteger;");
  83. }
  84. public void testFieldITD() {
  85. runTest("field itd handle");
  86. compareHandles(IProgramElement.Kind.INTER_TYPE_FIELD,
  87. "C.x",
  88. "<pkg*A9.aj}A9)C.x");
  89. }
  90. public void testMethodITD() {
  91. runTest("method itd handle");
  92. compareHandles(IProgramElement.Kind.INTER_TYPE_METHOD,
  93. "C.method()",
  94. "<pkg*A9.aj}A9)C.method");
  95. }
  96. public void testMethodITDWithArgs() {
  97. runTest("method itd with args handle");
  98. compareHandles(IProgramElement.Kind.INTER_TYPE_METHOD,
  99. "C.methodWithArgs(int)",
  100. "<pkg*A9.aj}A9)C.methodWithArgs)I");
  101. }
  102. public void testConstructorITDWithArgs() {
  103. runTest("constructor itd with args");
  104. compareHandles(IProgramElement.Kind.INTER_TYPE_CONSTRUCTOR,
  105. "C.C(int,java.lang.String)",
  106. "<pkg*A13.aj}A13)C.C)I)QString;");
  107. }
  108. public void testDeclareParentsHandle() {
  109. runTest("declare parents handle");
  110. compareHandles(IProgramElement.Kind.DECLARE_PARENTS,
  111. "declare parents: implements C2",
  112. "<pkg*A7.aj}A7`declare parents");
  113. }
  114. public void testTwoDeclareParents() {
  115. runTest("two declare parents in same file");
  116. compareHandles(IProgramElement.Kind.DECLARE_PARENTS,
  117. "declare parents: extends C5",
  118. "<pkg*A7.aj}A7`declare parents!2");
  119. }
  120. public void testMethodCallHandle() {
  121. runTest("method call handle");
  122. compareHandles(IProgramElement.Kind.CODE,
  123. "method-call(void pkg.C.m2())",
  124. "<pkg*A10.aj[C~m1?method-call(void pkg.C.m2())");
  125. }
  126. public void testDeclareAtType() {
  127. // AJDT: =AJHandleProject/src<pkg*A.aj}A`declare \@type
  128. runTest("declare @type");
  129. compareHandles(IProgramElement.Kind.DECLARE_ANNOTATION_AT_TYPE,
  130. "declare @type: pkg.C : @MyAnnotation",
  131. "<pkg*A12.aj}A`declare @type");
  132. }
  133. public void testDeclareAtField() {
  134. // AJDT: =AJHandleProject/src<pkg*A.aj}A`declare \@field
  135. runTest("declare @field");
  136. compareHandles(IProgramElement.Kind.DECLARE_ANNOTATION_AT_FIELD,
  137. "declare @field: int pkg.C.someField : @MyAnnotation",
  138. "<pkg*A12.aj}A`declare @field!2");
  139. }
  140. public void testDeclareAtMethod() {
  141. // AJDT: =AJHandleProject/src<pkg*A.aj}A`declare \@method
  142. runTest("declare @method");
  143. compareHandles(IProgramElement.Kind.DECLARE_ANNOTATION_AT_METHOD,
  144. "declare @method: public void pkg.C.method1() : @MyAnnotation",
  145. "<pkg*A12.aj}A`declare @method!3");
  146. }
  147. public void testDeclareAtConstructor() {
  148. // AJDT: =AJHandleProject/src<pkg*A.aj}A`declare \@constructor
  149. runTest("declare @constructor");
  150. compareHandles(IProgramElement.Kind.DECLARE_ANNOTATION_AT_CONSTRUCTOR,
  151. "declare @constructor: pkg.C.new() : @MyAnnotation",
  152. "<pkg*A12.aj}A`declare @constructor!4");
  153. }
  154. // what about 2 pieces of before advice with the same
  155. // signature and the same pointcut
  156. public void testTwoPiecesOfAdviceWithSameSignatureAndPointcut() {
  157. runTest("two pieces of advice with the same signature and pointcut");
  158. IHierarchy top = AsmManager.getDefault().getHierarchy();
  159. IProgramElement parent = top.findElementForLabel(top.getRoot(),
  160. IProgramElement.Kind.ASPECT, "A5");
  161. List children = parent.getChildren();
  162. String handle1 = null;
  163. String handle2 = null;
  164. for (Iterator iter = children.iterator(); iter.hasNext();) {
  165. IProgramElement element = (IProgramElement) iter.next();
  166. if (element.getKind().equals(IProgramElement.Kind.ADVICE)) {
  167. if (handle1 == null) {
  168. handle1 = element.getHandleIdentifier();
  169. } else {
  170. handle2 = element.getHandleIdentifier();
  171. }
  172. }
  173. }
  174. String expected1 = "<pkg*A5.aj}A5&before";
  175. String expected2 = "<pkg*A5.aj}A5&before!2";
  176. boolean b = expected1.equals(handle1);
  177. if (b) {
  178. assertEquals("handleIdentifier - expected " + expected2 + ", but found "
  179. + handle2, expected2, handle2);
  180. } else {
  181. assertEquals("handleIdentifier - expected " + expected1 + ", but found "
  182. + handle2, expected1, handle2);
  183. assertEquals("handleIdentifier - expected " + expected2 + ", but found "
  184. + handle1, expected2, handle1);
  185. }
  186. }
  187. public void testDeclareWarningHandle() {
  188. runTest("declare warning handle");
  189. compareHandles(IProgramElement.Kind.DECLARE_WARNING,
  190. "declare warning: \"Illegal call.\"",
  191. "<pkg*A11.aj}A11`declare warning");
  192. }
  193. public void testTwoDeclareWarningHandles() {
  194. runTest("two declare warning handles");
  195. compareHandles(IProgramElement.Kind.DECLARE_WARNING,
  196. "declare warning: \"blah\"",
  197. "<pkg*A11.aj}A11`declare warning!2");
  198. }
  199. // this is to ensure the logic for not including '1' in the count
  200. // works correctly. We don't want a decw ipe with count 1 but we do
  201. // want one with count 10.
  202. public void testTenDeclareWarningHandles() {
  203. runTest("ten declare warning handles");
  204. compareHandles(IProgramElement.Kind.DECLARE_WARNING,
  205. "declare warning: \"warning 1\"",
  206. "*DeclareWarnings.aj}DeclareWarnings`declare warning");
  207. compareHandles(IProgramElement.Kind.DECLARE_WARNING,
  208. "declare warning: \"warning 10\"",
  209. "*DeclareWarnings.aj}DeclareWarnings`declare warning!10");
  210. }
  211. //---------- following tests ensure we produce the same handles as jdt -----//
  212. //---------- (apart from the prefix)
  213. // NOTES: there is no ipe equivalent to a package fragment root or
  214. //
  215. public void testCompilationUnitSameAsJDT() {
  216. // JDT: =TJP Example/src<tjp{Demo.java
  217. runTest("compilation unit same as jdt");
  218. compareHandles(IProgramElement.Kind.FILE_JAVA,
  219. "Demo.java",
  220. "<tjp{Demo.java");
  221. }
  222. public void testClassSameAsJDT() {
  223. // JDT: =Java5 Handles/src<pkg{C.java[C
  224. runTest("class same as jdt");
  225. compareHandles(IProgramElement.Kind.CLASS,
  226. "C","<pkg{C.java[C");
  227. }
  228. public void testInterfaceSameAsJDT() {
  229. // JDT: =Java5 Handles/src<pkg{C.java[MyInterface
  230. runTest("interface same as jdt");
  231. compareHandles(IProgramElement.Kind.INTERFACE,
  232. "MyInterface","<pkg{C.java[MyInterface");
  233. }
  234. public void testConstructorSameAsJDT() {
  235. // JDT: =Java5 Handles/src<pkg{C.java[C~C
  236. runTest("constructor same as jdt");
  237. compareHandles(IProgramElement.Kind.CONSTRUCTOR,
  238. "C()","<pkg{C.java[C~C");
  239. }
  240. public void testConstructorWithArgsSameAsJDT() {
  241. // JDT: =Java5 Handles/src<pkg{C.java[C~C~QString;
  242. runTest("constructor with args same as jdt");
  243. compareHandles(IProgramElement.Kind.CONSTRUCTOR,
  244. "C(java.lang.String)","<pkg{C.java[C~C~QString;");
  245. }
  246. // public void testPackageDeclarationSameAsJDT() {
  247. // // JDT: =TJP Example/src<tjp{Demo.java%tjp
  248. // fail("package declaration isn't the same");
  249. // runTest("package declaration same as jdt");
  250. // compareHandles(IProgramElement.Kind.PACKAGE,
  251. // "tjp",
  252. // "<tjp{Demo.java%tjp");
  253. // }
  254. public void testImportDeclarationSameAsJDT() {
  255. // JDT: =TJP Example/src<tjp{Demo.java#java.io.*
  256. runTest("import declaration same as jdt");
  257. compareHandles(IProgramElement.Kind.IMPORT_REFERENCE,
  258. "java.io.*",
  259. "<tjp{Demo.java#java.io.*");
  260. }
  261. public void testTypeSameAsJDT() {
  262. // JDT: =TJP Example/src<tjp{Demo.java[Demo
  263. runTest("type same as jdt");
  264. IHierarchy top = AsmManager.getDefault().getHierarchy();
  265. IProgramElement pe = top.findElementForType("tjp", "Demo");
  266. String expected = "<tjp{Demo.java[Demo";
  267. String found = pe.getHandleIdentifier();
  268. assertEquals("handleIdentifier - expected " + expected + ", but found "
  269. + found, expected, found);
  270. }
  271. public void testFieldSameAsJDT() {
  272. // JDT: =TJP Example/src<tjp{Demo.java[Demo^d
  273. runTest("field same as jdt");
  274. compareHandles(IProgramElement.Kind.FIELD,
  275. "d",
  276. "<tjp{Demo.java[Demo^d");
  277. }
  278. public void testInitializationSameAsJDT() {
  279. // JDT: =TJP Example/src<tjp{Demo.java[Demo|1
  280. // and =TJP Example/src<tjp{Demo.java[Demo|2
  281. runTest("initialization same as jdt");
  282. IHierarchy top = AsmManager.getDefault().getHierarchy();
  283. IProgramElement parent = top.findElementForLabel(top.getRoot(),
  284. IProgramElement.Kind.CLASS, "Demo");
  285. List children = parent.getChildren();
  286. String handle1 = null;
  287. String handle2 = null;
  288. for (Iterator iter = children.iterator(); iter.hasNext();) {
  289. IProgramElement element = (IProgramElement) iter.next();
  290. if (element.getKind().equals(IProgramElement.Kind.INITIALIZER)) {
  291. if (handle1 == null) {
  292. handle1 = element.getHandleIdentifier();
  293. } else {
  294. handle2 = element.getHandleIdentifier();
  295. }
  296. }
  297. }
  298. String expected1 = "<tjp{Demo.java[Demo|1";
  299. String expected2 = "<tjp{Demo.java[Demo|2";
  300. boolean b = expected1.equals(handle1);
  301. System.err.println("actual: " + handle1);
  302. System.err.println("actual: " + handle2);
  303. if (b) {
  304. assertEquals("handleIdentifier - expected " + expected2 + ", but found "
  305. + handle2, expected2, handle2);
  306. } else {
  307. assertEquals("handleIdentifier - expected " + expected1 + ", but found "
  308. + handle2, expected1, handle2);
  309. assertEquals("handleIdentifier - expected " + expected2 + ", but found "
  310. + handle1, expected2, handle1);
  311. }
  312. }
  313. public void testMethodWithStringArrayArgsSameAsJDT() {
  314. // JDT: =TJP Example/src<tjp{Demo.java[Demo~main~\[QString;
  315. runTest("method with string array as argument same as jdt");
  316. compareHandles(IProgramElement.Kind.METHOD,
  317. "main(java.lang.String[])",
  318. "<tjp{Demo.java[Demo~main~\\[QString;");
  319. }
  320. public void testMethodWithIntArrayArgsSameAsJDT() {
  321. // JDT: =TJP Example/src<tjp{Demo.java[Demo~m~\[I
  322. runTest("method with int array as argument same as jdt");
  323. compareHandles(IProgramElement.Kind.METHOD,
  324. "m(int[])",
  325. "<tjp{Demo.java[Demo~m~\\[I");
  326. }
  327. public void testMethodWithNoArgsSameAsJDT() {
  328. // JDT: =TJP Example/src<tjp{Demo.java[Demo~go
  329. runTest("method with no args same as jdt");
  330. compareHandles(IProgramElement.Kind.METHOD,
  331. "go()",
  332. "<tjp{Demo.java[Demo~go");
  333. }
  334. public void testMethodWithTwoArgsSameAsJDT() {
  335. // JDT: =TJP Example/src<tjp{Demo.java[Demo~foo~I~QObject;
  336. runTest("method with two args same as jdt");
  337. compareHandles(IProgramElement.Kind.METHOD,
  338. "foo(int,java.lang.Object)",
  339. "<tjp{Demo.java[Demo~foo~I~QObject;");
  340. }
  341. public void testMethodWithTwoStringArgsSameAsJDT() {
  342. // JDT: =TJP Example/src<tjp{Demo.java[Demo~m2~QString;~QString;
  343. runTest("method with two string args same as jdt");
  344. compareHandles(IProgramElement.Kind.METHOD,
  345. "m2(java.lang.String,java.lang.String)",
  346. "<tjp{Demo.java[Demo~m2~QString;~QString;");
  347. }
  348. public void testEnumSameAsJDT() {
  349. // JDT: =Java5 Handles/src<pkg{E.java[E
  350. runTest("enum same as jdt");
  351. IHierarchy top = AsmManager.getDefault().getHierarchy();
  352. IProgramElement pe = top.findElementForType("pkg", "E");
  353. String expected = "<pkg{E.java[E";
  354. String found = pe.getHandleIdentifier();
  355. assertEquals("handleIdentifier - expected " + expected + ", but found "
  356. + found, expected, found);
  357. }
  358. public void testEnumValueSameAsJDT() {
  359. // JDT: =Java5 Handles/src<pkg{E.java[E^A
  360. runTest("enum value same as jdt");
  361. compareHandles(IProgramElement.Kind.ENUM_VALUE,
  362. "A","<pkg{E.java[E^A");
  363. }
  364. public void testAnnotationSameAsJDT() {
  365. // JDT: =Java5 Handles/src<pkg{MyAnnotation.java[MyAnnotation
  366. runTest("annotation same as jdt");
  367. IHierarchy top = AsmManager.getDefault().getHierarchy();
  368. IProgramElement pe = top.findElementForType("pkg", "MyAnnotation");
  369. String expected = "<pkg{MyAnnotation.java[MyAnnotation";
  370. String found = pe.getHandleIdentifier();
  371. assertEquals("handleIdentifier - expected " + expected + ", but found "
  372. + found, expected, found);
  373. }
  374. public void testMethodWithListArgSameAsJDT() {
  375. // JDT: =Java5 Handles/src<pkg{Java5Class.java[Java5Class~method2~QList;
  376. runTest("method with list arg same as jdt");
  377. compareHandles(IProgramElement.Kind.METHOD,
  378. "method2(java.util.List)",
  379. "<pkg{Java5Class.java[Java5Class~method2~QList;");
  380. }
  381. public void testMethodWithGenericArgSameAsJDT() {
  382. // JDT: =Java5 Handles/src<pkg{Java5Class.java[Java5Class
  383. // ~genericMethod1~QList\<QString;>;
  384. runTest("method with generic arg same as jdt");
  385. compareHandles(IProgramElement.Kind.METHOD,
  386. "genericMethod1(java.util.List<java.lang.String>)",
  387. "<pkg{Java5Class.java[Java5Class~genericMethod1~QList\\<QString;>;");
  388. }
  389. public void testMethodWithTwoGenericArgsSameAsJDT() {
  390. // JDT: =Java5 Handles/src<pkg{Java5Class.java[Java5Class
  391. // ~genericMethod2~QList\<QString;>;~QMyGenericClass\<QInteger;>;
  392. runTest("method with two generic args same as jdt");
  393. compareHandles(IProgramElement.Kind.METHOD,
  394. "genericMethod2(java.util.List<java.lang.String>,"
  395. +"pkg.MyGenericClass<java.lang.Integer>)",
  396. "<pkg{Java5Class.java[Java5Class~genericMethod2~QList"
  397. +"\\<QString;>;~QMyGenericClass\\<QInteger;>;");
  398. }
  399. public void testMethodWithTwoTypeParametersSameAsJDT() {
  400. // JDT: =Java5 Handles/src<pkg{Java5Class.java[Java5Class~genericMethod4
  401. // ~QMyGenericClass2\<QString;QInteger;>;
  402. runTest("method with two type parameters same as jdt");
  403. compareHandles(IProgramElement.Kind.METHOD,
  404. "genericMethod4(pkg.MyGenericClass2<java.lang.String,java.lang.Integer>)",
  405. "<pkg{Java5Class.java[Java5Class~genericMethod4" +
  406. "~QMyGenericClass2\\<QString;QInteger;>;");
  407. }
  408. public void testMethodWithTwoArgsSameAsJDT_2() {
  409. // JDT: =Java5 Handles/src<pkg{Java5Class.java[Java5Class
  410. // ~genericMethod3~I~QList\<QString;>;
  411. runTest("method with two args one of which is generic same as jdt");
  412. compareHandles(IProgramElement.Kind.METHOD,
  413. "genericMethod3(int,java.util.List<java.lang.String>)",
  414. "<pkg{Java5Class.java[Java5Class~genericMethod3~I~QList\\<QString;>;");
  415. }
  416. /*
  417. * Still to do;
  418. * PROJECT,
  419. PACKAGE,
  420. FILE,
  421. FILE_ASPECTJ,
  422. FILE_LST,
  423. DECLARE_ERROR,
  424. DECLARE_SOFT,
  425. DECLARE_PRECEDENCE,
  426. */
  427. // ----------- helper methods ---------------
  428. private void compareHandles(IProgramElement.Kind kind, String ipeName, String expectedHandle) {
  429. IHierarchy top = AsmManager.getDefault().getHierarchy();
  430. IProgramElement pe = top.findElementForLabel(top.getRoot(),kind,ipeName);
  431. String found = pe.getHandleIdentifier();
  432. System.err.println("expected: " + expectedHandle);
  433. System.err.println("actual: " + found);
  434. assertEquals("handleIdentifier - expected " + expectedHandle + ", but found "
  435. + found, expectedHandle, found);
  436. }
  437. // ///////////////////////////////////////
  438. public static Test suite() {
  439. return XMLBasedAjcTestCase.loadSuite(JDTLikeHandleProviderTests.class);
  440. }
  441. protected File getSpecFile() {
  442. return new File(
  443. "../tests/src/org/aspectj/systemtest/ajc153/jdtlikehandleprovider.xml");
  444. }
  445. }