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.5KB

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