diff options
author | aclement <aclement> | 2005-10-11 08:25:03 +0000 |
---|---|---|
committer | aclement <aclement> | 2005-10-11 08:25:03 +0000 |
commit | 0a69e42808527ec7daa32ec2d4bbf183ca8b4f4b (patch) | |
tree | 7c0602405c4b5297996255190dcf3a47423c5acc /tests | |
parent | 074261689aede2fdb288e2fe2615bca466cfc098 (diff) | |
download | aspectj-0a69e42808527ec7daa32ec2d4bbf183ca8b4f4b.tar.gz aspectj-0a69e42808527ec7daa32ec2d4bbf183ca8b4f4b.zip |
generic itds - see pr112105
Diffstat (limited to 'tests')
10 files changed, 216 insertions, 1 deletions
diff --git a/tests/.classpath b/tests/.classpath index 042f58fb3..3d4d909eb 100644 --- a/tests/.classpath +++ b/tests/.classpath @@ -14,5 +14,6 @@ <classpathentry kind="lib" path="/lib/ant/lib/ant-launcher.jar"/> <classpathentry kind="src" path="testsrc"/> <classpathentry kind="var" path="JAVA_HOME/lib/tools.jar"/> + <classpathentry combineaccessrules="false" kind="src" path="/weaver"/> <classpathentry kind="output" path="bin"/> </classpath> diff --git a/tests/java5/generics/itds/design/DesignA.java b/tests/java5/generics/itds/design/DesignA.java new file mode 100644 index 000000000..9d7b4056b --- /dev/null +++ b/tests/java5/generics/itds/design/DesignA.java @@ -0,0 +1,6 @@ +class C { +} + +aspect X { + <T> void C.m(T t) {} +} diff --git a/tests/java5/generics/itds/design/DesignB.java b/tests/java5/generics/itds/design/DesignB.java new file mode 100644 index 000000000..5b86a11c3 --- /dev/null +++ b/tests/java5/generics/itds/design/DesignB.java @@ -0,0 +1,12 @@ +class C {} + +interface I {} + +aspect X { + + <T extends Number> void C.m0(T t) {} // L7 + + <Q extends I> void C.m1(Q q) {} // L9 + + <R extends Number,I> void C.m2(R r) {} // L11 +} diff --git a/tests/java5/generics/itds/design/DesignC.java b/tests/java5/generics/itds/design/DesignC.java new file mode 100644 index 000000000..8e25e9f56 --- /dev/null +++ b/tests/java5/generics/itds/design/DesignC.java @@ -0,0 +1,10 @@ +class C {} + +interface I {} + +aspect X { + + <T extends Number,Q extends I> void C.m0(T t,Q q) {} // L7 + + <A,B,C> List<A> C.m1(B b,Collection<C> cs) {} // L9 +} diff --git a/tests/multiIncremental/PR111779/inc1/Bar.aj b/tests/multiIncremental/PR111779/inc1/Bar.aj index 3372a5428..804d562bf 100644 --- a/tests/multiIncremental/PR111779/inc1/Bar.aj +++ b/tests/multiIncremental/PR111779/inc1/Bar.aj @@ -1,6 +1,7 @@ import java.util.*; public aspect Bar { + private List<String> Foo.l; diff --git a/tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150.java b/tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150.java index a3366f74d..0f457c739 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150.java +++ b/tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150.java @@ -47,6 +47,7 @@ public class AllTestsAspectJ150 { suite.addTest(SuppressedWarnings.suite()); suite.addTest(DeclareAnnotationTests.suite()); suite.addTest(GenericsTests.suite()); + suite.addTest(GenericITDsDesign.suite()); suite.addTest(AtAjSyntaxTests.suite()); suite.addTest(AtAjMisuseTests.suite()); suite.addTest(AtAjLTWTests.suite()); diff --git a/tests/src/org/aspectj/systemtest/ajc150/GenericITDsDesign.java b/tests/src/org/aspectj/systemtest/ajc150/GenericITDsDesign.java new file mode 100644 index 000000000..a2cf92c07 --- /dev/null +++ b/tests/src/org/aspectj/systemtest/ajc150/GenericITDsDesign.java @@ -0,0 +1,167 @@ +package org.aspectj.systemtest.ajc150; + +import java.io.File; +import java.util.Iterator; +import java.util.List; + +import junit.framework.Test; + +import org.aspectj.apache.bcel.classfile.Attribute; +import org.aspectj.apache.bcel.classfile.JavaClass; +import org.aspectj.apache.bcel.classfile.Signature; +import org.aspectj.apache.bcel.util.ClassPath; +import org.aspectj.apache.bcel.util.SyntheticRepository; +import org.aspectj.testing.XMLBasedAjcTestCase; +import org.aspectj.tools.ajc.Ajc; +import org.aspectj.weaver.CrosscuttingMembers; +import org.aspectj.weaver.ReferenceType; +import org.aspectj.weaver.ResolvedMember; +import org.aspectj.weaver.ResolvedType; +import org.aspectj.weaver.ResolvedTypeMunger; +import org.aspectj.weaver.TypeVariable; +import org.aspectj.weaver.TypeVariableReference; +import org.aspectj.weaver.World; +import org.aspectj.weaver.bcel.BcelTypeMunger; +import org.aspectj.weaver.bcel.BcelWorld; + +public class GenericITDsDesign extends XMLBasedAjcTestCase { + + private World recentWorld; + + public static Test suite() { + return XMLBasedAjcTestCase.loadSuite(GenericITDsDesign.class); + } + + protected File getSpecFile() { + return new File("../tests/src/org/aspectj/systemtest/ajc150/ajc150.xml"); + } + + public static Signature getClassSignature(Ajc ajc,String classname) { + try { + ClassPath cp = + new ClassPath(ajc.getSandboxDirectory() + File.pathSeparator + System.getProperty("java.class.path")); + SyntheticRepository sRepos = SyntheticRepository.getInstance(cp); + JavaClass clazz = sRepos.loadClass(classname); + Signature sigAttr = null; + Attribute[] attrs = clazz.getAttributes(); + for (int i = 0; i < attrs.length; i++) { + Attribute attribute = attrs[i]; + if (attribute.getName().equals("Signature")) sigAttr = (Signature)attribute; + } + return sigAttr; + } catch (ClassNotFoundException e) { + fail("Couldn't find class "+classname+" in the sandbox directory."); + } + return null; + } + // Check the signature attribute on a class is correct + public static void verifyClassSignature(Ajc ajc,String classname,String sig) { + Signature sigAttr = getClassSignature(ajc,classname); + assertTrue("Failed to find signature attribute for class "+classname,sigAttr!=null); + assertTrue("Expected signature to be '"+sig+"' but was '"+sigAttr.getSignature()+"'", + sigAttr.getSignature().equals(sig)); + } + + public List /*BcelTypeMunger*/ getTypeMunger(String classname) { + ClassPath cp = + new ClassPath(ajc.getSandboxDirectory() + File.pathSeparator + + System.getProperty("java.class.path")); + recentWorld = new BcelWorld(cp.toString()); + ReferenceType resolvedType = (ReferenceType)recentWorld.resolve(classname); + CrosscuttingMembers cmembers = resolvedType.collectCrosscuttingMembers(); + List tmungers = cmembers.getTypeMungers(); + return tmungers; + } + + private BcelTypeMunger getMungerFromLine(String classname,int linenumber) { + List allMungers = getTypeMunger(classname); + for (Iterator iter = allMungers.iterator(); iter.hasNext();) { + BcelTypeMunger element = (BcelTypeMunger) iter.next(); + if (element.getMunger().getSourceLocation().getLine()==linenumber) return element; + } + for (Iterator iter = allMungers.iterator(); iter.hasNext();) { + BcelTypeMunger element = (BcelTypeMunger) iter.next(); + System.err.println("Line: "+element.getMunger().getSourceLocation().getLine()+" > "+element); + } + fail("Couldn't find a type munger from line "+linenumber+" in class "+classname); + return null; + } + /* + test plan: + 1. Serializing and recovering 'default bounds' type variable info: + a. methods + b. fields + c. ctors + 2. Serializing and recovering 'extends' with a class bounded type variable info: + a. methods + b. fields + c. ctors + 3. Serializing and recovering 'extends' with an interface bounded type variable info: + a. methods + b. fields + c. ctors + 4. Multiple interface bounds + a. methods + b. fields + c. ctors + 5. wildcard bounds '? extends/? super' + a. methods + b. fields + c. ctors + 6. using type variables in an ITD from the containing aspect, no bounds + a. methods + b. fields + c. ctors + + + */ + + + // Verify: a) After storing it in a class file and recovering it (through deserialization), we can see the type + // variable and that the parameter refers to the type variable. + public void testDesignA() { + runTest("generic itds - design A"); + BcelTypeMunger theBcelMunger = getMungerFromLine("X",5); + ResolvedType typeC = recentWorld.resolve("C"); + ResolvedTypeMunger rtMunger = theBcelMunger.getMunger(); + ResolvedMember theMember = rtMunger.getSignature(); + // Let's check all parts of the member + assertTrue("Declaring type should be C: "+theMember, + theMember.getDeclaringType().equals(typeC)); + + TypeVariable tVar = theMember.getTypeVariables()[0]; + TypeVariableReference tvrt = (TypeVariableReference)theMember.getParameterTypes()[0]; + + theMember.resolve(recentWorld); // resolution will join the type variables together (i.e. make them refer to the same instance) + + tVar = theMember.getTypeVariables()[0]; + tvrt = (TypeVariableReference)theMember.getParameterTypes()[0]; + + assertTrue("Post resolution, the type variable in the parameter should be identical to the type variable declared on the member", + tVar==tvrt.getTypeVariable()); + } + + // Verify: bounds are preserved and accessible after serialization + public void xtestDesignB() { + runTest("generic itds - design B"); + BcelTypeMunger theBcelMunger = getMungerFromLine("X",7); + } + + // Verify: a) multiple type variables work. + // b) type variables below the 'top level' (e.g. List<A>) are preserved. + public void xtestDesignC() { + runTest("generic itds - design B"); + BcelTypeMunger theBcelMunger = getMungerFromLine("X",7); + } + + + /* + * broken stuff: + * + * When generic signatures are unpacked from members, the typevariables attached to the bcelmethod/field won't + * be the same instances as those held in the TypeVariableReferenceTypes for anything that occurs in the + * return type or parameterset - we should perhaps fix that up. + */ + + +} diff --git a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml index db6fb07c2..703c1b3fc 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml +++ b/tests/src/org/aspectj/systemtest/ajc150/ajc150.xml @@ -5024,4 +5024,19 @@ </stdout> </run> </ajc-test> + + <!-- generic ITDs --> + + <ajc-test dir="java5/generics/itds/design" title="generic itds - design A"> + <compile files="DesignA.java" options="-1.5"/> + </ajc-test> + + <ajc-test dir="java5/generics/itds/design" title="generic itds - design B"> + <compile files="DesignB.java" options="-1.5"/> + </ajc-test> + + <ajc-test dir="java5/generics/itds/design" title="generic itds - design C"> + <compile files="DesignC.java" options="-1.5"/> + </ajc-test> + </suite>
\ No newline at end of file diff --git a/tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbed.java b/tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbed.java index 571d04ba0..902028862 100644 --- a/tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbed.java +++ b/tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbed.java @@ -663,7 +663,7 @@ public class AjdeInteractionTestbed extends TestCase { } public String getSourceCompatibilityLevel() { - return null; + return "1.5"; } public Set getWarnings() { diff --git a/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java b/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java index 7043a40a4..706410f40 100644 --- a/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java +++ b/tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java @@ -289,12 +289,14 @@ public class MultiProjectIncrementalTests extends AjdeInteractionTestbed { } /* public void testPr111779() { + super.VERBOSE=true; initialiseProject("PR111779"); build("PR111779"); alter("PR111779","inc1"); build("PR111779"); } */ + // other possible tests: // - memory usage (freemem calls?) |