GROOVY-7353: Groovy should provide a MapConstructor AST transform - additional 
tests and mods for recent master changes (closes #20)


Project: http://git-wip-us.apache.org/repos/asf/incubator-groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-groovy/commit/569d68a9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-groovy/tree/569d68a9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-groovy/diff/569d68a9

Branch: refs/heads/master
Commit: 569d68a9ba5ef7ff6cea683203a70646211fdee9
Parents: 87b6633
Author: Paul King <pa...@asert.com.au>
Authored: Sat May 23 11:15:01 2015 +1000
Committer: Paul King <pa...@asert.com.au>
Committed: Sat May 23 11:15:01 2015 +1000

----------------------------------------------------------------------
 .../MapConstructorASTTransformation.java        |  7 +--
 .../MapConstructorTransformTest.groovy          | 52 +++++++++++++++++++-
 2 files changed, 53 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/569d68a9/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java
----------------------------------------------------------------------
diff --git 
a/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java 
b/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java
index ecbbd9c..c968a0c 100644
--- 
a/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java
+++ 
b/src/main/org/codehaus/groovy/transform/MapConstructorASTTransformation.java
@@ -90,12 +90,9 @@ public class MapConstructorASTTransformation extends 
AbstractASTTransformation {
             boolean useSetters = memberHasValue(anno, "useSetters", true);
             List<String> excludes = getMemberList(anno, "excludes");
             List<String> includes = getMemberList(anno, "includes");
-            if (hasAnnotation(cNode, CanonicalASTTransformation.MY_TYPE)) {
-                AnnotationNode canonical = 
cNode.getAnnotations(CanonicalASTTransformation.MY_TYPE).get(0);
-                if (excludes == null || excludes.isEmpty()) excludes = 
getMemberList(canonical, "excludes");
-                if (includes == null || includes.isEmpty()) includes = 
getMemberList(canonical, "includes");
-            }
             if (!checkIncludeExclude(anno, excludes, includes, MY_TYPE_NAME)) 
return;
+            if (!checkPropertyList(cNode, includes, "includes", anno, 
MY_TYPE_NAME, includeFields)) return;
+            if (!checkPropertyList(cNode, excludes, "excludes", anno, 
MY_TYPE_NAME, includeFields)) return;
             // if @Immutable is found, let it pick up options and do work so 
we'll skip
             if (hasAnnotation(cNode, ImmutableASTTransformation.MY_TYPE)) 
return;
 

http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/569d68a9/src/test/org/codehaus/groovy/transform/MapConstructorTransformTest.groovy
----------------------------------------------------------------------
diff --git 
a/src/test/org/codehaus/groovy/transform/MapConstructorTransformTest.groovy 
b/src/test/org/codehaus/groovy/transform/MapConstructorTransformTest.groovy
index 22cd930..f59c26b 100644
--- a/src/test/org/codehaus/groovy/transform/MapConstructorTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/MapConstructorTransformTest.groovy
@@ -18,7 +18,7 @@
  */
 package org.codehaus.groovy.transform
 
-class MapConstructorTransformTest extends GroovyTestCase {
+class MapConstructorTransformTest extends GroovyShellTestCase {
     void testMapConstructorWithFinalFields() {
         assertScript '''
             import groovy.transform.*
@@ -136,4 +136,54 @@ class MapConstructorTransformTest extends GroovyTestCase {
             assert new Author().toString() == 'Author(null, null, null)'
         '''
     }
+
+    void testIncludesAndExcludesTogetherResultsInError() {
+        def message = shouldFail {
+            evaluate """
+                import groovy.transform.MapConstructor
+
+                @MapConstructor(includes='surName', excludes='surName')
+                class Person {
+                    String surName
+                }
+
+                new Person()
+            """
+        }
+        assert message.contains("Error during @MapConstructor processing: Only 
one of 'includes' and 'excludes' should be supplied not both.")
+    }
+
+    void testIncludesWithInvalidPropertyNameResultsInError() {
+        def message = shouldFail {
+            evaluate """
+                import groovy.transform.MapConstructor
+
+                @MapConstructor(includes='sirName')
+                class Person {
+                    String firstName
+                    String surName
+                }
+
+                new Person(surname: "Doe")
+            """
+        }
+        assert message.contains("Error during @MapConstructor processing: 
'includes' property 'sirName' does not exist.")
+    }
+
+    void testExcludesWithInvalidPropertyNameResultsInError() {
+        def message = shouldFail {
+            evaluate """
+                import groovy.transform.MapConstructor
+
+                @MapConstructor(excludes='sirName')
+                class Person {
+                    String firstName
+                    String surName
+                }
+
+                new Person(surname: "Doe")
+            """
+        }
+        assert message.contains("Error during @MapConstructor processing: 
'excludes' property 'sirName' does not exist.")
+    }
 }

Reply via email to