diff options
Diffstat (limited to 'tests/new/TryAndProceed.java')
-rw-r--r-- | tests/new/TryAndProceed.java | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/tests/new/TryAndProceed.java b/tests/new/TryAndProceed.java new file mode 100644 index 000000000..42cebaeee --- /dev/null +++ b/tests/new/TryAndProceed.java @@ -0,0 +1,90 @@ +import org.aspectj.testing.Tester; + +public class TryAndProceed { + public static void main(String[] args) { + new C().mNoThrows(); + Tester.checkEqual(C.buf.toString(), "beforeAll:aroundAll:mNoThrows:"); + C.buf = new StringBuffer(); + + A.aspectOf().allowThrowingAround = true; + try { + new C().mThrowsCheckedExc(); + Tester.checkFailed("should have thrown RuntimeExc"); + } catch (CheckedExc ce) { + Tester.checkFailed("should have thrown RuntimeExc not " + ce); + } catch (RuntimeException re) { + //System.out.println("caught " + re); + } + Tester.checkEqual(C.buf.toString(), + "beforeAll:aroundCheckedNoThrow:aroundAll:aroundCheckedThrow:aroundCaughtCE:"); + C.buf = new StringBuffer(); + + A.aspectOf().allowThrowingBefore = true; + try { + new C().mThrowsCheckedExc(); + Tester.checkFailed("should have thrown CheckedExc"); + } catch (CheckedExc ce) { + //System.out.println("caught " + ce); + } catch (RuntimeException re) { + Tester.checkFailed("should have thrown CheckedExc not RuntimeExc"); + } + Tester.checkEqual(C.buf.toString(), "beforeChecked:"); + + } +} + + +class C { + public static StringBuffer buf = new StringBuffer(); + + public void mThrowsCheckedExc() throws CheckedExc { + C.buf.append("mThrowsCheckedExc:"); + } + + public void mNoThrows() { + C.buf.append("mNoThrows:"); + } +} + +aspect A { + pointcut checkedCut(): call(void C.mThrowsCheckedExc()); + pointcut uncheckedCut(): call(void C.mNoThrows()); + pointcut allCut(): checkedCut() || uncheckedCut(); + + public static boolean allowThrowingBefore = false; + public static boolean allowThrowingAround = false; + + before() throws CheckedExc: checkedCut() && if(allowThrowingBefore) { + C.buf.append("beforeChecked:"); + throw new CheckedExc("from before"); + } + + before(): allCut() { + C.buf.append("beforeAll:"); + } + + Object around(): checkedCut() { + C.buf.append("aroundCheckedNoThrow:"); + return proceed(); + } + + Object around(): allCut() { + C.buf.append("aroundAll:"); + try { + return proceed(); + } catch (CheckedExc ce) { + C.buf.append("aroundCaughtCE:"); + + throw new RuntimeException("hand-softening CheckedExc"); + } + } + + Object around() throws CheckedExc: checkedCut() && if(allowThrowingAround) { + C.buf.append("aroundCheckedThrow:"); + throw new CheckedExc("from around"); + } +} + +class CheckedExc extends Exception { + public CheckedExc(String m) { super(m); } +} |