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.

WeaveOrderTestCase.java 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /* *******************************************************************
  2. * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
  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. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver.bcel;
  13. import org.aspectj.weaver.Advice;
  14. import org.aspectj.weaver.AdviceKind;
  15. import org.aspectj.weaver.CrosscuttingMembers;
  16. import org.aspectj.weaver.MemberImpl;
  17. import org.aspectj.weaver.ResolvedType;
  18. import org.aspectj.weaver.UnresolvedType;
  19. import org.aspectj.weaver.patterns.Declare;
  20. import org.aspectj.weaver.patterns.PatternParser;
  21. /**.
  22. */
  23. public class WeaveOrderTestCase extends WeaveTestCase {
  24. {
  25. regenerate = false;
  26. }
  27. public WeaveOrderTestCase(String name) {
  28. super(name);
  29. }
  30. public void testLexicalOrder() {
  31. Advice a1 =
  32. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.OBJECT, UnresolvedType.OBJECT, 1);
  33. Advice a2 =
  34. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.OBJECT, UnresolvedType.THROWABLE, 2);
  35. assertEquals(-1, a2.compareTo(a1));
  36. assertEquals(+1, a1.compareTo(a2));
  37. }
  38. public void testLexicalOrderWithAfter() {
  39. Advice a1 =
  40. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.OBJECT, UnresolvedType.OBJECT, 1);
  41. Advice a2 =
  42. makeConcreteAdvice(AdviceKind.After, UnresolvedType.OBJECT, UnresolvedType.THROWABLE, 2);
  43. assertEquals(+1, a2.compareTo(a1));
  44. assertEquals(-1, a1.compareTo(a2));
  45. a1 =
  46. makeConcreteAdvice(AdviceKind.After, UnresolvedType.OBJECT, UnresolvedType.OBJECT, 1);
  47. a2 =
  48. makeConcreteAdvice(AdviceKind.After, UnresolvedType.OBJECT, UnresolvedType.THROWABLE, 2);
  49. assertEquals(+1, a2.compareTo(a1));
  50. assertEquals(-1, a1.compareTo(a2));
  51. }
  52. public void testSubtypes() {
  53. Advice a1 =
  54. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.OBJECT, UnresolvedType.OBJECT, 1);
  55. Advice a2 =
  56. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.THROWABLE, UnresolvedType.OBJECT, 1);
  57. Advice a3 =
  58. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.forName("java.lang.String"), UnresolvedType.OBJECT, 1);
  59. assertEquals(+1, a2.compareTo(a1));
  60. assertEquals(-1, a1.compareTo(a2));
  61. assertEquals(+1, a3.compareTo(a1));
  62. assertEquals(-1, a1.compareTo(a3));
  63. assertEquals(0, a3.compareTo(a2));
  64. assertEquals(0, a2.compareTo(a3));
  65. }
  66. public void testDominates() {
  67. Declare dom =
  68. new PatternParser("declare precedence: java.lang.String, java.lang.Throwable").parseDeclare();
  69. //??? concretize dom
  70. ResolvedType aType = world.resolve("Aspect");
  71. CrosscuttingMembers xcut = new CrosscuttingMembers(aType,true);
  72. aType.crosscuttingMembers = xcut;
  73. xcut.addDeclare(dom);
  74. world.getCrosscuttingMembersSet().addFixedCrosscuttingMembers(aType);
  75. Advice a1 =
  76. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.OBJECT, UnresolvedType.OBJECT, 1);
  77. Advice a2 =
  78. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.OBJECT, UnresolvedType.THROWABLE, 2);
  79. Advice a3 =
  80. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.OBJECT, UnresolvedType.forName("java.lang.String"), 2);
  81. assertEquals(-1, a2.compareTo(a1));
  82. assertEquals(+1, a1.compareTo(a2));
  83. assertEquals(-1, a3.compareTo(a1));
  84. assertEquals(+1, a1.compareTo(a3));
  85. assertEquals(+1, a3.compareTo(a2));
  86. assertEquals(-1, a2.compareTo(a3));
  87. }
  88. public void testDominatesHarder() {
  89. Declare dom =
  90. new PatternParser("declare precedence: *, java.lang.String, java.lang.Throwable").parseDeclare();
  91. //??? concretize dom
  92. ResolvedType aType = world.resolve("Aspect");
  93. CrosscuttingMembers xcut = new CrosscuttingMembers(aType,true);
  94. aType.crosscuttingMembers = xcut;
  95. xcut.addDeclare(dom);
  96. world.getCrosscuttingMembersSet().addFixedCrosscuttingMembers(aType);
  97. Advice a1 =
  98. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.OBJECT, UnresolvedType.OBJECT, 2);
  99. Advice a2 =
  100. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.OBJECT, UnresolvedType.THROWABLE, 1);
  101. Advice a3 =
  102. makeConcreteAdvice(AdviceKind.Before, UnresolvedType.OBJECT, UnresolvedType.forName("java.lang.String"), 1);
  103. assertEquals(-1, a2.compareTo(a1));
  104. assertEquals(+1, a1.compareTo(a2));
  105. assertEquals(-1, a3.compareTo(a1));
  106. assertEquals(+1, a1.compareTo(a3));
  107. assertEquals(+1, a3.compareTo(a2));
  108. assertEquals(-1, a2.compareTo(a3));
  109. }
  110. private Advice makeConcreteAdvice(AdviceKind kind, UnresolvedType declaringAspect,
  111. UnresolvedType concreteAspect, int lexicalPosition)
  112. {
  113. Advice a1 = new BcelAdvice(kind, makeResolvedPointcut("this(*)"),
  114. MemberImpl.method(declaringAspect, 0, "foo", "()V"),
  115. 0, lexicalPosition, lexicalPosition, null, null);
  116. a1 = (Advice)a1.concretize(concreteAspect.resolve(world), world, null);
  117. return a1;
  118. }
  119. }