/**************************************************************************************
* 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.args;
import test.Loggable;
import junit.framework.TestCase;
/**
* Test for args() syntax and pointcut / advice with signatures.
* Some tests to cover XML syntax.
* TODO: test for CALL pc and ctor exe/call jp
*
* @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur</a>
*/
public class ArgsAdviceTest extends TestCase implements Loggable {
private String m_logString = "";
private static String s_logString = "";
// used for ctor call and static field set, else we use jp.getTarget()
public static void logStatic(String s) {
s_logString += s;
}
// execution(* m(..)) && args(i)
public void testSingleAndDotDot() {
m_logString = "";
singleAndDotDot(1);
assertEquals("before 1 invocation ", m_logString);
}
// all bounded :(long l, String s, int[][] matrix)
public void testWithArray() {
m_logString = "";
int[][] iis = new int[][]{{1, 2}, {3}};
withArray(1L, "h", iis);
assertEquals("before 1 h 1-2-3- invocation ", m_logString);
}
//args(String, String, long)
public void testMatchAll() {
m_logString = "";
matchAll("a0", "a1", 2);
assertEquals("before before1 invocation after1 after ", m_logString);
m_logString = "";
matchAllXML("a0", "a1", 2);
assertEquals("before before1 invocation after1 after ", m_logString);
}
//args(..)
public void testMatchAllWithWildcard() {
m_logString = "";
matchAllWithWildcard("a0", "a1", 2);
assertEquals("before before1 invocation after1 after ", m_logString);
}
//args(s, ..)
public void testGetFirst() {
m_logString = "";
getFirst("a0", "a1", 2);
assertEquals("before a0 before1 a0 invocation after1 a0 after a0 ", m_logString);
m_logString = "";
getFirstXML("a0", "a1", 2);
assertEquals("before a0 before1 a0 invocation after1 a0 after a0 ", m_logString);
}
//args(s, ..) as anonymous pointcut
public void testGetFirstAnonymous() {
m_logString = "";
getFirstAnonymous("a0", "a1", 2);
assertEquals("before a0 before1 a0 invocation after1 a0 after a0 ", m_logString);
//TODO (low prio): anonymous pc with args() is not supported in XML - see notes in aop.xml
// m_logString = "";
// getFirstAnonymousXML("a0", "a1", 2);
// assertEquals("before a0 before1 a0 invocation after1 a0 after a0 ", m_logString);
}
//args(String, s, long) and increment it
public void testChangeArg() {
m_logString = "";
changeArg("a0", new StringBuffer("a1"), 2);
// beware: using String won't work as for regular Java behavior
assertEquals("before a1x before1 a1xx invocation after1 a1xxx after a1xxxx ", m_logString);
}
// args(s0, s1, long), with Pc signature reversed
public void testOrderChangedInPointcutSignature() {
m_logString = "";
orderChangedInPointcutSignature("a0", "a1", 2);
assertEquals("before a1 a0 before1 a1 a0 invocation after1 a1 a0 after a1 a0 ", m_logString);
}
// args(s0, s1, long), with Advice signature reversed
public void testOrderChangedInAdviceSignature() {
m_logString = "";
orderChangedInAdviceSignature("a0", "a1", 2);
assertEquals("before a1 a0 before1 a1 a0 invocation after1 a1 a0 after a1 a0 ", m_logString);
}
// args(s0, s1, long), with Pointcut and Advice signature reversed
public void testOrderChangedInPointcutAndAdviceSignature() {
m_logString = "";
orderChangedInPointcutAndAdviceSignature("a0", "a1", 2);
assertEquals("before a0 a1 before1 a0 a1 invocation after1 a0 a1 after a0 a1 ", m_logString);
m_logString = "";
orderChangedInPointcutAndAdviceSignatureXML("a0", "a1", null);
assertEquals("before a0 a1 before1 a0 a1 invocation after1 a0 a1 after a0 a1 ", m_logString);
}
//-- method call pointcuts
//args(l<long>, s<String[]>)
public void testCallGetFirstAndSecond() {
m_logString = "";
callGetFirstAndSecond(1L, new String[]{"s0", "s1"});
assertEquals("before 1 s0,s1 before1 1 s0,s1 invocation after1 1 s0,s1 after 1 s0,s1 ", m_logString);
m_logString = "";
callGetFirstAndSecondXML(1L, new String[]{"s0", "s1"}, null);
assertEquals("before 1 s0,s1 before1 1 s0,s1 invocation after1 1 s0,s1 after 1 s0,s1 ", m_logString);
}
//-- ctor execution
//args(s)
public void testCtorExecutionGetFirst() {
//FIXME
// looks like a bug for ctor executiona and inner class inheritance
// see CtorLoggable and CtorExecution<init>, that has the call to CtorLoggable<init> corrupted
m_logString = "";
CtorExecution target = new CtorExecution("s");
assertEquals("before s before1 s invocation after1 s after s ", m_logString);
m_logString = "";
CtorExecutionXML target2 = new CtorExecutionXML("s");
assertEquals("before s before1 s invocation after1 s after s ", m_logString);
}
//-- ctor call
//args(s)
public void testCtorCallGetFirst() {
s_logString = "";
CtorCall target = new CtorCall("s");
assertEquals("before s before1 s invocation after1 s after s ", s_logString);
s_logString = "";
CtorCallXML target2 = new CtorCallXML("s");
assertEquals("before s before1 s invocation after1 s after s ", s_logString);
}
//-- field set
private String m_field;
private static String s_field;
public String getField() {
return m_field;
}
public static String getStaticField() {
return s_field;
}
//arg(s)
public void testFieldSetArg() {
try {
m_logString = "";
m_field = "s";
assertEquals("before null,s before1 null,s after1 s,changed after s,s ", m_logString);
s_logString = "";
s_field = "s";
assertEquals("before null,s before1 null,s after1 s,changed after s,s ", s_logString);
} catch (Error e) {
e.printStackTrace();
}
}
//-- Implementation methods
public void log(String s) {
m_logString += s;
}
public void singleAndDotDot(int i) {
log("invocation ");
}
public void withArray(long l, String s, int[][] matrix) {
log("invocation ");
}
public void matchAll(String a0, String a1, long a2) {
log("invocation ");
}
public void matchAllXML(String a0, String a1, long a2) {
log("invocation ");
}
public void matchAllWithWildcard(String a0, String a1, long a2) {
log("invocation ");
}
public void getFirst(String a0, String a1, long a2) {
log("invocation ");
}
public void getFirstXML(String a0, String a1, long a2) {
log("invocation ");
}
public void getFirstAnonymous(String a0, String a1, long a2) {
log("invocation ");
}
public void getFirstAnonymousXML(String a0, String a1, long a2) {
log("invocation ");
}
public void changeArg(String a0, StringBuffer a1, long a2) {
log("invocation ");
}
public void orderChangedInPointcutSignature(String a0, String a1, long a2) {
log("invocation ");
}
public void orderChangedInAdviceSignature(String a0, String a1, long a2) {
log("invocation ");
}
public void orderChangedInPointcutAndAdviceSignature(String a0, String a1, long a2) {
log("invocation ");
}
public void orderChangedInPointcutAndAdviceSignatureXML(String a0, String a1, Object[] a2) {
log("invocation ");
}
//-- method call
public void callGetFirstAndSecond(long l, String[] s) {
log("invocation ");
}
public void callGetFirstAndSecondXML(long l, String[] s, String[] ignore) {
log("invocation ");
}
class CtorLoggable implements Loggable {
public CtorLoggable() {
}
public void log(String s) {
m_logString += s;
}
}
//-- ctor execution
class CtorExecution extends CtorLoggable {
public CtorExecution(String s) {
this.log("invocation ");
}
}
class CtorExecutionXML extends CtorLoggable {
public CtorExecutionXML(String s) {
this.log("invocation ");
}
}
//-- ctor call
class CtorCall extends CtorLoggable {
public CtorCall(String s) {
logStatic("invocation ");
}
}
class CtorCallXML extends CtorLoggable {
public CtorCallXML(String s) {
logStatic("invocation ");
}
}
//-- JUnit
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public static junit.framework.Test suite() {
return new junit.framework.TestSuite(ArgsAdviceTest.class);
}
}