import org.aspectj.testing.XMLBasedAjcTestCase;
/**
+ * Testing whether AspectJ can overweave. Overweaving is where we attempt to weave something that has already been woven. The simple
+ * rule followed is that aspects that applied to the type before are not applied this time around (if they are visible to the
+ * weaver).
*
* @author Andy Clement
*/
public class OverweavingTests extends org.aspectj.testing.XMLBasedAjcTestCase {
+ public void testGetSet1() {
+ runTest("getset - 1"); // testing what should happen for get/set
+ }
+
+ public void testGetSet2() {
+ runTest("getset - 2"); // testing what actually happens when overweaving
+ }
+
+ public void testCalls1() {
+ runTest("calls - 1"); // testing what should happen for calls
+ }
+
+ public void testCalls2() {
+ runTest("calls - 2"); // testing what actually happens when overweaving
+ }
+
public void testComplex() {
runTest("really messy");
}
<suite>
+
+ <ajc-test dir="features167/overweaving/getset" title="getset - 1">
+ <compile files="A.aj B.aj Class1.java Class2.java" options="-1.5"/>
+ <run class="Class1">
+ <stdout>
+ <line text="B:set(String Class1.message)"/>
+ <line text="A:get(PrintStream java.lang.System.out)"/>
+ <line text="A:get(String Class1.message)"/>
+ <line text="Class1.main"/>
+ </stdout>
+ </run>
+
+ <run class="Class2">
+ <stdout>
+ <line text="B:set(String Class2.message)"/>
+ <line text="A:get(PrintStream java.lang.System.out)"/>
+ <line text="A:get(String Class2.message)"/>
+ <line text="Class2.main"/>
+ </stdout>
+ </run>
+ </ajc-test>
+
+ <ajc-test dir="features167/overweaving/getset" title="getset - 2">
+ <compile files="A.aj Class1.java" options="-1.5"/>
+ <compile files="B.aj" options="-1.5 -Xlint:ignore"/>
+ <compile files="Class2.java" options="-1.5 -Xlint:ignore"/>
+ <run class="Class1" ltw="aop.xml">
+ <stdout>
+ <!-- should be advised by both, but was *already* advised by A during first weave -->
+ <line text="B:set(String Class1.message)"/>
+ <line text="A:get(PrintStream java.lang.System.out)"/>
+ <line text="A:get(String Class1.message)"/>
+ <line text="Class1.main"/>
+ </stdout>
+ </run>
+
+ <run class="Class2" ltw="aop.xml">
+ <stdout>
+ <line text="B:set(String Class2.message)"/>
+ <line text="A:get(PrintStream java.lang.System.out)"/>
+ <line text="A:get(String Class2.message)"/>
+ <line text="Class2.main"/>
+ </stdout>
+ </run>
+ </ajc-test>
+
+ <ajc-test dir="features167/overweaving/calls" title="calls - 1">
+ <compile files="A.aj B.aj Class1.java Class2.java" options="-1.5"/>
+ <run class="Class1">
+ <stdout>
+ <line text="A:call(void java.io.PrintStream.println(String))"/>
+ <line text="B:call(void java.io.PrintStream.println(String))"/>
+ <line text="Class1.main"/>
+ </stdout>
+ </run>
+
+ <run class="Class2">
+ <stdout>
+ <line text="A:call(void java.io.PrintStream.println(String))"/>
+ <line text="B:call(void java.io.PrintStream.println(String))"/>
+ <line text="Class2.main"/>
+ </stdout>
+ </run>
+ </ajc-test>
+
+ <ajc-test dir="features167/overweaving/calls" title="calls - 2">
+ <compile files="A.aj Class1.java" options="-1.5"/>
+ <compile files="B.aj" options="-1.5 -Xlint:ignore"/>
+ <compile files="Class2.java" options="-1.5 -Xlint:ignore"/>
+ <run class="Class1" ltw="aop.xml">
+ <stdout>
+ <!-- should be advised by both, but was *already* advised by A during first weave -->
+ <line text="A:call(void java.io.PrintStream.println(String))"/>
+ <line text="B:call(void java.io.PrintStream.println(String))"/>
+ <line text="Class1.main"/>
+ </stdout>
+ </run>
+
+ <run class="Class2" ltw="aop.xml">
+ <stdout>
+ <line text="A:call(void java.io.PrintStream.println(String))"/>
+ <line text="B:call(void java.io.PrintStream.println(String))"/>
+ <line text="Class2.main"/>
+ </stdout>
+ </run>
+ </ajc-test>
+
<ajc-test dir="features167/overweaving/messy2" title="really messy">
<compile files="A.aj Class1.java" options="-1.5"/>
<compile files="B.aj" options="-1.5 -Xlint:ignore"/>