diff options
Diffstat (limited to 'tests/design/eachobject/Tricky1.java')
-rw-r--r-- | tests/design/eachobject/Tricky1.java | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/tests/design/eachobject/Tricky1.java b/tests/design/eachobject/Tricky1.java new file mode 100644 index 000000000..7359ceaa3 --- /dev/null +++ b/tests/design/eachobject/Tricky1.java @@ -0,0 +1,95 @@ +import org.aspectj.testing.Tester; + +/** + * test time of creation and existence of aspect of eachobject(P) + * where P is not instanceof + */ +public class Tricky1 { + public static void main(String[] args) { + // the ReceptionAspect isn't created until just before the m message is received + C c = new C(); + c.foo(); + c.m(); + Tester.checkEqual(c.history.toString(), "C.foo, SubReceptionAspect1.before, C.m, "); + Tester.check(!SubReceptionAspect2.hasAspect(c), "!Sub2.hasAspect"); + + // if m1 is called first, then a single SubReceptionAspect is created instead + // no matter how many times m1 is called + c = new C(); + c.m1(); + c.m1(); + Tester.checkEqual(c.history.toString(), + "SubReceptionAspect2.before, C.m1, SubReceptionAspect2.before, C.m1, "); + Tester.check(!SubReceptionAspect1.hasAspect(c), "!Sub1.hasAspect"); + + + // calling both m and m1 should prduce one of each aspect + c = new C(); + c.m(); + c.m1(); + Tester.check(SubReceptionAspect1.hasAspect(c), "Sub1.hasAspect"); + Tester.check(SubReceptionAspect2.hasAspect(c), "Sub2.hasAspect"); + + + // be sure nothing unexpected happens on subtypes + c = new SubC(); + c.foo(); + c.m(); + Tester.checkEqual(c.history.toString(), "C.foo, SubReceptionAspect1.before, SubC.m, "); + + } +} + +class C { + // records what methods are called and advice are run + public StringBuffer history = new StringBuffer(); + + public void m() { + history.append("C.m, "); + } + public void m1() { + history.append("C.m1, "); + } + + public void foo() { + history.append("C.foo, "); + } +} + +class SubC extends C { + public void m() { + history.append("SubC.m, "); + } +} + + +abstract aspect ReceptionAspect perthis(targets()) { + abstract pointcut targets(); + + protected void noteBefore(C c) { + c.history.append("ReceptionAspect.before, "); + } + + before (C c): target(c) && execution(* *(..)) { + noteBefore(c); + } +} + + +aspect SubReceptionAspect1 extends ReceptionAspect { + pointcut targets(): execution(void m()); + + protected void noteBefore(C c) { + c.history.append("SubReceptionAspect1.before, "); + } +} + + + +aspect SubReceptionAspect2 extends ReceptionAspect { + pointcut targets(): execution(void m1()); + + protected void noteBefore(C c) { + c.history.append("SubReceptionAspect2.before, "); + } +} |