]> source.dussan.org Git - aspectj.git/commitdiff
more test cases covering generics in pointcut expressions
authoracolyer <acolyer>
Wed, 13 Jul 2005 12:59:45 +0000 (12:59 +0000)
committeracolyer <acolyer>
Wed, 13 Jul 2005 12:59:45 +0000 (12:59 +0000)
tests/java5/generics/pointcuts/GenericSignatureMatching.aj [new file with mode: 0644]
tests/java5/generics/pointcuts/HandlerPointcutTests.aj [new file with mode: 0644]
tests/java5/generics/pointcuts/ParameterizedTypesInAnnotationPatterns.aj [new file with mode: 0644]
tests/java5/generics/pointcuts/ParameterizedTypesInAtPCDs.aj [new file with mode: 0644]
tests/java5/generics/pointcuts/PointcutsThatDontAllowTypeVars.aj [new file with mode: 0644]
tests/src/org/aspectj/systemtest/ajc150/GenericsTests.java
tests/src/org/aspectj/systemtest/ajc150/ajc150.xml

diff --git a/tests/java5/generics/pointcuts/GenericSignatureMatching.aj b/tests/java5/generics/pointcuts/GenericSignatureMatching.aj
new file mode 100644 (file)
index 0000000..28faf00
--- /dev/null
@@ -0,0 +1,17 @@
+public aspect GenericSignatureMatching {
+       
+       // tests that references to a generic or parameterized type are
+       // always matched by a type pattern refering to the raw type form
+       
+       void someCode() {
+               ConcreteImplementingClass cic = new ConcreteImplementingClass();
+               cic.asInt(5.0d);  
+               GenericImplementingClass<Long> gic = new GenericImplementingClass<Long>();
+               gic.asInt(55L);   
+       }
+       
+       declare warning : 
+               execution<T>(* GenericInterface<T extends Number>.asInt(T)) :
+               "execution<T>(* GenericInterface<T extends Number>.asInt(T))";
+       
+}
\ No newline at end of file
diff --git a/tests/java5/generics/pointcuts/HandlerPointcutTests.aj b/tests/java5/generics/pointcuts/HandlerPointcutTests.aj
new file mode 100644 (file)
index 0000000..8324d19
--- /dev/null
@@ -0,0 +1,13 @@
+public aspect HandlerPointcutTests {
+
+       // CE line 4 - no type variables allowed in handler
+       pointcut exceptionHandler() : handler<T>(GenericInterface<T>);
+       
+       // CE line 8 - no parameterized types
+       // CW line 8 - unresolved absolute type name T
+       pointcut unboundTypeInHandler() : handler(GenericInterface<T>);
+       
+       // CE line 11 - no parameterized types
+       pointcut parameterizedHandler() : handler(GenericInterface<Double>);
+
+}
\ No newline at end of file
diff --git a/tests/java5/generics/pointcuts/ParameterizedTypesInAnnotationPatterns.aj b/tests/java5/generics/pointcuts/ParameterizedTypesInAnnotationPatterns.aj
new file mode 100644 (file)
index 0000000..54b5384
--- /dev/null
@@ -0,0 +1,14 @@
+import java.util.List;
+
+public aspect ParameterizedTypesInAnnotationPatterns {
+       // CE - not an annotation type
+       pointcut simple() : staticinitialization(@List<String> String);
+       // CE - not an annotation type
+       pointcut generic() : staticinitialization<T>(@List<T> Class<T>);
+       
+       // no CE, good enough for now? may improve error reporting for this later
+       pointcut combined() : staticinitialization(@(Foo || List<String>) String);
+       
+}
+
+@interface Foo {}
\ No newline at end of file
diff --git a/tests/java5/generics/pointcuts/ParameterizedTypesInAtPCDs.aj b/tests/java5/generics/pointcuts/ParameterizedTypesInAtPCDs.aj
new file mode 100644 (file)
index 0000000..d92cc7c
--- /dev/null
@@ -0,0 +1,15 @@
+public aspect ParameterizedTypesInAtPCDs {
+       
+       public pointcut atthis() : @this(List<String>);
+       
+       public pointcut attarget() : @target(List<String>);
+       
+       public pointcut atargs() : @args(List<String>);
+       
+       public pointcut atannotation() : @annotation(List<String>);
+       
+       public pointcut atwithin() : @within(List<String>);
+       
+       public pointcut atwithincode() : @withincode(List<String>);
+       
+}
\ No newline at end of file
diff --git a/tests/java5/generics/pointcuts/PointcutsThatDontAllowTypeVars.aj b/tests/java5/generics/pointcuts/PointcutsThatDontAllowTypeVars.aj
new file mode 100644 (file)
index 0000000..15b622e
--- /dev/null
@@ -0,0 +1,28 @@
+public aspect PointcutsThatDontAllowTypeVars {
+       
+       public pointcut handlerWithVars() : handler<T>(*);
+       
+       public pointcut cflowWithVars() : cflow<T>(ifWithVars());
+       
+       public pointcut cflowbelowWithVars() : cflowbelow<S>(ifWithVars());
+       
+       public pointcut thisWithVars() : this<T>(String);
+       
+       public pointcut targetWithVars() : target<T>(String);
+       
+       public pointcut argsWithVars() : args<T>(String);
+       
+       public pointcut atthisWithVars() : @this<T>(*);
+       
+       public pointcut attargetWithVars() : @target<T>(*);
+       
+       public pointcut atargsWithVars() : @args<T>(*);
+       
+       public pointcut atwithinWithVars() : @within<T>(*);
+       
+       public pointcut atwithincodeWithVars() : @withincode<T>(*);
+       
+       public pointcut atannotationWithVars() : @annotation<T>(*);
+
+       public pointcut ifWithVars() : if<T>(true); // message for this one should be improved...
+}
\ No newline at end of file
index 08eb412ec57b37d6c04ea738a508019cdbb43349..2be934fc254cbc3974951d071b9de6dacc1e194d 100644 (file)
@@ -13,6 +13,75 @@ import org.aspectj.testing.XMLBasedAjcTestCase;
 
 public class GenericsTests extends XMLBasedAjcTestCase {
 
+       /*==========================================
+        * Generics test plan for pointcuts.
+        * 
+        * handler  PASS
+        *   - does not permit type var spec
+        *   - does not permit generic type (fail with type not found)
+        *   - does not permit parameterized types
+        * if PASS
+        *   - does not permit type vars
+        * cflow PASS
+        *   - does not permit type vars
+        * cflowbelow PASS
+        *   - does not permit type vars
+        * @this PASS
+        *   - does not permit type vars PASS
+        *   - does not permit parameterized type PASS
+        * @target PASS
+        *   - does not permit type vars PASS
+        *   - does not permit parameterized type PASS
+        * @args PASS
+     *   - does not permit type vars PASS
+        *   - does not permit parameterized type PASS
+        *       @annotation PASS
+     *   - does not permit type vars PASS
+        *   - does not permit parameterized type PASS
+        *   @within, @within code - as above PASS
+        * annotation type pattern with generic and parameterized types  PASS
+        *   - just make sure that annotation interfaces can never be generic first! VERIFIED
+        *        - @Foo<T>  should fail  PASS
+        *   - @Foo<String> should fail PASS
+        *   - @(Foo || Bar<T>) should fail  DEFERRED (not critical)
+        * staticinitialization
+        *   - error on parameterized type
+        *   - permit parameterized type +
+        *   - wrong number of parameters in parameterized type
+        *   - generic type with one type parameter
+        *   - generic type with n type parameters
+        *   - generic type with bounds [extends, extends + i/f's]
+        *   - generic type with wrong number of type params
+        *   - wildcards in bounds
+        * within
+        *   - as above, but allows parameterized type
+        *   - wildcards in type parameters
+        * this 
+        *   - no type vars
+        *   - parameterized types
+        *        - implements
+        *        - instanceof
+        * target
+        *   - as this
+        * args
+        *   - as this/target, plus...
+        *   - known static match
+        *   - known static match fail
+        *   - maybe match with unchecked warning
+        * get & set
+        *   - parameterized type
+        *   - generic type
+        *   - return type is type variable
+        *   - return type is parameterized
+        * initialization, preinitialization
+        *   - type variables as type params
+        *   - no join points for parameterized types
+        * execution, withincode
+        *    - wait till we get there!
+        * call
+        *   - wait till we get there!
+        */
+       
        public static Test suite() {
                return XMLBasedAjcTestCase.loadSuite(GenericsTests.class);
        }
@@ -179,6 +248,22 @@ public class GenericsTests extends XMLBasedAjcTestCase {
        // 2. ITDF
 
        // -- Pointcut tests...
+
+       public void testHandlerWithGenerics() {
+               runTest("handler pcd and generics / type vars");
+       }
+       
+       public void testPointcutsThatDontAllowTypeVars() {
+               runTest("pointcuts that dont allow type vars");
+       }
+       
+       public void testParameterizedTypesInAtPCDs() {
+               runTest("annotation pcds with parameterized types");
+       }
+       
+       public void testAnnotationPatternsWithParameterizedTypes() {
+               runTest("annotation patterns with parameterized types");
+       }
        
        public void testExecutionWithRawType() {
                runTest("execution pcd with raw type matching");
@@ -192,6 +277,11 @@ public class GenericsTests extends XMLBasedAjcTestCase {
                runTest("execution pcd with generic declaring type and erased parameter types");
        }
        
+// not passing yet...
+//     public void testExecutionWithGenericSignature() {
+//             runTest("execution pcd with generic signature matching");
+//     }
+       
        // --- helpers
                
        // Check the signature attribute on a class is correct
index 8e98d67b98ecf3f28ad8d0c5879ee3d28c2c58c6..f2290c049819d135119eeaf31e920ef19dab3135 100644 (file)
    <!-- end of generic decps -->
    
    <!-- generics and  pointcuts -->
+
+   <ajc-test dir="java5/generics/pointcuts" title="handler pcd and generics / type vars">
+     <compile files="GenericInterface.java,HandlerPointcutTests.aj" options="-1.5">
+         <message kind="error" line="4" text="Syntax error on token"/>
+         <message kind="error" line="8" text="a parameterized type pattern may not be used in a handler pointcut expression"/>
+         <message kind="warning" line="8" text="no match for this type name: T"/>
+         <message kind="error" line="11" text="a parameterized type pattern may not be used in a handler pointcut expression"/>
+     </compile>
+   </ajc-test>
+
+   <ajc-test dir="java5/generics/pointcuts" title="pointcuts that dont allow type vars">
+     <compile files="PointcutsThatDontAllowTypeVars.aj" options="-1.5">
+         <message kind="error" line="3" text="Syntax error on token"/>
+         <message kind="error" line="5" text="Syntax error on token"/>
+         <message kind="error" line="7" text="Syntax error on token"/>
+         <message kind="error" line="9" text="Syntax error on token"/>
+         <message kind="error" line="11" text="Syntax error on token"/>
+         <message kind="error" line="13" text="Syntax error on token"/>
+         <message kind="error" line="15" text="Syntax error on token"/>
+         <message kind="error" line="17" text="Syntax error on token"/>
+         <message kind="error" line="19" text="Syntax error on token"/>
+         <message kind="error" line="21" text="Syntax error on token"/>
+         <message kind="error" line="23" text="Syntax error on token"/>
+         <message kind="error" line="25" text="Syntax error on token"/>
+         <message kind="error" line="27" text="Syntax error on token"/>
+     </compile>
+   </ajc-test>
+   
+   <ajc-test dir="java5/generics/pointcuts" title="annotation pcds with parameterized types">
+     <compile files="ParameterizedTypesInAtPCDs.aj" options="-1.5">
+         <message kind="error" line="3" text="Syntax error on token"/>
+         <message kind="error" line="5" text="Syntax error on token"/>
+         <message kind="error" line="7" text="Syntax error on token"/>
+         <message kind="error" line="9" text="Syntax error on token"/>
+         <message kind="error" line="11" text="Syntax error on token"/>
+         <message kind="error" line="13" text="Syntax error on token"/>
+     </compile>
+   </ajc-test>
+   
+   <ajc-test dir="java5/generics/pointcuts" title="annotation patterns with parameterized types">
+     <compile files="ParameterizedTypesInAnnotationPatterns.aj" options="-1.5">
+         <message kind="error" line="5" text="is not an annotation type"/>
+         <message kind="error" line="7" text="is not an annotation type"/>
+     </compile>
+   </ajc-test>
+   
    
    <ajc-test dir="java5/generics/pointcuts" title="execution pcd with raw type matching">
      <compile files="GenericInterface.java,ConcreteImplementingClass.java,GenericImplementingClass.java,RawTypeMatching.aj" options="-1.5">
      </compile>
    </ajc-test>
 
+   <ajc-test dir="java5/generics/pointcuts" title="execution pcd with generic signature matching">
+     <compile files="GenericInterface.java,ConcreteImplementingClass.java,GenericImplementingClass.java,GenericSignatureMatching.aj" options="-1.5">
+         <message kind="warning" line="4" text="execution&lt;T&gt;(* GenericInterface&lt;T extends Number&gt;.asInt(T))"/>
+         <message kind="warning" line="5" text="execution&lt;T&gt;(* GenericInterface&lt;T extends Number&gt;.asInt(T))"/>
+     </compile>
+   </ajc-test>
    <!-- end of generics and pointcuts tests -->
    
    <!-- ============================================================== -->