/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package test;
import junit.framework.TestCase;
import org.codehaus.aspectwerkz.annotation.Before;
import org.codehaus.aspectwerkz.annotation.Expression;
/**
* @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
*/
public class CflowBelowTest extends TestCase {
static int s_inAspectCount = 0;
public void testCflow() {
s_inAspectCount = 0;
recursiveCflow(3);
assertEquals(3, s_inAspectCount);
}
public void testCflowBelow() {
s_inAspectCount = 0;
recursiveCflowBelow(3);
assertEquals(2, s_inAspectCount);// one less
}
/**
* Recursive i times.
*
* @param i
*/
void recursiveCflow(int i) {
if (i <= 1) {
return;
} else {
recursiveCflow(i-1);
}
}
/**
* Recursive i times.
*
* @param i
*/
void recursiveCflowBelow(int i) {
if (i <= 1) {
return;
} else {
recursiveCflowBelow(i-1);
}
}
public void testWithincodeAndCflowRuntimeTestOnEnclosingJP() {
s_inAspectCount = 0;
startCflowWithinCode();
assertEquals(1, s_inAspectCount);
s_inAspectCount = 0;
startCflowNotWithinCode();
assertEquals(0, s_inAspectCount);
}
public void startCflowWithinCode() {
withinCode();
}
public void startCflowNotWithinCode() {
notWithinCode();
}
public void withinCode() {
targetCall();// call of this method advised by withincode && cflow
}
public void notWithinCode() {
targetCall();// call of this method advised by withincode && cflow but don't match
}
public void targetCall() {
;
}
//--- JUnit
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public static junit.framework.Test suite() {
return new junit.framework.TestSuite(CflowBelowTest.class);
}
/**
* @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a>
*/
public static class Aspect {
@Expression("execution(* test.CflowBelowTest.recursiveCflow(..))")
void pcCflow(){};
@Expression("execution(* test.CflowBelowTest.recursiveCflowBelow(..))")
void pcCflowBelow(){};
@Before("pcCflow() && cflow(pcCflow())")
public void beforeCflow() {
s_inAspectCount++;
}
@Before("pcCflowBelow() && cflowbelow(pcCflowBelow())")
public void beforeCflowBelow() {
s_inAspectCount++;
}
@Before("call(* test.CflowBelowTest.targetCall())" +
" && withincode(* test.CflowBelowTest.withinCode())" +
" && cflow(execution(* test.CflowBelowTest.startCflowWithinCode()))")
public void withinCodeAndCflow() {
s_inAspectCount++;
}
@Before("call(* test.CflowBelowTest.targetCall())" +
" && withincode(* test.CflowBelowTest.withinCode())" +
" && cflow(execution(* test.CflowBelowTest.startCflowNotWithinCode()))")
public void notWithinCodeAndCflow() {
s_inAspectCount++;
}
}
}