/************************************************************************************** * 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 java.util.SortedSet; import java.util.TreeSet; import java.util.Set; import org.codehaus.aspectwerkz.annotation.Before; import org.codehaus.aspectwerkz.annotation.Around; import org.codehaus.aspectwerkz.joinpoint.StaticJoinPoint; /** * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a> */ public class InterfaceDefinedMethodTest extends TestCase { public static String s_log = ""; public InterfaceDefinedMethodTest(String s) { super(s); } public InterfaceDefinedMethodTest() { SortedSet ss = new TreeSet(); ss.add("foo"); // Warning, add is in super interface ss.first(); // Ok, first is in SortedSet try { Set s = ss; s.add("bar"); // Ok, add is in Set throw new NullPointerException("fake"); } catch (NullPointerException npe) { ; } } /** * When visiting the bytecode of this method, the classInfo must lookup in the class + intf * hierarchy */ public void testInterfaceDefinedMethod() { s_log = ""; SortedSet ss = new TreeSet(); ss.add("foo"); // Warning, add is in super interface ss.first(); // Ok, first is in SortedSet try { Set s = ss; s.add("bar"); // Ok, add is in Set throw new NullPointerException("fake"); } catch (NullPointerException npe) { ; } assertEquals("advice advice advice advice advice advice advice ", s_log); } public void testWithinCtor() { s_log = ""; InterfaceDefinedMethodTest me = new InterfaceDefinedMethodTest(); assertEquals("around around around around around around around ", s_log); } public void testWithinNot() { s_log = ""; withinNot(); assertEquals("withincode withincode withincode ", s_log); } private void withinNot() { InterfaceDefinedMethodTest me = new InterfaceDefinedMethodTest("ignore"); subWithinNot(); } private void subWithinNot() { ; } public static class Aspect { @Before("withincode(* test.InterfaceDefinedMethodTest.testInterfaceDefinedMethod(..))") public void before(StaticJoinPoint sjp) { s_log += "advice "; } @Around("withincode(test.InterfaceDefinedMethodTest.new())") public Object around(StaticJoinPoint sjp) throws Throwable { s_log += "around "; return sjp.proceed(); } @Before("cflow(within(test.InterfaceDefinedMethodTest) && call(* test.InterfaceDefinedMethodTest.withinNot()))" + "&& !withincode(* test.InterfaceDefinedMethodTest.withinNot())" + "&& within(test.InterfaceDefinedMethodTest)") public void neverCalled(StaticJoinPoint sjp) { s_log += "withincode "; //System.out.println(sjp.getType() + " " + sjp.getSignature()); } } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static junit.framework.Test suite() { return new junit.framework.TestSuite(InterfaceDefinedMethodTest.class); } }