summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authoraclement <aclement>2005-10-11 08:25:03 +0000
committeraclement <aclement>2005-10-11 08:25:03 +0000
commit0a69e42808527ec7daa32ec2d4bbf183ca8b4f4b (patch)
tree7c0602405c4b5297996255190dcf3a47423c5acc /tests
parent074261689aede2fdb288e2fe2615bca466cfc098 (diff)
downloadaspectj-0a69e42808527ec7daa32ec2d4bbf183ca8b4f4b.tar.gz
aspectj-0a69e42808527ec7daa32ec2d4bbf183ca8b4f4b.zip
generic itds - see pr112105
Diffstat (limited to 'tests')
-rw-r--r--tests/.classpath1
-rw-r--r--tests/java5/generics/itds/design/DesignA.java6
-rw-r--r--tests/java5/generics/itds/design/DesignB.java12
-rw-r--r--tests/java5/generics/itds/design/DesignC.java10
-rw-r--r--tests/multiIncremental/PR111779/inc1/Bar.aj1
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150.java1
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/GenericITDsDesign.java167
-rw-r--r--tests/src/org/aspectj/systemtest/ajc150/ajc150.xml15
-rw-r--r--tests/src/org/aspectj/systemtest/incremental/tools/AjdeInteractionTestbed.java2
-rw-r--r--tests/src/org/aspectj/systemtest/incremental/tools/MultiProjectIncrementalTests.java2
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?)